collab.test.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { render, updateSceneData, waitFor } from "./test-utils";
  2. import ExcalidrawApp from "../excalidraw-app";
  3. import { API } from "./helpers/api";
  4. import { createUndoAction } from "../actions/actionHistory";
  5. const { h } = window;
  6. Object.defineProperty(window, "crypto", {
  7. value: {
  8. getRandomValues: (arr: number[]) =>
  9. arr.forEach((v, i) => (arr[i] = Math.floor(Math.random() * 256))),
  10. subtle: {
  11. generateKey: () => {},
  12. exportKey: () => ({ k: "sTdLvMC_M3V8_vGa3UVRDg" }),
  13. },
  14. },
  15. });
  16. jest.mock("../excalidraw-app/data/firebase.ts", () => {
  17. const loadFromFirebase = async () => null;
  18. const saveToFirebase = () => {};
  19. const isSavedToFirebase = () => true;
  20. const loadFilesFromFirebase = async () => ({
  21. loadedFiles: [],
  22. erroredFiles: [],
  23. });
  24. const saveFilesToFirebase = async () => ({
  25. savedFiles: new Map(),
  26. erroredFiles: new Map(),
  27. });
  28. return {
  29. loadFromFirebase,
  30. saveToFirebase,
  31. isSavedToFirebase,
  32. loadFilesFromFirebase,
  33. saveFilesToFirebase,
  34. };
  35. });
  36. jest.mock("socket.io-client", () => {
  37. return () => {
  38. return {
  39. close: () => {},
  40. on: () => {},
  41. off: () => {},
  42. emit: () => {},
  43. };
  44. };
  45. });
  46. describe("collaboration", () => {
  47. it("creating room should reset deleted elements", async () => {
  48. await render(<ExcalidrawApp />);
  49. // To update the scene with deleted elements before starting collab
  50. updateSceneData({
  51. elements: [
  52. API.createElement({ type: "rectangle", id: "A" }),
  53. API.createElement({
  54. type: "rectangle",
  55. id: "B",
  56. isDeleted: true,
  57. }),
  58. ],
  59. });
  60. await waitFor(() => {
  61. expect(h.elements).toEqual([
  62. expect.objectContaining({ id: "A" }),
  63. expect.objectContaining({ id: "B", isDeleted: true }),
  64. ]);
  65. expect(API.getStateHistory().length).toBe(1);
  66. });
  67. window.collab.openPortal();
  68. await waitFor(() => {
  69. expect(h.elements).toEqual([expect.objectContaining({ id: "A" })]);
  70. expect(API.getStateHistory().length).toBe(1);
  71. });
  72. const undoAction = createUndoAction(h.history);
  73. // noop
  74. h.app.actionManager.executeAction(undoAction);
  75. await waitFor(() => {
  76. expect(h.elements).toEqual([expect.objectContaining({ id: "A" })]);
  77. expect(API.getStateHistory().length).toBe(1);
  78. });
  79. });
  80. });