@zuplo/cli 6.69.5 → 6.69.8

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 (222) hide show
  1. package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts +2 -0
  2. package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts.map +1 -0
  3. package/dist/__tests__/integration/confirm-production-deploy.integration.test.js +184 -0
  4. package/dist/__tests__/integration/confirm-production-deploy.integration.test.js.map +1 -0
  5. package/dist/__tests__/integration/custom-domain.integration.test.js +4 -4
  6. package/dist/__tests__/integration/custom-domain.integration.test.js.map +1 -1
  7. package/dist/__tests__/integration/deploy.integration.test.js +1 -0
  8. package/dist/__tests__/integration/deploy.integration.test.js.map +1 -1
  9. package/dist/__tests__/integration/jest-mocks-setup.js +4 -0
  10. package/dist/__tests__/integration/jest-mocks-setup.js.map +1 -1
  11. package/dist/__tests__/integration/list.integration.test.js +2 -2
  12. package/dist/__tests__/integration/list.integration.test.js.map +1 -1
  13. package/dist/__tests__/integration/tunnel.integration.test.js +14 -14
  14. package/dist/__tests__/integration/tunnel.integration.test.js.map +1 -1
  15. package/dist/__tests__/integration/variable.integration.test.js +4 -4
  16. package/dist/__tests__/integration/variable.integration.test.js.map +1 -1
  17. package/dist/__tests__/integration/whoami.integration.test.js +29 -5
  18. package/dist/__tests__/integration/whoami.integration.test.js.map +1 -1
  19. package/dist/bucket/list/handler.d.ts +8 -0
  20. package/dist/bucket/list/handler.d.ts.map +1 -0
  21. package/dist/bucket/list/handler.js +54 -0
  22. package/dist/bucket/list/handler.js.map +1 -0
  23. package/dist/bucket/models.d.ts +23 -0
  24. package/dist/bucket/models.d.ts.map +1 -0
  25. package/dist/bucket/models.js +2 -0
  26. package/dist/bucket/models.js.map +1 -0
  27. package/dist/cli.js +16 -6
  28. package/dist/cli.js.map +1 -1
  29. package/dist/cmds/bucket/index.d.ts +4 -0
  30. package/dist/cmds/bucket/index.d.ts.map +1 -0
  31. package/dist/cmds/bucket/index.js +9 -0
  32. package/dist/cmds/bucket/index.js.map +1 -0
  33. package/dist/cmds/bucket/list.d.ts +9 -0
  34. package/dist/cmds/bucket/list.d.ts.map +1 -0
  35. package/dist/cmds/bucket/list.js +60 -0
  36. package/dist/cmds/bucket/list.js.map +1 -0
  37. package/dist/cmds/deploy.d.ts.map +1 -1
  38. package/dist/cmds/deploy.js +4 -1
  39. package/dist/cmds/deploy.js.map +1 -1
  40. package/dist/cmds/logout.d.ts +9 -0
  41. package/dist/cmds/logout.d.ts.map +1 -0
  42. package/dist/cmds/logout.js +23 -0
  43. package/dist/cmds/logout.js.map +1 -0
  44. package/dist/cmds/whoami.d.ts.map +1 -1
  45. package/dist/cmds/whoami.js +1 -2
  46. package/dist/cmds/whoami.js.map +1 -1
  47. package/dist/common/api/client.d.ts +40 -0
  48. package/dist/common/api/client.d.ts.map +1 -0
  49. package/dist/common/api/client.js +92 -0
  50. package/dist/common/api/client.js.map +1 -0
  51. package/dist/common/middleware/confirm-production-deploy.d.ts +4 -0
  52. package/dist/common/middleware/confirm-production-deploy.d.ts.map +1 -0
  53. package/dist/common/middleware/confirm-production-deploy.js +49 -0
  54. package/dist/common/middleware/confirm-production-deploy.js.map +1 -0
  55. package/dist/common/middleware/get-environment-param.d.ts +6 -0
  56. package/dist/common/middleware/get-environment-param.d.ts.map +1 -1
  57. package/dist/common/middleware/get-environment-param.js +15 -0
  58. package/dist/common/middleware/get-environment-param.js.map +1 -1
  59. package/dist/common/middleware/get-environment-param.test.d.ts +2 -0
  60. package/dist/common/middleware/get-environment-param.test.d.ts.map +1 -0
  61. package/dist/common/middleware/get-environment-param.test.js +33 -0
  62. package/dist/common/middleware/get-environment-param.test.js.map +1 -0
  63. package/dist/common/output.d.ts +7 -0
  64. package/dist/common/output.d.ts.map +1 -1
  65. package/dist/common/output.js +15 -1
  66. package/dist/common/output.js.map +1 -1
  67. package/dist/common/read-linked-config.d.ts +6 -1
  68. package/dist/common/read-linked-config.d.ts.map +1 -1
  69. package/dist/common/read-linked-config.js +14 -4
  70. package/dist/common/read-linked-config.js.map +1 -1
  71. package/dist/common/read-linked-config.test.js +97 -0
  72. package/dist/common/read-linked-config.test.js.map +1 -1
  73. package/dist/custom-domain/create/handler.d.ts.map +1 -1
  74. package/dist/custom-domain/create/handler.js +12 -27
  75. package/dist/custom-domain/create/handler.js.map +1 -1
  76. package/dist/custom-domain/delete/handler.d.ts.map +1 -1
  77. package/dist/custom-domain/delete/handler.js +25 -54
  78. package/dist/custom-domain/delete/handler.js.map +1 -1
  79. package/dist/custom-domain/list/handler.d.ts.map +1 -1
  80. package/dist/custom-domain/list/handler.js +15 -29
  81. package/dist/custom-domain/list/handler.js.map +1 -1
  82. package/dist/custom-domain/update/handler.d.ts.map +1 -1
  83. package/dist/custom-domain/update/handler.js +12 -27
  84. package/dist/custom-domain/update/handler.js.map +1 -1
  85. package/dist/deploy/environments.d.ts +1 -0
  86. package/dist/deploy/environments.d.ts.map +1 -1
  87. package/dist/deploy/environments.js +11 -7
  88. package/dist/deploy/environments.js.map +1 -1
  89. package/dist/list/handler.d.ts.map +1 -1
  90. package/dist/list/handler.js +41 -59
  91. package/dist/list/handler.js.map +1 -1
  92. package/dist/login/logout.d.ts +5 -0
  93. package/dist/login/logout.d.ts.map +1 -0
  94. package/dist/login/logout.js +6 -0
  95. package/dist/login/logout.js.map +1 -0
  96. package/dist/login/tokens.d.ts +1 -0
  97. package/dist/login/tokens.d.ts.map +1 -1
  98. package/dist/login/tokens.js +16 -1
  99. package/dist/login/tokens.js.map +1 -1
  100. package/dist/mtls-certificates/create/handler.d.ts.map +1 -1
  101. package/dist/mtls-certificates/create/handler.js +9 -23
  102. package/dist/mtls-certificates/create/handler.js.map +1 -1
  103. package/dist/mtls-certificates/delete/handler.d.ts.map +1 -1
  104. package/dist/mtls-certificates/delete/handler.js +8 -20
  105. package/dist/mtls-certificates/delete/handler.js.map +1 -1
  106. package/dist/mtls-certificates/describe/handler.d.ts.map +1 -1
  107. package/dist/mtls-certificates/describe/handler.js +17 -31
  108. package/dist/mtls-certificates/describe/handler.js.map +1 -1
  109. package/dist/mtls-certificates/disable/handler.d.ts.map +1 -1
  110. package/dist/mtls-certificates/disable/handler.js +9 -26
  111. package/dist/mtls-certificates/disable/handler.js.map +1 -1
  112. package/dist/mtls-certificates/list/handler.d.ts.map +1 -1
  113. package/dist/mtls-certificates/list/handler.js +22 -36
  114. package/dist/mtls-certificates/list/handler.js.map +1 -1
  115. package/dist/mtls-certificates/update/handler.d.ts.map +1 -1
  116. package/dist/mtls-certificates/update/handler.js +14 -29
  117. package/dist/mtls-certificates/update/handler.js.map +1 -1
  118. package/dist/proxies/create/handler.d.ts.map +1 -1
  119. package/dist/proxies/create/handler.js +9 -22
  120. package/dist/proxies/create/handler.js.map +1 -1
  121. package/dist/proxies/delete/handler.d.ts.map +1 -1
  122. package/dist/proxies/delete/handler.js +8 -21
  123. package/dist/proxies/delete/handler.js.map +1 -1
  124. package/dist/proxies/describe/handler.d.ts.map +1 -1
  125. package/dist/proxies/describe/handler.js +7 -22
  126. package/dist/proxies/describe/handler.js.map +1 -1
  127. package/dist/proxies/update/handler.d.ts.map +1 -1
  128. package/dist/proxies/update/handler.js +9 -22
  129. package/dist/proxies/update/handler.js.map +1 -1
  130. package/dist/tsconfig.tsbuildinfo +1 -1
  131. package/dist/tunnel/create/handler.d.ts.map +1 -1
  132. package/dist/tunnel/create/handler.js +8 -22
  133. package/dist/tunnel/create/handler.js.map +1 -1
  134. package/dist/tunnel/delete/handler.d.ts.map +1 -1
  135. package/dist/tunnel/delete/handler.js +16 -30
  136. package/dist/tunnel/delete/handler.js.map +1 -1
  137. package/dist/tunnel/describe/handler.d.ts.map +1 -1
  138. package/dist/tunnel/describe/handler.js +7 -21
  139. package/dist/tunnel/describe/handler.js.map +1 -1
  140. package/dist/tunnel/list/handler.d.ts.map +1 -1
  141. package/dist/tunnel/list/handler.js +13 -28
  142. package/dist/tunnel/list/handler.js.map +1 -1
  143. package/dist/tunnel/rotate-token/handler.d.ts.map +1 -1
  144. package/dist/tunnel/rotate-token/handler.js +7 -21
  145. package/dist/tunnel/rotate-token/handler.js.map +1 -1
  146. package/dist/tunnel/services/describe/handler.d.ts.map +1 -1
  147. package/dist/tunnel/services/describe/handler.js +7 -21
  148. package/dist/tunnel/services/describe/handler.js.map +1 -1
  149. package/dist/tunnel/services/update/handler.d.ts.map +1 -1
  150. package/dist/tunnel/services/update/handler.js +18 -32
  151. package/dist/tunnel/services/update/handler.js.map +1 -1
  152. package/dist/variable/create/handler.d.ts.map +1 -1
  153. package/dist/variable/create/handler.js +9 -24
  154. package/dist/variable/create/handler.js.map +1 -1
  155. package/dist/variable/update/handler.d.ts.map +1 -1
  156. package/dist/variable/update/handler.js +9 -24
  157. package/dist/variable/update/handler.js.map +1 -1
  158. package/dist/whoami/handler.d.ts +1 -1
  159. package/dist/whoami/handler.d.ts.map +1 -1
  160. package/dist/whoami/handler.js +12 -17
  161. package/dist/whoami/handler.js.map +1 -1
  162. package/node_modules/@zuplo/core/customer.cli.minified.js +225 -211
  163. package/node_modules/@zuplo/core/index.minified.js +237 -223
  164. package/node_modules/@zuplo/core/package.json +1 -1
  165. package/node_modules/@zuplo/editor/node_modules/find-my-way/.github/workflows/node.js.yml +1 -1
  166. package/node_modules/@zuplo/editor/node_modules/find-my-way/README.md +10 -0
  167. package/node_modules/@zuplo/editor/node_modules/find-my-way/index.d.ts +6 -0
  168. package/node_modules/@zuplo/editor/node_modules/find-my-way/index.js +37 -4
  169. package/node_modules/@zuplo/editor/node_modules/find-my-way/lib/handler-storage.js +2 -2
  170. package/node_modules/@zuplo/editor/node_modules/find-my-way/package.json +3 -3
  171. package/node_modules/@zuplo/editor/node_modules/find-my-way/test/repro-issue-414.test.js +57 -0
  172. package/node_modules/@zuplo/editor/node_modules/find-my-way/test/types/router.test-d.ts +1 -0
  173. package/node_modules/@zuplo/graphql/package.json +1 -1
  174. package/node_modules/@zuplo/openapi-tools/package.json +1 -1
  175. package/node_modules/@zuplo/otel/package.json +1 -1
  176. package/node_modules/@zuplo/runtime/package.json +1 -1
  177. package/node_modules/graphql/index.d.ts +1 -0
  178. package/node_modules/graphql/language/ast.d.ts +10 -1
  179. package/node_modules/graphql/language/ast.js +8 -1
  180. package/node_modules/graphql/language/ast.mjs +8 -1
  181. package/node_modules/graphql/language/directiveLocation.d.ts +1 -0
  182. package/node_modules/graphql/language/directiveLocation.js +1 -0
  183. package/node_modules/graphql/language/directiveLocation.mjs +1 -0
  184. package/node_modules/graphql/language/index.d.ts +1 -0
  185. package/node_modules/graphql/language/kinds.d.ts +1 -0
  186. package/node_modules/graphql/language/kinds.js +1 -0
  187. package/node_modules/graphql/language/kinds.mjs +1 -0
  188. package/node_modules/graphql/language/parser.d.ts +14 -0
  189. package/node_modules/graphql/language/parser.js +33 -0
  190. package/node_modules/graphql/language/parser.mjs +33 -0
  191. package/node_modules/graphql/language/predicates.js +3 -1
  192. package/node_modules/graphql/language/predicates.mjs +5 -1
  193. package/node_modules/graphql/language/printer.js +13 -1
  194. package/node_modules/graphql/language/printer.mjs +13 -1
  195. package/node_modules/graphql/package.json +1 -1
  196. package/node_modules/graphql/type/directives.d.ts +9 -1
  197. package/node_modules/graphql/type/directives.js +10 -1
  198. package/node_modules/graphql/type/directives.mjs +10 -1
  199. package/node_modules/graphql/type/introspection.js +24 -1
  200. package/node_modules/graphql/type/introspection.mjs +24 -1
  201. package/node_modules/graphql/utilities/buildASTSchema.js +4 -0
  202. package/node_modules/graphql/utilities/buildASTSchema.mjs +4 -0
  203. package/node_modules/graphql/utilities/buildClientSchema.js +1 -0
  204. package/node_modules/graphql/utilities/buildClientSchema.mjs +1 -0
  205. package/node_modules/graphql/utilities/extendSchema.js +58 -3
  206. package/node_modules/graphql/utilities/extendSchema.mjs +58 -3
  207. package/node_modules/graphql/utilities/getIntrospectionQuery.d.ts +16 -0
  208. package/node_modules/graphql/utilities/getIntrospectionQuery.js +31 -38
  209. package/node_modules/graphql/utilities/getIntrospectionQuery.mjs +31 -38
  210. package/node_modules/graphql/utilities/introspectionFromSchema.js +1 -0
  211. package/node_modules/graphql/utilities/introspectionFromSchema.mjs +1 -0
  212. package/node_modules/graphql/utilities/printSchema.js +1 -0
  213. package/node_modules/graphql/utilities/printSchema.mjs +1 -0
  214. package/node_modules/graphql/utilities/valueFromAST.js +12 -2
  215. package/node_modules/graphql/utilities/valueFromAST.mjs +12 -2
  216. package/node_modules/graphql/validation/rules/KnownDirectivesRule.js +4 -0
  217. package/node_modules/graphql/validation/rules/KnownDirectivesRule.mjs +4 -0
  218. package/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js +12 -0
  219. package/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.mjs +12 -0
  220. package/node_modules/graphql/version.js +3 -3
  221. package/node_modules/graphql/version.mjs +3 -3
  222. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/deploy.integration.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Integration tests for the deploy command\n */\n/// <reference types=\"jest\" />\nimport nock from \"nock\";\nimport yargs from \"yargs/yargs\";\nimport deployCommand from \"../../cmds/deploy.js\";\nimport {\n cleanupTest,\n RequestCapture,\n setupAuthenticatedNock,\n setupTestEnvironment,\n TEST_ACCOUNT_NAME,\n TEST_API_BASE,\n TEST_AUTH_TOKEN,\n TEST_PROJECT_NAME,\n} from \"./test-utils.js\";\n\n// Mock file system validator\njest.mock(\"../../common/validators/file-system-validator.js\", () => ({\n validDeployDirectoryValidator: {\n validate: jest.fn().mockResolvedValue(true),\n },\n}));\n\n// Mock archive functionality to return predictable metadata\njest.mock(\"../../deploy/archive.js\", () => ({\n archive: jest.fn().mockResolvedValue({\n tarball: \"/tmp/test-archive.tar.gz\",\n metadata: {\n branch: \"main\",\n sha: \"abc123\",\n repoUrl: \"https://github.com/user/repo.git\",\n },\n }),\n generateMetadata: jest.fn().mockResolvedValue({\n branch: \"main\",\n sha: \"abc123\",\n repoUrl: \"https://github.com/user/repo.git\",\n }),\n}));\n\n// Mock file upload but allow the HTTP call to be intercepted\njest.mock(\"../../deploy/file-upload.js\", () => ({\n upload: jest.fn(async ({ uploadUrl }) => {\n // Make actual HTTP call to allow nock interception\n const response = await fetch(uploadUrl, {\n method: \"PUT\",\n body: \"mock-tarball-content\",\n });\n return {\n ok: response.ok,\n status: response.status,\n };\n }),\n}));\n\n// Mock polling functions to simulate deployment success\njest.mock(\"../../deploy/poll-deployment.js\", () => ({\n pollDeployment: jest.fn().mockResolvedValue({\n url: \"https://test-project-main.zuplo.app\",\n logUrl: \"https://portal.zuplo.com/logs/deployment-123\",\n }),\n pollBuild: jest.fn().mockResolvedValue({\n conditionType: \"Complete\",\n }),\n}));\n\n// Mock link functionality for self-hosted\njest.mock(\"../../common/populate.js\", () => ({\n pullSystemConfig: jest.fn().mockResolvedValue(undefined),\n pullLocalConfig: jest.fn().mockResolvedValue(undefined),\n}));\n\n// Mock environment functions\njest.mock(\"../../deploy/environments.js\", () => ({\n retrieveOrCreateEnvironment: jest.fn().mockResolvedValue({\n name: \"development\",\n type: \"development\",\n }),\n UnableToAutoLinkToExistingProject: class extends Error {},\n}));\n\n// Mock file system functions\njest.mock(\"node:fs\", () => ({\n existsSync: jest.fn().mockReturnValue(false),\n readFileSync: jest.fn((filePath: string) => {\n if (filePath.endsWith(\"tls.crt\")) {\n return \"mock-cert-content\";\n }\n if (filePath.endsWith(\"tls.key\")) {\n return \"mock-key-content\";\n }\n return Buffer.from(\"mock-tarball-content\");\n }),\n readdirSync: jest.fn().mockReturnValue([]),\n writeFileSync: jest.fn(),\n}));\n\n/**\n * Execute deploy command with given arguments using actual yargs command\n */\nasync function executeDeployCommand(args: {\n account?: string;\n project?: string;\n \"api-key\"?: string;\n environment?: string;\n \"self-hosted-endpoint\"?: string;\n \"mtls-certificates-dir\"?: string;\n dir?: string;\n}) {\n const yargsInstance = yargs([])\n .command(deployCommand)\n .help(false)\n .version(false)\n .exitProcess(false);\n\n // Build command line arguments\n const commandArgs = [\"deploy\"];\n\n if (args.account) {\n commandArgs.push(\"--account\", args.account);\n }\n\n if (args.project) {\n commandArgs.push(\"--project\", args.project);\n }\n\n if (args[\"api-key\"]) {\n commandArgs.push(\"--api-key\", args[\"api-key\"]);\n }\n\n if (args.environment) {\n commandArgs.push(\"--environment\", args.environment);\n }\n\n if (args[\"self-hosted-endpoint\"]) {\n commandArgs.push(\"--self-hosted-endpoint\", args[\"self-hosted-endpoint\"]);\n }\n\n if (args[\"mtls-certificates-dir\"]) {\n commandArgs.push(\"--mtls-certificates-dir\", args[\"mtls-certificates-dir\"]);\n }\n\n if (args.dir) {\n commandArgs.push(\"--dir\", args.dir);\n }\n\n // Parse and execute the command\n return await yargsInstance.parse(commandArgs);\n}\n\n// Get the mocked functions\nconst mockPrintResult = jest.mocked(\n require(\"../../common/output.js\").printResultToConsoleAndExitGracefully\n);\nconst mockReadFileSync = jest.mocked(require(\"node:fs\").readFileSync);\nconst mockReaddirSync = jest.mocked(require(\"node:fs\").readdirSync);\nconst mockExistsSync = jest.mocked(require(\"node:fs\").existsSync);\n\ndescribe(\"Deploy Command Integration Tests\", () => {\n let requestCapture: RequestCapture;\n\n beforeEach(() => {\n setupTestEnvironment();\n requestCapture = new RequestCapture();\n\n // Disable real HTTP requests\n nock.disableNetConnect();\n\n // Clear mock calls from previous tests\n jest.clearAllMocks();\n\n mockExistsSync.mockReturnValue(false);\n mockReaddirSync.mockReturnValue([]);\n mockReadFileSync.mockImplementation((filePath: string) => {\n if (filePath.endsWith(\"tls.crt\")) {\n return \"mock-cert-content\";\n }\n if (filePath.endsWith(\"tls.key\")) {\n return \"mock-key-content\";\n }\n return Buffer.from(\"mock-tarball-content\");\n });\n });\n\n afterEach(() => {\n cleanupTest();\n requestCapture.clear();\n });\n\n describe(\"SaaS deployment\", () => {\n it(\"should intercept POST request to get source upload URL\", async () => {\n const mockUploadUrlResponse = {\n uploadUrl: \"https://storage.example.com/upload/abc123\",\n deploymentId: \"deployment-456\",\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\"/v1/deployments/source-url\")\n .reply(200, mockUploadUrlResponse);\n\n // Mock the upload to cloud storage\n const uploadScope = nock(\"https://storage.example.com\")\n .put(\"/upload/abc123\")\n .reply(200, { message: \"Upload successful\" });\n\n [scope, uploadScope].forEach((s) => {\n s.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n dir: \".\",\n });\n\n expect(scope.isDone()).toBe(true);\n expect(uploadScope.isDone()).toBe(true);\n\n // Verify successful deployment message\n expect(mockPrintResult).toHaveBeenCalledWith(\n expect.stringContaining(\n \"Deployed to https://test-project-main.zuplo.app\"\n ),\n expect.any(Object) // spinner object\n );\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-saas-requests\");\n\n // Verify the source-url request payload\n const sourceUrlRequest = capturedRequests.find(\n (req) => req.path === \"/v1/deployments/source-url\"\n );\n expect(sourceUrlRequest?.method).toBe(\"POST\");\n expect(sourceUrlRequest?.body).toEqual({\n accountName: TEST_ACCOUNT_NAME,\n projectName: TEST_PROJECT_NAME,\n environment: \"main\",\n repositoryUrl: \"https://github.com/user/repo.git\",\n sha: \"abc123\",\n });\n });\n\n it(\"should handle upload URL request failure\", async () => {\n const errorResponse = {\n error: \"Forbidden\",\n message: \"Insufficient permissions\",\n statusCode: 403,\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\"/v1/deployments/source-url\")\n .reply(403, errorResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await expect(\n executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n dir: \".\",\n })\n ).rejects.toThrow(\"Process would exit\");\n\n expect(scope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-saas-error-requests\");\n });\n });\n\n describe(\"Self-hosted deployment\", () => {\n it(\"should intercept POST request to self-hosted build endpoint\", async () => {\n const selfHostedEndpoint = \"https://my-zuplo.company.com\";\n const mockBuildResponse = {\n buildName: \"build-789\",\n };\n\n const buildScope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .post(\"/v1/deployments/build\")\n .reply(200, mockBuildResponse);\n\n // Mock deployment retrieval after build completion\n const deploymentScope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .get(\"/v1/deployments/test-project-main\")\n .reply(200, {\n deploymentUrl: \"https://my-zuplo.company.com/test-project-main\",\n });\n\n [buildScope, deploymentScope].forEach((scope) => {\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"self-hosted-endpoint\": selfHostedEndpoint,\n dir: \".\",\n });\n\n expect(buildScope.isDone()).toBe(true);\n expect(deploymentScope.isDone()).toBe(true);\n\n // Verify successful deployment message\n expect(mockPrintResult).toHaveBeenCalledWith(\n expect.stringContaining(\n \"Deployed to https://my-zuplo.company.com/test-project-main\"\n ),\n expect.any(Object) // spinner object\n );\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-self-hosted-requests\");\n\n // Verify the build request\n const buildRequest = capturedRequests.find(\n (req) => req.path === \"/v1/deployments/build\"\n );\n expect(buildRequest?.method).toBe(\"POST\");\n // Note: FormData body won't be easily testable in snapshots, but we can verify it exists\n expect(buildRequest?.body).toBeDefined();\n }, 60000); // Increase timeout for this complex test\n\n it(\"should handle self-hosted build failure\", async () => {\n const selfHostedEndpoint = \"https://my-zuplo.company.com\";\n const errorResponse = {\n error: \"Bad Request\",\n message: \"Invalid project configuration\",\n statusCode: 400,\n };\n\n const scope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .post(\"/v1/deployments/build\")\n .reply(400, errorResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"self-hosted-endpoint\": selfHostedEndpoint,\n dir: \".\",\n });\n\n expect(scope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"deploy-self-hosted-error-requests\"\n );\n }, 60000); // Increase timeout for this test too\n\n it(\"should include mtls certificates from mtls-certificates-dir\", async () => {\n const selfHostedEndpoint = \"https://my-zuplo.company.com\";\n const mockBuildResponse = {\n buildName: \"build-789\",\n };\n let capturedBuildRequestBody = \"\";\n\n mockReaddirSync.mockReturnValue([\n {\n name: \"cert-name-2\",\n isDirectory: () => true,\n },\n {\n name: \"cert-name-1\",\n isDirectory: () => true,\n },\n ]);\n mockReadFileSync.mockImplementation((filePath: string) => {\n if (/cert-name-1[\\\\/]tls\\.crt$/.test(filePath)) {\n return \"CERT_1\";\n }\n if (/cert-name-1[\\\\/]tls\\.key$/.test(filePath)) {\n return \"KEY_1\";\n }\n if (/cert-name-2[\\\\/]tls\\.crt$/.test(filePath)) {\n return \"CERT_2\";\n }\n if (/cert-name-2[\\\\/]tls\\.key$/.test(filePath)) {\n return \"KEY_2\";\n }\n return Buffer.from(\"mock-tarball-content\");\n });\n\n const buildScope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .post(\"/v1/deployments/build\", (body) => {\n capturedBuildRequestBody = Buffer.isBuffer(body)\n ? body.toString(\"utf-8\")\n : String(body);\n return true;\n })\n .reply(200, mockBuildResponse);\n\n const deploymentScope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .get(\"/v1/deployments/test-project-main\")\n .reply(200, {\n deploymentUrl: \"https://my-zuplo.company.com/test-project-main\",\n });\n\n [buildScope, deploymentScope].forEach((scope) => {\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"self-hosted-endpoint\": selfHostedEndpoint,\n \"mtls-certificates-dir\": \"./mtls\",\n dir: \".\",\n });\n\n expect(buildScope.isDone()).toBe(true);\n expect(deploymentScope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n const buildRequest = capturedRequests.find(\n (req) => req.path === \"/v1/deployments/build\"\n );\n\n expect(buildRequest?.method).toBe(\"POST\");\n expect(capturedBuildRequestBody).toContain('name=\"mtlsCertificate\"');\n expect(\n (capturedBuildRequestBody.match(/name=\"mtlsCertificate\"/g) || []).length\n ).toBe(2);\n expect(capturedBuildRequestBody).toContain('\"certName\":\"cert-name-1\"');\n expect(capturedBuildRequestBody).toContain('\"mtlsCrt\":\"CERT_1\"');\n expect(capturedBuildRequestBody).toContain('\"mtlsKey\":\"KEY_1\"');\n expect(capturedBuildRequestBody).toContain('\"certName\":\"cert-name-2\"');\n expect(capturedBuildRequestBody).toContain('\"mtlsCrt\":\"CERT_2\"');\n expect(capturedBuildRequestBody).toContain('\"mtlsKey\":\"KEY_2\"');\n\n expect(\n capturedBuildRequestBody.indexOf('\"certName\":\"cert-name-1\"')\n ).toBeLessThan(\n capturedBuildRequestBody.indexOf('\"certName\":\"cert-name-2\"')\n );\n }, 60000);\n });\n\n describe(\"Directory argument handling\", () => {\n it(\"should work when --dir is not specified (uses default)\", async () => {\n const mockUploadUrlResponse = {\n uploadUrl: \"https://storage.example.com/upload/default-test\",\n deploymentId: \"deployment-default\",\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\"/v1/deployments/source-url\")\n .reply(200, mockUploadUrlResponse);\n\n // Mock the upload to cloud storage\n const uploadScope = nock(\"https://storage.example.com\")\n .put(\"/upload/default-test\")\n .reply(200, { message: \"Upload successful\" });\n\n [scope, uploadScope].forEach((s) => {\n s.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n // Note: Not passing dir argument at all - should default to \".\"\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n });\n\n expect(scope.isDone()).toBe(true);\n expect(uploadScope.isDone()).toBe(true);\n\n // Verify successful deployment message\n expect(mockPrintResult).toHaveBeenCalledWith(\n expect.stringContaining(\n \"Deployed to https://test-project-main.zuplo.app\"\n ),\n expect.any(Object)\n );\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-default-dir-requests\");\n });\n\n it(\"should work with explicit --dir=.\", async () => {\n const mockUploadUrlResponse = {\n uploadUrl: \"https://storage.example.com/upload/explicit-dot\",\n deploymentId: \"deployment-dot\",\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\"/v1/deployments/source-url\")\n .reply(200, mockUploadUrlResponse);\n\n const uploadScope = nock(\"https://storage.example.com\")\n .put(\"/upload/explicit-dot\")\n .reply(200, { message: \"Upload successful\" });\n\n [scope, uploadScope].forEach((s) => {\n s.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n dir: \".\",\n });\n\n expect(scope.isDone()).toBe(true);\n expect(uploadScope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-explicit-dot-requests\");\n });\n });\n\n describe(\"Request validation\", () => {\n it(\"should include correct headers for SaaS deployment\", async () => {\n const mockResponse = {\n uploadUrl: \"https://storage.example.com/upload/abc123\",\n deploymentId: \"deployment-456\",\n };\n\n const scope = nock(TEST_API_BASE)\n .post(\"/v1/deployments/source-url\")\n .matchHeader(\"authorization\", `Bearer ${TEST_AUTH_TOKEN}`)\n .reply(200, mockResponse);\n\n // Mock the upload endpoint\n nock(\"https://storage.example.com\").put(\"/upload/abc123\").reply(200);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n dir: \".\",\n });\n\n expect(scope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-headers-validation\");\n });\n });\n});\n"]}
1
+ {"version":3,"file":"deploy.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/deploy.integration.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Integration tests for the deploy command\n */\n/// <reference types=\"jest\" />\nimport nock from \"nock\";\nimport yargs from \"yargs/yargs\";\nimport deployCommand from \"../../cmds/deploy.js\";\nimport {\n cleanupTest,\n RequestCapture,\n setupAuthenticatedNock,\n setupTestEnvironment,\n TEST_ACCOUNT_NAME,\n TEST_API_BASE,\n TEST_AUTH_TOKEN,\n TEST_PROJECT_NAME,\n} from \"./test-utils.js\";\n\n// Mock file system validator\njest.mock(\"../../common/validators/file-system-validator.js\", () => ({\n validDeployDirectoryValidator: {\n validate: jest.fn().mockResolvedValue(true),\n },\n}));\n\n// Mock archive functionality to return predictable metadata\njest.mock(\"../../deploy/archive.js\", () => ({\n archive: jest.fn().mockResolvedValue({\n tarball: \"/tmp/test-archive.tar.gz\",\n metadata: {\n branch: \"main\",\n sha: \"abc123\",\n repoUrl: \"https://github.com/user/repo.git\",\n },\n }),\n generateMetadata: jest.fn().mockResolvedValue({\n branch: \"main\",\n sha: \"abc123\",\n repoUrl: \"https://github.com/user/repo.git\",\n }),\n}));\n\n// Mock file upload but allow the HTTP call to be intercepted\njest.mock(\"../../deploy/file-upload.js\", () => ({\n upload: jest.fn(async ({ uploadUrl }) => {\n // Make actual HTTP call to allow nock interception\n const response = await fetch(uploadUrl, {\n method: \"PUT\",\n body: \"mock-tarball-content\",\n });\n return {\n ok: response.ok,\n status: response.status,\n };\n }),\n}));\n\n// Mock polling functions to simulate deployment success\njest.mock(\"../../deploy/poll-deployment.js\", () => ({\n pollDeployment: jest.fn().mockResolvedValue({\n url: \"https://test-project-main.zuplo.app\",\n logUrl: \"https://portal.zuplo.com/logs/deployment-123\",\n }),\n pollBuild: jest.fn().mockResolvedValue({\n conditionType: \"Complete\",\n }),\n}));\n\n// Mock link functionality for self-hosted\njest.mock(\"../../common/populate.js\", () => ({\n pullSystemConfig: jest.fn().mockResolvedValue(undefined),\n pullLocalConfig: jest.fn().mockResolvedValue(undefined),\n}));\n\n// Mock environment functions\njest.mock(\"../../deploy/environments.js\", () => ({\n retrieveOrCreateEnvironment: jest.fn().mockResolvedValue({\n name: \"development\",\n type: \"development\",\n }),\n UnableToAutoLinkToExistingProject: class extends Error {},\n // Used by confirmProductionDeploy middleware. Default to false so the\n // test's default (interactive=false) path is preserved; tests that want\n // to assert the prompt path can override this mock.\n isProductionBranchName: jest.fn().mockReturnValue(false),\n}));\n\n// Mock file system functions\njest.mock(\"node:fs\", () => ({\n existsSync: jest.fn().mockReturnValue(false),\n readFileSync: jest.fn((filePath: string) => {\n if (filePath.endsWith(\"tls.crt\")) {\n return \"mock-cert-content\";\n }\n if (filePath.endsWith(\"tls.key\")) {\n return \"mock-key-content\";\n }\n return Buffer.from(\"mock-tarball-content\");\n }),\n readdirSync: jest.fn().mockReturnValue([]),\n writeFileSync: jest.fn(),\n}));\n\n/**\n * Execute deploy command with given arguments using actual yargs command\n */\nasync function executeDeployCommand(args: {\n account?: string;\n project?: string;\n \"api-key\"?: string;\n environment?: string;\n \"self-hosted-endpoint\"?: string;\n \"mtls-certificates-dir\"?: string;\n dir?: string;\n}) {\n const yargsInstance = yargs([])\n .command(deployCommand)\n .help(false)\n .version(false)\n .exitProcess(false);\n\n // Build command line arguments\n const commandArgs = [\"deploy\"];\n\n if (args.account) {\n commandArgs.push(\"--account\", args.account);\n }\n\n if (args.project) {\n commandArgs.push(\"--project\", args.project);\n }\n\n if (args[\"api-key\"]) {\n commandArgs.push(\"--api-key\", args[\"api-key\"]);\n }\n\n if (args.environment) {\n commandArgs.push(\"--environment\", args.environment);\n }\n\n if (args[\"self-hosted-endpoint\"]) {\n commandArgs.push(\"--self-hosted-endpoint\", args[\"self-hosted-endpoint\"]);\n }\n\n if (args[\"mtls-certificates-dir\"]) {\n commandArgs.push(\"--mtls-certificates-dir\", args[\"mtls-certificates-dir\"]);\n }\n\n if (args.dir) {\n commandArgs.push(\"--dir\", args.dir);\n }\n\n // Parse and execute the command\n return await yargsInstance.parse(commandArgs);\n}\n\n// Get the mocked functions\nconst mockPrintResult = jest.mocked(\n require(\"../../common/output.js\").printResultToConsoleAndExitGracefully\n);\nconst mockReadFileSync = jest.mocked(require(\"node:fs\").readFileSync);\nconst mockReaddirSync = jest.mocked(require(\"node:fs\").readdirSync);\nconst mockExistsSync = jest.mocked(require(\"node:fs\").existsSync);\n\ndescribe(\"Deploy Command Integration Tests\", () => {\n let requestCapture: RequestCapture;\n\n beforeEach(() => {\n setupTestEnvironment();\n requestCapture = new RequestCapture();\n\n // Disable real HTTP requests\n nock.disableNetConnect();\n\n // Clear mock calls from previous tests\n jest.clearAllMocks();\n\n mockExistsSync.mockReturnValue(false);\n mockReaddirSync.mockReturnValue([]);\n mockReadFileSync.mockImplementation((filePath: string) => {\n if (filePath.endsWith(\"tls.crt\")) {\n return \"mock-cert-content\";\n }\n if (filePath.endsWith(\"tls.key\")) {\n return \"mock-key-content\";\n }\n return Buffer.from(\"mock-tarball-content\");\n });\n });\n\n afterEach(() => {\n cleanupTest();\n requestCapture.clear();\n });\n\n describe(\"SaaS deployment\", () => {\n it(\"should intercept POST request to get source upload URL\", async () => {\n const mockUploadUrlResponse = {\n uploadUrl: \"https://storage.example.com/upload/abc123\",\n deploymentId: \"deployment-456\",\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\"/v1/deployments/source-url\")\n .reply(200, mockUploadUrlResponse);\n\n // Mock the upload to cloud storage\n const uploadScope = nock(\"https://storage.example.com\")\n .put(\"/upload/abc123\")\n .reply(200, { message: \"Upload successful\" });\n\n [scope, uploadScope].forEach((s) => {\n s.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n dir: \".\",\n });\n\n expect(scope.isDone()).toBe(true);\n expect(uploadScope.isDone()).toBe(true);\n\n // Verify successful deployment message\n expect(mockPrintResult).toHaveBeenCalledWith(\n expect.stringContaining(\n \"Deployed to https://test-project-main.zuplo.app\"\n ),\n expect.any(Object) // spinner object\n );\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-saas-requests\");\n\n // Verify the source-url request payload\n const sourceUrlRequest = capturedRequests.find(\n (req) => req.path === \"/v1/deployments/source-url\"\n );\n expect(sourceUrlRequest?.method).toBe(\"POST\");\n expect(sourceUrlRequest?.body).toEqual({\n accountName: TEST_ACCOUNT_NAME,\n projectName: TEST_PROJECT_NAME,\n environment: \"main\",\n repositoryUrl: \"https://github.com/user/repo.git\",\n sha: \"abc123\",\n });\n });\n\n it(\"should handle upload URL request failure\", async () => {\n const errorResponse = {\n error: \"Forbidden\",\n message: \"Insufficient permissions\",\n statusCode: 403,\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\"/v1/deployments/source-url\")\n .reply(403, errorResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await expect(\n executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n dir: \".\",\n })\n ).rejects.toThrow(\"Process would exit\");\n\n expect(scope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-saas-error-requests\");\n });\n });\n\n describe(\"Self-hosted deployment\", () => {\n it(\"should intercept POST request to self-hosted build endpoint\", async () => {\n const selfHostedEndpoint = \"https://my-zuplo.company.com\";\n const mockBuildResponse = {\n buildName: \"build-789\",\n };\n\n const buildScope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .post(\"/v1/deployments/build\")\n .reply(200, mockBuildResponse);\n\n // Mock deployment retrieval after build completion\n const deploymentScope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .get(\"/v1/deployments/test-project-main\")\n .reply(200, {\n deploymentUrl: \"https://my-zuplo.company.com/test-project-main\",\n });\n\n [buildScope, deploymentScope].forEach((scope) => {\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"self-hosted-endpoint\": selfHostedEndpoint,\n dir: \".\",\n });\n\n expect(buildScope.isDone()).toBe(true);\n expect(deploymentScope.isDone()).toBe(true);\n\n // Verify successful deployment message\n expect(mockPrintResult).toHaveBeenCalledWith(\n expect.stringContaining(\n \"Deployed to https://my-zuplo.company.com/test-project-main\"\n ),\n expect.any(Object) // spinner object\n );\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-self-hosted-requests\");\n\n // Verify the build request\n const buildRequest = capturedRequests.find(\n (req) => req.path === \"/v1/deployments/build\"\n );\n expect(buildRequest?.method).toBe(\"POST\");\n // Note: FormData body won't be easily testable in snapshots, but we can verify it exists\n expect(buildRequest?.body).toBeDefined();\n }, 60000); // Increase timeout for this complex test\n\n it(\"should handle self-hosted build failure\", async () => {\n const selfHostedEndpoint = \"https://my-zuplo.company.com\";\n const errorResponse = {\n error: \"Bad Request\",\n message: \"Invalid project configuration\",\n statusCode: 400,\n };\n\n const scope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .post(\"/v1/deployments/build\")\n .reply(400, errorResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"self-hosted-endpoint\": selfHostedEndpoint,\n dir: \".\",\n });\n\n expect(scope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"deploy-self-hosted-error-requests\"\n );\n }, 60000); // Increase timeout for this test too\n\n it(\"should include mtls certificates from mtls-certificates-dir\", async () => {\n const selfHostedEndpoint = \"https://my-zuplo.company.com\";\n const mockBuildResponse = {\n buildName: \"build-789\",\n };\n let capturedBuildRequestBody = \"\";\n\n mockReaddirSync.mockReturnValue([\n {\n name: \"cert-name-2\",\n isDirectory: () => true,\n },\n {\n name: \"cert-name-1\",\n isDirectory: () => true,\n },\n ]);\n mockReadFileSync.mockImplementation((filePath: string) => {\n if (/cert-name-1[\\\\/]tls\\.crt$/.test(filePath)) {\n return \"CERT_1\";\n }\n if (/cert-name-1[\\\\/]tls\\.key$/.test(filePath)) {\n return \"KEY_1\";\n }\n if (/cert-name-2[\\\\/]tls\\.crt$/.test(filePath)) {\n return \"CERT_2\";\n }\n if (/cert-name-2[\\\\/]tls\\.key$/.test(filePath)) {\n return \"KEY_2\";\n }\n return Buffer.from(\"mock-tarball-content\");\n });\n\n const buildScope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .post(\"/v1/deployments/build\", (body) => {\n capturedBuildRequestBody = Buffer.isBuffer(body)\n ? body.toString(\"utf-8\")\n : String(body);\n return true;\n })\n .reply(200, mockBuildResponse);\n\n const deploymentScope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .get(\"/v1/deployments/test-project-main\")\n .reply(200, {\n deploymentUrl: \"https://my-zuplo.company.com/test-project-main\",\n });\n\n [buildScope, deploymentScope].forEach((scope) => {\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"self-hosted-endpoint\": selfHostedEndpoint,\n \"mtls-certificates-dir\": \"./mtls\",\n dir: \".\",\n });\n\n expect(buildScope.isDone()).toBe(true);\n expect(deploymentScope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n const buildRequest = capturedRequests.find(\n (req) => req.path === \"/v1/deployments/build\"\n );\n\n expect(buildRequest?.method).toBe(\"POST\");\n expect(capturedBuildRequestBody).toContain('name=\"mtlsCertificate\"');\n expect(\n (capturedBuildRequestBody.match(/name=\"mtlsCertificate\"/g) || []).length\n ).toBe(2);\n expect(capturedBuildRequestBody).toContain('\"certName\":\"cert-name-1\"');\n expect(capturedBuildRequestBody).toContain('\"mtlsCrt\":\"CERT_1\"');\n expect(capturedBuildRequestBody).toContain('\"mtlsKey\":\"KEY_1\"');\n expect(capturedBuildRequestBody).toContain('\"certName\":\"cert-name-2\"');\n expect(capturedBuildRequestBody).toContain('\"mtlsCrt\":\"CERT_2\"');\n expect(capturedBuildRequestBody).toContain('\"mtlsKey\":\"KEY_2\"');\n\n expect(\n capturedBuildRequestBody.indexOf('\"certName\":\"cert-name-1\"')\n ).toBeLessThan(\n capturedBuildRequestBody.indexOf('\"certName\":\"cert-name-2\"')\n );\n }, 60000);\n });\n\n describe(\"Directory argument handling\", () => {\n it(\"should work when --dir is not specified (uses default)\", async () => {\n const mockUploadUrlResponse = {\n uploadUrl: \"https://storage.example.com/upload/default-test\",\n deploymentId: \"deployment-default\",\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\"/v1/deployments/source-url\")\n .reply(200, mockUploadUrlResponse);\n\n // Mock the upload to cloud storage\n const uploadScope = nock(\"https://storage.example.com\")\n .put(\"/upload/default-test\")\n .reply(200, { message: \"Upload successful\" });\n\n [scope, uploadScope].forEach((s) => {\n s.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n // Note: Not passing dir argument at all - should default to \".\"\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n });\n\n expect(scope.isDone()).toBe(true);\n expect(uploadScope.isDone()).toBe(true);\n\n // Verify successful deployment message\n expect(mockPrintResult).toHaveBeenCalledWith(\n expect.stringContaining(\n \"Deployed to https://test-project-main.zuplo.app\"\n ),\n expect.any(Object)\n );\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-default-dir-requests\");\n });\n\n it(\"should work with explicit --dir=.\", async () => {\n const mockUploadUrlResponse = {\n uploadUrl: \"https://storage.example.com/upload/explicit-dot\",\n deploymentId: \"deployment-dot\",\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\"/v1/deployments/source-url\")\n .reply(200, mockUploadUrlResponse);\n\n const uploadScope = nock(\"https://storage.example.com\")\n .put(\"/upload/explicit-dot\")\n .reply(200, { message: \"Upload successful\" });\n\n [scope, uploadScope].forEach((s) => {\n s.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n dir: \".\",\n });\n\n expect(scope.isDone()).toBe(true);\n expect(uploadScope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-explicit-dot-requests\");\n });\n });\n\n describe(\"Request validation\", () => {\n it(\"should include correct headers for SaaS deployment\", async () => {\n const mockResponse = {\n uploadUrl: \"https://storage.example.com/upload/abc123\",\n deploymentId: \"deployment-456\",\n };\n\n const scope = nock(TEST_API_BASE)\n .post(\"/v1/deployments/source-url\")\n .matchHeader(\"authorization\", `Bearer ${TEST_AUTH_TOKEN}`)\n .reply(200, mockResponse);\n\n // Mock the upload endpoint\n nock(\"https://storage.example.com\").put(\"/upload/abc123\").reply(200);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeDeployCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n dir: \".\",\n });\n\n expect(scope.isDone()).toBe(true);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\"deploy-headers-validation\");\n });\n });\n});\n"]}
@@ -5,6 +5,9 @@ jest.mock("../../common/output.js", () => ({
5
5
  printResultToConsoleAndExitGracefully: jest.fn().mockResolvedValue(undefined),
6
6
  printTableToConsoleAndExitGracefully: jest.fn().mockResolvedValue(undefined),
7
7
  printJsonToConsoleAndExitGracefully: jest.fn().mockResolvedValue(undefined),
8
+ printCancellationToConsoleAndExitGracefully: jest
9
+ .fn()
10
+ .mockResolvedValue(undefined),
8
11
  printResultToConsole: jest.fn().mockResolvedValue(undefined),
9
12
  printJsonToConsole: jest.fn().mockResolvedValue(undefined),
10
13
  printDiagnosticsToConsole: jest.fn(),
@@ -15,6 +18,7 @@ jest.mock("../../common/output.js", () => ({
15
18
  fail: jest.fn(),
16
19
  suffixText: "",
17
20
  }),
21
+ printCriticalFailureToConsole: jest.fn(),
18
22
  printCriticalFailureToConsoleAndExit: jest.fn().mockImplementation(() => {
19
23
  throw new Error("Process would exit");
20
24
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"jest-mocks-setup.js","sourceRoot":"","sources":["../../../src/__tests__/integration/jest-mocks-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Jest mocks setup - loaded before all test modules\n * This file contains all the Jest mocks that need to be applied before any modules are imported\n */\nimport type { Ora } from \"ora\";\n\nconst TEST_AUTH_TOKEN = \"test-auth-token-123\";\n\n// Mock all output functions to prevent actual console output and process.exit calls\njest.mock(\"../../common/output.js\", () => ({\n __esModule: true,\n default: jest.fn((argv: unknown) => argv), // setBlocking middleware function\n printResultToConsoleAndExitGracefully: jest.fn().mockResolvedValue(undefined),\n printTableToConsoleAndExitGracefully: jest.fn().mockResolvedValue(undefined),\n printJsonToConsoleAndExitGracefully: jest.fn().mockResolvedValue(undefined),\n printResultToConsole: jest.fn().mockResolvedValue(undefined),\n printJsonToConsole: jest.fn().mockResolvedValue(undefined),\n printDiagnosticsToConsole: jest.fn(),\n printWarningToConsole: jest.fn(),\n printSpinnerToConsole: jest.fn().mockReturnValue({\n stop: jest.fn(),\n succeed: jest.fn(),\n fail: jest.fn(),\n suffixText: \"\",\n } as unknown as Ora),\n printCriticalFailureToConsoleAndExit: jest.fn().mockImplementation(() => {\n throw new Error(\"Process would exit\");\n }),\n textOrJson: jest.fn((text: string) => {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }),\n}));\n\n// Mock analytics\njest.mock(\"../../common/analytics/lib.js\", () => ({\n captureEvent: jest.fn().mockResolvedValue(undefined),\n}));\n\n// Mock authentication middleware to add authToken\njest.mock(\"../../common/middleware/authentication.js\", () => ({\n authenticate: jest.fn((argv: Record<string, unknown>) => {\n argv.authToken = TEST_AUTH_TOKEN;\n return argv;\n }),\n authenticateNoPrompt: jest.fn((argv: Record<string, unknown>) => {\n argv.authToken = TEST_AUTH_TOKEN;\n return argv;\n }),\n}));\n\n// Mock inquirer prompts to return predictable values for tests\njest.mock(\"@inquirer/prompts\", () => {\n class MockSeparator {\n type = \"separator\";\n separator: string;\n constructor(separator = \"──────────────\") {\n this.separator = separator;\n }\n static isSeparator(item: unknown): boolean {\n return (\n item != null &&\n typeof item === \"object\" &&\n (item as { type?: unknown }).type === \"separator\"\n );\n }\n }\n return {\n Separator: MockSeparator,\n select: jest.fn().mockImplementation(({ choices }) => {\n if (Array.isArray(choices) && choices.length > 0) {\n // Skip separators (no `value`) and null-sentinel choices, then return\n // the first real choice's value.\n const firstReal =\n choices.find(\n (c) =>\n !MockSeparator.isSeparator(c) &&\n (c as { value?: unknown }).value !== null\n ) ?? choices[0];\n return Promise.resolve((firstReal as { value: unknown }).value);\n }\n return Promise.resolve(\"test-default\");\n }),\n input: jest.fn().mockResolvedValue(\"test-new-project\"),\n };\n});\n\n// Mock other middleware to pass through arguments\njest.mock(\"../../common/middleware/user-configuration.js\", () => ({\n configure: jest.fn((argv: unknown) => argv),\n}));\n\njest.mock(\"../../common/middleware/user-identification.js\", () => ({\n identify: jest.fn((argv: unknown) => argv),\n}));\n\n// Mock validators to pass through\njest.mock(\"../../common/validators/lib.js\", () => ({\n YargsChecker: jest.fn().mockImplementation(() => ({\n check: jest.fn().mockResolvedValue(true),\n })),\n}));\n\n// Mock showHelpOnNoSubcommand helper for commands with subcommands\njest.mock(\"../../common/handler.js\", () => ({\n showHelpOnNoSubcommand: jest.fn((configure) => ({\n builder: (yargs: unknown) => (configure as (y: unknown) => unknown)(yargs),\n handler: jest.fn(),\n })),\n}));\n\n// Mock token functions to prevent file system and HTTP calls\njest.mock(\"../../login/tokens.js\", () => ({\n getAuthToken: jest.fn().mockResolvedValue(TEST_AUTH_TOKEN),\n refreshAccessToken: jest.fn().mockResolvedValue({\n access_token: TEST_AUTH_TOKEN,\n id_token: \"mock-id-token\",\n expires_in: 3600,\n token_type: \"Bearer\",\n scope: \"openid profile email\",\n }),\n}));\n"]}
1
+ {"version":3,"file":"jest-mocks-setup.js","sourceRoot":"","sources":["../../../src/__tests__/integration/jest-mocks-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Jest mocks setup - loaded before all test modules\n * This file contains all the Jest mocks that need to be applied before any modules are imported\n */\nimport type { Ora } from \"ora\";\n\nconst TEST_AUTH_TOKEN = \"test-auth-token-123\";\n\n// Mock all output functions to prevent actual console output and process.exit calls\njest.mock(\"../../common/output.js\", () => ({\n __esModule: true,\n default: jest.fn((argv: unknown) => argv), // setBlocking middleware function\n printResultToConsoleAndExitGracefully: jest.fn().mockResolvedValue(undefined),\n printTableToConsoleAndExitGracefully: jest.fn().mockResolvedValue(undefined),\n printJsonToConsoleAndExitGracefully: jest.fn().mockResolvedValue(undefined),\n printCancellationToConsoleAndExitGracefully: jest\n .fn()\n .mockResolvedValue(undefined),\n printResultToConsole: jest.fn().mockResolvedValue(undefined),\n printJsonToConsole: jest.fn().mockResolvedValue(undefined),\n printDiagnosticsToConsole: jest.fn(),\n printWarningToConsole: jest.fn(),\n printSpinnerToConsole: jest.fn().mockReturnValue({\n stop: jest.fn(),\n succeed: jest.fn(),\n fail: jest.fn(),\n suffixText: \"\",\n } as unknown as Ora),\n printCriticalFailureToConsole: jest.fn(),\n printCriticalFailureToConsoleAndExit: jest.fn().mockImplementation(() => {\n throw new Error(\"Process would exit\");\n }),\n textOrJson: jest.fn((text: string) => {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }),\n}));\n\n// Mock analytics\njest.mock(\"../../common/analytics/lib.js\", () => ({\n captureEvent: jest.fn().mockResolvedValue(undefined),\n}));\n\n// Mock authentication middleware to add authToken\njest.mock(\"../../common/middleware/authentication.js\", () => ({\n authenticate: jest.fn((argv: Record<string, unknown>) => {\n argv.authToken = TEST_AUTH_TOKEN;\n return argv;\n }),\n authenticateNoPrompt: jest.fn((argv: Record<string, unknown>) => {\n argv.authToken = TEST_AUTH_TOKEN;\n return argv;\n }),\n}));\n\n// Mock inquirer prompts to return predictable values for tests\njest.mock(\"@inquirer/prompts\", () => {\n class MockSeparator {\n type = \"separator\";\n separator: string;\n constructor(separator = \"──────────────\") {\n this.separator = separator;\n }\n static isSeparator(item: unknown): boolean {\n return (\n item != null &&\n typeof item === \"object\" &&\n (item as { type?: unknown }).type === \"separator\"\n );\n }\n }\n return {\n Separator: MockSeparator,\n select: jest.fn().mockImplementation(({ choices }) => {\n if (Array.isArray(choices) && choices.length > 0) {\n // Skip separators (no `value`) and null-sentinel choices, then return\n // the first real choice's value.\n const firstReal =\n choices.find(\n (c) =>\n !MockSeparator.isSeparator(c) &&\n (c as { value?: unknown }).value !== null\n ) ?? choices[0];\n return Promise.resolve((firstReal as { value: unknown }).value);\n }\n return Promise.resolve(\"test-default\");\n }),\n input: jest.fn().mockResolvedValue(\"test-new-project\"),\n };\n});\n\n// Mock other middleware to pass through arguments\njest.mock(\"../../common/middleware/user-configuration.js\", () => ({\n configure: jest.fn((argv: unknown) => argv),\n}));\n\njest.mock(\"../../common/middleware/user-identification.js\", () => ({\n identify: jest.fn((argv: unknown) => argv),\n}));\n\n// Mock validators to pass through\njest.mock(\"../../common/validators/lib.js\", () => ({\n YargsChecker: jest.fn().mockImplementation(() => ({\n check: jest.fn().mockResolvedValue(true),\n })),\n}));\n\n// Mock showHelpOnNoSubcommand helper for commands with subcommands\njest.mock(\"../../common/handler.js\", () => ({\n showHelpOnNoSubcommand: jest.fn((configure) => ({\n builder: (yargs: unknown) => (configure as (y: unknown) => unknown)(yargs),\n handler: jest.fn(),\n })),\n}));\n\n// Mock token functions to prevent file system and HTTP calls\njest.mock(\"../../login/tokens.js\", () => ({\n getAuthToken: jest.fn().mockResolvedValue(TEST_AUTH_TOKEN),\n refreshAccessToken: jest.fn().mockResolvedValue({\n access_token: TEST_AUTH_TOKEN,\n id_token: \"mock-id-token\",\n expires_in: 3600,\n token_type: \"Bearer\",\n scope: \"openid profile email\",\n }),\n}));\n"]}
@@ -228,11 +228,11 @@ describe("List Command Integration Tests", () => {
228
228
  scope.on("request", (req, interceptor, body) => {
229
229
  requestCapture.capture(req, interceptor, body);
230
230
  });
231
- await executeListCommand({
231
+ await expect(executeListCommand({
232
232
  account: TEST_ACCOUNT_NAME,
233
233
  project: TEST_PROJECT_NAME,
234
234
  "api-key": TEST_AUTH_TOKEN,
235
- });
235
+ })).rejects.toThrow("Failed to list deployed APIs");
236
236
  expect(scope.isDone()).toBe(true);
237
237
  expect(mockPrintDiagnostics).toHaveBeenCalled();
238
238
  const capturedRequests = requestCapture.getRequests();
@@ -1 +1 @@
1
- {"version":3,"file":"list.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/list.integration.test.ts"],"names":[],"mappings":"AAIA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,WAAW,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAKzB,KAAK,UAAU,kBAAkB,CAAC,IAOjC;IACC,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAAC;SAC5B,OAAO,CAAC,WAAW,CAAC;SACpB,IAAI,CAAC,KAAK,CAAC;SACX,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,KAAK,CAAC,CAAC;IAGtB,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,CAAC;IAE7B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACpB,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACjC,WAAW,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC3E,CAAC;IAGD,OAAO,MAAM,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAGD,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CACjC,OAAO,CAAC,wBAAwB,CAAC,CAAC,qCAAqC,CACxE,CAAC;AACF,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAChC,OAAO,CAAC,wBAAwB,CAAC,CAAC,oCAAoC,CACvE,CAAC;AACF,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAC/B,OAAO,CAAC,wBAAwB,CAAC,CAAC,mCAAmC,CACtE,CAAC;AACF,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CACtC,OAAO,CAAC,wBAAwB,CAAC,CAAC,yBAAyB,CAC5D,CAAC;AAEF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,cAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,oBAAoB,EAAE,CAAC;QACvB,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAGtC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAGzB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,EAAE,CAAC;QACd,cAAc,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YACzF,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE;oBACJ,EAAE,GAAG,EAAE,2CAA2C,EAAE;oBACpD,EAAE,GAAG,EAAE,wCAAwC,EAAE;iBAClD;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACtD,GAAG,CACF,gBAAgB,iBAAiB,aAAa,iBAAiB,cAAc,CAC9E;iBACA,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAG5B,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;gBAC7C,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAGH,MAAM,kBAAkB,CAAC;gBACvB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,eAAe;aAC3B,CAAC,CAAC;YAGH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAGlC,MAAM,cAAc,GAClB,mFAAmF,CAAC;YACtF,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YAG7D,MAAM,gBAAgB,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CACtC,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YAElC,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACtD,GAAG,CACF,gBAAgB,iBAAiB,aAAa,iBAAiB,cAAc,CAC9E;iBACA,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAE5B,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;gBAC7C,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,MAAM,kBAAkB,CAAC;gBACvB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,eAAe;aAC3B,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAEjD,MAAM,gBAAgB,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CACtC,iCAAiC,CAClC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE;oBACJ;wBACE,WAAW,EAAE,iBAAiB;wBAC9B,IAAI,EAAE,2BAA2B;wBACjC,GAAG,EAAE,6CAA6C;qBACnD;oBACD;wBACE,WAAW,EAAE,iBAAiB;wBAC9B,IAAI,EAAE,2BAA2B;wBACjC,GAAG,EAAE,gDAAgD;qBACtD;iBACF;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACtD,GAAG,CACF,gBAAgB,iBAAiB,aAAa,iBAAiB,cAAc,CAC9E;iBACA,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAE5B,MAAM,kBAAkB,CAAC;gBACvB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,eAAe;gBAC1B,cAAc,EAAE,IAAI;aACrB,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC;gBAC1C;oBACE,cAAc,EAAE,iBAAiB;oBACjC,IAAI,EAAE,2BAA2B;oBACjC,GAAG,EAAE,6CAA6C;iBACnD;gBACD;oBACE,cAAc,EAAE,iBAAiB;oBACjC,IAAI,EAAE,2BAA2B;oBACjC,GAAG,EAAE,gDAAgD;iBACtD;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE;oBACJ;wBACE,WAAW,EAAE,iBAAiB;wBAC9B,IAAI,EAAE,2BAA2B;wBACjC,GAAG,EAAE,6CAA6C;qBACnD;iBACF;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACtD,GAAG,CACF,gBAAgB,iBAAiB,aAAa,iBAAiB,cAAc,CAC9E;iBACA,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAE5B,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAAC;iBAC5B,OAAO,CAAC,WAAW,CAAC;iBACpB,IAAI,CAAC,KAAK,CAAC;iBACX,OAAO,CAAC,KAAK,CAAC;iBACd,WAAW,CAAC,KAAK,CAAC,CAAC;YAEtB,MAAM,aAAa,CAAC,KAAK,CAAC;gBACxB,MAAM;gBACN,WAAW;gBACX,iBAAiB;gBACjB,WAAW;gBACX,iBAAiB;gBACjB,WAAW;gBACX,eAAe;gBACf,IAAI;aACL,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC;gBAC1C;oBACE,cAAc,EAAE,iBAAiB;oBACjC,IAAI,EAAE,2BAA2B;oBACjC,GAAG,EAAE,6CAA6C;iBACnD;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE;oBACJ;wBACE,WAAW,EAAE,iBAAiB;wBAC9B,IAAI,EAAE,2BAA2B;wBACjC,GAAG,EAAE,6CAA6C;qBACnD;iBACF;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACtD,GAAG,CACF,gBAAgB,iBAAiB,aAAa,iBAAiB,cAAc,CAC9E;iBACA,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAE5B,MAAM,kBAAkB,CAAC;gBACvB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,eAAe;gBAC1B,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC,6CAA6C;aAC9C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE;oBACJ;wBACE,WAAW,EAAE,iBAAiB;wBAC9B,IAAI,EAAE,2BAA2B;wBACjC,GAAG,EAAE,6CAA6C;qBACnD;iBACF;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACtD,GAAG,CACF,gBAAgB,iBAAiB,aAAa,iBAAiB,cAAc,CAC9E;iBACA,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAE5B,MAAM,kBAAkB,CAAC;gBACvB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,eAAe;gBAC1B,cAAc,EAAE,IAAI;gBACpB,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC;gBACzC;oBACE,WAAW,EAAE,iBAAiB;oBAC9B,IAAI,EAAE,2BAA2B;oBACjC,GAAG,EAAE,6CAA6C;iBACnD;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,aAAa,GAAG;gBACpB,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,mBAAmB;gBAC5B,UAAU,EAAE,GAAG;aAChB,CAAC;YAEF,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACtD,GAAG,CACF,gBAAgB,iBAAiB,aAAa,iBAAiB,cAAc,CAC9E;iBACA,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAE7B,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;gBAC7C,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,MAAM,kBAAkB,CAAC;gBACvB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,eAAe;aAC3B,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAEhD,MAAM,gBAAgB,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CACtC,iCAAiC,CAClC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;YAC1D,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE;oBACJ;wBACE,WAAW,EAAE,WAAW;wBACxB,cAAc,EAAE,cAAc;wBAC9B,aAAa,EAAE,uCAAuC;qBACvD;oBACD;wBACE,WAAW,EAAE,WAAW;wBACxB,cAAc,EAAE,cAAc;wBAC9B,aAAa,EAAE,uCAAuC;qBACvD;iBACF;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;iBAC3D,GAAG,CAAC,iBAAiB,CAAC;iBACtB,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAE5B,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;gBAC7C,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,MAAM,kBAAkB,CAAC;gBACvB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,eAAe;gBAC1B,sBAAsB,EAAE,kBAAkB;aAC3C,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,cAAc,GAClB,8EAA8E,CAAC;YACjF,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YAE7D,MAAM,gBAAgB,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CACtC,uCAAuC,CACxC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,wBAAwB,EAAE,CAAC,EAAE,CAAC;YAEnE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;iBAC9B,GAAG,CACF,gBAAgB,iBAAiB,aAAa,iBAAiB,cAAc,CAC9E;iBACA,WAAW,CAAC,eAAe,EAAE,UAAU,eAAe,EAAE,CAAC;iBACzD,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAE5B,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;gBAC7C,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,MAAM,kBAAkB,CAAC;gBACvB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,eAAe;aAC3B,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;YAEvE,MAAM,gBAAgB,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CACtC,qCAAqC,CACtC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Integration tests for the list command\n */\n/// <reference types=\"jest\" />\nimport nock from \"nock\";\nimport yargs from \"yargs/yargs\";\nimport listCommand from \"../../cmds/list.js\";\nimport {\n cleanupTest,\n RequestCapture,\n setupAuthenticatedNock,\n setupTestEnvironment,\n TEST_ACCOUNT_NAME,\n TEST_API_BASE,\n TEST_AUTH_TOKEN,\n TEST_PROJECT_NAME,\n} from \"./test-utils.js\";\n\n/**\n * Execute list command with given arguments using actual yargs command\n */\nasync function executeListCommand(args: {\n account?: string;\n project?: string;\n \"api-key\"?: string;\n \"show-details\"?: boolean;\n output?: \"default\" | \"json\";\n \"self-hosted-endpoint\"?: string;\n}) {\n const yargsInstance = yargs([])\n .command(listCommand)\n .help(false)\n .version(false)\n .exitProcess(false);\n\n // Build command line arguments\n const commandArgs = [\"list\"];\n\n if (args.account) {\n commandArgs.push(\"--account\", args.account);\n }\n\n if (args.project) {\n commandArgs.push(\"--project\", args.project);\n }\n\n if (args[\"api-key\"]) {\n commandArgs.push(\"--api-key\", args[\"api-key\"]);\n }\n\n if (args[\"show-details\"]) {\n commandArgs.push(\"--show-details\");\n }\n\n if (args.output) {\n commandArgs.push(\"--output\", args.output);\n }\n\n if (args[\"self-hosted-endpoint\"]) {\n commandArgs.push(\"--self-hosted-endpoint\", args[\"self-hosted-endpoint\"]);\n }\n\n // Parse and execute the command\n return await yargsInstance.parse(commandArgs);\n}\n\n// Get the mocked functions\nconst mockPrintResult = jest.mocked(\n require(\"../../common/output.js\").printResultToConsoleAndExitGracefully\n);\nconst mockPrintTable = jest.mocked(\n require(\"../../common/output.js\").printTableToConsoleAndExitGracefully\n);\nconst mockPrintJson = jest.mocked(\n require(\"../../common/output.js\").printJsonToConsoleAndExitGracefully\n);\nconst mockPrintDiagnostics = jest.mocked(\n require(\"../../common/output.js\").printDiagnosticsToConsole\n);\n\ndescribe(\"List Command Integration Tests\", () => {\n let requestCapture: RequestCapture;\n\n beforeEach(() => {\n setupTestEnvironment();\n requestCapture = new RequestCapture();\n\n // Disable real HTTP requests\n nock.disableNetConnect();\n\n // Clear mock calls from previous tests\n jest.clearAllMocks();\n });\n\n afterEach(() => {\n cleanupTest();\n requestCapture.clear();\n });\n\n describe(\"SaaS version\", () => {\n it(\"should intercept GET request to list deployments with account and project\", async () => {\n const mockResponse = {\n data: [\n { url: \"https://test-project-production.zuplo.app\" },\n { url: \"https://test-project-staging.zuplo.app\" },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n // Capture requests for snapshot testing\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n // Execute the list command through yargs\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n });\n\n // Verify the request was made\n expect(scope.isDone()).toBe(true);\n\n // Verify the output function was called with the URLs\n const expectedOutput =\n \"https://test-project-production.zuplo.app\\nhttps://test-project-staging.zuplo.app\";\n expect(mockPrintResult).toHaveBeenCalledWith(expectedOutput);\n\n // Snapshot test for captured requests\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-saas-requests\"\n );\n });\n\n it(\"should handle empty deployments list\", async () => {\n const mockResponse = { data: [] };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintResult).toHaveBeenCalledWith(\"\");\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-empty-requests\"\n );\n });\n\n it(\"should output deployment details as a table when requested\", async () => {\n const mockResponse = {\n data: [\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-47839f2\",\n url: \"https://test-project-main-47839f2.d2.zuplo.dev\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"show-details\": true,\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintTable).toHaveBeenCalledWith([\n {\n \"project-name\": TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n {\n \"project-name\": TEST_PROJECT_NAME,\n name: \"test-project-main-47839f2\",\n url: \"https://test-project-main-47839f2.d2.zuplo.dev\",\n },\n ]);\n });\n\n it(\"should support the -d alias for details output\", async () => {\n const mockResponse = {\n data: [\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n const yargsInstance = yargs([])\n .command(listCommand)\n .help(false)\n .version(false)\n .exitProcess(false);\n\n await yargsInstance.parse([\n \"list\",\n \"--account\",\n TEST_ACCOUNT_NAME,\n \"--project\",\n TEST_PROJECT_NAME,\n \"--api-key\",\n TEST_AUTH_TOKEN,\n \"-d\",\n ]);\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintTable).toHaveBeenCalledWith([\n {\n \"project-name\": TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ]);\n });\n\n it(\"should output JSON when requested\", async () => {\n const mockResponse = {\n data: [\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n output: \"json\",\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintJson).toHaveBeenCalledWith([\n \"https://test-project-main-3c1ac0c.zuplo.app\",\n ]);\n });\n\n it(\"should output detailed JSON when requested\", async () => {\n const mockResponse = {\n data: [\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"show-details\": true,\n output: \"json\",\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintJson).toHaveBeenCalledWith([\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ]);\n });\n\n it(\"should handle API error responses\", async () => {\n const errorResponse = {\n error: \"Not Found\",\n message: \"Project not found\",\n statusCode: 404,\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(404, errorResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintDiagnostics).toHaveBeenCalled();\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-error-requests\"\n );\n });\n });\n\n describe(\"Self-hosted version\", () => {\n it(\"should intercept GET request to self-hosted endpoint\", async () => {\n const selfHostedEndpoint = \"https://my-zuplo.company.com\";\n const mockResponse = {\n data: [\n {\n projectName: \"project-1\",\n deploymentName: \"deployment-1\",\n deploymentUrl: \"https://my-zuplo.company.com/project1\",\n },\n {\n projectName: \"project-2\",\n deploymentName: \"deployment-2\",\n deploymentUrl: \"https://my-zuplo.company.com/project2\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .get(\"/v1/deployments\")\n .reply(200, mockResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"self-hosted-endpoint\": selfHostedEndpoint,\n });\n\n expect(scope.isDone()).toBe(true);\n const expectedOutput =\n \"https://my-zuplo.company.com/project1\\nhttps://my-zuplo.company.com/project2\";\n expect(mockPrintResult).toHaveBeenCalledWith(expectedOutput);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-self-hosted-requests\"\n );\n });\n });\n\n describe(\"Request headers validation\", () => {\n it(\"should include correct authorization headers\", async () => {\n const mockResponse = { data: [{ url: \"https://test.zuplo.app\" }] };\n\n const scope = nock(TEST_API_BASE)\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .matchHeader(\"authorization\", `Bearer ${TEST_AUTH_TOKEN}`)\n .reply(200, mockResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintResult).toHaveBeenCalledWith(\"https://test.zuplo.app\");\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-headers-validation\"\n );\n });\n });\n});\n"]}
1
+ {"version":3,"file":"list.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/list.integration.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Integration tests for the list command\n */\n/// <reference types=\"jest\" />\nimport nock from \"nock\";\nimport yargs from \"yargs/yargs\";\nimport listCommand from \"../../cmds/list.js\";\nimport {\n cleanupTest,\n RequestCapture,\n setupAuthenticatedNock,\n setupTestEnvironment,\n TEST_ACCOUNT_NAME,\n TEST_API_BASE,\n TEST_AUTH_TOKEN,\n TEST_PROJECT_NAME,\n} from \"./test-utils.js\";\n\n/**\n * Execute list command with given arguments using actual yargs command\n */\nasync function executeListCommand(args: {\n account?: string;\n project?: string;\n \"api-key\"?: string;\n \"show-details\"?: boolean;\n output?: \"default\" | \"json\";\n \"self-hosted-endpoint\"?: string;\n}) {\n const yargsInstance = yargs([])\n .command(listCommand)\n .help(false)\n .version(false)\n .exitProcess(false);\n\n // Build command line arguments\n const commandArgs = [\"list\"];\n\n if (args.account) {\n commandArgs.push(\"--account\", args.account);\n }\n\n if (args.project) {\n commandArgs.push(\"--project\", args.project);\n }\n\n if (args[\"api-key\"]) {\n commandArgs.push(\"--api-key\", args[\"api-key\"]);\n }\n\n if (args[\"show-details\"]) {\n commandArgs.push(\"--show-details\");\n }\n\n if (args.output) {\n commandArgs.push(\"--output\", args.output);\n }\n\n if (args[\"self-hosted-endpoint\"]) {\n commandArgs.push(\"--self-hosted-endpoint\", args[\"self-hosted-endpoint\"]);\n }\n\n // Parse and execute the command\n return await yargsInstance.parse(commandArgs);\n}\n\n// Get the mocked functions\nconst mockPrintResult = jest.mocked(\n require(\"../../common/output.js\").printResultToConsoleAndExitGracefully\n);\nconst mockPrintTable = jest.mocked(\n require(\"../../common/output.js\").printTableToConsoleAndExitGracefully\n);\nconst mockPrintJson = jest.mocked(\n require(\"../../common/output.js\").printJsonToConsoleAndExitGracefully\n);\nconst mockPrintDiagnostics = jest.mocked(\n require(\"../../common/output.js\").printDiagnosticsToConsole\n);\n\ndescribe(\"List Command Integration Tests\", () => {\n let requestCapture: RequestCapture;\n\n beforeEach(() => {\n setupTestEnvironment();\n requestCapture = new RequestCapture();\n\n // Disable real HTTP requests\n nock.disableNetConnect();\n\n // Clear mock calls from previous tests\n jest.clearAllMocks();\n });\n\n afterEach(() => {\n cleanupTest();\n requestCapture.clear();\n });\n\n describe(\"SaaS version\", () => {\n it(\"should intercept GET request to list deployments with account and project\", async () => {\n const mockResponse = {\n data: [\n { url: \"https://test-project-production.zuplo.app\" },\n { url: \"https://test-project-staging.zuplo.app\" },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n // Capture requests for snapshot testing\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n // Execute the list command through yargs\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n });\n\n // Verify the request was made\n expect(scope.isDone()).toBe(true);\n\n // Verify the output function was called with the URLs\n const expectedOutput =\n \"https://test-project-production.zuplo.app\\nhttps://test-project-staging.zuplo.app\";\n expect(mockPrintResult).toHaveBeenCalledWith(expectedOutput);\n\n // Snapshot test for captured requests\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-saas-requests\"\n );\n });\n\n it(\"should handle empty deployments list\", async () => {\n const mockResponse = { data: [] };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintResult).toHaveBeenCalledWith(\"\");\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-empty-requests\"\n );\n });\n\n it(\"should output deployment details as a table when requested\", async () => {\n const mockResponse = {\n data: [\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-47839f2\",\n url: \"https://test-project-main-47839f2.d2.zuplo.dev\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"show-details\": true,\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintTable).toHaveBeenCalledWith([\n {\n \"project-name\": TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n {\n \"project-name\": TEST_PROJECT_NAME,\n name: \"test-project-main-47839f2\",\n url: \"https://test-project-main-47839f2.d2.zuplo.dev\",\n },\n ]);\n });\n\n it(\"should support the -d alias for details output\", async () => {\n const mockResponse = {\n data: [\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n const yargsInstance = yargs([])\n .command(listCommand)\n .help(false)\n .version(false)\n .exitProcess(false);\n\n await yargsInstance.parse([\n \"list\",\n \"--account\",\n TEST_ACCOUNT_NAME,\n \"--project\",\n TEST_PROJECT_NAME,\n \"--api-key\",\n TEST_AUTH_TOKEN,\n \"-d\",\n ]);\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintTable).toHaveBeenCalledWith([\n {\n \"project-name\": TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ]);\n });\n\n it(\"should output JSON when requested\", async () => {\n const mockResponse = {\n data: [\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n output: \"json\",\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintJson).toHaveBeenCalledWith([\n \"https://test-project-main-3c1ac0c.zuplo.app\",\n ]);\n });\n\n it(\"should output detailed JSON when requested\", async () => {\n const mockResponse = {\n data: [\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(200, mockResponse);\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"show-details\": true,\n output: \"json\",\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintJson).toHaveBeenCalledWith([\n {\n projectName: TEST_PROJECT_NAME,\n name: \"test-project-main-3c1ac0c\",\n url: \"https://test-project-main-3c1ac0c.zuplo.app\",\n },\n ]);\n });\n\n it(\"should handle API error responses\", async () => {\n const errorResponse = {\n error: \"Not Found\",\n message: \"Project not found\",\n statusCode: 404,\n };\n\n const scope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .reply(404, errorResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await expect(\n executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n })\n ).rejects.toThrow(\"Failed to list deployed APIs\");\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintDiagnostics).toHaveBeenCalled();\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-error-requests\"\n );\n });\n });\n\n describe(\"Self-hosted version\", () => {\n it(\"should intercept GET request to self-hosted endpoint\", async () => {\n const selfHostedEndpoint = \"https://my-zuplo.company.com\";\n const mockResponse = {\n data: [\n {\n projectName: \"project-1\",\n deploymentName: \"deployment-1\",\n deploymentUrl: \"https://my-zuplo.company.com/project1\",\n },\n {\n projectName: \"project-2\",\n deploymentName: \"deployment-2\",\n deploymentUrl: \"https://my-zuplo.company.com/project2\",\n },\n ],\n };\n\n const scope = setupAuthenticatedNock(nock(selfHostedEndpoint))\n .get(\"/v1/deployments\")\n .reply(200, mockResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n \"self-hosted-endpoint\": selfHostedEndpoint,\n });\n\n expect(scope.isDone()).toBe(true);\n const expectedOutput =\n \"https://my-zuplo.company.com/project1\\nhttps://my-zuplo.company.com/project2\";\n expect(mockPrintResult).toHaveBeenCalledWith(expectedOutput);\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-self-hosted-requests\"\n );\n });\n });\n\n describe(\"Request headers validation\", () => {\n it(\"should include correct authorization headers\", async () => {\n const mockResponse = { data: [{ url: \"https://test.zuplo.app\" }] };\n\n const scope = nock(TEST_API_BASE)\n .get(\n `/v1/accounts/${TEST_ACCOUNT_NAME}/projects/${TEST_PROJECT_NAME}/deployments`\n )\n .matchHeader(\"authorization\", `Bearer ${TEST_AUTH_TOKEN}`)\n .reply(200, mockResponse);\n\n scope.on(\"request\", (req, interceptor, body) => {\n requestCapture.capture(req, interceptor, body);\n });\n\n await executeListCommand({\n account: TEST_ACCOUNT_NAME,\n project: TEST_PROJECT_NAME,\n \"api-key\": TEST_AUTH_TOKEN,\n });\n\n expect(scope.isDone()).toBe(true);\n expect(mockPrintResult).toHaveBeenCalledWith(\"https://test.zuplo.app\");\n\n const capturedRequests = requestCapture.getRequests();\n expect(capturedRequests).toMatchSnapshot(\n \"list-deployments-headers-validation\"\n );\n });\n });\n});\n"]}
@@ -102,11 +102,11 @@ describe("Tunnel Command Integration Tests", () => {
102
102
  scope.on("request", (req, interceptor, body) => {
103
103
  requestCapture.capture(req, interceptor, body);
104
104
  });
105
- await executeTunnelCommand("create", {
105
+ await expect(executeTunnelCommand("create", {
106
106
  account: TEST_ACCOUNT_NAME,
107
107
  "api-key": TEST_AUTH_TOKEN,
108
108
  "tunnel-name": testTunnelName,
109
- });
109
+ })).rejects.toThrow("Failed to create tunnel for account");
110
110
  expect(scope.isDone()).toBe(true);
111
111
  expect(mockPrintDiagnostics).toHaveBeenCalled();
112
112
  const capturedRequests = requestCapture.getRequests();
@@ -169,10 +169,10 @@ describe("Tunnel Command Integration Tests", () => {
169
169
  scope.on("request", (req, interceptor, body) => {
170
170
  requestCapture.capture(req, interceptor, body);
171
171
  });
172
- await executeTunnelCommand("list", {
172
+ await expect(executeTunnelCommand("list", {
173
173
  account: TEST_ACCOUNT_NAME,
174
174
  "api-key": TEST_AUTH_TOKEN,
175
- });
175
+ })).rejects.toThrow("Failed to list tunnels for account");
176
176
  expect(scope.isDone()).toBe(true);
177
177
  expect(mockPrintDiagnostics).toHaveBeenCalled();
178
178
  const capturedRequests = requestCapture.getRequests();
@@ -227,11 +227,11 @@ describe("Tunnel Command Integration Tests", () => {
227
227
  scope.on("request", (req, interceptor, body) => {
228
228
  requestCapture.capture(req, interceptor, body);
229
229
  });
230
- await executeTunnelCommand("delete", {
230
+ await expect(executeTunnelCommand("delete", {
231
231
  account: TEST_ACCOUNT_NAME,
232
232
  "api-key": TEST_AUTH_TOKEN,
233
233
  "tunnel-id": tunnelId,
234
- });
234
+ })).rejects.toThrow("Failed to delete tunnel for account");
235
235
  expect(scope.isDone()).toBe(true);
236
236
  expect(mockPrintDiagnostics).toHaveBeenCalled();
237
237
  const capturedRequests = requestCapture.getRequests();
@@ -276,11 +276,11 @@ describe("Tunnel Command Integration Tests", () => {
276
276
  scope.on("request", (req, interceptor, body) => {
277
277
  requestCapture.capture(req, interceptor, body);
278
278
  });
279
- await executeTunnelCommand("describe", {
279
+ await expect(executeTunnelCommand("describe", {
280
280
  account: TEST_ACCOUNT_NAME,
281
281
  "api-key": TEST_AUTH_TOKEN,
282
282
  "tunnel-id": tunnelId,
283
- });
283
+ })).rejects.toThrow("Failed to describe tunnel for account");
284
284
  expect(scope.isDone()).toBe(true);
285
285
  expect(mockPrintDiagnostics).toHaveBeenCalled();
286
286
  const capturedRequests = requestCapture.getRequests();
@@ -324,11 +324,11 @@ describe("Tunnel Command Integration Tests", () => {
324
324
  scope.on("request", (req, interceptor, body) => {
325
325
  requestCapture.capture(req, interceptor, body);
326
326
  });
327
- await executeTunnelCommand("rotate-token", {
327
+ await expect(executeTunnelCommand("rotate-token", {
328
328
  account: TEST_ACCOUNT_NAME,
329
329
  "api-key": TEST_AUTH_TOKEN,
330
330
  "tunnel-id": tunnelId,
331
- });
331
+ })).rejects.toThrow("Failed to rotate token for tunnel");
332
332
  expect(scope.isDone()).toBe(true);
333
333
  expect(mockPrintDiagnostics).toHaveBeenCalled();
334
334
  const capturedRequests = requestCapture.getRequests();
@@ -374,11 +374,11 @@ describe("Tunnel Command Integration Tests", () => {
374
374
  scope.on("request", (req, interceptor, body) => {
375
375
  requestCapture.capture(req, interceptor, body);
376
376
  });
377
- await executeTunnelServicesCommand("describe", {
377
+ await expect(executeTunnelServicesCommand("describe", {
378
378
  account: TEST_ACCOUNT_NAME,
379
379
  "api-key": TEST_AUTH_TOKEN,
380
380
  "tunnel-id": tunnelId,
381
- });
381
+ })).rejects.toThrow("Failed to describe services for tunnel");
382
382
  expect(scope.isDone()).toBe(true);
383
383
  expect(mockPrintDiagnostics).toHaveBeenCalled();
384
384
  const capturedRequests = requestCapture.getRequests();
@@ -414,12 +414,12 @@ describe("Tunnel Command Integration Tests", () => {
414
414
  scope.on("request", (req, interceptor, body) => {
415
415
  requestCapture.capture(req, interceptor, body);
416
416
  });
417
- await executeTunnelServicesCommand("update", {
417
+ await expect(executeTunnelServicesCommand("update", {
418
418
  account: TEST_ACCOUNT_NAME,
419
419
  "api-key": TEST_AUTH_TOKEN,
420
420
  "tunnel-id": tunnelId,
421
421
  "configuration-file": tempConfigFile,
422
- });
422
+ })).rejects.toThrow("Failed to update tunnel for account");
423
423
  expect(scope.isDone()).toBe(true);
424
424
  expect(mockPrintDiagnostics).toHaveBeenCalled();
425
425
  const capturedRequests = requestCapture.getRequests();