collab.test.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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/index.ts", () => ({
  17. __esmodule: true,
  18. ...jest.requireActual("../excalidraw-app/data/index.ts"),
  19. getCollabServer: jest.fn(() => ({
  20. url: /* doesn't really matter */ "http://localhost:3002",
  21. })),
  22. }));
  23. jest.mock("../excalidraw-app/data/firebase.ts", () => {
  24. const loadFromFirebase = async () => null;
  25. const saveToFirebase = () => {};
  26. const isSavedToFirebase = () => true;
  27. const loadFilesFromFirebase = async () => ({
  28. loadedFiles: [],
  29. erroredFiles: [],
  30. });
  31. const saveFilesToFirebase = async () => ({
  32. savedFiles: new Map(),
  33. erroredFiles: new Map(),
  34. });
  35. return {
  36. loadFromFirebase,
  37. saveToFirebase,
  38. isSavedToFirebase,
  39. loadFilesFromFirebase,
  40. saveFilesToFirebase,
  41. };
  42. });
  43. jest.mock("socket.io-client", () => {
  44. return () => {
  45. return {
  46. close: () => {},
  47. on: () => {},
  48. off: () => {},
  49. emit: () => {},
  50. };
  51. };
  52. });
  53. describe("collaboration", () => {
  54. it("creating room should reset deleted elements", async () => {
  55. await render(<ExcalidrawApp />);
  56. // To update the scene with deleted elements before starting collab
  57. updateSceneData({
  58. elements: [
  59. API.createElement({ type: "rectangle", id: "A" }),
  60. API.createElement({
  61. type: "rectangle",
  62. id: "B",
  63. isDeleted: true,
  64. }),
  65. ],
  66. });
  67. await waitFor(() => {
  68. expect(h.elements).toEqual([
  69. expect.objectContaining({ id: "A" }),
  70. expect.objectContaining({ id: "B", isDeleted: true }),
  71. ]);
  72. expect(API.getStateHistory().length).toBe(1);
  73. });
  74. window.collab.openPortal();
  75. await waitFor(() => {
  76. expect(h.elements).toEqual([expect.objectContaining({ id: "A" })]);
  77. expect(API.getStateHistory().length).toBe(1);
  78. });
  79. const undoAction = createUndoAction(h.history);
  80. // noop
  81. h.app.actionManager.executeAction(undoAction);
  82. await waitFor(() => {
  83. expect(h.elements).toEqual([expect.objectContaining({ id: "A" })]);
  84. expect(API.getStateHistory().length).toBe(1);
  85. });
  86. });
  87. });