@devrev/airsync-sdk 2.0.0-beta.3 → 2.0.0-beta.5
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/MIGRATION.md +1028 -0
- package/README.md +5 -11
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts +7 -9
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +2 -7
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.js +54 -56
- package/dist/common/constants.d.ts +4 -5
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/common/constants.js +6 -7
- package/dist/common/helpers.d.ts +3 -35
- package/dist/common/helpers.d.ts.map +1 -1
- package/dist/common/helpers.js +5 -50
- package/dist/http/{axios-client-internal.d.ts → client.d.ts} +1 -1
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/{axios-client-internal.js → client.js} +4 -8
- package/dist/index.d.ts +24 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -32
- package/dist/logger/logger.d.ts +12 -53
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.interfaces.d.ts +0 -1
- package/dist/logger/logger.interfaces.d.ts.map +1 -1
- package/dist/logger/logger.js +36 -68
- package/dist/mappers/mappers.d.ts +7 -46
- package/dist/mappers/mappers.d.ts.map +1 -1
- package/dist/mappers/mappers.interfaces.d.ts +175 -0
- package/dist/mappers/mappers.interfaces.d.ts.map +1 -0
- package/dist/mappers/{mappers.interface.js → mappers.interfaces.js} +4 -13
- package/dist/mappers/mappers.js +11 -45
- package/dist/multithreading/adapters/base-adapter.d.ts +30 -32
- package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -1
- package/dist/multithreading/adapters/base-adapter.js +97 -62
- package/dist/multithreading/adapters/extraction-adapter.d.ts +16 -29
- package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -1
- package/dist/multithreading/adapters/extraction-adapter.js +203 -206
- package/dist/multithreading/adapters/loading-adapter.d.ts +8 -13
- package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -1
- package/dist/multithreading/adapters/loading-adapter.helpers.d.ts +2 -12
- package/dist/multithreading/adapters/loading-adapter.helpers.d.ts.map +1 -1
- package/dist/multithreading/adapters/loading-adapter.helpers.js +2 -12
- package/dist/multithreading/adapters/loading-adapter.js +294 -346
- package/dist/multithreading/emit.d.ts +11 -0
- package/dist/multithreading/emit.d.ts.map +1 -0
- package/dist/{common/control-protocol.js → multithreading/emit.js} +5 -7
- package/dist/multithreading/process-task.d.ts +2 -12
- package/dist/multithreading/process-task.d.ts.map +1 -1
- package/dist/multithreading/process-task.js +46 -43
- package/dist/multithreading/spawn/spawn.d.ts +3 -9
- package/dist/multithreading/spawn/spawn.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.d.ts +12 -11
- package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.js +128 -20
- package/dist/multithreading/spawn/spawn.js +24 -39
- package/dist/multithreading/worker.js +1 -4
- package/dist/repo/repo.d.ts +10 -0
- package/dist/repo/repo.d.ts.map +1 -1
- package/dist/repo/repo.helpers.d.ts +6 -0
- package/dist/repo/repo.helpers.d.ts.map +1 -0
- package/dist/repo/repo.helpers.js +16 -0
- package/dist/repo/repo.interfaces.d.ts +4 -16
- package/dist/repo/repo.interfaces.d.ts.map +1 -1
- package/dist/repo/repo.js +23 -8
- package/dist/state/base-state.d.ts +16 -38
- package/dist/state/base-state.d.ts.map +1 -1
- package/dist/state/base-state.js +19 -41
- package/dist/state/extraction-state.d.ts +6 -21
- package/dist/state/extraction-state.d.ts.map +1 -1
- package/dist/state/extraction-state.js +8 -25
- package/dist/{common → state}/install-initial-domain-mapping.d.ts +1 -1
- package/dist/state/install-initial-domain-mapping.d.ts.map +1 -0
- package/dist/{common → state}/install-initial-domain-mapping.js +5 -7
- package/dist/state/loading-state.d.ts +3 -14
- package/dist/state/loading-state.d.ts.map +1 -1
- package/dist/state/loading-state.js +3 -14
- package/dist/state/state.d.ts +4 -0
- package/dist/state/state.d.ts.map +1 -0
- package/dist/state/state.interfaces.d.ts +33 -37
- package/dist/state/state.interfaces.d.ts.map +1 -1
- package/dist/state/state.interfaces.js +16 -11
- package/dist/state/state.js +11 -0
- package/dist/state/time-value-resolver.d.ts +17 -0
- package/dist/state/time-value-resolver.d.ts.map +1 -0
- package/dist/{common → state}/time-value-resolver.js +9 -41
- package/dist/testing/mock-event.d.ts +10 -0
- package/dist/testing/mock-event.d.ts.map +1 -0
- package/dist/{common/test-utils.js → testing/mock-event.js} +17 -14
- package/dist/testing/mock-server.d.ts +29 -0
- package/dist/testing/mock-server.d.ts.map +1 -0
- package/dist/testing/mock-server.interfaces.d.ts +48 -0
- package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
- package/dist/{mock-server → testing}/mock-server.js +21 -33
- package/dist/types/common.d.ts +1 -12
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +1 -6
- package/dist/types/errors.d.ts +9 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/external-domain-metadata.d.ts +30 -171
- package/dist/types/external-domain-metadata.d.ts.map +1 -1
- package/dist/types/extraction.d.ts +64 -94
- package/dist/types/extraction.d.ts.map +1 -1
- package/dist/types/extraction.js +6 -34
- package/dist/types/loading.d.ts +1 -2
- package/dist/types/loading.d.ts.map +1 -1
- package/dist/types/loading.js +0 -1
- package/dist/types/workers.d.ts +39 -94
- package/dist/types/workers.d.ts.map +1 -1
- package/dist/types/workers.js +0 -6
- package/dist/uploader/uploader.d.ts +8 -59
- package/dist/uploader/uploader.d.ts.map +1 -1
- package/dist/uploader/uploader.helpers.d.ts +4 -27
- package/dist/uploader/uploader.helpers.d.ts.map +1 -1
- package/dist/uploader/uploader.helpers.js +64 -30
- package/dist/uploader/uploader.interfaces.d.ts +15 -25
- package/dist/uploader/uploader.interfaces.d.ts.map +1 -1
- package/dist/uploader/uploader.interfaces.js +8 -0
- package/dist/uploader/uploader.js +23 -89
- package/package.json +8 -6
- package/dist/airsync-sdk.d.ts +0 -2059
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +0 -2
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +0 -1
- package/dist/attachments-streaming/attachments-streaming-pool.test.js +0 -540
- package/dist/common/control-protocol.d.ts +0 -10
- package/dist/common/control-protocol.d.ts.map +0 -1
- package/dist/common/errors.d.ts +0 -6
- package/dist/common/errors.d.ts.map +0 -1
- package/dist/common/install-initial-domain-mapping.d.ts.map +0 -1
- package/dist/common/install-initial-domain-mapping.test.d.ts +0 -2
- package/dist/common/install-initial-domain-mapping.test.d.ts.map +0 -1
- package/dist/common/install-initial-domain-mapping.test.js +0 -211
- package/dist/common/test-utils.d.ts +0 -19
- package/dist/common/test-utils.d.ts.map +0 -1
- package/dist/common/time-value-resolver.d.ts +0 -47
- package/dist/common/time-value-resolver.d.ts.map +0 -1
- package/dist/common/time-value-resolver.test.d.ts +0 -2
- package/dist/common/time-value-resolver.test.d.ts.map +0 -1
- package/dist/common/time-value-resolver.test.js +0 -268
- package/dist/http/axios-client-internal.d.ts.map +0 -1
- package/dist/http/axios-client-internal.test.d.ts +0 -2
- package/dist/http/axios-client-internal.test.d.ts.map +0 -1
- package/dist/http/axios-client-internal.test.js +0 -175
- package/dist/http/axios-client.d.ts +0 -27
- package/dist/http/axios-client.d.ts.map +0 -1
- package/dist/http/axios-client.js +0 -60
- package/dist/http/constants.d.ts +0 -4
- package/dist/http/constants.d.ts.map +0 -1
- package/dist/http/constants.js +0 -6
- package/dist/http/index.d.ts +0 -2
- package/dist/http/index.d.ts.map +0 -1
- package/dist/http/index.js +0 -17
- package/dist/logger/logger.constants.d.ts +0 -6
- package/dist/logger/logger.constants.d.ts.map +0 -1
- package/dist/logger/logger.constants.js +0 -13
- package/dist/logger/logger.context.d.ts +0 -58
- package/dist/logger/logger.context.d.ts.map +0 -1
- package/dist/logger/logger.context.js +0 -86
- package/dist/logger/logger.test.d.ts +0 -2
- package/dist/logger/logger.test.d.ts.map +0 -1
- package/dist/logger/logger.test.js +0 -537
- package/dist/mappers/mappers.interface.d.ts +0 -294
- package/dist/mappers/mappers.interface.d.ts.map +0 -1
- package/dist/mappers/mappers.test.d.ts +0 -2
- package/dist/mappers/mappers.test.d.ts.map +0 -1
- package/dist/mappers/mappers.test.js +0 -105
- package/dist/mock-server/mock-server.d.ts +0 -47
- package/dist/mock-server/mock-server.d.ts.map +0 -1
- package/dist/mock-server/mock-server.interfaces.d.ts +0 -73
- package/dist/mock-server/mock-server.interfaces.d.ts.map +0 -1
- package/dist/multithreading/adapters/base-adapter.emit.test.d.ts +0 -2
- package/dist/multithreading/adapters/base-adapter.emit.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/base-adapter.emit.test.js +0 -403
- package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts +0 -2
- package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/extraction-adapter.artifacts.test.js +0 -175
- package/dist/multithreading/adapters/extraction-adapter.test.d.ts +0 -2
- package/dist/multithreading/adapters/extraction-adapter.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/extraction-adapter.test.js +0 -789
- package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts +0 -2
- package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/loading-adapter.helpers.test.js +0 -514
- package/dist/multithreading/adapters/loading-adapter.test.d.ts +0 -2
- package/dist/multithreading/adapters/loading-adapter.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/loading-adapter.test.js +0 -589
- package/dist/multithreading/adapters/serialization.test.d.ts +0 -2
- package/dist/multithreading/adapters/serialization.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/serialization.test.js +0 -71
- package/dist/multithreading/create-worker.test.d.ts +0 -2
- package/dist/multithreading/create-worker.test.d.ts.map +0 -1
- package/dist/multithreading/create-worker.test.js +0 -108
- package/dist/multithreading/process-task.test.d.ts +0 -2
- package/dist/multithreading/process-task.test.d.ts.map +0 -1
- package/dist/multithreading/process-task.test.js +0 -146
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts +0 -2
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +0 -1
- package/dist/multithreading/spawn/spawn.helpers.test.js +0 -293
- package/dist/multithreading/spawn/spawn.test.d.ts +0 -2
- package/dist/multithreading/spawn/spawn.test.d.ts.map +0 -1
- package/dist/multithreading/spawn/spawn.test.js +0 -232
- package/dist/repo/repo.test.d.ts +0 -2
- package/dist/repo/repo.test.d.ts.map +0 -1
- package/dist/repo/repo.test.js +0 -184
- package/dist/state/state.extract-window.test.d.ts +0 -2
- package/dist/state/state.extract-window.test.d.ts.map +0 -1
- package/dist/state/state.extract-window.test.js +0 -163
- package/dist/state/state.pending-boundaries.test.d.ts +0 -2
- package/dist/state/state.pending-boundaries.test.d.ts.map +0 -1
- package/dist/state/state.pending-boundaries.test.js +0 -189
- package/dist/state/state.post-state.test.d.ts +0 -2
- package/dist/state/state.post-state.test.d.ts.map +0 -1
- package/dist/state/state.post-state.test.js +0 -78
- package/dist/state/state.test.d.ts +0 -2
- package/dist/state/state.test.d.ts.map +0 -1
- package/dist/state/state.test.js +0 -271
- package/dist/state/state.time-value-resolution.test.d.ts +0 -2
- package/dist/state/state.time-value-resolution.test.d.ts.map +0 -1
- package/dist/state/state.time-value-resolution.test.js +0 -175
- package/dist/tsdoc-metadata.json +0 -11
- package/dist/types/extraction.test.d.ts +0 -2
- package/dist/types/extraction.test.d.ts.map +0 -1
- package/dist/types/extraction.test.js +0 -96
- package/dist/types/index.d.ts +0 -10
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -21
- package/dist/uploader/uploader.helpers.test.d.ts +0 -2
- package/dist/uploader/uploader.helpers.test.d.ts.map +0 -1
- package/dist/uploader/uploader.helpers.test.js +0 -256
- package/dist/uploader/uploader.test.d.ts +0 -2
- package/dist/uploader/uploader.test.d.ts.map +0 -1
- package/dist/uploader/uploader.test.js +0 -601
- /package/dist/{mock-server → testing}/mock-server.interfaces.js +0 -0
- /package/dist/{common → types}/errors.js +0 -0
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const jest_setup_1 = require("../tests/jest.setup");
|
|
4
|
-
const test_utils_1 = require("../common/test-utils");
|
|
5
|
-
const extraction_1 = require("../types/extraction");
|
|
6
|
-
const extraction_state_1 = require("./extraction-state");
|
|
7
|
-
describe('State — TimeValue resolution', () => {
|
|
8
|
-
let fetchStateSpy;
|
|
9
|
-
let processExitSpy;
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
jest.clearAllMocks();
|
|
12
|
-
jest.restoreAllMocks();
|
|
13
|
-
fetchStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'fetchState');
|
|
14
|
-
processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
|
|
15
|
-
throw new Error('process.exit called');
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
describe('Enhanced Control Protocol - TimeValue resolution failures', () => {
|
|
19
|
-
it('should exit the process if extraction_start_time resolution fails', async () => {
|
|
20
|
-
// Arrange: WORKERS_NEWEST type but state has no workersNewest
|
|
21
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
22
|
-
payload: {
|
|
23
|
-
event_type: extraction_1.EventType.StartExtractingMetadata,
|
|
24
|
-
event_context: {
|
|
25
|
-
extraction_start_time: {
|
|
26
|
-
type: extraction_1.TimeValueType.WORKERS_NEWEST,
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
});
|
|
31
|
-
const stringifiedState = JSON.stringify({
|
|
32
|
-
snapInVersionId: 'test_snap_in_version_id',
|
|
33
|
-
workers_oldest: '',
|
|
34
|
-
workers_newest: '',
|
|
35
|
-
});
|
|
36
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
37
|
-
// Act & Assert
|
|
38
|
-
await expect((0, extraction_state_1.createExtractionState)({
|
|
39
|
-
event,
|
|
40
|
-
initialState: {},
|
|
41
|
-
initialDomainMapping: {},
|
|
42
|
-
})).rejects.toThrow('process.exit called');
|
|
43
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
44
|
-
});
|
|
45
|
-
it('should exit the process if extraction_end_time resolution fails', async () => {
|
|
46
|
-
// Arrange: WORKERS_NEWEST type but state has no workersNewest
|
|
47
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
48
|
-
payload: {
|
|
49
|
-
event_type: extraction_1.EventType.StartExtractingMetadata,
|
|
50
|
-
event_context: {
|
|
51
|
-
extraction_start_time: {
|
|
52
|
-
type: extraction_1.TimeValueType.UNBOUNDED,
|
|
53
|
-
},
|
|
54
|
-
extraction_end_time: {
|
|
55
|
-
type: extraction_1.TimeValueType.WORKERS_NEWEST,
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
const stringifiedState = JSON.stringify({
|
|
61
|
-
snapInVersionId: 'test_snap_in_version_id',
|
|
62
|
-
workers_oldest: '',
|
|
63
|
-
workers_newest: '',
|
|
64
|
-
});
|
|
65
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
66
|
-
// Act & Assert
|
|
67
|
-
await expect((0, extraction_state_1.createExtractionState)({
|
|
68
|
-
event,
|
|
69
|
-
initialState: {},
|
|
70
|
-
initialDomainMapping: {},
|
|
71
|
-
})).rejects.toThrow('process.exit called');
|
|
72
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
describe('Backwards compatibility - missing TimeValue type', () => {
|
|
76
|
-
it('should skip resolution when extraction_start_time has no type', async () => {
|
|
77
|
-
// Arrange: platform sends extraction_start_time without a type field (old platform version)
|
|
78
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
79
|
-
context: {
|
|
80
|
-
snap_in_version_id: 'test_snap_in_version_id',
|
|
81
|
-
},
|
|
82
|
-
payload: {
|
|
83
|
-
event_type: extraction_1.EventType.StartExtractingMetadata,
|
|
84
|
-
event_context: {
|
|
85
|
-
extraction_start_time: {},
|
|
86
|
-
extraction_end_time: {
|
|
87
|
-
type: extraction_1.TimeValueType.ABSOLUTE_TIME,
|
|
88
|
-
value: '2025-06-01T00:00:00Z',
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
const stringifiedState = JSON.stringify({
|
|
94
|
-
snapInVersionId: 'test_snap_in_version_id',
|
|
95
|
-
});
|
|
96
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
97
|
-
// Act
|
|
98
|
-
const state = await (0, extraction_state_1.createExtractionState)({
|
|
99
|
-
event,
|
|
100
|
-
initialState: {},
|
|
101
|
-
initialDomainMapping: {},
|
|
102
|
-
});
|
|
103
|
-
// Assert: should not crash, extract_from is not set, extract_to is resolved
|
|
104
|
-
expect(processExitSpy).not.toHaveBeenCalled();
|
|
105
|
-
expect(event.payload.event_context.extract_from).toBeUndefined();
|
|
106
|
-
expect(event.payload.event_context.extract_to).toBe('2025-06-01T00:00:00.000Z');
|
|
107
|
-
expect(state.sdkState.pendingWorkersNewest).toBe('2025-06-01T00:00:00.000Z');
|
|
108
|
-
});
|
|
109
|
-
it('should skip resolution when extraction_end_time has no type', async () => {
|
|
110
|
-
// Arrange: platform sends extraction_end_time without a type field
|
|
111
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
112
|
-
context: {
|
|
113
|
-
snap_in_version_id: 'test_snap_in_version_id',
|
|
114
|
-
},
|
|
115
|
-
payload: {
|
|
116
|
-
event_type: extraction_1.EventType.StartExtractingMetadata,
|
|
117
|
-
event_context: {
|
|
118
|
-
extraction_start_time: {
|
|
119
|
-
type: extraction_1.TimeValueType.ABSOLUTE_TIME,
|
|
120
|
-
value: '2024-01-01T00:00:00Z',
|
|
121
|
-
},
|
|
122
|
-
extraction_end_time: {},
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
});
|
|
126
|
-
const stringifiedState = JSON.stringify({
|
|
127
|
-
snapInVersionId: 'test_snap_in_version_id',
|
|
128
|
-
});
|
|
129
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
130
|
-
// Act
|
|
131
|
-
await (0, extraction_state_1.createExtractionState)({
|
|
132
|
-
event,
|
|
133
|
-
initialState: {},
|
|
134
|
-
initialDomainMapping: {},
|
|
135
|
-
});
|
|
136
|
-
// Assert: should not crash, extract_to is not set, extract_from is resolved
|
|
137
|
-
expect(processExitSpy).not.toHaveBeenCalled();
|
|
138
|
-
expect(event.payload.event_context.extract_from).toBe('2024-01-01T00:00:00.000Z');
|
|
139
|
-
expect(event.payload.event_context.extract_to).toBeUndefined();
|
|
140
|
-
});
|
|
141
|
-
it('should skip resolution when both extraction times have no type', async () => {
|
|
142
|
-
// Arrange: platform sends both time values without type fields
|
|
143
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
144
|
-
context: {
|
|
145
|
-
snap_in_version_id: 'test_snap_in_version_id',
|
|
146
|
-
},
|
|
147
|
-
payload: {
|
|
148
|
-
event_type: extraction_1.EventType.StartExtractingMetadata,
|
|
149
|
-
event_context: {
|
|
150
|
-
extraction_start_time: {
|
|
151
|
-
value: 'some-value',
|
|
152
|
-
},
|
|
153
|
-
extraction_end_time: {
|
|
154
|
-
value: 'some-value',
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
|
-
const stringifiedState = JSON.stringify({
|
|
160
|
-
snapInVersionId: 'test_snap_in_version_id',
|
|
161
|
-
});
|
|
162
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
163
|
-
// Act
|
|
164
|
-
await (0, extraction_state_1.createExtractionState)({
|
|
165
|
-
event,
|
|
166
|
-
initialState: {},
|
|
167
|
-
initialDomainMapping: {},
|
|
168
|
-
});
|
|
169
|
-
// Assert: should not crash, neither extraction time is resolved
|
|
170
|
-
expect(processExitSpy).not.toHaveBeenCalled();
|
|
171
|
-
expect(event.payload.event_context.extract_from).toBeUndefined();
|
|
172
|
-
expect(event.payload.event_context.extract_to).toBeUndefined();
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
});
|
package/dist/tsdoc-metadata.json
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
|
|
2
|
-
// It should be published with your NPM package. It should not be tracked by Git.
|
|
3
|
-
{
|
|
4
|
-
"tsdocVersion": "0.12",
|
|
5
|
-
"toolPackages": [
|
|
6
|
-
{
|
|
7
|
-
"packageName": "@microsoft/api-extractor",
|
|
8
|
-
"packageVersion": "7.58.7"
|
|
9
|
-
}
|
|
10
|
-
]
|
|
11
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extraction.test.d.ts","sourceRoot":"","sources":["../../src/types/extraction.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const test_utils_1 = require("../common/test-utils");
|
|
4
|
-
const jest_setup_1 = require("../tests/jest.setup");
|
|
5
|
-
const extraction_1 = require("./extraction");
|
|
6
|
-
describe('ExtractionTypes', () => {
|
|
7
|
-
it('should create event context with all optional fields', () => {
|
|
8
|
-
// Arrange & Act
|
|
9
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
10
|
-
payload: {
|
|
11
|
-
event_type: extraction_1.EventType.StartExtractingData,
|
|
12
|
-
event_context: {
|
|
13
|
-
extract_from: '2024-01-01T00:00:00Z',
|
|
14
|
-
extract_to: '2024-06-01T00:00:00Z',
|
|
15
|
-
initial_sync_scope: extraction_1.InitialSyncScope.TIME_SCOPED,
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
// Assert
|
|
20
|
-
expect(event.payload.event_context.extract_from).toBe('2024-01-01T00:00:00Z');
|
|
21
|
-
expect(event.payload.event_context.extract_to).toBe('2024-06-01T00:00:00Z');
|
|
22
|
-
expect(event.payload.event_context.initial_sync_scope).toBe(extraction_1.InitialSyncScope.TIME_SCOPED);
|
|
23
|
-
});
|
|
24
|
-
it('should create event context with partial optional fields', () => {
|
|
25
|
-
// Arrange & Act
|
|
26
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
27
|
-
payload: {
|
|
28
|
-
event_type: extraction_1.EventType.StartExtractingData,
|
|
29
|
-
event_context: {
|
|
30
|
-
extract_from: '2024-01-01T00:00:00Z',
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
});
|
|
34
|
-
// Assert
|
|
35
|
-
expect(event.payload.event_context.extract_from).toBe('2024-01-01T00:00:00Z');
|
|
36
|
-
});
|
|
37
|
-
it('should handle different InitialSyncScope values', () => {
|
|
38
|
-
// Arrange & Act
|
|
39
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
40
|
-
payload: {
|
|
41
|
-
event_type: extraction_1.EventType.StartExtractingData,
|
|
42
|
-
event_context: {
|
|
43
|
-
initial_sync_scope: extraction_1.InitialSyncScope.FULL_HISTORY,
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
// Assert
|
|
48
|
-
expect(event.payload.event_context.initial_sync_scope).toBe(extraction_1.InitialSyncScope.FULL_HISTORY);
|
|
49
|
-
});
|
|
50
|
-
it('[edge] should handle null event context gracefully', () => {
|
|
51
|
-
// Arrange
|
|
52
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
53
|
-
payload: { event_type: extraction_1.EventType.StartExtractingData },
|
|
54
|
-
});
|
|
55
|
-
// Act
|
|
56
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
57
|
-
event.payload.event_context = null;
|
|
58
|
-
// Assert
|
|
59
|
-
expect(event.payload.event_context).toBeNull();
|
|
60
|
-
});
|
|
61
|
-
it('[edge] should handle undefined optional fields', () => {
|
|
62
|
-
// Arrange & Act
|
|
63
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
64
|
-
payload: {
|
|
65
|
-
event_type: extraction_1.EventType.StartExtractingData,
|
|
66
|
-
event_context: {
|
|
67
|
-
extract_from: undefined,
|
|
68
|
-
extract_to: undefined,
|
|
69
|
-
initial_sync_scope: undefined,
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
// Assert
|
|
74
|
-
expect(event.payload.event_context.extract_from).toBeUndefined();
|
|
75
|
-
expect(event.payload.event_context.extract_to).toBeUndefined();
|
|
76
|
-
expect(event.payload.event_context.initial_sync_scope).toBeUndefined();
|
|
77
|
-
});
|
|
78
|
-
describe('TimeValueType enum', () => {
|
|
79
|
-
it('should have all expected values', () => {
|
|
80
|
-
// Assert
|
|
81
|
-
expect(extraction_1.TimeValueType.WORKERS_OLDEST).toBe('workers_oldest');
|
|
82
|
-
expect(extraction_1.TimeValueType.WORKERS_OLDEST_MINUS_WINDOW).toBe('workers_oldest_minus_window');
|
|
83
|
-
expect(extraction_1.TimeValueType.WORKERS_NEWEST).toBe('workers_newest');
|
|
84
|
-
expect(extraction_1.TimeValueType.WORKERS_NEWEST_PLUS_WINDOW).toBe('workers_newest_plus_window');
|
|
85
|
-
expect(extraction_1.TimeValueType.CURRENT_TIME).toBe('current_time');
|
|
86
|
-
expect(extraction_1.TimeValueType.ABSOLUTE_TIME).toBe('absolute_time');
|
|
87
|
-
expect(extraction_1.TimeValueType.UNBOUNDED).toBe('unbounded');
|
|
88
|
-
});
|
|
89
|
-
it('should have exactly seven values', () => {
|
|
90
|
-
// Act
|
|
91
|
-
const values = Object.values(extraction_1.TimeValueType);
|
|
92
|
-
// Assert
|
|
93
|
-
expect(values.length).toBe(7);
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
});
|
package/dist/types/index.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export { ErrorRecord, InitialDomainMapping, SyncMode } from './common';
|
|
2
|
-
export { AirSyncEvent, AirSyncMessage, ConnectionData, EventContext, EventData, EventType, ExternalProcessAttachmentFunction, ExternalSyncUnit, ExternalSystemAttachmentIteratorFunction, ExternalSystemAttachmentReducerFunction, ExternalSystemAttachmentStreamingFunction, ExternalSystemAttachmentStreamingParams, ExternalSystemAttachmentStreamingResponse, ExtractorEvent, ExtractorEventType, InitialSyncScope, ProcessAttachmentReturnType, TimeUnit, TimeValue, TimeValueType, } from './extraction';
|
|
3
|
-
export { ExternalSystemAttachment, ExternalSystemItem, ExternalSystemItemLoadingParams, ExternalSystemItemLoadingResponse, LoaderEventType, } from './loading';
|
|
4
|
-
export { NormalizedAttachment, NormalizedItem, RepoInterface, } from '../repo/repo.interfaces';
|
|
5
|
-
export { UNBOUNDED_DATE_TIME_VALUE } from '../common/constants';
|
|
6
|
-
export { Artifact, ArtifactsPrepareResponse, SsorAttachment, StreamAttachmentsResponse, StreamResponse, UploadResponse, } from '../uploader/uploader.interfaces';
|
|
7
|
-
export type { MappersCreateParams, MappersGetByExternalIdParams, MappersGetByTargetIdParams, MappersUpdateParams, } from '../mappers/mappers.interface';
|
|
8
|
-
export { SyncMapperRecordStatus, SyncMapperRecordTargetType, } from '../mappers/mappers.interface';
|
|
9
|
-
export type { CollectionData, ConditionalPrivilegeData, CustomLinkData, CustomLinkNames, CustomStage, CustomState, EnumData, EnumValue, EnumValueKey, ExternalDomainMetadata, Field, FieldCondition, FieldConditionComparator, FieldConditionEffect, FieldConditions, FieldKey, FieldPrivilegeData, FieldReferenceData, FieldType, FloatData, IntData, PermissionData, RecordType, RecordTypeCategory, RecordTypeCategoryKey, RecordTypeKey, RecordTypePrivilegeData, RecordTypeScope, ReferenceData, ReferenceDetail, ReferenceType, SchemaVersion, StageKey, StageDiagram, StateKey, StructData, StructTypeKey, StructType, TargetTypeKeyData, TextData, TypedReferenceData, } from './external-domain-metadata';
|
|
10
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGvE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,iCAAiC,EACjC,gBAAgB,EAChB,wCAAwC,EACxC,uCAAuC,EACvC,yCAAyC,EACzC,uCAAuC,EACvC,yCAAyC,EACzC,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,QAAQ,EACR,SAAS,EACT,aAAa,GACd,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,+BAA+B,EAC/B,iCAAiC,EACjC,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,GACd,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EACL,QAAQ,EACR,wBAAwB,EACxB,cAAc,EACd,yBAAyB,EACzB,cAAc,EACd,cAAc,GACf,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EACV,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,WAAW,EACX,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,KAAK,EACL,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,OAAO,EACP,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,kBAAkB,GACnB,MAAM,4BAA4B,CAAC"}
|
package/dist/types/index.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SyncMapperRecordTargetType = exports.SyncMapperRecordStatus = exports.UNBOUNDED_DATE_TIME_VALUE = exports.LoaderEventType = exports.TimeValueType = exports.TimeUnit = exports.InitialSyncScope = exports.ExtractorEventType = exports.EventType = exports.SyncMode = void 0;
|
|
4
|
-
// Common
|
|
5
|
-
var common_1 = require("./common");
|
|
6
|
-
Object.defineProperty(exports, "SyncMode", { enumerable: true, get: function () { return common_1.SyncMode; } });
|
|
7
|
-
// Extraction
|
|
8
|
-
var extraction_1 = require("./extraction");
|
|
9
|
-
Object.defineProperty(exports, "EventType", { enumerable: true, get: function () { return extraction_1.EventType; } });
|
|
10
|
-
Object.defineProperty(exports, "ExtractorEventType", { enumerable: true, get: function () { return extraction_1.ExtractorEventType; } });
|
|
11
|
-
Object.defineProperty(exports, "InitialSyncScope", { enumerable: true, get: function () { return extraction_1.InitialSyncScope; } });
|
|
12
|
-
Object.defineProperty(exports, "TimeUnit", { enumerable: true, get: function () { return extraction_1.TimeUnit; } });
|
|
13
|
-
Object.defineProperty(exports, "TimeValueType", { enumerable: true, get: function () { return extraction_1.TimeValueType; } });
|
|
14
|
-
// Loading
|
|
15
|
-
var loading_1 = require("./loading");
|
|
16
|
-
Object.defineProperty(exports, "LoaderEventType", { enumerable: true, get: function () { return loading_1.LoaderEventType; } });
|
|
17
|
-
var constants_1 = require("../common/constants");
|
|
18
|
-
Object.defineProperty(exports, "UNBOUNDED_DATE_TIME_VALUE", { enumerable: true, get: function () { return constants_1.UNBOUNDED_DATE_TIME_VALUE; } });
|
|
19
|
-
var mappers_interface_1 = require("../mappers/mappers.interface");
|
|
20
|
-
Object.defineProperty(exports, "SyncMapperRecordStatus", { enumerable: true, get: function () { return mappers_interface_1.SyncMapperRecordStatus; } });
|
|
21
|
-
Object.defineProperty(exports, "SyncMapperRecordTargetType", { enumerable: true, get: function () { return mappers_interface_1.SyncMapperRecordTargetType; } });
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.helpers.test.d.ts","sourceRoot":"","sources":["../../src/uploader/uploader.helpers.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,256 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const fs_1 = __importDefault(require("fs"));
|
|
7
|
-
const fs_2 = require("fs");
|
|
8
|
-
const js_jsonl_1 = require("js-jsonl");
|
|
9
|
-
const zlib_1 = __importDefault(require("zlib"));
|
|
10
|
-
const constants_1 = require("../common/constants");
|
|
11
|
-
const uploader_helpers_1 = require("./uploader.helpers");
|
|
12
|
-
describe('uploader.helpers', () => {
|
|
13
|
-
afterEach(() => {
|
|
14
|
-
jest.clearAllMocks();
|
|
15
|
-
});
|
|
16
|
-
describe(uploader_helpers_1.compressGzip.name, () => {
|
|
17
|
-
it('should compress a string to gzip buffer', () => {
|
|
18
|
-
// Arrange
|
|
19
|
-
const input = '{"id":1}\n{"id":2}';
|
|
20
|
-
// Act
|
|
21
|
-
const result = (0, uploader_helpers_1.compressGzip)(input);
|
|
22
|
-
// Assert
|
|
23
|
-
expect(result.response).toBeInstanceOf(Buffer);
|
|
24
|
-
const decompressed = zlib_1.default
|
|
25
|
-
.gunzipSync(result.response)
|
|
26
|
-
.toString();
|
|
27
|
-
expect(decompressed).toBe(input);
|
|
28
|
-
});
|
|
29
|
-
it('[edge] should return undefined and log error when compression fails', () => {
|
|
30
|
-
// Arrange
|
|
31
|
-
const gzipSyncSpy = jest
|
|
32
|
-
.spyOn(zlib_1.default, 'gzipSync')
|
|
33
|
-
.mockImplementationOnce(() => {
|
|
34
|
-
throw new Error('Compression failed');
|
|
35
|
-
});
|
|
36
|
-
// Act
|
|
37
|
-
const result = (0, uploader_helpers_1.compressGzip)('test data');
|
|
38
|
-
// Assert
|
|
39
|
-
expect(result.response).toBeUndefined();
|
|
40
|
-
gzipSyncSpy.mockRestore();
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
describe(uploader_helpers_1.decompressGzip.name, () => {
|
|
44
|
-
it('should decompress a gzip buffer to string', () => {
|
|
45
|
-
// Arrange
|
|
46
|
-
const originalString = '{"id":1}\n{"id":2}';
|
|
47
|
-
const compressed = zlib_1.default.gzipSync(originalString);
|
|
48
|
-
// Act
|
|
49
|
-
const result = (0, uploader_helpers_1.decompressGzip)(compressed);
|
|
50
|
-
// Assert
|
|
51
|
-
expect(result.response).toBe(originalString);
|
|
52
|
-
});
|
|
53
|
-
it('[edge] should return undefined and log error when decompression fails', () => {
|
|
54
|
-
// Arrange
|
|
55
|
-
const invalidGzip = Buffer.from('not valid gzip data');
|
|
56
|
-
// Act
|
|
57
|
-
const result = (0, uploader_helpers_1.decompressGzip)(invalidGzip);
|
|
58
|
-
// Assert
|
|
59
|
-
expect(result.response).toBeUndefined();
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
describe(uploader_helpers_1.parseJsonl.name, () => {
|
|
63
|
-
it('should parse valid JSONL string to array of objects', () => {
|
|
64
|
-
// Arrange
|
|
65
|
-
const data = [
|
|
66
|
-
{ id: 1, name: 'Item 1' },
|
|
67
|
-
{ id: 2, name: 'Item 2' },
|
|
68
|
-
];
|
|
69
|
-
const jsonlString = js_jsonl_1.jsonl.stringify(data);
|
|
70
|
-
// Act
|
|
71
|
-
const result = (0, uploader_helpers_1.parseJsonl)(jsonlString);
|
|
72
|
-
// Assert
|
|
73
|
-
expect(result.response).toEqual(data);
|
|
74
|
-
});
|
|
75
|
-
it('[edge] should return null and log error when parsing fails', () => {
|
|
76
|
-
// Arrange
|
|
77
|
-
const invalidJsonl = 'not valid jsonl {{{';
|
|
78
|
-
// Act
|
|
79
|
-
const result = (0, uploader_helpers_1.parseJsonl)(invalidJsonl);
|
|
80
|
-
// Assert
|
|
81
|
-
expect(result.response).toBeUndefined();
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
describe(uploader_helpers_1.downloadToLocal.name, () => {
|
|
85
|
-
const mockExistsSync = jest.spyOn(fs_1.default, 'existsSync');
|
|
86
|
-
const mockMkdirSync = jest.spyOn(fs_1.default, 'mkdirSync');
|
|
87
|
-
afterEach(() => {
|
|
88
|
-
mockExistsSync.mockReset();
|
|
89
|
-
mockMkdirSync.mockReset();
|
|
90
|
-
});
|
|
91
|
-
it('should create extracted_files directory if it does not exist', async () => {
|
|
92
|
-
// Arrange
|
|
93
|
-
const itemType = 'tasks';
|
|
94
|
-
const fetchedObjects = [{ id: 1 }];
|
|
95
|
-
mockExistsSync.mockReturnValueOnce(false);
|
|
96
|
-
mockMkdirSync.mockImplementationOnce(() => undefined);
|
|
97
|
-
const mockFileHandle = {
|
|
98
|
-
write: jest.fn().mockResolvedValue(undefined),
|
|
99
|
-
close: jest.fn().mockResolvedValue(undefined),
|
|
100
|
-
};
|
|
101
|
-
const fsPromisesOpenSpy = jest
|
|
102
|
-
.spyOn(fs_2.promises, 'open')
|
|
103
|
-
.mockResolvedValueOnce(mockFileHandle);
|
|
104
|
-
// Act
|
|
105
|
-
await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects);
|
|
106
|
-
// Assert
|
|
107
|
-
expect(mockExistsSync).toHaveBeenCalledWith('extracted_files');
|
|
108
|
-
expect(mockMkdirSync).toHaveBeenCalledWith('extracted_files');
|
|
109
|
-
fsPromisesOpenSpy.mockRestore();
|
|
110
|
-
});
|
|
111
|
-
it('should write objects as JSONL lines to file', async () => {
|
|
112
|
-
// Arrange
|
|
113
|
-
const itemType = 'tasks';
|
|
114
|
-
const fetchedObjects = [{ id: 1 }, { id: 2 }];
|
|
115
|
-
mockExistsSync.mockReturnValueOnce(true);
|
|
116
|
-
const mockFileHandle = {
|
|
117
|
-
write: jest.fn().mockResolvedValue(undefined),
|
|
118
|
-
close: jest.fn().mockResolvedValue(undefined),
|
|
119
|
-
};
|
|
120
|
-
const fsPromisesOpenSpy = jest
|
|
121
|
-
.spyOn(fs_2.promises, 'open')
|
|
122
|
-
.mockResolvedValueOnce(mockFileHandle);
|
|
123
|
-
// Act
|
|
124
|
-
await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects);
|
|
125
|
-
// Assert
|
|
126
|
-
expect(mockFileHandle.write).toHaveBeenCalledTimes(2);
|
|
127
|
-
expect(mockFileHandle.write).toHaveBeenCalledWith('{"id":1}\n');
|
|
128
|
-
expect(mockFileHandle.write).toHaveBeenCalledWith('{"id":2}\n');
|
|
129
|
-
expect(mockFileHandle.close).toHaveBeenCalled();
|
|
130
|
-
fsPromisesOpenSpy.mockRestore();
|
|
131
|
-
});
|
|
132
|
-
it('should handle single object (non-array) input', async () => {
|
|
133
|
-
// Arrange
|
|
134
|
-
const itemType = 'metadata';
|
|
135
|
-
const fetchedObject = { key: 'value' };
|
|
136
|
-
mockExistsSync.mockReturnValueOnce(true);
|
|
137
|
-
const mockFileHandle = {
|
|
138
|
-
write: jest.fn().mockResolvedValue(undefined),
|
|
139
|
-
close: jest.fn().mockResolvedValue(undefined),
|
|
140
|
-
};
|
|
141
|
-
const fsPromisesOpenSpy = jest
|
|
142
|
-
.spyOn(fs_2.promises, 'open')
|
|
143
|
-
.mockResolvedValueOnce(mockFileHandle);
|
|
144
|
-
// Act
|
|
145
|
-
await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObject);
|
|
146
|
-
// Assert
|
|
147
|
-
expect(mockFileHandle.write).toHaveBeenCalledTimes(1);
|
|
148
|
-
expect(mockFileHandle.write).toHaveBeenCalledWith('{"key":"value"}\n');
|
|
149
|
-
fsPromisesOpenSpy.mockRestore();
|
|
150
|
-
});
|
|
151
|
-
it('should use .json extension when itemType is external_domain_metadata', async () => {
|
|
152
|
-
// Arrange
|
|
153
|
-
const itemType = 'external_domain_metadata';
|
|
154
|
-
const fetchedObject = { domain: 'example.com' };
|
|
155
|
-
mockExistsSync.mockReturnValueOnce(true);
|
|
156
|
-
const mockFileHandle = {
|
|
157
|
-
write: jest.fn().mockResolvedValue(undefined),
|
|
158
|
-
close: jest.fn().mockResolvedValue(undefined),
|
|
159
|
-
};
|
|
160
|
-
const fsPromisesOpenSpy = jest
|
|
161
|
-
.spyOn(fs_2.promises, 'open')
|
|
162
|
-
.mockResolvedValueOnce(mockFileHandle);
|
|
163
|
-
// Act
|
|
164
|
-
await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObject);
|
|
165
|
-
// Assert
|
|
166
|
-
expect(fsPromisesOpenSpy).toHaveBeenCalledWith(expect.stringMatching(/extractor_external_domain_metadata_\d+\.json$/), 'w');
|
|
167
|
-
fsPromisesOpenSpy.mockRestore();
|
|
168
|
-
});
|
|
169
|
-
it('[edge] should reject and log error when file operations fail', async () => {
|
|
170
|
-
// Arrange
|
|
171
|
-
const itemType = 'tasks';
|
|
172
|
-
const fetchedObjects = [{ id: 1 }];
|
|
173
|
-
const fileError = new Error('File write failed');
|
|
174
|
-
mockExistsSync.mockReturnValueOnce(true);
|
|
175
|
-
const fsPromisesOpenSpy = jest
|
|
176
|
-
.spyOn(fs_2.promises, 'open')
|
|
177
|
-
.mockRejectedValueOnce(fileError);
|
|
178
|
-
// Act & Assert
|
|
179
|
-
await expect((0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects)).rejects.toThrow(fileError);
|
|
180
|
-
fsPromisesOpenSpy.mockRestore();
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
describe(uploader_helpers_1.truncateFilename.name, () => {
|
|
184
|
-
it('should return filename unchanged when within the limit', () => {
|
|
185
|
-
// Arrange
|
|
186
|
-
const filename = 'short-filename.txt';
|
|
187
|
-
// Act
|
|
188
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
189
|
-
// Assert
|
|
190
|
-
expect(result).toBe(filename);
|
|
191
|
-
});
|
|
192
|
-
it('should return filename unchanged when exactly at the limit', () => {
|
|
193
|
-
// Arrange
|
|
194
|
-
const filename = 'a'.repeat(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
195
|
-
// Act
|
|
196
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
197
|
-
// Assert
|
|
198
|
-
expect(result).toBe(filename);
|
|
199
|
-
expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
200
|
-
});
|
|
201
|
-
it('should truncate filename and preserve extension when exceeding the limit', () => {
|
|
202
|
-
// Arrange
|
|
203
|
-
const longName = 'a'.repeat(300);
|
|
204
|
-
const extension = '.txt';
|
|
205
|
-
const filename = longName + extension;
|
|
206
|
-
// Act
|
|
207
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
208
|
-
// Assert
|
|
209
|
-
expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
210
|
-
expect(result).toContain('...');
|
|
211
|
-
expect(result.endsWith(extension)).toBe(true);
|
|
212
|
-
});
|
|
213
|
-
it('should preserve the last MAX_DEVREV_FILENAME_EXTENSION_LENGTH characters as extension', () => {
|
|
214
|
-
// Arrange
|
|
215
|
-
const longName = 'document-'.repeat(50);
|
|
216
|
-
const extension = '.verylongextension';
|
|
217
|
-
const filename = longName + extension;
|
|
218
|
-
// Act
|
|
219
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
220
|
-
// Assert
|
|
221
|
-
expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
222
|
-
const expectedExtension = filename.slice(-constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH);
|
|
223
|
-
expect(result.endsWith(expectedExtension)).toBe(true);
|
|
224
|
-
});
|
|
225
|
-
it('should correctly format the truncated filename with ellipsis', () => {
|
|
226
|
-
// Arrange
|
|
227
|
-
const filename = 'x'.repeat(300) + '.pdf';
|
|
228
|
-
// Act
|
|
229
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
230
|
-
// Assert
|
|
231
|
-
const availableNameLength = constants_1.MAX_DEVREV_FILENAME_LENGTH - constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH - 3;
|
|
232
|
-
const expectedPrefix = 'x'.repeat(availableNameLength);
|
|
233
|
-
const expectedExtension = filename.slice(-constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH);
|
|
234
|
-
expect(result).toBe(`${expectedPrefix}...${expectedExtension}`);
|
|
235
|
-
});
|
|
236
|
-
it('[edge] should handle filename with no extension', () => {
|
|
237
|
-
// Arrange
|
|
238
|
-
const filename = 'a'.repeat(300);
|
|
239
|
-
// Act
|
|
240
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
241
|
-
// Assert
|
|
242
|
-
expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
243
|
-
expect(result).toContain('...');
|
|
244
|
-
// Last 20 chars are preserved as "extension"
|
|
245
|
-
expect(result.endsWith('a'.repeat(constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH))).toBe(true);
|
|
246
|
-
});
|
|
247
|
-
it('[edge] should handle filename that is just one character over the limit', () => {
|
|
248
|
-
// Arrange
|
|
249
|
-
const filename = 'a'.repeat(constants_1.MAX_DEVREV_FILENAME_LENGTH + 1);
|
|
250
|
-
// Act
|
|
251
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
252
|
-
// Assert
|
|
253
|
-
expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.test.d.ts","sourceRoot":"","sources":["../../src/uploader/uploader.test.ts"],"names":[],"mappings":""}
|