diff --git a/package.json b/package.json index 5e12881d..38f05106 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@internxt/node-win", - "version": "1.0.6", + "version": "1.0.7", "description": "Drive desktop node addon", "main": "dist/index.ts", "types": "dist/index.d.ts", diff --git a/src/queue/queue-manager.ts b/src/queue/queue-manager.ts index 356f23e5..69ab7aad 100644 --- a/src/queue/queue-manager.ts +++ b/src/queue/queue-manager.ts @@ -132,16 +132,18 @@ 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); }); } diff --git a/src/queue/queue-manager.unit.test.ts b/src/queue/queue-manager.unit.test.ts new file mode 100644 index 00000000..dc3265b9 --- /dev/null +++ b/src/queue/queue-manager.unit.test.ts @@ -0,0 +1,112 @@ +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 { 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; + + const persistPath = join(TEST_FILES, v4()); + + beforeEach(() => { + vi.clearAllMocks(); + queueManager = new QueueManager(mockHandlers, mockCallbacks, persistPath); + }); + + 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)); + + 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 }, + { 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]).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 }, + { 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]).toStrictEqual([ + { 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 }, + ]); + }); +}); 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,