import { focusableElementSelector, queryAllFocusableElements, queryFirstFocusableElement, queryLastFocusableElement, } from './queryFocusableElements'; describe('queryFocusableElements', () => { let container: HTMLElement; beforeEach(() => { container = document.createElement('div'); document.body.appendChild(container); }); afterEach(() => { document.body.removeChild(container); }); describe('queryAllFocusableElements', () => { test('returns all focusable elements within a container', () => { container.innerHTML = ` Link
Focusable div
`; const elements = queryAllFocusableElements(container); expect(elements).toHaveLength(6); expect(elements[0]).toBeInstanceOf(HTMLButtonElement); expect(elements[1]).toBeInstanceOf(HTMLAnchorElement); expect(elements[2]).toBeInstanceOf(HTMLInputElement); expect(elements[3]).toBeInstanceOf(HTMLSelectElement); expect(elements[4]).toBeInstanceOf(HTMLTextAreaElement); expect(elements[5]).toBeInstanceOf(HTMLDivElement); }); test('excludes elements with tabindex="-1"', () => { container.innerHTML = ` Link `; const elements = queryAllFocusableElements(container); expect(elements).toHaveLength(1); expect(elements[0]).toBeInstanceOf(HTMLButtonElement); }); test('excludes hidden inputs', () => { container.innerHTML = ` `; const elements = queryAllFocusableElements(container); expect(elements).toHaveLength(1); expect(elements[0]).toBeInstanceOf(HTMLInputElement); }); test('excludes disabled inputs', () => { container.innerHTML = ` `; const elements = queryAllFocusableElements(container); expect(elements).toHaveLength(1); expect(elements[0]).toBeInstanceOf(HTMLInputElement); }); test('uses document.body as default container', () => { const spy = jest.spyOn(document.body, 'querySelectorAll'); queryAllFocusableElements(); expect(spy).toHaveBeenCalledWith(focusableElementSelector); spy.mockRestore(); }); }); describe('queryFirstFocusableElement', () => { test('returns the first focusable element within a container', () => { container.innerHTML = ` Link `; const element = queryFirstFocusableElement(container); expect(element).toBeInstanceOf(HTMLButtonElement); expect(element?.textContent).toBe('Button'); }); test('returns null if no focusable elements exist', () => { container.innerHTML = `
Non-focusable div

Paragraph

`; const element = queryFirstFocusableElement(container); expect(element).toBeNull(); }); test('uses document.body as default container', () => { const spy = jest.spyOn(document.body, 'querySelector'); queryFirstFocusableElement(); expect(spy).toHaveBeenCalledWith(focusableElementSelector); spy.mockRestore(); }); }); describe('queryLastFocusableElement', () => { test('returns the last focusable element within a container', () => { container.innerHTML = ` Link `; const element = queryLastFocusableElement(container); expect(element).toBeInstanceOf(HTMLInputElement); }); test('returns null if no focusable elements exist', () => { container.innerHTML = `
Non-focusable div

Paragraph

`; const element = queryLastFocusableElement(container); expect(element).toBeNull(); }); test('returns null for an empty container', () => { const element = queryLastFocusableElement(container); expect(element).toBeNull(); }); test('uses document.body as default container', () => { const querySpy = jest.spyOn(document.body, 'querySelectorAll'); queryLastFocusableElement(); expect(querySpy).toHaveBeenCalledWith(focusableElementSelector); querySpy.mockRestore(); }); }); });