import { describe, it, beforeEach, afterEach, expect, vi } from 'vitest';
const MODAL_MANAGER_MODULE = new URL('../../../static/js/managers/ModalManager.js', import.meta.url).pathname;
function setupDom() {
document.body.innerHTML = `
`;
}
describe('ModalManager delete-modal focus handling', () => {
let ModalManager;
let manager;
beforeEach(async () => {
setupDom();
window.scrollTo = vi.fn();
({ ModalManager } = await import(MODAL_MANAGER_MODULE));
manager = new ModalManager();
for (const id of ['deleteModal', 'excludeModal', 'plainModal']) {
manager.registerModal(id, {
element: document.getElementById(id),
onClose: () => {},
});
}
});
afterEach(() => {
document.body.innerHTML = '';
});
it('focuses the cancel button when a delete-type modal opens', () => {
const trigger = document.getElementById('triggerBtn');
trigger.focus();
manager.showModal('deleteModal');
expect(document.activeElement).toBe(
document.querySelector('#deleteModal .cancel-btn')
);
});
it('restores focus to the previously focused element on close', () => {
const trigger = document.getElementById('triggerBtn');
trigger.focus();
manager.showModal('deleteModal');
manager.closeModal('deleteModal');
expect(document.activeElement).toBe(trigger);
});
it('does not touch focus for a non-delete modal', () => {
const trigger = document.getElementById('triggerBtn');
trigger.focus();
manager.showModal('plainModal');
expect(document.activeElement).toBe(trigger);
manager.closeModal('plainModal');
expect(document.activeElement).toBe(trigger);
});
it('does not treat delete-modal-styled modals without a delete button as delete modals', () => {
const trigger = document.getElementById('triggerBtn');
trigger.focus();
manager.showModal('excludeModal');
expect(document.activeElement).toBe(trigger);
manager.closeModal('excludeModal');
expect(document.activeElement).toBe(trigger);
});
it('skips the focus restore when the previously focused element is gone', () => {
const trigger = document.getElementById('triggerBtn');
trigger.focus();
manager.showModal('deleteModal');
trigger.remove();
expect(() => manager.closeModal('deleteModal')).not.toThrow();
});
});