import 'mocha'; import { shallowMount } from '@vue/test-utils'; import { expect } from 'chai'; import ModalContainer from '@/presentation/components/Shared/Modal/ModalContainer.vue'; const DOM_MODAL_CONTAINER_SELECTOR = '.modal-container'; const COMPONENT_MODAL_OVERLAY_NAME = 'ModalOverlay'; const COMPONENT_MODAL_CONTENT_NAME = 'ModalContent'; describe('ModalContainer.vue', () => { describe('rendering based on model prop', () => { it('does not render when model prop is absent or false', () => { // arrange const wrapper = mountComponent({ modelValue: false }); // act const modalContainer = wrapper.find(DOM_MODAL_CONTAINER_SELECTOR); // assert expect(modalContainer.exists()).to.equal(false); }); it('renders modal container when model prop is true', () => { // arrange const wrapper = mountComponent({ modelValue: true }); // act const modalContainer = wrapper.find(DOM_MODAL_CONTAINER_SELECTOR); // assert expect(modalContainer.exists()).to.equal(true); }); }); describe('modal open/close', () => { it('opens when model prop changes from false to true', async () => { // arrange const wrapper = mountComponent({ modelValue: false }); // act await wrapper.setProps({ value: true }); // assert after updating props // eslint-disable-next-line @typescript-eslint/no-explicit-any expect((wrapper.vm as any).isRendered).to.equal(true); // eslint-disable-next-line @typescript-eslint/no-explicit-any expect((wrapper.vm as any).isOpen).to.equal(true); }); it('closes when model prop changes from true to false', async () => { // arrange const wrapper = mountComponent({ modelValue: true }); // act await wrapper.setProps({ value: false }); // assert after updating props // eslint-disable-next-line @typescript-eslint/no-explicit-any expect((wrapper.vm as any).isOpen).to.equal(false); // isRendered will not be true directly due to transition }); it('closes on pressing ESC key', async () => { // arrange const { triggerKeyUp, restore } = createWindowEventSpies(); const wrapper = mountComponent({ modelValue: true }); // act const escapeEvent = new KeyboardEvent('keyup', { key: 'Escape' }); triggerKeyUp(escapeEvent); await wrapper.vm.$nextTick(); // assert expect(wrapper.emitted().input[0]).to.deep.equal([false]); restore(); }); it('emit false value after overlay and content transitions out and model prop is true', async () => { // arrange const wrapper = mountComponent({ modelValue: true }); const overlayMock = wrapper.findComponent({ name: COMPONENT_MODAL_OVERLAY_NAME }); const contentMock = wrapper.findComponent({ name: COMPONENT_MODAL_CONTENT_NAME }); // act overlayMock.vm.$emit('transitionedOut'); contentMock.vm.$emit('transitionedOut'); await wrapper.vm.$nextTick(); // assert expect(wrapper.emitted().input[0]).to.deep.equal([false]); }); }); it('renders provided slot content', () => { // arrange const expectedText = 'Slot content'; const slotContentClass = 'slot-content'; // act const wrapper = mountComponent({ modelValue: true, slotHtml: `