Skip to content

Commit c9cd49c

Browse files
Merge pull request #153 from internxt/static-addon
Task Sorting Logic Improvement and Package Update
2 parents 6f696ce + 3dd523a commit c9cd49c

File tree

4 files changed

+124
-10
lines changed

4 files changed

+124
-10
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@internxt/node-win",
3-
"version": "1.0.6",
3+
"version": "1.0.7",
44
"description": "Drive desktop node addon",
55
"main": "dist/index.ts",
66
"types": "dist/index.d.ts",

src/queue/queue-manager.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,18 @@ export class QueueManager {
132132

133133
private sortQueue(type: typeQueue): void {
134134
this.queues[type].sort((a, b) => {
135-
if (a.isFolder && b.isFolder) {
136-
return 0;
137-
}
138-
if (a.isFolder) {
139-
return -1;
135+
const depthA = a.path.split("\\").length;
136+
const depthB = b.path.split("\\").length;
137+
138+
if (depthA !== depthB) {
139+
return depthA - depthB;
140140
}
141-
if (b.isFolder) {
142-
return 1;
141+
142+
if (a.isFolder !== b.isFolder) {
143+
return a.isFolder ? 1 : -1;
143144
}
144-
return 0;
145+
146+
return a.path.localeCompare(b.path);
145147
});
146148
}
147149

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import { join } from "path";
2+
import { TEST_FILES } from "test/utils/setup.helper.test";
3+
import { v4 } from "uuid";
4+
import { describe, it, expect, vi, beforeEach } from "vitest";
5+
import { mockDeep } from "vitest-mock-extended";
6+
7+
import { QueueHandler, QueueManager, QueueManagerCallback } from "./queue-manager";
8+
import { QueueItem, typeQueue } from "./queueManager";
9+
10+
describe("QueueManager", () => {
11+
const mockHandlers = mockDeep<QueueHandler>();
12+
const mockCallbacks = mockDeep<QueueManagerCallback>();
13+
let queueManager: QueueManager;
14+
15+
const persistPath = join(TEST_FILES, v4());
16+
17+
beforeEach(() => {
18+
vi.clearAllMocks();
19+
queueManager = new QueueManager(mockHandlers, mockCallbacks, persistPath);
20+
});
21+
22+
it("should add a task to the queue and sort it correctly", async () => {
23+
const tasks: QueueItem[] = [
24+
{ path: "\\test\\folder4", isFolder: true, type: typeQueue.add },
25+
{ path: "\\test\\folder\\test.txt", isFolder: false, type: typeQueue.add },
26+
{ path: "\\test\\test.txt", isFolder: false, type: typeQueue.add },
27+
{ path: "\\test", isFolder: true, type: typeQueue.add },
28+
{ path: "\\test\\test2.txt", isFolder: false, type: typeQueue.add },
29+
{ path: "\\test\\folder", isFolder: true, type: typeQueue.add },
30+
{ path: "\\test\\folder2\\file-pdf", isFolder: false, type: typeQueue.add },
31+
{ path: "\\test\\folder3", isFolder: true, type: typeQueue.add },
32+
{ path: "\\test\\folder3\\file12.txt", isFolder: false, type: typeQueue.add },
33+
{ path: "\\test\\folder3\\folder3", isFolder: true, type: typeQueue.add },
34+
];
35+
36+
tasks.forEach((task) => queueManager.enqueue(task));
37+
38+
expect(queueManager["queues"][typeQueue.add]).toStrictEqual([
39+
{ path: "\\test", isFolder: true, type: typeQueue.add },
40+
{ path: "\\test\\test.txt", isFolder: false, type: typeQueue.add },
41+
{ path: "\\test\\test2.txt", isFolder: false, type: typeQueue.add },
42+
{ path: "\\test\\folder", isFolder: true, type: typeQueue.add },
43+
{ path: "\\test\\folder3", isFolder: true, type: typeQueue.add },
44+
{ path: "\\test\\folder4", isFolder: true, type: typeQueue.add },
45+
{ path: "\\test\\folder\\test.txt", isFolder: false, type: typeQueue.add },
46+
{ path: "\\test\\folder2\\file-pdf", isFolder: false, type: typeQueue.add },
47+
{ path: "\\test\\folder3\\file12.txt", isFolder: false, type: typeQueue.add },
48+
{ path: "\\test\\folder3\\folder3", isFolder: true, type: typeQueue.add },
49+
]);
50+
});
51+
52+
it("should not add a duplicate task", () => {
53+
const task: QueueItem = { path: "\\test.txt", isFolder: false, type: typeQueue.add };
54+
queueManager.enqueue(task);
55+
queueManager.enqueue(task);
56+
57+
expect(queueManager["queues"][typeQueue.add].length).toBe(1);
58+
});
59+
60+
it("should clear the queue", () => {
61+
queueManager.enqueue({ path: "\\test", isFolder: true, type: typeQueue.add });
62+
queueManager.clearQueue();
63+
64+
expect(queueManager["queues"][typeQueue.add].length).toBe(0);
65+
});
66+
67+
it("should correctly order deeply nested structures", () => {
68+
const tasks: QueueItem[] = [
69+
{ path: "\\folder", isFolder: true, type: typeQueue.add },
70+
{ path: "\\folder\\subfolder", isFolder: true, type: typeQueue.add },
71+
{ path: "\\folder\\file.txt", isFolder: false, type: typeQueue.add },
72+
{ path: "\\folder\\subfolder\\file2.txt", isFolder: false, type: typeQueue.add },
73+
{ path: "\\folder\\subfolder\\deep", isFolder: true, type: typeQueue.add },
74+
{ path: "\\folder\\subfolder\\deep\\file3.txt", isFolder: false, type: typeQueue.add },
75+
];
76+
77+
tasks.forEach((task) => queueManager.enqueue(task));
78+
79+
expect(queueManager["queues"][typeQueue.add]).toStrictEqual([
80+
{ path: "\\folder", isFolder: true, type: typeQueue.add },
81+
{ path: "\\folder\\file.txt", isFolder: false, type: typeQueue.add },
82+
{ path: "\\folder\\subfolder", isFolder: true, type: typeQueue.add },
83+
{ path: "\\folder\\subfolder\\file2.txt", isFolder: false, type: typeQueue.add },
84+
{ path: "\\folder\\subfolder\\deep", isFolder: true, type: typeQueue.add },
85+
{ path: "\\folder\\subfolder\\deep\\file3.txt", isFolder: false, type: typeQueue.add },
86+
]);
87+
});
88+
89+
it("should handle mixed folder\\file ordering properly", () => {
90+
const tasks: QueueItem[] = [
91+
{ path: "\\alpha", isFolder: true, type: typeQueue.add },
92+
{ path: "\\alpha\\file1.txt", isFolder: false, type: typeQueue.add },
93+
{ path: "\\alpha\\file2.txt", isFolder: false, type: typeQueue.add },
94+
{ path: "\\beta", isFolder: true, type: typeQueue.add },
95+
{ path: "\\beta\\file3.txt", isFolder: false, type: typeQueue.add },
96+
{ path: "\\gamma\\file4.txt", isFolder: false, type: typeQueue.add },
97+
{ path: "\\gamma", isFolder: true, type: typeQueue.add },
98+
];
99+
100+
tasks.forEach((task) => queueManager.enqueue(task));
101+
102+
expect(queueManager["queues"][typeQueue.add]).toStrictEqual([
103+
{ path: "\\alpha", isFolder: true, type: typeQueue.add },
104+
{ path: "\\beta", isFolder: true, type: typeQueue.add },
105+
{ path: "\\gamma", isFolder: true, type: typeQueue.add },
106+
{ path: "\\alpha\\file1.txt", isFolder: false, type: typeQueue.add },
107+
{ path: "\\alpha\\file2.txt", isFolder: false, type: typeQueue.add },
108+
{ path: "\\beta\\file3.txt", isFolder: false, type: typeQueue.add },
109+
{ path: "\\gamma\\file4.txt", isFolder: false, type: typeQueue.add },
110+
]);
111+
});
112+
});

src/virtual-drive.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ class VirtualDrive {
151151

152152
async registerSyncRoot(providerName: string, providerVersion: string, callbacks: Callbacks, logoPath: string): Promise<any> {
153153
this.callbacks = callbacks;
154-
console.log("Registering sync root: ", this.syncRootPath);
154+
this.logger.debug({ msg: "Registering sync root", syncRootPath: this.syncRootPath });
155155
return this.addon.registerSyncRoot({
156156
providerName,
157157
providerVersion,

0 commit comments

Comments
 (0)