Files
privacy.sexy/tests/unit/presentation/components/Shared/Modal/ModalContent.spec.ts
undergroundwires 5f11c8d98f Migrate unit/integration tests to Vitest with Vite
As part of transition to Vue 3.0 and Vite (#230), this commit
facilitates the shift towards building rest of the application using
Vite. By doing so, it eliminates reliance on outdated Electron building
system that offered limited control, blocking desktop builds (#233).

Changes include:

- Introduce Vite with Vue 2.0 plugin for test execution.
- Remove `mocha`, `chai` and other related dependencies.
- Adjust test to Vitest syntax.
- Revise and update `tests.md` to document the changes.
- Add `@modyfi/vite-plugin-yaml` plugin to be able to use yaml file
  depended logic on test files, replacing previous webpack behavior.
- Fix failing tests that are revealed by Vitest due to unhandled errors
  and lack of assertments.
- Remove the test that depends on Vue CLI populating `process.env`.
- Use `jsdom` for unit test environment, adding it to dependency to
  `package.json` as project now depends on it and it was not specified
  even though `package-lock.json` included it.
2023-08-22 14:02:35 +02:00

104 lines
3.4 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { shallowMount } from '@vue/test-utils';
import ModalContent from '@/presentation/components/Shared/Modal/ModalContent.vue';
const DOM_MODAL_CONTENT_SELECTOR = '.modal-content-content';
const DOM_MODAL_CONTENT_WRAPPER_SELECTOR = '.modal-content-wrapper';
describe('ModalContent.vue', () => {
describe('rendering based on `show` prop', () => {
it('renders modal content when `show` prop is true', () => {
// arrange
const wrapper = mountComponent({ showProperty: true });
// act
const modalContentWrapper = wrapper.find(DOM_MODAL_CONTENT_WRAPPER_SELECTOR);
// assert
expect(modalContentWrapper.exists()).to.equal(true);
});
it('does not render modal content when `show` prop is false', () => {
// arrange
const wrapper = mountComponent({ showProperty: false });
// act
const modalContentWrapper = wrapper.find(DOM_MODAL_CONTENT_WRAPPER_SELECTOR);
// assert
expect(modalContentWrapper.exists()).to.equal(false);
});
it('does not render modal content by default', () => {
// arrange & act
const wrapper = mountComponent();
// assert
const modalContentWrapper = wrapper.find(DOM_MODAL_CONTENT_WRAPPER_SELECTOR);
expect(modalContentWrapper.exists()).to.equal(false);
});
});
it('renders slot content when provided', () => {
// arrange
const expectedText = 'Slot content';
const slotContentClass = 'slot-content';
// act
const wrapper = mountComponent({
showProperty: true,
slotHtml: `<div class="${slotContentClass}">${expectedText}</div>`,
});
// assert
const slotWrapper = wrapper.find(`.${slotContentClass}`);
const slotText = slotWrapper.text();
expect(slotText).to.equal(expectedText);
});
describe('aria attributes', () => {
it('sets aria-expanded to `true` when visible', () => {
// arrange & act
const wrapper = mountComponent({ showProperty: true });
// assert
const modalContent = wrapper.find(DOM_MODAL_CONTENT_SELECTOR);
expect(modalContent.attributes('aria-expanded')).to.equal('true');
});
it('always sets aria-modal to true for the modal content', () => {
// arrange & act
const wrapper = mountComponent({ showProperty: true });
// assert
const modalContent = wrapper.find(DOM_MODAL_CONTENT_SELECTOR);
expect(modalContent.attributes('aria-modal')).to.equal('true');
});
});
it('emits `transitionedOut` event after the transition leave', async () => {
// arrange
const wrapper = mountComponent({ showProperty: true });
// act
await wrapper.vm.$nextTick(); // Ensure the component reflects initial prop
wrapper.setProps({ show: false }); // Trigger the transition
await wrapper.vm.$nextTick(); // Allow the component to update
const transitionWrapper = wrapper.findComponent({ name: 'transition' });
transitionWrapper.vm.$emit('after-leave'); // Simulate the after-leave lifecycle hook of the transition
// assert
expect(wrapper.emitted().transitionedOut).to.have.length(1);
});
});
function mountComponent(options?: {
readonly showProperty?: boolean,
readonly slotHtml?: string,
}) {
return shallowMount(ModalContent as unknown, {
propsData: options?.showProperty !== undefined ? { show: options?.showProperty } : undefined,
slots: options?.slotHtml !== undefined ? { default: options?.slotHtml } : undefined,
});
}