@tetrascience-npm/ts-connectors-sdk 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/CHANGELOG.md +201 -0
  2. package/LICENSE +201 -0
  3. package/README.md +123 -0
  4. package/dist/api-tests/configuration.test.d.ts +2 -0
  5. package/dist/api-tests/configuration.test.d.ts.map +1 -0
  6. package/dist/api-tests/configuration.test.js +49 -0
  7. package/dist/api-tests/configuration.test.js.map +1 -0
  8. package/dist/api-tests/connector-lifetime.test.d.ts +2 -0
  9. package/dist/api-tests/connector-lifetime.test.d.ts.map +1 -0
  10. package/dist/api-tests/connector-lifetime.test.js +64 -0
  11. package/dist/api-tests/connector-lifetime.test.js.map +1 -0
  12. package/dist/api-tests/connector-shutdown.test.d.ts +2 -0
  13. package/dist/api-tests/connector-shutdown.test.d.ts.map +1 -0
  14. package/dist/api-tests/connector-shutdown.test.js +76 -0
  15. package/dist/api-tests/connector-shutdown.test.js.map +1 -0
  16. package/dist/api-tests/fixture/assertions.d.ts +4 -0
  17. package/dist/api-tests/fixture/assertions.d.ts.map +1 -0
  18. package/dist/api-tests/fixture/assertions.js +8 -0
  19. package/dist/api-tests/fixture/assertions.js.map +1 -0
  20. package/dist/api-tests/fixture/config.d.ts +65 -0
  21. package/dist/api-tests/fixture/config.d.ts.map +1 -0
  22. package/dist/api-tests/fixture/config.js +24 -0
  23. package/dist/api-tests/fixture/config.js.map +1 -0
  24. package/dist/api-tests/fixture/connector-api.d.ts +126 -0
  25. package/dist/api-tests/fixture/connector-api.d.ts.map +1 -0
  26. package/dist/api-tests/fixture/connector-api.js +151 -0
  27. package/dist/api-tests/fixture/connector-api.js.map +1 -0
  28. package/dist/api-tests/fixture/connectors/test-connector.d.ts +39 -0
  29. package/dist/api-tests/fixture/connectors/test-connector.d.ts.map +1 -0
  30. package/dist/api-tests/fixture/connectors/test-connector.js +188 -0
  31. package/dist/api-tests/fixture/connectors/test-connector.js.map +1 -0
  32. package/dist/api-tests/fixture/create-http-client.d.ts +6 -0
  33. package/dist/api-tests/fixture/create-http-client.d.ts.map +1 -0
  34. package/dist/api-tests/fixture/create-http-client.js +52 -0
  35. package/dist/api-tests/fixture/create-http-client.js.map +1 -0
  36. package/dist/api-tests/fixture/fixture.d.ts +34 -0
  37. package/dist/api-tests/fixture/fixture.d.ts.map +1 -0
  38. package/dist/api-tests/fixture/fixture.js +62 -0
  39. package/dist/api-tests/fixture/fixture.js.map +1 -0
  40. package/dist/api-tests/fixture/test-connector-factory.d.ts +21 -0
  41. package/dist/api-tests/fixture/test-connector-factory.d.ts.map +1 -0
  42. package/dist/api-tests/fixture/test-connector-factory.js +78 -0
  43. package/dist/api-tests/fixture/test-connector-factory.js.map +1 -0
  44. package/dist/api-tests/label-validation.test.d.ts +2 -0
  45. package/dist/api-tests/label-validation.test.d.ts.map +1 -0
  46. package/dist/api-tests/label-validation.test.js +158 -0
  47. package/dist/api-tests/label-validation.test.js.map +1 -0
  48. package/dist/api-tests/standalone-cloudwatch-logs.test.d.ts +2 -0
  49. package/dist/api-tests/standalone-cloudwatch-logs.test.d.ts.map +1 -0
  50. package/dist/api-tests/standalone-cloudwatch-logs.test.js +32 -0
  51. package/dist/api-tests/standalone-cloudwatch-logs.test.js.map +1 -0
  52. package/dist/api-tests/user-agent.test.d.ts +2 -0
  53. package/dist/api-tests/user-agent.test.d.ts.map +1 -0
  54. package/dist/api-tests/user-agent.test.js +191 -0
  55. package/dist/api-tests/user-agent.test.js.map +1 -0
  56. package/dist/src/api.d.ts +353 -0
  57. package/dist/src/api.d.ts.map +1 -0
  58. package/dist/src/api.js +278 -0
  59. package/dist/src/api.js.map +1 -0
  60. package/dist/src/auth/auth-token-provider.d.ts +7 -0
  61. package/dist/src/auth/auth-token-provider.d.ts.map +1 -0
  62. package/dist/src/auth/auth-token-provider.js +3 -0
  63. package/dist/src/auth/auth-token-provider.js.map +1 -0
  64. package/dist/src/auth/aws-client-provider.d.ts +11 -0
  65. package/dist/src/auth/aws-client-provider.d.ts.map +1 -0
  66. package/dist/src/auth/aws-client-provider.js +3 -0
  67. package/dist/src/auth/aws-client-provider.js.map +1 -0
  68. package/dist/src/auth/aws-env-client-provider.d.ts +20 -0
  69. package/dist/src/auth/aws-env-client-provider.d.ts.map +1 -0
  70. package/dist/src/auth/aws-env-client-provider.js +69 -0
  71. package/dist/src/auth/aws-env-client-provider.js.map +1 -0
  72. package/dist/src/auth/aws-refresh-client-provider.d.ts +26 -0
  73. package/dist/src/auth/aws-refresh-client-provider.d.ts.map +1 -0
  74. package/dist/src/auth/aws-refresh-client-provider.js +111 -0
  75. package/dist/src/auth/aws-refresh-client-provider.js.map +1 -0
  76. package/dist/src/auth/aws-secret-auth-token-provider.d.ts +9 -0
  77. package/dist/src/auth/aws-secret-auth-token-provider.d.ts.map +1 -0
  78. package/dist/src/auth/aws-secret-auth-token-provider.js +58 -0
  79. package/dist/src/auth/aws-secret-auth-token-provider.js.map +1 -0
  80. package/dist/src/auth/index.d.ts +7 -0
  81. package/dist/src/auth/index.d.ts.map +1 -0
  82. package/dist/src/auth/index.js +23 -0
  83. package/dist/src/auth/index.js.map +1 -0
  84. package/dist/src/auth/predefined-auth-token-provider.d.ts +7 -0
  85. package/dist/src/auth/predefined-auth-token-provider.d.ts.map +1 -0
  86. package/dist/src/auth/predefined-auth-token-provider.js +24 -0
  87. package/dist/src/auth/predefined-auth-token-provider.js.map +1 -0
  88. package/dist/src/auth/user-supplied-auth-token-provider.d.ts +7 -0
  89. package/dist/src/auth/user-supplied-auth-token-provider.d.ts.map +1 -0
  90. package/dist/src/auth/user-supplied-auth-token-provider.js +24 -0
  91. package/dist/src/auth/user-supplied-auth-token-provider.js.map +1 -0
  92. package/dist/src/certificates.d.ts +6 -0
  93. package/dist/src/certificates.d.ts.map +1 -0
  94. package/dist/src/certificates.js +88 -0
  95. package/dist/src/certificates.js.map +1 -0
  96. package/dist/src/checksums.d.ts +50 -0
  97. package/dist/src/checksums.d.ts.map +1 -0
  98. package/dist/src/checksums.js +32 -0
  99. package/dist/src/checksums.js.map +1 -0
  100. package/dist/src/config.d.ts +41 -0
  101. package/dist/src/config.d.ts.map +1 -0
  102. package/dist/src/config.js +35 -0
  103. package/dist/src/config.js.map +1 -0
  104. package/dist/src/connector.d.ts +101 -0
  105. package/dist/src/connector.d.ts.map +1 -0
  106. package/dist/src/connector.js +374 -0
  107. package/dist/src/connector.js.map +1 -0
  108. package/dist/src/get-log-event-size.d.ts +3 -0
  109. package/dist/src/get-log-event-size.d.ts.map +1 -0
  110. package/dist/src/get-log-event-size.js +9 -0
  111. package/dist/src/get-log-event-size.js.map +1 -0
  112. package/dist/src/https-proxy-agent.d.ts +15 -0
  113. package/dist/src/https-proxy-agent.d.ts.map +1 -0
  114. package/dist/src/https-proxy-agent.js +31 -0
  115. package/dist/src/https-proxy-agent.js.map +1 -0
  116. package/dist/src/index.d.ts +9 -0
  117. package/dist/src/index.d.ts.map +1 -0
  118. package/dist/src/index.js +25 -0
  119. package/dist/src/index.js.map +1 -0
  120. package/dist/src/logger.d.ts +60 -0
  121. package/dist/src/logger.d.ts.map +1 -0
  122. package/dist/src/logger.js +284 -0
  123. package/dist/src/logger.js.map +1 -0
  124. package/dist/src/manifest.d.ts +4 -0
  125. package/dist/src/manifest.d.ts.map +1 -0
  126. package/dist/src/manifest.js +30 -0
  127. package/dist/src/manifest.js.map +1 -0
  128. package/dist/src/metrics.d.ts +59 -0
  129. package/dist/src/metrics.d.ts.map +1 -0
  130. package/dist/src/metrics.js +125 -0
  131. package/dist/src/metrics.js.map +1 -0
  132. package/dist/src/polling-connector.d.ts +50 -0
  133. package/dist/src/polling-connector.d.ts.map +1 -0
  134. package/dist/src/polling-connector.js +169 -0
  135. package/dist/src/polling-connector.js.map +1 -0
  136. package/dist/src/schemas.d.ts +77 -0
  137. package/dist/src/schemas.d.ts.map +1 -0
  138. package/dist/src/schemas.js +80 -0
  139. package/dist/src/schemas.js.map +1 -0
  140. package/dist/src/streamToString.d.ts +3 -0
  141. package/dist/src/streamToString.d.ts.map +1 -0
  142. package/dist/src/streamToString.js +25 -0
  143. package/dist/src/streamToString.js.map +1 -0
  144. package/dist/src/tdp-client.d.ts +307 -0
  145. package/dist/src/tdp-client.d.ts.map +1 -0
  146. package/dist/src/tdp-client.js +823 -0
  147. package/dist/src/tdp-client.js.map +1 -0
  148. package/dist/src/to-cloudwatch-log-event.d.ts +4 -0
  149. package/dist/src/to-cloudwatch-log-event.d.ts.map +1 -0
  150. package/dist/src/to-cloudwatch-log-event.js +10 -0
  151. package/dist/src/to-cloudwatch-log-event.js.map +1 -0
  152. package/dist/src/types.d.ts +57 -0
  153. package/dist/src/types.d.ts.map +1 -0
  154. package/dist/src/types.js +30 -0
  155. package/dist/src/types.js.map +1 -0
  156. package/dist/src/utils.d.ts +10 -0
  157. package/dist/src/utils.d.ts.map +1 -0
  158. package/dist/src/utils.js +20 -0
  159. package/dist/src/utils.js.map +1 -0
  160. package/dist/test/api.test.d.ts +2 -0
  161. package/dist/test/api.test.d.ts.map +1 -0
  162. package/dist/test/api.test.js +245 -0
  163. package/dist/test/api.test.js.map +1 -0
  164. package/dist/test/auth/aws-env-client-provider.test.d.ts +2 -0
  165. package/dist/test/auth/aws-env-client-provider.test.d.ts.map +1 -0
  166. package/dist/test/auth/aws-env-client-provider.test.js +56 -0
  167. package/dist/test/auth/aws-env-client-provider.test.js.map +1 -0
  168. package/dist/test/auth/aws-refresh-client-provider.test.d.ts +2 -0
  169. package/dist/test/auth/aws-refresh-client-provider.test.d.ts.map +1 -0
  170. package/dist/test/auth/aws-refresh-client-provider.test.js +118 -0
  171. package/dist/test/auth/aws-refresh-client-provider.test.js.map +1 -0
  172. package/dist/test/auth/aws-secret-auth-token-provider.test.d.ts +2 -0
  173. package/dist/test/auth/aws-secret-auth-token-provider.test.d.ts.map +1 -0
  174. package/dist/test/auth/aws-secret-auth-token-provider.test.js +74 -0
  175. package/dist/test/auth/aws-secret-auth-token-provider.test.js.map +1 -0
  176. package/dist/test/auth/predefined-auth-token-provider.test.d.ts +2 -0
  177. package/dist/test/auth/predefined-auth-token-provider.test.d.ts.map +1 -0
  178. package/dist/test/auth/predefined-auth-token-provider.test.js +24 -0
  179. package/dist/test/auth/predefined-auth-token-provider.test.js.map +1 -0
  180. package/dist/test/auth/user-supplied-auth-token-provider.test.d.ts +2 -0
  181. package/dist/test/auth/user-supplied-auth-token-provider.test.d.ts.map +1 -0
  182. package/dist/test/auth/user-supplied-auth-token-provider.test.js +24 -0
  183. package/dist/test/auth/user-supplied-auth-token-provider.test.js.map +1 -0
  184. package/dist/test/certificates.test.d.ts +2 -0
  185. package/dist/test/certificates.test.d.ts.map +1 -0
  186. package/dist/test/certificates.test.js +83 -0
  187. package/dist/test/certificates.test.js.map +1 -0
  188. package/dist/test/checksums.test.d.ts +2 -0
  189. package/dist/test/checksums.test.d.ts.map +1 -0
  190. package/dist/test/checksums.test.js +29 -0
  191. package/dist/test/checksums.test.js.map +1 -0
  192. package/dist/test/connector-shutdown.test.d.ts +2 -0
  193. package/dist/test/connector-shutdown.test.d.ts.map +1 -0
  194. package/dist/test/connector-shutdown.test.js +145 -0
  195. package/dist/test/connector-shutdown.test.js.map +1 -0
  196. package/dist/test/connector.test.d.ts +2 -0
  197. package/dist/test/connector.test.d.ts.map +1 -0
  198. package/dist/test/connector.test.js +286 -0
  199. package/dist/test/connector.test.js.map +1 -0
  200. package/dist/test/healthstatus-enum-values.test.d.ts +2 -0
  201. package/dist/test/healthstatus-enum-values.test.d.ts.map +1 -0
  202. package/dist/test/healthstatus-enum-values.test.js +18 -0
  203. package/dist/test/healthstatus-enum-values.test.js.map +1 -0
  204. package/dist/test/logger.test.d.ts +2 -0
  205. package/dist/test/logger.test.d.ts.map +1 -0
  206. package/dist/test/logger.test.js +301 -0
  207. package/dist/test/logger.test.js.map +1 -0
  208. package/dist/test/manifest.test.d.ts +2 -0
  209. package/dist/test/manifest.test.d.ts.map +1 -0
  210. package/dist/test/manifest.test.js +55 -0
  211. package/dist/test/manifest.test.js.map +1 -0
  212. package/dist/test/polling-connector.test.d.ts +2 -0
  213. package/dist/test/polling-connector.test.d.ts.map +1 -0
  214. package/dist/test/polling-connector.test.js +170 -0
  215. package/dist/test/polling-connector.test.js.map +1 -0
  216. package/dist/test/schemas.test.d.ts +2 -0
  217. package/dist/test/schemas.test.d.ts.map +1 -0
  218. package/dist/test/schemas.test.js +211 -0
  219. package/dist/test/schemas.test.js.map +1 -0
  220. package/dist/test/tdp-client.test.d.ts +2 -0
  221. package/dist/test/tdp-client.test.d.ts.map +1 -0
  222. package/dist/test/tdp-client.test.js +1204 -0
  223. package/dist/test/tdp-client.test.js.map +1 -0
  224. package/dist/test/test-connector/index.d.ts +2 -0
  225. package/dist/test/test-connector/index.d.ts.map +1 -0
  226. package/dist/test/test-connector/index.js +23 -0
  227. package/dist/test/test-connector/index.js.map +1 -0
  228. package/dist/test/test-connector/test-connector.d.ts +7 -0
  229. package/dist/test/test-connector/test-connector.d.ts.map +1 -0
  230. package/dist/test/test-connector/test-connector.js +32 -0
  231. package/dist/test/test-connector/test-connector.js.map +1 -0
  232. package/dist/test/test-utils/api-mocks.d.ts +6 -0
  233. package/dist/test/test-utils/api-mocks.d.ts.map +1 -0
  234. package/dist/test/test-utils/api-mocks.js +19 -0
  235. package/dist/test/test-utils/api-mocks.js.map +1 -0
  236. package/dist/test/test-utils/aws-mocks.d.ts +8 -0
  237. package/dist/test/test-utils/aws-mocks.d.ts.map +1 -0
  238. package/dist/test/test-utils/aws-mocks.js +39 -0
  239. package/dist/test/test-utils/aws-mocks.js.map +1 -0
  240. package/dist/test/test-utils/regex.d.ts +2 -0
  241. package/dist/test/test-utils/regex.d.ts.map +1 -0
  242. package/dist/test/test-utils/regex.js +7 -0
  243. package/dist/test/test-utils/regex.js.map +1 -0
  244. package/dist/test/utils.test.d.ts +2 -0
  245. package/dist/test/utils.test.d.ts.map +1 -0
  246. package/dist/test/utils.test.js +17 -0
  247. package/dist/test/utils.test.js.map +1 -0
  248. package/dist/tsconfig.tsbuildinfo +1 -0
  249. package/dist/vitest.config.d.mts +3 -0
  250. package/dist/vitest.config.d.mts.map +1 -0
  251. package/dist/vitest.config.mjs +20 -0
  252. package/dist/vitest.config.mjs.map +1 -0
  253. package/package.json +133 -0
@@ -0,0 +1,1204 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ require("aws-sdk-client-mock-jest");
39
+ const s3 = __importStar(require("@aws-sdk/client-s3"));
40
+ const sqs = __importStar(require("@aws-sdk/client-sqs"));
41
+ const ssm = __importStar(require("@aws-sdk/client-ssm"));
42
+ const lib_storage_1 = require("@aws-sdk/lib-storage");
43
+ const node_http_handler_1 = require("@smithy/node-http-handler");
44
+ const aws_sdk_client_mock_1 = require("aws-sdk-client-mock");
45
+ const axios_1 = __importDefault(require("axios"));
46
+ const ts_lib_shared_schema_1 = require("ts-lib-shared-schema");
47
+ const uuid_1 = require("uuid");
48
+ const manifest = __importStar(require("../src/manifest"));
49
+ const src_1 = require("../src");
50
+ const sqsClientMock = (0, aws_sdk_client_mock_1.mockClient)(sqs.SQSClient);
51
+ const s3ClientMock = (0, aws_sdk_client_mock_1.mockClient)(s3.S3Client);
52
+ const ssmClientMock = (0, aws_sdk_client_mock_1.mockClient)(ssm.SSMClient);
53
+ const mockUploadFileRequestSchemaParse = jest.fn();
54
+ jest.mock('axios');
55
+ jest.mock('../src/schemas', () => ({
56
+ UploadFileRequestSchema: {
57
+ parse: (...args) => mockUploadFileRequestSchemaParse(...args),
58
+ },
59
+ }));
60
+ const mockUploadDone = jest.fn().mockResolvedValue({ versionId: 'someVersion' });
61
+ jest.mock('@aws-sdk/lib-storage', () => ({
62
+ Upload: jest.fn().mockImplementation(() => ({
63
+ done: mockUploadDone,
64
+ })),
65
+ }));
66
+ describe('TDPClient', () => {
67
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
68
+ beforeEach(() => {
69
+ sqsClientMock.reset();
70
+ s3ClientMock.reset();
71
+ mockUploadFileRequestSchemaParse.mockReset();
72
+ axiosCreateSpy.mockReset();
73
+ axiosCreateSpy.mockImplementation(() => {
74
+ return {
75
+ defaults: { headers: { common: {} } },
76
+ request: jest.fn().mockImplementation((request) => __awaiter(void 0, void 0, void 0, function* () {
77
+ if (request.url == '/v1/data-acquisition/connectors/some-target-id')
78
+ return {
79
+ data: {
80
+ artifact: {
81
+ namespace: 'test-namespace',
82
+ slug: 'test-slug',
83
+ version: 'v1.0.0',
84
+ },
85
+ },
86
+ };
87
+ if (request.url == '/v1/certificates?includeContent=true&includeDisabled=false') {
88
+ console.log('returning empty array');
89
+ return [];
90
+ }
91
+ return { data: {} };
92
+ })),
93
+ };
94
+ });
95
+ });
96
+ afterEach(() => {
97
+ jest.restoreAllMocks();
98
+ });
99
+ describe('constructor', () => {
100
+ it('should be able to create TDP client', () => {
101
+ const tdpClient = new src_1.TDPClient();
102
+ expect(tdpClient).not.toBeNull();
103
+ });
104
+ });
105
+ describe('init', () => {
106
+ const envBackup = process.env;
107
+ beforeEach(() => {
108
+ process.env = Object.assign({}, envBackup);
109
+ sqsClientMock.reset();
110
+ ssmClientMock.reset();
111
+ sqsClientMock.on(sqs.ReceiveMessageCommand).resolves({ Messages: [] });
112
+ ssmClientMock.on(ssm.GetParameterCommand).resolves({ Parameter: { Value: 'jwt-secret' } });
113
+ });
114
+ it('should initialize AWSRefreshClientProvider and UserSuppliedAuthTokenProvider when CONNECTOR_TOKEN is set', () => __awaiter(void 0, void 0, void 0, function* () {
115
+ process.env.CONNECTOR_TOKEN = 'test-connector-token';
116
+ process.env.SKIP_CLOUDWATCH = 'true';
117
+ const tdpClient = new src_1.TDPClient({
118
+ orgSlug: 'test-org',
119
+ awsRegion: 'us-west-2',
120
+ connectorId: 'test-connector-id',
121
+ tdpEndpoint: 'https://tdp.example.com',
122
+ });
123
+ const createProxyNodeHttpHandlerSpy = jest
124
+ .spyOn(tdpClient, 'createProxyNodeHttpHandler')
125
+ .mockReturnValue(new node_http_handler_1.NodeHttpHandler());
126
+ yield tdpClient.init();
127
+ expect(createProxyNodeHttpHandlerSpy).toHaveBeenCalled();
128
+ expect(tdpClient['awsClientProvider']).toBeInstanceOf(src_1.AwsRefreshClientProvider);
129
+ expect(tdpClient['authTokenProvider']).toBeInstanceOf(src_1.UserSuppliedAuthTokenProvider);
130
+ expect(tdpClient['authTokenProvider']).toEqual(expect.objectContaining({
131
+ token: 'test-connector-token',
132
+ }));
133
+ }));
134
+ it('should verify TLS by default', () => __awaiter(void 0, void 0, void 0, function* () {
135
+ // arrange
136
+ const tdpClient = new src_1.TDPClient();
137
+ jest.spyOn(tdpClient, 'createProxyAgentsForBaseUrl');
138
+ // act
139
+ yield tdpClient.init();
140
+ // assert
141
+ expect(tdpClient.createProxyAgentsForBaseUrl).toHaveBeenCalledWith(expect.objectContaining({
142
+ rejectUnauthorized: true,
143
+ }));
144
+ }));
145
+ it('should ignore TLS errors if overridden by env variables', () => __awaiter(void 0, void 0, void 0, function* () {
146
+ // arrange
147
+ const tdpClient = new src_1.TDPClient();
148
+ jest.spyOn(tdpClient, 'createProxyAgentsForBaseUrl');
149
+ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
150
+ // act
151
+ yield tdpClient.init();
152
+ // assert
153
+ expect(tdpClient.createProxyAgentsForBaseUrl).toHaveBeenCalledWith(expect.objectContaining({
154
+ rejectUnauthorized: false,
155
+ }));
156
+ }));
157
+ it('should create patched https agent by default', () => __awaiter(void 0, void 0, void 0, function* () {
158
+ // arrange
159
+ const tdpClient = new src_1.TDPClient({
160
+ tdpEndpoint: 'https://tdp.com',
161
+ });
162
+ jest.spyOn(tdpClient, 'createProxyAgentsForBaseUrl');
163
+ process.env.HTTP_PROXY = 'http://some-proxy:8080';
164
+ process.env.HTTPS_PROXY = 'http://some-proxy:8080';
165
+ // act
166
+ yield tdpClient.init();
167
+ // assert
168
+ expect(tdpClient.createProxyAgentsForBaseUrl).toHaveReturnedWith(expect.objectContaining({
169
+ httpsAgent: expect.not.objectContaining({
170
+ // this fields is present in hpagent but not ir https-proxy-agent agent
171
+ proxyRequestOptions: expect.any(Object),
172
+ }),
173
+ }));
174
+ }));
175
+ it('should create hpagent https agent if overridden', () => __awaiter(void 0, void 0, void 0, function* () {
176
+ // arrange
177
+ const tdpClient = new src_1.TDPClient({
178
+ tdpEndpoint: 'https://tdp.com',
179
+ });
180
+ jest.spyOn(tdpClient, 'createProxyAgentsForBaseUrl');
181
+ process.env.HTTP_PROXY = 'http://some-proxy:8080';
182
+ process.env.HTTPS_PROXY = 'http://some-proxy:8080';
183
+ process.env.HTTPS_AGENT = 'hpagent';
184
+ // act
185
+ yield tdpClient.init();
186
+ // assert
187
+ expect(tdpClient.createProxyAgentsForBaseUrl).toHaveReturnedWith(expect.objectContaining({
188
+ httpsAgent: expect.objectContaining({
189
+ // this fields is present in hpagent
190
+ proxyRequestOptions: expect.any(Object),
191
+ }),
192
+ }));
193
+ }));
194
+ it('should override http request timeout from envvar', () => __awaiter(void 0, void 0, void 0, function* () {
195
+ process.env.HTTP_REQUEST_TIMEOUT_MS = '1234';
196
+ const tdpClient = new src_1.TDPClient();
197
+ expect(tdpClient.config.httpRequestTimeout).toEqual(1234);
198
+ }));
199
+ it('should ignore http request timeout envvar if not valid number', () => __awaiter(void 0, void 0, void 0, function* () {
200
+ process.env.HTTP_REQUEST_TIMEOUT_MS = 'not a number';
201
+ const tdpClient = new src_1.TDPClient();
202
+ expect(tdpClient.config.httpRequestTimeout).toEqual(10000);
203
+ }));
204
+ it('should override http request timeout from options', () => __awaiter(void 0, void 0, void 0, function* () {
205
+ process.env.HTTP_REQUEST_TIMEOUT_MS = '1234';
206
+ const tdpClient = new src_1.TDPClient({ httpRequestTimeout: 5678 });
207
+ expect(tdpClient.config.httpRequestTimeout).toEqual(5678);
208
+ }));
209
+ it('should call createAxiosInstance with timeout settings', () => __awaiter(void 0, void 0, void 0, function* () {
210
+ // arrange
211
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
212
+ const tdpClient = new src_1.TDPClient({ httpRequestTimeout: 5678 });
213
+ yield tdpClient.init();
214
+ // act
215
+ tdpClient.createAxiosInstance({ baseUrl: 'https://example.com', includeAdditionalCertificates: false });
216
+ // assert
217
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ timeout: 5678 }));
218
+ }));
219
+ it('should call createAxiosInstanceWithCertificatesAndHeaders with timeout settings', () => __awaiter(void 0, void 0, void 0, function* () {
220
+ // arrange
221
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
222
+ const tdpClient = new src_1.TDPClient({ httpRequestTimeout: 9876 });
223
+ yield tdpClient.init();
224
+ tdpClient.createProxyAgentsForBaseUrl = jest.fn().mockReturnValue({});
225
+ // act
226
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders('https://example.com', 'orgSlug', 'jwt', []);
227
+ // assert
228
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ timeout: 9876 }));
229
+ }));
230
+ });
231
+ describe('commands', () => {
232
+ it("should process commands that aren't expired", () => __awaiter(void 0, void 0, void 0, function* () {
233
+ const commandBody = {
234
+ commandId: 'some-command-id',
235
+ targetId: 'some-target-id',
236
+ status: src_1.CommandStatus.REJECTED,
237
+ createdAt: new Date('2023-01-01T00:00:00Z'),
238
+ expiresAt: new Date(),
239
+ action: 'Some.Command.Action',
240
+ body: {},
241
+ };
242
+ commandBody.expiresAt.setDate(commandBody.expiresAt.getDate() + 1);
243
+ sqsClientMock
244
+ .on(sqs.ReceiveMessageCommand)
245
+ .callsFakeOnce(() => {
246
+ return {
247
+ Messages: [
248
+ {
249
+ MessageId: 'some-message-id',
250
+ ReceiptHandle: 'some-receipt-handle',
251
+ Body: JSON.stringify(commandBody),
252
+ },
253
+ ],
254
+ };
255
+ })
256
+ .callsFake(() => {
257
+ return { Messages: [] };
258
+ });
259
+ let resolveSendResponsePromise;
260
+ const sendResponsePromise = new Promise((resolve) => (resolveSendResponsePromise = resolve));
261
+ sqsClientMock.on(sqs.SendMessageCommand).callsFakeOnce((command) => {
262
+ expect(command.QueueUrl).toBe(undefined);
263
+ const body = JSON.parse(command.MessageBody);
264
+ expect(body.commandId).toBe(commandBody.commandId);
265
+ expect(body.status).toBe(src_1.CommandStatus.PROCESSING);
266
+ expect(body.targetId).toBe(commandBody.targetId);
267
+ expect(body.createdAt).not.toBeFalsy();
268
+ resolveSendResponsePromise();
269
+ });
270
+ let resolveDeleteMessagePromise;
271
+ const deleteMessagePromise = new Promise((resolve) => (resolveDeleteMessagePromise = resolve));
272
+ sqsClientMock.on(sqs.DeleteMessageCommand).callsFakeOnce((command) => {
273
+ expect(command.ReceiptHandle).toBe('some-receipt-handle');
274
+ resolveDeleteMessagePromise();
275
+ });
276
+ const tdpClient = new src_1.TDPClient({
277
+ orgSlug: 'tetrascience',
278
+ awsRegion: 'us-east-2',
279
+ connectorId: 'some-target-id',
280
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
281
+ });
282
+ const commandListener = jest.fn();
283
+ tdpClient.commands.addListener('command', commandListener);
284
+ const actionListener = jest.fn();
285
+ tdpClient.commands.addListener('Some.Command.Action', actionListener);
286
+ yield tdpClient.init();
287
+ tdpClient.startCommandsListener();
288
+ yield sendResponsePromise;
289
+ yield deleteMessagePromise;
290
+ tdpClient.stopCommandsListener();
291
+ expect(sqsClientMock).toReceiveCommandTimes(sqs.SendMessageCommand, 1);
292
+ expect(sqsClientMock).toReceiveCommandTimes(sqs.DeleteMessageCommand, 1);
293
+ // Round trip through JSON converts the dates to strings, which matches what happens in real execution
294
+ expect(commandListener).toHaveBeenCalledWith(expect.objectContaining(JSON.parse(JSON.stringify(commandBody))));
295
+ expect(actionListener).toHaveBeenCalledWith(expect.objectContaining(JSON.parse(JSON.stringify(commandBody))));
296
+ }));
297
+ it('should reject expired commands', () => __awaiter(void 0, void 0, void 0, function* () {
298
+ const commandBody = {
299
+ commandId: 'some-command-id',
300
+ targetId: 'some-target-id',
301
+ status: src_1.CommandStatus.REJECTED,
302
+ createdAt: new Date('2023-01-01T00:00:00Z'),
303
+ expiresAt: new Date('2023-01-02T00:00:00Z'),
304
+ action: 'Some.Command.Action',
305
+ body: {},
306
+ };
307
+ sqsClientMock
308
+ .on(sqs.ReceiveMessageCommand)
309
+ .callsFakeOnce(() => {
310
+ return {
311
+ Messages: [
312
+ {
313
+ MessageId: 'some-message-id',
314
+ ReceiptHandle: 'some-receipt-handle',
315
+ Body: JSON.stringify(commandBody),
316
+ },
317
+ ],
318
+ };
319
+ })
320
+ .callsFake(() => {
321
+ return { Messages: [] };
322
+ });
323
+ let resolveSendResponsePromise;
324
+ const sendResponsePromise = new Promise((resolve) => (resolveSendResponsePromise = resolve));
325
+ sqsClientMock.on(sqs.SendMessageCommand).callsFakeOnce((command) => {
326
+ expect(command.QueueUrl).toBe(undefined);
327
+ const body = JSON.parse(command.MessageBody);
328
+ expect(body.commandId).toBe(commandBody.commandId);
329
+ expect(body.status).toBe(src_1.CommandStatus.REJECTED);
330
+ expect(body.targetId).toBe(commandBody.targetId);
331
+ expect(body.createdAt).not.toBeFalsy();
332
+ resolveSendResponsePromise();
333
+ });
334
+ let resolveDeleteMessagePromise;
335
+ const deleteMessagePromise = new Promise((resolve) => (resolveDeleteMessagePromise = resolve));
336
+ sqsClientMock.on(sqs.DeleteMessageCommand).callsFakeOnce((command) => {
337
+ expect(command.ReceiptHandle).toBe('some-receipt-handle');
338
+ resolveDeleteMessagePromise();
339
+ });
340
+ const tdpClient = new src_1.TDPClient({
341
+ orgSlug: 'tetrascience',
342
+ awsRegion: 'us-east-2',
343
+ connectorId: 'some-target-id',
344
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
345
+ });
346
+ yield tdpClient.init();
347
+ tdpClient.startCommandsListener();
348
+ yield sendResponsePromise;
349
+ yield deleteMessagePromise;
350
+ tdpClient.stopCommandsListener();
351
+ expect(sqsClientMock).toReceiveCommandTimes(sqs.SendMessageCommand, 1);
352
+ expect(sqsClientMock).toReceiveCommandTimes(sqs.DeleteMessageCommand, 1);
353
+ }));
354
+ it('should handle command with body delivered via url', () => __awaiter(void 0, void 0, void 0, function* () {
355
+ // arrange
356
+ const bodyUrl = 'https://aws.s3/body-url.json';
357
+ const responseBodyUploadUrl = 'https://aws.s3/response-body-url.json';
358
+ const commandBody = {
359
+ commandId: 'some-command-id',
360
+ targetId: 'some-target-id',
361
+ createdAt: new Date('2023-01-01T00:00:00Z'),
362
+ expiresAt: new Date(),
363
+ action: 'Some.Command.Action',
364
+ bodyDelivery: 'referenced',
365
+ bodyUrl,
366
+ responseBodyUploadUrl,
367
+ };
368
+ commandBody.expiresAt.setDate(commandBody.expiresAt.getDate() + 1);
369
+ sqsClientMock
370
+ .on(sqs.ReceiveMessageCommand)
371
+ .callsFakeOnce(() => {
372
+ return {
373
+ Messages: [
374
+ {
375
+ MessageId: 'some-message-id',
376
+ ReceiptHandle: 'some-receipt-handle',
377
+ Body: JSON.stringify(commandBody),
378
+ },
379
+ ],
380
+ };
381
+ })
382
+ .callsFake(() => {
383
+ return { Messages: [] };
384
+ });
385
+ let resolveSendResponsePromise;
386
+ const sendResponsePromise = new Promise((resolve) => (resolveSendResponsePromise = resolve));
387
+ sqsClientMock.on(sqs.SendMessageCommand).callsFakeOnce(() => resolveSendResponsePromise());
388
+ let resolveDeleteMessagePromise;
389
+ const deleteMessagePromise = new Promise((resolve) => (resolveDeleteMessagePromise = resolve));
390
+ sqsClientMock.on(sqs.DeleteMessageCommand).callsFakeOnce(() => resolveDeleteMessagePromise());
391
+ const tdpClient = new src_1.TDPClient({
392
+ orgSlug: 'tetrascience',
393
+ awsRegion: 'us-east-2',
394
+ connectorId: 'some-target-id',
395
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
396
+ });
397
+ jest.spyOn(tdpClient, 'createAxiosInstance').mockImplementation(() => ({
398
+ get: jest.fn().mockResolvedValue({ data: { foo: 'bar' } }),
399
+ put: jest.fn().mockResolvedValue({}),
400
+ }));
401
+ const receiveCommandBody = new Promise((resolve) => {
402
+ tdpClient.commands.addListener('command', (command) => {
403
+ resolve(command.body);
404
+ });
405
+ });
406
+ // act
407
+ yield tdpClient.init();
408
+ tdpClient.startCommandsListener();
409
+ yield sendResponsePromise;
410
+ yield deleteMessagePromise;
411
+ const receivedCommandBody = yield receiveCommandBody;
412
+ tdpClient.stopCommandsListener();
413
+ // assert
414
+ expect(receivedCommandBody).toEqual({ foo: 'bar' });
415
+ }));
416
+ it('should be able to respond to command via pre-signed url', () => __awaiter(void 0, void 0, void 0, function* () {
417
+ // arrange
418
+ const responseBodyUploadUrl = 'https://aws.s3/response-body-url.json';
419
+ const commandBody = {
420
+ commandId: 'some-command-id',
421
+ targetId: 'some-target-id',
422
+ createdAt: new Date('2023-01-01T00:00:00Z'),
423
+ expiresAt: new Date(),
424
+ action: 'Some.Command.Action',
425
+ bodyDelivery: 'embedded',
426
+ body: {},
427
+ responseBodyUploadUrl,
428
+ };
429
+ commandBody.expiresAt.setDate(commandBody.expiresAt.getDate() + 1);
430
+ sqsClientMock
431
+ .on(sqs.ReceiveMessageCommand)
432
+ .callsFakeOnce(() => {
433
+ return {
434
+ Messages: [
435
+ {
436
+ MessageId: 'some-message-id',
437
+ ReceiptHandle: 'some-receipt-handle',
438
+ Body: JSON.stringify(commandBody),
439
+ },
440
+ ],
441
+ };
442
+ })
443
+ .callsFake(() => {
444
+ return { Messages: [] };
445
+ });
446
+ let resolveSendResponsePromise;
447
+ const sendResponsePromise = new Promise((resolve) => (resolveSendResponsePromise = resolve));
448
+ sqsClientMock.on(sqs.SendMessageCommand).callsFakeOnce(() => resolveSendResponsePromise());
449
+ let resolveDeleteMessagePromise;
450
+ const deleteMessagePromise = new Promise((resolve) => (resolveDeleteMessagePromise = resolve));
451
+ sqsClientMock.on(sqs.DeleteMessageCommand).callsFakeOnce(() => resolveDeleteMessagePromise());
452
+ const tdpClient = new src_1.TDPClient({
453
+ orgSlug: 'tetrascience',
454
+ awsRegion: 'us-east-2',
455
+ connectorId: 'some-target-id',
456
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
457
+ });
458
+ const axiosPutMock = jest.fn().mockResolvedValue({});
459
+ jest.spyOn(tdpClient, 'createAxiosInstance').mockImplementation(() => ({
460
+ put: axiosPutMock,
461
+ }));
462
+ const receiveCommandBody = new Promise((resolve) => {
463
+ tdpClient.commands.addListener('command', (command) => {
464
+ tdpClient.sendCommandResponse(Object.assign(Object.assign({}, command), { body: {
465
+ // This will make command to be delivered via pre-signed url
466
+ large: 'x'.repeat(300 * 1024),
467
+ } }));
468
+ resolve(command.body);
469
+ });
470
+ });
471
+ // act
472
+ yield tdpClient.init();
473
+ tdpClient.startCommandsListener();
474
+ yield sendResponsePromise;
475
+ yield deleteMessagePromise;
476
+ yield receiveCommandBody;
477
+ tdpClient.stopCommandsListener();
478
+ // assert
479
+ expect(axiosPutMock).toHaveBeenCalledWith('/response-body-url.json', expect.any(Buffer), {
480
+ headers: { 'Content-Encoding': 'gzip', 'Content-Type': 'application/json' },
481
+ });
482
+ expect(sqsClientMock).toReceiveCommandWith(sqs.SendMessageCommand, {
483
+ MessageBody: expect.stringContaining('"referenced"'),
484
+ });
485
+ }));
486
+ });
487
+ describe('calculatePartSize', () => {
488
+ let tdpClient;
489
+ beforeEach(() => {
490
+ jest.clearAllMocks();
491
+ tdpClient = new src_1.TDPClient({
492
+ orgSlug: 'tetrascience',
493
+ awsRegion: 'us-east-2',
494
+ connectorId: 'some-target-id',
495
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
496
+ });
497
+ });
498
+ const defaultSize = 1024 * 1024 * 5;
499
+ const maxParts = 10000;
500
+ it('returns default size when object size is undefined', () => {
501
+ expect(tdpClient.calculatePartSize()).toEqual(defaultSize);
502
+ });
503
+ it('returns default size when object size is negative', () => {
504
+ expect(tdpClient.calculatePartSize(1024 * 1024 * maxParts * -10)).toEqual(defaultSize);
505
+ });
506
+ it('returns default size when object size does not require bigger part', () => {
507
+ expect(tdpClient.calculatePartSize(1024 * 1024 * 5 * (maxParts - 1))).toEqual(defaultSize);
508
+ });
509
+ it('returns large enough part size to transfer big object within max number of parts', () => {
510
+ const objectSize = 1024 * 1024 * 6 * maxParts;
511
+ const partSize = tdpClient.calculatePartSize(objectSize);
512
+ expect(partSize * maxParts).toBeGreaterThanOrEqual(objectSize);
513
+ });
514
+ it('returns an integer value, whether default or otherwise', () => {
515
+ const sizeDefault = tdpClient.calculatePartSize();
516
+ const sizeNondefault = tdpClient.calculatePartSize(1024 * 1024 * 6 * maxParts);
517
+ expect(Number.isInteger(sizeDefault)).toBe(true);
518
+ expect(Number.isInteger(sizeNondefault)).toBe(true);
519
+ });
520
+ });
521
+ describe('uploadFile', () => {
522
+ beforeEach(() => {
523
+ jest.clearAllMocks();
524
+ });
525
+ it('should set connector metadata', () => __awaiter(void 0, void 0, void 0, function* () {
526
+ const tdpClient = new src_1.TDPClient({
527
+ orgSlug: 'tetrascience',
528
+ awsRegion: 'us-east-2',
529
+ connectorId: 'some-target-id',
530
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
531
+ });
532
+ yield tdpClient.init();
533
+ yield tdpClient.uploadFile({
534
+ content: '',
535
+ filepath: '/',
536
+ });
537
+ const uploadCallArguments = lib_storage_1.Upload.mock.calls[0][0];
538
+ const metadata = uploadCallArguments.params.Metadata;
539
+ expect(metadata[ts_lib_shared_schema_1.S3MetadataFields.CONNECTOR_NAMESPACE]).toEqual('test-namespace');
540
+ expect(metadata[ts_lib_shared_schema_1.S3MetadataFields.CONNECTOR_SLUG]).toEqual('test-slug');
541
+ expect(metadata[ts_lib_shared_schema_1.S3MetadataFields.CONNECTOR_VERSION]).toEqual('v1.0.0');
542
+ expect(mockUploadDone).toHaveBeenCalledTimes(1);
543
+ }));
544
+ it('should set content type and encoding when available', () => __awaiter(void 0, void 0, void 0, function* () {
545
+ const tdpClient = new src_1.TDPClient({
546
+ orgSlug: 'tetrascience',
547
+ awsRegion: 'us-east-2',
548
+ connectorId: 'some-target-id',
549
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
550
+ });
551
+ yield tdpClient.init();
552
+ yield tdpClient.uploadFile({
553
+ content: '',
554
+ filepath: '/',
555
+ contentEncoding: 'gzip',
556
+ contentType: 'application/json',
557
+ });
558
+ const uploadCallArguments = lib_storage_1.Upload.mock.calls[0][0];
559
+ expect(uploadCallArguments.params.ContentType).toEqual('application/json');
560
+ expect(uploadCallArguments.params.ContentEncoding).toEqual('gzip');
561
+ expect(mockUploadDone).toHaveBeenCalledTimes(1);
562
+ }));
563
+ it('should fail when destinationId is present and is the empty string', () => __awaiter(void 0, void 0, void 0, function* () {
564
+ const tdpClient = new src_1.TDPClient({
565
+ orgSlug: 'tetrascience',
566
+ awsRegion: 'us-east-2',
567
+ connectorId: 'some-target-id',
568
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
569
+ });
570
+ yield tdpClient.init();
571
+ expect.assertions(1);
572
+ try {
573
+ yield tdpClient.uploadFile({
574
+ content: '',
575
+ filepath: '/',
576
+ destinationId: '',
577
+ });
578
+ }
579
+ catch (error) {
580
+ expect(error.message).toMatch('destinationId must be a valid UUID');
581
+ }
582
+ }));
583
+ it('should fail when destinationId is present and not a UUID at all', () => __awaiter(void 0, void 0, void 0, function* () {
584
+ const tdpClient = new src_1.TDPClient({
585
+ orgSlug: 'tetrascience',
586
+ awsRegion: 'us-east-2',
587
+ connectorId: 'some-target-id',
588
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
589
+ });
590
+ yield tdpClient.init();
591
+ expect.assertions(1);
592
+ try {
593
+ yield tdpClient.uploadFile({
594
+ content: '',
595
+ filepath: '/',
596
+ destinationId: 'not-a-uuid',
597
+ });
598
+ }
599
+ catch (error) {
600
+ expect(error.message).toMatch('destinationId must be a valid UUID');
601
+ }
602
+ }));
603
+ it('should fail when destinationId is present and is a non-v4 UUID', () => __awaiter(void 0, void 0, void 0, function* () {
604
+ const tdpClient = new src_1.TDPClient({
605
+ orgSlug: 'tetrascience',
606
+ awsRegion: 'us-east-2',
607
+ connectorId: 'some-target-id',
608
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
609
+ });
610
+ yield tdpClient.init();
611
+ expect.assertions(1);
612
+ try {
613
+ yield tdpClient.uploadFile({
614
+ content: '',
615
+ filepath: '/',
616
+ destinationId: (0, uuid_1.v1)(),
617
+ });
618
+ }
619
+ catch (error) {
620
+ expect(error.message).toMatch('destinationId must be a UUIDv4');
621
+ }
622
+ }));
623
+ it('should use a valid destinationId as part of file key when present', () => __awaiter(void 0, void 0, void 0, function* () {
624
+ const connectorId = 'some-target-id';
625
+ const tdpClient = new src_1.TDPClient({
626
+ orgSlug: 'tetrascience',
627
+ awsRegion: 'us-east-2',
628
+ connectorId,
629
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
630
+ });
631
+ yield tdpClient.init();
632
+ const destinationId = (0, uuid_1.v4)();
633
+ yield tdpClient.uploadFile({
634
+ content: '',
635
+ filepath: '/',
636
+ destinationId,
637
+ labels: [{ name: 'test-label', value: 'cool-value' }],
638
+ });
639
+ const uploadCallArguments = lib_storage_1.Upload.mock.calls[0][0];
640
+ expect(uploadCallArguments.params.Key).toMatch(destinationId);
641
+ expect(uploadCallArguments.params.Key).not.toMatch(connectorId);
642
+ expect(mockUploadDone).toHaveBeenCalledTimes(1);
643
+ // also check label file
644
+ expect(s3ClientMock).toHaveReceivedCommandWith(s3.PutObjectCommand, {
645
+ Key: expect.stringContaining(destinationId),
646
+ });
647
+ expect(s3ClientMock).not.toHaveReceivedCommandWith(s3.PutObjectCommand, {
648
+ Key: expect.stringContaining(connectorId),
649
+ });
650
+ }));
651
+ it('should not set content type or encoding when missing', () => __awaiter(void 0, void 0, void 0, function* () {
652
+ const tdpClient = new src_1.TDPClient({
653
+ orgSlug: 'tetrascience',
654
+ awsRegion: 'us-east-2',
655
+ connectorId: 'some-target-id',
656
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
657
+ });
658
+ yield tdpClient.init();
659
+ yield tdpClient.uploadFile({
660
+ content: '',
661
+ filepath: '/',
662
+ });
663
+ const uploadCallArguments = lib_storage_1.Upload.mock.calls[0][0];
664
+ expect(uploadCallArguments.params.ContentType).toBeUndefined();
665
+ expect(uploadCallArguments.params.ContentEncoding).toBeUndefined();
666
+ expect(mockUploadDone).toHaveBeenCalledTimes(1);
667
+ }));
668
+ it('should set part size for Upload', () => __awaiter(void 0, void 0, void 0, function* () {
669
+ const tdpClient = new src_1.TDPClient({
670
+ orgSlug: 'tetrascience',
671
+ awsRegion: 'us-east-2',
672
+ connectorId: 'some-target-id',
673
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
674
+ });
675
+ yield tdpClient.init();
676
+ yield tdpClient.uploadFile({
677
+ content: '',
678
+ filepath: '/',
679
+ contentEncoding: 'gzip',
680
+ contentType: 'application/json',
681
+ });
682
+ const uploadCallArguments = lib_storage_1.Upload.mock.calls[0][0];
683
+ expect(uploadCallArguments.partSize).toEqual(tdpClient.calculatePartSize());
684
+ expect(mockUploadDone).toHaveBeenCalledTimes(1);
685
+ }));
686
+ it('should pass abortController from request to Upload', () => __awaiter(void 0, void 0, void 0, function* () {
687
+ const tdpClient = new src_1.TDPClient({
688
+ orgSlug: 'tetrascience',
689
+ awsRegion: 'us-east-2',
690
+ connectorId: 'some-target-id',
691
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
692
+ });
693
+ yield tdpClient.init();
694
+ const abortController = new AbortController();
695
+ yield tdpClient.uploadFile({
696
+ content: '',
697
+ filepath: '/',
698
+ contentEncoding: 'gzip',
699
+ contentType: 'application/json',
700
+ abortController,
701
+ });
702
+ const uploadCallArguments = lib_storage_1.Upload.mock.calls[0][0];
703
+ expect(uploadCallArguments.abortController).toEqual(abortController);
704
+ expect(mockUploadDone).toHaveBeenCalledTimes(1);
705
+ }));
706
+ it('should validate against zod schema, throwing if strictMtlValidation is true', () => __awaiter(void 0, void 0, void 0, function* () {
707
+ const tdpClient = new src_1.TDPClient({
708
+ orgSlug: 'tetrascience',
709
+ awsRegion: 'us-east-2',
710
+ connectorId: 'some-target-id',
711
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
712
+ });
713
+ yield tdpClient.init();
714
+ mockUploadFileRequestSchemaParse.mockImplementation(() => {
715
+ throw new Error('');
716
+ });
717
+ yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
718
+ return yield tdpClient.uploadFile({
719
+ content: '',
720
+ filepath: '/',
721
+ }, true);
722
+ })).rejects.toThrow();
723
+ }));
724
+ it('should not validate against zod schema, logging a warning if strictMtlValidation is false', () => __awaiter(void 0, void 0, void 0, function* () {
725
+ const tdpClient = new src_1.TDPClient({
726
+ orgSlug: 'tetrascience',
727
+ awsRegion: 'us-east-2',
728
+ connectorId: 'some-target-id',
729
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
730
+ });
731
+ yield tdpClient.init();
732
+ jest.spyOn(tdpClient.logger, 'warn');
733
+ mockUploadFileRequestSchemaParse.mockImplementation(() => {
734
+ throw new Error('');
735
+ });
736
+ expect(() => __awaiter(void 0, void 0, void 0, function* () {
737
+ return yield tdpClient.uploadFile({
738
+ content: '',
739
+ filepath: '/',
740
+ }, false);
741
+ })).not.toThrow();
742
+ expect(tdpClient.logger.warn).toHaveBeenCalledWith('Invalid MTL on upload file request', expect.objectContaining({}));
743
+ }));
744
+ });
745
+ describe('transform-trace-metadata', () => {
746
+ it('returns metadata with the ts_ prefix', () => {
747
+ const metadata = {
748
+ 'some-key': 'some-value',
749
+ 'some-other-key': 'some-other-value',
750
+ };
751
+ const testClient = new src_1.TDPClient({
752
+ orgSlug: 'tetrascience',
753
+ awsRegion: 'us-east-2',
754
+ connectorId: 'some-target-id',
755
+ });
756
+ const transformedMetadata = testClient.transformTraceMetadata(metadata);
757
+ expect(transformedMetadata).toEqual({
758
+ 'ts_some-key': 'some-value',
759
+ 'ts_some-other-key': 'some-other-value',
760
+ });
761
+ });
762
+ });
763
+ describe('createProxyAgentsForBaseUrl', () => {
764
+ afterAll(() => {
765
+ jest.clearAllMocks();
766
+ });
767
+ it('should call this.certificates getter if includeAdditionalCertificates===true', () => __awaiter(void 0, void 0, void 0, function* () {
768
+ const client = new src_1.TDPClient();
769
+ const spy = jest
770
+ .spyOn(client, 'certificates', 'get')
771
+ .mockImplementation(() => [{ name: 'foo', id: 'bar', certificate: 'baz' }]);
772
+ client.assertProxyInitialized = jest.fn(() => true);
773
+ client.logger = { debug: jest.fn(), info: jest.fn() };
774
+ client.createProxyAgentsForBaseUrl({
775
+ baseUrl: 'https://example.com',
776
+ });
777
+ expect(spy).toHaveBeenCalled();
778
+ expect(client.logger.info).toHaveBeenCalledWith('Using 1 organization certificates', {
779
+ certificates: [
780
+ {
781
+ id: 'bar',
782
+ name: 'foo',
783
+ },
784
+ ],
785
+ });
786
+ }));
787
+ it('should not call this.certificates getter if includeAdditionalCertificates is array', () => __awaiter(void 0, void 0, void 0, function* () {
788
+ const client = new src_1.TDPClient();
789
+ const spy = jest.spyOn(client, 'certificates', 'get').mockImplementation(() => []);
790
+ client.assertProxyInitialized = jest.fn(() => true);
791
+ client.logger = { debug: jest.fn(), info: jest.fn() };
792
+ client.createProxyAgentsForBaseUrl({
793
+ baseUrl: 'https://example.com',
794
+ includeAdditionalCertificates: [],
795
+ });
796
+ expect(spy).not.toHaveBeenCalled();
797
+ expect(client.logger.info).not.toHaveBeenCalledWith('Using 1 organization certificates', {
798
+ certificates: [
799
+ {
800
+ id: 'bar',
801
+ name: 'foo',
802
+ },
803
+ ],
804
+ });
805
+ }));
806
+ });
807
+ describe('sanitizeConfig', () => {
808
+ it("removes risky keys like headers, data, and auth from the config's axios config", () => {
809
+ const config = {
810
+ headers: {
811
+ Authorization: 'some-token',
812
+ },
813
+ data: {
814
+ some: 'data',
815
+ },
816
+ auth: {
817
+ username: 'some-username',
818
+ password: 'some-password',
819
+ },
820
+ url: 'some-url',
821
+ timeout: 1000,
822
+ method: 'GET',
823
+ };
824
+ const sanitizedConfig = (0, src_1.sanitizeConfig)(config);
825
+ expect(sanitizedConfig).toEqual({
826
+ url: 'some-url',
827
+ timeout: 1000,
828
+ method: 'GET',
829
+ });
830
+ });
831
+ });
832
+ describe('API commands', () => {
833
+ describe('API Request', () => {
834
+ it('should send requestId to the API', () => __awaiter(void 0, void 0, void 0, function* () {
835
+ var _a, _b;
836
+ const tdpClient = new src_1.TDPClient({
837
+ orgSlug: 'tetrascience',
838
+ awsRegion: 'us-east-2',
839
+ connectorId: 'some-target-id',
840
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
841
+ });
842
+ yield tdpClient.init();
843
+ tdpClient.api = {
844
+ v1: {
845
+ getConnectorById: jest.fn().mockResolvedValue({}),
846
+ },
847
+ };
848
+ const requestId = (0, uuid_1.v4)();
849
+ yield tdpClient.getConnector({}, {
850
+ requestId,
851
+ });
852
+ expect((_b = (_a = tdpClient === null || tdpClient === void 0 ? void 0 : tdpClient.api) === null || _a === void 0 ? void 0 : _a.v1) === null || _b === void 0 ? void 0 : _b.getConnectorById).toHaveBeenCalledWith('some-target-id', expect.anything(), {
853
+ requestId,
854
+ });
855
+ }));
856
+ //getCertificates
857
+ describe('getCertificates', () => {
858
+ it('should call axios with correct parameters and return expected result', () => __awaiter(void 0, void 0, void 0, function* () {
859
+ const tdpClient = new src_1.TDPClient({
860
+ orgSlug: 'tetrascience',
861
+ awsRegion: 'us-east-2',
862
+ connectorId: 'some-target-id',
863
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
864
+ });
865
+ yield tdpClient.init();
866
+ const axiosRequest = jest.fn().mockResolvedValue({});
867
+ tdpClient.api.axios.request = axiosRequest;
868
+ const requestId = (0, uuid_1.v4)();
869
+ yield tdpClient.getCertificates({ requestId });
870
+ expect(axiosRequest).toBeCalledTimes(1);
871
+ expect(axiosRequest).toHaveBeenCalledWith({
872
+ headers: { 'ts-request-id': requestId },
873
+ url: '/v1/certificates?includeContent=true&includeDisabled=false',
874
+ data: undefined,
875
+ method: 'GET',
876
+ });
877
+ }));
878
+ });
879
+ describe('getConfig', () => {
880
+ it('should call axios with correct parameters and return expected result', () => __awaiter(void 0, void 0, void 0, function* () {
881
+ const tdpClient = new src_1.TDPClient({
882
+ orgSlug: 'tetrascience',
883
+ awsRegion: 'us-east-2',
884
+ connectorId: 'some-target-id',
885
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
886
+ });
887
+ yield tdpClient.init();
888
+ const axiosRequest = jest.fn().mockResolvedValue({});
889
+ tdpClient.api.axios.request = axiosRequest;
890
+ const requestId = (0, uuid_1.v4)();
891
+ yield tdpClient.getConfig({ version: '123' }, { requestId });
892
+ expect(axiosRequest).toBeCalledTimes(1);
893
+ }));
894
+ });
895
+ describe('getConnector', () => {
896
+ it('should generate requestId if missing', () => __awaiter(void 0, void 0, void 0, function* () {
897
+ const tdpClient = new src_1.TDPClient({
898
+ orgSlug: 'tetrascience',
899
+ awsRegion: 'us-east-2',
900
+ connectorId: 'some-target-id',
901
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
902
+ });
903
+ yield tdpClient.init();
904
+ const axiosRequest = jest.fn().mockResolvedValue({});
905
+ tdpClient.api.axios.request = axiosRequest;
906
+ yield tdpClient.getConnector({}, {});
907
+ expect(axiosRequest).toBeCalledTimes(1);
908
+ const requestId = axiosRequest.mock.calls[0][0].headers['ts-request-id'];
909
+ expect(requestId.length).toEqual(36);
910
+ expect(axiosRequest).toHaveBeenCalledWith({
911
+ headers: { 'ts-request-id': requestId },
912
+ url: '/v1/data-acquisition/connectors/some-target-id',
913
+ data: undefined,
914
+ params: { resolveSecrets: undefined, include: undefined },
915
+ method: 'GET',
916
+ });
917
+ }));
918
+ });
919
+ describe('reloadConnector', () => {
920
+ it('should call axios with correct parameters and return expected result', () => __awaiter(void 0, void 0, void 0, function* () {
921
+ const tdpClient = new src_1.TDPClient({
922
+ orgSlug: 'tetrascience',
923
+ awsRegion: 'us-east-2',
924
+ connectorId: 'some-target-id',
925
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
926
+ });
927
+ yield tdpClient.init();
928
+ const axiosRequest = jest.fn().mockResolvedValue({});
929
+ tdpClient.api.axios.request = axiosRequest;
930
+ const requestId = (0, uuid_1.v4)();
931
+ yield tdpClient.reloadConnector({ requestId });
932
+ // once for the connector details
933
+ // once for get connector data for the user agent function
934
+ expect(axiosRequest).toBeCalledTimes(2);
935
+ expect(axiosRequest).toHaveBeenCalledWith({
936
+ headers: { 'ts-request-id': requestId },
937
+ url: '/v1/data-acquisition/connectors/some-target-id',
938
+ data: undefined,
939
+ params: {
940
+ include: 'config,artifact',
941
+ resolveSecrets: true,
942
+ },
943
+ method: 'GET',
944
+ });
945
+ }));
946
+ });
947
+ describe('getValue', () => {
948
+ it('should call axios with correct parameters and return expected result', () => __awaiter(void 0, void 0, void 0, function* () {
949
+ var _a, _b;
950
+ const tdpClient = new src_1.TDPClient({
951
+ orgSlug: 'tetrascience',
952
+ awsRegion: 'us-east-2',
953
+ connectorId: 'some-target-id',
954
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
955
+ });
956
+ yield tdpClient.init();
957
+ tdpClient.api = {
958
+ v1: {
959
+ getConnectorData: jest.fn((_, query) => __awaiter(void 0, void 0, void 0, function* () {
960
+ return {
961
+ values: query.keys.map((key) => ({
962
+ key,
963
+ value: 'some-value',
964
+ })),
965
+ };
966
+ })),
967
+ },
968
+ };
969
+ const requestId = (0, uuid_1.v4)();
970
+ yield tdpClient.getValue('some-key', { requestId });
971
+ expect((_b = (_a = tdpClient === null || tdpClient === void 0 ? void 0 : tdpClient.api) === null || _a === void 0 ? void 0 : _a.v1) === null || _b === void 0 ? void 0 : _b.getConnectorData).toHaveBeenCalledWith('some-target-id', {
972
+ keys: ['some-key'],
973
+ }, { requestId });
974
+ }));
975
+ });
976
+ describe('getValues', () => {
977
+ it('should work with legacy ...args route', () => __awaiter(void 0, void 0, void 0, function* () {
978
+ var _a, _b;
979
+ const tdpClient = new src_1.TDPClient({
980
+ orgSlug: 'tetrascience',
981
+ awsRegion: 'us-east-2',
982
+ connectorId: 'some-target-id',
983
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
984
+ });
985
+ yield tdpClient.init();
986
+ tdpClient.api = {
987
+ v1: {
988
+ getConnectorData: jest.fn((_, query) => __awaiter(void 0, void 0, void 0, function* () {
989
+ return {
990
+ values: query.keys.map((key) => ({
991
+ key,
992
+ value: 'some-value',
993
+ })),
994
+ };
995
+ })),
996
+ },
997
+ };
998
+ yield tdpClient.getValues('some-key', 'another-key');
999
+ expect((_b = (_a = tdpClient === null || tdpClient === void 0 ? void 0 : tdpClient.api) === null || _a === void 0 ? void 0 : _a.v1) === null || _b === void 0 ? void 0 : _b.getConnectorData).toHaveBeenCalledWith('some-target-id', {
1000
+ keys: ['some-key', 'another-key'],
1001
+ }, { requestId: undefined });
1002
+ }));
1003
+ it('should work with newer [args],options route and call the same way', () => __awaiter(void 0, void 0, void 0, function* () {
1004
+ var _a, _b;
1005
+ const tdpClient = new src_1.TDPClient({
1006
+ orgSlug: 'tetrascience',
1007
+ awsRegion: 'us-east-2',
1008
+ connectorId: 'some-target-id',
1009
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
1010
+ });
1011
+ yield tdpClient.init();
1012
+ tdpClient.api = {
1013
+ v1: {
1014
+ getConnectorData: jest.fn((_, query) => __awaiter(void 0, void 0, void 0, function* () {
1015
+ return {
1016
+ values: query.keys.map((key) => ({
1017
+ key,
1018
+ value: 'some-value',
1019
+ })),
1020
+ };
1021
+ })),
1022
+ },
1023
+ };
1024
+ const requestId = (0, uuid_1.v4)();
1025
+ yield tdpClient.getValues(['some-key', 'another-key'], { requestId });
1026
+ expect((_b = (_a = tdpClient === null || tdpClient === void 0 ? void 0 : tdpClient.api) === null || _a === void 0 ? void 0 : _a.v1) === null || _b === void 0 ? void 0 : _b.getConnectorData).toHaveBeenCalledWith('some-target-id', {
1027
+ keys: ['some-key', 'another-key'],
1028
+ }, { requestId });
1029
+ }));
1030
+ });
1031
+ });
1032
+ });
1033
+ describe('create axios instances', () => {
1034
+ let tdpClient;
1035
+ let tdpEndpoint;
1036
+ let orgSlug;
1037
+ let jwt;
1038
+ let certificates;
1039
+ beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
1040
+ tdpClient = new src_1.TDPClient({
1041
+ orgSlug: 'tetrascience',
1042
+ awsRegion: 'us-east-2',
1043
+ connectorId: 'some-target-id',
1044
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
1045
+ });
1046
+ tdpEndpoint = 'https://example.com';
1047
+ orgSlug = 'test-org';
1048
+ jwt = 'test-jwt';
1049
+ certificates = [];
1050
+ yield tdpClient.init();
1051
+ tdpClient.createProxyAgentsForBaseUrl = jest.fn().mockReturnValue({});
1052
+ }));
1053
+ describe('createAxiosInstance', () => {
1054
+ it('should create an axios instance with the correct baseURL', () => {
1055
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1056
+ tdpClient.createAxiosInstance({ baseUrl: tdpEndpoint });
1057
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ baseURL: tdpEndpoint }));
1058
+ });
1059
+ it('should set the timeout to the provided value', () => {
1060
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1061
+ const timeout_ms = 1234;
1062
+ tdpClient.createAxiosInstance({ baseUrl: 'https://example.com', timeout_ms });
1063
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ timeout: timeout_ms }));
1064
+ });
1065
+ it('should set the timeout to the default value if not provided', () => {
1066
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1067
+ tdpClient.createAxiosInstance({ baseUrl: 'https://example.com' });
1068
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ timeout: tdpClient.config.httpRequestTimeout }));
1069
+ });
1070
+ it('should set proxy to false', () => {
1071
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1072
+ tdpClient.createAxiosInstance({ baseUrl: 'https://example.com' });
1073
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ proxy: false }));
1074
+ });
1075
+ it('should include additional config if provided', () => {
1076
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1077
+ const additionalConfig = { headers: { 'Custom-Header': 'value' } };
1078
+ tdpClient.createAxiosInstance({ baseUrl: 'https://example.com', config: additionalConfig });
1079
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining(additionalConfig));
1080
+ });
1081
+ it('should log the creation of the axios instance', () => {
1082
+ const loggerSpy = jest.spyOn(tdpClient.logger, 'info');
1083
+ const baseUrl = 'https://example.com';
1084
+ const config = { headers: { 'Custom-Header': 'value' } };
1085
+ const rejectUnauthorized = false;
1086
+ tdpClient.createAxiosInstance({ baseUrl, config, rejectUnauthorized });
1087
+ expect(loggerSpy).toHaveBeenCalledWith('Creating axios instance', {
1088
+ baseUrl,
1089
+ config: (0, src_1.sanitizeConfig)(config),
1090
+ rejectUnauthorized,
1091
+ });
1092
+ });
1093
+ });
1094
+ describe('createAxiosInstanceWithCertificatesAndHeaders', () => {
1095
+ it('should create an axios instance with the correct baseURL', () => {
1096
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1097
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders(tdpEndpoint, orgSlug, jwt, certificates);
1098
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ baseURL: tdpEndpoint }));
1099
+ });
1100
+ it('should set the timeout to the provided value', () => {
1101
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1102
+ const timeout_ms = 1234;
1103
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders(tdpEndpoint, orgSlug, jwt, certificates, timeout_ms);
1104
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ timeout: timeout_ms }));
1105
+ });
1106
+ it('should set the timeout to the default value if not provided', () => {
1107
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1108
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders(tdpEndpoint, orgSlug, jwt, certificates);
1109
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ timeout: tdpClient.config.httpRequestTimeout }));
1110
+ });
1111
+ it('should set proxy to false', () => {
1112
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1113
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders(tdpEndpoint, orgSlug, jwt, certificates);
1114
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({ proxy: false }));
1115
+ });
1116
+ it('should include additional certificates in the proxy agents', () => {
1117
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1118
+ certificates = ['cert1', 'cert2'];
1119
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders(tdpEndpoint, orgSlug, jwt, certificates);
1120
+ expect(tdpClient.createProxyAgentsForBaseUrl).toHaveBeenCalledWith(expect.objectContaining({ includeAdditionalCertificates: certificates }));
1121
+ });
1122
+ it('should set the correct headers', () => {
1123
+ const axiosCreateSpy = jest.spyOn(axios_1.default, 'create');
1124
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders(tdpEndpoint, orgSlug, jwt, certificates);
1125
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({
1126
+ headers: {
1127
+ [ts_lib_shared_schema_1.HTTPAuthKeys.scopeToOrgHeaderKey]: orgSlug,
1128
+ [ts_lib_shared_schema_1.HTTPAuthKeys.jwtAuthTokenHeaderKey]: jwt,
1129
+ 'user-agent': 'PluggableConnector TDPClient',
1130
+ },
1131
+ }));
1132
+ });
1133
+ });
1134
+ });
1135
+ describe('User-Agent headers', () => {
1136
+ let tdpClient;
1137
+ let getManifestSpy = jest.spyOn(manifest, 'getConnectorManifest');
1138
+ beforeEach(() => {
1139
+ jest.clearAllMocks();
1140
+ tdpClient = new src_1.TDPClient({
1141
+ orgSlug: 'tetrascience',
1142
+ awsRegion: 'us-east-2',
1143
+ connectorId: 'some-target-id',
1144
+ authTokenProvider: new src_1.PredefinedAuthTokenProvider('some-fake-token'),
1145
+ });
1146
+ getManifestSpy = jest.spyOn(manifest, 'getConnectorManifest');
1147
+ getManifestSpy.mockResolvedValue({
1148
+ slug: 'test-slug',
1149
+ version: '1.0.0',
1150
+ });
1151
+ // Mock the manifest to ensure it's available
1152
+ tdpClient._manifest = {
1153
+ slug: 'test-slug',
1154
+ version: '1.0.0',
1155
+ };
1156
+ });
1157
+ it('should set default user agent when connector info is available', () => __awaiter(void 0, void 0, void 0, function* () {
1158
+ // Arrange
1159
+ getManifestSpy.mockResolvedValueOnce(null);
1160
+ yield tdpClient.init();
1161
+ // Mock createProxyAgentsForBaseUrl to avoid actual proxy creation
1162
+ tdpClient.createProxyAgentsForBaseUrl = jest.fn().mockReturnValue({});
1163
+ // Directly set the user agent
1164
+ // tdpClient.setUserAgent('test-slug v1.0.0');
1165
+ // Act
1166
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders('https://example.com', 'orgSlug', 'jwt', []);
1167
+ // Assert
1168
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({
1169
+ headers: expect.objectContaining({
1170
+ 'user-agent': 'PluggableConnector TDPClient',
1171
+ }),
1172
+ }));
1173
+ }));
1174
+ it('should disable user agent when configured in connector values', () => __awaiter(void 0, void 0, void 0, function* () {
1175
+ // Mock hasUserAgentSetToDisabled to return true
1176
+ jest.spyOn(tdpClient, 'hasUserAgentSetToDisabled').mockResolvedValue(true);
1177
+ yield tdpClient.init();
1178
+ tdpClient.createProxyAgentsForBaseUrl = jest.fn().mockReturnValue({});
1179
+ // Act
1180
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders('https://example.com', 'orgSlug', 'jwt', []);
1181
+ // Assert
1182
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({
1183
+ headers: expect.not.objectContaining({
1184
+ 'User-Agent': expect.anything(),
1185
+ }),
1186
+ }));
1187
+ }));
1188
+ it('should set default user agent when connector info is available', () => __awaiter(void 0, void 0, void 0, function* () {
1189
+ // Arrange
1190
+ yield tdpClient.init();
1191
+ // Mock createProxyAgentsForBaseUrl to avoid actual proxy creation
1192
+ tdpClient.createProxyAgentsForBaseUrl = jest.fn().mockReturnValue({});
1193
+ // Act
1194
+ tdpClient.createAxiosInstanceWithCertificatesAndHeaders('https://example.com', 'orgSlug', 'jwt', []);
1195
+ // Assert
1196
+ expect(axiosCreateSpy).toHaveBeenCalledWith(expect.objectContaining({
1197
+ headers: expect.objectContaining({
1198
+ 'user-agent': 'PluggableConnector test-slug v1.0.0',
1199
+ }),
1200
+ }));
1201
+ }));
1202
+ });
1203
+ });
1204
+ //# sourceMappingURL=tdp-client.test.js.map