From 3de9829bf091659a9d3108c3e6fc2b4d0e2ecab0 Mon Sep 17 00:00:00 2001 From: Eric Doughty-Papassideris Date: Thu, 20 Jun 2024 11:14:45 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20Test=20for=20Repository.atomicCompa?= =?UTF-8?q?reAndSet=20(#525)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../e2e/documents/editing-session.spec.ts | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 tdrive/backend/node/test/e2e/documents/editing-session.spec.ts diff --git a/tdrive/backend/node/test/e2e/documents/editing-session.spec.ts b/tdrive/backend/node/test/e2e/documents/editing-session.spec.ts new file mode 100644 index 00000000..3521ece7 --- /dev/null +++ b/tdrive/backend/node/test/e2e/documents/editing-session.spec.ts @@ -0,0 +1,78 @@ +import { describe, beforeAll, beforeEach, it, expect, afterAll } from "@jest/globals"; + +import { init, TestPlatform } from "../setup"; +import UserApi from "../common/user-api"; + +import { DriveFile, TYPE as DriveFileType } from "../../../src/services/documents/entities/drive-file"; + +describe("the Drive's documents' editing session kind-of-lock", () => { + let platform: TestPlatform | null; + let currentUser: UserApi; + let currentUserRoot: string | undefined; + let temporaryDocument: DriveFile; + + beforeAll(async () => { + platform = await init({ + services: [ + "webserver", + "database", + "applications", + "search", + "storage", + "message-queue", + "user", + "search", + "files", + "websocket", + "messages", + "auth", + "realtime", + "channels", + "counter", + "statistics", + "platform-services", + "documents", + ], + }); + currentUser = await UserApi.getInstance(platform); + currentUserRoot = `user_${currentUser.user.id}`; + }); + + afterAll(async () => { + await platform?.tearDown(); + platform = null; + }); + + beforeEach(async () => { + temporaryDocument = await currentUser.createDefaultDocument({ + parent_id: currentUserRoot, + scope: "personal", + }); + }); + + it("atomicCompareAndSet allows a single value at a time", async () => { + const driveFileRepository = await platform?.database.getRepository(DriveFileType, DriveFile); + + let result = await driveFileRepository?.atomicCompareAndSet(temporaryDocument, "editing_session_key", null, "123"); + expect(result).toEqual({ didSet: true, currentValue: "123" }); + + result = await driveFileRepository?.atomicCompareAndSet(temporaryDocument, "editing_session_key", null, "124"); + expect(result).toEqual({ didSet: false, currentValue: "123" }); + + expect(driveFileRepository?.atomicCompareAndSet(temporaryDocument, "editing_session_key", "124", "124")). + rejects.toThrow("Previous and new values are identical"); + + result = await driveFileRepository?.atomicCompareAndSet(temporaryDocument, "editing_session_key", "122", "124"); + expect(result).toEqual({ didSet: false, currentValue: "123" }); + + result = await driveFileRepository?.atomicCompareAndSet(temporaryDocument, "editing_session_key", "123", "124"); + expect(result).toEqual({ didSet: true, currentValue: "124" }); + + result = await driveFileRepository?.atomicCompareAndSet(temporaryDocument, "editing_session_key", "124", null); + expect(result).toEqual({ didSet: true, currentValue: null }); + + temporaryDocument.id = "00000000-0000-0000-0000-000000000000"; + expect(driveFileRepository?.atomicCompareAndSet(temporaryDocument, "editing_session_key", "124", null)). + rejects.toThrow("no row matched PK"); + }); +});