@devrev/airsync-sdk 2.0.0-beta.0 → 2.0.0-beta.2
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 +0 -4
- package/dist/airsync-sdk.d.ts +1802 -0
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts +7 -0
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.js +44 -4
- package/dist/attachments-streaming/attachments-streaming-pool.test.js +259 -10
- package/dist/common/constants.d.ts +16 -5
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/common/constants.js +20 -6
- package/dist/common/control-protocol.d.ts +2 -2
- package/dist/common/control-protocol.d.ts.map +1 -1
- package/dist/common/control-protocol.js +1 -5
- package/dist/common/helpers.d.ts +8 -0
- package/dist/common/helpers.d.ts.map +1 -1
- package/dist/common/helpers.js +15 -0
- package/dist/common/install-initial-domain-mapping.d.ts +2 -2
- package/dist/common/install-initial-domain-mapping.test.js +7 -3
- package/dist/common/test-utils.d.ts +19 -0
- package/dist/common/test-utils.d.ts.map +1 -0
- package/dist/common/test-utils.js +101 -0
- package/dist/common/time-value-resolver.d.ts +47 -0
- package/dist/common/time-value-resolver.d.ts.map +1 -0
- package/dist/common/time-value-resolver.js +141 -0
- package/dist/common/time-value-resolver.test.d.ts +2 -0
- package/dist/common/time-value-resolver.test.d.ts.map +1 -0
- package/dist/common/time-value-resolver.test.js +268 -0
- package/dist/http/axios-client-internal.d.ts.map +1 -1
- package/dist/http/axios-client-internal.js +7 -0
- package/dist/http/axios-client-internal.test.js +27 -6
- package/dist/http/axios-client.d.ts.map +1 -1
- package/dist/http/axios-client.js +6 -3
- package/dist/http/index.d.ts +0 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +0 -1
- package/dist/index.d.ts +9 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -10
- package/dist/logger/logger.d.ts +1 -17
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.interfaces.d.ts +2 -2
- package/dist/logger/logger.js +35 -27
- package/dist/logger/logger.test.js +66 -19
- package/dist/mappers/mappers.interface.d.ts +5 -5
- package/dist/mappers/mappers.interface.js +3 -3
- package/dist/mappers/mappers.test.js +8 -10
- package/dist/mock-server/mock-server.d.ts +47 -0
- package/dist/mock-server/mock-server.d.ts.map +1 -0
- package/dist/mock-server/mock-server.interfaces.d.ts +73 -0
- package/dist/mock-server/mock-server.interfaces.d.ts.map +1 -0
- package/dist/mock-server/mock-server.interfaces.js +4 -0
- package/dist/mock-server/mock-server.js +278 -0
- package/dist/multithreading/create-worker.test.js +36 -17
- package/dist/multithreading/process-task.d.ts.map +1 -1
- package/dist/multithreading/process-task.js +46 -44
- package/dist/multithreading/process-task.test.d.ts +2 -0
- package/dist/multithreading/process-task.test.d.ts.map +1 -0
- package/dist/multithreading/process-task.test.js +146 -0
- package/dist/multithreading/spawn/spawn.d.ts +4 -3
- package/dist/multithreading/spawn/spawn.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.js +6 -14
- package/dist/multithreading/spawn/spawn.helpers.test.js +8 -8
- package/dist/multithreading/spawn/spawn.js +41 -31
- package/dist/multithreading/spawn/spawn.test.d.ts +2 -0
- package/dist/multithreading/spawn/spawn.test.d.ts.map +1 -0
- package/dist/multithreading/spawn/spawn.test.js +232 -0
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.js +49 -1
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts +11 -5
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +1 -1
- package/dist/multithreading/worker-adapter/worker-adapter.emit.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.emit.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.emit.test.js +390 -0
- package/dist/multithreading/worker-adapter/worker-adapter.extraction.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.extraction.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.extraction.test.js +799 -0
- package/dist/multithreading/worker-adapter/worker-adapter.js +233 -134
- package/dist/multithreading/worker-adapter/worker-adapter.loading.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.loading.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.loading.test.js +596 -0
- package/dist/multithreading/worker-adapter/worker-adapter.serialization.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.serialization.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.serialization.test.js +71 -0
- package/dist/repo/repo.d.ts.map +1 -1
- package/dist/repo/repo.interfaces.d.ts +4 -2
- package/dist/repo/repo.interfaces.d.ts.map +1 -1
- package/dist/repo/repo.js +4 -3
- package/dist/repo/repo.test.js +60 -7
- package/dist/state/state.d.ts +7 -1
- package/dist/state/state.d.ts.map +1 -1
- package/dist/state/state.extract-window.test.d.ts +2 -0
- package/dist/state/state.extract-window.test.d.ts.map +1 -0
- package/dist/state/state.extract-window.test.js +163 -0
- package/dist/state/state.interfaces.d.ts +25 -8
- package/dist/state/state.interfaces.d.ts.map +1 -1
- package/dist/state/state.interfaces.js +4 -2
- package/dist/state/state.js +111 -12
- package/dist/state/state.pending-boundaries.test.d.ts +2 -0
- package/dist/state/state.pending-boundaries.test.d.ts.map +1 -0
- package/dist/state/state.pending-boundaries.test.js +189 -0
- package/dist/state/state.post-state.test.d.ts +2 -0
- package/dist/state/state.post-state.test.d.ts.map +1 -0
- package/dist/state/state.post-state.test.js +77 -0
- package/dist/state/state.test.js +117 -73
- package/dist/state/state.time-value-resolution.test.d.ts +2 -0
- package/dist/state/state.time-value-resolution.test.d.ts.map +1 -0
- package/dist/state/state.time-value-resolution.test.js +175 -0
- package/dist/tsdoc-metadata.json +11 -0
- package/dist/types/common.d.ts +0 -25
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +1 -11
- package/dist/types/external-domain-metadata.d.ts +338 -0
- package/dist/types/external-domain-metadata.d.ts.map +1 -0
- package/dist/types/extraction.d.ts +89 -218
- package/dist/types/extraction.d.ts.map +1 -1
- package/dist/types/extraction.js +56 -124
- package/dist/types/extraction.test.js +69 -43
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +6 -3
- package/dist/types/loading.d.ts +4 -24
- package/dist/types/loading.d.ts.map +1 -1
- package/dist/types/loading.js +1 -22
- package/dist/types/workers.d.ts +31 -14
- package/dist/types/workers.d.ts.map +1 -1
- package/dist/types/workers.js +1 -0
- package/dist/uploader/uploader.d.ts +1 -0
- package/dist/uploader/uploader.d.ts.map +1 -1
- package/dist/uploader/uploader.helpers.test.js +0 -11
- package/dist/uploader/uploader.interfaces.d.ts +3 -3
- package/dist/uploader/uploader.js +53 -20
- package/dist/uploader/uploader.test.js +22 -10
- package/package.json +12 -11
- 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/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/types.d.ts +0 -17
- package/dist/http/types.d.ts.map +0 -1
- 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/{http/types.js → types/external-domain-metadata.js} +0 -0
package/dist/state/state.test.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const constants_1 = require("../common/constants");
|
|
4
|
-
const
|
|
4
|
+
const jest_setup_1 = require("../tests/jest.setup");
|
|
5
|
+
const test_utils_1 = require("../common/test-utils");
|
|
5
6
|
const extraction_1 = require("../types/extraction");
|
|
6
7
|
const state_1 = require("./state");
|
|
7
8
|
const state_interfaces_1 = require("./state.interfaces");
|
|
@@ -25,8 +26,8 @@ describe(state_1.State.name, () => {
|
|
|
25
26
|
});
|
|
26
27
|
it.each(constants_1.STATELESS_EVENT_TYPES)('should not init, fetch, post or install IDM for stateless event type %s', async (eventType) => {
|
|
27
28
|
// Arrange
|
|
28
|
-
const event = (0,
|
|
29
|
-
|
|
29
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
30
|
+
payload: { event_type: eventType },
|
|
30
31
|
});
|
|
31
32
|
// Act
|
|
32
33
|
await (0, state_1.createAdapterState)({
|
|
@@ -40,16 +41,15 @@ describe(state_1.State.name, () => {
|
|
|
40
41
|
expect(postStateSpy).not.toHaveBeenCalled();
|
|
41
42
|
expect(installInitialDomainMappingSpy).not.toHaveBeenCalled();
|
|
42
43
|
});
|
|
43
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching the state fails', async (eventType) => {
|
|
44
|
+
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching the state fails for event type %s', async (eventType) => {
|
|
44
45
|
// Arrange
|
|
45
|
-
const event = (0,
|
|
46
|
-
|
|
46
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
47
|
+
payload: { event_type: eventType },
|
|
47
48
|
});
|
|
48
49
|
fetchStateSpy.mockRejectedValue({
|
|
49
50
|
isAxiosError: true,
|
|
50
51
|
response: { status: 500 },
|
|
51
52
|
});
|
|
52
|
-
jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
53
53
|
// Act & Assert
|
|
54
54
|
await expect((0, state_1.createAdapterState)({
|
|
55
55
|
event,
|
|
@@ -58,13 +58,12 @@ describe(state_1.State.name, () => {
|
|
|
58
58
|
})).rejects.toThrow('process.exit called');
|
|
59
59
|
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
60
60
|
});
|
|
61
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if parsing the state fails', async (eventType) => {
|
|
61
|
+
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if parsing the state fails for event type %s', async (eventType) => {
|
|
62
62
|
// Arrange
|
|
63
|
-
const event = (0,
|
|
64
|
-
|
|
63
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
64
|
+
payload: { event_type: eventType },
|
|
65
65
|
});
|
|
66
|
-
fetchStateSpy.mockResolvedValue('invalid-json');
|
|
67
|
-
jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
66
|
+
fetchStateSpy.mockResolvedValue({ state: 'invalid-json' });
|
|
68
67
|
// Act & Assert
|
|
69
68
|
await expect((0, state_1.createAdapterState)({
|
|
70
69
|
event,
|
|
@@ -73,13 +72,12 @@ describe(state_1.State.name, () => {
|
|
|
73
72
|
})).rejects.toThrow('process.exit called');
|
|
74
73
|
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
75
74
|
});
|
|
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) => {
|
|
75
|
+
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching is successful but there is no state in the response for event type %s', async (eventType) => {
|
|
77
76
|
// Arrange
|
|
78
|
-
const event = (0,
|
|
79
|
-
|
|
77
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
78
|
+
payload: { event_type: eventType },
|
|
80
79
|
});
|
|
81
|
-
fetchStateSpy.mockResolvedValue(null);
|
|
82
|
-
jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
80
|
+
fetchStateSpy.mockResolvedValue({ state: null });
|
|
83
81
|
// Act & Assert
|
|
84
82
|
await expect((0, state_1.createAdapterState)({
|
|
85
83
|
event,
|
|
@@ -93,11 +91,11 @@ describe(state_1.State.name, () => {
|
|
|
93
91
|
const initialState = {
|
|
94
92
|
test: 'test',
|
|
95
93
|
};
|
|
96
|
-
const event = (0,
|
|
97
|
-
|
|
98
|
-
contextOverrides: {
|
|
94
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
95
|
+
context: {
|
|
99
96
|
snap_in_version_id: '',
|
|
100
97
|
},
|
|
98
|
+
payload: { event_type: eventType },
|
|
101
99
|
});
|
|
102
100
|
fetchStateSpy.mockRejectedValue({
|
|
103
101
|
isAxiosError: true,
|
|
@@ -109,7 +107,6 @@ describe(state_1.State.name, () => {
|
|
|
109
107
|
postStateSpy.mockResolvedValue({
|
|
110
108
|
success: true,
|
|
111
109
|
});
|
|
112
|
-
jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
113
110
|
// Act
|
|
114
111
|
await (0, state_1.createAdapterState)({
|
|
115
112
|
event,
|
|
@@ -119,51 +116,16 @@ describe(state_1.State.name, () => {
|
|
|
119
116
|
const expectedState = Object.assign(Object.assign({}, initialState), state_interfaces_1.extractionSdkState);
|
|
120
117
|
expect(postStateSpy).toHaveBeenCalledWith(expectedState);
|
|
121
118
|
});
|
|
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
119
|
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if initialDomainMapping is not provided for event type %s', async (eventType) => {
|
|
158
120
|
// Arrange
|
|
159
|
-
const event = (0,
|
|
160
|
-
|
|
121
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
122
|
+
payload: { event_type: eventType },
|
|
123
|
+
});
|
|
124
|
+
fetchStateSpy.mockResolvedValue({
|
|
125
|
+
state: JSON.stringify({
|
|
126
|
+
test: 'test',
|
|
127
|
+
}),
|
|
161
128
|
});
|
|
162
|
-
fetchStateSpy.mockResolvedValue(JSON.stringify({
|
|
163
|
-
test: 'test',
|
|
164
|
-
}));
|
|
165
|
-
jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
166
|
-
jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
167
129
|
// Act & Assert
|
|
168
130
|
await expect((0, state_1.createAdapterState)({
|
|
169
131
|
event,
|
|
@@ -174,18 +136,17 @@ describe(state_1.State.name, () => {
|
|
|
174
136
|
});
|
|
175
137
|
it.each(constants_1.STATEFUL_EVENT_TYPES)('should not install IDM if version matches for event type %s', async (eventType) => {
|
|
176
138
|
// Arrange
|
|
177
|
-
const event = (0,
|
|
178
|
-
|
|
179
|
-
contextOverrides: {
|
|
139
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
140
|
+
context: {
|
|
180
141
|
snap_in_version_id: '1.0.0',
|
|
181
142
|
},
|
|
143
|
+
payload: { event_type: eventType },
|
|
182
144
|
});
|
|
183
145
|
const stringifiedState = JSON.stringify({
|
|
184
146
|
test: 'test',
|
|
185
147
|
snapInVersionId: '1.0.0',
|
|
186
148
|
});
|
|
187
|
-
fetchStateSpy.mockResolvedValue(stringifiedState);
|
|
188
|
-
jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
149
|
+
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
189
150
|
// Act & Assert
|
|
190
151
|
await (0, state_1.createAdapterState)({
|
|
191
152
|
event,
|
|
@@ -197,21 +158,20 @@ describe(state_1.State.name, () => {
|
|
|
197
158
|
});
|
|
198
159
|
it.each(constants_1.STATEFUL_EVENT_TYPES)('should install IDM if version does not match for event type %s', async (eventType) => {
|
|
199
160
|
// Arrange
|
|
200
|
-
const event = (0,
|
|
201
|
-
|
|
202
|
-
contextOverrides: {
|
|
161
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
162
|
+
context: {
|
|
203
163
|
snap_in_version_id: '2.0.0',
|
|
204
164
|
},
|
|
165
|
+
payload: { event_type: eventType },
|
|
205
166
|
});
|
|
206
167
|
const stringifiedState = JSON.stringify({
|
|
207
168
|
test: 'test',
|
|
208
169
|
snapInVersionId: '1.0.0',
|
|
209
170
|
});
|
|
210
|
-
fetchStateSpy.mockResolvedValue(stringifiedState);
|
|
171
|
+
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
211
172
|
installInitialDomainMappingSpy.mockResolvedValue({
|
|
212
173
|
success: true,
|
|
213
174
|
});
|
|
214
|
-
jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
215
175
|
// Act
|
|
216
176
|
await (0, state_1.createAdapterState)({
|
|
217
177
|
event,
|
|
@@ -221,4 +181,88 @@ describe(state_1.State.name, () => {
|
|
|
221
181
|
// Assert
|
|
222
182
|
expect(installInitialDomainMappingSpy).toHaveBeenCalled();
|
|
223
183
|
});
|
|
184
|
+
it('should populate extractionScope from API response', async () => {
|
|
185
|
+
// Arrange
|
|
186
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
187
|
+
context: {
|
|
188
|
+
snap_in_version_id: '1.0.0',
|
|
189
|
+
},
|
|
190
|
+
payload: { event_type: extraction_1.EventType.StartExtractingData },
|
|
191
|
+
});
|
|
192
|
+
fetchStateSpy.mockResolvedValue({
|
|
193
|
+
state: JSON.stringify({ snapInVersionId: '1.0.0' }),
|
|
194
|
+
objects: JSON.stringify({
|
|
195
|
+
tasks: { extract: true },
|
|
196
|
+
users: { extract: true },
|
|
197
|
+
}),
|
|
198
|
+
});
|
|
199
|
+
// Act
|
|
200
|
+
const result = await (0, state_1.createAdapterState)({
|
|
201
|
+
event,
|
|
202
|
+
initialState: {},
|
|
203
|
+
initialDomainMapping: {},
|
|
204
|
+
});
|
|
205
|
+
// Assert
|
|
206
|
+
expect(result.extractionScope).toEqual({
|
|
207
|
+
tasks: { extract: true },
|
|
208
|
+
users: { extract: true },
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
it('should have empty extractionScope on 404', async () => {
|
|
212
|
+
// Arrange
|
|
213
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
214
|
+
context: {
|
|
215
|
+
snap_in_version_id: '',
|
|
216
|
+
},
|
|
217
|
+
payload: { event_type: extraction_1.EventType.StartExtractingMetadata },
|
|
218
|
+
});
|
|
219
|
+
fetchStateSpy.mockRejectedValue({
|
|
220
|
+
isAxiosError: true,
|
|
221
|
+
response: { status: 404 },
|
|
222
|
+
});
|
|
223
|
+
installInitialDomainMappingSpy.mockResolvedValue({ success: true });
|
|
224
|
+
postStateSpy.mockResolvedValue({ success: true });
|
|
225
|
+
// Act
|
|
226
|
+
const result = await (0, state_1.createAdapterState)({
|
|
227
|
+
event,
|
|
228
|
+
initialState: {},
|
|
229
|
+
initialDomainMapping: {},
|
|
230
|
+
});
|
|
231
|
+
// Assert
|
|
232
|
+
expect(result.extractionScope).toEqual({});
|
|
233
|
+
});
|
|
234
|
+
it('should have empty extractionScope for stateless events', async () => {
|
|
235
|
+
// Arrange
|
|
236
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
237
|
+
payload: { event_type: extraction_1.EventType.StartExtractingExternalSyncUnits },
|
|
238
|
+
});
|
|
239
|
+
// Act
|
|
240
|
+
const result = await (0, state_1.createAdapterState)({
|
|
241
|
+
event,
|
|
242
|
+
initialState: {},
|
|
243
|
+
initialDomainMapping: {},
|
|
244
|
+
});
|
|
245
|
+
// Assert
|
|
246
|
+
expect(result.extractionScope).toEqual({});
|
|
247
|
+
});
|
|
248
|
+
it('should continue with empty extractionScope when objects field contains invalid JSON', async () => {
|
|
249
|
+
// Arrange
|
|
250
|
+
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
251
|
+
context: { snap_in_version_id: '1.0.0' },
|
|
252
|
+
payload: { event_type: extraction_1.EventType.StartExtractingData },
|
|
253
|
+
});
|
|
254
|
+
fetchStateSpy.mockResolvedValue({
|
|
255
|
+
state: JSON.stringify({ snapInVersionId: '1.0.0' }),
|
|
256
|
+
objects: 'NOT_VALID_JSON',
|
|
257
|
+
});
|
|
258
|
+
// Act
|
|
259
|
+
const result = await (0, state_1.createAdapterState)({
|
|
260
|
+
event,
|
|
261
|
+
initialState: {},
|
|
262
|
+
initialDomainMapping: {},
|
|
263
|
+
});
|
|
264
|
+
// Assert: should not crash, extractionScope is empty (default)
|
|
265
|
+
expect(result.extractionScope).toEqual({});
|
|
266
|
+
expect(processExitSpy).not.toHaveBeenCalled();
|
|
267
|
+
});
|
|
224
268
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.time-value-resolution.test.d.ts","sourceRoot":"","sources":["../../src/state/state.time-value-resolution.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,175 @@
|
|
|
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 state_1 = require("./state");
|
|
7
|
+
describe('State — TimeValue resolution', () => {
|
|
8
|
+
let fetchStateSpy;
|
|
9
|
+
let processExitSpy;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
jest.clearAllMocks();
|
|
12
|
+
jest.restoreAllMocks();
|
|
13
|
+
fetchStateSpy = jest.spyOn(state_1.State.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, state_1.createAdapterState)({
|
|
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, state_1.createAdapterState)({
|
|
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, state_1.createAdapterState)({
|
|
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.state.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, state_1.createAdapterState)({
|
|
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, state_1.createAdapterState)({
|
|
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
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
}
|
package/dist/types/common.d.ts
CHANGED
|
@@ -1,34 +1,9 @@
|
|
|
1
|
-
import { Artifact } from '../uploader/uploader.interfaces';
|
|
2
|
-
/**
|
|
3
|
-
* ErrorLevel is an enum that represents the level of an error.
|
|
4
|
-
* @deprecated
|
|
5
|
-
*/
|
|
6
|
-
export declare enum ErrorLevel {
|
|
7
|
-
Warning = "WARNING",
|
|
8
|
-
Error = "ERROR",
|
|
9
|
-
Info = "INFO"
|
|
10
|
-
}
|
|
11
1
|
/**
|
|
12
2
|
* ErrorRecord is an interface that defines the structure of an error record.
|
|
13
3
|
*/
|
|
14
4
|
export interface ErrorRecord {
|
|
15
5
|
message: string;
|
|
16
6
|
}
|
|
17
|
-
/**
|
|
18
|
-
* LogRecord is an interface that defines the structure of a log record.
|
|
19
|
-
* @deprecated
|
|
20
|
-
*/
|
|
21
|
-
export interface LogRecord {
|
|
22
|
-
level: ErrorLevel;
|
|
23
|
-
message: string;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* AdapterUpdateParams is an interface that defines the structure of the parameters that can be passed to the update adapter.
|
|
27
|
-
* @deprecated
|
|
28
|
-
*/
|
|
29
|
-
export interface AdapterUpdateParams {
|
|
30
|
-
artifact?: Artifact;
|
|
31
|
-
}
|
|
32
7
|
/**
|
|
33
8
|
* InitialDomainMapping is an interface that defines the structure of the initial domain mapping.
|
|
34
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,oBAAY,QAAQ;IAClB,OAAO,YAAY;IACnB,WAAW,gBAAgB;IAC3B,OAAO,YAAY;CACpB"}
|
package/dist/types/common.js
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SyncMode =
|
|
4
|
-
/**
|
|
5
|
-
* ErrorLevel is an enum that represents the level of an error.
|
|
6
|
-
* @deprecated
|
|
7
|
-
*/
|
|
8
|
-
var ErrorLevel;
|
|
9
|
-
(function (ErrorLevel) {
|
|
10
|
-
ErrorLevel["Warning"] = "WARNING";
|
|
11
|
-
ErrorLevel["Error"] = "ERROR";
|
|
12
|
-
ErrorLevel["Info"] = "INFO";
|
|
13
|
-
})(ErrorLevel || (exports.ErrorLevel = ErrorLevel = {}));
|
|
3
|
+
exports.SyncMode = void 0;
|
|
14
4
|
/**
|
|
15
5
|
* SyncMode is an enum that defines the different modes of sync that can be used by the external extractor.
|
|
16
6
|
* It can be either INITIAL, INCREMENTAL or LOADING. INITIAL mode is used for
|