@devrev/airsync-sdk 2.0.0-beta.1 → 2.0.0-beta.10
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/README.md +7 -21
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts +6 -7
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +4 -3
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.js +69 -61
- package/dist/common/constants.d.ts +15 -12
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/common/constants.js +20 -34
- package/dist/common/helpers.d.ts +3 -27
- package/dist/common/helpers.d.ts.map +1 -1
- package/dist/common/helpers.js +6 -36
- 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} +7 -4
- package/dist/http/errors.d.ts +8 -0
- package/dist/http/errors.d.ts.map +1 -0
- package/dist/http/errors.js +31 -0
- package/dist/index.d.ts +30 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -28
- package/dist/logger/logger.d.ts +13 -70
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.interfaces.d.ts +4 -7
- package/dist/logger/logger.interfaces.d.ts.map +1 -1
- package/dist/logger/logger.js +67 -92
- package/dist/mappers/mappers.d.ts +10 -43
- package/dist/mappers/mappers.d.ts.map +1 -1
- package/dist/mappers/mappers.interfaces.d.ts +173 -0
- package/dist/mappers/mappers.interfaces.d.ts.map +1 -0
- package/dist/mappers/{mappers.interface.js → mappers.interfaces.js} +1 -10
- package/dist/mappers/mappers.js +32 -46
- package/dist/multithreading/adapters/base-adapter.d.ts +39 -0
- package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -0
- package/dist/multithreading/adapters/base-adapter.js +212 -0
- package/dist/multithreading/adapters/extraction-adapter.d.ts +49 -0
- package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -0
- package/dist/multithreading/adapters/extraction-adapter.js +375 -0
- package/dist/multithreading/adapters/loading-adapter.d.ts +26 -0
- package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -0
- package/dist/multithreading/adapters/loading-adapter.helpers.d.ts +12 -0
- package/dist/multithreading/adapters/loading-adapter.helpers.d.ts.map +1 -0
- package/dist/multithreading/{worker-adapter/worker-adapter.helpers.js → adapters/loading-adapter.helpers.js} +2 -12
- package/dist/multithreading/adapters/loading-adapter.js +279 -0
- package/dist/multithreading/emit.d.ts +11 -0
- package/dist/multithreading/emit.d.ts.map +1 -0
- package/dist/multithreading/emit.js +25 -0
- package/dist/multithreading/process-task.d.ts +6 -1
- package/dist/multithreading/process-task.d.ts.map +1 -1
- package/dist/multithreading/process-task.js +120 -82
- package/dist/multithreading/spawn/spawn.d.ts +10 -11
- 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 +142 -77
- package/dist/multithreading/spawn/spawn.js +59 -75
- package/dist/multithreading/worker.js +16 -5
- package/dist/repo/repo.d.ts +14 -5
- 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 +11 -20
- package/dist/repo/repo.interfaces.d.ts.map +1 -1
- package/dist/repo/repo.js +36 -22
- package/dist/state/base-state.d.ts +58 -0
- package/dist/state/base-state.d.ts.map +1 -0
- package/dist/state/base-state.js +242 -0
- package/dist/state/extraction-state.d.ts +14 -0
- package/dist/state/extraction-state.d.ts.map +1 -0
- package/dist/state/extraction-state.js +140 -0
- package/dist/state/install-initial-domain-mapping.d.ts +4 -0
- 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 +8 -0
- package/dist/state/loading-state.d.ts.map +1 -0
- package/dist/state/loading-state.js +29 -0
- package/dist/state/state.d.ts +3 -29
- package/dist/state/state.d.ts.map +1 -1
- package/dist/state/state.interfaces.d.ts +31 -12
- package/dist/state/state.interfaces.d.ts.map +1 -1
- package/dist/state/state.interfaces.js +17 -1
- package/dist/state/state.js +9 -164
- package/dist/state/time-value-resolver.d.ts +17 -0
- package/dist/state/time-value-resolver.d.ts.map +1 -0
- package/dist/state/time-value-resolver.js +110 -0
- package/dist/testing/mock-event.d.ts +10 -0
- package/dist/testing/mock-event.d.ts.map +1 -0
- package/dist/testing/mock-event.js +96 -0
- package/dist/testing/mock-server.d.ts +31 -0
- package/dist/testing/mock-server.d.ts.map +1 -0
- package/dist/testing/mock-server.interfaces.d.ts +54 -0
- package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
- package/dist/testing/mock-server.interfaces.js +4 -0
- package/dist/testing/mock-server.js +297 -0
- package/dist/testing/test-adapters.d.ts +22 -0
- package/dist/testing/test-adapters.d.ts.map +1 -0
- package/dist/testing/test-adapters.js +32 -0
- package/dist/types/common.d.ts +4 -37
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +2 -17
- package/dist/types/errors.d.ts +15 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +28 -0
- package/dist/types/external-domain-metadata.d.ts +40 -162
- package/dist/types/external-domain-metadata.d.ts.map +1 -1
- package/dist/types/extraction.d.ts +135 -278
- package/dist/types/extraction.d.ts.map +1 -1
- package/dist/types/extraction.js +46 -133
- package/dist/types/loading.d.ts +15 -55
- package/dist/types/loading.d.ts.map +1 -1
- package/dist/types/loading.js +1 -23
- package/dist/types/workers.d.ts +70 -103
- package/dist/types/workers.d.ts.map +1 -1
- package/dist/types/workers.js +1 -6
- package/dist/uploader/uploader.d.ts +10 -61
- package/dist/uploader/uploader.d.ts.map +1 -1
- package/dist/uploader/uploader.helpers.d.ts +7 -27
- package/dist/uploader/uploader.helpers.d.ts.map +1 -1
- package/dist/uploader/uploader.helpers.js +80 -30
- package/dist/uploader/uploader.interfaces.d.ts +19 -54
- package/dist/uploader/uploader.interfaces.d.ts.map +1 -1
- package/dist/uploader/uploader.interfaces.js +8 -0
- package/dist/uploader/uploader.js +72 -124
- package/docs/MIGRATION.md +696 -0
- package/package.json +35 -22
- 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 -321
- package/dist/common/control-protocol.d.ts +0 -10
- package/dist/common/control-protocol.d.ts.map +0 -1
- package/dist/common/control-protocol.js +0 -31
- package/dist/common/errors.d.ts +0 -6
- package/dist/common/errors.d.ts.map +0 -1
- package/dist/common/errors.js +0 -4
- package/dist/common/event-type-translation.d.ts +0 -24
- package/dist/common/event-type-translation.d.ts.map +0 -1
- package/dist/common/event-type-translation.js +0 -117
- package/dist/common/install-initial-domain-mapping.d.ts +0 -4
- 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 -208
- package/dist/deprecated/adapter/index.d.ts +0 -62
- package/dist/deprecated/adapter/index.d.ts.map +0 -1
- package/dist/deprecated/adapter/index.js +0 -151
- package/dist/deprecated/common/helpers.d.ts +0 -7
- package/dist/deprecated/common/helpers.d.ts.map +0 -1
- package/dist/deprecated/common/helpers.js +0 -47
- package/dist/deprecated/demo-extractor/external_domain_metadata.json +0 -38
- package/dist/deprecated/demo-extractor/index.d.ts +0 -18
- package/dist/deprecated/demo-extractor/index.d.ts.map +0 -1
- package/dist/deprecated/demo-extractor/index.js +0 -161
- package/dist/deprecated/http/client.d.ts +0 -22
- package/dist/deprecated/http/client.d.ts.map +0 -1
- package/dist/deprecated/http/client.js +0 -161
- package/dist/deprecated/uploader/index.d.ts +0 -35
- package/dist/deprecated/uploader/index.d.ts.map +0 -1
- package/dist/deprecated/uploader/index.js +0 -161
- 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 -154
- 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 -57
- 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 -3
- package/dist/http/index.d.ts.map +0 -1
- package/dist/http/index.js +0 -18
- package/dist/http/types.d.ts +0 -17
- package/dist/http/types.d.ts.map +0 -1
- package/dist/http/types.js +0 -2
- 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 -490
- 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 -107
- 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 -89
- 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/worker-adapter/worker-adapter.artifacts.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.js +0 -127
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts +0 -91
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts +0 -22
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.js +0 -514
- package/dist/multithreading/worker-adapter/worker-adapter.js +0 -745
- package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.test.js +0 -483
- 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 -131
- 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 -224
- 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 -70
- package/dist/types/index.d.ts +0 -10
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -18
- 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 -267
- 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 -589
package/dist/state/state.test.js
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const constants_1 = require("../common/constants");
|
|
4
|
-
const test_helpers_1 = require("../tests/test-helpers");
|
|
5
|
-
const extraction_1 = require("../types/extraction");
|
|
6
|
-
const state_1 = require("./state");
|
|
7
|
-
const state_interfaces_1 = require("./state.interfaces");
|
|
8
|
-
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
9
|
-
describe(state_1.State.name, () => {
|
|
10
|
-
let initSpy;
|
|
11
|
-
let postStateSpy;
|
|
12
|
-
let fetchStateSpy;
|
|
13
|
-
let installInitialDomainMappingSpy;
|
|
14
|
-
let processExitSpy;
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
jest.clearAllMocks();
|
|
17
|
-
jest.restoreAllMocks();
|
|
18
|
-
initSpy = jest.spyOn(state_1.State.prototype, 'init');
|
|
19
|
-
postStateSpy = jest.spyOn(state_1.State.prototype, 'postState');
|
|
20
|
-
fetchStateSpy = jest.spyOn(state_1.State.prototype, 'fetchState');
|
|
21
|
-
installInitialDomainMappingSpy = jest.spyOn(require('../common/install-initial-domain-mapping'), 'installInitialDomainMapping');
|
|
22
|
-
processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
|
|
23
|
-
throw new Error('process.exit called');
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
it.each(constants_1.STATELESS_EVENT_TYPES)('should not init, fetch, post or install IDM for stateless event type %s', async (eventType) => {
|
|
27
|
-
// Arrange
|
|
28
|
-
const event = (0, test_helpers_1.createEvent)({
|
|
29
|
-
eventType: eventType,
|
|
30
|
-
});
|
|
31
|
-
// Act
|
|
32
|
-
await (0, state_1.createAdapterState)({
|
|
33
|
-
event,
|
|
34
|
-
initialState: {},
|
|
35
|
-
initialDomainMapping: {},
|
|
36
|
-
});
|
|
37
|
-
// Assert
|
|
38
|
-
expect(initSpy).not.toHaveBeenCalled();
|
|
39
|
-
expect(fetchStateSpy).not.toHaveBeenCalled();
|
|
40
|
-
expect(postStateSpy).not.toHaveBeenCalled();
|
|
41
|
-
expect(installInitialDomainMappingSpy).not.toHaveBeenCalled();
|
|
42
|
-
});
|
|
43
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching the state fails', async (eventType) => {
|
|
44
|
-
// Arrange
|
|
45
|
-
const event = (0, test_helpers_1.createEvent)({
|
|
46
|
-
eventType: eventType,
|
|
47
|
-
});
|
|
48
|
-
fetchStateSpy.mockRejectedValue({
|
|
49
|
-
isAxiosError: true,
|
|
50
|
-
response: { status: 500 },
|
|
51
|
-
});
|
|
52
|
-
jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
53
|
-
// Act & Assert
|
|
54
|
-
await expect((0, state_1.createAdapterState)({
|
|
55
|
-
event,
|
|
56
|
-
initialState: {},
|
|
57
|
-
initialDomainMapping: {},
|
|
58
|
-
})).rejects.toThrow('process.exit called');
|
|
59
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
60
|
-
});
|
|
61
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if parsing the state fails', async (eventType) => {
|
|
62
|
-
// Arrange
|
|
63
|
-
const event = (0, test_helpers_1.createEvent)({
|
|
64
|
-
eventType: eventType,
|
|
65
|
-
});
|
|
66
|
-
fetchStateSpy.mockResolvedValue('invalid-json');
|
|
67
|
-
jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
68
|
-
// Act & Assert
|
|
69
|
-
await expect((0, state_1.createAdapterState)({
|
|
70
|
-
event,
|
|
71
|
-
initialState: {},
|
|
72
|
-
initialDomainMapping: {},
|
|
73
|
-
})).rejects.toThrow('process.exit called');
|
|
74
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
75
|
-
});
|
|
76
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching is successful but there is no state in the response', async (eventType) => {
|
|
77
|
-
// Arrange
|
|
78
|
-
const event = (0, test_helpers_1.createEvent)({
|
|
79
|
-
eventType: eventType,
|
|
80
|
-
});
|
|
81
|
-
fetchStateSpy.mockResolvedValue(null);
|
|
82
|
-
jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
83
|
-
// Act & Assert
|
|
84
|
-
await expect((0, state_1.createAdapterState)({
|
|
85
|
-
event,
|
|
86
|
-
initialState: {},
|
|
87
|
-
initialDomainMapping: {},
|
|
88
|
-
})).rejects.toThrow('process.exit called');
|
|
89
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
90
|
-
});
|
|
91
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES.filter((eventType) => eventType !== extraction_1.EventType.StartExtractingData))('should call post state with full adapter state if fetching returns 404 for event type %s', async (eventType) => {
|
|
92
|
-
// Arrange
|
|
93
|
-
const initialState = {
|
|
94
|
-
test: 'test',
|
|
95
|
-
};
|
|
96
|
-
const event = (0, test_helpers_1.createEvent)({
|
|
97
|
-
eventType: eventType,
|
|
98
|
-
contextOverrides: {
|
|
99
|
-
snap_in_version_id: '',
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
fetchStateSpy.mockRejectedValue({
|
|
103
|
-
isAxiosError: true,
|
|
104
|
-
response: { status: 404 },
|
|
105
|
-
});
|
|
106
|
-
installInitialDomainMappingSpy.mockResolvedValue({
|
|
107
|
-
success: true,
|
|
108
|
-
});
|
|
109
|
-
postStateSpy.mockResolvedValue({
|
|
110
|
-
success: true,
|
|
111
|
-
});
|
|
112
|
-
jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
113
|
-
// Act
|
|
114
|
-
await (0, state_1.createAdapterState)({
|
|
115
|
-
event,
|
|
116
|
-
initialState,
|
|
117
|
-
initialDomainMapping: {},
|
|
118
|
-
});
|
|
119
|
-
const expectedState = Object.assign(Object.assign({}, initialState), state_interfaces_1.extractionSdkState);
|
|
120
|
-
expect(postStateSpy).toHaveBeenCalledWith(expectedState);
|
|
121
|
-
});
|
|
122
|
-
it(extraction_1.EventType.StartExtractingData, async () => {
|
|
123
|
-
// Arrange
|
|
124
|
-
const initialState = {
|
|
125
|
-
test: 'test',
|
|
126
|
-
};
|
|
127
|
-
const event = (0, test_helpers_1.createEvent)({
|
|
128
|
-
eventType: extraction_1.EventType.StartExtractingData,
|
|
129
|
-
contextOverrides: {
|
|
130
|
-
snap_in_version_id: '',
|
|
131
|
-
},
|
|
132
|
-
});
|
|
133
|
-
fetchStateSpy.mockRejectedValue({
|
|
134
|
-
isAxiosError: true,
|
|
135
|
-
response: { status: 404 },
|
|
136
|
-
});
|
|
137
|
-
installInitialDomainMappingSpy.mockResolvedValue({
|
|
138
|
-
success: true,
|
|
139
|
-
});
|
|
140
|
-
postStateSpy.mockResolvedValue({
|
|
141
|
-
success: true,
|
|
142
|
-
});
|
|
143
|
-
jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
144
|
-
// Act
|
|
145
|
-
await (0, state_1.createAdapterState)({
|
|
146
|
-
event,
|
|
147
|
-
initialState,
|
|
148
|
-
initialDomainMapping: {},
|
|
149
|
-
});
|
|
150
|
-
// Assert
|
|
151
|
-
// Verify that post state is called with object that contains
|
|
152
|
-
// lastSyncStarted which is not empty string
|
|
153
|
-
expect(postStateSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
154
|
-
lastSyncStarted: expect.not.stringMatching(/^$/),
|
|
155
|
-
}));
|
|
156
|
-
});
|
|
157
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if initialDomainMapping is not provided for event type %s', async (eventType) => {
|
|
158
|
-
// Arrange
|
|
159
|
-
const event = (0, test_helpers_1.createEvent)({
|
|
160
|
-
eventType: eventType,
|
|
161
|
-
});
|
|
162
|
-
fetchStateSpy.mockResolvedValue(JSON.stringify({
|
|
163
|
-
test: 'test',
|
|
164
|
-
}));
|
|
165
|
-
jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
166
|
-
jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
167
|
-
// Act & Assert
|
|
168
|
-
await expect((0, state_1.createAdapterState)({
|
|
169
|
-
event,
|
|
170
|
-
initialState: {},
|
|
171
|
-
initialDomainMapping: undefined,
|
|
172
|
-
})).rejects.toThrow('process.exit called');
|
|
173
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
174
|
-
});
|
|
175
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should not install IDM if version matches for event type %s', async (eventType) => {
|
|
176
|
-
// Arrange
|
|
177
|
-
const event = (0, test_helpers_1.createEvent)({
|
|
178
|
-
eventType: eventType,
|
|
179
|
-
contextOverrides: {
|
|
180
|
-
snap_in_version_id: '1.0.0',
|
|
181
|
-
},
|
|
182
|
-
});
|
|
183
|
-
const stringifiedState = JSON.stringify({
|
|
184
|
-
test: 'test',
|
|
185
|
-
snapInVersionId: '1.0.0',
|
|
186
|
-
});
|
|
187
|
-
fetchStateSpy.mockResolvedValue(stringifiedState);
|
|
188
|
-
jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
189
|
-
// Act & Assert
|
|
190
|
-
await (0, state_1.createAdapterState)({
|
|
191
|
-
event,
|
|
192
|
-
initialState: {},
|
|
193
|
-
initialDomainMapping: {},
|
|
194
|
-
});
|
|
195
|
-
// Assert
|
|
196
|
-
expect(installInitialDomainMappingSpy).not.toHaveBeenCalled();
|
|
197
|
-
});
|
|
198
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should install IDM if version does not match for event type %s', async (eventType) => {
|
|
199
|
-
// Arrange
|
|
200
|
-
const event = (0, test_helpers_1.createEvent)({
|
|
201
|
-
eventType: eventType,
|
|
202
|
-
contextOverrides: {
|
|
203
|
-
snap_in_version_id: '2.0.0',
|
|
204
|
-
},
|
|
205
|
-
});
|
|
206
|
-
const stringifiedState = JSON.stringify({
|
|
207
|
-
test: 'test',
|
|
208
|
-
snapInVersionId: '1.0.0',
|
|
209
|
-
});
|
|
210
|
-
fetchStateSpy.mockResolvedValue(stringifiedState);
|
|
211
|
-
installInitialDomainMappingSpy.mockResolvedValue({
|
|
212
|
-
success: true,
|
|
213
|
-
});
|
|
214
|
-
jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
215
|
-
// Act
|
|
216
|
-
await (0, state_1.createAdapterState)({
|
|
217
|
-
event,
|
|
218
|
-
initialState: {},
|
|
219
|
-
initialDomainMapping: {},
|
|
220
|
-
});
|
|
221
|
-
// Assert
|
|
222
|
-
expect(installInitialDomainMappingSpy).toHaveBeenCalled();
|
|
223
|
-
});
|
|
224
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extraction.test.d.ts","sourceRoot":"","sources":["../../src/types/extraction.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const test_helpers_1 = require("../tests/test-helpers");
|
|
4
|
-
const extraction_1 = require("./extraction");
|
|
5
|
-
// Test the EventContext interface and related extraction types
|
|
6
|
-
describe('ExtractionTypes', () => {
|
|
7
|
-
const baseEvent = (0, test_helpers_1.createEvent)({ eventType: extraction_1.EventType.ExtractionDataStart });
|
|
8
|
-
it('should create event context without optional fields', () => {
|
|
9
|
-
const event = Object.assign({}, baseEvent);
|
|
10
|
-
// If this compiles, the test passes
|
|
11
|
-
expect(event).toBeDefined();
|
|
12
|
-
expect(event.payload.event_context).toBeDefined();
|
|
13
|
-
});
|
|
14
|
-
it('should create event context with all optional fields', () => {
|
|
15
|
-
const event = Object.assign({}, baseEvent);
|
|
16
|
-
event.payload.event_context = Object.assign(Object.assign({}, baseEvent.payload.event_context), { extract_from: '2024-01-01T00:00:00Z', initial_sync_scope: extraction_1.InitialSyncScope.TIME_SCOPED, reset_extract_from: true });
|
|
17
|
-
expect(event).toBeDefined();
|
|
18
|
-
expect(event.payload.event_context.extract_from).toBe('2024-01-01T00:00:00Z');
|
|
19
|
-
expect(event.payload.event_context.initial_sync_scope).toBe(extraction_1.InitialSyncScope.TIME_SCOPED);
|
|
20
|
-
expect(event.payload.event_context.reset_extract_from).toBe(true);
|
|
21
|
-
});
|
|
22
|
-
it('should create event context with partial optional fields', () => {
|
|
23
|
-
const event = Object.assign({}, baseEvent);
|
|
24
|
-
event.payload.event_context = Object.assign(Object.assign({}, baseEvent.payload.event_context), { extract_from: '2024-01-01T00:00:00Z' });
|
|
25
|
-
expect(event).toBeDefined();
|
|
26
|
-
expect(event.payload.event_context.extract_from).toBe('2024-01-01T00:00:00Z');
|
|
27
|
-
});
|
|
28
|
-
it('should handle different InitialSyncScope values', () => {
|
|
29
|
-
const event = Object.assign({}, baseEvent);
|
|
30
|
-
event.payload.event_context = Object.assign(Object.assign({}, baseEvent.payload.event_context), { initial_sync_scope: extraction_1.InitialSyncScope.FULL_HISTORY });
|
|
31
|
-
expect(event.payload.event_context.initial_sync_scope).toBe(extraction_1.InitialSyncScope.FULL_HISTORY);
|
|
32
|
-
});
|
|
33
|
-
it('[edge] should handle null event context gracefully', () => {
|
|
34
|
-
const event = Object.assign({}, baseEvent);
|
|
35
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
-
event.payload.event_context = null;
|
|
37
|
-
expect(event.payload.event_context).toBeNull();
|
|
38
|
-
});
|
|
39
|
-
it('[edge] should handle undefined optional fields', () => {
|
|
40
|
-
const event = Object.assign({}, baseEvent);
|
|
41
|
-
event.payload.event_context = Object.assign(Object.assign({}, baseEvent.payload.event_context), { extract_from: undefined, initial_sync_scope: undefined, reset_extract_from: undefined });
|
|
42
|
-
expect(event.payload.event_context.extract_from).toBeUndefined();
|
|
43
|
-
expect(event.payload.event_context.initial_sync_scope).toBeUndefined();
|
|
44
|
-
expect(event.payload.event_context.reset_extract_from).toBeUndefined();
|
|
45
|
-
});
|
|
46
|
-
it('[edge] should handle invalid date format in extract_from', () => {
|
|
47
|
-
const event = Object.assign({}, baseEvent);
|
|
48
|
-
event.payload.event_context = Object.assign(Object.assign({}, baseEvent.payload.event_context), { extract_from: 'invalid-date-format' });
|
|
49
|
-
expect(event.payload.event_context.extract_from).toBe('invalid-date-format');
|
|
50
|
-
// Note: Type validation would typically happen at runtime, not compile time
|
|
51
|
-
});
|
|
52
|
-
it('[edge] should handle explicit boolean values for reset_extract_from', () => {
|
|
53
|
-
const eventWithTrue = (0, test_helpers_1.createEvent)({
|
|
54
|
-
eventType: extraction_1.EventType.ExtractionDataStart,
|
|
55
|
-
eventContextOverrides: {
|
|
56
|
-
reset_extract_from: true,
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
const eventWithFalse = (0, test_helpers_1.createEvent)({
|
|
60
|
-
eventType: extraction_1.EventType.ExtractionDataStart,
|
|
61
|
-
eventContextOverrides: {
|
|
62
|
-
reset_extract_from: false,
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
expect(eventWithTrue.payload.event_context.reset_extract_from).toBe(true);
|
|
66
|
-
expect(eventWithFalse.payload.event_context.reset_extract_from).toBe(false);
|
|
67
|
-
expect(typeof eventWithTrue.payload.event_context.reset_extract_from).toBe('boolean');
|
|
68
|
-
expect(typeof eventWithFalse.payload.event_context.reset_extract_from).toBe('boolean');
|
|
69
|
-
});
|
|
70
|
-
});
|
package/dist/types/index.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export { AdapterUpdateParams, ErrorLevel, ErrorRecord, InitialDomainMapping, LogRecord, SyncMode, } from './common';
|
|
2
|
-
export { AirdropEvent, AirdropMessage, ConnectionData, DomainObjectState, EventContextIn, EventContextOut, EventData, EventType, ExternalProcessAttachmentFunction, ExternalSyncUnit, ExternalSystemAttachmentIteratorFunction, ExternalSystemAttachmentReducerFunction, ExternalSystemAttachmentStreamingFunction, ExternalSystemAttachmentStreamingParams, ExternalSystemAttachmentStreamingResponse, ExtractionMode, ExtractorEvent, ExtractorEventType, ProcessAttachmentReturnType, } from './extraction';
|
|
3
|
-
export { ExternalSystemAttachment, ExternalSystemItem, ExternalSystemItemLoadingParams, ExternalSystemItemLoadingResponse, LoaderEventType, } from './loading';
|
|
4
|
-
export { NormalizedAttachment, NormalizedItem, RepoInterface, } from '../repo/repo.interfaces';
|
|
5
|
-
export { AdapterState } from '../state/state.interfaces';
|
|
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,EACL,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,oBAAoB,EACpB,SAAS,EACT,QAAQ,GACT,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,SAAS,EACT,SAAS,EACT,iCAAiC,EACjC,gBAAgB,EAChB,wCAAwC,EACxC,uCAAuC,EACvC,yCAAyC,EACzC,uCAAuC,EACvC,yCAAyC,EACzC,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,2BAA2B,GAC5B,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;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,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,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SyncMapperRecordTargetType = exports.SyncMapperRecordStatus = exports.LoaderEventType = exports.ExtractorEventType = exports.ExtractionMode = exports.EventType = exports.SyncMode = exports.ErrorLevel = void 0;
|
|
4
|
-
// Common
|
|
5
|
-
var common_1 = require("./common");
|
|
6
|
-
Object.defineProperty(exports, "ErrorLevel", { enumerable: true, get: function () { return common_1.ErrorLevel; } });
|
|
7
|
-
Object.defineProperty(exports, "SyncMode", { enumerable: true, get: function () { return common_1.SyncMode; } });
|
|
8
|
-
// Extraction
|
|
9
|
-
var extraction_1 = require("./extraction");
|
|
10
|
-
Object.defineProperty(exports, "EventType", { enumerable: true, get: function () { return extraction_1.EventType; } });
|
|
11
|
-
Object.defineProperty(exports, "ExtractionMode", { enumerable: true, get: function () { return extraction_1.ExtractionMode; } });
|
|
12
|
-
Object.defineProperty(exports, "ExtractorEventType", { enumerable: true, get: function () { return extraction_1.ExtractorEventType; } });
|
|
13
|
-
// Loading
|
|
14
|
-
var loading_1 = require("./loading");
|
|
15
|
-
Object.defineProperty(exports, "LoaderEventType", { enumerable: true, get: function () { return loading_1.LoaderEventType; } });
|
|
16
|
-
var mappers_interface_1 = require("../mappers/mappers.interface");
|
|
17
|
-
Object.defineProperty(exports, "SyncMapperRecordStatus", { enumerable: true, get: function () { return mappers_interface_1.SyncMapperRecordStatus; } });
|
|
18
|
-
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,267 +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
|
-
let consoleErrorSpy;
|
|
14
|
-
let consoleLogSpy;
|
|
15
|
-
let consoleWarnSpy;
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
|
|
18
|
-
consoleLogSpy = jest.spyOn(console, 'log').mockImplementation();
|
|
19
|
-
consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation();
|
|
20
|
-
});
|
|
21
|
-
afterEach(() => {
|
|
22
|
-
jest.clearAllMocks();
|
|
23
|
-
consoleErrorSpy.mockRestore();
|
|
24
|
-
consoleLogSpy.mockRestore();
|
|
25
|
-
consoleWarnSpy.mockRestore();
|
|
26
|
-
});
|
|
27
|
-
describe(uploader_helpers_1.compressGzip.name, () => {
|
|
28
|
-
it('should compress a string to gzip buffer', () => {
|
|
29
|
-
// Arrange
|
|
30
|
-
const input = '{"id":1}\n{"id":2}';
|
|
31
|
-
// Act
|
|
32
|
-
const result = (0, uploader_helpers_1.compressGzip)(input);
|
|
33
|
-
// Assert
|
|
34
|
-
expect(result.response).toBeInstanceOf(Buffer);
|
|
35
|
-
const decompressed = zlib_1.default
|
|
36
|
-
.gunzipSync(result.response)
|
|
37
|
-
.toString();
|
|
38
|
-
expect(decompressed).toBe(input);
|
|
39
|
-
});
|
|
40
|
-
it('[edge] should return undefined and log error when compression fails', () => {
|
|
41
|
-
// Arrange
|
|
42
|
-
const gzipSyncSpy = jest
|
|
43
|
-
.spyOn(zlib_1.default, 'gzipSync')
|
|
44
|
-
.mockImplementationOnce(() => {
|
|
45
|
-
throw new Error('Compression failed');
|
|
46
|
-
});
|
|
47
|
-
// Act
|
|
48
|
-
const result = (0, uploader_helpers_1.compressGzip)('test data');
|
|
49
|
-
// Assert
|
|
50
|
-
expect(result.response).toBeUndefined();
|
|
51
|
-
gzipSyncSpy.mockRestore();
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
describe(uploader_helpers_1.decompressGzip.name, () => {
|
|
55
|
-
it('should decompress a gzip buffer to string', () => {
|
|
56
|
-
// Arrange
|
|
57
|
-
const originalString = '{"id":1}\n{"id":2}';
|
|
58
|
-
const compressed = zlib_1.default.gzipSync(originalString);
|
|
59
|
-
// Act
|
|
60
|
-
const result = (0, uploader_helpers_1.decompressGzip)(compressed);
|
|
61
|
-
// Assert
|
|
62
|
-
expect(result.response).toBe(originalString);
|
|
63
|
-
});
|
|
64
|
-
it('[edge] should return undefined and log error when decompression fails', () => {
|
|
65
|
-
// Arrange
|
|
66
|
-
const invalidGzip = Buffer.from('not valid gzip data');
|
|
67
|
-
// Act
|
|
68
|
-
const result = (0, uploader_helpers_1.decompressGzip)(invalidGzip);
|
|
69
|
-
// Assert
|
|
70
|
-
expect(result.response).toBeUndefined();
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
describe(uploader_helpers_1.parseJsonl.name, () => {
|
|
74
|
-
it('should parse valid JSONL string to array of objects', () => {
|
|
75
|
-
// Arrange
|
|
76
|
-
const data = [
|
|
77
|
-
{ id: 1, name: 'Item 1' },
|
|
78
|
-
{ id: 2, name: 'Item 2' },
|
|
79
|
-
];
|
|
80
|
-
const jsonlString = js_jsonl_1.jsonl.stringify(data);
|
|
81
|
-
// Act
|
|
82
|
-
const result = (0, uploader_helpers_1.parseJsonl)(jsonlString);
|
|
83
|
-
// Assert
|
|
84
|
-
expect(result.response).toEqual(data);
|
|
85
|
-
});
|
|
86
|
-
it('[edge] should return null and log error when parsing fails', () => {
|
|
87
|
-
// Arrange
|
|
88
|
-
const invalidJsonl = 'not valid jsonl {{{';
|
|
89
|
-
// Act
|
|
90
|
-
const result = (0, uploader_helpers_1.parseJsonl)(invalidJsonl);
|
|
91
|
-
// Assert
|
|
92
|
-
expect(result.response).toBeUndefined();
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
describe(uploader_helpers_1.downloadToLocal.name, () => {
|
|
96
|
-
const mockExistsSync = jest.spyOn(fs_1.default, 'existsSync');
|
|
97
|
-
const mockMkdirSync = jest.spyOn(fs_1.default, 'mkdirSync');
|
|
98
|
-
afterEach(() => {
|
|
99
|
-
mockExistsSync.mockReset();
|
|
100
|
-
mockMkdirSync.mockReset();
|
|
101
|
-
});
|
|
102
|
-
it('should create extracted_files directory if it does not exist', async () => {
|
|
103
|
-
// Arrange
|
|
104
|
-
const itemType = 'tasks';
|
|
105
|
-
const fetchedObjects = [{ id: 1 }];
|
|
106
|
-
mockExistsSync.mockReturnValueOnce(false);
|
|
107
|
-
mockMkdirSync.mockImplementationOnce(() => undefined);
|
|
108
|
-
const mockFileHandle = {
|
|
109
|
-
write: jest.fn().mockResolvedValue(undefined),
|
|
110
|
-
close: jest.fn().mockResolvedValue(undefined),
|
|
111
|
-
};
|
|
112
|
-
const fsPromisesOpenSpy = jest
|
|
113
|
-
.spyOn(fs_2.promises, 'open')
|
|
114
|
-
.mockResolvedValueOnce(mockFileHandle);
|
|
115
|
-
// Act
|
|
116
|
-
await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects);
|
|
117
|
-
// Assert
|
|
118
|
-
expect(mockExistsSync).toHaveBeenCalledWith('extracted_files');
|
|
119
|
-
expect(mockMkdirSync).toHaveBeenCalledWith('extracted_files');
|
|
120
|
-
fsPromisesOpenSpy.mockRestore();
|
|
121
|
-
});
|
|
122
|
-
it('should write objects as JSONL lines to file', async () => {
|
|
123
|
-
// Arrange
|
|
124
|
-
const itemType = 'tasks';
|
|
125
|
-
const fetchedObjects = [{ id: 1 }, { id: 2 }];
|
|
126
|
-
mockExistsSync.mockReturnValueOnce(true);
|
|
127
|
-
const mockFileHandle = {
|
|
128
|
-
write: jest.fn().mockResolvedValue(undefined),
|
|
129
|
-
close: jest.fn().mockResolvedValue(undefined),
|
|
130
|
-
};
|
|
131
|
-
const fsPromisesOpenSpy = jest
|
|
132
|
-
.spyOn(fs_2.promises, 'open')
|
|
133
|
-
.mockResolvedValueOnce(mockFileHandle);
|
|
134
|
-
// Act
|
|
135
|
-
await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects);
|
|
136
|
-
// Assert
|
|
137
|
-
expect(mockFileHandle.write).toHaveBeenCalledTimes(2);
|
|
138
|
-
expect(mockFileHandle.write).toHaveBeenCalledWith('{"id":1}\n');
|
|
139
|
-
expect(mockFileHandle.write).toHaveBeenCalledWith('{"id":2}\n');
|
|
140
|
-
expect(mockFileHandle.close).toHaveBeenCalled();
|
|
141
|
-
fsPromisesOpenSpy.mockRestore();
|
|
142
|
-
});
|
|
143
|
-
it('should handle single object (non-array) input', async () => {
|
|
144
|
-
// Arrange
|
|
145
|
-
const itemType = 'metadata';
|
|
146
|
-
const fetchedObject = { key: 'value' };
|
|
147
|
-
mockExistsSync.mockReturnValueOnce(true);
|
|
148
|
-
const mockFileHandle = {
|
|
149
|
-
write: jest.fn().mockResolvedValue(undefined),
|
|
150
|
-
close: jest.fn().mockResolvedValue(undefined),
|
|
151
|
-
};
|
|
152
|
-
const fsPromisesOpenSpy = jest
|
|
153
|
-
.spyOn(fs_2.promises, 'open')
|
|
154
|
-
.mockResolvedValueOnce(mockFileHandle);
|
|
155
|
-
// Act
|
|
156
|
-
await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObject);
|
|
157
|
-
// Assert
|
|
158
|
-
expect(mockFileHandle.write).toHaveBeenCalledTimes(1);
|
|
159
|
-
expect(mockFileHandle.write).toHaveBeenCalledWith('{"key":"value"}\n');
|
|
160
|
-
fsPromisesOpenSpy.mockRestore();
|
|
161
|
-
});
|
|
162
|
-
it('should use .json extension when itemType is external_domain_metadata', async () => {
|
|
163
|
-
// Arrange
|
|
164
|
-
const itemType = 'external_domain_metadata';
|
|
165
|
-
const fetchedObject = { domain: 'example.com' };
|
|
166
|
-
mockExistsSync.mockReturnValueOnce(true);
|
|
167
|
-
const mockFileHandle = {
|
|
168
|
-
write: jest.fn().mockResolvedValue(undefined),
|
|
169
|
-
close: jest.fn().mockResolvedValue(undefined),
|
|
170
|
-
};
|
|
171
|
-
const fsPromisesOpenSpy = jest
|
|
172
|
-
.spyOn(fs_2.promises, 'open')
|
|
173
|
-
.mockResolvedValueOnce(mockFileHandle);
|
|
174
|
-
// Act
|
|
175
|
-
await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObject);
|
|
176
|
-
// Assert
|
|
177
|
-
expect(fsPromisesOpenSpy).toHaveBeenCalledWith(expect.stringMatching(/extractor_external_domain_metadata_\d+\.json$/), 'w');
|
|
178
|
-
fsPromisesOpenSpy.mockRestore();
|
|
179
|
-
});
|
|
180
|
-
it('[edge] should reject and log error when file operations fail', async () => {
|
|
181
|
-
// Arrange
|
|
182
|
-
const itemType = 'tasks';
|
|
183
|
-
const fetchedObjects = [{ id: 1 }];
|
|
184
|
-
const fileError = new Error('File write failed');
|
|
185
|
-
mockExistsSync.mockReturnValueOnce(true);
|
|
186
|
-
const fsPromisesOpenSpy = jest
|
|
187
|
-
.spyOn(fs_2.promises, 'open')
|
|
188
|
-
.mockRejectedValueOnce(fileError);
|
|
189
|
-
// Act & Assert
|
|
190
|
-
await expect((0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects)).rejects.toThrow(fileError);
|
|
191
|
-
fsPromisesOpenSpy.mockRestore();
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
describe(uploader_helpers_1.truncateFilename.name, () => {
|
|
195
|
-
it('should return filename unchanged when within the limit', () => {
|
|
196
|
-
// Arrange
|
|
197
|
-
const filename = 'short-filename.txt';
|
|
198
|
-
// Act
|
|
199
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
200
|
-
// Assert
|
|
201
|
-
expect(result).toBe(filename);
|
|
202
|
-
});
|
|
203
|
-
it('should return filename unchanged when exactly at the limit', () => {
|
|
204
|
-
// Arrange
|
|
205
|
-
const filename = 'a'.repeat(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
206
|
-
// Act
|
|
207
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
208
|
-
// Assert
|
|
209
|
-
expect(result).toBe(filename);
|
|
210
|
-
expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
211
|
-
});
|
|
212
|
-
it('should truncate filename and preserve extension when exceeding the limit', () => {
|
|
213
|
-
// Arrange
|
|
214
|
-
const longName = 'a'.repeat(300);
|
|
215
|
-
const extension = '.txt';
|
|
216
|
-
const filename = longName + extension;
|
|
217
|
-
// Act
|
|
218
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
219
|
-
// Assert
|
|
220
|
-
expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
221
|
-
expect(result).toContain('...');
|
|
222
|
-
expect(result.endsWith(extension)).toBe(true);
|
|
223
|
-
});
|
|
224
|
-
it('should preserve the last MAX_DEVREV_FILENAME_EXTENSION_LENGTH characters as extension', () => {
|
|
225
|
-
// Arrange
|
|
226
|
-
const longName = 'document-'.repeat(50);
|
|
227
|
-
const extension = '.verylongextension';
|
|
228
|
-
const filename = longName + extension;
|
|
229
|
-
// Act
|
|
230
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
231
|
-
// Assert
|
|
232
|
-
expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
233
|
-
const expectedExtension = filename.slice(-constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH);
|
|
234
|
-
expect(result.endsWith(expectedExtension)).toBe(true);
|
|
235
|
-
});
|
|
236
|
-
it('should correctly format the truncated filename with ellipsis', () => {
|
|
237
|
-
// Arrange
|
|
238
|
-
const filename = 'x'.repeat(300) + '.pdf';
|
|
239
|
-
// Act
|
|
240
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
241
|
-
// Assert
|
|
242
|
-
const availableNameLength = constants_1.MAX_DEVREV_FILENAME_LENGTH - constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH - 3;
|
|
243
|
-
const expectedPrefix = 'x'.repeat(availableNameLength);
|
|
244
|
-
const expectedExtension = filename.slice(-constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH);
|
|
245
|
-
expect(result).toBe(`${expectedPrefix}...${expectedExtension}`);
|
|
246
|
-
});
|
|
247
|
-
it('[edge] should handle filename with no extension', () => {
|
|
248
|
-
// Arrange
|
|
249
|
-
const filename = 'a'.repeat(300);
|
|
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
|
-
expect(result).toContain('...');
|
|
255
|
-
// Last 20 chars are preserved as "extension"
|
|
256
|
-
expect(result.endsWith('a'.repeat(constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH))).toBe(true);
|
|
257
|
-
});
|
|
258
|
-
it('[edge] should handle filename that is just one character over the limit', () => {
|
|
259
|
-
// Arrange
|
|
260
|
-
const filename = 'a'.repeat(constants_1.MAX_DEVREV_FILENAME_LENGTH + 1);
|
|
261
|
-
// Act
|
|
262
|
-
const result = (0, uploader_helpers_1.truncateFilename)(filename);
|
|
263
|
-
// Assert
|
|
264
|
-
expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.test.d.ts","sourceRoot":"","sources":["../../src/uploader/uploader.test.ts"],"names":[],"mappings":""}
|