123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- import "pepjs";
- import {
- render,
- queries,
- RenderResult,
- RenderOptions,
- waitFor,
- } from "@testing-library/react";
- import * as toolQueries from "./queries/toolQueries";
- import { ImportedDataState } from "../data/types";
- import { STORAGE_KEYS } from "../excalidraw-app/data/localStorage";
- import { SceneData } from "../types";
- import { getSelectedElements } from "../scene/selection";
- import { ExcalidrawElement } from "../element/types";
- require("fake-indexeddb/auto");
- const customQueries = {
- ...queries,
- ...toolQueries,
- };
- type TestRenderFn = (
- ui: React.ReactElement,
- options?: Omit<
- RenderOptions & { localStorageData?: ImportedDataState },
- "queries"
- >,
- ) => Promise<RenderResult<typeof customQueries>>;
- const renderApp: TestRenderFn = async (ui, options) => {
- if (options?.localStorageData) {
- initLocalStorage(options.localStorageData);
- delete options.localStorageData;
- }
- const renderResult = render(ui, {
- queries: customQueries,
- ...options,
- });
- GlobalTestState.renderResult = renderResult;
- Object.defineProperty(GlobalTestState, "canvas", {
- // must be a getter because at the time of ExcalidrawApp render the
- // child App component isn't likely mounted yet (and thus canvas not
- // present in DOM)
- get() {
- return renderResult.container.querySelector("canvas")!;
- },
- });
- await waitFor(() => {
- const canvas = renderResult.container.querySelector("canvas");
- if (!canvas) {
- throw new Error("not initialized yet");
- }
- });
- return renderResult;
- };
- // re-export everything
- export * from "@testing-library/react";
- // override render method
- export { renderApp as render };
- /**
- * For state-sharing across test helpers.
- * NOTE: there shouldn't be concurrency issues as each test is running in its
- * own process and thus gets its own instance of this module when running
- * tests in parallel.
- */
- export class GlobalTestState {
- /**
- * automatically updated on each call to render()
- */
- static renderResult: RenderResult<typeof customQueries> = null!;
- /**
- * retrieves canvas for currently rendered app instance
- */
- static get canvas(): HTMLCanvasElement {
- return null!;
- }
- }
- const initLocalStorage = (data: ImportedDataState) => {
- if (data.elements) {
- localStorage.setItem(
- STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS,
- JSON.stringify(data.elements),
- );
- }
- if (data.appState) {
- localStorage.setItem(
- STORAGE_KEYS.LOCAL_STORAGE_APP_STATE,
- JSON.stringify(data.appState),
- );
- }
- };
- export const updateSceneData = (data: SceneData) => {
- (window.collab as any).excalidrawAPI.updateScene(data);
- };
- const originalGetBoundingClientRect =
- global.window.HTMLDivElement.prototype.getBoundingClientRect;
- export const mockBoundingClientRect = () => {
- // override getBoundingClientRect as by default it will always return all values as 0 even if customized in html
- global.window.HTMLDivElement.prototype.getBoundingClientRect = () => ({
- top: 10,
- left: 20,
- bottom: 10,
- right: 10,
- width: 200,
- x: 10,
- y: 20,
- height: 100,
- toJSON: () => {},
- });
- };
- export const restoreOriginalGetBoundingClientRect = () => {
- global.window.HTMLDivElement.prototype.getBoundingClientRect = originalGetBoundingClientRect;
- };
- export const assertSelectedElements = (
- ...elements: (
- | (ExcalidrawElement["id"] | ExcalidrawElement)[]
- | ExcalidrawElement["id"]
- | ExcalidrawElement
- )[]
- ) => {
- const { h } = window;
- const selectedElementIds = getSelectedElements(
- h.app.getSceneElements(),
- h.state,
- ).map((el) => el.id);
- const ids = elements
- .flat()
- .map((item) => (typeof item === "string" ? item : item.id));
- expect(selectedElementIds.length).toBe(ids.length);
- expect(selectedElementIds).toEqual(expect.arrayContaining(ids));
- };
|