PromptVault/tests/js/Components/ConfirmDialog.test.js

82 lines
2.7 KiB
JavaScript
Raw Permalink Normal View History

2026-10-26 20:12:16 +00:00
import { describe, expect, it } from 'vitest';
import { mount } from '@vue/test-utils';
import ConfirmDialog from '../../../resources/js/Components/ConfirmDialog.vue';
const mountDialog = (props = {}) =>
mount(ConfirmDialog, { props: { open: true, ...props } });
const escapeKey = () =>
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
describe('ConfirmDialog', () => {
it('renders nothing when closed', () => {
const wrapper = mount(ConfirmDialog, { props: { open: false } });
expect(wrapper.find('[role="dialog"]').exists()).toBe(false);
});
it('renders the title, message, and confirm label when open', () => {
const wrapper = mountDialog({
title: 'Delete prompt?',
message: 'This is permanent.',
confirmLabel: 'Delete',
});
expect(wrapper.find('[role="dialog"]').attributes('aria-modal')).toBe('true');
expect(wrapper.find('h2').text()).toBe('Delete prompt?');
expect(wrapper.find('p').text()).toBe('This is permanent.');
const buttons = wrapper.findAll('button');
expect(buttons).toHaveLength(2);
expect(buttons[0].text()).toBe('Cancel');
expect(buttons[1].text()).toBe('Delete');
});
it('omits the message paragraph when there is no message', () => {
const wrapper = mountDialog({ message: '' });
expect(wrapper.find('p').exists()).toBe(false);
});
it('emits "confirm" when the confirm button is clicked', async () => {
const wrapper = mountDialog();
await wrapper.findAll('button')[1].trigger('click');
expect(wrapper.emitted('confirm')).toHaveLength(1);
expect(wrapper.emitted('cancel')).toBeUndefined();
});
it('emits "cancel" when the cancel button is clicked', async () => {
const wrapper = mountDialog();
await wrapper.findAll('button')[0].trigger('click');
expect(wrapper.emitted('cancel')).toHaveLength(1);
});
it('emits "cancel" on Escape while open, and ignores other keys', async () => {
const wrapper = mountDialog();
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));
expect(wrapper.emitted('cancel')).toBeUndefined();
escapeKey();
expect(wrapper.emitted('cancel')).toHaveLength(1);
});
it('detaches the Escape handler when closed or unmounted', async () => {
const wrapper = mountDialog();
await wrapper.setProps({ open: false });
escapeKey();
expect(wrapper.emitted('cancel')).toBeUndefined();
await wrapper.setProps({ open: true });
wrapper.unmount();
escapeKey();
expect(wrapper.emitted('cancel')).toBeUndefined();
});
});