@protontech/drive-sdk 0.0.13 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +3 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/memoryCache.d.ts +1 -1
- package/dist/cache/nullCache.d.ts +14 -0
- package/dist/cache/nullCache.js +37 -0
- package/dist/cache/nullCache.js.map +1 -0
- package/dist/config.d.ts +16 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/crypto/openPGPCrypto.js +2 -0
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/eventsGenerator.d.ts +14 -0
- package/dist/diagnostic/eventsGenerator.js +49 -0
- package/dist/diagnostic/eventsGenerator.js.map +1 -0
- package/dist/diagnostic/httpClient.d.ts +16 -0
- package/dist/diagnostic/httpClient.js +81 -0
- package/dist/diagnostic/httpClient.js.map +1 -0
- package/dist/diagnostic/index.d.ts +10 -0
- package/dist/diagnostic/index.js +35 -0
- package/dist/diagnostic/index.js.map +1 -0
- package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
- package/dist/diagnostic/integrityVerificationStream.js +56 -0
- package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
- package/dist/diagnostic/interface.d.ts +102 -0
- package/dist/diagnostic/interface.js +3 -0
- package/dist/diagnostic/interface.js.map +1 -0
- package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
- package/dist/diagnostic/sdkDiagnostic.js +216 -0
- package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
- package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
- package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
- package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
- package/dist/diagnostic/telemetry.d.ts +25 -0
- package/dist/diagnostic/telemetry.js +70 -0
- package/dist/diagnostic/telemetry.js.map +1 -0
- package/dist/diagnostic/zipGenerators.d.ts +9 -0
- package/dist/diagnostic/zipGenerators.js +64 -0
- package/dist/diagnostic/zipGenerators.js.map +1 -0
- package/dist/diagnostic/zipGenerators.test.js +144 -0
- package/dist/diagnostic/zipGenerators.test.js.map +1 -0
- package/dist/errors.d.ts +2 -1
- package/dist/errors.js +3 -1
- package/dist/errors.js.map +1 -1
- package/dist/interface/config.d.ts +26 -0
- package/dist/interface/config.js +3 -0
- package/dist/interface/config.js.map +1 -0
- package/dist/interface/download.d.ts +2 -2
- package/dist/interface/events.d.ts +60 -20
- package/dist/interface/events.js +11 -1
- package/dist/interface/events.js.map +1 -1
- package/dist/interface/httpClient.d.ts +0 -14
- package/dist/interface/index.d.ts +8 -4
- package/dist/interface/index.js +2 -1
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +9 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/sharing.d.ts +1 -0
- package/dist/interface/upload.d.ts +6 -0
- package/dist/internal/download/apiService.js +32 -31
- package/dist/internal/download/apiService.js.map +1 -1
- package/dist/internal/download/fileDownloader.d.ts +2 -2
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/events/apiService.d.ts +4 -6
- package/dist/internal/events/apiService.js +15 -22
- package/dist/internal/events/apiService.js.map +1 -1
- package/dist/internal/events/coreEventManager.d.ts +7 -10
- package/dist/internal/events/coreEventManager.js +19 -36
- package/dist/internal/events/coreEventManager.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.js +87 -0
- package/dist/internal/events/coreEventManager.test.js.map +1 -0
- package/dist/internal/events/eventManager.d.ts +11 -36
- package/dist/internal/events/eventManager.js +59 -105
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +167 -82
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +13 -33
- package/dist/internal/events/index.js +56 -72
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +59 -14
- package/dist/internal/events/interface.js +13 -3
- package/dist/internal/events/interface.js.map +1 -1
- package/dist/internal/events/volumeEventManager.d.ts +7 -17
- package/dist/internal/events/volumeEventManager.js +58 -45
- package/dist/internal/events/volumeEventManager.js.map +1 -1
- package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
- package/dist/internal/events/volumeEventManager.test.js +203 -0
- package/dist/internal/events/volumeEventManager.test.js.map +1 -0
- package/dist/internal/nodes/cache.d.ts +10 -1
- package/dist/internal/nodes/cache.js +17 -0
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +1 -1
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/events.d.ts +7 -83
- package/dist/internal/nodes/events.js +43 -217
- package/dist/internal/nodes/events.js.map +1 -1
- package/dist/internal/nodes/events.test.js +27 -277
- package/dist/internal/nodes/events.test.js.map +1 -1
- package/dist/internal/nodes/index.d.ts +3 -4
- package/dist/internal/nodes/index.js +5 -5
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.d.ts +15 -0
- package/dist/internal/nodes/nodesAccess.js +37 -0
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +131 -93
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +1 -3
- package/dist/internal/nodes/nodesManagement.js +12 -26
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +35 -14
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/shares/cache.d.ts +2 -0
- package/dist/internal/shares/cache.js +2 -0
- package/dist/internal/shares/cache.js.map +1 -1
- package/dist/internal/shares/manager.d.ts +1 -0
- package/dist/internal/shares/manager.js +3 -0
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/sharing/apiService.js +1 -0
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.js +1 -0
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/events.d.ts +23 -55
- package/dist/internal/sharing/events.js +46 -138
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +77 -180
- package/dist/internal/sharing/events.test.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +4 -5
- package/dist/internal/sharing/index.js +5 -5
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +3 -0
- package/dist/internal/sharing/sharingManagement.d.ts +2 -3
- package/dist/internal/sharing/sharingManagement.js +7 -9
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +9 -39
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/upload/apiService.d.ts +2 -3
- package/dist/internal/upload/apiService.js +7 -4
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/index.d.ts +2 -2
- package/dist/internal/upload/index.js +3 -3
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +2 -0
- package/dist/internal/upload/manager.d.ts +5 -5
- package/dist/internal/upload/manager.js +19 -50
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +68 -44
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.js +1 -2
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +1 -1
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +19 -162
- package/dist/protonDriveClient.js +26 -190
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.js +3 -2
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/package.json +3 -3
- package/src/cache/index.ts +1 -0
- package/src/cache/memoryCache.ts +1 -1
- package/src/cache/nullCache.ts +38 -0
- package/src/config.ts +17 -2
- package/src/crypto/openPGPCrypto.ts +2 -0
- package/src/diagnostic/eventsGenerator.ts +48 -0
- package/src/diagnostic/httpClient.ts +80 -0
- package/src/diagnostic/index.ts +38 -0
- package/src/diagnostic/integrityVerificationStream.ts +56 -0
- package/src/diagnostic/interface.ts +158 -0
- package/src/diagnostic/sdkDiagnostic.ts +238 -0
- package/src/diagnostic/sdkDiagnosticFull.ts +40 -0
- package/src/diagnostic/telemetry.ts +71 -0
- package/src/diagnostic/zipGenerators.test.ts +177 -0
- package/src/diagnostic/zipGenerators.ts +70 -0
- package/src/errors.ts +4 -1
- package/src/interface/config.ts +28 -0
- package/src/interface/download.ts +2 -2
- package/src/interface/events.ts +66 -21
- package/src/interface/httpClient.ts +0 -16
- package/src/interface/index.ts +8 -4
- package/src/interface/nodes.ts +21 -12
- package/src/interface/sharing.ts +1 -0
- package/src/interface/upload.ts +6 -0
- package/src/internal/download/apiService.ts +11 -8
- package/src/internal/download/fileDownloader.ts +2 -2
- package/src/internal/events/apiService.ts +25 -28
- package/src/internal/events/coreEventManager.test.ts +101 -0
- package/src/internal/events/coreEventManager.ts +20 -45
- package/src/internal/events/eventManager.test.ts +201 -88
- package/src/internal/events/eventManager.ts +69 -115
- package/src/internal/events/index.ts +54 -84
- package/src/internal/events/interface.ts +70 -15
- package/src/internal/events/volumeEventManager.test.ts +243 -0
- package/src/internal/events/volumeEventManager.ts +55 -53
- package/src/internal/nodes/cache.ts +20 -2
- package/src/internal/nodes/cryptoService.ts +1 -1
- package/src/internal/nodes/events.test.ts +29 -335
- package/src/internal/nodes/events.ts +45 -253
- package/src/internal/nodes/index.ts +6 -8
- package/src/internal/nodes/interface.ts +2 -2
- package/src/internal/nodes/nodesAccess.test.ts +132 -91
- package/src/internal/nodes/nodesAccess.ts +40 -1
- package/src/internal/nodes/nodesManagement.test.ts +39 -15
- package/src/internal/nodes/nodesManagement.ts +12 -30
- package/src/internal/shares/cache.ts +4 -2
- package/src/internal/shares/manager.ts +9 -5
- package/src/internal/sharing/apiService.ts +1 -0
- package/src/internal/sharing/cache.ts +1 -1
- package/src/internal/sharing/cryptoService.ts +1 -0
- package/src/internal/sharing/events.test.ts +89 -195
- package/src/internal/sharing/events.ts +42 -156
- package/src/internal/sharing/index.ts +6 -9
- package/src/internal/sharing/interface.ts +6 -2
- package/src/internal/sharing/sharingManagement.test.ts +10 -40
- package/src/internal/sharing/sharingManagement.ts +7 -11
- package/src/internal/upload/apiService.ts +5 -6
- package/src/internal/upload/index.ts +5 -5
- package/src/internal/upload/interface.ts +2 -0
- package/src/internal/upload/manager.test.ts +75 -45
- package/src/internal/upload/manager.ts +24 -54
- package/src/internal/upload/streamUploader.test.ts +0 -1
- package/src/internal/upload/streamUploader.ts +0 -2
- package/src/protonDriveClient.ts +75 -244
- package/src/protonDrivePhotosClient.ts +4 -3
- package/dist/internal/events/cache.d.ts +0 -28
- package/dist/internal/events/cache.js +0 -67
- package/dist/internal/events/cache.js.map +0 -1
- package/dist/internal/events/cache.test.js +0 -43
- package/dist/internal/events/cache.test.js.map +0 -1
- package/dist/internal/nodes/index.test.js +0 -114
- package/dist/internal/nodes/index.test.js.map +0 -1
- package/src/internal/events/cache.test.ts +0 -47
- package/src/internal/events/cache.ts +0 -80
- package/src/internal/nodes/index.test.ts +0 -137
- /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
- /package/dist/internal/{nodes/index.test.d.ts → events/coreEventManager.test.d.ts} +0 -0
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { getMockLogger } from "../../tests/logger";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { DriveEvent, DriveEventType } from "../events";
|
|
3
|
+
import { NodesEventsHandler } from "./events";
|
|
4
4
|
import { DecryptedNode } from "./interface";
|
|
5
5
|
import { NodesCache } from "./cache";
|
|
6
|
-
import { NodesAccess } from "./nodesAccess";
|
|
7
6
|
|
|
8
|
-
describe("
|
|
7
|
+
describe("NodesEventsHandler", () => {
|
|
9
8
|
const logger = getMockLogger();
|
|
10
|
-
|
|
11
9
|
let cache: NodesCache;
|
|
10
|
+
let nodesEventsNodesEventsHandler: NodesEventsHandler;
|
|
12
11
|
|
|
13
12
|
beforeEach(() => {
|
|
14
13
|
jest.clearAllMocks();
|
|
@@ -16,368 +15,63 @@ describe("updateCacheByEvent", () => {
|
|
|
16
15
|
// @ts-expect-error No need to implement all methods for mocking
|
|
17
16
|
cache = {
|
|
18
17
|
getNode: jest.fn(() => Promise.resolve({
|
|
19
|
-
uid:
|
|
20
|
-
parentUid:
|
|
21
|
-
name: { ok: true, value:
|
|
18
|
+
uid: "nodeUid123",
|
|
19
|
+
parentUid: "parentUid",
|
|
20
|
+
name: { ok: true, value: "name" },
|
|
22
21
|
} as DecryptedNode)),
|
|
23
22
|
setNode: jest.fn(),
|
|
24
23
|
removeNodes: jest.fn(),
|
|
25
24
|
resetFolderChildrenLoaded: jest.fn(),
|
|
26
25
|
};
|
|
26
|
+
nodesEventsNodesEventsHandler = new NodesEventsHandler(logger, cache);
|
|
27
27
|
});
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
it("should unset the parent listing complete status when a `NodeCreated` event is received.", async () => {
|
|
30
30
|
const event: DriveEvent = {
|
|
31
|
+
eventId: "event1",
|
|
31
32
|
type: DriveEventType.NodeCreated,
|
|
32
33
|
nodeUid: "nodeUid",
|
|
33
34
|
parentNodeUid: "parentUid",
|
|
34
35
|
isTrashed: false,
|
|
35
36
|
isShared: false,
|
|
36
|
-
|
|
37
|
+
treeEventScopeId: "volume1",
|
|
37
38
|
};
|
|
39
|
+
await nodesEventsNodesEventsHandler.updateNodesCacheOnEvent(event);
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
expect(cache.getNode).toHaveBeenCalledTimes(0);
|
|
43
|
-
expect(cache.setNode).toHaveBeenCalledTimes(0);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("should reset parent loaded state", async () => {
|
|
47
|
-
await updateCacheByEvent(logger, event, cache);
|
|
48
|
-
|
|
49
|
-
expect(cache.resetFolderChildrenLoaded).toHaveBeenCalledWith('parentUid');
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it("should skip reset parent loaded state if parent missing", async () => {
|
|
53
|
-
await updateCacheByEvent(logger, { ...event, parentNodeUid: undefined }, cache);
|
|
54
|
-
|
|
55
|
-
expect(cache.resetFolderChildrenLoaded).not.toHaveBeenCalled();
|
|
56
|
-
});
|
|
41
|
+
expect(cache.resetFolderChildrenLoaded).toHaveBeenCalledTimes(1);
|
|
42
|
+
expect(cache.resetFolderChildrenLoaded).toHaveBeenCalledWith("parentUid");
|
|
43
|
+
expect(cache.setNode).toHaveBeenCalledTimes(0);
|
|
57
44
|
});
|
|
58
45
|
|
|
59
|
-
|
|
46
|
+
it("should update the node metadata when a `NodeUpdated` event is received.", async () => {
|
|
60
47
|
const event: DriveEvent = {
|
|
61
48
|
type: DriveEventType.NodeUpdated,
|
|
62
|
-
|
|
49
|
+
eventId: "event1",
|
|
50
|
+
nodeUid: "nodeUid123",
|
|
63
51
|
parentNodeUid: "parentUid",
|
|
64
52
|
isTrashed: false,
|
|
65
53
|
isShared: false,
|
|
66
|
-
|
|
54
|
+
treeEventScopeId: "volume1",
|
|
67
55
|
};
|
|
56
|
+
await nodesEventsNodesEventsHandler.updateNodesCacheOnEvent(event);
|
|
68
57
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
73
|
-
expect(cache.setNode).toHaveBeenCalledTimes(1);
|
|
74
|
-
expect(cache.setNode).toHaveBeenCalledWith(expect.objectContaining({ uid: '123', isStale: true, parentUid: "parentUid" }));
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it("should skip if missing in cache", async () => {
|
|
78
|
-
cache.getNode = jest.fn(() => Promise.reject(new Error('Missing in the cache')));
|
|
79
|
-
|
|
80
|
-
await updateCacheByEvent(logger, event, cache);
|
|
81
|
-
|
|
82
|
-
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
83
|
-
expect(cache.setNode).toHaveBeenCalledTimes(0);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("should remove from cache if not possible to set", async () => {
|
|
87
|
-
cache.setNode = jest.fn(() => Promise.reject(new Error('Cannot set node')));
|
|
88
|
-
|
|
89
|
-
await updateCacheByEvent(logger, event, cache);
|
|
90
|
-
|
|
91
|
-
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
92
|
-
expect(cache.removeNodes).toHaveBeenCalledTimes(1);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it("should throw if remove fails", async () => {
|
|
96
|
-
cache.setNode = jest.fn(() => Promise.reject(new Error('Cannot set node')));
|
|
97
|
-
cache.removeNodes = jest.fn(() => Promise.reject(new Error('Cannot remove node')));
|
|
98
|
-
|
|
99
|
-
await expect(updateCacheByEvent(logger, event, cache)).rejects.toThrow('Cannot set node');
|
|
100
|
-
});
|
|
58
|
+
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
59
|
+
expect(cache.setNode).toHaveBeenCalledTimes(1);
|
|
60
|
+
expect(cache.setNode).toHaveBeenCalledWith(expect.objectContaining({ uid: 'nodeUid123', isStale: true, parentUid: "parentUid", trashTime: undefined, isShared: false }));
|
|
101
61
|
});
|
|
102
62
|
|
|
103
|
-
|
|
63
|
+
it("should remove node from cache", async () => {
|
|
104
64
|
const event: DriveEvent = {
|
|
105
65
|
type: DriveEventType.NodeDeleted,
|
|
106
|
-
|
|
66
|
+
eventId: "event1",
|
|
67
|
+
nodeUid: "nodeUid123",
|
|
107
68
|
parentNodeUid: "parentUid",
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
it("should remove node from cache", async () => {
|
|
112
|
-
await deleteFromCacheByEvent(logger, event, cache);
|
|
113
|
-
|
|
114
|
-
expect(cache.removeNodes).toHaveBeenCalledTimes(1);
|
|
115
|
-
expect(cache.removeNodes).toHaveBeenCalledWith([event.nodeUid]);
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
describe("notifyListenersByEvent", () => {
|
|
121
|
-
const logger = getMockLogger();
|
|
122
|
-
|
|
123
|
-
let cache: NodesCache;
|
|
124
|
-
let nodesAccess: NodesAccess;
|
|
125
|
-
|
|
126
|
-
beforeEach(() => {
|
|
127
|
-
jest.clearAllMocks();
|
|
128
|
-
|
|
129
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
130
|
-
cache = {
|
|
131
|
-
getNode: jest.fn(() => Promise.resolve({
|
|
132
|
-
uid: '123',
|
|
133
|
-
parentUid: 'parentUid',
|
|
134
|
-
name: { ok: true, value: 'name' },
|
|
135
|
-
} as DecryptedNode)),
|
|
136
|
-
};
|
|
137
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
138
|
-
nodesAccess = {
|
|
139
|
-
getNode: jest.fn(() => Promise.resolve({ uid: 'nodeUid', name: { ok: true, value: 'name' } } as DecryptedNode)),
|
|
140
|
-
};
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
describe('update event', () => {
|
|
144
|
-
it("should notify listeners by parentNodeUid when there is update", async () => {
|
|
145
|
-
const event: DriveEvent = {
|
|
146
|
-
type: DriveEventType.NodeUpdated,
|
|
147
|
-
nodeUid: "nodeUid",
|
|
148
|
-
parentNodeUid: "parentUid",
|
|
149
|
-
isTrashed: false,
|
|
150
|
-
isShared: false,
|
|
151
|
-
isOwnVolume: true,
|
|
152
|
-
};
|
|
153
|
-
const listener = jest.fn();
|
|
154
|
-
|
|
155
|
-
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'parentUid', callback: listener }], cache, nodesAccess);
|
|
156
|
-
|
|
157
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
158
|
-
expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'update', uid: 'nodeUid' }));
|
|
159
|
-
expect(nodesAccess.getNode).toHaveBeenCalledTimes(1);
|
|
160
|
-
expect(cache.getNode).toHaveBeenCalledTimes(0);
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
it("should notify listeners by parentNodeUid when it is moved to another parent", async () => {
|
|
164
|
-
const event: DriveEvent = {
|
|
165
|
-
type: DriveEventType.NodeUpdated,
|
|
166
|
-
nodeUid: "nodeUid",
|
|
167
|
-
parentNodeUid: "newParentUid",
|
|
168
|
-
isTrashed: false,
|
|
169
|
-
isShared: false,
|
|
170
|
-
isOwnVolume: true,
|
|
171
|
-
};
|
|
172
|
-
const listener = jest.fn();
|
|
173
|
-
|
|
174
|
-
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'parentUid', callback: listener }], cache, nodesAccess);
|
|
175
|
-
|
|
176
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
177
|
-
expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'remove', uid: 'nodeUid' }));
|
|
178
|
-
expect(nodesAccess.getNode).toHaveBeenCalledTimes(0);
|
|
179
|
-
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it("should notify listeners by isTrashed when there is update", async () => {
|
|
183
|
-
const event: DriveEvent = {
|
|
184
|
-
type: DriveEventType.NodeUpdated,
|
|
185
|
-
nodeUid: "nodeUid",
|
|
186
|
-
parentNodeUid: "parentUid",
|
|
187
|
-
isTrashed: true,
|
|
188
|
-
isShared: false,
|
|
189
|
-
isOwnVolume: true,
|
|
190
|
-
};
|
|
191
|
-
const listener = jest.fn();
|
|
192
|
-
|
|
193
|
-
await notifyListenersByEvent(logger, event, [{ condition: ({ isTrashed }) => !!isTrashed, callback: listener }], cache, nodesAccess);
|
|
194
|
-
|
|
195
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
196
|
-
expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'update', uid: 'nodeUid' }));
|
|
197
|
-
expect(nodesAccess.getNode).toHaveBeenCalledTimes(1);
|
|
198
|
-
expect(cache.getNode).toHaveBeenCalledTimes(0);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it("should notify listeners by isTrashed when it is moved out of trash", async () => {
|
|
202
|
-
cache.getNode = jest.fn(() => Promise.resolve({
|
|
203
|
-
uid: '123',
|
|
204
|
-
parentUid: 'parentUid',
|
|
205
|
-
name: { ok: true, value: 'name' },
|
|
206
|
-
trashTime: new Date(),
|
|
207
|
-
} as DecryptedNode));
|
|
208
|
-
const event: DriveEvent = {
|
|
209
|
-
type: DriveEventType.NodeUpdated,
|
|
210
|
-
nodeUid: "nodeUid",
|
|
211
|
-
parentNodeUid: "parentUid",
|
|
212
|
-
isTrashed: false,
|
|
213
|
-
isShared: false,
|
|
214
|
-
isOwnVolume: true,
|
|
215
|
-
};
|
|
216
|
-
const listener = jest.fn();
|
|
217
|
-
|
|
218
|
-
await notifyListenersByEvent(logger, event, [{ condition: ({ isTrashed }) => !!isTrashed, callback: listener }], cache, nodesAccess);
|
|
219
|
-
|
|
220
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
221
|
-
expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'remove', uid: 'nodeUid' }));
|
|
222
|
-
expect(nodesAccess.getNode).toHaveBeenCalledTimes(0);
|
|
223
|
-
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it("should not notify listeners if neither condition match", async () => {
|
|
227
|
-
const event: DriveEvent = {
|
|
228
|
-
type: DriveEventType.NodeUpdated,
|
|
229
|
-
nodeUid: "nodeUid",
|
|
230
|
-
parentNodeUid: "parentUid",
|
|
231
|
-
isTrashed: false,
|
|
232
|
-
isShared: false,
|
|
233
|
-
isOwnVolume: true,
|
|
234
|
-
};
|
|
235
|
-
const listener = jest.fn();
|
|
236
|
-
|
|
237
|
-
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'lalalala', callback: listener }], cache, nodesAccess);
|
|
238
|
-
|
|
239
|
-
expect(listener).toHaveBeenCalledTimes(0);
|
|
240
|
-
expect(nodesAccess.getNode).toHaveBeenCalledTimes(0);
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
describe('delete event', () => {
|
|
245
|
-
it("should notify listeners by parentNodeUid", async () => {
|
|
246
|
-
const event: DriveEvent = {
|
|
247
|
-
type: DriveEventType.NodeDeleted,
|
|
248
|
-
nodeUid: "nodeUid",
|
|
249
|
-
parentNodeUid: "parentUid",
|
|
250
|
-
isOwnVolume: true,
|
|
251
|
-
};
|
|
252
|
-
const listener = jest.fn();
|
|
253
|
-
|
|
254
|
-
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'parentUid', callback: listener }], cache, nodesAccess);
|
|
255
|
-
|
|
256
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
257
|
-
expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid' });
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
it("should notify listeners by isTrashed from cache", async () => {
|
|
261
|
-
cache.getNode = jest.fn(() => Promise.resolve({ uid: 'nodeUid', trashTime: new Date() } as DecryptedNode));
|
|
262
|
-
const event: DriveEvent = {
|
|
263
|
-
type: DriveEventType.NodeDeleted,
|
|
264
|
-
nodeUid: "nodeUid",
|
|
265
|
-
parentNodeUid: "parentUid",
|
|
266
|
-
isOwnVolume: true,
|
|
267
|
-
};
|
|
268
|
-
|
|
269
|
-
const listener = jest.fn();
|
|
270
|
-
|
|
271
|
-
await notifyListenersByEvent(logger, event, [{ condition: ({ isTrashed }) => !!isTrashed, callback: listener }], cache, nodesAccess);
|
|
272
|
-
|
|
273
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
274
|
-
expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid' });
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
it("should not notify listeners if cache is missing node", async () => {
|
|
278
|
-
cache.getNode = jest.fn(() => Promise.reject(new Error('Missing in the cache')));
|
|
279
|
-
const event: DriveEvent = {
|
|
280
|
-
type: DriveEventType.NodeDeleted,
|
|
281
|
-
nodeUid: "nodeUid",
|
|
282
|
-
parentNodeUid: "parentUid",
|
|
283
|
-
isOwnVolume: true,
|
|
284
|
-
};
|
|
285
|
-
const listener = jest.fn();
|
|
286
|
-
|
|
287
|
-
await notifyListenersByEvent(logger, event, [{ condition: ({ isTrashed }) => !!isTrashed, callback: listener }], cache, nodesAccess);
|
|
288
|
-
|
|
289
|
-
expect(listener).toHaveBeenCalledTimes(0);
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
it("should not notify listeners if neither condition match", async () => {
|
|
293
|
-
const event: DriveEvent = {
|
|
294
|
-
type: DriveEventType.NodeDeleted,
|
|
295
|
-
nodeUid: "nodeUid",
|
|
296
|
-
parentNodeUid: "parentUid",
|
|
297
|
-
isOwnVolume: true,
|
|
298
|
-
};
|
|
299
|
-
const listener = jest.fn();
|
|
300
|
-
|
|
301
|
-
await notifyListenersByEvent(logger, event, [{ condition: ({ parentNodeUid }) => parentNodeUid === 'lalalala', callback: listener }], cache, nodesAccess);
|
|
302
|
-
|
|
303
|
-
expect(listener).toHaveBeenCalledTimes(0);
|
|
304
|
-
});
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
describe("NodesEvents integration", () => {
|
|
309
|
-
const logger = getMockLogger();
|
|
310
|
-
|
|
311
|
-
let eventsService: DriveEventsService;
|
|
312
|
-
let eventsServiceCallback;
|
|
313
|
-
let cache: NodesCache;
|
|
314
|
-
let nodesAccess: NodesAccess;
|
|
315
|
-
let listener: jest.Mock;
|
|
316
|
-
let events: NodesEvents;
|
|
317
|
-
|
|
318
|
-
beforeEach(() => {
|
|
319
|
-
jest.clearAllMocks();
|
|
320
|
-
|
|
321
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
322
|
-
eventsService = {
|
|
323
|
-
addListener: jest.fn((callback) => {
|
|
324
|
-
eventsServiceCallback = callback;
|
|
325
|
-
}),
|
|
326
|
-
}
|
|
327
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
328
|
-
cache = {
|
|
329
|
-
getNode: jest.fn(() => Promise.resolve({
|
|
330
|
-
uid: 'nodeUid',
|
|
331
|
-
parentUid: 'parentUid',
|
|
332
|
-
name: { ok: true, value: 'name' },
|
|
333
|
-
trashTime: new Date(),
|
|
334
|
-
} as DecryptedNode)),
|
|
335
|
-
setNode: jest.fn(),
|
|
336
|
-
removeNodes: jest.fn(),
|
|
337
|
-
};
|
|
338
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
339
|
-
nodesAccess = {
|
|
340
|
-
getNode: jest.fn(() => Promise.resolve({
|
|
341
|
-
uid: 'nodeUid',
|
|
342
|
-
parentUid: 'parentUid',
|
|
343
|
-
name: { ok: true, value: 'name' },
|
|
344
|
-
} as DecryptedNode)),
|
|
69
|
+
treeEventScopeId: "volume1",
|
|
345
70
|
};
|
|
346
|
-
listener = jest.fn();
|
|
347
|
-
events = new NodesEvents(logger, eventsService, cache, nodesAccess);
|
|
348
|
-
events.subscribeToTrashedNodes(listener);
|
|
349
|
-
});
|
|
350
71
|
|
|
351
|
-
|
|
352
|
-
await eventsServiceCallback!([{
|
|
353
|
-
type: DriveEventType.NodeUpdated,
|
|
354
|
-
nodeUid: "nodeUid",
|
|
355
|
-
parentNodeUid: "parentUid",
|
|
356
|
-
isTrashed: false,
|
|
357
|
-
isShared: false,
|
|
358
|
-
isOwnVolume: true,
|
|
359
|
-
} as DriveEvent]);
|
|
72
|
+
await nodesEventsNodesEventsHandler.updateNodesCacheOnEvent(event);
|
|
360
73
|
|
|
361
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
362
|
-
expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid' });
|
|
363
|
-
expect(cache.setNode).toHaveBeenCalledTimes(1);
|
|
364
|
-
expect(cache.setNode).toHaveBeenCalledWith(expect.objectContaining({ uid: 'nodeUid', isStale: true }));
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
it("should send remove to trash listener when node is deleted", async () => {
|
|
368
|
-
await eventsServiceCallback!([{
|
|
369
|
-
type: DriveEventType.NodeDeleted,
|
|
370
|
-
nodeUid: "nodeUid",
|
|
371
|
-
parentNodeUid: "parentUid",
|
|
372
|
-
isTrashed: false,
|
|
373
|
-
isShared: false,
|
|
374
|
-
isOwnVolume: true,
|
|
375
|
-
} as DriveEvent]);
|
|
376
|
-
|
|
377
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
378
|
-
expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid' });
|
|
379
|
-
expect(cache.setNode).toHaveBeenCalledTimes(0);
|
|
380
74
|
expect(cache.removeNodes).toHaveBeenCalledTimes(1);
|
|
381
|
-
expect(cache.removeNodes).toHaveBeenCalledWith([
|
|
75
|
+
expect(cache.removeNodes).toHaveBeenCalledWith([event.nodeUid]);
|
|
382
76
|
});
|
|
383
77
|
});
|