import '@testing-library/jest-dom';
import $, {VeamsQueryObject} from '../src';
test('on() - add event listener', () => {
document.body.innerHTML = `
text content 2
text content 2
text content 3
`;
const $targetEls: VeamsQueryObject = $('.target-el');
const handler = jest.fn((evt, currentTarget) => {
expect(evt.type).toBe('click');
expect(evt.target.classList.contains('target-el')).toBeTruthy();
expect(currentTarget.classList.contains('target-el')).toBeTruthy();
});
expect($targetEls).toHaveLength(2);
$targetEls.on('click', undefined, handler);
$targetEls[0].dispatchEvent(new MouseEvent('click'));
$targetEls[1].dispatchEvent(new MouseEvent('click'));
expect(handler).toBeCalledTimes(2);
});
test('on() - add event listener (implicit event delegation)', () => {
document.body.innerHTML = `
text content 2
text content 2
text content 3
`;
const $targetEls: VeamsQueryObject = $(document.getElementById('target-el'));
const $evtTriggerEl: VeamsQueryObject = $(document.getElementById('test-el-2'));
const handler = jest.fn((evt, currentTarget) => {
expect(evt.type).toBe('click');
expect(evt.target.id).toBe('test-el-2');
expect(currentTarget.id).toBe('target-el');
});
expect($targetEls).toHaveLength(1);
expect($evtTriggerEl).toHaveLength(1);
$targetEls.on('click', undefined, handler);
$evtTriggerEl[0].dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true}));
expect(handler).toBeCalledTimes(1);
});
test('on() - add event listener (explicit event delegation)', () => {
document.body.innerHTML = `
text content 2
text content 2
text content 3
`;
const $targetEls: VeamsQueryObject = $(document.getElementById('target-el'));
const $evtTriggerEl: VeamsQueryObject = $(document.getElementById('test-el-2'));
const handler = jest.fn((evt, currentTarget) => {
expect(evt.type).toBe('click');
expect(evt.target.id).toBe('test-el-2');
expect(currentTarget.id).toBe('test-el-2');
});
expect($targetEls).toHaveLength(1);
expect($evtTriggerEl).toHaveLength(1);
$targetEls.on('click', '#test-el-2', handler);
$evtTriggerEl[0].dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true}));
expect(handler).toBeCalledTimes(1);
});
test('on() - add event listener (implicit event delegation for non bubbling events)', () => {
document.body.innerHTML = `
text content 2
text content 2
text content 3
`;
const $targetEls: VeamsQueryObject = $(document.getElementById('target-el'));
const $evtTriggerEl: VeamsQueryObject = $(document.getElementById('test-el-2'));
const handler = jest.fn((evt, currentTarget) => {
expect(evt.type).toBe('focus');
expect(evt.target.id).toBe('test-el-2');
expect(currentTarget.id).toBe('target-el');
});
expect($targetEls).toHaveLength(1);
expect($evtTriggerEl).toHaveLength(1);
$targetEls.on('focus', undefined, handler, true);
$evtTriggerEl[0].dispatchEvent(new FocusEvent('focus', {bubbles: false, cancelable: true}));
expect(handler).toBeCalledTimes(1);
});
test('on() - add multiple event listeners', () => {
document.body.innerHTML = `
text content 2
text content 2
text content 3
`;
const $targetEls: VeamsQueryObject = $(document.getElementById('target-el'));
const handler = jest.fn((evt, currentTarget) => {
expect(evt.type === 'click' || evt.type === 'touchstart').toBeTruthy();
expect(currentTarget.id).toBe('target-el');
});
$targetEls.on('click touchstart', undefined, handler);
$targetEls[0].dispatchEvent(new MouseEvent('click'));
$targetEls[0].dispatchEvent(new TouchEvent('touchstart'));
expect(handler).toBeCalledTimes(2);
});