@datadog/datadog-ci 2.47.0 → 3.0.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 (408) hide show
  1. package/README.md +9 -2
  2. package/dist/__tests__/cli.test.d.ts +1 -0
  3. package/dist/__tests__/cli.test.js +92 -0
  4. package/dist/__tests__/cli.test.js.map +1 -0
  5. package/dist/cli.js +1 -1
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/cloud-run/__tests__/fixtures.d.ts +2 -0
  8. package/dist/commands/cloud-run/__tests__/fixtures.js +12 -0
  9. package/dist/commands/cloud-run/__tests__/fixtures.js.map +1 -0
  10. package/dist/commands/cloud-run/__tests__/flare.test.d.ts +1 -0
  11. package/dist/commands/cloud-run/__tests__/flare.test.js +557 -0
  12. package/dist/commands/cloud-run/__tests__/flare.test.js.map +1 -0
  13. package/dist/commands/coverage/__tests__/upload.test.d.ts +1 -0
  14. package/dist/commands/coverage/__tests__/upload.test.js +323 -0
  15. package/dist/commands/coverage/__tests__/upload.test.js.map +1 -0
  16. package/dist/commands/coverage/__tests__/utils.test.d.ts +1 -0
  17. package/dist/commands/coverage/__tests__/utils.test.js +57 -0
  18. package/dist/commands/coverage/__tests__/utils.test.js.map +1 -0
  19. package/dist/commands/coverage/api.d.ts +9 -0
  20. package/dist/commands/coverage/api.js +52 -0
  21. package/dist/commands/coverage/api.js.map +1 -0
  22. package/dist/commands/coverage/cli.d.ts +1 -0
  23. package/dist/commands/coverage/cli.js +5 -0
  24. package/dist/commands/coverage/cli.js.map +1 -0
  25. package/dist/commands/coverage/interfaces.d.ts +13 -0
  26. package/dist/commands/coverage/interfaces.js +3 -0
  27. package/dist/commands/coverage/interfaces.js.map +1 -0
  28. package/dist/commands/coverage/renderer.d.ts +12 -0
  29. package/dist/commands/coverage/renderer.js +83 -0
  30. package/dist/commands/coverage/renderer.js.map +1 -0
  31. package/dist/commands/coverage/upload.d.ts +27 -0
  32. package/dist/commands/coverage/upload.js +329 -0
  33. package/dist/commands/coverage/upload.js.map +1 -0
  34. package/dist/commands/coverage/utils.d.ts +3 -0
  35. package/dist/commands/coverage/utils.js +83 -0
  36. package/dist/commands/coverage/utils.js.map +1 -0
  37. package/dist/commands/deployment/__tests__/correlate.test.d.ts +1 -0
  38. package/dist/commands/deployment/__tests__/correlate.test.js +106 -0
  39. package/dist/commands/deployment/__tests__/correlate.test.js.map +1 -0
  40. package/dist/commands/deployment/__tests__/mark.test.d.ts +1 -0
  41. package/dist/commands/deployment/__tests__/mark.test.js +97 -0
  42. package/dist/commands/deployment/__tests__/mark.test.js.map +1 -0
  43. package/dist/commands/dora/__tests__/deployment.test.d.ts +1 -0
  44. package/dist/commands/dora/__tests__/deployment.test.js +201 -0
  45. package/dist/commands/dora/__tests__/deployment.test.js.map +1 -0
  46. package/dist/commands/dsyms/__tests__/upload.test.d.ts +1 -0
  47. package/dist/commands/dsyms/__tests__/upload.test.js +346 -0
  48. package/dist/commands/dsyms/__tests__/upload.test.js.map +1 -0
  49. package/dist/commands/dsyms/__tests__/utils.test.d.ts +1 -0
  50. package/dist/commands/dsyms/__tests__/utils.test.js +100 -0
  51. package/dist/commands/dsyms/__tests__/utils.test.js.map +1 -0
  52. package/dist/commands/dsyms/upload.js +3 -3
  53. package/dist/commands/dsyms/upload.js.map +1 -1
  54. package/dist/commands/dsyms/utils.js +7 -6
  55. package/dist/commands/dsyms/utils.js.map +1 -1
  56. package/dist/commands/elf-symbols/__tests__/elf.test.d.ts +1 -0
  57. package/dist/commands/elf-symbols/__tests__/elf.test.js +819 -0
  58. package/dist/commands/elf-symbols/__tests__/elf.test.js.map +1 -0
  59. package/dist/commands/elf-symbols/__tests__/upload.test.d.ts +1 -0
  60. package/dist/commands/elf-symbols/__tests__/upload.test.js +224 -0
  61. package/dist/commands/elf-symbols/__tests__/upload.test.js.map +1 -0
  62. package/dist/commands/elf-symbols/elf.d.ts +1 -0
  63. package/dist/commands/elf-symbols/upload.js +2 -3
  64. package/dist/commands/elf-symbols/upload.js.map +1 -1
  65. package/dist/commands/flutter-symbols/__tests__/upload.test.d.ts +1 -0
  66. package/dist/commands/flutter-symbols/__tests__/upload.test.js +617 -0
  67. package/dist/commands/flutter-symbols/__tests__/upload.test.js.map +1 -0
  68. package/dist/commands/flutter-symbols/upload.js +2 -2
  69. package/dist/commands/flutter-symbols/upload.js.map +1 -1
  70. package/dist/commands/gate/__tests__/evaluate.test.d.ts +1 -0
  71. package/dist/commands/gate/__tests__/evaluate.test.js +398 -0
  72. package/dist/commands/gate/__tests__/evaluate.test.js.map +1 -0
  73. package/dist/commands/gate/__tests__/scope.test.d.ts +1 -0
  74. package/dist/commands/gate/__tests__/scope.test.js +29 -0
  75. package/dist/commands/gate/__tests__/scope.test.js.map +1 -0
  76. package/dist/commands/git-metadata/__tests__/git.test.d.ts +1 -0
  77. package/dist/commands/git-metadata/__tests__/git.test.js +132 -0
  78. package/dist/commands/git-metadata/__tests__/git.test.js.map +1 -0
  79. package/dist/commands/git-metadata/__tests__/gitdb.test.d.ts +1 -0
  80. package/dist/commands/git-metadata/__tests__/gitdb.test.js +1386 -0
  81. package/dist/commands/git-metadata/__tests__/gitdb.test.js.map +1 -0
  82. package/dist/commands/git-metadata/__tests__/library.test.d.ts +1 -0
  83. package/dist/commands/git-metadata/__tests__/library.test.js +118 -0
  84. package/dist/commands/git-metadata/__tests__/library.test.js.map +1 -0
  85. package/dist/commands/git-metadata/__tests__/upload.test.d.ts +1 -0
  86. package/dist/commands/git-metadata/__tests__/upload.test.js +52 -0
  87. package/dist/commands/git-metadata/__tests__/upload.test.js.map +1 -0
  88. package/dist/commands/git-metadata/upload.d.ts +0 -1
  89. package/dist/commands/git-metadata/upload.js +0 -6
  90. package/dist/commands/git-metadata/upload.js.map +1 -1
  91. package/dist/commands/junit/__tests__/upload.test.d.ts +1 -0
  92. package/dist/commands/junit/__tests__/upload.test.js +446 -0
  93. package/dist/commands/junit/__tests__/upload.test.js.map +1 -0
  94. package/dist/commands/junit/renderer.d.ts +0 -1
  95. package/dist/commands/junit/renderer.js +1 -5
  96. package/dist/commands/junit/renderer.js.map +1 -1
  97. package/dist/commands/junit/upload.d.ts +0 -2
  98. package/dist/commands/junit/upload.js +8 -21
  99. package/dist/commands/junit/upload.js.map +1 -1
  100. package/dist/commands/lambda/__tests__/fixtures.d.ts +51 -0
  101. package/dist/commands/lambda/__tests__/fixtures.js +146 -0
  102. package/dist/commands/lambda/__tests__/fixtures.js.map +1 -0
  103. package/dist/commands/lambda/__tests__/flare.test.d.ts +1 -0
  104. package/dist/commands/lambda/__tests__/flare.test.js +730 -0
  105. package/dist/commands/lambda/__tests__/flare.test.js.map +1 -0
  106. package/dist/commands/lambda/__tests__/functions/commons.test.d.ts +1 -0
  107. package/dist/commands/lambda/__tests__/functions/commons.test.js +791 -0
  108. package/dist/commands/lambda/__tests__/functions/commons.test.js.map +1 -0
  109. package/dist/commands/lambda/__tests__/functions/instrument.part1.test.d.ts +1 -0
  110. package/dist/commands/lambda/__tests__/functions/instrument.part1.test.js +386 -0
  111. package/dist/commands/lambda/__tests__/functions/instrument.part1.test.js.map +1 -0
  112. package/dist/commands/lambda/__tests__/functions/instrument.part2.test.d.ts +1 -0
  113. package/dist/commands/lambda/__tests__/functions/instrument.part2.test.js +721 -0
  114. package/dist/commands/lambda/__tests__/functions/instrument.part2.test.js.map +1 -0
  115. package/dist/commands/lambda/__tests__/functions/uninstrument.test.d.ts +1 -0
  116. package/dist/commands/lambda/__tests__/functions/uninstrument.test.js +513 -0
  117. package/dist/commands/lambda/__tests__/functions/uninstrument.test.js.map +1 -0
  118. package/dist/commands/lambda/__tests__/functions/versionChecker.test.d.ts +1 -0
  119. package/dist/commands/lambda/__tests__/functions/versionChecker.test.js +33 -0
  120. package/dist/commands/lambda/__tests__/functions/versionChecker.test.js.map +1 -0
  121. package/dist/commands/lambda/__tests__/instrument.test.d.ts +1 -0
  122. package/dist/commands/lambda/__tests__/instrument.test.js +1537 -0
  123. package/dist/commands/lambda/__tests__/instrument.test.js.map +1 -0
  124. package/dist/commands/lambda/__tests__/loggroup.test.d.ts +1 -0
  125. package/dist/commands/lambda/__tests__/loggroup.test.js +340 -0
  126. package/dist/commands/lambda/__tests__/loggroup.test.js.map +1 -0
  127. package/dist/commands/lambda/__tests__/prompt.test.d.ts +1 -0
  128. package/dist/commands/lambda/__tests__/prompt.test.js +206 -0
  129. package/dist/commands/lambda/__tests__/prompt.test.js.map +1 -0
  130. package/dist/commands/lambda/__tests__/tags.test.d.ts +1 -0
  131. package/dist/commands/lambda/__tests__/tags.test.js +305 -0
  132. package/dist/commands/lambda/__tests__/tags.test.js.map +1 -0
  133. package/dist/commands/lambda/__tests__/uninstrument.test.d.ts +1 -0
  134. package/dist/commands/lambda/__tests__/uninstrument.test.js +722 -0
  135. package/dist/commands/lambda/__tests__/uninstrument.test.js.map +1 -0
  136. package/dist/commands/lambda/constants.d.ts +2 -0
  137. package/dist/commands/lambda/constants.js +4 -0
  138. package/dist/commands/lambda/constants.js.map +1 -1
  139. package/dist/commands/lambda/functions/commons.d.ts +1 -1
  140. package/dist/commands/measure/__tests__/measure.test.d.ts +1 -0
  141. package/dist/commands/measure/__tests__/measure.test.js +102 -0
  142. package/dist/commands/measure/__tests__/measure.test.js.map +1 -0
  143. package/dist/commands/measure/measure.d.ts +0 -1
  144. package/dist/commands/measure/measure.js +2 -9
  145. package/dist/commands/measure/measure.js.map +1 -1
  146. package/dist/commands/react-native/__tests__/codepush.test.d.ts +1 -0
  147. package/dist/commands/react-native/__tests__/codepush.test.js +161 -0
  148. package/dist/commands/react-native/__tests__/codepush.test.js.map +1 -0
  149. package/dist/commands/react-native/__tests__/interfaces.test.d.ts +1 -0
  150. package/dist/commands/react-native/__tests__/interfaces.test.js +33 -0
  151. package/dist/commands/react-native/__tests__/interfaces.test.js.map +1 -0
  152. package/dist/commands/react-native/__tests__/upload.test.d.ts +1 -0
  153. package/dist/commands/react-native/__tests__/upload.test.js +238 -0
  154. package/dist/commands/react-native/__tests__/upload.test.js.map +1 -0
  155. package/dist/commands/react-native/__tests__/utils.test.d.ts +1 -0
  156. package/dist/commands/react-native/__tests__/utils.test.js +27 -0
  157. package/dist/commands/react-native/__tests__/utils.test.js.map +1 -0
  158. package/dist/commands/react-native/__tests__/xcode.test.d.ts +1 -0
  159. package/dist/commands/react-native/__tests__/xcode.test.js +465 -0
  160. package/dist/commands/react-native/__tests__/xcode.test.js.map +1 -0
  161. package/dist/commands/sarif/__tests__/upload.test.d.ts +1 -0
  162. package/dist/commands/sarif/__tests__/upload.test.js +218 -0
  163. package/dist/commands/sarif/__tests__/upload.test.js.map +1 -0
  164. package/dist/commands/sarif/__tests__/validation.test.d.ts +1 -0
  165. package/dist/commands/sarif/__tests__/validation.test.js +19 -0
  166. package/dist/commands/sarif/__tests__/validation.test.js.map +1 -0
  167. package/dist/commands/sarif/api.js +1 -1
  168. package/dist/commands/sarif/api.js.map +1 -1
  169. package/dist/commands/sarif/interfaces.d.ts +0 -1
  170. package/dist/commands/sarif/renderer.d.ts +2 -2
  171. package/dist/commands/sarif/renderer.js +5 -5
  172. package/dist/commands/sarif/renderer.js.map +1 -1
  173. package/dist/commands/sarif/upload.d.ts +1 -1
  174. package/dist/commands/sarif/upload.js +15 -10
  175. package/dist/commands/sarif/upload.js.map +1 -1
  176. package/dist/commands/sbom/__tests__/payload.test.d.ts +1 -0
  177. package/dist/commands/sbom/__tests__/payload.test.js +306 -0
  178. package/dist/commands/sbom/__tests__/payload.test.js.map +1 -0
  179. package/dist/commands/sbom/__tests__/validation.test.d.ts +1 -0
  180. package/dist/commands/sbom/__tests__/validation.test.js +141 -0
  181. package/dist/commands/sbom/__tests__/validation.test.js.map +1 -0
  182. package/dist/commands/sbom/json-schema/spdx/spdx.schema.json +428 -198
  183. package/dist/commands/sbom/language.js +5 -1
  184. package/dist/commands/sbom/language.js.map +1 -1
  185. package/dist/commands/sbom/renderer.d.ts +2 -2
  186. package/dist/commands/sbom/renderer.js +7 -1
  187. package/dist/commands/sbom/renderer.js.map +1 -1
  188. package/dist/commands/sbom/upload.d.ts +1 -1
  189. package/dist/commands/sbom/upload.js +11 -4
  190. package/dist/commands/sbom/upload.js.map +1 -1
  191. package/dist/commands/sbom/validation.d.ts +5 -0
  192. package/dist/commands/sbom/validation.js +23 -10
  193. package/dist/commands/sbom/validation.js.map +1 -1
  194. package/dist/commands/sourcemaps/__tests__/upload.test.d.ts +1 -0
  195. package/dist/commands/sourcemaps/__tests__/upload.test.js +270 -0
  196. package/dist/commands/sourcemaps/__tests__/upload.test.js.map +1 -0
  197. package/dist/commands/sourcemaps/__tests__/utils.test.d.ts +1 -0
  198. package/dist/commands/sourcemaps/__tests__/utils.test.js +31 -0
  199. package/dist/commands/sourcemaps/__tests__/utils.test.js.map +1 -0
  200. package/dist/commands/sourcemaps/upload.d.ts +1 -0
  201. package/dist/commands/sourcemaps/upload.js +6 -2
  202. package/dist/commands/sourcemaps/upload.js.map +1 -1
  203. package/dist/commands/stepfunctions/__tests__/awsCommands.test.d.ts +1 -0
  204. package/dist/commands/stepfunctions/__tests__/awsCommands.test.js +210 -0
  205. package/dist/commands/stepfunctions/__tests__/awsCommands.test.js.map +1 -0
  206. package/dist/commands/stepfunctions/__tests__/fixtures/aws-resources.d.ts +6 -0
  207. package/dist/commands/stepfunctions/__tests__/fixtures/aws-resources.js +45 -0
  208. package/dist/commands/stepfunctions/__tests__/fixtures/aws-resources.js.map +1 -0
  209. package/dist/commands/stepfunctions/__tests__/fixtures/cli.d.ts +5 -0
  210. package/dist/commands/stepfunctions/__tests__/fixtures/cli.js +19 -0
  211. package/dist/commands/stepfunctions/__tests__/fixtures/cli.js.map +1 -0
  212. package/dist/commands/stepfunctions/__tests__/helpers.test.d.ts +1 -0
  213. package/dist/commands/stepfunctions/__tests__/helpers.test.js +501 -0
  214. package/dist/commands/stepfunctions/__tests__/helpers.test.js.map +1 -0
  215. package/dist/commands/stepfunctions/__tests__/instrument.test.d.ts +1 -0
  216. package/dist/commands/stepfunctions/__tests__/instrument.test.js +431 -0
  217. package/dist/commands/stepfunctions/__tests__/instrument.test.js.map +1 -0
  218. package/dist/commands/stepfunctions/__tests__/uninstrument.test.d.ts +1 -0
  219. package/dist/commands/stepfunctions/__tests__/uninstrument.test.js +166 -0
  220. package/dist/commands/stepfunctions/__tests__/uninstrument.test.js.map +1 -0
  221. package/dist/commands/synthetics/__tests__/api.test.d.ts +1 -0
  222. package/dist/commands/synthetics/__tests__/api.test.js +416 -0
  223. package/dist/commands/synthetics/__tests__/api.test.js.map +1 -0
  224. package/dist/commands/synthetics/__tests__/batch.test.d.ts +1 -0
  225. package/dist/commands/synthetics/__tests__/batch.test.js +906 -0
  226. package/dist/commands/synthetics/__tests__/batch.test.js.map +1 -0
  227. package/dist/commands/synthetics/__tests__/cli.test.d.ts +1 -0
  228. package/dist/commands/synthetics/__tests__/cli.test.js +1371 -0
  229. package/dist/commands/synthetics/__tests__/cli.test.js.map +1 -0
  230. package/dist/commands/synthetics/__tests__/deploy-tests-lib.test.d.ts +1 -0
  231. package/dist/commands/synthetics/__tests__/deploy-tests-lib.test.js +112 -0
  232. package/dist/commands/synthetics/__tests__/deploy-tests-lib.test.js.map +1 -0
  233. package/dist/commands/synthetics/__tests__/fixtures.d.ts +123 -0
  234. package/dist/commands/synthetics/__tests__/fixtures.js +493 -0
  235. package/dist/commands/synthetics/__tests__/fixtures.js.map +1 -0
  236. package/dist/commands/synthetics/__tests__/import-tests-lib.test.d.ts +1 -0
  237. package/dist/commands/synthetics/__tests__/import-tests-lib.test.js +186 -0
  238. package/dist/commands/synthetics/__tests__/import-tests-lib.test.js.map +1 -0
  239. package/dist/commands/synthetics/__tests__/mobile.test.d.ts +1 -0
  240. package/dist/commands/synthetics/__tests__/mobile.test.js +376 -0
  241. package/dist/commands/synthetics/__tests__/mobile.test.js.map +1 -0
  242. package/dist/commands/synthetics/__tests__/multilocator.test.d.ts +1 -0
  243. package/dist/commands/synthetics/__tests__/multilocator.test.js +132 -0
  244. package/dist/commands/synthetics/__tests__/multilocator.test.js.map +1 -0
  245. package/dist/commands/synthetics/__tests__/reporters/default.test.d.ts +1 -0
  246. package/dist/commands/synthetics/__tests__/reporters/default.test.js +410 -0
  247. package/dist/commands/synthetics/__tests__/reporters/default.test.js.map +1 -0
  248. package/dist/commands/synthetics/__tests__/reporters/junit.test.d.ts +1 -0
  249. package/dist/commands/synthetics/__tests__/reporters/junit.test.js +354 -0
  250. package/dist/commands/synthetics/__tests__/reporters/junit.test.js.map +1 -0
  251. package/dist/commands/synthetics/__tests__/reporters/mobile/app-upload.test.d.ts +1 -0
  252. package/dist/commands/synthetics/__tests__/reporters/mobile/app-upload.test.js +232 -0
  253. package/dist/commands/synthetics/__tests__/reporters/mobile/app-upload.test.js.map +1 -0
  254. package/dist/commands/synthetics/__tests__/run-tests-lib.test.d.ts +1 -0
  255. package/dist/commands/synthetics/__tests__/run-tests-lib.test.js +698 -0
  256. package/dist/commands/synthetics/__tests__/run-tests-lib.test.js.map +1 -0
  257. package/dist/commands/synthetics/__tests__/test.test.d.ts +1 -0
  258. package/dist/commands/synthetics/__tests__/test.test.js +269 -0
  259. package/dist/commands/synthetics/__tests__/test.test.js.map +1 -0
  260. package/dist/commands/synthetics/__tests__/tunnel/crypto.test.d.ts +1 -0
  261. package/dist/commands/synthetics/__tests__/tunnel/crypto.test.js +21 -0
  262. package/dist/commands/synthetics/__tests__/tunnel/crypto.test.js.map +1 -0
  263. package/dist/commands/synthetics/__tests__/tunnel/tunnel.test.d.ts +1 -0
  264. package/dist/commands/synthetics/__tests__/tunnel/tunnel.test.js +80 -0
  265. package/dist/commands/synthetics/__tests__/tunnel/tunnel.test.js.map +1 -0
  266. package/dist/commands/synthetics/__tests__/tunnel/websocket.test.d.ts +1 -0
  267. package/dist/commands/synthetics/__tests__/tunnel/websocket.test.js +109 -0
  268. package/dist/commands/synthetics/__tests__/tunnel/websocket.test.js.map +1 -0
  269. package/dist/commands/synthetics/__tests__/utils/internal.test.d.ts +1 -0
  270. package/dist/commands/synthetics/__tests__/utils/internal.test.js +161 -0
  271. package/dist/commands/synthetics/__tests__/utils/internal.test.js.map +1 -0
  272. package/dist/commands/synthetics/__tests__/utils/public.test.d.ts +1 -0
  273. package/dist/commands/synthetics/__tests__/utils/public.test.js +575 -0
  274. package/dist/commands/synthetics/__tests__/utils/public.test.js.map +1 -0
  275. package/dist/commands/synthetics/api.d.ts +4 -2
  276. package/dist/commands/synthetics/api.js +20 -1
  277. package/dist/commands/synthetics/api.js.map +1 -1
  278. package/dist/commands/synthetics/batch.d.ts +4 -2
  279. package/dist/commands/synthetics/batch.js +65 -7
  280. package/dist/commands/synthetics/batch.js.map +1 -1
  281. package/dist/commands/synthetics/cli.js +3 -1
  282. package/dist/commands/synthetics/cli.js.map +1 -1
  283. package/dist/commands/synthetics/deploy-tests-command.d.ts +22 -0
  284. package/dist/commands/synthetics/deploy-tests-command.js +150 -0
  285. package/dist/commands/synthetics/deploy-tests-command.js.map +1 -0
  286. package/dist/commands/synthetics/deploy-tests-lib.d.ts +2 -0
  287. package/dist/commands/synthetics/deploy-tests-lib.js +72 -0
  288. package/dist/commands/synthetics/deploy-tests-lib.js.map +1 -0
  289. package/dist/commands/synthetics/errors.d.ts +1 -1
  290. package/dist/commands/synthetics/errors.js +1 -0
  291. package/dist/commands/synthetics/errors.js.map +1 -1
  292. package/dist/commands/synthetics/import-tests-command.d.ts +22 -0
  293. package/dist/commands/synthetics/import-tests-command.js +142 -0
  294. package/dist/commands/synthetics/import-tests-command.js.map +1 -0
  295. package/dist/commands/synthetics/import-tests-lib.d.ts +2 -0
  296. package/dist/commands/synthetics/import-tests-lib.js +71 -0
  297. package/dist/commands/synthetics/import-tests-lib.js.map +1 -0
  298. package/dist/commands/synthetics/interfaces.d.ts +74 -28
  299. package/dist/commands/synthetics/interfaces.js.map +1 -1
  300. package/dist/commands/synthetics/local-test-definition.d.ts +2 -0
  301. package/dist/commands/synthetics/local-test-definition.js +16 -0
  302. package/dist/commands/synthetics/local-test-definition.js.map +1 -0
  303. package/dist/commands/synthetics/mobile.js +2 -2
  304. package/dist/commands/synthetics/mobile.js.map +1 -1
  305. package/dist/commands/synthetics/multilocator.d.ts +3 -0
  306. package/dist/commands/synthetics/multilocator.js +98 -0
  307. package/dist/commands/synthetics/multilocator.js.map +1 -0
  308. package/dist/commands/synthetics/reporters/junit.d.ts +1 -2
  309. package/dist/commands/synthetics/reporters/junit.js +5 -6
  310. package/dist/commands/synthetics/reporters/junit.js.map +1 -1
  311. package/dist/commands/synthetics/run-tests-command.d.ts +0 -9
  312. package/dist/commands/synthetics/run-tests-command.js +22 -64
  313. package/dist/commands/synthetics/run-tests-command.js.map +1 -1
  314. package/dist/commands/synthetics/run-tests-lib.js +15 -12
  315. package/dist/commands/synthetics/run-tests-lib.js.map +1 -1
  316. package/dist/commands/synthetics/test.d.ts +10 -19
  317. package/dist/commands/synthetics/test.js +93 -13
  318. package/dist/commands/synthetics/test.js.map +1 -1
  319. package/dist/commands/synthetics/tunnel/tunnel.js +2 -2
  320. package/dist/commands/synthetics/tunnel/tunnel.js.map +1 -1
  321. package/dist/commands/synthetics/utils/internal.d.ts +3 -1
  322. package/dist/commands/synthetics/utils/internal.js +18 -8
  323. package/dist/commands/synthetics/utils/internal.js.map +1 -1
  324. package/dist/commands/synthetics/utils/public.d.ts +5 -26
  325. package/dist/commands/synthetics/utils/public.js +13 -248
  326. package/dist/commands/synthetics/utils/public.js.map +1 -1
  327. package/dist/commands/tag/__tests__/tag.test.d.ts +1 -0
  328. package/dist/commands/tag/__tests__/tag.test.js +85 -0
  329. package/dist/commands/tag/__tests__/tag.test.js.map +1 -0
  330. package/dist/commands/trace/__tests__/trace.test.d.ts +1 -0
  331. package/dist/commands/trace/__tests__/trace.test.js +145 -0
  332. package/dist/commands/trace/__tests__/trace.test.js.map +1 -0
  333. package/dist/commands/unity-symbols/__tests__/upload.test.d.ts +1 -0
  334. package/dist/commands/unity-symbols/__tests__/upload.test.js +369 -0
  335. package/dist/commands/unity-symbols/__tests__/upload.test.js.map +1 -0
  336. package/dist/commands/unity-symbols/upload.js +2 -2
  337. package/dist/commands/unity-symbols/upload.js.map +1 -1
  338. package/dist/helpers/__tests__/app.test.d.ts +1 -0
  339. package/dist/helpers/__tests__/app.test.js +31 -0
  340. package/dist/helpers/__tests__/app.test.js.map +1 -0
  341. package/dist/helpers/__tests__/ci.test.d.ts +1 -0
  342. package/dist/helpers/__tests__/ci.test.js +295 -0
  343. package/dist/helpers/__tests__/ci.test.js.map +1 -0
  344. package/dist/helpers/__tests__/env.test.d.ts +1 -0
  345. package/dist/helpers/__tests__/env.test.js +74 -0
  346. package/dist/helpers/__tests__/env.test.js.map +1 -0
  347. package/dist/helpers/__tests__/fips.test.d.ts +1 -0
  348. package/dist/helpers/__tests__/fips.test.js +30 -0
  349. package/dist/helpers/__tests__/fips.test.js.map +1 -0
  350. package/dist/helpers/__tests__/fixtures.d.ts +41 -0
  351. package/dist/helpers/__tests__/fixtures.js +80 -0
  352. package/dist/helpers/__tests__/fixtures.js.map +1 -0
  353. package/dist/helpers/__tests__/flare.test.d.ts +1 -0
  354. package/dist/helpers/__tests__/flare.test.js +226 -0
  355. package/dist/helpers/__tests__/flare.test.js.map +1 -0
  356. package/dist/helpers/__tests__/fs.test.d.ts +1 -0
  357. package/dist/helpers/__tests__/fs.test.js +189 -0
  358. package/dist/helpers/__tests__/fs.test.js.map +1 -0
  359. package/dist/helpers/__tests__/id.test.d.ts +1 -0
  360. package/dist/helpers/__tests__/id.test.js +24 -0
  361. package/dist/helpers/__tests__/id.test.js.map +1 -0
  362. package/dist/helpers/__tests__/plist.test.d.ts +1 -0
  363. package/dist/helpers/__tests__/plist.test.js +43 -0
  364. package/dist/helpers/__tests__/plist.test.js.map +1 -0
  365. package/dist/helpers/__tests__/prompt.test.d.ts +1 -0
  366. package/dist/helpers/__tests__/prompt.test.js +71 -0
  367. package/dist/helpers/__tests__/prompt.test.js.map +1 -0
  368. package/dist/helpers/__tests__/retry.test.d.ts +1 -0
  369. package/dist/helpers/__tests__/retry.test.js +99 -0
  370. package/dist/helpers/__tests__/retry.test.js.map +1 -0
  371. package/dist/helpers/__tests__/tags.test.d.ts +1 -0
  372. package/dist/helpers/__tests__/tags.test.js +303 -0
  373. package/dist/helpers/__tests__/tags.test.js.map +1 -0
  374. package/dist/helpers/__tests__/upload.test.d.ts +1 -0
  375. package/dist/helpers/__tests__/upload.test.js +231 -0
  376. package/dist/helpers/__tests__/upload.test.js.map +1 -0
  377. package/dist/helpers/__tests__/user-provided-git.test.d.ts +1 -0
  378. package/dist/helpers/__tests__/user-provided-git.test.js +119 -0
  379. package/dist/helpers/__tests__/user-provided-git.test.js.map +1 -0
  380. package/dist/helpers/__tests__/utils.test.d.ts +1 -0
  381. package/dist/helpers/__tests__/utils.test.js +429 -0
  382. package/dist/helpers/__tests__/utils.test.js.map +1 -0
  383. package/dist/helpers/__tests__/validation.test.d.ts +1 -0
  384. package/dist/helpers/__tests__/validation.test.js +25 -0
  385. package/dist/helpers/__tests__/validation.test.js.map +1 -0
  386. package/dist/helpers/git/__tests__/format-git-sourcemaps-data.test.d.ts +1 -0
  387. package/dist/helpers/git/__tests__/format-git-sourcemaps-data.test.js +103 -0
  388. package/dist/helpers/git/__tests__/format-git-sourcemaps-data.test.js.map +1 -0
  389. package/dist/helpers/git/__tests__/format-git-span-data.test.d.ts +1 -0
  390. package/dist/helpers/git/__tests__/format-git-span-data.test.js +121 -0
  391. package/dist/helpers/git/__tests__/format-git-span-data.test.js.map +1 -0
  392. package/dist/helpers/git/__tests__/get-git-data.test.d.ts +1 -0
  393. package/dist/helpers/git/__tests__/get-git-data.test.js +72 -0
  394. package/dist/helpers/git/__tests__/get-git-data.test.js.map +1 -0
  395. package/dist/helpers/id.js.map +1 -0
  396. package/dist/helpers/tags.d.ts +1 -4
  397. package/dist/helpers/tags.js +2 -6
  398. package/dist/helpers/tags.js.map +1 -1
  399. package/dist/helpers/utils.d.ts +0 -4
  400. package/dist/helpers/utils.js +1 -21
  401. package/dist/helpers/utils.js.map +1 -1
  402. package/package.json +16 -17
  403. package/dist/commands/junit/id.js.map +0 -1
  404. package/dist/commands/synthetics/compatibility.d.ts +0 -7
  405. package/dist/commands/synthetics/compatibility.js +0 -83
  406. package/dist/commands/synthetics/compatibility.js.map +0 -1
  407. /package/dist/{commands/junit → helpers}/id.d.ts +0 -0
  408. /package/dist/{commands/junit → helpers}/id.js +0 -0
@@ -0,0 +1,1371 @@
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 __rest = (this && this.__rest) || function (s, e) {
35
+ var t = {};
36
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
37
+ t[p] = s[p];
38
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
39
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
40
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
41
+ t[p[i]] = s[p[i]];
42
+ }
43
+ return t;
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ const advanced_1 = require("clipanion/lib/advanced");
47
+ const fixtures_1 = require("../../../helpers/__tests__/fixtures");
48
+ const env_1 = require("../../../helpers/env");
49
+ const ciUtils = __importStar(require("../../../helpers/utils"));
50
+ const api = __importStar(require("../api"));
51
+ const deploy_tests_command_1 = require("../deploy-tests-command");
52
+ const import_tests_command_1 = require("../import-tests-command");
53
+ const interfaces_1 = require("../interfaces");
54
+ const run_tests_command_1 = require("../run-tests-command");
55
+ const testUtils = __importStar(require("../test"));
56
+ const upload_application_command_1 = require("../upload-application-command");
57
+ const internal_1 = require("../utils/internal");
58
+ const utils = __importStar(require("../utils/public"));
59
+ const fixtures_2 = require("./fixtures");
60
+ test('all option flags are supported', () => __awaiter(void 0, void 0, void 0, function* () {
61
+ const options = [
62
+ 'apiKey',
63
+ 'appKey',
64
+ 'config',
65
+ 'datadogSite',
66
+ 'failOnCriticalErrors',
67
+ 'failOnMissingTests',
68
+ 'failOnTimeout',
69
+ 'files',
70
+ 'jUnitReport',
71
+ 'mobileApplicationVersion',
72
+ 'mobileApplicationVersionFilePath',
73
+ 'public-id',
74
+ 'runName',
75
+ 'search',
76
+ 'subdomain',
77
+ 'tunnel',
78
+ ];
79
+ const cli = new advanced_1.Cli();
80
+ cli.register(run_tests_command_1.RunTestsCommand);
81
+ const usage = cli.usage(run_tests_command_1.RunTestsCommand);
82
+ options.forEach((option) => expect(usage).toContain(`--${option}`));
83
+ }));
84
+ describe('run-tests', () => {
85
+ beforeEach(() => {
86
+ process.env = {};
87
+ jest.restoreAllMocks();
88
+ });
89
+ describe('resolveConfig', () => {
90
+ beforeEach(() => {
91
+ process.env = {};
92
+ });
93
+ test('override from ENV', () => __awaiter(void 0, void 0, void 0, function* () {
94
+ var _a;
95
+ const overrideEnv = {
96
+ DATADOG_API_KEY: 'fake_api_key',
97
+ DATADOG_APP_KEY: 'fake_app_key',
98
+ DATADOG_SITE: 'datadoghq.eu',
99
+ DATADOG_SUBDOMAIN: 'custom',
100
+ DATADOG_SYNTHETICS_BATCH_TIMEOUT: '1',
101
+ DATADOG_SYNTHETICS_CONFIG_PATH: 'path/to/config.json',
102
+ DATADOG_SYNTHETICS_FAIL_ON_CRITICAL_ERRORS: 'false',
103
+ DATADOG_SYNTHETICS_FAIL_ON_MISSING_TESTS: 'false',
104
+ DATADOG_SYNTHETICS_FAIL_ON_TIMEOUT: 'false',
105
+ DATADOG_SYNTHETICS_FILES: 'test-file1;test-file2;test-file3',
106
+ DATADOG_SYNTHETICS_JUNIT_REPORT: 'junit-report.xml',
107
+ DATADOG_SYNTHETICS_PUBLIC_IDS: 'a-public-id;another-public-id',
108
+ DATADOG_SYNTHETICS_SELECTIVE_RERUN: 'true',
109
+ DATADOG_SYNTHETICS_TEST_SEARCH_QUERY: 'a-search-query',
110
+ DATADOG_SYNTHETICS_TUNNEL: 'false',
111
+ DATADOG_SYNTHETICS_OVERRIDE_ALLOW_INSECURE_CERTIFICATES: 'true',
112
+ DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_PASSWORD: 'password',
113
+ DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_USERNAME: 'username',
114
+ DATADOG_SYNTHETICS_OVERRIDE_BODY: 'body',
115
+ DATADOG_SYNTHETICS_OVERRIDE_BODY_TYPE: 'bodyType',
116
+ DATADOG_SYNTHETICS_OVERRIDE_COOKIES: 'cookie1;cookie2;cookie3',
117
+ DATADOG_SYNTHETICS_OVERRIDE_COOKIES_APPEND: 'true',
118
+ DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES: 'name1=value1 \n name2=value2; Domain=example.com \n name3=value3; Secure; HttpOnly',
119
+ DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES_APPEND: 'true',
120
+ DATADOG_SYNTHETICS_OVERRIDE_DEFAULT_STEP_TIMEOUT: '42',
121
+ DATADOG_SYNTHETICS_OVERRIDE_DEVICE_IDS: 'chrome.laptop_large',
122
+ DATADOG_SYNTHETICS_OVERRIDE_EXECUTION_RULE: 'BLOCKING',
123
+ DATADOG_SYNTHETICS_OVERRIDE_FOLLOW_REDIRECTS: 'true',
124
+ DATADOG_SYNTHETICS_OVERRIDE_HEADERS: "{'Content-Type': 'application/json', 'Authorization': 'Bearer token'}",
125
+ DATADOG_SYNTHETICS_OVERRIDE_LOCATIONS: 'us-east-1;us-west-1',
126
+ DATADOG_SYNTHETICS_OVERRIDE_MOBILE_APPLICATION_VERSION: '00000000-0000-0000-0000-000000000000',
127
+ DATADOG_SYNTHETICS_OVERRIDE_RESOURCE_URL_SUBSTITUTION_REGEXES: 'regex1;regex2',
128
+ DATADOG_SYNTHETICS_OVERRIDE_RETRY_COUNT: '5',
129
+ DATADOG_SYNTHETICS_OVERRIDE_RETRY_INTERVAL: '100',
130
+ DATADOG_SYNTHETICS_OVERRIDE_START_URL: 'startUrl',
131
+ DATADOG_SYNTHETICS_OVERRIDE_START_URL_SUBSTITUTION_REGEX: 'startUrlSubstitutionRegex',
132
+ DATADOG_SYNTHETICS_OVERRIDE_TEST_TIMEOUT: '42',
133
+ DATADOG_SYNTHETICS_OVERRIDE_VARIABLES: "{'var1': 'value1', 'var2': 'value2'}",
134
+ };
135
+ process.env = overrideEnv;
136
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
137
+ yield command['resolveConfig']();
138
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, run_tests_command_1.DEFAULT_COMMAND_CONFIG), { apiKey: overrideEnv.DATADOG_API_KEY, appKey: overrideEnv.DATADOG_APP_KEY, batchTimeout: 1, configPath: overrideEnv.DATADOG_SYNTHETICS_CONFIG_PATH, datadogSite: overrideEnv.DATADOG_SITE, defaultTestOverrides: {
139
+ allowInsecureCertificates: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_ALLOW_INSECURE_CERTIFICATES),
140
+ basicAuth: {
141
+ password: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_PASSWORD,
142
+ username: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_USERNAME,
143
+ },
144
+ body: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_BODY,
145
+ bodyType: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_BODY_TYPE,
146
+ cookies: {
147
+ value: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_COOKIES,
148
+ append: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_COOKIES_APPEND),
149
+ },
150
+ setCookies: {
151
+ value: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES,
152
+ append: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES_APPEND),
153
+ },
154
+ defaultStepTimeout: (0, env_1.toNumber)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_DEFAULT_STEP_TIMEOUT),
155
+ deviceIds: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_DEVICE_IDS.split(';'),
156
+ executionRule: (0, internal_1.toExecutionRule)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_EXECUTION_RULE),
157
+ followRedirects: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_FOLLOW_REDIRECTS),
158
+ headers: (0, env_1.toStringMap)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_HEADERS),
159
+ locations: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_LOCATIONS.split(';'),
160
+ mobileApplicationVersion: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_MOBILE_APPLICATION_VERSION,
161
+ resourceUrlSubstitutionRegexes: (_a = overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_RESOURCE_URL_SUBSTITUTION_REGEXES) === null || _a === void 0 ? void 0 : _a.split(';'),
162
+ retry: {
163
+ count: (0, env_1.toNumber)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_RETRY_COUNT),
164
+ interval: (0, env_1.toNumber)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_RETRY_INTERVAL),
165
+ },
166
+ startUrl: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_START_URL,
167
+ startUrlSubstitutionRegex: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_START_URL_SUBSTITUTION_REGEX,
168
+ testTimeout: (0, env_1.toNumber)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_TEST_TIMEOUT),
169
+ variables: (0, env_1.toStringMap)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_VARIABLES),
170
+ }, failOnCriticalErrors: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_FAIL_ON_CRITICAL_ERRORS), failOnMissingTests: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_FAIL_ON_MISSING_TESTS), failOnTimeout: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_FAIL_ON_TIMEOUT), files: overrideEnv.DATADOG_SYNTHETICS_FILES.split(';'), jUnitReport: overrideEnv.DATADOG_SYNTHETICS_JUNIT_REPORT, publicIds: overrideEnv.DATADOG_SYNTHETICS_PUBLIC_IDS.split(';'), selectiveRerun: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_SELECTIVE_RERUN), subdomain: overrideEnv.DATADOG_SUBDOMAIN, testSearchQuery: overrideEnv.DATADOG_SYNTHETICS_TEST_SEARCH_QUERY, tunnel: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_TUNNEL) }));
171
+ }));
172
+ test('partial retryConfig override from ENV retains existing values', () => __awaiter(void 0, void 0, void 0, function* () {
173
+ const overrideEnv = {
174
+ DATADOG_SYNTHETICS_OVERRIDE_RETRY_COUNT: '5',
175
+ };
176
+ process.env = overrideEnv;
177
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
178
+ command['config'].defaultTestOverrides = Object.assign(Object.assign({}, command['config'].defaultTestOverrides), { retry: {
179
+ count: 1,
180
+ interval: 42,
181
+ } });
182
+ yield command['resolveConfig']();
183
+ expect(command['config'].defaultTestOverrides.retry).toEqual({
184
+ count: 5,
185
+ interval: 42,
186
+ });
187
+ }));
188
+ test('override from config file', () => __awaiter(void 0, void 0, void 0, function* () {
189
+ const expectedConfig = {
190
+ apiKey: 'fake_api_key',
191
+ appKey: 'fake_app_key',
192
+ batchTimeout: 1,
193
+ configPath: 'src/commands/synthetics/__tests__/config-fixtures/config-with-all-keys.json',
194
+ datadogSite: 'datadoghq.eu',
195
+ defaultTestOverrides: {
196
+ allowInsecureCertificates: true,
197
+ basicAuth: { username: 'test', password: 'test' },
198
+ body: '{"fakeContent":true}',
199
+ bodyType: 'application/json',
200
+ cookies: {
201
+ value: 'name1=value1;name2=value2;',
202
+ append: true,
203
+ },
204
+ setCookies: {
205
+ value: 'name1=value1 \n name2=value2; Domain=example.com \n name3=value3; Secure; HttpOnly',
206
+ append: true,
207
+ },
208
+ defaultStepTimeout: 10000,
209
+ deviceIds: ['chrome.laptop_large'],
210
+ executionRule: interfaces_1.ExecutionRule.BLOCKING,
211
+ followRedirects: true,
212
+ headers: { '<NEW_HEADER>': '<NEW_VALUE>' },
213
+ locations: ['aws:us-west-1'],
214
+ mobileApplicationVersion: '00000000-0000-0000-0000-000000000000',
215
+ mobileApplicationVersionFilePath: './path/to/application.apk',
216
+ resourceUrlSubstitutionRegexes: [
217
+ 's/(https://www.)(.*)/$1extra-$2',
218
+ 'https://example.com(.*)|http://subdomain.example.com$1',
219
+ ],
220
+ retry: { count: 2, interval: 300 },
221
+ startUrl: '{{URL}}?static_hash={{STATIC_HASH}}',
222
+ startUrlSubstitutionRegex: 's/(https://www.)(.*)/$1extra-$2/',
223
+ testTimeout: 200000,
224
+ variables: { titleVariable: 'new value' },
225
+ },
226
+ failOnCriticalErrors: true,
227
+ failOnMissingTests: true,
228
+ failOnTimeout: false,
229
+ files: ['my-new-file'],
230
+ jUnitReport: 'junit-report.xml',
231
+ proxy: {
232
+ protocol: 'https',
233
+ },
234
+ publicIds: ['ran-dom-id1'],
235
+ selectiveRerun: true,
236
+ subdomain: 'ppa',
237
+ testSearchQuery: 'a-search-query',
238
+ tunnel: true,
239
+ };
240
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
241
+ command.configPath = 'src/commands/synthetics/__tests__/config-fixtures/config-with-all-keys.json';
242
+ yield command['resolveConfig']();
243
+ expect(command['config']).toEqual(expectedConfig);
244
+ }));
245
+ test('override from CLI', () => __awaiter(void 0, void 0, void 0, function* () {
246
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
247
+ const overrideCLI = {
248
+ apiKey: 'fake_api_key',
249
+ appKey: 'fake_app_key',
250
+ batchTimeout: 1,
251
+ configPath: 'src/commands/synthetics/__tests__/config-fixtures/empty-config-file.json',
252
+ datadogSite: 'datadoghq.eu',
253
+ failOnCriticalErrors: true,
254
+ failOnMissingTests: true,
255
+ failOnTimeout: false,
256
+ files: ['new-file'],
257
+ jUnitReport: 'junit-report.xml',
258
+ mobileApplicationVersionFilePath: './path/to/application.apk',
259
+ publicIds: ['ran-dom-id2'],
260
+ selectiveRerun: true,
261
+ subdomain: 'new-sub-domain',
262
+ testSearchQuery: 'a-search-query',
263
+ tunnel: true,
264
+ };
265
+ /** Values passed to `--override`. */
266
+ const defaultTestOverrides = {
267
+ allowInsecureCertificates: true,
268
+ basicAuth: {
269
+ password: 'password',
270
+ username: 'username',
271
+ },
272
+ body: 'a body',
273
+ bodyType: 'bodyType',
274
+ cookies: 'name1=value1;name2=value2;',
275
+ setCookies: 'name1=value1 \n name2=value2; Domain=example.com \n name3=value3; Secure; HttpOnly',
276
+ defaultStepTimeout: 42,
277
+ deviceIds: ['chrome.laptop_large', 'chrome.laptop_small', 'firefox.laptop_large'],
278
+ executionRule: interfaces_1.ExecutionRule.BLOCKING,
279
+ followRedirects: true,
280
+ headers: { 'Content-Type': 'application/json', Authorization: 'Bearer token' },
281
+ locations: ['us-east-1', 'us-west-1'],
282
+ mobileApplicationVersion: '00000000-0000-0000-0000-000000000000',
283
+ resourceUrlSubstitutionRegexes: [
284
+ 's/(https://www.)(.*)/$1extra-$2',
285
+ 'https://example.com(.*)|http://subdomain.example.com$1',
286
+ ],
287
+ retry: {
288
+ count: 5,
289
+ interval: 42,
290
+ },
291
+ startUrl: 'startUrl',
292
+ startUrlSubstitutionRegex: 'startUrlSubstitutionRegex',
293
+ testTimeout: 42,
294
+ variables: { var1: 'value1', var2: 'value2' },
295
+ };
296
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
297
+ command['apiKey'] = overrideCLI.apiKey;
298
+ command['appKey'] = overrideCLI.appKey;
299
+ command['batchTimeout'] = overrideCLI.batchTimeout;
300
+ command['configPath'] = overrideCLI.configPath;
301
+ command['datadogSite'] = overrideCLI.datadogSite;
302
+ command['failOnCriticalErrors'] = overrideCLI.failOnCriticalErrors;
303
+ command['failOnMissingTests'] = overrideCLI.failOnMissingTests;
304
+ command['failOnTimeout'] = overrideCLI.failOnTimeout;
305
+ command['files'] = overrideCLI.files;
306
+ command['jUnitReport'] = overrideCLI.jUnitReport;
307
+ command['mobileApplicationVersion'] = defaultTestOverrides.mobileApplicationVersion;
308
+ command['mobileApplicationVersionFilePath'] = overrideCLI.mobileApplicationVersionFilePath;
309
+ command['publicIds'] = overrideCLI.publicIds;
310
+ command['selectiveRerun'] = overrideCLI.selectiveRerun;
311
+ command['subdomain'] = overrideCLI.subdomain;
312
+ command['tunnel'] = overrideCLI.tunnel;
313
+ command['testSearchQuery'] = overrideCLI.testSearchQuery;
314
+ command['overrides'] = [
315
+ `allowInsecureCertificates=${defaultTestOverrides.allowInsecureCertificates}`,
316
+ `basicAuth.password=${(_b = defaultTestOverrides.basicAuth) === null || _b === void 0 ? void 0 : _b.password}`,
317
+ `basicAuth.username=${(_c = defaultTestOverrides.basicAuth) === null || _c === void 0 ? void 0 : _c.username}`,
318
+ `body=${defaultTestOverrides.body}`,
319
+ `bodyType=${defaultTestOverrides.bodyType}`,
320
+ `cookies=${defaultTestOverrides.cookies}`,
321
+ `cookies.append=true`,
322
+ `setCookies=${defaultTestOverrides.setCookies}`,
323
+ `setCookies.append=true`,
324
+ `defaultStepTimeout=${defaultTestOverrides.defaultStepTimeout}`,
325
+ `deviceIds=${(_d = defaultTestOverrides.deviceIds) === null || _d === void 0 ? void 0 : _d.join(';')}`,
326
+ `executionRule=${defaultTestOverrides.executionRule}`,
327
+ `followRedirects=${defaultTestOverrides.followRedirects}`,
328
+ `headers.Content-Type=${defaultTestOverrides.headers ? defaultTestOverrides.headers['Content-Type'] : ''}`,
329
+ `headers.Authorization=${(_e = defaultTestOverrides.headers) === null || _e === void 0 ? void 0 : _e.Authorization}`,
330
+ `locations=${(_f = defaultTestOverrides.locations) === null || _f === void 0 ? void 0 : _f.join(';')}`,
331
+ `retry.count=${(_g = defaultTestOverrides.retry) === null || _g === void 0 ? void 0 : _g.count}`,
332
+ `retry.interval=${(_h = defaultTestOverrides.retry) === null || _h === void 0 ? void 0 : _h.interval}`,
333
+ `startUrl=${defaultTestOverrides.startUrl}`,
334
+ `startUrlSubstitutionRegex=${defaultTestOverrides.startUrlSubstitutionRegex}`,
335
+ `testTimeout=${defaultTestOverrides.testTimeout}`,
336
+ `resourceUrlSubstitutionRegexes=${(_j = defaultTestOverrides.resourceUrlSubstitutionRegexes) === null || _j === void 0 ? void 0 : _j.join(';')}`,
337
+ `variables.var1=${(_k = defaultTestOverrides.variables) === null || _k === void 0 ? void 0 : _k.var1}`,
338
+ `variables.var2=${(_l = defaultTestOverrides.variables) === null || _l === void 0 ? void 0 : _l.var2}`,
339
+ ];
340
+ yield command['resolveConfig']();
341
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, run_tests_command_1.DEFAULT_COMMAND_CONFIG), { apiKey: 'fake_api_key', appKey: 'fake_app_key', batchTimeout: 1, configPath: 'src/commands/synthetics/__tests__/config-fixtures/empty-config-file.json', datadogSite: 'datadoghq.eu', defaultTestOverrides: {
342
+ allowInsecureCertificates: true,
343
+ basicAuth: {
344
+ password: 'password',
345
+ username: 'username',
346
+ },
347
+ body: 'a body',
348
+ bodyType: 'bodyType',
349
+ cookies: {
350
+ value: 'name1=value1;name2=value2;',
351
+ append: true,
352
+ },
353
+ setCookies: {
354
+ value: 'name1=value1 \n name2=value2; Domain=example.com \n name3=value3; Secure; HttpOnly',
355
+ append: true,
356
+ },
357
+ defaultStepTimeout: 42,
358
+ deviceIds: ['chrome.laptop_large', 'chrome.laptop_small', 'firefox.laptop_large'],
359
+ executionRule: interfaces_1.ExecutionRule.BLOCKING,
360
+ followRedirects: true,
361
+ headers: { 'Content-Type': 'application/json', Authorization: 'Bearer token' },
362
+ locations: ['us-east-1', 'us-west-1'],
363
+ mobileApplicationVersion: '00000000-0000-0000-0000-000000000000',
364
+ mobileApplicationVersionFilePath: './path/to/application.apk',
365
+ resourceUrlSubstitutionRegexes: [
366
+ 's/(https://www.)(.*)/$1extra-$2',
367
+ 'https://example.com(.*)|http://subdomain.example.com$1',
368
+ ],
369
+ retry: {
370
+ count: 5,
371
+ interval: 42,
372
+ },
373
+ startUrl: 'startUrl',
374
+ startUrlSubstitutionRegex: 'startUrlSubstitutionRegex',
375
+ testTimeout: 42,
376
+ variables: { var1: 'value1', var2: 'value2' },
377
+ }, failOnCriticalErrors: true, failOnMissingTests: true, failOnTimeout: false, files: ['new-file'], jUnitReport: 'junit-report.xml', publicIds: ['ran-dom-id2'], selectiveRerun: true, subdomain: 'new-sub-domain', testSearchQuery: 'a-search-query', tunnel: true }));
378
+ }));
379
+ // We have 2 code paths that handle different levels of configuration overrides:
380
+ // 1) entire global config file < ENV (environment variables) < CLI (command flags)
381
+ // 2) defaultTestOverrides in global config file < ENV (environment variables) < test file (test configuration)
382
+ //
383
+ // First, 1) configures datadog-ci itself and `defaultTestOverrides`,
384
+ // Then, 2) configures the Synthetic tests to execute.
385
+ //
386
+ // So the bigger picture is:
387
+ //
388
+ // (config file < ENV < CLI < test file) => execute tests
389
+ describe('override precedence - [config file < ENV < CLI < test file]', () => {
390
+ const configFile = {
391
+ apiKey: 'config_file_api_key',
392
+ appKey: 'config_file_app_key',
393
+ datadogSite: 'us3.datadoghq.com',
394
+ defaultTestOverrides: {
395
+ allowInsecureCertificates: true,
396
+ basicAuth: {
397
+ username: 'config-file-username',
398
+ password: 'config-file-password',
399
+ },
400
+ body: '{"fakeContentFromConfigFile":true}',
401
+ bodyType: 'application/json-from-config-file',
402
+ cookies: {
403
+ value: 'cookie1-from-config-file=cookie1-value;cookie2-from-config-file=cookie2-value;',
404
+ append: true,
405
+ },
406
+ defaultStepTimeout: 10000,
407
+ deviceIds: ['chrome.laptop_large_from_config_file', 'chrome.laptop_small_from_config_file'],
408
+ executionRule: interfaces_1.ExecutionRule.BLOCKING,
409
+ followRedirects: true,
410
+ headers: { 'Config-File': 'This is a mess' },
411
+ mobileApplicationVersion: '00000000-0000-0000-0000-000000000000-config-file',
412
+ mobileApplicationVersionFilePath: './path/to/application-from-config-file.apk',
413
+ retry: { count: 2, interval: 300 },
414
+ resourceUrlSubstitutionRegexes: ['regex1-from-config-file', 'regex2-from-config-file'],
415
+ startUrl: '{{URL}}?static_hash={{STATIC_HASH}}',
416
+ startUrlSubstitutionRegex: 's/(https://www.)(.*)/$1extra-$2/',
417
+ testTimeout: 200000,
418
+ variables: { titleVariable: 'config file value' },
419
+ },
420
+ failOnCriticalErrors: false,
421
+ failOnMissingTests: false,
422
+ failOnTimeout: false,
423
+ files: ['from_config_file.json'],
424
+ jUnitReport: 'junit-report-from-config-file.xml',
425
+ proxy: { protocol: 'http' },
426
+ publicIds: ['public-id-from-config-file'],
427
+ selectiveRerun: false,
428
+ subdomain: 'subdomain_from_config_file',
429
+ testSearchQuery: 'a-search-query-from-config-file',
430
+ tunnel: false,
431
+ };
432
+ test('config file < ENV', () => __awaiter(void 0, void 0, void 0, function* () {
433
+ var _a, _b, _c;
434
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementationOnce((baseConfig) => __awaiter(void 0, void 0, void 0, function* () {
435
+ return (Object.assign(Object.assign({}, baseConfig), configFile));
436
+ }));
437
+ const overrideEnv = {
438
+ DATADOG_API_KEY: 'env_api_key',
439
+ DATADOG_APP_KEY: 'env_app_key',
440
+ DATADOG_SITE: 'us5.datadoghq.com',
441
+ DATADOG_SUBDOMAIN: 'subdomain_from_env',
442
+ DATADOG_SYNTHETICS_BATCH_TIMEOUT: '1',
443
+ DATADOG_SYNTHETICS_CONFIG_PATH: 'path/to/config_from_env.json',
444
+ DATADOG_SYNTHETICS_FAIL_ON_CRITICAL_ERRORS: 'true',
445
+ DATADOG_SYNTHETICS_FAIL_ON_MISSING_TESTS: 'true',
446
+ DATADOG_SYNTHETICS_FAIL_ON_TIMEOUT: 'true',
447
+ DATADOG_SYNTHETICS_FILES: '1_from_env.json;2_from_env.json',
448
+ DATADOG_SYNTHETICS_JUNIT_REPORT: 'junit-report-from-env.xml',
449
+ DATADOG_SYNTHETICS_PUBLIC_IDS: 'a-public-id-from-env;another-public-id-from-env',
450
+ DATADOG_SYNTHETICS_SELECTIVE_RERUN: 'true',
451
+ DATADOG_SYNTHETICS_TEST_SEARCH_QUERY: 'a-search-query-from-env',
452
+ DATADOG_SYNTHETICS_TUNNEL: 'true',
453
+ DATADOG_SYNTHETICS_OVERRIDE_ALLOW_INSECURE_CERTIFICATES: 'true',
454
+ DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_PASSWORD: 'password-from-env',
455
+ DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_USERNAME: 'username-from-env',
456
+ DATADOG_SYNTHETICS_OVERRIDE_BODY: 'body-from-env',
457
+ DATADOG_SYNTHETICS_OVERRIDE_BODY_TYPE: 'bodyType-from-env',
458
+ DATADOG_SYNTHETICS_OVERRIDE_COOKIES: 'cookie1-from-env;cookie2-from-env;cookie3-from-env',
459
+ DATADOG_SYNTHETICS_OVERRIDE_COOKIES_APPEND: 'true',
460
+ DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES: 'cookie1-from-env \n cookie2-from-env; Domain=example.com \n cookie3-from-env; Secure; HttpOnly',
461
+ DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES_APPEND: 'true',
462
+ DATADOG_SYNTHETICS_OVERRIDE_DEFAULT_STEP_TIMEOUT: '42',
463
+ DATADOG_SYNTHETICS_OVERRIDE_DEVICE_IDS: 'chrome.laptop_large_from_env',
464
+ DATADOG_SYNTHETICS_OVERRIDE_EXECUTION_RULE: 'NON_BLOCKING',
465
+ DATADOG_SYNTHETICS_OVERRIDE_FOLLOW_REDIRECTS: 'false',
466
+ DATADOG_SYNTHETICS_OVERRIDE_HEADERS: "{'Content-Type': 'application/json', 'Authorization': 'Bearer token from env'}",
467
+ DATADOG_SYNTHETICS_OVERRIDE_LOCATIONS: 'location_1_from_env;location_2_from_env',
468
+ DATADOG_SYNTHETICS_OVERRIDE_MOBILE_APPLICATION_VERSION: '00000000-0000-0000-0000-000000000000',
469
+ DATADOG_SYNTHETICS_OVERRIDE_RESOURCE_URL_SUBSTITUTION_REGEXES: 'regex1-from-env;regex2-from-env',
470
+ DATADOG_SYNTHETICS_OVERRIDE_RETRY_COUNT: '5',
471
+ DATADOG_SYNTHETICS_OVERRIDE_RETRY_INTERVAL: '100',
472
+ DATADOG_SYNTHETICS_OVERRIDE_START_URL: 'startUrl',
473
+ DATADOG_SYNTHETICS_OVERRIDE_START_URL_SUBSTITUTION_REGEX: 'startUrlSubstitutionRegex',
474
+ DATADOG_SYNTHETICS_OVERRIDE_TEST_TIMEOUT: '42',
475
+ DATADOG_SYNTHETICS_OVERRIDE_VARIABLES: "{'var1': 'value1', 'var2': 'value2'}",
476
+ };
477
+ const expectedEnvOverrideResult = {
478
+ apiKey: overrideEnv.DATADOG_API_KEY,
479
+ appKey: overrideEnv.DATADOG_APP_KEY,
480
+ batchTimeout: (0, env_1.toNumber)(overrideEnv.DATADOG_SYNTHETICS_BATCH_TIMEOUT),
481
+ configPath: overrideEnv.DATADOG_SYNTHETICS_CONFIG_PATH,
482
+ datadogSite: overrideEnv.DATADOG_SITE,
483
+ defaultTestOverrides: {
484
+ allowInsecureCertificates: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_ALLOW_INSECURE_CERTIFICATES),
485
+ basicAuth: {
486
+ password: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_PASSWORD,
487
+ username: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_USERNAME,
488
+ },
489
+ body: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_BODY,
490
+ bodyType: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_BODY_TYPE,
491
+ cookies: {
492
+ value: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_COOKIES,
493
+ append: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_COOKIES_APPEND),
494
+ },
495
+ setCookies: {
496
+ value: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES,
497
+ append: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES_APPEND),
498
+ },
499
+ defaultStepTimeout: (0, env_1.toNumber)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_DEFAULT_STEP_TIMEOUT),
500
+ deviceIds: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_DEVICE_IDS.split(';'),
501
+ executionRule: (0, internal_1.toExecutionRule)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_EXECUTION_RULE),
502
+ followRedirects: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_FOLLOW_REDIRECTS),
503
+ headers: (0, env_1.toStringMap)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_HEADERS),
504
+ locations: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_LOCATIONS.split(';'),
505
+ mobileApplicationVersion: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_MOBILE_APPLICATION_VERSION,
506
+ resourceUrlSubstitutionRegexes: (_a = overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_RESOURCE_URL_SUBSTITUTION_REGEXES) === null || _a === void 0 ? void 0 : _a.split(';'),
507
+ retry: {
508
+ count: (0, env_1.toNumber)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_RETRY_COUNT),
509
+ interval: (0, env_1.toNumber)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_RETRY_INTERVAL),
510
+ },
511
+ startUrl: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_START_URL,
512
+ startUrlSubstitutionRegex: overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_START_URL_SUBSTITUTION_REGEX,
513
+ testTimeout: (0, env_1.toNumber)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_TEST_TIMEOUT),
514
+ variables: (0, env_1.toStringMap)(overrideEnv.DATADOG_SYNTHETICS_OVERRIDE_VARIABLES),
515
+ // XXX: Added to make the test pass as we don't have an ENV variable for `mobileApplicationVersionFilePath`.
516
+ mobileApplicationVersionFilePath: configFile.defaultTestOverrides.mobileApplicationVersionFilePath,
517
+ },
518
+ failOnCriticalErrors: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_FAIL_ON_CRITICAL_ERRORS),
519
+ failOnMissingTests: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_FAIL_ON_MISSING_TESTS),
520
+ failOnTimeout: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_FAIL_ON_TIMEOUT),
521
+ files: (_b = overrideEnv.DATADOG_SYNTHETICS_FILES) === null || _b === void 0 ? void 0 : _b.split(';'),
522
+ jUnitReport: overrideEnv.DATADOG_SYNTHETICS_JUNIT_REPORT,
523
+ publicIds: (_c = overrideEnv.DATADOG_SYNTHETICS_PUBLIC_IDS) === null || _c === void 0 ? void 0 : _c.split(';'),
524
+ selectiveRerun: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_SELECTIVE_RERUN),
525
+ subdomain: overrideEnv.DATADOG_SUBDOMAIN,
526
+ testSearchQuery: overrideEnv.DATADOG_SYNTHETICS_TEST_SEARCH_QUERY,
527
+ tunnel: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_TUNNEL),
528
+ // XXX: Added to make the test pass as we use well-known ENV variables to configure the proxy.
529
+ proxy: configFile.proxy,
530
+ };
531
+ process.env = overrideEnv;
532
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
533
+ yield command['resolveConfig']();
534
+ expect(command['config']).toEqual(expectedEnvOverrideResult);
535
+ }));
536
+ test('config file < CLI', () => __awaiter(void 0, void 0, void 0, function* () {
537
+ var _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
538
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementationOnce((baseConfig) => __awaiter(void 0, void 0, void 0, function* () {
539
+ return (Object.assign(Object.assign({}, baseConfig), configFile));
540
+ }));
541
+ const overrideCLI = {
542
+ apiKey: 'cli_api_key',
543
+ appKey: 'cli_app_key',
544
+ batchTimeout: 1,
545
+ configPath: 'src/commands/synthetics/__tests__/config-fixtures/empty-config-file-from-cli.json',
546
+ datadogSite: 'datadoghq.eu',
547
+ failOnCriticalErrors: true,
548
+ failOnMissingTests: true,
549
+ failOnTimeout: true,
550
+ files: ['new-file-from-cli'],
551
+ jUnitReport: 'junit-report-from-cli.xml',
552
+ mobileApplicationVersionFilePath: './path/to/application-from-cli.apk',
553
+ publicIds: ['public-id-from-cli'],
554
+ selectiveRerun: true,
555
+ subdomain: 'subdomain-from-cli',
556
+ testSearchQuery: 'a-search-query-from-cli',
557
+ tunnel: true,
558
+ };
559
+ const defaultTestOverrides = {
560
+ allowInsecureCertificates: false,
561
+ basicAuth: {
562
+ password: 'password-cli',
563
+ username: 'username-cli',
564
+ },
565
+ body: '{"fakeContentFromCLI":true}',
566
+ bodyType: 'application/json-from-cli',
567
+ cookies: {
568
+ value: 'cli1=value1;cli2=value2;',
569
+ append: false,
570
+ },
571
+ setCookies: {
572
+ value: 'cli1=value1 \n cli2=value2; Domain=example.com \n cli3=value3; Secure; HttpOnly',
573
+ append: false,
574
+ },
575
+ defaultStepTimeout: 11,
576
+ deviceIds: ['chrome.laptop_large_from_cli', 'chrome.laptop_small_from_cli', 'firefox.laptop_large_from_cli'],
577
+ executionRule: interfaces_1.ExecutionRule.NON_BLOCKING,
578
+ followRedirects: false,
579
+ headers: { 'Content-Type': 'application/json', Authorization: 'Bearer token from cli' },
580
+ locations: ['cli-loc-1', 'cli-loc-2'],
581
+ mobileApplicationVersion: '00000000-0000-0000-0000-000000000000-cli',
582
+ resourceUrlSubstitutionRegexes: [
583
+ 'cli-regex',
584
+ 's/(https://www.)(.*)/$1extra-$2',
585
+ 'https://example.com(.*)|http://subdomain.example.com$1',
586
+ ],
587
+ retry: {
588
+ count: 13,
589
+ interval: 14,
590
+ },
591
+ startUrl: 'startUrl-from-cli',
592
+ startUrlSubstitutionRegex: 'startUrlSubstitutionRegex-from-cli',
593
+ testTimeout: 15,
594
+ variables: { cliVar1: 'value1', cliVar2: 'value2' },
595
+ };
596
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
597
+ command['apiKey'] = overrideCLI.apiKey;
598
+ command['appKey'] = overrideCLI.appKey;
599
+ command['batchTimeout'] = overrideCLI.batchTimeout;
600
+ command['configPath'] = overrideCLI.configPath;
601
+ command['datadogSite'] = overrideCLI.datadogSite;
602
+ command['failOnCriticalErrors'] = overrideCLI.failOnCriticalErrors;
603
+ command['failOnMissingTests'] = overrideCLI.failOnMissingTests;
604
+ command['failOnTimeout'] = overrideCLI.failOnTimeout;
605
+ command['files'] = overrideCLI.files;
606
+ command['jUnitReport'] = overrideCLI.jUnitReport;
607
+ command['mobileApplicationVersion'] = defaultTestOverrides.mobileApplicationVersion;
608
+ command['mobileApplicationVersionFilePath'] = overrideCLI.mobileApplicationVersionFilePath;
609
+ command['publicIds'] = overrideCLI.publicIds;
610
+ command['selectiveRerun'] = overrideCLI.selectiveRerun;
611
+ command['subdomain'] = overrideCLI.subdomain;
612
+ command['tunnel'] = overrideCLI.tunnel;
613
+ command['testSearchQuery'] = overrideCLI.testSearchQuery;
614
+ command['overrides'] = [
615
+ `allowInsecureCertificates=${defaultTestOverrides.allowInsecureCertificates}`,
616
+ `basicAuth.password=${(_d = defaultTestOverrides.basicAuth) === null || _d === void 0 ? void 0 : _d.password}`,
617
+ `basicAuth.username=${(_e = defaultTestOverrides.basicAuth) === null || _e === void 0 ? void 0 : _e.username}`,
618
+ `body=${defaultTestOverrides.body}`,
619
+ `bodyType=${defaultTestOverrides.bodyType}`,
620
+ `cookies=${defaultTestOverrides.cookies.value}`,
621
+ `cookies.append=${defaultTestOverrides.cookies.append}`,
622
+ `setCookies=${defaultTestOverrides.setCookies.value}`,
623
+ `setCookies.append=${defaultTestOverrides.setCookies.append}`,
624
+ `defaultStepTimeout=${defaultTestOverrides.defaultStepTimeout}`,
625
+ `deviceIds=${(_f = defaultTestOverrides.deviceIds) === null || _f === void 0 ? void 0 : _f.join(';')}`,
626
+ `executionRule=${defaultTestOverrides.executionRule}`,
627
+ `followRedirects=${defaultTestOverrides.followRedirects}`,
628
+ `headers.Content-Type=${defaultTestOverrides.headers ? defaultTestOverrides.headers['Content-Type'] : ''}`,
629
+ `headers.Authorization=${(_g = defaultTestOverrides.headers) === null || _g === void 0 ? void 0 : _g.Authorization}`,
630
+ `locations=${(_h = defaultTestOverrides.locations) === null || _h === void 0 ? void 0 : _h.join(';')}`,
631
+ `retry.count=${(_j = defaultTestOverrides.retry) === null || _j === void 0 ? void 0 : _j.count}`,
632
+ `retry.interval=${(_k = defaultTestOverrides.retry) === null || _k === void 0 ? void 0 : _k.interval}`,
633
+ `startUrl=${defaultTestOverrides.startUrl}`,
634
+ `startUrlSubstitutionRegex=${defaultTestOverrides.startUrlSubstitutionRegex}`,
635
+ `testTimeout=${defaultTestOverrides.testTimeout}`,
636
+ `resourceUrlSubstitutionRegexes=${(_l = defaultTestOverrides.resourceUrlSubstitutionRegexes) === null || _l === void 0 ? void 0 : _l.join(';')}`,
637
+ `variables.cliVar1=${(_m = defaultTestOverrides.variables) === null || _m === void 0 ? void 0 : _m.cliVar1}`,
638
+ `variables.cliVar2=${(_o = defaultTestOverrides.variables) === null || _o === void 0 ? void 0 : _o.cliVar2}`,
639
+ ];
640
+ yield command['resolveConfig']();
641
+ const { mobileApplicationVersionFilePath } = overrideCLI, filteredOverrideCLI = __rest(overrideCLI, ["mobileApplicationVersionFilePath"]);
642
+ const expectedCLIOverrideResult = Object.assign(Object.assign({}, filteredOverrideCLI), { defaultTestOverrides: Object.assign(Object.assign({}, defaultTestOverrides), { mobileApplicationVersionFilePath }), proxy: configFile.proxy });
643
+ expect(command['config']).toEqual(expectedCLIOverrideResult);
644
+ }));
645
+ test('ENV < CLI', () => __awaiter(void 0, void 0, void 0, function* () {
646
+ var _p, _q, _r, _s, _t, _u, _v, _w, _x, _y;
647
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementationOnce((baseConfig) => __awaiter(void 0, void 0, void 0, function* () { return baseConfig; }));
648
+ const overrideEnv = {
649
+ DATADOG_API_KEY: 'env_api_key',
650
+ DATADOG_APP_KEY: 'env_app_key',
651
+ DATADOG_SITE: 'us5.datadoghq.com',
652
+ DATADOG_SYNTHETICS_CONFIG_PATH: 'path/to/config_from_env.json',
653
+ DATADOG_SUBDOMAIN: 'subdomain_from_env',
654
+ DATADOG_SYNTHETICS_FAIL_ON_CRITICAL_ERRORS: 'true',
655
+ DATADOG_SYNTHETICS_FAIL_ON_MISSING_TESTS: 'true',
656
+ DATADOG_SYNTHETICS_FAIL_ON_TIMEOUT: 'true',
657
+ DATADOG_SYNTHETICS_FILES: '1_from_env.json;2_from_env.json',
658
+ DATADOG_SYNTHETICS_JUNIT_REPORT: 'junit-report-from-env.xml',
659
+ DATADOG_SYNTHETICS_PUBLIC_IDS: 'a-public-id-from-env;another-public-id-from-env',
660
+ DATADOG_SYNTHETICS_SELECTIVE_RERUN: 'true',
661
+ DATADOG_SYNTHETICS_TEST_SEARCH_QUERY: 'a-search-query-from-env',
662
+ DATADOG_SYNTHETICS_TUNNEL: 'false',
663
+ DATADOG_SYNTHETICS_OVERRIDE_ALLOW_INSECURE_CERTIFICATES: 'true',
664
+ DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_PASSWORD: 'password-from-env',
665
+ DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_USERNAME: 'username-from-env',
666
+ DATADOG_SYNTHETICS_OVERRIDE_BODY: 'body-from-env',
667
+ DATADOG_SYNTHETICS_OVERRIDE_BODY_TYPE: 'bodyType-from-env',
668
+ DATADOG_SYNTHETICS_OVERRIDE_COOKIES: 'cookie1-from-env;cookie2-from-env;cookie3-from-env',
669
+ DATADOG_SYNTHETICS_OVERRIDE_COOKIES_APPEND: 'true',
670
+ DATADOG_SYNTHEITCS_OVERRIDE_SET_COOKIES: 'cookie1-from-env \n cookie2-from-env; Domain=example.com \n cookie3-from-env; Secure; HttpOnly',
671
+ DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES_APPEND: 'true',
672
+ DATADOG_SYNTHETICS_OVERRIDE_DEFAULT_STEP_TIMEOUT: '42',
673
+ DATADOG_SYNTHETICS_OVERRIDE_DEVICE_IDS: 'chrome.laptop_large_from_env',
674
+ DATADOG_SYNTHETICS_OVERRIDE_EXECUTION_RULE: 'BLOCKING',
675
+ DATADOG_SYNTHETICS_OVERRIDE_FOLLOW_REDIRECTS: 'true',
676
+ DATADOG_SYNTHETICS_OVERRIDE_HEADERS: "{'Content-Type': 'application/json', 'Authorization': 'Bearer token from env'}",
677
+ DATADOG_SYNTHETICS_OVERRIDE_LOCATIONS: 'location_1_from_env;location_2_from_env',
678
+ DATADOG_SYNTHETICS_OVERRIDE_MOBILE_APPLICATION_VERSION: 'env-00000000-0000-0000-0000-000000000000',
679
+ DATADOG_SYNTHETICS_OVERRIDE_RESOURCE_URL_SUBSTITUTION_REGEXES: 'env-regex1;env-regex2',
680
+ DATADOG_SYNTHETICS_OVERRIDE_RETRY_COUNT: '5',
681
+ DATADOG_SYNTHETICS_OVERRIDE_RETRY_INTERVAL: '100',
682
+ DATADOG_SYNTHETICS_OVERRIDE_START_URL: 'startUrl-from-env',
683
+ DATADOG_SYNTHETICS_OVERRIDE_START_URL_SUBSTITUTION_REGEX: 'startUrlSubstitutionRegex-from-env',
684
+ DATADOG_SYNTHETICS_OVERRIDE_TEST_TIMEOUT: '42',
685
+ DATADOG_SYNTHETICS_OVERRIDE_VARIABLES: "{'envVar1': 'value1', 'envVar2': 'value2'}",
686
+ };
687
+ const overrideCLI = {
688
+ apiKey: 'cli_api_key',
689
+ appKey: 'cli_app_key',
690
+ batchTimeout: 1,
691
+ configPath: 'path/to/config_from_cli.json',
692
+ datadogSite: 'datadoghq.eu',
693
+ failOnCriticalErrors: false,
694
+ failOnMissingTests: false,
695
+ failOnTimeout: false,
696
+ files: ['file-from-cli-1;file-from-cli-2'],
697
+ jUnitReport: 'junit-report-from-cli.xml',
698
+ mobileApplicationVersionFilePath: './path/to/application-from-cli.apk',
699
+ publicIds: ['public-id-from-cli-1', 'public-id-from-cli-2'],
700
+ selectiveRerun: false,
701
+ subdomain: 'subdomain-from-cli',
702
+ testSearchQuery: 'a-search-query-from-cli',
703
+ tunnel: true,
704
+ };
705
+ const defaultTestOverrides = {
706
+ allowInsecureCertificates: false,
707
+ basicAuth: {
708
+ password: 'password-cli',
709
+ username: 'username-cli',
710
+ },
711
+ body: 'a body from cli',
712
+ bodyType: 'bodyType from cli',
713
+ cookies: {
714
+ value: 'cli1=value1;cli2=value2;',
715
+ append: false,
716
+ },
717
+ setCookies: {
718
+ value: 'cli1=value1 \n cli2=value2; Domain=example.com \n cli3=value3; Secure; HttpOnly',
719
+ append: false,
720
+ },
721
+ defaultStepTimeout: 11,
722
+ deviceIds: ['chrome.laptop_large_from_cli', 'chrome.laptop_small_from_cli', 'firefox.laptop_large_from_cli'],
723
+ executionRule: interfaces_1.ExecutionRule.NON_BLOCKING,
724
+ followRedirects: false,
725
+ headers: { 'Content-Type': 'application/json', Authorization: 'Bearer token from cli' },
726
+ locations: ['cli-loc-1', 'cli-loc-2'],
727
+ mobileApplicationVersion: 'cli-00000000-0000-0000-0000-000000000000',
728
+ resourceUrlSubstitutionRegexes: [
729
+ 'from-cli-regex1',
730
+ 's/(https://www.)(.*)/$1extra-$2',
731
+ 'https://example.com(.*)|http://subdomain.example.com$1',
732
+ ],
733
+ retry: {
734
+ count: 13,
735
+ interval: 14,
736
+ },
737
+ startUrl: 'startUrl-from-cli',
738
+ startUrlSubstitutionRegex: 'startUrlSubstitutionRegex-from-cli',
739
+ testTimeout: 15,
740
+ variables: { cliVar1: 'value1', cliVar2: 'value2' },
741
+ };
742
+ process.env = overrideEnv;
743
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
744
+ command['apiKey'] = overrideCLI.apiKey;
745
+ command['appKey'] = overrideCLI.appKey;
746
+ command['batchTimeout'] = overrideCLI.batchTimeout;
747
+ command['configPath'] = overrideCLI.configPath;
748
+ command['datadogSite'] = overrideCLI.datadogSite;
749
+ command['failOnCriticalErrors'] = overrideCLI.failOnCriticalErrors;
750
+ command['failOnMissingTests'] = overrideCLI.failOnMissingTests;
751
+ command['failOnTimeout'] = overrideCLI.failOnTimeout;
752
+ command['files'] = overrideCLI.files;
753
+ command['jUnitReport'] = overrideCLI.jUnitReport;
754
+ command['mobileApplicationVersion'] = defaultTestOverrides.mobileApplicationVersion;
755
+ command['mobileApplicationVersionFilePath'] = overrideCLI.mobileApplicationVersionFilePath;
756
+ command['publicIds'] = overrideCLI.publicIds;
757
+ command['selectiveRerun'] = overrideCLI.selectiveRerun;
758
+ command['subdomain'] = overrideCLI.subdomain;
759
+ command['tunnel'] = overrideCLI.tunnel;
760
+ command['testSearchQuery'] = overrideCLI.testSearchQuery;
761
+ command['overrides'] = [
762
+ `allowInsecureCertificates=${defaultTestOverrides.allowInsecureCertificates}`,
763
+ `basicAuth.password=${(_p = defaultTestOverrides.basicAuth) === null || _p === void 0 ? void 0 : _p.password}`,
764
+ `basicAuth.username=${(_q = defaultTestOverrides.basicAuth) === null || _q === void 0 ? void 0 : _q.username}`,
765
+ `body=${defaultTestOverrides.body}`,
766
+ `bodyType=${defaultTestOverrides.bodyType}`,
767
+ `cookies=${defaultTestOverrides.cookies.value}`,
768
+ `cookies.append=${defaultTestOverrides.cookies.append}`,
769
+ `setCookies=${defaultTestOverrides.setCookies.value}`,
770
+ `setCookies.append=${defaultTestOverrides.setCookies.append}`,
771
+ `defaultStepTimeout=${defaultTestOverrides.defaultStepTimeout}`,
772
+ `deviceIds=${(_r = defaultTestOverrides.deviceIds) === null || _r === void 0 ? void 0 : _r.join(';')}`,
773
+ `executionRule=${defaultTestOverrides.executionRule}`,
774
+ `followRedirects=${defaultTestOverrides.followRedirects}`,
775
+ `headers.Content-Type=${defaultTestOverrides.headers ? defaultTestOverrides.headers['Content-Type'] : ''}`,
776
+ `headers.Authorization=${(_s = defaultTestOverrides.headers) === null || _s === void 0 ? void 0 : _s.Authorization}`,
777
+ `locations=${(_t = defaultTestOverrides.locations) === null || _t === void 0 ? void 0 : _t.join(';')}`,
778
+ `retry.count=${(_u = defaultTestOverrides.retry) === null || _u === void 0 ? void 0 : _u.count}`,
779
+ `retry.interval=${(_v = defaultTestOverrides.retry) === null || _v === void 0 ? void 0 : _v.interval}`,
780
+ `startUrl=${defaultTestOverrides.startUrl}`,
781
+ `startUrlSubstitutionRegex=${defaultTestOverrides.startUrlSubstitutionRegex}`,
782
+ `testTimeout=${defaultTestOverrides.testTimeout}`,
783
+ `resourceUrlSubstitutionRegexes=${(_w = defaultTestOverrides.resourceUrlSubstitutionRegexes) === null || _w === void 0 ? void 0 : _w.join(';')}`,
784
+ `variables.cliVar1=${(_x = defaultTestOverrides.variables) === null || _x === void 0 ? void 0 : _x.cliVar1}`,
785
+ `variables.cliVar2=${(_y = defaultTestOverrides.variables) === null || _y === void 0 ? void 0 : _y.cliVar2}`,
786
+ ];
787
+ yield command['resolveConfig']();
788
+ const { mobileApplicationVersionFilePath } = overrideCLI, filteredOverrideCLI = __rest(overrideCLI, ["mobileApplicationVersionFilePath"]);
789
+ const expectedCLIOverrideResult = Object.assign(Object.assign({}, filteredOverrideCLI), { defaultTestOverrides: Object.assign(Object.assign({}, defaultTestOverrides), { mobileApplicationVersionFilePath }), proxy: { protocol: 'http' } });
790
+ expect(command['config']).toEqual(expectedCLIOverrideResult);
791
+ }));
792
+ const overrideTestConfig = {
793
+ allowInsecureCertificates: false,
794
+ basicAuth: {
795
+ password: 'password-test-file',
796
+ username: 'username-test-file',
797
+ },
798
+ body: 'a body from test file',
799
+ bodyType: 'bodyType from test file',
800
+ cookies: {
801
+ value: 'test-file1=value1;test-file2=value2;',
802
+ append: false,
803
+ },
804
+ setCookies: {
805
+ value: 'test-file1=value1 \n test-file2=value2; Domain=example.com \n test-file3=value3; Secure; HttpOnly',
806
+ append: false,
807
+ },
808
+ defaultStepTimeout: 31,
809
+ deviceIds: [
810
+ 'chrome.laptop_large_from_test_file',
811
+ 'chrome.laptop_small_from_test_file',
812
+ 'firefox.laptop_large_from_test_file',
813
+ ],
814
+ executionRule: interfaces_1.ExecutionRule.NON_BLOCKING,
815
+ followRedirects: false,
816
+ headers: { 'Content-Type': 'application/json', Authorization: 'Bearer token from test file' },
817
+ locations: ['test-file-loc-1', 'test-file-loc-2'],
818
+ mobileApplicationVersion: 'test-file-00000000-0000-0000-0000-000000000000',
819
+ resourceUrlSubstitutionRegexes: [
820
+ 'from-test-file-regex1',
821
+ 's/(https://www.)(.*)/$1extra-$2',
822
+ 'https://example.com(.*)|http://subdomain.example.com$1',
823
+ ],
824
+ retry: {
825
+ count: 33,
826
+ interval: 34,
827
+ },
828
+ startUrl: 'startUrl-from-test-file',
829
+ startUrlSubstitutionRegex: 'startUrlSubstitutionRegex-from-test-file',
830
+ testTimeout: 35,
831
+ variables: { testFileVar1: 'value1', testFileVar2: 'value2' },
832
+ };
833
+ const triggerTests = jest.fn(() => {
834
+ throw (0, fixtures_1.getAxiosError)(502, { message: 'Bad Gateway' });
835
+ });
836
+ const apiHelper = (0, fixtures_2.mockApi)({
837
+ getTest: jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { return (Object.assign({}, (0, fixtures_2.getApiTest)('publicId'))); })),
838
+ triggerTests,
839
+ });
840
+ const getExpectedTestsToTriggerArguments = (testOverrides) => {
841
+ return [
842
+ // Parameters we care about.
843
+ apiHelper,
844
+ [{ suite: 'Suite 1', id: 'aaa-bbb-ccc', testOverrides }],
845
+ // Ignore the rest of the parameters.
846
+ expect.anything(),
847
+ expect.anything(),
848
+ expect.anything(),
849
+ expect.anything(),
850
+ ];
851
+ };
852
+ const testFile = { name: 'Suite 1', content: { tests: [{ id: 'aaa-bbb-ccc', testOverrides: {} }] } };
853
+ test('config file < test file', () => __awaiter(void 0, void 0, void 0, function* () {
854
+ const getTestsToTriggerMock = jest.spyOn(testUtils, 'getTestsToTrigger');
855
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
856
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementationOnce((baseConfig) => __awaiter(void 0, void 0, void 0, function* () {
857
+ return Object.assign(Object.assign({}, baseConfig), { defaultTestOverrides: Object.assign(Object.assign({}, configFile.defaultTestOverrides), { mobileApplicationVersionFilePath: undefined }), testSearchQuery: undefined });
858
+ }));
859
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
860
+ jest.spyOn(utils, 'getSuites').mockResolvedValue([testFile]);
861
+ testFile.content.tests[0].testOverrides = overrideTestConfig;
862
+ expect(yield command.execute()).toBe(0);
863
+ expect(getTestsToTriggerMock).toHaveBeenNthCalledWith(1, ...getExpectedTestsToTriggerArguments(overrideTestConfig));
864
+ }));
865
+ test('ENV < test file', () => __awaiter(void 0, void 0, void 0, function* () {
866
+ const getTestsToTriggerMock = jest.spyOn(testUtils, 'getTestsToTrigger');
867
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
868
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementation((config, _) => __awaiter(void 0, void 0, void 0, function* () { return config; }));
869
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
870
+ jest.spyOn(utils, 'getSuites').mockResolvedValue([testFile]);
871
+ testFile.content.tests[0].testOverrides = overrideTestConfig;
872
+ const testOverrideEnv = {
873
+ DATADOG_SYNTHETICS_OVERRIDE_ALLOW_INSECURE_CERTIFICATES: 'true',
874
+ DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_PASSWORD: 'password-from-env',
875
+ DATADOG_SYNTHETICS_OVERRIDE_BASIC_AUTH_USERNAME: 'username-from-env',
876
+ DATADOG_SYNTHETICS_OVERRIDE_BODY: 'body-from-env',
877
+ DATADOG_SYNTHETICS_OVERRIDE_BODY_TYPE: 'bodyType-from-env',
878
+ DATADOG_SYNTHETICS_OVERRIDE_COOKIES: 'cookie1-from-env;cookie2-from-env;cookie3-from-env',
879
+ DATADOG_SYNTHETICS_OVERRIDE_COOKIES_APPEND: 'true',
880
+ DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES: 'cookie1-from-env \n cookie2-from-env; Domain=example.com \n cookie3-from-env; Secure; HttpOnly',
881
+ DATADOG_SYNTHETICS_OVERRIDE_SET_COOKIES_APPEND: 'true',
882
+ DATADOG_SYNTHETICS_OVERRIDE_DEFAULT_STEP_TIMEOUT: '42',
883
+ DATADOG_SYNTHETICS_OVERRIDE_DEVICE_IDS: 'chrome.laptop_large_from_env',
884
+ DATADOG_SYNTHETICS_OVERRIDE_EXECUTION_RULE: 'BLOCKING',
885
+ DATADOG_SYNTHETICS_OVERRIDE_FOLLOW_REDIRECTS: 'true',
886
+ DATADOG_SYNTHETICS_OVERRIDE_HEADERS: "{'Content-Type': 'application/json', 'Authorization': 'Bearer token from env'}",
887
+ DATADOG_SYNTHETICS_OVERRIDE_LOCATIONS: 'location_1_from_env;location_2_from_env',
888
+ DATADOG_SYNTHETICS_OVERRIDE_MOBILE_APPLICATION_VERSION: 'env-00000000-0000-0000-0000-000000000000',
889
+ DATADOG_SYNTHETICS_OVERRIDE_RESOURCE_URL_SUBSTITUTION_REGEXES: 'env-regex1;env-regex2',
890
+ DATADOG_SYNTHETICS_OVERRIDE_RETRY_COUNT: '5',
891
+ DATADOG_SYNTHETICS_OVERRIDE_RETRY_INTERVAL: '100',
892
+ DATADOG_SYNTHETICS_OVERRIDE_START_URL: 'startUrl-from-env',
893
+ DATADOG_SYNTHETICS_OVERRIDE_START_URL_SUBSTITUTION_REGEX: 'startUrlSubstitutionRegex-from-env',
894
+ DATADOG_SYNTHETICS_OVERRIDE_TEST_TIMEOUT: '42',
895
+ DATADOG_SYNTHETICS_OVERRIDE_VARIABLES: "{'envVar1': 'value1', 'envVar2': 'value2'}",
896
+ };
897
+ process.env = testOverrideEnv;
898
+ expect(yield command.execute()).toBe(0);
899
+ expect(getTestsToTriggerMock).toHaveBeenNthCalledWith(1, ...getExpectedTestsToTriggerArguments(overrideTestConfig));
900
+ }));
901
+ test('CLI < test file', () => __awaiter(void 0, void 0, void 0, function* () {
902
+ var _z, _0, _1, _2, _3, _4, _5, _6, _7, _8;
903
+ const getTestsToTriggerMock = jest.spyOn(testUtils, 'getTestsToTrigger');
904
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand);
905
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementation((config, _) => __awaiter(void 0, void 0, void 0, function* () { return config; }));
906
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
907
+ jest.spyOn(utils, 'getSuites').mockResolvedValue([testFile]);
908
+ const defaultTestOverrides = {
909
+ allowInsecureCertificates: false,
910
+ basicAuth: {
911
+ password: 'password-cli',
912
+ username: 'username-cli',
913
+ },
914
+ body: 'a body from cli',
915
+ bodyType: 'bodyType from cli',
916
+ cookies: {
917
+ value: 'cli1=value1;cli2=value2;',
918
+ append: false,
919
+ },
920
+ setCookies: {
921
+ value: 'cli1=value1 \n cli2=value2; Domain=example.com \n cli3=value3; Secure; HttpOnly',
922
+ append: false,
923
+ },
924
+ defaultStepTimeout: 11,
925
+ deviceIds: ['chrome.laptop_large_from_cli', 'chrome.laptop_small_from_cli', 'firefox.laptop_large_from_cli'],
926
+ executionRule: interfaces_1.ExecutionRule.NON_BLOCKING,
927
+ followRedirects: false,
928
+ headers: { 'Content-Type': 'application/json', Authorization: 'Bearer token from cli' },
929
+ locations: ['cli-loc-1', 'cli-loc-2'],
930
+ mobileApplicationVersion: 'cli-00000000-0000-0000-0000-000000000000',
931
+ resourceUrlSubstitutionRegexes: [
932
+ 'from-cli-regex1',
933
+ 's/(https://www.)(.*)/$1extra-$2',
934
+ 'https://example.com(.*)|http://subdomain.example.com$1',
935
+ ],
936
+ retry: {
937
+ count: 13,
938
+ interval: 14,
939
+ },
940
+ startUrl: 'startUrl-from-cli',
941
+ startUrlSubstitutionRegex: 'startUrlSubstitutionRegex-from-cli',
942
+ testTimeout: 15,
943
+ variables: { cliVar1: 'value1', cliVar2: 'value2' },
944
+ };
945
+ command['mobileApplicationVersion'] = defaultTestOverrides.mobileApplicationVersion;
946
+ command['overrides'] = [
947
+ `allowInsecureCertificates=${defaultTestOverrides.allowInsecureCertificates}`,
948
+ `basicAuth.password=${(_z = defaultTestOverrides.basicAuth) === null || _z === void 0 ? void 0 : _z.password}`,
949
+ `basicAuth.username=${(_0 = defaultTestOverrides.basicAuth) === null || _0 === void 0 ? void 0 : _0.username}`,
950
+ `body=${defaultTestOverrides.body}`,
951
+ `bodyType=${defaultTestOverrides.bodyType}`,
952
+ `cookies=${defaultTestOverrides.cookies.value}`,
953
+ `cookies.append=${defaultTestOverrides.cookies.append}`,
954
+ `setCookies=${defaultTestOverrides.setCookies.value}`,
955
+ `setCookies.append=${defaultTestOverrides.setCookies.append}`,
956
+ `defaultStepTimeout=${defaultTestOverrides.defaultStepTimeout}`,
957
+ `deviceIds=${(_1 = defaultTestOverrides.deviceIds) === null || _1 === void 0 ? void 0 : _1.join(';')}`,
958
+ `executionRule=${defaultTestOverrides.executionRule}`,
959
+ `followRedirects=${defaultTestOverrides.followRedirects}`,
960
+ `headers.Content-Type=${defaultTestOverrides.headers ? defaultTestOverrides.headers['Content-Type'] : ''}`,
961
+ `headers.Authorization=${(_2 = defaultTestOverrides.headers) === null || _2 === void 0 ? void 0 : _2.Authorization}`,
962
+ `locations=${(_3 = defaultTestOverrides.locations) === null || _3 === void 0 ? void 0 : _3.join(';')}`,
963
+ `retry.count=${(_4 = defaultTestOverrides.retry) === null || _4 === void 0 ? void 0 : _4.count}`,
964
+ `retry.interval=${(_5 = defaultTestOverrides.retry) === null || _5 === void 0 ? void 0 : _5.interval}`,
965
+ `startUrl=${defaultTestOverrides.startUrl}`,
966
+ `startUrlSubstitutionRegex=${defaultTestOverrides.startUrlSubstitutionRegex}`,
967
+ `testTimeout=${defaultTestOverrides.testTimeout}`,
968
+ `resourceUrlSubstitutionRegexes=${(_6 = defaultTestOverrides.resourceUrlSubstitutionRegexes) === null || _6 === void 0 ? void 0 : _6.join(';')}`,
969
+ `variables.cliVar1=${(_7 = defaultTestOverrides.variables) === null || _7 === void 0 ? void 0 : _7.cliVar1}`,
970
+ `variables.cliVar2=${(_8 = defaultTestOverrides.variables) === null || _8 === void 0 ? void 0 : _8.cliVar2}`,
971
+ ];
972
+ yield command['resolveConfig']();
973
+ expect(yield command.execute()).toBe(0);
974
+ expect(getTestsToTriggerMock).toHaveBeenNthCalledWith(1, ...getExpectedTestsToTriggerArguments(overrideTestConfig));
975
+ }));
976
+ });
977
+ test('fail on non-existing config file', () => __awaiter(void 0, void 0, void 0, function* () {
978
+ const writeMock = jest.fn();
979
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand, { stdout: { write: writeMock } });
980
+ command['configPath'] = 'non-existing-config-file.json';
981
+ yield expect(command.execute()).resolves.toBe(1);
982
+ expect(writeMock).toHaveBeenCalledWith(expect.stringMatching('ERROR: invalid config \nConfig file not found'));
983
+ }));
984
+ });
985
+ describe('exit code respects `failOnCriticalErrors`', () => {
986
+ test('404 leading to `NO_TESTS_TO_RUN` never exits with 1', () => __awaiter(void 0, void 0, void 0, function* () {
987
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand, { stdout: { write: jest.fn() } });
988
+ command['config'].failOnCriticalErrors = true;
989
+ const apiHelper = (0, fixtures_2.mockApi)({
990
+ getTest: jest.fn(() => {
991
+ throw (0, fixtures_1.getAxiosError)(404, { errors: ['Test not found'] });
992
+ }),
993
+ });
994
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementation((config, _) => __awaiter(void 0, void 0, void 0, function* () { return config; }));
995
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
996
+ jest.spyOn(utils, 'getSuites').mockResolvedValue([(0, fixtures_2.getTestSuite)()]);
997
+ expect(yield command.execute()).toBe(0);
998
+ expect(apiHelper.getTest).toHaveBeenCalledTimes(1);
999
+ }));
1000
+ describe.each([false, true])('%s', (failOnCriticalErrors) => {
1001
+ const cases = [['HTTP 4xx error', 403], ['HTTP 5xx error', 502], ['Unknown error']];
1002
+ const expectedExit = failOnCriticalErrors ? 1 : 0;
1003
+ describe.each(cases)('%s', (_, errorCode) => {
1004
+ test('unable to obtain test configurations', () => __awaiter(void 0, void 0, void 0, function* () {
1005
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand, { stdout: { write: jest.fn() } });
1006
+ command['config'].failOnCriticalErrors = failOnCriticalErrors;
1007
+ command['testSearchQuery'] = 'test:search';
1008
+ const apiHelper = (0, fixtures_2.mockApi)({
1009
+ searchTests: jest.fn(() => {
1010
+ throw errorCode ? (0, fixtures_1.getAxiosError)(errorCode, { message: 'Error' }) : new Error('Unknown error');
1011
+ }),
1012
+ });
1013
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
1014
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementation((config, __) => __awaiter(void 0, void 0, void 0, function* () { return config; }));
1015
+ expect(yield command.execute()).toBe(expectedExit);
1016
+ expect(apiHelper.searchTests).toHaveBeenCalledTimes(1);
1017
+ }));
1018
+ test('unavailable test config', () => __awaiter(void 0, void 0, void 0, function* () {
1019
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand, { stdout: { write: jest.fn() } });
1020
+ command['config'].failOnCriticalErrors = failOnCriticalErrors;
1021
+ const apiHelper = (0, fixtures_2.mockApi)({
1022
+ getTest: jest.fn(() => {
1023
+ throw errorCode ? (0, fixtures_1.getAxiosError)(errorCode, { message: 'Error' }) : new Error('Unknown error');
1024
+ }),
1025
+ });
1026
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementation((config, __) => __awaiter(void 0, void 0, void 0, function* () { return config; }));
1027
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
1028
+ jest.spyOn(utils, 'getSuites').mockResolvedValue([(0, fixtures_2.getTestSuite)()]);
1029
+ expect(yield command.execute()).toBe(expectedExit);
1030
+ expect(apiHelper.getTest).toHaveBeenCalledTimes(1);
1031
+ }));
1032
+ test('unable to trigger tests', () => __awaiter(void 0, void 0, void 0, function* () {
1033
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand, { stdout: { write: jest.fn() } });
1034
+ command['config'].failOnCriticalErrors = failOnCriticalErrors;
1035
+ const apiHelper = (0, fixtures_2.mockApi)({
1036
+ getTest: () => __awaiter(void 0, void 0, void 0, function* () { return (0, fixtures_2.getApiTest)('123-456-789'); }),
1037
+ triggerTests: jest.fn(() => {
1038
+ throw errorCode ? (0, fixtures_1.getAxiosError)(errorCode, { message: 'Error' }) : new Error('Unknown error');
1039
+ }),
1040
+ });
1041
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementation((config, __) => __awaiter(void 0, void 0, void 0, function* () { return config; }));
1042
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
1043
+ jest.spyOn(utils, 'getSuites').mockResolvedValue([(0, fixtures_2.getTestSuite)()]);
1044
+ expect(yield command.execute()).toBe(expectedExit);
1045
+ expect(apiHelper.triggerTests).toHaveBeenCalledTimes(1);
1046
+ }));
1047
+ test('unable to poll test results', () => __awaiter(void 0, void 0, void 0, function* () {
1048
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand, { stdout: { write: jest.fn() } });
1049
+ command['config'].failOnCriticalErrors = failOnCriticalErrors;
1050
+ const apiHelper = (0, fixtures_2.mockApi)({
1051
+ getBatch: () => __awaiter(void 0, void 0, void 0, function* () { return ({ results: [], status: 'passed' }); }),
1052
+ getTest: () => __awaiter(void 0, void 0, void 0, function* () { return (0, fixtures_2.getApiTest)('123-456-789'); }),
1053
+ pollResults: jest.fn(() => {
1054
+ throw errorCode ? (0, fixtures_1.getAxiosError)(errorCode, { message: 'Error' }) : new Error('Unknown error');
1055
+ }),
1056
+ triggerTests: () => __awaiter(void 0, void 0, void 0, function* () { return fixtures_2.mockTestTriggerResponse; }),
1057
+ });
1058
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementation((config, __) => __awaiter(void 0, void 0, void 0, function* () { return config; }));
1059
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
1060
+ jest.spyOn(utils, 'getSuites').mockResolvedValue([(0, fixtures_2.getTestSuite)()]);
1061
+ expect(yield command.execute()).toBe(expectedExit);
1062
+ expect(apiHelper.pollResults).toHaveBeenCalledTimes(1);
1063
+ }));
1064
+ });
1065
+ });
1066
+ });
1067
+ describe('exit code respects `failOnMissingTests`', () => {
1068
+ const cases = [
1069
+ ['only missing tests', false, 0, ['mis-sin-ggg']],
1070
+ ['only missing tests', true, 1, ['mis-sin-ggg']],
1071
+ ['both missing and available tests', false, 0, ['mis-sin-ggg', 'abc-def-ghi']],
1072
+ ['both missing and available tests', true, 1, ['mis-sin-ggg', 'abc-def-ghi']],
1073
+ ];
1074
+ test.each(cases)('%s with failOnMissingTests=%s exits with %s', (_, failOnMissingTests, exitCode, tests) => __awaiter(void 0, void 0, void 0, function* () {
1075
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand, { stdout: { write: jest.fn() } });
1076
+ command['config'].failOnMissingTests = failOnMissingTests;
1077
+ const apiHelper = (0, fixtures_2.mockApi)({
1078
+ getTest: jest.fn((testId) => __awaiter(void 0, void 0, void 0, function* () {
1079
+ if (testId === 'mis-sin-ggg') {
1080
+ throw (0, fixtures_1.getAxiosError)(404, { errors: ['Test not found'] });
1081
+ }
1082
+ return {};
1083
+ })),
1084
+ });
1085
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementation((config, __) => __awaiter(void 0, void 0, void 0, function* () { return config; }));
1086
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
1087
+ jest.spyOn(utils, 'getSuites').mockResolvedValue([
1088
+ {
1089
+ content: {
1090
+ tests: tests.map((testId) => ({ id: testId })),
1091
+ },
1092
+ name: 'Suite 1',
1093
+ },
1094
+ ]);
1095
+ expect(yield command.execute()).toBe(exitCode);
1096
+ expect(apiHelper.getTest).toHaveBeenCalledTimes(tests.length);
1097
+ }));
1098
+ });
1099
+ describe('API errors logging', () => {
1100
+ test('enough context is provided', () => __awaiter(void 0, void 0, void 0, function* () {
1101
+ const writeMock = jest.fn();
1102
+ const command = (0, fixtures_1.createCommand)(run_tests_command_1.RunTestsCommand, { stdout: { write: writeMock } });
1103
+ command['config'].failOnCriticalErrors = true;
1104
+ const apiHelper = (0, fixtures_2.mockApi)({
1105
+ getTest: jest.fn((testId) => __awaiter(void 0, void 0, void 0, function* () {
1106
+ if (testId === 'for-bid-den') {
1107
+ const serverError = (0, fixtures_1.getAxiosError)(403, { errors: ['Forbidden'] });
1108
+ serverError.config.url = 'tests/for-bid-den';
1109
+ throw serverError;
1110
+ }
1111
+ return { name: testId };
1112
+ })),
1113
+ });
1114
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementation((config, __) => __awaiter(void 0, void 0, void 0, function* () { return config; }));
1115
+ jest.spyOn(api, 'getApiHelper').mockReturnValue(apiHelper);
1116
+ jest.spyOn(utils, 'getSuites').mockResolvedValue([
1117
+ {
1118
+ content: {
1119
+ tests: [
1120
+ { testOverrides: {}, id: 'aaa-aaa-aaa' },
1121
+ { testOverrides: { headers: {} }, id: 'bbb-bbb-bbb' },
1122
+ { testOverrides: {}, id: 'for-bid-den' },
1123
+ ],
1124
+ },
1125
+ name: 'Suite 1',
1126
+ },
1127
+ ]);
1128
+ expect(yield command.execute()).toBe(1);
1129
+ expect(apiHelper.getTest).toHaveBeenCalledTimes(3);
1130
+ expect(writeMock).toHaveBeenCalledTimes(4);
1131
+ expect(writeMock).toHaveBeenCalledWith('[aaa-aaa-aaa] Found test "aaa-aaa-aaa"\n');
1132
+ expect(writeMock).toHaveBeenCalledWith('[bbb-bbb-bbb] Found test "bbb-bbb-bbb" (1 test override)\n');
1133
+ expect(writeMock).toHaveBeenCalledWith('\n ERROR: authorization error \nFailed to get test: query on https://app.datadoghq.com/tests/for-bid-den returned: "Forbidden"\n\n\n');
1134
+ expect(writeMock).toHaveBeenCalledWith('Credentials refused, make sure `apiKey`, `appKey` and `datadogSite` are correct.\n');
1135
+ }));
1136
+ });
1137
+ });
1138
+ describe('upload-application', () => {
1139
+ beforeEach(() => {
1140
+ process.env = {};
1141
+ jest.restoreAllMocks();
1142
+ });
1143
+ describe('resolveConfig', () => {
1144
+ beforeEach(() => {
1145
+ process.env = {};
1146
+ });
1147
+ test('override from ENV', () => __awaiter(void 0, void 0, void 0, function* () {
1148
+ const overrideEnv = {
1149
+ DATADOG_API_KEY: 'fake_api_key',
1150
+ DATADOG_APP_KEY: 'fake_app_key',
1151
+ DATADOG_SITE: 'datadoghq.eu',
1152
+ DATADOG_SYNTHETICS_CONFIG_PATH: 'path/to/config.json',
1153
+ DATADOG_SYNTHETICS_VERSION_NAME: 'new',
1154
+ DATADOG_SYNTHETICS_LATEST: 'true',
1155
+ };
1156
+ process.env = overrideEnv;
1157
+ const command = (0, fixtures_1.createCommand)(upload_application_command_1.UploadApplicationCommand);
1158
+ yield command['resolveConfig']();
1159
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, upload_application_command_1.DEFAULT_UPLOAD_COMMAND_CONFIG), { apiKey: overrideEnv.DATADOG_API_KEY, appKey: overrideEnv.DATADOG_APP_KEY, configPath: overrideEnv.DATADOG_SYNTHETICS_CONFIG_PATH, datadogSite: overrideEnv.DATADOG_SITE, versionName: overrideEnv.DATADOG_SYNTHETICS_VERSION_NAME, latest: (0, env_1.toBoolean)(overrideEnv.DATADOG_SYNTHETICS_LATEST) }));
1160
+ }));
1161
+ test('override from config file', () => __awaiter(void 0, void 0, void 0, function* () {
1162
+ const expectedConfig = {
1163
+ apiKey: 'fake_api_key',
1164
+ appKey: 'fake_app_key',
1165
+ configPath: 'src/commands/synthetics/__tests__/config-fixtures/upload-app-config-with-all-keys.json',
1166
+ datadogSite: 'datadoghq.eu',
1167
+ proxy: { protocol: 'http' },
1168
+ mobileApplicationVersionFilePath: 'fake_path/fake_app.apk',
1169
+ mobileApplicationId: 'fake-abc',
1170
+ versionName: 'new',
1171
+ latest: true,
1172
+ };
1173
+ const command = (0, fixtures_1.createCommand)(upload_application_command_1.UploadApplicationCommand);
1174
+ command['configPath'] = 'src/commands/synthetics/__tests__/config-fixtures/upload-app-config-with-all-keys.json';
1175
+ yield command['resolveConfig']();
1176
+ expect(command['config']).toEqual(expectedConfig);
1177
+ }));
1178
+ test('override from CLI', () => __awaiter(void 0, void 0, void 0, function* () {
1179
+ const overrideCLI = {
1180
+ apiKey: 'fake_api_key_cli',
1181
+ appKey: 'fake_app_key_cli',
1182
+ configPath: 'src/commands/synthetics/__tests__/config-fixtures/empty-config-file.json',
1183
+ datadogSite: 'datadoghq.cli',
1184
+ mobileApplicationVersionFilePath: 'fake_path/cli_fake_app.apk',
1185
+ mobileApplicationId: 'fake-abc-cli',
1186
+ versionName: 'new cli',
1187
+ latest: true,
1188
+ };
1189
+ const command = (0, fixtures_1.createCommand)(upload_application_command_1.UploadApplicationCommand);
1190
+ command['apiKey'] = overrideCLI.apiKey;
1191
+ command['appKey'] = overrideCLI.appKey;
1192
+ command['configPath'] = overrideCLI.configPath;
1193
+ command['datadogSite'] = overrideCLI.datadogSite;
1194
+ command['mobileApplicationVersionFilePath'] = overrideCLI.mobileApplicationVersionFilePath;
1195
+ command['mobileApplicationId'] = overrideCLI.mobileApplicationId;
1196
+ command['versionName'] = overrideCLI.versionName;
1197
+ command['latest'] = overrideCLI.latest;
1198
+ yield command['resolveConfig']();
1199
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, upload_application_command_1.DEFAULT_UPLOAD_COMMAND_CONFIG), { apiKey: 'fake_api_key_cli', appKey: 'fake_app_key_cli', configPath: 'src/commands/synthetics/__tests__/config-fixtures/empty-config-file.json', datadogSite: 'datadoghq.cli', mobileApplicationVersionFilePath: 'fake_path/cli_fake_app.apk', mobileApplicationId: 'fake-abc-cli', versionName: 'new cli', latest: true }));
1200
+ }));
1201
+ test('override from config file < ENV < CLI', () => __awaiter(void 0, void 0, void 0, function* () {
1202
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementationOnce((baseConfig) => __awaiter(void 0, void 0, void 0, function* () {
1203
+ return (Object.assign(Object.assign({}, baseConfig), { apiKey: 'api_key_config_file', appKey: 'app_key_config_file', datadogSite: 'us5.datadoghq.com', mobileApplicationVersionFilePath: 'fake_path/fake_app.apk', mobileApplicationId: 'fake-abc', versionName: 'new', latest: true }));
1204
+ }));
1205
+ process.env = {
1206
+ DATADOG_API_KEY: 'api_key_env',
1207
+ DATADOG_APP_KEY: 'app_key_env',
1208
+ };
1209
+ const command = (0, fixtures_1.createCommand)(upload_application_command_1.UploadApplicationCommand);
1210
+ command['apiKey'] = 'api_key_cli';
1211
+ command['mobileApplicationVersionFilePath'] = './path/to/application_cli.apk';
1212
+ yield command['resolveConfig']();
1213
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, upload_application_command_1.DEFAULT_UPLOAD_COMMAND_CONFIG), { apiKey: 'api_key_cli', appKey: 'app_key_env', datadogSite: 'us5.datadoghq.com', mobileApplicationVersionFilePath: './path/to/application_cli.apk', mobileApplicationId: 'fake-abc', versionName: 'new', latest: true }));
1214
+ }));
1215
+ });
1216
+ });
1217
+ describe('import-tests', () => {
1218
+ beforeEach(() => {
1219
+ process.env = {};
1220
+ jest.restoreAllMocks();
1221
+ });
1222
+ describe('resolveConfig', () => {
1223
+ beforeEach(() => {
1224
+ process.env = {};
1225
+ });
1226
+ test('override from ENV', () => __awaiter(void 0, void 0, void 0, function* () {
1227
+ var _a, _b;
1228
+ const overrideEnv = {
1229
+ DATADOG_API_KEY: 'fake_api_key',
1230
+ DATADOG_APP_KEY: 'fake_app_key',
1231
+ DATADOG_SYNTHETICS_CONFIG_PATH: 'path/to/config.json',
1232
+ DATADOG_SITE: 'datadoghq.eu',
1233
+ DATADOG_SYNTHETICS_FILES: 'test-file1;test-file2;test-file3',
1234
+ DATADOG_SYNTHETICS_PUBLIC_IDS: 'a-public-id;another-public-id',
1235
+ DATADOG_SYNTHETICS_TEST_SEARCH_QUERY: 'a-search-query',
1236
+ };
1237
+ process.env = overrideEnv;
1238
+ const command = (0, fixtures_1.createCommand)(import_tests_command_1.ImportTestsCommand);
1239
+ yield command['resolveConfig']();
1240
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, import_tests_command_1.DEFAULT_IMPORT_TESTS_COMMAND_CONFIG), { apiKey: overrideEnv.DATADOG_API_KEY, appKey: overrideEnv.DATADOG_APP_KEY, configPath: overrideEnv.DATADOG_SYNTHETICS_CONFIG_PATH, datadogSite: overrideEnv.DATADOG_SITE, files: (_a = overrideEnv.DATADOG_SYNTHETICS_FILES) === null || _a === void 0 ? void 0 : _a.split(';'), publicIds: (_b = overrideEnv.DATADOG_SYNTHETICS_PUBLIC_IDS) === null || _b === void 0 ? void 0 : _b.split(';'), testSearchQuery: overrideEnv.DATADOG_SYNTHETICS_TEST_SEARCH_QUERY }));
1241
+ }));
1242
+ test('override from config file', () => __awaiter(void 0, void 0, void 0, function* () {
1243
+ const expectedConfig = {
1244
+ apiKey: 'fake_api_key',
1245
+ appKey: 'fake_app_key',
1246
+ configPath: 'src/commands/synthetics/__tests__/config-fixtures/import-tests-config-with-all-keys.json',
1247
+ datadogSite: 'datadoghq.eu',
1248
+ files: ['my-new-file'],
1249
+ proxy: { protocol: 'http' },
1250
+ publicIds: ['ran-dom-id1'],
1251
+ testSearchQuery: 'a-search-query',
1252
+ };
1253
+ const command = (0, fixtures_1.createCommand)(import_tests_command_1.ImportTestsCommand);
1254
+ command['configPath'] = 'src/commands/synthetics/__tests__/config-fixtures/import-tests-config-with-all-keys.json';
1255
+ yield command['resolveConfig']();
1256
+ expect(command['config']).toEqual(expectedConfig);
1257
+ }));
1258
+ test('override from CLI', () => __awaiter(void 0, void 0, void 0, function* () {
1259
+ const overrideCLI = {
1260
+ apiKey: 'fake_api_key_cli',
1261
+ appKey: 'fake_app_key_cli',
1262
+ configPath: 'src/commands/synthetics/__tests__/config-fixtures/empty-config-file.json',
1263
+ datadogSite: 'datadoghq.cli',
1264
+ files: ['new-file'],
1265
+ publicIds: ['ran-dom-id2'],
1266
+ testSearchQuery: 'a-search-query',
1267
+ };
1268
+ const command = (0, fixtures_1.createCommand)(import_tests_command_1.ImportTestsCommand);
1269
+ command['apiKey'] = overrideCLI.apiKey;
1270
+ command['appKey'] = overrideCLI.appKey;
1271
+ command['configPath'] = overrideCLI.configPath;
1272
+ command['datadogSite'] = overrideCLI.datadogSite;
1273
+ command['files'] = overrideCLI.files;
1274
+ command['publicIds'] = overrideCLI.publicIds;
1275
+ command['testSearchQuery'] = overrideCLI.testSearchQuery;
1276
+ yield command['resolveConfig']();
1277
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, import_tests_command_1.DEFAULT_IMPORT_TESTS_COMMAND_CONFIG), { apiKey: 'fake_api_key_cli', appKey: 'fake_app_key_cli', configPath: 'src/commands/synthetics/__tests__/config-fixtures/empty-config-file.json', datadogSite: 'datadoghq.cli', files: ['new-file'], publicIds: ['ran-dom-id2'], testSearchQuery: 'a-search-query' }));
1278
+ }));
1279
+ test('override from config file < ENV < CLI', () => __awaiter(void 0, void 0, void 0, function* () {
1280
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementationOnce((baseConfig) => __awaiter(void 0, void 0, void 0, function* () {
1281
+ return (Object.assign(Object.assign({}, baseConfig), { apiKey: 'api_key_config_file', appKey: 'app_key_config_file', datadogSite: 'us5.datadoghq.com' }));
1282
+ }));
1283
+ process.env = {
1284
+ DATADOG_API_KEY: 'api_key_env',
1285
+ DATADOG_APP_KEY: 'app_key_env',
1286
+ };
1287
+ const command = (0, fixtures_1.createCommand)(import_tests_command_1.ImportTestsCommand);
1288
+ command['apiKey'] = 'api_key_cli';
1289
+ yield command['resolveConfig']();
1290
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, import_tests_command_1.DEFAULT_IMPORT_TESTS_COMMAND_CONFIG), { apiKey: 'api_key_cli', appKey: 'app_key_env', datadogSite: 'us5.datadoghq.com' }));
1291
+ }));
1292
+ });
1293
+ });
1294
+ describe('deploy-tests', () => {
1295
+ beforeEach(() => {
1296
+ process.env = {};
1297
+ jest.restoreAllMocks();
1298
+ });
1299
+ describe('resolveConfig', () => {
1300
+ beforeEach(() => {
1301
+ process.env = {};
1302
+ });
1303
+ test('override from ENV', () => __awaiter(void 0, void 0, void 0, function* () {
1304
+ var _a, _b;
1305
+ const overrideEnv = {
1306
+ DATADOG_API_KEY: 'fake_api_key',
1307
+ DATADOG_APP_KEY: 'fake_app_key',
1308
+ DATADOG_SYNTHETICS_CONFIG_PATH: 'path/to/config.json',
1309
+ DATADOG_SITE: 'datadoghq.eu',
1310
+ DATADOG_SUBDOMAIN: 'custom',
1311
+ DATADOG_SYNTHETICS_FILES: 'test-file1;test-file2;test-file3',
1312
+ DATADOG_SYNTHETICS_PUBLIC_IDS: 'a-public-id;another-public-id',
1313
+ };
1314
+ process.env = overrideEnv;
1315
+ const command = (0, fixtures_1.createCommand)(deploy_tests_command_1.DeployTestsCommand);
1316
+ yield command['resolveConfig']();
1317
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, deploy_tests_command_1.DEFAULT_DEPLOY_TESTS_COMMAND_CONFIG), { apiKey: overrideEnv.DATADOG_API_KEY, appKey: overrideEnv.DATADOG_APP_KEY, configPath: overrideEnv.DATADOG_SYNTHETICS_CONFIG_PATH, datadogSite: overrideEnv.DATADOG_SITE, files: (_a = overrideEnv.DATADOG_SYNTHETICS_FILES) === null || _a === void 0 ? void 0 : _a.split(';'), publicIds: (_b = overrideEnv.DATADOG_SYNTHETICS_PUBLIC_IDS) === null || _b === void 0 ? void 0 : _b.split(';'), subdomain: overrideEnv.DATADOG_SUBDOMAIN }));
1318
+ }));
1319
+ test('override from config file', () => __awaiter(void 0, void 0, void 0, function* () {
1320
+ const expectedConfig = {
1321
+ apiKey: 'fake_api_key',
1322
+ appKey: 'fake_app_key',
1323
+ configPath: 'src/commands/synthetics/__tests__/config-fixtures/deploy-tests-config-with-all-keys.json',
1324
+ datadogSite: 'datadoghq.eu',
1325
+ files: ['my-new-file'],
1326
+ proxy: { protocol: 'http' },
1327
+ publicIds: ['ran-dom-id1'],
1328
+ subdomain: 'ppa',
1329
+ };
1330
+ const command = (0, fixtures_1.createCommand)(deploy_tests_command_1.DeployTestsCommand);
1331
+ command['configPath'] = 'src/commands/synthetics/__tests__/config-fixtures/deploy-tests-config-with-all-keys.json';
1332
+ yield command['resolveConfig']();
1333
+ expect(command['config']).toEqual(expectedConfig);
1334
+ }));
1335
+ test('override from CLI', () => __awaiter(void 0, void 0, void 0, function* () {
1336
+ const overrideCLI = {
1337
+ apiKey: 'fake_api_key_cli',
1338
+ appKey: 'fake_app_key_cli',
1339
+ configPath: 'src/commands/synthetics/__tests__/config-fixtures/empty-config-file.json',
1340
+ datadogSite: 'datadoghq.cli',
1341
+ files: ['new-file'],
1342
+ publicIds: ['ran-dom-id2'],
1343
+ subdomain: 'subdomain-from-cli',
1344
+ };
1345
+ const command = (0, fixtures_1.createCommand)(deploy_tests_command_1.DeployTestsCommand);
1346
+ command['apiKey'] = overrideCLI.apiKey;
1347
+ command['appKey'] = overrideCLI.appKey;
1348
+ command['configPath'] = overrideCLI.configPath;
1349
+ command['datadogSite'] = overrideCLI.datadogSite;
1350
+ command['files'] = overrideCLI.files;
1351
+ command['publicIds'] = overrideCLI.publicIds;
1352
+ command['subdomain'] = overrideCLI.subdomain;
1353
+ yield command['resolveConfig']();
1354
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, deploy_tests_command_1.DEFAULT_DEPLOY_TESTS_COMMAND_CONFIG), { apiKey: 'fake_api_key_cli', appKey: 'fake_app_key_cli', configPath: 'src/commands/synthetics/__tests__/config-fixtures/empty-config-file.json', datadogSite: 'datadoghq.cli', files: ['new-file'], publicIds: ['ran-dom-id2'], subdomain: 'subdomain-from-cli' }));
1355
+ }));
1356
+ test('override from config file < ENV < CLI', () => __awaiter(void 0, void 0, void 0, function* () {
1357
+ jest.spyOn(ciUtils, 'resolveConfigFromFile').mockImplementationOnce((baseConfig) => __awaiter(void 0, void 0, void 0, function* () {
1358
+ return (Object.assign(Object.assign({}, baseConfig), { apiKey: 'api_key_config_file', appKey: 'app_key_config_file', datadogSite: 'us5.datadoghq.com' }));
1359
+ }));
1360
+ process.env = {
1361
+ DATADOG_API_KEY: 'api_key_env',
1362
+ DATADOG_APP_KEY: 'app_key_env',
1363
+ };
1364
+ const command = (0, fixtures_1.createCommand)(deploy_tests_command_1.DeployTestsCommand);
1365
+ command['apiKey'] = 'api_key_cli';
1366
+ yield command['resolveConfig']();
1367
+ expect(command['config']).toEqual(Object.assign(Object.assign({}, deploy_tests_command_1.DEFAULT_DEPLOY_TESTS_COMMAND_CONFIG), { apiKey: 'api_key_cli', appKey: 'app_key_env', datadogSite: 'us5.datadoghq.com' }));
1368
+ }));
1369
+ });
1370
+ });
1371
+ //# sourceMappingURL=cli.test.js.map