@datadog/datadog-ci 2.40.1 → 2.40.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/dist/__tests__/cli.test.d.ts +1 -0
  2. package/dist/__tests__/cli.test.js +41 -0
  3. package/dist/__tests__/cli.test.js.map +1 -0
  4. package/dist/commands/cloud-run/__tests__/fixtures.d.ts +2 -0
  5. package/dist/commands/cloud-run/__tests__/fixtures.js +12 -0
  6. package/dist/commands/cloud-run/__tests__/fixtures.js.map +1 -0
  7. package/dist/commands/cloud-run/__tests__/flare.test.d.ts +1 -0
  8. package/dist/commands/cloud-run/__tests__/flare.test.js +557 -0
  9. package/dist/commands/cloud-run/__tests__/flare.test.js.map +1 -0
  10. package/dist/commands/deployment/__tests__/mark.test.d.ts +1 -0
  11. package/dist/commands/deployment/__tests__/mark.test.js +47 -0
  12. package/dist/commands/deployment/__tests__/mark.test.js.map +1 -0
  13. package/dist/commands/dora/__tests__/deployment.test.d.ts +1 -0
  14. package/dist/commands/dora/__tests__/deployment.test.js +201 -0
  15. package/dist/commands/dora/__tests__/deployment.test.js.map +1 -0
  16. package/dist/commands/dsyms/__tests__/upload.test.d.ts +1 -0
  17. package/dist/commands/dsyms/__tests__/upload.test.js +346 -0
  18. package/dist/commands/dsyms/__tests__/upload.test.js.map +1 -0
  19. package/dist/commands/dsyms/__tests__/utils.test.d.ts +1 -0
  20. package/dist/commands/dsyms/__tests__/utils.test.js +100 -0
  21. package/dist/commands/dsyms/__tests__/utils.test.js.map +1 -0
  22. package/dist/commands/dsyms/upload.js +3 -3
  23. package/dist/commands/dsyms/upload.js.map +1 -1
  24. package/dist/commands/dsyms/utils.js +4 -2
  25. package/dist/commands/dsyms/utils.js.map +1 -1
  26. package/dist/commands/elf-symbols/__tests__/elf.test.d.ts +1 -0
  27. package/dist/commands/elf-symbols/__tests__/elf.test.js +813 -0
  28. package/dist/commands/elf-symbols/__tests__/elf.test.js.map +1 -0
  29. package/dist/commands/elf-symbols/__tests__/upload.test.d.ts +1 -0
  30. package/dist/commands/elf-symbols/__tests__/upload.test.js +249 -0
  31. package/dist/commands/elf-symbols/__tests__/upload.test.js.map +1 -0
  32. package/dist/commands/elf-symbols/upload.js +2 -3
  33. package/dist/commands/elf-symbols/upload.js.map +1 -1
  34. package/dist/commands/flutter-symbols/__tests__/upload.test.d.ts +1 -0
  35. package/dist/commands/flutter-symbols/__tests__/upload.test.js +617 -0
  36. package/dist/commands/flutter-symbols/__tests__/upload.test.js.map +1 -0
  37. package/dist/commands/flutter-symbols/upload.js +2 -2
  38. package/dist/commands/flutter-symbols/upload.js.map +1 -1
  39. package/dist/commands/gate/__tests__/evaluate.test.d.ts +1 -0
  40. package/dist/commands/gate/__tests__/evaluate.test.js +398 -0
  41. package/dist/commands/gate/__tests__/evaluate.test.js.map +1 -0
  42. package/dist/commands/gate/__tests__/scope.test.d.ts +1 -0
  43. package/dist/commands/gate/__tests__/scope.test.js +29 -0
  44. package/dist/commands/gate/__tests__/scope.test.js.map +1 -0
  45. package/dist/commands/git-metadata/__tests__/git.test.d.ts +1 -0
  46. package/dist/commands/git-metadata/__tests__/git.test.js +132 -0
  47. package/dist/commands/git-metadata/__tests__/git.test.js.map +1 -0
  48. package/dist/commands/git-metadata/__tests__/gitdb.test.d.ts +1 -0
  49. package/dist/commands/git-metadata/__tests__/gitdb.test.js +1386 -0
  50. package/dist/commands/git-metadata/__tests__/gitdb.test.js.map +1 -0
  51. package/dist/commands/git-metadata/__tests__/library.test.d.ts +1 -0
  52. package/dist/commands/git-metadata/__tests__/library.test.js +118 -0
  53. package/dist/commands/git-metadata/__tests__/library.test.js.map +1 -0
  54. package/dist/commands/git-metadata/__tests__/upload.test.d.ts +1 -0
  55. package/dist/commands/git-metadata/__tests__/upload.test.js +52 -0
  56. package/dist/commands/git-metadata/__tests__/upload.test.js.map +1 -0
  57. package/dist/commands/junit/__tests__/id.test.d.ts +1 -0
  58. package/dist/commands/junit/__tests__/id.test.js +24 -0
  59. package/dist/commands/junit/__tests__/id.test.js.map +1 -0
  60. package/dist/commands/junit/__tests__/upload.test.d.ts +1 -0
  61. package/dist/commands/junit/__tests__/upload.test.js +495 -0
  62. package/dist/commands/junit/__tests__/upload.test.js.map +1 -0
  63. package/dist/commands/junit/upload.js +5 -3
  64. package/dist/commands/junit/upload.js.map +1 -1
  65. package/dist/commands/lambda/__tests__/fixtures.d.ts +51 -0
  66. package/dist/commands/lambda/__tests__/fixtures.js +146 -0
  67. package/dist/commands/lambda/__tests__/fixtures.js.map +1 -0
  68. package/dist/commands/lambda/__tests__/flare.test.d.ts +1 -0
  69. package/dist/commands/lambda/__tests__/flare.test.js +730 -0
  70. package/dist/commands/lambda/__tests__/flare.test.js.map +1 -0
  71. package/dist/commands/lambda/__tests__/functions/commons.test.d.ts +1 -0
  72. package/dist/commands/lambda/__tests__/functions/commons.test.js +791 -0
  73. package/dist/commands/lambda/__tests__/functions/commons.test.js.map +1 -0
  74. package/dist/commands/lambda/__tests__/functions/instrument.part1.test.d.ts +1 -0
  75. package/dist/commands/lambda/__tests__/functions/instrument.part1.test.js +386 -0
  76. package/dist/commands/lambda/__tests__/functions/instrument.part1.test.js.map +1 -0
  77. package/dist/commands/lambda/__tests__/functions/instrument.part2.test.d.ts +1 -0
  78. package/dist/commands/lambda/__tests__/functions/instrument.part2.test.js +721 -0
  79. package/dist/commands/lambda/__tests__/functions/instrument.part2.test.js.map +1 -0
  80. package/dist/commands/lambda/__tests__/functions/uninstrument.test.d.ts +1 -0
  81. package/dist/commands/lambda/__tests__/functions/uninstrument.test.js +513 -0
  82. package/dist/commands/lambda/__tests__/functions/uninstrument.test.js.map +1 -0
  83. package/dist/commands/lambda/__tests__/functions/versionChecker.test.d.ts +1 -0
  84. package/dist/commands/lambda/__tests__/functions/versionChecker.test.js +33 -0
  85. package/dist/commands/lambda/__tests__/functions/versionChecker.test.js.map +1 -0
  86. package/dist/commands/lambda/__tests__/instrument.test.d.ts +1 -0
  87. package/dist/commands/lambda/__tests__/instrument.test.js +1511 -0
  88. package/dist/commands/lambda/__tests__/instrument.test.js.map +1 -0
  89. package/dist/commands/lambda/__tests__/loggroup.test.d.ts +1 -0
  90. package/dist/commands/lambda/__tests__/loggroup.test.js +340 -0
  91. package/dist/commands/lambda/__tests__/loggroup.test.js.map +1 -0
  92. package/dist/commands/lambda/__tests__/prompt.test.d.ts +1 -0
  93. package/dist/commands/lambda/__tests__/prompt.test.js +206 -0
  94. package/dist/commands/lambda/__tests__/prompt.test.js.map +1 -0
  95. package/dist/commands/lambda/__tests__/tags.test.d.ts +1 -0
  96. package/dist/commands/lambda/__tests__/tags.test.js +305 -0
  97. package/dist/commands/lambda/__tests__/tags.test.js.map +1 -0
  98. package/dist/commands/lambda/__tests__/uninstrument.test.d.ts +1 -0
  99. package/dist/commands/lambda/__tests__/uninstrument.test.js +722 -0
  100. package/dist/commands/lambda/__tests__/uninstrument.test.js.map +1 -0
  101. package/dist/commands/measure/__tests__/measure.test.d.ts +1 -0
  102. package/dist/commands/measure/__tests__/measure.test.js +110 -0
  103. package/dist/commands/measure/__tests__/measure.test.js.map +1 -0
  104. package/dist/commands/react-native/__tests__/codepush.test.d.ts +1 -0
  105. package/dist/commands/react-native/__tests__/codepush.test.js +161 -0
  106. package/dist/commands/react-native/__tests__/codepush.test.js.map +1 -0
  107. package/dist/commands/react-native/__tests__/interfaces.test.d.ts +1 -0
  108. package/dist/commands/react-native/__tests__/interfaces.test.js +33 -0
  109. package/dist/commands/react-native/__tests__/interfaces.test.js.map +1 -0
  110. package/dist/commands/react-native/__tests__/upload.test.d.ts +1 -0
  111. package/dist/commands/react-native/__tests__/upload.test.js +238 -0
  112. package/dist/commands/react-native/__tests__/upload.test.js.map +1 -0
  113. package/dist/commands/react-native/__tests__/utils.test.d.ts +1 -0
  114. package/dist/commands/react-native/__tests__/utils.test.js +27 -0
  115. package/dist/commands/react-native/__tests__/utils.test.js.map +1 -0
  116. package/dist/commands/react-native/__tests__/xcode.test.d.ts +1 -0
  117. package/dist/commands/react-native/__tests__/xcode.test.js +465 -0
  118. package/dist/commands/react-native/__tests__/xcode.test.js.map +1 -0
  119. package/dist/commands/sarif/__tests__/upload.test.d.ts +1 -0
  120. package/dist/commands/sarif/__tests__/upload.test.js +228 -0
  121. package/dist/commands/sarif/__tests__/upload.test.js.map +1 -0
  122. package/dist/commands/sarif/upload.js +2 -2
  123. package/dist/commands/sarif/upload.js.map +1 -1
  124. package/dist/commands/sbom/__tests__/payload.test.d.ts +1 -0
  125. package/dist/commands/sbom/__tests__/payload.test.js +262 -0
  126. package/dist/commands/sbom/__tests__/payload.test.js.map +1 -0
  127. package/dist/commands/sbom/__tests__/validation.test.d.ts +1 -0
  128. package/dist/commands/sbom/__tests__/validation.test.js +41 -0
  129. package/dist/commands/sbom/__tests__/validation.test.js.map +1 -0
  130. package/dist/commands/sourcemaps/__tests__/upload.test.d.ts +1 -0
  131. package/dist/commands/sourcemaps/__tests__/upload.test.js +270 -0
  132. package/dist/commands/sourcemaps/__tests__/upload.test.js.map +1 -0
  133. package/dist/commands/sourcemaps/__tests__/utils.test.d.ts +1 -0
  134. package/dist/commands/sourcemaps/__tests__/utils.test.js +31 -0
  135. package/dist/commands/sourcemaps/__tests__/utils.test.js.map +1 -0
  136. package/dist/commands/sourcemaps/upload.js +2 -2
  137. package/dist/commands/sourcemaps/upload.js.map +1 -1
  138. package/dist/commands/stepfunctions/__tests__/awsCommands.test.d.ts +1 -0
  139. package/dist/commands/stepfunctions/__tests__/awsCommands.test.js +192 -0
  140. package/dist/commands/stepfunctions/__tests__/awsCommands.test.js.map +1 -0
  141. package/dist/commands/stepfunctions/__tests__/fixtures/aws-resources.d.ts +6 -0
  142. package/dist/commands/stepfunctions/__tests__/fixtures/aws-resources.js +45 -0
  143. package/dist/commands/stepfunctions/__tests__/fixtures/aws-resources.js.map +1 -0
  144. package/dist/commands/stepfunctions/__tests__/fixtures/cli.d.ts +5 -0
  145. package/dist/commands/stepfunctions/__tests__/fixtures/cli.js +19 -0
  146. package/dist/commands/stepfunctions/__tests__/fixtures/cli.js.map +1 -0
  147. package/dist/commands/stepfunctions/__tests__/helpers.test.d.ts +1 -0
  148. package/dist/commands/stepfunctions/__tests__/helpers.test.js +205 -0
  149. package/dist/commands/stepfunctions/__tests__/helpers.test.js.map +1 -0
  150. package/dist/commands/stepfunctions/__tests__/instrument.test.d.ts +1 -0
  151. package/dist/commands/stepfunctions/__tests__/instrument.test.js +431 -0
  152. package/dist/commands/stepfunctions/__tests__/instrument.test.js.map +1 -0
  153. package/dist/commands/stepfunctions/__tests__/uninstrument.test.d.ts +1 -0
  154. package/dist/commands/stepfunctions/__tests__/uninstrument.test.js +166 -0
  155. package/dist/commands/stepfunctions/__tests__/uninstrument.test.js.map +1 -0
  156. package/dist/commands/synthetics/__tests__/api.test.d.ts +1 -0
  157. package/dist/commands/synthetics/__tests__/api.test.js +422 -0
  158. package/dist/commands/synthetics/__tests__/api.test.js.map +1 -0
  159. package/dist/commands/synthetics/__tests__/cli.test.d.ts +1 -0
  160. package/dist/commands/synthetics/__tests__/cli.test.js +1325 -0
  161. package/dist/commands/synthetics/__tests__/cli.test.js.map +1 -0
  162. package/dist/commands/synthetics/__tests__/fixtures.d.ts +149 -0
  163. package/dist/commands/synthetics/__tests__/fixtures.js +507 -0
  164. package/dist/commands/synthetics/__tests__/fixtures.js.map +1 -0
  165. package/dist/commands/synthetics/__tests__/mobile.test.d.ts +1 -0
  166. package/dist/commands/synthetics/__tests__/mobile.test.js +376 -0
  167. package/dist/commands/synthetics/__tests__/mobile.test.js.map +1 -0
  168. package/dist/commands/synthetics/__tests__/reporters/default.test.d.ts +1 -0
  169. package/dist/commands/synthetics/__tests__/reporters/default.test.js +354 -0
  170. package/dist/commands/synthetics/__tests__/reporters/default.test.js.map +1 -0
  171. package/dist/commands/synthetics/__tests__/reporters/junit.test.d.ts +1 -0
  172. package/dist/commands/synthetics/__tests__/reporters/junit.test.js +353 -0
  173. package/dist/commands/synthetics/__tests__/reporters/junit.test.js.map +1 -0
  174. package/dist/commands/synthetics/__tests__/reporters/mobile/app-upload.test.d.ts +1 -0
  175. package/dist/commands/synthetics/__tests__/reporters/mobile/app-upload.test.js +232 -0
  176. package/dist/commands/synthetics/__tests__/reporters/mobile/app-upload.test.js.map +1 -0
  177. package/dist/commands/synthetics/__tests__/run-tests-lib.test.d.ts +1 -0
  178. package/dist/commands/synthetics/__tests__/run-tests-lib.test.js +735 -0
  179. package/dist/commands/synthetics/__tests__/run-tests-lib.test.js.map +1 -0
  180. package/dist/commands/synthetics/__tests__/test.test.d.ts +1 -0
  181. package/dist/commands/synthetics/__tests__/test.test.js +33 -0
  182. package/dist/commands/synthetics/__tests__/test.test.js.map +1 -0
  183. package/dist/commands/synthetics/__tests__/tunnel/crypto.test.d.ts +1 -0
  184. package/dist/commands/synthetics/__tests__/tunnel/crypto.test.js +21 -0
  185. package/dist/commands/synthetics/__tests__/tunnel/crypto.test.js.map +1 -0
  186. package/dist/commands/synthetics/__tests__/tunnel/tunnel.test.d.ts +1 -0
  187. package/dist/commands/synthetics/__tests__/tunnel/tunnel.test.js +80 -0
  188. package/dist/commands/synthetics/__tests__/tunnel/tunnel.test.js.map +1 -0
  189. package/dist/commands/synthetics/__tests__/tunnel/websocket.test.d.ts +1 -0
  190. package/dist/commands/synthetics/__tests__/tunnel/websocket.test.js +109 -0
  191. package/dist/commands/synthetics/__tests__/tunnel/websocket.test.js.map +1 -0
  192. package/dist/commands/synthetics/__tests__/utils/internal.test.d.ts +1 -0
  193. package/dist/commands/synthetics/__tests__/utils/internal.test.js +186 -0
  194. package/dist/commands/synthetics/__tests__/utils/internal.test.js.map +1 -0
  195. package/dist/commands/synthetics/__tests__/utils/public.test.d.ts +1 -0
  196. package/dist/commands/synthetics/__tests__/utils/public.test.js +1526 -0
  197. package/dist/commands/synthetics/__tests__/utils/public.test.js.map +1 -0
  198. package/dist/commands/synthetics/api.d.ts +1 -1
  199. package/dist/commands/synthetics/api.js +10 -5
  200. package/dist/commands/synthetics/api.js.map +1 -1
  201. package/dist/commands/synthetics/run-tests-command.d.ts +1 -0
  202. package/dist/commands/synthetics/run-tests-command.js +3 -2
  203. package/dist/commands/synthetics/run-tests-command.js.map +1 -1
  204. package/dist/commands/synthetics/run-tests-lib.js +0 -4
  205. package/dist/commands/synthetics/run-tests-lib.js.map +1 -1
  206. package/dist/commands/synthetics/test.js +9 -1
  207. package/dist/commands/synthetics/test.js.map +1 -1
  208. package/dist/commands/synthetics/utils/public.js +3 -3
  209. package/dist/commands/synthetics/utils/public.js.map +1 -1
  210. package/dist/commands/tag/__tests__/tag.test.d.ts +1 -0
  211. package/dist/commands/tag/__tests__/tag.test.js +75 -0
  212. package/dist/commands/tag/__tests__/tag.test.js.map +1 -0
  213. package/dist/commands/trace/__tests__/trace.test.d.ts +1 -0
  214. package/dist/commands/trace/__tests__/trace.test.js +145 -0
  215. package/dist/commands/trace/__tests__/trace.test.js.map +1 -0
  216. package/dist/commands/unity-symbols/__tests__/upload.test.d.ts +1 -0
  217. package/dist/commands/unity-symbols/__tests__/upload.test.js +369 -0
  218. package/dist/commands/unity-symbols/__tests__/upload.test.js.map +1 -0
  219. package/dist/commands/unity-symbols/upload.js +2 -2
  220. package/dist/commands/unity-symbols/upload.js.map +1 -1
  221. package/dist/helpers/__tests__/app.test.d.ts +1 -0
  222. package/dist/helpers/__tests__/app.test.js +31 -0
  223. package/dist/helpers/__tests__/app.test.js.map +1 -0
  224. package/dist/helpers/__tests__/ci.test.d.ts +1 -0
  225. package/dist/helpers/__tests__/ci.test.js +252 -0
  226. package/dist/helpers/__tests__/ci.test.js.map +1 -0
  227. package/dist/helpers/__tests__/fixtures.d.ts +33 -0
  228. package/dist/helpers/__tests__/fixtures.js +71 -0
  229. package/dist/helpers/__tests__/fixtures.js.map +1 -0
  230. package/dist/helpers/__tests__/flare.test.d.ts +1 -0
  231. package/dist/helpers/__tests__/flare.test.js +226 -0
  232. package/dist/helpers/__tests__/flare.test.js.map +1 -0
  233. package/dist/helpers/__tests__/fs.test.d.ts +1 -0
  234. package/dist/helpers/__tests__/fs.test.js +189 -0
  235. package/dist/helpers/__tests__/fs.test.js.map +1 -0
  236. package/dist/helpers/__tests__/plist.test.d.ts +1 -0
  237. package/dist/helpers/__tests__/plist.test.js +43 -0
  238. package/dist/helpers/__tests__/plist.test.js.map +1 -0
  239. package/dist/helpers/__tests__/prompt.test.d.ts +1 -0
  240. package/dist/helpers/__tests__/prompt.test.js +71 -0
  241. package/dist/helpers/__tests__/prompt.test.js.map +1 -0
  242. package/dist/helpers/__tests__/retry.test.d.ts +1 -0
  243. package/dist/helpers/__tests__/retry.test.js +99 -0
  244. package/dist/helpers/__tests__/retry.test.js.map +1 -0
  245. package/dist/helpers/__tests__/tags.test.d.ts +1 -0
  246. package/dist/helpers/__tests__/tags.test.js +71 -0
  247. package/dist/helpers/__tests__/tags.test.js.map +1 -0
  248. package/dist/helpers/__tests__/upload.test.d.ts +1 -0
  249. package/dist/helpers/__tests__/upload.test.js +231 -0
  250. package/dist/helpers/__tests__/upload.test.js.map +1 -0
  251. package/dist/helpers/__tests__/user-provided-git.test.d.ts +1 -0
  252. package/dist/helpers/__tests__/user-provided-git.test.js +119 -0
  253. package/dist/helpers/__tests__/user-provided-git.test.js.map +1 -0
  254. package/dist/helpers/__tests__/utils.test.d.ts +1 -0
  255. package/dist/helpers/__tests__/utils.test.js +429 -0
  256. package/dist/helpers/__tests__/utils.test.js.map +1 -0
  257. package/dist/helpers/__tests__/validation.test.d.ts +1 -0
  258. package/dist/helpers/__tests__/validation.test.js +25 -0
  259. package/dist/helpers/__tests__/validation.test.js.map +1 -0
  260. package/dist/helpers/git/__tests__/format-git-sourcemaps-data.test.d.ts +1 -0
  261. package/dist/helpers/git/__tests__/format-git-sourcemaps-data.test.js +103 -0
  262. package/dist/helpers/git/__tests__/format-git-sourcemaps-data.test.js.map +1 -0
  263. package/dist/helpers/git/__tests__/format-git-span-data.test.d.ts +1 -0
  264. package/dist/helpers/git/__tests__/format-git-span-data.test.js +121 -0
  265. package/dist/helpers/git/__tests__/format-git-span-data.test.js.map +1 -0
  266. package/dist/helpers/git/__tests__/get-git-data.test.d.ts +1 -0
  267. package/dist/helpers/git/__tests__/get-git-data.test.js +72 -0
  268. package/dist/helpers/git/__tests__/get-git-data.test.js.map +1 -0
  269. package/package.json +4 -6
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const clipanion_1 = require("clipanion");
4
+ // Test all commands, including beta ones.
5
+ process.env.DD_BETA_COMMANDS_ENABLED = '1';
6
+ const cli_1 = require("../cli");
7
+ const builtins = [clipanion_1.Builtins.HelpCommand, clipanion_1.Builtins.VersionCommand];
8
+ describe('cli', () => {
9
+ describe('all commands have the right metadata', () => {
10
+ const commands = Array.from(cli_1.cli['registrations'].keys());
11
+ const userDefinedCommands = commands.filter((command) => !builtins.includes(command));
12
+ const cases = Object.entries(userDefinedCommands.reduce((acc, command) => {
13
+ var _a, _b, _c;
14
+ const commandRootPath = ((_a = command.paths) === null || _a === void 0 ? void 0 : _a[0][0]) || 'unknown'; // e.g. synthetics
15
+ const commandName = cli_1.BETA_COMMANDS.includes(commandRootPath) ? `${commandRootPath} (beta)` : commandRootPath;
16
+ const subcommandName = ((_b = command.paths) === null || _b === void 0 ? void 0 : _b[0].slice(1).join(' ')) || '<root>'; // e.g. run-tests
17
+ const newCase = [subcommandName, command];
18
+ return Object.assign(Object.assign({}, acc), { [commandName]: [...((_c = acc[commandName]) !== null && _c !== void 0 ? _c : []), newCase] });
19
+ }, {}));
20
+ describe.each(cases)('%s', (commandName, subcommandCases) => {
21
+ test.each(subcommandCases)('%s', (_, command) => {
22
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
23
+ expect(command).toHaveProperty('paths');
24
+ expect(command).toHaveProperty('usage');
25
+ if (commandName !== 'version') {
26
+ // Please categorize the commands by product. You can refer to the CODEOWNERS file.
27
+ // eslint-disable-next-line jest/no-conditional-expect
28
+ expect(command.usage).toHaveProperty('category');
29
+ }
30
+ // You should at least document the command with a description, otherwise it will show as "undocumented" in `--help`.
31
+ expect(command.usage).toHaveProperty('description');
32
+ // Please end your description with a period.
33
+ expect((_a = command.usage) === null || _a === void 0 ? void 0 : _a.description).toMatch(/\.$/);
34
+ // Please uppercase the first letter of the category and description.
35
+ expect((_c = (_b = command.usage) === null || _b === void 0 ? void 0 : _b.category) === null || _c === void 0 ? void 0 : _c.charAt(0)).toStrictEqual((_e = (_d = command.usage) === null || _d === void 0 ? void 0 : _d.category) === null || _e === void 0 ? void 0 : _e.charAt(0).toUpperCase());
36
+ expect((_g = (_f = command.usage) === null || _f === void 0 ? void 0 : _f.description) === null || _g === void 0 ? void 0 : _g.charAt(0)).toStrictEqual((_j = (_h = command.usage) === null || _h === void 0 ? void 0 : _h.description) === null || _j === void 0 ? void 0 : _j.charAt(0).toUpperCase());
37
+ });
38
+ });
39
+ });
40
+ });
41
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":";;AAAA,yCAAgD;AAEhD,0CAA0C;AAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAA;AAE1C,gCAAyC;AAEzC,MAAM,QAAQ,GAAmB,CAAC,oBAAQ,CAAC,WAAW,EAAE,oBAAQ,CAAC,cAAc,CAAC,CAAA;AAEhF,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAG,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACxD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;QAErF,MAAM,KAAK,GAAyC,MAAM,CAAC,OAAO,CAChE,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;;YAC1C,MAAM,eAAe,GAAG,CAAA,MAAA,OAAO,CAAC,KAAK,0CAAG,CAAC,EAAE,CAAC,CAAC,KAAI,SAAS,CAAA,CAAC,kBAAkB;YAC7E,MAAM,WAAW,GAAG,mBAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,SAAS,CAAC,CAAC,CAAC,eAAe,CAAA;YAC3G,MAAM,cAAc,GAAG,CAAA,MAAA,OAAO,CAAC,KAAK,0CAAG,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAI,QAAQ,CAAA,CAAC,iBAAiB;YAC1F,MAAM,OAAO,GAA2B,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;YAEjE,uCACK,GAAG,KACN,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,MAAA,GAAG,CAAC,WAAW,CAAC,mCAAI,EAAE,CAAC,EAAE,OAAO,CAAC,IACtD;QACH,CAAC,EAAE,EAA8C,CAAC,CACnD,CAAA;QAED,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE;YAC1D,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;;gBAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;gBACvC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;gBAEvC,IAAI,WAAW,KAAK,SAAS,EAAE;oBAC7B,mFAAmF;oBACnF,sDAAsD;oBACtD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;iBACjD;gBAED,qHAAqH;gBACrH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAA;gBAEnD,6CAA6C;gBAC7C,MAAM,CAAC,MAAA,OAAO,CAAC,KAAK,0CAAE,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAEjD,qEAAqE;gBACrE,MAAM,CAAC,MAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,0CAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,0CAAE,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;gBAC1G,MAAM,CAAC,MAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,WAAW,0CAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,WAAW,0CAAE,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;YAClH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { Cli } from 'clipanion';
2
+ export declare const makeCli: () => Cli<import("clipanion").BaseContext>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeCli = void 0;
4
+ const clipanion_1 = require("clipanion");
5
+ const flare_1 = require("../flare");
6
+ const makeCli = () => {
7
+ const cli = new clipanion_1.Cli();
8
+ cli.register(flare_1.CloudRunFlareCommand);
9
+ return cli;
10
+ };
11
+ exports.makeCli = makeCli;
12
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../../../src/commands/cloud-run/__tests__/fixtures.ts"],"names":[],"mappings":";;;AAAA,yCAA6B;AAE7B,oCAA6C;AAEtC,MAAM,OAAO,GAAG,GAAG,EAAE;IAC1B,MAAM,GAAG,GAAG,IAAI,eAAG,EAAE,CAAA;IACrB,GAAG,CAAC,QAAQ,CAAC,4BAAoB,CAAC,CAAA;IAElC,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AALY,QAAA,OAAO,WAKnB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,557 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const fs_1 = __importDefault(require("fs"));
39
+ const process_1 = __importDefault(require("process"));
40
+ const stream_1 = __importDefault(require("stream"));
41
+ const logging_1 = require("@google-cloud/logging");
42
+ const google_auth_library_1 = require("google-auth-library");
43
+ const constants_1 = require("../../../constants");
44
+ const fixtures_1 = require("../../../helpers/__tests__/fixtures");
45
+ const helpersFlareModule = __importStar(require("../../../helpers/flare"));
46
+ const fsModule = __importStar(require("../../../helpers/fs"));
47
+ const helpersPromptModule = __importStar(require("../../../helpers/prompt"));
48
+ const flareModule = __importStar(require("../flare"));
49
+ const flare_1 = require("../flare");
50
+ const fixtures_2 = require("./fixtures");
51
+ const MOCK_REGION = 'us-east1';
52
+ const MOCK_SERVICE = 'mock-service';
53
+ const MOCK_PROJECT = 'mock-project';
54
+ const MOCK_LOG_CLIENT = new logging_1.Logging({ projectId: MOCK_PROJECT });
55
+ const MOCK_REQUIRED_FLAGS = [
56
+ 'cloud-run',
57
+ 'flare',
58
+ '-s',
59
+ MOCK_SERVICE,
60
+ '-p',
61
+ MOCK_PROJECT,
62
+ '-r',
63
+ MOCK_REGION,
64
+ '-c',
65
+ '123',
66
+ '-e',
67
+ 'test@test.com',
68
+ ];
69
+ const MOCK_CLOUDRUN_CONFIG = {
70
+ name: `projects/${MOCK_PROJECT}/locations/${MOCK_REGION}/services/${MOCK_SERVICE}`,
71
+ description: 'description',
72
+ uid: 'abc1234-def5678',
73
+ uri: `https://${MOCK_SERVICE}-abc12345-ue.a.run.app`,
74
+ labels: {
75
+ someLabel: 'someValue',
76
+ anotherLabel: 'anotherValue',
77
+ },
78
+ template: {
79
+ containers: [
80
+ {
81
+ env: [
82
+ {
83
+ name: 'DD_API_KEY',
84
+ value: fixtures_1.MOCK_DATADOG_API_KEY,
85
+ values: 'value',
86
+ },
87
+ {
88
+ name: 'DD_TRACE_ENABLED',
89
+ value: 'true',
90
+ values: 'value',
91
+ },
92
+ {
93
+ name: 'DD_SITE',
94
+ value: 'datad0g.com',
95
+ values: 'value',
96
+ },
97
+ ],
98
+ image: 'gcr.io/datadog-sandbox/nicholas-hulston-docker-test',
99
+ },
100
+ ],
101
+ someData: 'data',
102
+ },
103
+ };
104
+ const MOCK_READ_STREAM = new stream_1.default.Readable({
105
+ read() {
106
+ this.push(JSON.stringify(MOCK_CLOUDRUN_CONFIG, undefined, 2));
107
+ this.push(undefined);
108
+ },
109
+ });
110
+ const MOCK_REVISION_TIMESTAMP = { seconds: 100 };
111
+ const MOCK_REVISIONS = [
112
+ {
113
+ name: 'projects/some-project/locations/some-location/services/service/revisions/service-00005-abc',
114
+ createTime: MOCK_REVISION_TIMESTAMP,
115
+ },
116
+ {
117
+ name: 'projects/some-project/locations/some-location/services/service/revisions/service-00004-def',
118
+ createTime: MOCK_REVISION_TIMESTAMP,
119
+ },
120
+ {
121
+ name: 'projects/some-project/locations/some-location/services/service/revisions/service-00003-ghi',
122
+ createTime: MOCK_REVISION_TIMESTAMP,
123
+ },
124
+ {
125
+ name: 'projects/some-project/locations/some-location/services/service/revisions/service-00002-jkl',
126
+ createTime: MOCK_REVISION_TIMESTAMP,
127
+ },
128
+ {
129
+ name: 'projects/some-project/locations/some-location/services/service/revisions/service-00001-mno',
130
+ createTime: MOCK_REVISION_TIMESTAMP,
131
+ },
132
+ ];
133
+ const MOCK_REVISION_NAMES = [
134
+ '`service-00005-abc` Deployed on 1970-01-01 00:01:40',
135
+ '`service-00004-def` Deployed on 1970-01-01 00:01:40',
136
+ '`service-00003-ghi` Deployed on 1970-01-01 00:01:40',
137
+ '`service-00002-jkl` Deployed on 1970-01-01 00:01:40',
138
+ '`service-00001-mno` Deployed on 1970-01-01 00:01:40',
139
+ ];
140
+ // GCP mocks
141
+ jest.mock('@google-cloud/logging');
142
+ jest.mock('google-auth-library', () => {
143
+ return {
144
+ GoogleAuth: jest.fn().mockImplementation(() => ({
145
+ getApplicationDefault: () => Promise.resolve(),
146
+ })),
147
+ };
148
+ });
149
+ jest.mock('@google-cloud/run', () => {
150
+ return {
151
+ ServicesClient: jest.fn().mockImplementation(() => ({
152
+ servicePath: jest.fn().mockReturnValue('servicePath'),
153
+ getService: () => Promise.resolve([MOCK_CLOUDRUN_CONFIG]),
154
+ })),
155
+ RevisionsClient: jest.fn().mockImplementation(() => ({
156
+ servicePath: jest.fn().mockReturnValue('servicePath'),
157
+ listRevisions: jest.fn().mockReturnValue([MOCK_REVISIONS]),
158
+ })),
159
+ };
160
+ });
161
+ // Prompt mocks
162
+ jest.spyOn(helpersPromptModule, 'requestFilePath').mockResolvedValue('');
163
+ jest.spyOn(helpersPromptModule, 'requestConfirmation').mockResolvedValue(true);
164
+ jest.spyOn(helpersFlareModule, 'getProjectFiles').mockResolvedValue(new Set());
165
+ // Misc
166
+ jest.mock('util');
167
+ jest.mock('jszip');
168
+ jest.mock('@google-cloud/logging');
169
+ jest.useFakeTimers({ now: new Date(Date.UTC(2023, 0)) });
170
+ jest.mock('../../../../package.json', () => ({
171
+ version: '1.0-mock-version',
172
+ }));
173
+ // File system mocks
174
+ jest.spyOn(process_1.default, 'cwd').mockReturnValue(fixtures_1.MOCK_CWD);
175
+ jest.mock('fs');
176
+ fs_1.default.existsSync = jest.fn().mockReturnValue(true);
177
+ fs_1.default.statSync.mockImplementation((file_path) => ({
178
+ isDirectory: () => file_path === fixtures_1.MOCK_FLARE_FOLDER_PATH || file_path === fixtures_1.MOCK_CWD,
179
+ }));
180
+ fs_1.default.readdirSync = jest.fn().mockReturnValue([]);
181
+ fs_1.default.createReadStream = jest.fn().mockReturnValue(MOCK_READ_STREAM);
182
+ describe('cloud-run flare', () => {
183
+ describe('prints correct headers', () => {
184
+ it('prints non-dry-run header', () => __awaiter(void 0, void 0, void 0, function* () {
185
+ const cli = (0, fixtures_2.makeCli)();
186
+ const context = (0, fixtures_1.createMockContext)();
187
+ const code = yield cli.run(['cloud-run', 'flare'], context);
188
+ const output = context.stdout.toString();
189
+ expect(code).toBe(1);
190
+ expect(output).toMatchSnapshot();
191
+ }));
192
+ it('prints dry-run header', () => __awaiter(void 0, void 0, void 0, function* () {
193
+ const cli = (0, fixtures_2.makeCli)();
194
+ const context = (0, fixtures_1.createMockContext)();
195
+ const code = yield cli.run(['cloud-run', 'flare', '-d'], context);
196
+ const output = context.stdout.toString();
197
+ expect(code).toBe(1);
198
+ expect(output).toMatchSnapshot();
199
+ }));
200
+ });
201
+ describe('validates required flags', () => {
202
+ beforeEach(() => {
203
+ process_1.default.env = { [constants_1.CI_API_KEY_ENV_VAR]: fixtures_1.MOCK_DATADOG_API_KEY };
204
+ });
205
+ it('prints error when no service specified', () => __awaiter(void 0, void 0, void 0, function* () {
206
+ const cli = (0, fixtures_2.makeCli)();
207
+ const context = (0, fixtures_1.createMockContext)();
208
+ const code = yield cli.run(['cloud-run', 'flare', '-p', MOCK_PROJECT, '-r', MOCK_REGION, '-c', '123', '-e', 'test@test.com'], context);
209
+ expect(code).toBe(1);
210
+ const output = context.stdout.toString();
211
+ expect(output).toMatchSnapshot();
212
+ }));
213
+ it('prints error when no project specified', () => __awaiter(void 0, void 0, void 0, function* () {
214
+ const cli = (0, fixtures_2.makeCli)();
215
+ const context = (0, fixtures_1.createMockContext)();
216
+ const code = yield cli.run(['cloud-run', 'flare', '-s', MOCK_SERVICE, '-r', MOCK_REGION, '-c', '123', '-e', 'test@test.com'], context);
217
+ expect(code).toBe(1);
218
+ const output = context.stdout.toString();
219
+ expect(output).toMatchSnapshot();
220
+ }));
221
+ it('prints error when no region specified', () => __awaiter(void 0, void 0, void 0, function* () {
222
+ const cli = (0, fixtures_2.makeCli)();
223
+ const context = (0, fixtures_1.createMockContext)();
224
+ const code = yield cli.run(['cloud-run', 'flare', '-s', MOCK_SERVICE, '-p', MOCK_PROJECT, '-c', '123', '-e', 'test@test.com'], context);
225
+ expect(code).toBe(1);
226
+ const output = context.stdout.toString();
227
+ expect(output).toMatchSnapshot();
228
+ }));
229
+ it('prints error when no case ID specified', () => __awaiter(void 0, void 0, void 0, function* () {
230
+ const cli = (0, fixtures_2.makeCli)();
231
+ const context = (0, fixtures_1.createMockContext)();
232
+ const code = yield cli.run(['cloud-run', 'flare', '-s', MOCK_SERVICE, '-p', MOCK_PROJECT, '-r', MOCK_REGION, '-e', 'test@test.com'], context);
233
+ expect(code).toBe(1);
234
+ const output = context.stdout.toString();
235
+ expect(output).toMatchSnapshot();
236
+ }));
237
+ it('prints error when no email specified', () => __awaiter(void 0, void 0, void 0, function* () {
238
+ const cli = (0, fixtures_2.makeCli)();
239
+ const context = (0, fixtures_1.createMockContext)();
240
+ const code = yield cli.run(['cloud-run', 'flare', '-s', MOCK_SERVICE, '-p', MOCK_PROJECT, '-r', MOCK_REGION, '-c', '123'], context);
241
+ expect(code).toBe(1);
242
+ const output = context.stdout.toString();
243
+ expect(output).toMatchSnapshot();
244
+ }));
245
+ it('prints error when no API key in env variables', () => __awaiter(void 0, void 0, void 0, function* () {
246
+ process_1.default.env = {};
247
+ const cli = (0, fixtures_2.makeCli)();
248
+ const context = (0, fixtures_1.createMockContext)();
249
+ const code = yield cli.run(MOCK_REQUIRED_FLAGS, context);
250
+ expect(code).toBe(1);
251
+ const output = context.stdout.toString();
252
+ expect(output).toMatchSnapshot();
253
+ }));
254
+ it('uses API key ENV variable and runs as expected', () => __awaiter(void 0, void 0, void 0, function* () {
255
+ process_1.default.env = {};
256
+ process_1.default.env[constants_1.CI_API_KEY_ENV_VAR] = fixtures_1.MOCK_DATADOG_API_KEY;
257
+ process_1.default.env[constants_1.API_KEY_ENV_VAR] = undefined;
258
+ const cli = (0, fixtures_2.makeCli)();
259
+ const context = (0, fixtures_1.createMockContext)();
260
+ let code = yield cli.run(MOCK_REQUIRED_FLAGS, context);
261
+ expect(code).toBe(0);
262
+ let output = context.stdout.toString();
263
+ expect(output).toMatchSnapshot();
264
+ process_1.default.env[constants_1.CI_API_KEY_ENV_VAR] = undefined;
265
+ process_1.default.env[constants_1.API_KEY_ENV_VAR] = fixtures_1.MOCK_DATADOG_API_KEY;
266
+ code = yield cli.run(MOCK_REQUIRED_FLAGS, context);
267
+ expect(code).toBe(0);
268
+ output = context.stdout.toString();
269
+ expect(output).toMatchSnapshot();
270
+ }));
271
+ it('runs successfully with all required options specified', () => __awaiter(void 0, void 0, void 0, function* () {
272
+ const cli = (0, fixtures_2.makeCli)();
273
+ const context = (0, fixtures_1.createMockContext)();
274
+ const code = yield cli.run(MOCK_REQUIRED_FLAGS, context);
275
+ expect(code).toBe(0);
276
+ const output = context.stdout.toString();
277
+ expect(output).toMatchSnapshot();
278
+ }));
279
+ });
280
+ describe('checkAuthentication', () => {
281
+ it('should return true when authentication is successful', () => __awaiter(void 0, void 0, void 0, function* () {
282
+ ;
283
+ google_auth_library_1.GoogleAuth.mockImplementationOnce(() => ({
284
+ getApplicationDefault: () => Promise.resolve(),
285
+ }));
286
+ const result = yield (0, flare_1.checkAuthentication)();
287
+ expect(result).toBeTruthy();
288
+ expect(google_auth_library_1.GoogleAuth).toHaveBeenCalledTimes(1);
289
+ }));
290
+ it('should return false when authentication fails', () => __awaiter(void 0, void 0, void 0, function* () {
291
+ ;
292
+ google_auth_library_1.GoogleAuth.mockImplementationOnce(() => ({
293
+ getApplicationDefault: () => Promise.reject(),
294
+ }));
295
+ const result = yield (0, flare_1.checkAuthentication)();
296
+ expect(result).toBeFalsy();
297
+ expect(google_auth_library_1.GoogleAuth).toHaveBeenCalledTimes(1);
298
+ }));
299
+ it('prints instructions on how to authenticate when authentication fails', () => __awaiter(void 0, void 0, void 0, function* () {
300
+ ;
301
+ google_auth_library_1.GoogleAuth.mockImplementationOnce(() => ({
302
+ getApplicationDefault: () => Promise.reject(),
303
+ }));
304
+ const cli = (0, fixtures_2.makeCli)();
305
+ const context = (0, fixtures_1.createMockContext)();
306
+ const code = yield cli.run(MOCK_REQUIRED_FLAGS, context);
307
+ expect(code).toBe(1);
308
+ const output = context.stdout.toString();
309
+ expect(output).toMatchSnapshot();
310
+ }));
311
+ });
312
+ describe('getCloudRunServiceConfig', () => {
313
+ const getConfigSpy = jest.spyOn(flareModule, 'getCloudRunServiceConfig');
314
+ afterAll(() => {
315
+ getConfigSpy.mockRestore();
316
+ });
317
+ it('stops and prints error when getCloudRunServiceConfig fails', () => __awaiter(void 0, void 0, void 0, function* () {
318
+ ;
319
+ flare_1.getCloudRunServiceConfig.mockImplementation(() => {
320
+ throw new Error('MOCK ERROR: Some API error');
321
+ });
322
+ const cli = (0, fixtures_2.makeCli)();
323
+ const context = (0, fixtures_1.createMockContext)();
324
+ const code = yield cli.run(MOCK_REQUIRED_FLAGS, context);
325
+ expect(code).toBe(1);
326
+ const output = context.stdout.toString();
327
+ expect(output).toMatchSnapshot();
328
+ }));
329
+ it('prints config when running as a dry run', () => __awaiter(void 0, void 0, void 0, function* () {
330
+ ;
331
+ flare_1.getCloudRunServiceConfig.mockImplementation(() => Promise.resolve(MOCK_CLOUDRUN_CONFIG));
332
+ const cli = (0, fixtures_2.makeCli)();
333
+ const context = (0, fixtures_1.createMockContext)();
334
+ const code = yield cli.run([...MOCK_REQUIRED_FLAGS, '-d'], context);
335
+ expect(code).toBe(0);
336
+ const output = context.stdout.toString();
337
+ expect(output).toMatchSnapshot();
338
+ }));
339
+ });
340
+ describe('maskConfig', () => {
341
+ it('should mask a Cloud Run config correctly', () => {
342
+ const maskedConfig = (0, flare_1.maskConfig)(MOCK_CLOUDRUN_CONFIG);
343
+ expect(maskedConfig).toMatchSnapshot();
344
+ });
345
+ it('should not modify config if env vars are missing', () => {
346
+ const cloudrunConfigCopy = JSON.parse(JSON.stringify(MOCK_CLOUDRUN_CONFIG));
347
+ delete cloudrunConfigCopy.template.containers;
348
+ const maskedConfig = (0, flare_1.maskConfig)(cloudrunConfigCopy);
349
+ expect(maskedConfig).toMatchSnapshot();
350
+ });
351
+ });
352
+ test('getRecentRevisions should return the correct revision names', () => __awaiter(void 0, void 0, void 0, function* () {
353
+ const revisions = yield (0, flare_1.getRecentRevisions)(MOCK_SERVICE, MOCK_REGION, MOCK_PROJECT);
354
+ expect(revisions).toEqual(MOCK_REVISION_NAMES);
355
+ }));
356
+ describe('generateInsightsFile', () => {
357
+ const insightsFilePath = 'mock/INSIGHTS.md';
358
+ const writeFileSpy = jest.spyOn(fsModule, 'writeFile');
359
+ it('should call writeFile with correct content when isDryRun is false', () => {
360
+ (0, flare_1.generateInsightsFile)(insightsFilePath, false, (0, flare_1.maskConfig)(MOCK_CLOUDRUN_CONFIG), MOCK_SERVICE, MOCK_REGION, MOCK_PROJECT, MOCK_REVISION_NAMES);
361
+ expect(writeFileSpy).toHaveBeenCalledTimes(1);
362
+ const receivedContent = writeFileSpy.mock.calls[0][1];
363
+ expect(receivedContent).toMatchSnapshot();
364
+ });
365
+ it('should call writeFile with correct content when isDryRun is true', () => {
366
+ (0, flare_1.generateInsightsFile)(insightsFilePath, true, (0, flare_1.maskConfig)(MOCK_CLOUDRUN_CONFIG), MOCK_SERVICE, MOCK_REGION, MOCK_PROJECT, MOCK_REVISION_NAMES);
367
+ expect(writeFileSpy).toHaveBeenCalledTimes(1);
368
+ const receivedContent = writeFileSpy.mock.calls[0][1];
369
+ expect(receivedContent).toMatchSnapshot();
370
+ });
371
+ it('prints a warning when generateInsightsFile() errors', () => __awaiter(void 0, void 0, void 0, function* () {
372
+ jest.spyOn(flareModule, 'generateInsightsFile').mockImplementationOnce(() => {
373
+ throw new Error('Some error');
374
+ });
375
+ const cli = (0, fixtures_2.makeCli)();
376
+ const context = (0, fixtures_1.createMockContext)();
377
+ const code = yield cli.run(MOCK_REQUIRED_FLAGS, context);
378
+ const output = context.stdout.toString();
379
+ expect(code).toBe(0);
380
+ expect(output).toMatchSnapshot();
381
+ }));
382
+ it('splits environment variables when there are multiple containers', () => __awaiter(void 0, void 0, void 0, function* () {
383
+ // Define a config with multiple containers
384
+ // Deep copy MOCK_CLOUDRUN_CONFIG, and then add another container
385
+ const multipleContainerConfig = JSON.parse(JSON.stringify(MOCK_CLOUDRUN_CONFIG));
386
+ const secondContainer = {
387
+ env: [
388
+ {
389
+ name: 'DD_API_KEY',
390
+ value: fixtures_1.MOCK_DATADOG_API_KEY,
391
+ values: 'value',
392
+ },
393
+ ],
394
+ image: 'gcr.io/datadog-sandbox/another-container',
395
+ };
396
+ multipleContainerConfig.template.containers.push(secondContainer);
397
+ (0, flare_1.generateInsightsFile)(insightsFilePath, false, (0, flare_1.maskConfig)(multipleContainerConfig), MOCK_SERVICE, MOCK_REGION, MOCK_PROJECT, MOCK_REVISION_NAMES);
398
+ expect(writeFileSpy).toHaveBeenCalledTimes(1);
399
+ const receivedContent = writeFileSpy.mock.calls[0][1];
400
+ expect(receivedContent).toMatchSnapshot();
401
+ }));
402
+ });
403
+ describe('prompts for confirmation before sending', () => {
404
+ it('sends when user answers prompt with yes', () => __awaiter(void 0, void 0, void 0, function* () {
405
+ jest.spyOn(helpersPromptModule, 'requestConfirmation').mockResolvedValueOnce(true);
406
+ const cli = (0, fixtures_2.makeCli)();
407
+ const context = (0, fixtures_1.createMockContext)();
408
+ const code = yield cli.run(MOCK_REQUIRED_FLAGS, context);
409
+ expect(code).toBe(0);
410
+ const output = context.stdout.toString();
411
+ expect(output).toMatchSnapshot();
412
+ expect(output).toContain('✅ Successfully sent flare file to Datadog Support!');
413
+ }));
414
+ it('does not send when user answers prompt with no', () => __awaiter(void 0, void 0, void 0, function* () {
415
+ // The first prompt is for additional files, the second is for confirmation before sending
416
+ jest.spyOn(helpersPromptModule, 'requestConfirmation').mockResolvedValueOnce(false).mockResolvedValueOnce(false);
417
+ const cli = (0, fixtures_2.makeCli)();
418
+ const context = (0, fixtures_1.createMockContext)();
419
+ const code = yield cli.run(MOCK_REQUIRED_FLAGS, context);
420
+ expect(code).toBe(0);
421
+ const output = context.stdout.toString();
422
+ expect(output).toMatchSnapshot();
423
+ expect(output).toContain('🚫 The flare files were not sent based on your selection.');
424
+ }));
425
+ });
426
+ describe('getLogs', () => {
427
+ const logName = 'mock-logname';
428
+ const mockLogs = [
429
+ { metadata: { severity: 'DEFAULT', timestamp: '2023-07-28 00:00:00', logName, textPayload: 'Log 1' } },
430
+ { metadata: { severity: 'INFO', timestamp: '2023-07-28 00:00:00', logName, textPayload: 'Log 2' } },
431
+ { metadata: { severity: 'NOTICE', timestamp: '2023-07-28 01:01:01', logName, textPayload: 'Log 3' } },
432
+ ];
433
+ const MOCK_GET_ENTRIES = MOCK_LOG_CLIENT.getEntries;
434
+ MOCK_GET_ENTRIES.mockResolvedValue([mockLogs, { pageToken: undefined }]);
435
+ const expectedOrder = 'timestamp asc';
436
+ it('uses correct filter when `severityFilter` is unspecified', () => __awaiter(void 0, void 0, void 0, function* () {
437
+ yield (0, flare_1.getLogs)(MOCK_LOG_CLIENT, MOCK_SERVICE, MOCK_REGION);
438
+ const expectedFilter = `resource.labels.service_name="${MOCK_SERVICE}" AND resource.labels.location="${MOCK_REGION}" AND timestamp>="2022-12-31T00:00:00.000Z" AND timestamp<="2023-01-01T00:00:00.000Z" AND (textPayload:* OR httpRequest:*)`;
439
+ expect(MOCK_LOG_CLIENT.getEntries).toHaveBeenCalledWith({
440
+ filter: expectedFilter,
441
+ orderBy: expectedOrder,
442
+ pageSize: flare_1.MAX_LOGS,
443
+ });
444
+ }));
445
+ it('uses correct filter when `severityFilter` is defined', () => __awaiter(void 0, void 0, void 0, function* () {
446
+ yield (0, flare_1.getLogs)(MOCK_LOG_CLIENT, MOCK_SERVICE, MOCK_REGION, undefined, undefined, ' AND severity>="WARNING"');
447
+ const expectedFilter = `resource.labels.service_name="${MOCK_SERVICE}" AND resource.labels.location="${MOCK_REGION}" AND timestamp>="2022-12-31T00:00:00.000Z" AND timestamp<="2023-01-01T00:00:00.000Z" AND (textPayload:* OR httpRequest:*) AND severity>="WARNING"`;
448
+ expect(MOCK_LOG_CLIENT.getEntries).toHaveBeenCalledWith({
449
+ filter: expectedFilter,
450
+ orderBy: expectedOrder,
451
+ pageSize: flare_1.MAX_LOGS,
452
+ });
453
+ }));
454
+ it('converts logs to the CloudRunLog interface correctly', () => __awaiter(void 0, void 0, void 0, function* () {
455
+ const page1 = [
456
+ { metadata: { severity: 'DEFAULT', timestamp: '2023-07-28 00:00:00', logName, textPayload: 'Test log' } },
457
+ ];
458
+ MOCK_GET_ENTRIES.mockResolvedValueOnce([page1, { pageToken: undefined }]);
459
+ const logs = yield (0, flare_1.getLogs)(MOCK_LOG_CLIENT, MOCK_SERVICE, MOCK_REGION);
460
+ expect(logs).toEqual([
461
+ {
462
+ severity: 'DEFAULT',
463
+ timestamp: '2023-07-28 00:00:00',
464
+ logName,
465
+ message: '"Test log"',
466
+ },
467
+ ]);
468
+ }));
469
+ it('throws an error when `getEntries` fails', () => __awaiter(void 0, void 0, void 0, function* () {
470
+ const error = new Error('getEntries failed');
471
+ MOCK_GET_ENTRIES.mockRejectedValueOnce(error);
472
+ yield expect((0, flare_1.getLogs)(MOCK_LOG_CLIENT, MOCK_SERVICE, MOCK_REGION)).rejects.toMatchSnapshot();
473
+ }));
474
+ it('returns an empty array when no logs are returned', () => __awaiter(void 0, void 0, void 0, function* () {
475
+ MOCK_GET_ENTRIES.mockResolvedValueOnce([[], { pageToken: undefined }]);
476
+ const logs = yield (0, flare_1.getLogs)(MOCK_LOG_CLIENT, MOCK_SERVICE, MOCK_REGION);
477
+ expect(logs).toEqual([]);
478
+ }));
479
+ it('handles httpRequest payload correctly', () => __awaiter(void 0, void 0, void 0, function* () {
480
+ const page = [
481
+ {
482
+ metadata: {
483
+ severity: 'DEFAULT',
484
+ timestamp: '2023-07-28 00:00:00',
485
+ logName,
486
+ httpRequest: {
487
+ requestMethod: 'GET',
488
+ status: 200,
489
+ responseSize: '1300',
490
+ latency: { seconds: '1', nanos: '500000000' },
491
+ requestUrl: '/test-endpoint',
492
+ },
493
+ },
494
+ },
495
+ ];
496
+ MOCK_GET_ENTRIES.mockResolvedValueOnce([page, { pageToken: undefined }]);
497
+ const logs = yield (0, flare_1.getLogs)(MOCK_LOG_CLIENT, MOCK_SERVICE, MOCK_REGION);
498
+ expect(logs).toMatchSnapshot();
499
+ }));
500
+ it('handles textPayload correctly', () => __awaiter(void 0, void 0, void 0, function* () {
501
+ const page = [
502
+ {
503
+ metadata: {
504
+ severity: 'DEFAULT',
505
+ timestamp: '2023-07-28 00:00:00',
506
+ logName,
507
+ textPayload: 'Some text payload',
508
+ },
509
+ },
510
+ ];
511
+ MOCK_GET_ENTRIES.mockResolvedValueOnce([page, { pageToken: undefined }]);
512
+ const logs = yield (0, flare_1.getLogs)(MOCK_LOG_CLIENT, MOCK_SERVICE, MOCK_REGION);
513
+ expect(logs).toMatchSnapshot();
514
+ }));
515
+ it('handles when a log is an HTTP request and has a textPayload', () => __awaiter(void 0, void 0, void 0, function* () {
516
+ const page = [
517
+ { metadata: { severity: 'DEFAULT', timestamp: '2023-07-28 00:00:00', logName, textPayload: 'Test log 1' } },
518
+ {
519
+ metadata: {
520
+ httpRequest: {
521
+ status: 504,
522
+ },
523
+ timestamp: '2023-07-28 00:00:01',
524
+ logName,
525
+ textPayload: 'some text payload.',
526
+ },
527
+ },
528
+ ];
529
+ MOCK_GET_ENTRIES.mockResolvedValueOnce([page, { pageToken: undefined }]);
530
+ const logs = yield (0, flare_1.getLogs)(MOCK_LOG_CLIENT, MOCK_SERVICE, MOCK_REGION);
531
+ expect(logs).toMatchSnapshot();
532
+ }));
533
+ });
534
+ describe('saveLogsFile', () => {
535
+ const mockLogs = [
536
+ { severity: 'DEFAULT', timestamp: '2023-07-28 00:00:00', logName: 'mock-logname', message: 'Test log 1' },
537
+ { severity: 'INFO', timestamp: '2023-07-28 00:00:01', logName: 'mock-logname', message: 'Test log 2' },
538
+ { severity: 'NOTICE', timestamp: '2023-07-28 01:01:01', logName: 'mock-logname', message: 'Test log 3' },
539
+ ];
540
+ const writeFileSpy = jest.spyOn(fsModule, 'writeFile');
541
+ const mockFilePath = 'path/to/logs.csv';
542
+ it('should save logs to file correctly', () => {
543
+ (0, flare_1.saveLogsFile)(mockLogs, mockFilePath);
544
+ const expectedContent = [
545
+ 'severity,timestamp,logName,message',
546
+ '"DEFAULT","2023-07-28 00:00:00","mock-logname","Test log 1"',
547
+ '"INFO","2023-07-28 00:00:01","mock-logname","Test log 2"',
548
+ '"NOTICE","2023-07-28 01:01:01","mock-logname","Test log 3"',
549
+ ].join('\n');
550
+ expect(writeFileSpy).toHaveBeenCalledWith(mockFilePath, expectedContent);
551
+ });
552
+ });
553
+ test('summarizeConfig', () => {
554
+ expect((0, flare_1.summarizeConfig)(MOCK_CLOUDRUN_CONFIG)).toMatchSnapshot();
555
+ });
556
+ });
557
+ //# sourceMappingURL=flare.test.js.map