From dae6de547fe18a8820610e673cca7b1bc8cbb98e Mon Sep 17 00:00:00 2001 From: ArceDanielShok Date: Thu, 3 Apr 2025 18:13:06 -0300 Subject: [PATCH 1/5] Enhance queue sorting logic in QueueManager and add unit tests for queue operations --- src/queue/queue-manager.ts | 19 ++-- src/queue/queue-manager.unit.test.ts | 125 +++++++++++++++++++++++++++ 2 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 src/queue/queue-manager.unit.test.ts diff --git a/src/queue/queue-manager.ts b/src/queue/queue-manager.ts index 356f23e5..627d624a 100644 --- a/src/queue/queue-manager.ts +++ b/src/queue/queue-manager.ts @@ -132,17 +132,20 @@ export class QueueManager { private sortQueue(type: typeQueue): void { this.queues[type].sort((a, b) => { - if (a.isFolder && b.isFolder) { - return 0; - } - if (a.isFolder) { - return -1; + const depthA = a.path.split("\\").length; + const depthB = b.path.split("\\").length; + + if (depthA !== depthB) { + return depthA - depthB; } - if (b.isFolder) { - return 1; + + if (a.isFolder !== b.isFolder) { + return a.isFolder ? 1 : -1; } - return 0; + + return a.path.localeCompare(b.path); }); + console.log("Sorted queue:", this.queues[type]); } private async processQueue(type: typeQueue): Promise { diff --git a/src/queue/queue-manager.unit.test.ts b/src/queue/queue-manager.unit.test.ts new file mode 100644 index 00000000..868bae12 --- /dev/null +++ b/src/queue/queue-manager.unit.test.ts @@ -0,0 +1,125 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; + +import { sleep } from "@/utils"; + +import { QueueHandler, QueueManager, QueueManagerCallback } from "./queue-manager"; +import { QueueItem, typeQueue } from "./queueManager"; + +describe("QueueManager", () => { + let queueManager: QueueManager; + let mockHandlers: QueueHandler; + let mockCallbacks: QueueManagerCallback; + + beforeEach(() => { + mockHandlers = { + handleAdd: vi.fn().mockResolvedValue(undefined), + handleHydrate: vi.fn().mockResolvedValue(undefined), + handleDehydrate: vi.fn().mockResolvedValue(undefined), + handleChangeSize: vi.fn().mockResolvedValue(undefined), + }; + + mockCallbacks = { + onTaskSuccess: vi.fn().mockResolvedValue(undefined), + onTaskProcessing: vi.fn().mockResolvedValue(undefined), + }; + + queueManager = new QueueManager(mockHandlers, mockCallbacks, "mockPath.json"); + }); + + it("should initialize the queue correctly", () => { + expect(queueManager).toBeDefined(); + }); + + it("should add a task to the queue and sort it correctly", async () => { + const tasks: QueueItem[] = [ + { path: "\\test\\folder4", isFolder: true, type: typeQueue.add }, + { path: "\\test\\folder\\test.txt", isFolder: false, type: typeQueue.add }, + { path: "\\test\\test.txt", isFolder: false, type: typeQueue.add }, + { path: "\\test", isFolder: true, type: typeQueue.add }, + { path: "\\test\\test2.txt", isFolder: false, type: typeQueue.add }, + { path: "\\test\\folder", isFolder: true, type: typeQueue.add }, + { path: "\\test\\folder2\\file-pdf", isFolder: false, type: typeQueue.add }, + { path: "\\test\\folder3", isFolder: true, type: typeQueue.add }, + { path: "\\test\\folder3\\file12.txt", isFolder: false, type: typeQueue.add }, + { path: "\\test\\folder3\\folder3", isFolder: true, type: typeQueue.add }, + ]; + + tasks.forEach((task) => queueManager.enqueue(task)); + await sleep(1000); + + console.log("queue", queueManager["queues"][typeQueue.add]); + + expect(queueManager["queues"][typeQueue.add]).toEqual([ + { path: "\\test", isFolder: true, type: typeQueue.add }, + { path: "\\test\\test.txt", isFolder: false, type: typeQueue.add }, + { path: "\\test\\test2.txt", isFolder: false, type: typeQueue.add }, + { path: "\\test\\folder", isFolder: true, type: typeQueue.add }, + { path: "\\test\\folder3", isFolder: true, type: typeQueue.add }, + { path: "\\test\\folder4", isFolder: true, type: typeQueue.add }, + { path: "\\test\\folder\\test.txt", isFolder: false, type: typeQueue.add }, + { path: "\\test\\folder2\\file-pdf", isFolder: false, type: typeQueue.add }, + { path: "\\test\\folder3\\file12.txt", isFolder: false, type: typeQueue.add }, + { path: "\\test\\folder3\\folder3", isFolder: true, type: typeQueue.add }, + ]); + }); + + it("should not add a duplicate task", () => { + const task: QueueItem = { path: "\\test.txt", isFolder: false, type: typeQueue.add }; + queueManager.enqueue(task); + queueManager.enqueue(task); + + expect(queueManager["queues"][typeQueue.add].length).toBe(1); + }); + + it("should clear the queue", () => { + queueManager.enqueue({ path: "\\test", isFolder: true, type: typeQueue.add }); + queueManager.clearQueue(); + expect(queueManager["queues"][typeQueue.add].length).toBe(0); + }); + + it("should correctly order deeply nested structures", () => { + const tasks: QueueItem[] = [ + { path: "\\folder", isFolder: true, type: typeQueue.add }, + { path: "\\folder\\subfolder", isFolder: true, type: typeQueue.add }, + { path: "\\folder\\file.txt", isFolder: false, type: typeQueue.add }, + { path: "\\folder\\subfolder\\file2.txt", isFolder: false, type: typeQueue.add }, + { path: "\\folder\\subfolder\\deep", isFolder: true, type: typeQueue.add }, + { path: "\\folder\\subfolder\\deep\\file3.txt", isFolder: false, type: typeQueue.add }, + ]; + + tasks.forEach((task) => queueManager.enqueue(task)); + + expect(queueManager["queues"][typeQueue.add]).toEqual([ + { path: "\\folder", isFolder: true, type: typeQueue.add }, + { path: "\\folder\\file.txt", isFolder: false, type: typeQueue.add }, + { path: "\\folder\\subfolder", isFolder: true, type: typeQueue.add }, + { path: "\\folder\\subfolder\\file2.txt", isFolder: false, type: typeQueue.add }, + { path: "\\folder\\subfolder\\deep", isFolder: true, type: typeQueue.add }, + { path: "\\folder\\subfolder\\deep\\file3.txt", isFolder: false, type: typeQueue.add }, + ]); + }); + + it("should handle mixed folder\\file ordering properly", () => { + const tasks: QueueItem[] = [ + { path: "\\alpha", isFolder: true, type: typeQueue.add }, + { path: "\\alpha\\file1.txt", isFolder: false, type: typeQueue.add }, + { path: "\\alpha\\file2.txt", isFolder: false, type: typeQueue.add }, + { path: "\\beta", isFolder: true, type: typeQueue.add }, + { path: "\\beta\\file3.txt", isFolder: false, type: typeQueue.add }, + { path: "\\gamma\\file4.txt", isFolder: false, type: typeQueue.add }, + { path: "\\gamma", isFolder: true, type: typeQueue.add }, + ]; + + tasks.forEach((task) => queueManager.enqueue(task)); + + expect(queueManager["queues"][typeQueue.add]).toEqual([ + { path: "\\alpha", isFolder: true, type: typeQueue.add }, + { path: "\\beta", isFolder: true, type: typeQueue.add }, + { path: "\\gamma", isFolder: true, type: typeQueue.add }, + { path: "\\alpha\\file1.txt", isFolder: false, type: typeQueue.add }, + { path: "\\alpha\\file2.txt", isFolder: false, type: typeQueue.add }, + { path: "\\beta\\file3.txt", isFolder: false, type: typeQueue.add }, + { path: "\\gamma\\file4.txt", isFolder: false, type: typeQueue.add }, + ]); + }); +}); From 1cc0b445ae918bd81a86efad652c30749f4d55cb Mon Sep 17 00:00:00 2001 From: ArceDanielShok Date: Thu, 3 Apr 2025 18:14:22 -0300 Subject: [PATCH 2/5] Bump version to 1.0.7 in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 98733cdc..38f05106 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@internxt/node-win", - "version": "1.0.5", + "version": "1.0.7", "description": "Drive desktop node addon", "main": "dist/index.ts", "types": "dist/index.d.ts", From f779c2ef603a52470a687fe677079fe56029c2ae Mon Sep 17 00:00:00 2001 From: ArceDanielShok Date: Thu, 3 Apr 2025 18:24:59 -0300 Subject: [PATCH 3/5] Remove debug logging from queue sorting in QueueManager --- src/queue/queue-manager.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/queue/queue-manager.ts b/src/queue/queue-manager.ts index 627d624a..69ab7aad 100644 --- a/src/queue/queue-manager.ts +++ b/src/queue/queue-manager.ts @@ -145,7 +145,6 @@ export class QueueManager { return a.path.localeCompare(b.path); }); - console.log("Sorted queue:", this.queues[type]); } private async processQueue(type: typeQueue): Promise { From 6280885744b33973ecd9b2f935592abeba74e89e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jim=C3=A9nez=20Rivera?= Date: Fri, 4 Apr 2025 09:21:00 +0200 Subject: [PATCH 4/5] Improve tests --- src/queue/queue-manager.unit.test.ts | 39 ++++++++++------------------ src/virtual-drive.ts | 2 +- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/src/queue/queue-manager.unit.test.ts b/src/queue/queue-manager.unit.test.ts index 868bae12..bd29f678 100644 --- a/src/queue/queue-manager.unit.test.ts +++ b/src/queue/queue-manager.unit.test.ts @@ -1,33 +1,22 @@ +import { join } from "path"; +import { TEST_FILES } from "test/utils/setup.helper.test"; +import { v4 } from "uuid"; import { describe, it, expect, vi, beforeEach } from "vitest"; - -import { sleep } from "@/utils"; +import { mockDeep } from "vitest-mock-extended"; import { QueueHandler, QueueManager, QueueManagerCallback } from "./queue-manager"; import { QueueItem, typeQueue } from "./queueManager"; describe("QueueManager", () => { + const mockHandlers = mockDeep(); + const mockCallbacks = mockDeep(); let queueManager: QueueManager; - let mockHandlers: QueueHandler; - let mockCallbacks: QueueManagerCallback; - beforeEach(() => { - mockHandlers = { - handleAdd: vi.fn().mockResolvedValue(undefined), - handleHydrate: vi.fn().mockResolvedValue(undefined), - handleDehydrate: vi.fn().mockResolvedValue(undefined), - handleChangeSize: vi.fn().mockResolvedValue(undefined), - }; - - mockCallbacks = { - onTaskSuccess: vi.fn().mockResolvedValue(undefined), - onTaskProcessing: vi.fn().mockResolvedValue(undefined), - }; - - queueManager = new QueueManager(mockHandlers, mockCallbacks, "mockPath.json"); - }); + const persistPath = join(TEST_FILES, v4()); - it("should initialize the queue correctly", () => { - expect(queueManager).toBeDefined(); + beforeEach(() => { + vi.clearAllMocks(); + queueManager = new QueueManager(mockHandlers, mockCallbacks, persistPath); }); it("should add a task to the queue and sort it correctly", async () => { @@ -45,9 +34,6 @@ describe("QueueManager", () => { ]; tasks.forEach((task) => queueManager.enqueue(task)); - await sleep(1000); - - console.log("queue", queueManager["queues"][typeQueue.add]); expect(queueManager["queues"][typeQueue.add]).toEqual([ { path: "\\test", isFolder: true, type: typeQueue.add }, @@ -74,6 +60,7 @@ describe("QueueManager", () => { it("should clear the queue", () => { queueManager.enqueue({ path: "\\test", isFolder: true, type: typeQueue.add }); queueManager.clearQueue(); + expect(queueManager["queues"][typeQueue.add].length).toBe(0); }); @@ -89,7 +76,7 @@ describe("QueueManager", () => { tasks.forEach((task) => queueManager.enqueue(task)); - expect(queueManager["queues"][typeQueue.add]).toEqual([ + expect(queueManager["queues"][typeQueue.add]).toStrictEqual([ { path: "\\folder", isFolder: true, type: typeQueue.add }, { path: "\\folder\\file.txt", isFolder: false, type: typeQueue.add }, { path: "\\folder\\subfolder", isFolder: true, type: typeQueue.add }, @@ -112,7 +99,7 @@ describe("QueueManager", () => { tasks.forEach((task) => queueManager.enqueue(task)); - expect(queueManager["queues"][typeQueue.add]).toEqual([ + expect(queueManager["queues"][typeQueue.add]).toStrictEqual([ { path: "\\alpha", isFolder: true, type: typeQueue.add }, { path: "\\beta", isFolder: true, type: typeQueue.add }, { path: "\\gamma", isFolder: true, type: typeQueue.add }, diff --git a/src/virtual-drive.ts b/src/virtual-drive.ts index c16a91c3..8c4db925 100644 --- a/src/virtual-drive.ts +++ b/src/virtual-drive.ts @@ -151,7 +151,7 @@ class VirtualDrive { async registerSyncRoot(providerName: string, providerVersion: string, callbacks: Callbacks, logoPath: string): Promise { this.callbacks = callbacks; - console.log("Registering sync root: ", this.syncRootPath); + this.logger.debug({ msg: "Registering sync root", syncRootPath: this.syncRootPath }); return this.addon.registerSyncRoot({ providerName, providerVersion, From 3dd523af1ea2a7351ac6982813b4f388a0c17d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jim=C3=A9nez=20Rivera?= Date: Fri, 4 Apr 2025 09:21:51 +0200 Subject: [PATCH 5/5] Update queue-manager.unit.test.ts --- src/queue/queue-manager.unit.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/queue/queue-manager.unit.test.ts b/src/queue/queue-manager.unit.test.ts index bd29f678..dc3265b9 100644 --- a/src/queue/queue-manager.unit.test.ts +++ b/src/queue/queue-manager.unit.test.ts @@ -35,7 +35,7 @@ describe("QueueManager", () => { tasks.forEach((task) => queueManager.enqueue(task)); - expect(queueManager["queues"][typeQueue.add]).toEqual([ + expect(queueManager["queues"][typeQueue.add]).toStrictEqual([ { path: "\\test", isFolder: true, type: typeQueue.add }, { path: "\\test\\test.txt", isFolder: false, type: typeQueue.add }, { path: "\\test\\test2.txt", isFolder: false, type: typeQueue.add },