@devrev/ts-adaas 1.13.0 → 1.13.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/common/install-initial-domain-mapping.test.js +1 -1
  2. package/dist/http/axios-client-internal.d.ts.map +1 -1
  3. package/dist/http/axios-client-internal.js +10 -15
  4. package/dist/http/axios-client-internal.test.js +126 -161
  5. package/dist/tests/dummy-connector/data-extraction.d.ts +2 -0
  6. package/dist/tests/dummy-connector/data-extraction.d.ts.map +1 -0
  7. package/dist/tests/dummy-connector/data-extraction.js +43 -0
  8. package/dist/tests/dummy-connector/data-extraction.test.d.ts +2 -0
  9. package/dist/tests/dummy-connector/data-extraction.test.d.ts.map +1 -0
  10. package/dist/tests/dummy-connector/data-extraction.test.js +24 -0
  11. package/dist/tests/dummy-connector/external-sync-units-extraction.d.ts +2 -0
  12. package/dist/tests/dummy-connector/external-sync-units-extraction.d.ts.map +1 -0
  13. package/dist/tests/dummy-connector/external-sync-units-extraction.js +26 -0
  14. package/dist/tests/dummy-connector/external-sync-units-extraction.test.d.ts +2 -0
  15. package/dist/tests/dummy-connector/external-sync-units-extraction.test.d.ts.map +1 -0
  16. package/dist/tests/dummy-connector/external-sync-units-extraction.test.js +21 -0
  17. package/dist/tests/dummy-connector/extraction.d.ts +4 -0
  18. package/dist/tests/dummy-connector/extraction.d.ts.map +1 -0
  19. package/dist/tests/dummy-connector/extraction.js +19 -0
  20. package/dist/tests/dummy-connector/metadata-extraction.d.ts +2 -0
  21. package/dist/tests/dummy-connector/metadata-extraction.d.ts.map +1 -0
  22. package/dist/tests/dummy-connector/metadata-extraction.js +23 -0
  23. package/dist/tests/dummy-connector/metadata-extraction.test.d.ts +2 -0
  24. package/dist/tests/dummy-connector/metadata-extraction.test.d.ts.map +1 -0
  25. package/dist/tests/dummy-connector/metadata-extraction.test.js +54 -0
  26. package/dist/tests/jest.setup.d.ts +3 -0
  27. package/dist/tests/jest.setup.d.ts.map +1 -0
  28. package/dist/tests/jest.setup.js +14 -0
  29. package/dist/tests/mock-server/mock-server.d.ts +79 -0
  30. package/dist/tests/mock-server/mock-server.d.ts.map +1 -0
  31. package/dist/tests/mock-server/mock-server.interfaces.d.ts +53 -0
  32. package/dist/tests/mock-server/mock-server.interfaces.d.ts.map +1 -0
  33. package/dist/tests/mock-server/mock-server.interfaces.js +4 -0
  34. package/dist/tests/mock-server/mock-server.js +237 -0
  35. package/dist/tests/test-helpers.d.ts.map +1 -1
  36. package/dist/tests/test-helpers.js +4 -3
  37. package/dist/tests/timeout-handling/extraction.d.ts.map +1 -1
  38. package/dist/tests/timeout-handling/no-timeout.d.ts +2 -0
  39. package/dist/tests/timeout-handling/no-timeout.d.ts.map +1 -0
  40. package/dist/tests/timeout-handling/{timeout-1.js → no-timeout.js} +1 -1
  41. package/dist/tests/timeout-handling/no-timeout.test.d.ts +2 -0
  42. package/dist/tests/timeout-handling/no-timeout.test.d.ts.map +1 -0
  43. package/dist/tests/timeout-handling/no-timeout.test.js +24 -0
  44. package/dist/tests/timeout-handling/timeout-blocked.d.ts +2 -0
  45. package/dist/tests/timeout-handling/timeout-blocked.d.ts.map +1 -0
  46. package/dist/tests/timeout-handling/timeout-blocked.js +23 -0
  47. package/dist/tests/timeout-handling/timeout-blocked.test.d.ts +2 -0
  48. package/dist/tests/timeout-handling/timeout-blocked.test.d.ts.map +1 -0
  49. package/dist/tests/timeout-handling/timeout-blocked.test.js +25 -0
  50. package/dist/tests/timeout-handling/timeout-graceful.d.ts +2 -0
  51. package/dist/tests/timeout-handling/timeout-graceful.d.ts.map +1 -0
  52. package/dist/tests/timeout-handling/timeout-graceful.js +17 -0
  53. package/dist/tests/timeout-handling/timeout-graceful.test.d.ts +2 -0
  54. package/dist/tests/timeout-handling/timeout-graceful.test.d.ts.map +1 -0
  55. package/dist/tests/timeout-handling/timeout-graceful.test.js +25 -0
  56. package/dist/tests/timeout-handling/timeout-unblocked.d.ts +2 -0
  57. package/dist/tests/timeout-handling/timeout-unblocked.d.ts.map +1 -0
  58. package/dist/tests/timeout-handling/timeout-unblocked.js +26 -0
  59. package/dist/tests/timeout-handling/timeout-unblocked.test.d.ts +2 -0
  60. package/dist/tests/timeout-handling/timeout-unblocked.test.d.ts.map +1 -0
  61. package/dist/tests/timeout-handling/timeout-unblocked.test.js +25 -0
  62. package/dist/uploader/uploader.d.ts +72 -8
  63. package/dist/uploader/uploader.d.ts.map +1 -1
  64. package/dist/uploader/uploader.js +73 -8
  65. package/dist/workers/spawn.d.ts.map +1 -1
  66. package/dist/workers/spawn.js +28 -0
  67. package/dist/workers/worker-adapter.d.ts.map +1 -1
  68. package/dist/workers/worker-adapter.js +7 -4
  69. package/package.json +3 -8
  70. package/dist/tests/mock-server.d.ts +0 -21
  71. package/dist/tests/mock-server.d.ts.map +0 -1
  72. package/dist/tests/mock-server.js +0 -280
  73. package/dist/tests/timeout-handling/timeout-1.d.ts +0 -2
  74. package/dist/tests/timeout-handling/timeout-1.d.ts.map +0 -1
  75. package/dist/tests/timeout-handling/timeout-1.test.d.ts +0 -2
  76. package/dist/tests/timeout-handling/timeout-1.test.d.ts.map +0 -1
  77. package/dist/tests/timeout-handling/timeout-1.test.js +0 -45
  78. package/dist/tests/timeout-handling/timeout-2.d.ts +0 -2
  79. package/dist/tests/timeout-handling/timeout-2.d.ts.map +0 -1
  80. package/dist/tests/timeout-handling/timeout-2.js +0 -44
  81. package/dist/tests/timeout-handling/timeout-2.test.d.ts +0 -2
  82. package/dist/tests/timeout-handling/timeout-2.test.d.ts.map +0 -1
  83. package/dist/tests/timeout-handling/timeout-2.test.js +0 -46
  84. package/dist/tests/timeout-handling/timeout-3a.d.ts +0 -2
  85. package/dist/tests/timeout-handling/timeout-3a.d.ts.map +0 -1
  86. package/dist/tests/timeout-handling/timeout-3a.js +0 -37
  87. package/dist/tests/timeout-handling/timeout-3a.test.d.ts +0 -2
  88. package/dist/tests/timeout-handling/timeout-3a.test.d.ts.map +0 -1
  89. package/dist/tests/timeout-handling/timeout-3a.test.js +0 -46
  90. package/dist/tests/timeout-handling/timeout-3b.d.ts +0 -2
  91. package/dist/tests/timeout-handling/timeout-3b.d.ts.map +0 -1
  92. package/dist/tests/timeout-handling/timeout-3b.js +0 -38
  93. package/dist/tests/timeout-handling/timeout-3b.test.d.ts +0 -2
  94. package/dist/tests/timeout-handling/timeout-3b.test.d.ts.map +0 -1
  95. package/dist/tests/timeout-handling/timeout-3b.test.js +0 -46
@@ -40,7 +40,7 @@ describe(install_initial_domain_mapping_1.installInitialDomainMapping.name, () =
40
40
  },
41
41
  },
42
42
  };
43
- const mockEndpoint = 'test_devrev_endpoint';
43
+ const mockEndpoint = 'http://localhost:3001';
44
44
  const mockToken = 'test_token';
45
45
  // After each test, clear all mocks to prevent state from leaking.
46
46
  afterEach(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"axios-client-internal.d.ts","sourceRoot":"","sources":["../../src/http/axios-client-internal.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,WAAW,+BAEf,CAAC;AAmFH,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"axios-client-internal.d.ts","sourceRoot":"","sources":["../../src/http/axios-client-internal.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,WAAW,+BAEf,CAAC;AAiFH,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -12,27 +12,22 @@ const axiosClient = axios_1.default.create({
12
12
  exports.axiosClient = axiosClient;
13
13
  (0, axios_retry_1.default)(axiosClient, {
14
14
  retries: 5,
15
+ shouldResetTimeout: true,
15
16
  retryDelay: (retryCount, error) => {
16
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
17
- // If the response status is 429, retry after the time specified in the Retry-After header
17
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
18
+ let delay;
18
19
  if (((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 429) {
19
20
  const retryAfter = ((_c = (_b = error.response) === null || _b === void 0 ? void 0 : _b.headers) === null || _c === void 0 ? void 0 : _c['retry-after']) ||
20
21
  ((_e = (_d = error.response) === null || _d === void 0 ? void 0 : _d.headers) === null || _e === void 0 ? void 0 : _e['Retry-After']);
21
- // Since DevRev API returns the retry-after header in seconds and axios-retry expects milliseconds, we need to convert it to milliseconds
22
- const delay = parseInt(retryAfter, 10) * 1000;
23
- const delayInSeconds = Math.round(delay / 1000);
24
- console.warn(`Retrying ${(_f = error.config) === null || _f === void 0 ? void 0 : _f.method} request to ${(_g = error.config) === null || _g === void 0 ? void 0 : _g.url} in ${delayInSeconds}s due to 429 Too Many Requests.`);
25
- return delay;
22
+ delay = parseInt(retryAfter, 10) * 1000;
26
23
  }
27
- // Default exponential backoff algorithm: 1 * 2 ^ retryCount * 1000ms
28
- // This will retry requests after 2, 4, 8, 16 and 32 seconds
29
- const delay = axios_retry_1.default.exponentialDelay(retryCount, error, 1000);
24
+ else {
25
+ delay = axios_retry_1.default.exponentialDelay(retryCount, error, 1000);
26
+ }
27
+ const requestId = ((_g = (_f = error.config) === null || _f === void 0 ? void 0 : _f.headers) === null || _g === void 0 ? void 0 : _g['x-request-id']) ||
28
+ ((_j = (_h = error.config) === null || _h === void 0 ? void 0 : _h.headers) === null || _j === void 0 ? void 0 : _j['X-Request-ID']);
30
29
  const delayInSeconds = Math.round(delay / 1000);
31
- // Handle network errors (no response) vs HTTP errors
32
- const errorDescription = ((_h = error.response) === null || _h === void 0 ? void 0 : _h.status)
33
- ? `${error.response.status} error`
34
- : 'network (no response) error';
35
- console.warn(`Retrying ${(_j = error.config) === null || _j === void 0 ? void 0 : _j.method} request to ${(_k = error.config) === null || _k === void 0 ? void 0 : _k.url} in ${delayInSeconds}s due to ${errorDescription}.`);
30
+ console.warn(`Retrying request to ${(_k = error.config) === null || _k === void 0 ? void 0 : _k.url} in ${delayInSeconds}s due to ${(_m = (_l = error.response) === null || _l === void 0 ? void 0 : _l.status) !== null && _m !== void 0 ? _m : 'unknown'} error.`, Object.assign(Object.assign({ method: (_o = error.config) === null || _o === void 0 ? void 0 : _o.method }, (retryCount && { retryCount })), (requestId && { requestId })));
36
31
  return delay;
37
32
  },
38
33
  retryCondition: (error) => {
@@ -1,189 +1,154 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const axios_mock_adapter_1 = __importDefault(require("axios-mock-adapter"));
3
+ const jest_setup_1 = require("../tests/jest.setup");
7
4
  const axios_client_internal_1 = require("./axios-client-internal");
5
+ jest.setTimeout(60000);
8
6
  describe('Internal Axios Client', () => {
9
- let mockAdapter;
10
- beforeEach(() => {
11
- jest.clearAllMocks();
12
- jest.spyOn(console, 'warn').mockImplementation(() => { });
13
- mockAdapter = new axios_mock_adapter_1.default(axios_client_internal_1.axiosClient);
14
- });
15
- afterEach(() => {
16
- jest.restoreAllMocks();
17
- mockAdapter.restore();
18
- });
19
7
  it('should not retry on 200 response', async () => {
20
- // Arrange
21
- const testUrl = '/test-endpoint';
22
- const responseData = { id: 1, title: 'test title' };
23
- mockAdapter.onGet(testUrl).reply(200, responseData);
24
- // Act
25
- await axios_client_internal_1.axiosClient.get(testUrl);
26
- // Assert
27
- expect(mockAdapter.history.get).toHaveLength(1);
8
+ await axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint');
9
+ expect(jest_setup_1.mockServer.getRequestCount('GET', '/test-endpoint')).toBe(1);
28
10
  });
29
- it('should not retry when response is 400', async () => {
30
- // Arrange
31
- const testUrl = '/test-endpoint';
32
- const errorData = { error: 'Bad Request' };
33
- mockAdapter.onGet(testUrl).reply(400, errorData);
34
- // Act
35
- await expect(axios_client_internal_1.axiosClient.get(testUrl)).rejects.toMatchObject({
36
- response: { status: 400 },
11
+ it('should not retry on 400 response', async () => {
12
+ jest_setup_1.mockServer.setRoute({
13
+ path: '/test-endpoint',
14
+ method: 'GET',
15
+ status: 400,
37
16
  });
38
- // Assert
39
- expect(mockAdapter.history.get).toHaveLength(1);
17
+ await expect(axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint')).rejects.toThrow();
18
+ expect(jest_setup_1.mockServer.getRequestCount('GET', '/test-endpoint')).toBe(1);
40
19
  });
41
20
  // TODO: This test is working as expected, but it takes too long to run. Not
42
21
  // sure if it is good idea to have it.
43
- // it('should retry on 500 response', async () => {
44
- // // Arrange
45
- // const testUrl = '/test-endpoint';
46
- // mockAdapter.onGet(testUrl).reply(500);
47
- // // Act & Assert
48
- // await expect(axiosClient.get(testUrl)).rejects.toMatchObject({
49
- // response: { status: 500 },
22
+ // it('should retry on 500 response', async () => {
23
+ // mockServer.setRoute({
24
+ // path: '/test-endpoint',
25
+ // method: 'GET',
26
+ // status: 200,
27
+ // retry: {
28
+ // failureCount: 4,
29
+ // errorStatus: 500,
30
+ // errorBody: { error: 'Internal Server Error' },
31
+ // },
32
+ // });
33
+ // await axiosClient.get(mockServer.baseUrl + '/test-endpoint');
34
+ // expect(mockServer.getRequestCount('GET', '/test-endpoint')).toBe(5);
50
35
  // });
51
- // // Assert
52
- // expect(mockAdapter.history.get).toHaveLength(6);
53
- // }, 100000);
54
- it('should retry 2 times when response is 500 and then succeed third time when response is 200', async () => {
55
- // Arrange
56
- const testUrl = '/test-endpoint';
57
- const successData = { message: 'success after 2 retries' };
58
- mockAdapter
59
- .onGet(testUrl)
60
- .replyOnce(500)
61
- .onGet(testUrl)
62
- .replyOnce(500)
63
- .onGet(testUrl)
64
- .reply(200, successData);
65
- // Act
66
- const response = await axios_client_internal_1.axiosClient.get(testUrl);
67
- // Assert
68
- expect(response.status).toBe(200);
69
- expect(response.data).toEqual(successData);
70
- expect(mockAdapter.history.get).toHaveLength(3); // 1 initial + 2 retries
71
- }, 10000); // Allow time for 2 retries
72
- it('should retry once after 2 seconds when response is 429 and Retry-After header is valid value', async () => {
73
- // Arrange
74
- const testUrl = '/test-endpoint';
75
- const errorData = { error: 'Too Many Requests' };
76
- const successData = { message: 'success after rate limit retry' };
77
- mockAdapter
78
- .onGet(testUrl)
79
- .replyOnce(429, errorData, {
80
- 'Retry-After': '2',
81
- })
82
- .onGet(testUrl)
83
- .reply(200, successData);
84
- // Act
85
- const response = await axios_client_internal_1.axiosClient.get(testUrl);
86
- // Assert
87
- expect(response.status).toBe(200);
88
- expect(response.data).toEqual(successData);
89
- expect(mockAdapter.history.get).toHaveLength(2); // 1 initial + 1 retry
36
+ it('should retry 2 times on 500 response and then succeed third time when response is 200', async () => {
37
+ jest_setup_1.mockServer.setRoute({
38
+ path: '/test-endpoint',
39
+ method: 'GET',
40
+ status: 200,
41
+ retry: {
42
+ failureCount: 2,
43
+ errorStatus: 500,
44
+ errorBody: { error: 'Internal Server Error' },
45
+ },
46
+ });
47
+ await axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint');
48
+ expect(jest_setup_1.mockServer.getRequestCount('GET', '/test-endpoint')).toBe(3);
49
+ });
50
+ it('should retry once after 3 seconds when response is 429 and Retry-After header is valid value', async () => {
51
+ jest_setup_1.mockServer.setRoute({
52
+ path: '/test-endpoint',
53
+ method: 'GET',
54
+ status: 200,
55
+ retry: {
56
+ failureCount: 1,
57
+ errorStatus: 429,
58
+ headers: {
59
+ 'Retry-After': '3',
60
+ },
61
+ },
62
+ });
63
+ await axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint');
64
+ expect(jest_setup_1.mockServer.getRequestCount('GET', '/test-endpoint')).toBe(2);
90
65
  });
91
- it('should retry once after 2 seconds and measure time between retries when response is 429 and Retry-After header is valid value', async () => {
92
- // Arrange
93
- const testUrl = '/test-endpoint';
94
- const errorData = { error: 'Too Many Requests' };
95
- const successData = { message: 'success after rate limit retry' };
96
- const retryAfterSeconds = 2;
97
- mockAdapter
98
- .onGet(testUrl)
99
- .replyOnce(429, errorData, {
100
- 'Retry-After': retryAfterSeconds.toString(),
101
- })
102
- .onGet(testUrl)
103
- .reply(200, successData);
104
- // Act
66
+ it('should retry once after 3 seconds and measure time between retries when response is 429 and Retry-After header is valid value', async () => {
67
+ jest_setup_1.mockServer.setRoute({
68
+ path: '/test-endpoint',
69
+ method: 'GET',
70
+ status: 200,
71
+ retry: {
72
+ failureCount: 1,
73
+ errorStatus: 429,
74
+ headers: { 'Retry-After': '3' },
75
+ },
76
+ });
105
77
  const startTime = Date.now();
106
- const response = await axios_client_internal_1.axiosClient.get(testUrl);
78
+ await axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint');
107
79
  const endTime = Date.now();
108
- const actualWaitTime = endTime - startTime;
109
- // Assert
110
- expect(response.status).toBe(200);
111
- expect(response.data).toEqual(successData);
112
- expect(mockAdapter.history.get).toHaveLength(2); // 1 initial + 1 retry
113
- const expectedWaitTime = retryAfterSeconds * 1000;
114
- expect(actualWaitTime).toBeGreaterThanOrEqual(expectedWaitTime - 100);
115
- expect(actualWaitTime).toBeLessThan(expectedWaitTime + 1000); // Allow up to 1s extra for processing
80
+ const duration = endTime - startTime;
81
+ const expectedDuration = 3 * 1000;
82
+ expect(duration).toBeGreaterThanOrEqual(expectedDuration);
83
+ expect(duration).toBeLessThan(expectedDuration + 1000);
116
84
  });
117
85
  it('should retry when response is 429 and Retry-After header is lowercase', async () => {
118
- // Arrange
119
- const testUrl = '/test-endpoint';
120
- const errorData = { error: 'Too Many Requests' };
121
- const successData = { message: 'success after rate limit retry' };
122
- mockAdapter
123
- .onGet(testUrl)
124
- .replyOnce(429, errorData, { 'retry-after': '2' })
125
- .onGet(testUrl)
126
- .reply(200, successData);
127
- // Act
128
- const response = await axios_client_internal_1.axiosClient.get(testUrl);
129
- // Assert
130
- expect(response.status).toBe(200);
131
- expect(response.data).toEqual(successData);
132
- expect(mockAdapter.history.get).toHaveLength(2); // 1 initial + 1 retry
86
+ jest_setup_1.mockServer.setRoute({
87
+ path: '/test-endpoint',
88
+ method: 'GET',
89
+ status: 200,
90
+ retry: {
91
+ failureCount: 1,
92
+ errorStatus: 429,
93
+ headers: { 'retry-after': '3' },
94
+ },
95
+ });
96
+ await axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint');
97
+ expect(jest_setup_1.mockServer.getRequestCount('GET', '/test-endpoint')).toBe(2);
133
98
  });
134
99
  it('[edge] should not retry when response is 429 and there is no Retry-After header', async () => {
135
- // Arrange
136
- const testUrl = '/test-endpoint';
137
- const errorData = { error: 'Too Many Requests' };
138
- mockAdapter.onGet(testUrl).reply(429, errorData);
139
- // Act
140
- await expect(axios_client_internal_1.axiosClient.get(testUrl)).rejects.toMatchObject({
141
- response: { status: 429 },
100
+ jest_setup_1.mockServer.setRoute({
101
+ path: '/test-endpoint',
102
+ method: 'GET',
103
+ status: 200,
104
+ retry: {
105
+ failureCount: 1,
106
+ errorStatus: 429,
107
+ },
142
108
  });
143
- // Assert
144
- expect(mockAdapter.history.get).toHaveLength(1);
109
+ await expect(axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint')).rejects.toThrow();
110
+ expect(jest_setup_1.mockServer.getRequestCount('GET', '/test-endpoint')).toBe(1);
145
111
  });
146
112
  it('[edge] should retry when response is 429 and Retry-After header is 0', async () => {
147
- // Arrange
148
- const testUrl = '/test-endpoint';
149
- const errorData = { error: 'Too Many Requests' };
150
- const successData = { message: 'success after rate limit retry' };
151
- mockAdapter
152
- .onGet(testUrl)
153
- .replyOnce(429, errorData, { 'Retry-After': '0' })
154
- .onGet(testUrl)
155
- .reply(200, successData);
156
- // Act
157
- const response = await axios_client_internal_1.axiosClient.get(testUrl);
158
- // Assert
159
- expect(response.status).toBe(200);
160
- expect(response.data).toEqual(successData);
161
- expect(mockAdapter.history.get).toHaveLength(2); // 1 initial + 1 retry
113
+ jest_setup_1.mockServer.setRoute({
114
+ path: '/test-endpoint',
115
+ method: 'GET',
116
+ status: 200,
117
+ retry: {
118
+ failureCount: 1,
119
+ errorStatus: 429,
120
+ headers: { 'Retry-After': '0' },
121
+ },
122
+ });
123
+ await axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint');
124
+ expect(jest_setup_1.mockServer.getRequestCount('GET', '/test-endpoint')).toBe(2);
162
125
  });
163
- it('[edge] should not retry when response is 429 and Retry-After header is negative', async () => {
164
- // Arrange
165
- const testUrl = '/test-endpoint';
166
- const errorData = { error: 'Too Many Requests' };
167
- mockAdapter.onGet(testUrl).reply(429, errorData, { 'Retry-After': '-1' });
168
- // Act
169
- await expect(axios_client_internal_1.axiosClient.get(testUrl)).rejects.toMatchObject({
170
- response: { status: 429 },
126
+ it('[edge] should not retry when response is 429 and Retry-After header is negative value', async () => {
127
+ jest_setup_1.mockServer.setRoute({
128
+ path: '/test-endpoint',
129
+ method: 'GET',
130
+ status: 200,
131
+ retry: {
132
+ failureCount: 1,
133
+ errorStatus: 429,
134
+ headers: { 'Retry-After': '-1' },
135
+ },
171
136
  });
172
- // Assert
173
- expect(mockAdapter.history.get).toHaveLength(1);
137
+ await expect(axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint')).rejects.toThrow();
138
+ expect(jest_setup_1.mockServer.getRequestCount('GET', '/test-endpoint')).toBe(1);
174
139
  });
175
140
  it('[edge] should not retry when response is 429 and Retry-After header is invalid value', async () => {
176
- // Arrange
177
- const testUrl = '/test-endpoint';
178
- const errorData = { error: 'Too Many Requests' };
179
- mockAdapter
180
- .onGet(testUrl)
181
- .reply(429, errorData, { 'Retry-After': 'invalid' });
182
- // Act
183
- await expect(axios_client_internal_1.axiosClient.get(testUrl)).rejects.toMatchObject({
184
- response: { status: 429 },
141
+ jest_setup_1.mockServer.setRoute({
142
+ path: '/test-endpoint',
143
+ method: 'GET',
144
+ status: 200,
145
+ retry: {
146
+ failureCount: 1,
147
+ errorStatus: 429,
148
+ headers: { 'Retry-After': 'invalid' },
149
+ },
185
150
  });
186
- // Assert
187
- expect(mockAdapter.history.get).toHaveLength(1);
151
+ await expect(axios_client_internal_1.axiosClient.get(jest_setup_1.mockServer.baseUrl + '/test-endpoint')).rejects.toThrow();
152
+ expect(jest_setup_1.mockServer.getRequestCount('GET', '/test-endpoint')).toBe(1);
188
153
  });
189
154
  });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data-extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-extraction.d.ts","sourceRoot":"","sources":["../../../src/tests/dummy-connector/data-extraction.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../../index");
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ const normalizeTask = (task) => {
6
+ return {
7
+ id: task.id,
8
+ created_date: task.created_at,
9
+ modified_date: task.updated_at,
10
+ data: {
11
+ name: task.name,
12
+ description: task.description,
13
+ },
14
+ };
15
+ };
16
+ const repos = [
17
+ {
18
+ itemType: 'tasks',
19
+ normalize: normalizeTask,
20
+ },
21
+ ];
22
+ (0, index_1.processTask)({
23
+ task: async ({ adapter }) => {
24
+ var _a;
25
+ adapter.initializeRepos(repos);
26
+ const tasks = [];
27
+ for (let i = 0; i < 10; i++) {
28
+ const task = {
29
+ id: `task_${i}`,
30
+ name: `Task ${i}`,
31
+ description: `Description ${i}`,
32
+ created_at: new Date().toISOString(),
33
+ updated_at: new Date().toISOString(),
34
+ };
35
+ tasks.push(task);
36
+ }
37
+ await ((_a = adapter.getRepo('tasks')) === null || _a === void 0 ? void 0 : _a.push(tasks));
38
+ await adapter.emit(index_1.ExtractorEventType.DataExtractionDone);
39
+ },
40
+ onTimeout: async ({ adapter }) => {
41
+ await adapter.emit(index_1.ExtractorEventType.DataExtractionProgress);
42
+ },
43
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data-extraction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-extraction.test.d.ts","sourceRoot":"","sources":["../../../src/tests/dummy-connector/data-extraction.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
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 extraction_1 = require("../../types/extraction");
7
+ const jest_setup_1 = require("../jest.setup");
8
+ const test_helpers_1 = require("../test-helpers");
9
+ const extraction_2 = __importDefault(require("./extraction"));
10
+ describe('Dummy Connector - Data Extraction', () => {
11
+ let event;
12
+ beforeEach(() => {
13
+ event = (0, test_helpers_1.createEvent)({
14
+ eventType: extraction_1.EventType.StartExtractingData,
15
+ });
16
+ });
17
+ it('should successfully emit data done event when all endpoints return 200', async () => {
18
+ await (0, extraction_2.default)([event], __dirname + '/data-extraction');
19
+ const lastRequest = jest_setup_1.mockServer.getLastRequest();
20
+ expect(lastRequest === null || lastRequest === void 0 ? void 0 : lastRequest.url).toContain('/callback_url');
21
+ expect(lastRequest === null || lastRequest === void 0 ? void 0 : lastRequest.method).toBe('POST');
22
+ expect((lastRequest === null || lastRequest === void 0 ? void 0 : lastRequest.body).event_type).toBe(extraction_1.ExtractorEventType.DataExtractionDone);
23
+ });
24
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=external-sync-units-extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-sync-units-extraction.d.ts","sourceRoot":"","sources":["../../../src/tests/dummy-connector/external-sync-units-extraction.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../../index");
4
+ (0, index_1.processTask)({
5
+ task: async ({ adapter }) => {
6
+ const dummyExternalSyncUnits = [
7
+ {
8
+ id: '1',
9
+ name: 'Dummy External Sync Unit',
10
+ description: 'This is a dummy external sync unit',
11
+ item_count: 10,
12
+ item_type: 'dummy',
13
+ },
14
+ ];
15
+ await adapter.emit(index_1.ExtractorEventType.ExternalSyncUnitExtractionDone, {
16
+ external_sync_units: dummyExternalSyncUnits,
17
+ });
18
+ },
19
+ onTimeout: async ({ adapter }) => {
20
+ await adapter.emit(index_1.ExtractorEventType.ExternalSyncUnitExtractionError, {
21
+ error: {
22
+ message: 'Failed to extract external sync units. Lambda timeout.',
23
+ },
24
+ });
25
+ },
26
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=external-sync-units-extraction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-sync-units-extraction.test.d.ts","sourceRoot":"","sources":["../../../src/tests/dummy-connector/external-sync-units-extraction.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
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 extraction_1 = require("../../types/extraction");
7
+ const jest_setup_1 = require("../jest.setup");
8
+ const test_helpers_1 = require("../test-helpers");
9
+ const extraction_2 = __importDefault(require("./extraction"));
10
+ describe('Dummy Connector - External Sync Units Extraction', () => {
11
+ it('should successfully emit external sync units done event when all endpoints return 200', async () => {
12
+ const event = (0, test_helpers_1.createEvent)({
13
+ eventType: extraction_1.EventType.StartExtractingExternalSyncUnits,
14
+ });
15
+ await (0, extraction_2.default)([event], __dirname + '/external-sync-units-extraction');
16
+ const lastRequest = jest_setup_1.mockServer.getLastRequest();
17
+ expect(lastRequest === null || lastRequest === void 0 ? void 0 : lastRequest.url).toContain('/callback_url');
18
+ expect(lastRequest === null || lastRequest === void 0 ? void 0 : lastRequest.method).toBe('POST');
19
+ expect((lastRequest === null || lastRequest === void 0 ? void 0 : lastRequest.body).event_type).toBe(extraction_1.ExtractorEventType.ExternalSyncUnitExtractionDone);
20
+ });
21
+ });
@@ -0,0 +1,4 @@
1
+ import { AirdropEvent } from '../../index';
2
+ declare const run: (events: AirdropEvent[], workerPath: string) => Promise<void>;
3
+ export default run;
4
+ //# sourceMappingURL=extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction.d.ts","sourceRoot":"","sources":["../../../src/tests/dummy-connector/extraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAS,MAAM,aAAa,CAAC;AASlD,QAAA,MAAM,GAAG,GAAU,QAAQ,YAAY,EAAE,EAAE,YAAY,MAAM,kBAY5D,CAAC;AAEF,eAAe,GAAG,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../../index");
4
+ const initialState = {};
5
+ const initialDomainMapping = {};
6
+ const run = async (events, workerPath) => {
7
+ for (const event of events) {
8
+ await (0, index_1.spawn)({
9
+ event,
10
+ initialState,
11
+ workerPath,
12
+ initialDomainMapping,
13
+ options: {
14
+ isLocalDevelopment: true,
15
+ },
16
+ });
17
+ }
18
+ };
19
+ exports.default = run;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metadata-extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-extraction.d.ts","sourceRoot":"","sources":["../../../src/tests/dummy-connector/metadata-extraction.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("../../index");
4
+ const repos = [
5
+ {
6
+ itemType: 'external_domain_metadata',
7
+ },
8
+ ];
9
+ (0, index_1.processTask)({
10
+ task: async ({ adapter }) => {
11
+ var _a;
12
+ adapter.initializeRepos(repos);
13
+ const externalDomainMetadata = {};
14
+ await ((_a = adapter
15
+ .getRepo('external_domain_metadata')) === null || _a === void 0 ? void 0 : _a.push([externalDomainMetadata]));
16
+ await adapter.emit(index_1.ExtractorEventType.MetadataExtractionDone);
17
+ },
18
+ onTimeout: async ({ adapter }) => {
19
+ await adapter.emit(index_1.ExtractorEventType.MetadataExtractionError, {
20
+ error: { message: 'Failed to extract metadata. Lambda timeout.' },
21
+ });
22
+ },
23
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metadata-extraction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-extraction.test.d.ts","sourceRoot":"","sources":["../../../src/tests/dummy-connector/metadata-extraction.test.ts"],"names":[],"mappings":""}