UNPKG

pon-shared-pon.universe.frontend.shared.componentlibrary

Version:

shared components for Pon Universe

189 lines (164 loc) 6.38 kB
import { shallowMount } from "@vue/test-utils"; import Modal from "./pu-molecule-app-modal.vue"; let wrapper; let mockBtn1; let mockBtn2; let mockBtn3; let documentAddEventListerSpy; let documentRemoveEventListerSpy; let mockBtn1AddEventListerSpy; let mockBtn1RemoveEventListerSpy; beforeEach(() => { // Mock html body document.body.innerHTML = ` <div> <button id="btn1">btn 1 </button> <button id="btn2">btn 2 </button> <button id="btn3">btn 3 </button> </div> `; // spies for tracing document methods documentAddEventListerSpy = jest.spyOn(document, "addEventListener"); documentRemoveEventListerSpy = jest.spyOn(document, "removeEventListener"); // elements for test context mockBtn1 = document.getElementById("btn1"); mockBtn2 = document.getElementById("btn2"); mockBtn3 = document.getElementById("btn3"); // spies for tracing element methods mockBtn1AddEventListerSpy = jest.spyOn(mockBtn1, "addEventListener"); mockBtn1RemoveEventListerSpy = jest.spyOn(mockBtn1, "removeEventListener"); // adds a focused element in the context to add activeElement in test context mockBtn1.focus(); wrapper = shallowMount(Modal, { propsData: { title: "titleMock", trackCategory: "trackCategoryMock", iconTitle: "iconTitleMock" }, computed: { dictionary: () => () => "" } }); }); describe("Modal.vue", () => { describe("mounted", () => { // mounted() is called when the shallowMount is created // so the arrange and act is done in the beforeEach loop it("sets document.style.overflow to hidden", () => { expect(document.body.style.overflow).toBe("hidden"); }); it("stores the current active element", () => { expect(wrapper.vm.lastFocus).toBe(mockBtn1); }); it("adds focus restriction to document nodes", () => { expect(wrapper.vm.nodes.includes(mockBtn1)).toBeTruthy(); expect(wrapper.vm.nodes.includes(mockBtn2)).toBeTruthy(); expect(wrapper.vm.nodes.includes(mockBtn3)).toBeTruthy(); expect(mockBtn1AddEventListerSpy).toHaveBeenCalledWith( "focus", wrapper.vm.restrictFocusOfNodesToModal ); }); it("add escape button event on document", () => { expect(documentAddEventListerSpy).toHaveBeenCalledWith( "keydown", wrapper.vm.closeByEscapeKey ); }); }); describe("beforeDestroy", () => { it("sets document.style.overflow to null", () => { wrapper.vm.$destroy(); expect(document.body.style.overflow).toBe(""); }); it("removes focus restriction from document nodes", () => { wrapper.vm.$destroy(); expect(mockBtn1RemoveEventListerSpy).toHaveBeenCalledWith( "focus", wrapper.vm.restrictFocusOfNodesToModal ); }); it("removes escape button event from document", () => { wrapper.vm.$destroy(); expect(documentRemoveEventListerSpy).toHaveBeenCalledWith( "keydown", wrapper.vm.closeByEscapeKey ); }); it("sets focus on the last active element", () => { const mockBtn1FocusSpy = jest.spyOn(mockBtn1, "focus"); wrapper.vm.$destroy(); expect(mockBtn1FocusSpy).toHaveBeenCalled(); }); }); describe("restrictFocusOfNodesToModal", () => { it("stops the event and focus on wrapper", () => { const wrapperFocusSpy = jest.spyOn(wrapper.vm.$refs.wrapper, "focus"); const stopPropagationMock = jest.fn(); const eventMock = { target: mockBtn1, stopPropagation: stopPropagationMock }; wrapper.vm.restrictFocusOfNodesToModal(eventMock); expect(wrapperFocusSpy).toHaveBeenCalled(); expect(stopPropagationMock).toHaveBeenCalled(); }); it("does not stop the event or focus on wrapper when event target is inside the wrapper", () => { const wrapperFocusSpy = jest.spyOn(wrapper.vm.$refs.wrapper, "focus"); const stopPropagationMock = jest.fn(); const eventMock = { target: wrapper.vm.$refs.wrapper, stopPropagation: stopPropagationMock }; wrapper.vm.restrictFocusOfNodesToModal(eventMock); expect(wrapperFocusSpy).not.toHaveBeenCalled(); expect(stopPropagationMock).not.toHaveBeenCalled(); }); }); describe("closeByEscapeKey", () => { it("emits close event when escape button is pressed", () => { const eventMock = { keyCode: 27 }; wrapper.vm.closeByEscapeKey(eventMock); expect(wrapper.emitted("close")).toBeTruthy(); }); it("does not emit close event when event does not contain escape keyCode", () => { const eventMock = { keyCode: 26 }; wrapper.vm.closeByEscapeKey(eventMock); expect(wrapper.emitted("close")).toBeFalsy(); }); }); describe("setFocusOnModal", () => { it("sets focus on wrapper", () => { const wrapperFocusSpy = jest.spyOn(wrapper.vm.$refs.wrapper, "focus"); const eventMock = { propertyName: "opacity" }; wrapper.vm.setFocusOnModal(eventMock); expect(wrapperFocusSpy).toHaveBeenCalled(); }); it("does not set focus on wrapper if event is not valid", () => { const wrapperFocusSpy = jest.spyOn(wrapper.vm.$refs.wrapper, "focus"); const eventMock = { propertyName: "mock" }; wrapper.vm.setFocusOnModal(eventMock); expect(wrapperFocusSpy).not.toHaveBeenCalled(); }); }); describe("closeByBackgroundClick", () => { it("calls close method when event target is modal", () => { const closeSpy = jest.spyOn(wrapper.vm, "close"); const eventMock = { target: wrapper.vm.$refs.modal }; wrapper.vm.closeByBackgroundClick(eventMock); expect(closeSpy).toHaveBeenCalled(); }); it("does not call close method when event target is not modal", () => { const closeSpy = jest.spyOn(wrapper.vm, "close"); const eventMock = { target: wrapper.vm.$refs.wrapper }; wrapper.vm.closeByBackgroundClick(eventMock); expect(closeSpy).not.toHaveBeenCalled(); }); }); describe("close", () => { it("emits close event", () => { wrapper.vm.close(); expect(wrapper.emitted("close")).toBeTruthy(); }); }); });