import { fireEvent, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { createTestTable } from "./utils/testData"; describe("BulkEditTable", () => { describe("selection", () => { it("should select a cell when it is clicked", async () => { const { render } = createTestTable(); render(); userEvent.click(await screen.findByText("a2")); const copyEvent = { clipboardData: { setData: jest.fn(), }, }; fireEvent.copy(document, copyEvent); expect(copyEvent.clipboardData.setData).toHaveBeenCalledTimes(1); expect(copyEvent.clipboardData.setData).toHaveBeenCalledWith( "text/plain", "a2" ); }); it("should select a square of cells when they are clicked and dragged", async () => { const { render } = createTestTable(); render(); fireEvent.mouseDown(await screen.findByText("a2")); userEvent.hover(screen.getByText("c4")); fireEvent.mouseUp(screen.getByText("c4")); const copyEvent = { clipboardData: { setData: jest.fn(), }, }; fireEvent.copy(document, copyEvent); expect(copyEvent.clipboardData.setData).toHaveBeenCalledWith( "text/plain", "a2\tb2\tc2\na3\tb3\tc3\na4\tb4\tc4" ); }); it("selection should move when arrow keys are pressed", async () => { const { render } = createTestTable(); render(); userEvent.click(await screen.findByText("a2")); userEvent.keyboard("{arrowright}{arrowdown}"); const copyEvent = { clipboardData: { setData: jest.fn(), }, }; fireEvent.copy(document, copyEvent); expect(copyEvent.clipboardData.setData).toHaveBeenCalledWith( "text/plain", "b3" ); }); it("selection grows when shift is held and keys are moving away from primary selection", async () => { const { render } = createTestTable(); render(); userEvent.click(await screen.findByText("a2")); userEvent.keyboard("{shift}{arrowright}{arrowdown}{/shift}"); const copyEvent = { clipboardData: { setData: jest.fn(), }, }; fireEvent.copy(document, copyEvent); expect(copyEvent.clipboardData.setData).toHaveBeenCalledWith( "text/plain", "a2\tb2\na3\tb3" ); }); it("selection shrinks when shift is held and keys are moving away from primary selection", async () => { const { render } = createTestTable(); render(); fireEvent.mouseDown(await screen.findByText("a2")); userEvent.hover(screen.getByText("c4")); fireEvent.mouseUp(screen.getByText("c4")); userEvent.keyboard("{shift}{arrowleft}{arrowup}{/shift}"); const copyEvent = { clipboardData: { setData: jest.fn(), }, }; fireEvent.copy(document, copyEvent); expect(copyEvent.clipboardData.setData).toHaveBeenCalledWith( "text/plain", "a2\tb2\na3\tb3" ); }); }); });