import MtModal from "./mt-modal.vue";
import MtModalRoot from "./sub-components/mt-modal-root.vue";
import MtModalTrigger from "./sub-components/mt-modal-trigger.vue";
import MtModalAction from "./sub-components/mt-modal-action.vue";
import { render, screen, fireEvent } from "@testing-library/vue";
import { ref } from "vue";
describe("mt-modal", () => {
it("the modal is hidden by default", () => {
// GIVEN
render({
components: { MtModal, MtModalRoot, MtModalTrigger },
template: `
mt-modal works!
`,
});
// WHEN
const modal = screen.queryByRole("dialog");
// THEN
expect(modal).not.toBeInTheDocument();
});
it("the modal is visible by default", () => {
// GIVEN
render({
components: { MtModal, MtModalRoot },
template: `
mt-modal works!
`,
});
// WHEN
const modal = screen.queryByRole("dialog");
// THEN
expect(modal).toBeInTheDocument();
});
it("opens the modal when clicking the trigger", async () => {
// GIVEN
const onChange = vi.fn();
render({
components: { MtModal, MtModalRoot, MtModalTrigger },
setup() {
return { onChange };
},
template: `
Open modal
mt-modal works!
`,
});
// WHEN
await fireEvent.click(screen.getByRole("button"));
// THEN
const modal = screen.queryByRole("dialog");
expect(modal).toBeInTheDocument();
expect(onChange).toHaveBeenNthCalledWith(1, true);
});
it("opens the modal when clicking the trigger when 'isOpen' gets changed", async () => {
// GIVEN
const onChange = vi.fn();
render({
components: { MtModal, MtModalRoot, MtModalTrigger },
setup() {
const isOpen = ref(false);
return { onChange, isOpen };
},
template: `
mt-modal works!
`,
});
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
// WHEN
await fireEvent.click(screen.getByRole("button"));
// THEN
const modal = screen.queryByRole("dialog");
expect(modal).toBeInTheDocument();
expect(onChange).toHaveBeenNthCalledWith(1, true);
});
it("closes the modal", async () => {
const onChange = vi.fn();
// GIVEN
render({
components: { MtModal, MtModalRoot, MtModalTrigger },
setup() {
return { onChange };
},
template: `
Open modal
mt-modal works!
`,
});
await fireEvent.click(screen.getByRole("button", { name: "Open modal" }));
// WHEN
await fireEvent.click(screen.getByRole("button", { name: "Close" }));
// THEN
const modal = screen.queryByRole("dialog");
expect(modal).not.toBeInTheDocument();
expect(onChange).toHaveBeenCalledTimes(2);
expect(onChange).toHaveBeenLastCalledWith(false);
});
it("closes the modal through an action button", async () => {
// GIVEN
render({
components: { MtModal, MtModalRoot, MtModalTrigger, MtModalAction },
template: `
Open modal
mt-modal works!
done()">Confirm
`,
});
await fireEvent.click(screen.getByRole("button", { name: "Open modal" }));
// WHEN
await fireEvent.click(screen.getByRole("button", { name: "Confirm" }));
// THEN
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
});
it("closes the modal when pressing escape", async () => {
// GIVEN
render({
components: { MtModal, MtModalRoot, MtModalTrigger },
template: `
Open modal
mt-modal works!
`,
});
await fireEvent.click(screen.getByRole("button", { name: "Open modal" }));
// WHEN
await fireEvent.keyDown(document, { key: "Escape" });
// THEN
const modal = screen.queryByRole("dialog");
expect(modal).not.toBeInTheDocument();
});
it("closes the modal when clicking on the backdrop", async () => {
// GIVEN
render({
components: { MtModal, MtModalRoot, MtModalTrigger },
template: `
Open modal
mt-modal works!
`,
});
await fireEvent.click(screen.getByRole("button", { name: "Open modal" }));
// WHEN
await fireEvent.click(screen.getByTestId("modal-backdrop"));
// THEN
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
});
});