@aifabrix/builder 2.43.0 → 2.44.1

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 (371) hide show
  1. package/.cursor/rules/anchor-docs.mdc +15 -0
  2. package/.cursor/rules/cli-layout.mdc +75 -0
  3. package/.cursor/rules/project-rules.mdc +8 -0
  4. package/.npmrc.token +1 -0
  5. package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  6. package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  7. package/.nyc_output/processinfo/index.json +1 -0
  8. package/README.md +1 -1
  9. package/anchor-docs/README.md +10 -0
  10. package/anchor-docs/_TEMPLATE +24 -0
  11. package/bin/aifabrix.js +13 -4
  12. package/integration/hubspot-test/README.md +31 -0
  13. package/integration/hubspot-test/create-hubspot.js +5 -5
  14. package/integration/hubspot-test/hubspot-test-datasource-company.json +58 -462
  15. package/integration/hubspot-test/hubspot-test-datasource-contact.json +61 -555
  16. package/integration/hubspot-test/hubspot-test-datasource-deal.json +63 -506
  17. package/integration/hubspot-test/hubspot-test-datasource-users.json +42 -83
  18. package/integration/hubspot-test/hubspot-test-deploy.json +3 -3
  19. package/integration/hubspot-test/test-dataplane-down-tests.js +1 -7
  20. package/integration/hubspot-test/test-dataplane-down.js +3 -3
  21. package/integration/hubspot-test/test.js +35 -43
  22. package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
  23. package/integration/roundtrip-test-local/README.md +144 -0
  24. package/integration/roundtrip-test-local/application.yaml +13 -0
  25. package/integration/roundtrip-test-local/env.template +15 -0
  26. package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
  27. package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
  28. package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
  29. package/integration/roundtrip-test-local2/README.md +144 -0
  30. package/integration/roundtrip-test-local2/application.yaml +13 -0
  31. package/integration/roundtrip-test-local2/env.template +15 -0
  32. package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
  33. package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
  34. package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
  35. package/integration/test/wizard.yaml +8 -0
  36. package/jest.config.default.js +10 -0
  37. package/jest.config.integration.fixtures.js +22 -0
  38. package/jest.config.integration.js +21 -18
  39. package/jest.config.isolated.js +10 -0
  40. package/jest.projects.js +301 -0
  41. package/lib/api/certificates.api.js +62 -0
  42. package/lib/api/datasources-core.api.js +3 -3
  43. package/lib/api/dev-mtls-request.js +110 -0
  44. package/lib/api/dev-server-https.js +145 -0
  45. package/lib/api/dev.api.js +133 -144
  46. package/lib/api/index.js +11 -3
  47. package/lib/api/pipeline.api.js +67 -20
  48. package/lib/api/types/certificates.types.js +48 -0
  49. package/lib/api/types/dev.types.js +4 -3
  50. package/lib/api/types/pipeline.types.js +8 -5
  51. package/lib/api/types/validation-run.types.js +56 -0
  52. package/lib/api/validation-run.api.js +111 -0
  53. package/lib/api/validation-runner.js +109 -0
  54. package/lib/app/certification-show-enrich.js +129 -0
  55. package/lib/app/certification-verify-rows.js +60 -0
  56. package/lib/app/config.js +1 -1
  57. package/lib/app/deploy-status-display.js +2 -2
  58. package/lib/app/deploy.js +7 -6
  59. package/lib/app/display.js +2 -1
  60. package/lib/app/dockerfile.js +3 -2
  61. package/lib/app/down.js +2 -1
  62. package/lib/app/helpers.js +6 -5
  63. package/lib/app/index.js +27 -8
  64. package/lib/app/list.js +7 -6
  65. package/lib/app/push.js +4 -3
  66. package/lib/app/register.js +16 -7
  67. package/lib/app/rotate-secret.js +14 -13
  68. package/lib/app/run-container-start.js +184 -0
  69. package/lib/app/run-docker-fallback.js +108 -0
  70. package/lib/app/run-env-compose.js +30 -42
  71. package/lib/app/run-helpers.js +49 -126
  72. package/lib/app/run-infra-requirements.js +30 -0
  73. package/lib/app/run-resolve-image.js +21 -0
  74. package/lib/app/run.js +74 -21
  75. package/lib/app/show-display.js +44 -1
  76. package/lib/app/show.js +93 -9
  77. package/lib/build/index.js +13 -10
  78. package/lib/certification/cli-cert-sync-skip.js +21 -0
  79. package/lib/certification/merge-certification-from-artifact.js +185 -0
  80. package/lib/certification/post-unified-cert-sync.js +33 -0
  81. package/lib/certification/sync-after-external-command.js +52 -0
  82. package/lib/certification/sync-system-certification.js +197 -0
  83. package/lib/cli/index.js +2 -0
  84. package/lib/cli/setup-app.help.js +67 -0
  85. package/lib/cli/setup-app.js +61 -121
  86. package/lib/cli/setup-app.test-commands.js +195 -0
  87. package/lib/cli/setup-auth.js +19 -5
  88. package/lib/cli/setup-credential-deployment.js +22 -8
  89. package/lib/cli/setup-dev-path-commands.js +124 -0
  90. package/lib/cli/setup-dev.js +170 -113
  91. package/lib/cli/setup-environment.js +7 -1
  92. package/lib/cli/setup-external-system.js +84 -23
  93. package/lib/cli/setup-infra.js +126 -47
  94. package/lib/cli/setup-parameters.js +32 -0
  95. package/lib/cli/setup-secrets.js +137 -18
  96. package/lib/cli/setup-service-user.js +1 -1
  97. package/lib/cli/setup-utility.js +54 -22
  98. package/lib/commands/app-down.js +5 -7
  99. package/lib/commands/app-install.js +14 -7
  100. package/lib/commands/app-logs.js +13 -10
  101. package/lib/commands/app-shell.js +4 -1
  102. package/lib/commands/app-test.js +25 -19
  103. package/lib/commands/app.js +32 -11
  104. package/lib/commands/auth-config.js +6 -6
  105. package/lib/commands/auth-status.js +4 -3
  106. package/lib/commands/credential-env.js +4 -3
  107. package/lib/commands/credential-list.js +5 -4
  108. package/lib/commands/credential-push.js +4 -3
  109. package/lib/commands/datasource-unified-test-cli.js +428 -0
  110. package/lib/commands/datasource-unified-test-cli.options.js +191 -0
  111. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +106 -0
  112. package/lib/commands/datasource-validation-cli.js +143 -0
  113. package/lib/commands/datasource.js +125 -95
  114. package/lib/commands/deployment-list.js +6 -5
  115. package/lib/commands/dev-cli-handlers.js +122 -18
  116. package/lib/commands/dev-down.js +4 -3
  117. package/lib/commands/dev-init.js +231 -116
  118. package/lib/commands/dev-show-display.js +473 -0
  119. package/lib/commands/login-credentials.js +3 -2
  120. package/lib/commands/login-device.js +4 -3
  121. package/lib/commands/login.js +5 -4
  122. package/lib/commands/logout.js +8 -7
  123. package/lib/commands/parameters-validate.js +54 -0
  124. package/lib/commands/repair-datasource.js +314 -68
  125. package/lib/commands/repair-env-template.js +2 -2
  126. package/lib/commands/repair.js +21 -3
  127. package/lib/commands/secrets-list.js +23 -12
  128. package/lib/commands/secrets-remove-all.js +220 -0
  129. package/lib/commands/secrets-remove.js +21 -12
  130. package/lib/commands/secrets-set.js +21 -12
  131. package/lib/commands/secrets-validate.js +4 -4
  132. package/lib/commands/secure.js +10 -9
  133. package/lib/commands/service-user.js +26 -25
  134. package/lib/commands/test-e2e-external.js +27 -1
  135. package/lib/commands/up-common.js +3 -2
  136. package/lib/commands/up-dataplane.js +29 -16
  137. package/lib/commands/up-miso.js +19 -29
  138. package/lib/commands/upload.js +149 -39
  139. package/lib/commands/wizard-core-helpers.js +1 -1
  140. package/lib/commands/wizard-dataplane.js +4 -3
  141. package/lib/commands/wizard-helpers.js +3 -3
  142. package/lib/commands/wizard.js +2 -2
  143. package/lib/core/admin-secrets.js +14 -5
  144. package/lib/core/audit-logger.js +12 -4
  145. package/lib/core/config-attach-extensions.js +46 -0
  146. package/lib/core/config-runtime-paths.js +29 -0
  147. package/lib/core/config.js +55 -56
  148. package/lib/core/diff.js +3 -2
  149. package/lib/core/ensure-encryption-key.js +1 -1
  150. package/lib/core/secrets-ensure-infra.js +77 -0
  151. package/lib/core/secrets-ensure.js +120 -64
  152. package/lib/core/secrets-env-write.js +35 -7
  153. package/lib/core/secrets-infra-placeholder-sync.js +61 -0
  154. package/lib/core/secrets.js +200 -37
  155. package/lib/core/templates-env.js +4 -3
  156. package/lib/datasource/abac-validator.js +1 -10
  157. package/lib/datasource/deploy.js +75 -53
  158. package/lib/datasource/field-reference-validator.js +9 -6
  159. package/lib/datasource/integration-context.js +63 -0
  160. package/lib/datasource/list.js +8 -7
  161. package/lib/datasource/log-viewer.js +189 -67
  162. package/lib/datasource/resolve-app.js +4 -4
  163. package/lib/datasource/test-e2e.js +113 -146
  164. package/lib/datasource/test-integration.js +114 -122
  165. package/lib/datasource/unified-validation-run-body.js +68 -0
  166. package/lib/datasource/unified-validation-run-post.js +23 -0
  167. package/lib/datasource/unified-validation-run-resolve.js +43 -0
  168. package/lib/datasource/unified-validation-run.js +93 -0
  169. package/lib/datasource/validate.js +157 -13
  170. package/lib/deployment/deployer.js +4 -3
  171. package/lib/deployment/environment.js +7 -6
  172. package/lib/deployment/push.js +17 -8
  173. package/lib/external-system/delete.js +4 -3
  174. package/lib/external-system/deploy.js +166 -53
  175. package/lib/external-system/download-helpers.js +1 -1
  176. package/lib/external-system/download.js +7 -6
  177. package/lib/external-system/generator.js +92 -6
  178. package/lib/external-system/integration-test-dispatch.js +26 -0
  179. package/lib/external-system/test-execution.js +5 -1
  180. package/lib/external-system/test-helpers.js +0 -4
  181. package/lib/external-system/test-system-level-helpers.js +110 -0
  182. package/lib/external-system/test-system-level.js +83 -44
  183. package/lib/external-system/test.js +59 -8
  184. package/lib/generator/builders.js +23 -11
  185. package/lib/generator/deploy-manifest-azure-kv.js +81 -0
  186. package/lib/generator/external.js +16 -4
  187. package/lib/generator/helpers.js +58 -3
  188. package/lib/generator/index.js +4 -0
  189. package/lib/generator/split-readme.js +12 -7
  190. package/lib/generator/split-variables.js +2 -1
  191. package/lib/generator/split.js +1 -1
  192. package/lib/generator/wizard-readme.js +3 -3
  193. package/lib/generator/wizard.js +8 -8
  194. package/lib/infrastructure/compose.js +70 -7
  195. package/lib/infrastructure/helpers-docker-check.js +67 -0
  196. package/lib/infrastructure/helpers.js +203 -42
  197. package/lib/infrastructure/index.js +31 -18
  198. package/lib/infrastructure/services.js +21 -67
  199. package/lib/internal/fs-real-sync.js +104 -0
  200. package/lib/internal/node-fs.js +98 -0
  201. package/lib/parameters/database-secret-values.js +173 -0
  202. package/lib/parameters/infra-kv-discovery.js +121 -0
  203. package/lib/parameters/infra-parameter-catalog.js +458 -0
  204. package/lib/parameters/infra-parameter-validate.js +64 -0
  205. package/lib/schema/application-schema.json +37 -17
  206. package/lib/schema/datasource-test-run.schema.json +493 -0
  207. package/lib/schema/deployment-rules.yaml +102 -63
  208. package/lib/schema/external-datasource.schema.json +1200 -442
  209. package/lib/schema/external-system.schema.json +203 -5
  210. package/lib/schema/flag-map-validation-run.json +31 -0
  211. package/lib/schema/infra-parameter.schema.json +106 -0
  212. package/lib/schema/infra.parameter.yaml +421 -0
  213. package/lib/schema/type/credential-auth-templates.json +40 -0
  214. package/lib/schema/type/document-storage.json +226 -0
  215. package/lib/schema/type/message-service.json +123 -0
  216. package/lib/schema/type/vector-store.json +88 -0
  217. package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
  218. package/lib/utils/api-error-handler.js +2 -2
  219. package/lib/utils/api.js +77 -17
  220. package/lib/utils/app-register-api.js +3 -2
  221. package/lib/utils/app-register-auth.js +1 -1
  222. package/lib/utils/app-register-config.js +4 -4
  223. package/lib/utils/app-register-display.js +3 -2
  224. package/lib/utils/app-register-validator.js +3 -2
  225. package/lib/utils/app-run-containers.js +26 -22
  226. package/lib/utils/app-scoped-config.js +31 -0
  227. package/lib/utils/app-service-env-from-builder.js +164 -0
  228. package/lib/utils/build-copy.js +1 -1
  229. package/lib/utils/build-helpers.js +20 -20
  230. package/lib/utils/build-resolve-image.js +165 -0
  231. package/lib/utils/cli-layout-chalk.js +8 -0
  232. package/lib/utils/cli-test-layout-chalk.js +267 -0
  233. package/lib/utils/cli-utils.js +88 -11
  234. package/lib/utils/compose-db-passwords.js +138 -0
  235. package/lib/utils/compose-generate-docker-compose.js +216 -0
  236. package/lib/utils/compose-generator.js +197 -291
  237. package/lib/utils/compose-miso-env.js +18 -0
  238. package/lib/utils/compose-traefik-ingress-base.js +158 -0
  239. package/lib/utils/config-paths.js +166 -7
  240. package/lib/utils/config-scoped-resources-preference.js +41 -0
  241. package/lib/utils/configuration-env-resolver.js +11 -8
  242. package/lib/utils/controller-deployment-outcome.js +68 -0
  243. package/lib/utils/credential-display.js +2 -2
  244. package/lib/utils/credential-secrets-env.js +5 -5
  245. package/lib/utils/dataplane-pipeline-warning.js +4 -3
  246. package/lib/utils/datasource-test-run-capability-scope.js +43 -0
  247. package/lib/utils/datasource-test-run-certificate-tty.js +82 -0
  248. package/lib/utils/datasource-test-run-debug-display.js +137 -0
  249. package/lib/utils/datasource-test-run-debug-slice.js +93 -0
  250. package/lib/utils/datasource-test-run-display.js +459 -0
  251. package/lib/utils/datasource-test-run-exit.js +83 -0
  252. package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
  253. package/lib/utils/datasource-test-run-report-version.js +51 -0
  254. package/lib/utils/datasource-test-run-schema-sync.js +59 -0
  255. package/lib/utils/datasource-test-run-tty-log.js +81 -0
  256. package/lib/utils/datasource-validation-watch.js +266 -0
  257. package/lib/utils/declarative-url-ports.js +47 -0
  258. package/lib/utils/derive-env-key-from-client-id.js +41 -0
  259. package/lib/utils/dev-ca-install.js +185 -23
  260. package/lib/utils/dev-cert-helper.js +266 -17
  261. package/lib/utils/dev-hosts-helper.js +307 -0
  262. package/lib/utils/dev-init-cert-hints.js +37 -0
  263. package/lib/utils/dev-init-health-messages.js +52 -0
  264. package/lib/utils/dev-init-resolve.js +86 -0
  265. package/lib/utils/dev-init-ssh-merge.js +65 -0
  266. package/lib/utils/dev-ssh-config-helper.js +196 -0
  267. package/lib/utils/dev-user-groups.js +93 -0
  268. package/lib/utils/docker-build.js +42 -17
  269. package/lib/utils/docker-exec.js +28 -0
  270. package/lib/utils/docker-manifest-public-port.js +116 -0
  271. package/lib/utils/docker-not-running-hint.js +52 -0
  272. package/lib/utils/docker.js +98 -11
  273. package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
  274. package/lib/utils/env-config-loader.js +10 -91
  275. package/lib/utils/env-copy.js +19 -10
  276. package/lib/utils/env-map.js +35 -8
  277. package/lib/utils/env-template.js +2 -2
  278. package/lib/utils/environment-scoped-resources.js +144 -0
  279. package/lib/utils/error-formatter.js +92 -13
  280. package/lib/utils/error-formatters/http-status-errors.js +6 -5
  281. package/lib/utils/error-formatters/network-errors.js +2 -1
  282. package/lib/utils/error-formatters/permission-errors.js +2 -1
  283. package/lib/utils/error-formatters/validation-errors.js +2 -1
  284. package/lib/utils/external-readme.js +8 -1
  285. package/lib/utils/external-system-display.js +242 -136
  286. package/lib/utils/external-system-local-test-tty.js +389 -0
  287. package/lib/utils/external-system-readiness-core.js +377 -0
  288. package/lib/utils/external-system-readiness-deploy-display.js +270 -0
  289. package/lib/utils/external-system-readiness-display-internals.js +150 -0
  290. package/lib/utils/external-system-readiness-display.js +186 -0
  291. package/lib/utils/external-system-system-test-tty-overview.js +120 -0
  292. package/lib/utils/external-system-system-test-tty.js +417 -0
  293. package/lib/utils/external-system-test-helpers.js +24 -6
  294. package/lib/utils/external-system-validators.js +30 -12
  295. package/lib/utils/health-check-url.js +119 -0
  296. package/lib/utils/health-check.js +59 -25
  297. package/lib/utils/help-builder.js +11 -8
  298. package/lib/utils/image-version.js +4 -8
  299. package/lib/utils/infra-containers.js +4 -7
  300. package/lib/utils/infra-env-defaults.js +162 -0
  301. package/lib/utils/infra-status-display.js +167 -0
  302. package/lib/utils/infra-status.js +16 -8
  303. package/lib/utils/local-secrets.js +3 -4
  304. package/lib/utils/paths.js +148 -47
  305. package/lib/utils/port-resolver.js +10 -23
  306. package/lib/utils/redis-env-scope.js +62 -0
  307. package/lib/utils/register-aifabrix-shell-env.js +204 -0
  308. package/lib/utils/remote-builder-validation.js +99 -0
  309. package/lib/utils/remote-dev-auth.js +117 -21
  310. package/lib/utils/remote-docker-env.js +67 -15
  311. package/lib/utils/remote-secrets-loader.js +13 -4
  312. package/lib/utils/resolve-docker-image-ref.js +124 -0
  313. package/lib/utils/schema-loader.js +22 -9
  314. package/lib/utils/secrets-bash-kv.js +25 -0
  315. package/lib/utils/secrets-generator.js +169 -49
  316. package/lib/utils/secrets-helpers.js +70 -59
  317. package/lib/utils/secrets-kv-scope.js +60 -0
  318. package/lib/utils/secrets-utils.js +32 -38
  319. package/lib/utils/secrets-validation.js +3 -1
  320. package/lib/utils/secrets-yaml-preserve.js +109 -0
  321. package/lib/utils/ssh-key-helper.js +4 -2
  322. package/lib/utils/template-helpers.js +2 -2
  323. package/lib/utils/test-log-writer.js +3 -3
  324. package/lib/utils/token-manager.js +1 -2
  325. package/lib/utils/url-declarative-public-base.js +188 -0
  326. package/lib/utils/url-declarative-resolve-build.js +493 -0
  327. package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
  328. package/lib/utils/url-declarative-resolve.js +220 -0
  329. package/lib/utils/url-declarative-token-parse.js +74 -0
  330. package/lib/utils/url-declarative-url-flags.js +50 -0
  331. package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
  332. package/lib/utils/url-public-path-prefix.js +34 -0
  333. package/lib/utils/urls-local-registry.js +220 -0
  334. package/lib/utils/validation-report-tty-kit.js +77 -0
  335. package/lib/utils/validation-run-poll.js +112 -0
  336. package/lib/utils/validation-run-post-retry.js +85 -0
  337. package/lib/utils/validation-run-request.js +116 -0
  338. package/lib/utils/variable-transformer.js +21 -4
  339. package/lib/utils/yaml-preserve.js +33 -14
  340. package/lib/validation/datasource-warnings.js +56 -0
  341. package/lib/validation/env-template-auth.js +1 -1
  342. package/lib/validation/external-manifest-validator.js +27 -7
  343. package/lib/validation/validate-display.js +37 -31
  344. package/lib/validation/validate-external-cert-sync.js +23 -0
  345. package/lib/validation/validate.js +8 -14
  346. package/lib/validation/validator-unresolved-placeholders.js +98 -0
  347. package/lib/validation/validator.js +22 -65
  348. package/lib/validation/wizard-config-validator.js +2 -1
  349. package/package.json +9 -4
  350. package/scripts/check-datasource-test-run-schema-sync.js +34 -0
  351. package/scripts/diagnose-cli.js +150 -0
  352. package/scripts/install-local.js +307 -55
  353. package/scripts/pnpm-global-remove.js +48 -0
  354. package/templates/README.md +15 -2
  355. package/templates/applications/dataplane/application.yaml +52 -2
  356. package/templates/applications/dataplane/env.template +79 -17
  357. package/templates/applications/dataplane/rbac.yaml +8 -0
  358. package/templates/applications/keycloak/application.yaml +9 -1
  359. package/templates/applications/keycloak/env.template +15 -6
  360. package/templates/applications/miso-controller/application.yaml +10 -2
  361. package/templates/applications/miso-controller/env.template +42 -12
  362. package/templates/applications/miso-controller/rbac.yaml +5 -0
  363. package/templates/external-system/README.md.hbs +20 -7
  364. package/templates/external-system/deploy.js.hbs +5 -5
  365. package/templates/external-system/external-datasource.yaml.hbs +197 -118
  366. package/templates/infra/compose.yaml.hbs +33 -16
  367. package/templates/infra/servers.json.hbs +3 -1
  368. package/templates/python/docker-compose.hbs +16 -0
  369. package/templates/typescript/docker-compose.hbs +16 -0
  370. package/lib/api/external-test.api.js +0 -111
  371. package/lib/schema/env-config.yaml +0 -60
@@ -1,10 +1,9 @@
1
1
  /**
2
- * Datasource E2E test - run full E2E test via dataplane external API
3
- * @fileoverview Datasource E2E test logic (config, credential, sync, data, CIP)
2
+ * Datasource E2E test — unified POST /api/v1/validation/run (runType=e2e).
3
+ * @fileoverview Datasource E2E via DatasourceTestRun envelope
4
4
  * @author AI Fabrix Team
5
5
  * @version 2.0.0
6
6
  */
7
- /* eslint-disable max-statements -- Auth setup, API call, polling, debug log */
8
7
 
9
8
  const path = require('path');
10
9
  const fs = require('fs').promises;
@@ -12,19 +11,51 @@ const chalk = require('chalk');
12
11
  const logger = require('../utils/logger');
13
12
  const { getIntegrationPath } = require('../utils/paths');
14
13
  const { resolveAppKeyForDatasource } = require('./resolve-app');
15
- const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
16
- const { resolveControllerUrl } = require('../utils/controller-url');
17
- const { getDeviceOnlyAuth } = require('../utils/token-manager');
18
- const { testDatasourceE2E, getE2ETestRun } = require('../api/external-test.api');
14
+ const { infoLine } = require('../utils/cli-test-layout-chalk');
15
+ const { runUnifiedDatasourceValidation } = require('./unified-validation-run');
16
+ const { includeDebugForRequest } = require('../utils/validation-run-request');
17
+ const { e2eShapeFromEnvelope } = require('../utils/datasource-test-run-legacy-adapter');
19
18
  const { writeTestLog } = require('../utils/test-log-writer');
20
19
 
21
- const DEFAULT_POLL_INTERVAL_MS = 2500;
22
20
  const DEFAULT_POLL_TIMEOUT_MS = 15 * 60 * 1000;
23
21
 
22
+ /**
23
+ * @param {Object} options
24
+ * @param {string|number} timeoutMs
25
+ * @param {string|Object|null} pk
26
+ */
27
+ function buildUnifiedE2eRunOptions(options, timeoutMs, pk) {
28
+ return {
29
+ app: options.app,
30
+ environment: options.environment,
31
+ runType: 'e2e',
32
+ debug: options.debug,
33
+ verbose: options.verbose,
34
+ async: options.async !== false,
35
+ noAsync: options.async === false,
36
+ testCrud: options.testCrud,
37
+ recordId: options.recordId,
38
+ cleanup: options.cleanup,
39
+ primaryKeyValue: pk,
40
+ minVectorHits: options.minVectorHits,
41
+ minProcessed: options.minProcessed,
42
+ minRecordCount: options.minRecordCount,
43
+ capabilityKey: options.capabilityKey,
44
+ timeout: timeoutMs,
45
+ sync: options.sync === true
46
+ };
47
+ }
48
+
49
+ function logE2eDatasourceBanner(datasourceKey, verbose) {
50
+ if (!verbose) return;
51
+ logger.log('');
52
+ logger.log(infoLine(`🧪 Running E2E test for datasource: ${datasourceKey}`));
53
+ }
54
+
24
55
  /**
25
56
  * Resolve primaryKeyValue for request body: string as-is, or read and parse JSON from @path
26
- * @param {string} [value] - Literal value or path prefixed with @ (e.g. @pk.json)
27
- * @returns {Promise<string|Object|null>} Resolved value for body.primaryKeyValue, or null if absent
57
+ * @param {string} [value]
58
+ * @returns {Promise<string|Object|null>}
28
59
  */
29
60
  async function resolvePrimaryKeyValue(value) {
30
61
  if (value === null || value === undefined || value === '') return null;
@@ -37,174 +68,110 @@ async function resolvePrimaryKeyValue(value) {
37
68
  return str;
38
69
  }
39
70
 
40
- /**
41
- * Build E2E request body from options
42
- * @param {Object} options - Command options
43
- * @returns {Promise<Object>} Request body
44
- */
45
- async function buildE2EBody(options) {
46
- const body = {};
47
- if (options.debug) body.includeDebug = true;
48
- if (options.verbose) body.audit = true;
49
- if (options.testCrud === true) body.testCrud = true;
50
- if (options.recordId !== undefined && options.recordId !== null && options.recordId !== '') body.recordId = String(options.recordId);
51
- if (options.cleanup === false) body.cleanup = false;
52
- else if (options.cleanup === true) body.cleanup = true;
53
- const pk = await resolvePrimaryKeyValue(options.primaryKeyValue);
54
- if (pk !== null && pk !== undefined) body.primaryKeyValue = pk;
55
- return body;
71
+ function e2eIntegrationLogDir(appKey) {
72
+ return path.dirname(getIntegrationPath(appKey));
56
73
  }
57
74
 
58
75
  /**
59
- * Poll E2E test run until completed or failed
60
- * @param {string} dataplaneUrl - Dataplane URL
61
- * @param {string} sourceIdOrKey - Source ID or key
62
- * @param {string} testRunId - Test run ID
63
- * @param {Object} authConfig - Auth config
64
- * @param {Object} opts - Poll options
65
- * @param {number} [opts.intervalMs] - Poll interval (ms)
66
- * @param {number} [opts.timeoutMs] - Max wait (ms)
67
- * @param {boolean} [opts.verbose] - Log each poll
68
- * @returns {Promise<Object>} Final poll result (status completed or failed)
76
+ * Throw when unified run failed, timed out, or needs async; optionally write debug log.
77
+ * @returns {Promise<void>}
69
78
  */
70
- async function pollE2ETestRun(dataplaneUrl, sourceIdOrKey, testRunId, authConfig, opts = {}) {
71
- const intervalMs = opts.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;
72
- const timeoutMs = opts.timeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;
73
- const verbose = opts.verbose === true;
74
- const deadline = Date.now() + timeoutMs;
75
- let last;
76
- while (Date.now() < deadline) {
77
- last = await getE2ETestRun(dataplaneUrl, sourceIdOrKey, testRunId, authConfig);
78
- if (last.status === 'completed' || last.status === 'failed') {
79
- return last;
79
+ async function throwIfUnifiedE2EBlocked(unifiedResult, appKey, options, requestMeta) {
80
+ if (unifiedResult.apiError) {
81
+ const msg =
82
+ unifiedResult.apiError.formattedError ||
83
+ unifiedResult.apiError.error ||
84
+ 'E2E request failed';
85
+ if (options.debug) {
86
+ await writeTestLog(
87
+ appKey,
88
+ { request: requestMeta, error: msg },
89
+ 'test-e2e',
90
+ e2eIntegrationLogDir(appKey)
91
+ );
80
92
  }
81
- if (verbose) {
82
- const steps = last.completedActions || [];
83
- logger.log(chalk.gray(` Polling… status: ${last.status}, ${steps.length} step(s) completed`));
93
+ throw new Error(msg);
94
+ }
95
+ if (unifiedResult.pollTimedOut) {
96
+ const err = new Error('Report incomplete: timeout');
97
+ if (options.debug) {
98
+ await writeTestLog(
99
+ appKey,
100
+ { request: requestMeta, error: err.message },
101
+ 'test-e2e',
102
+ e2eIntegrationLogDir(appKey)
103
+ );
84
104
  }
85
- await new Promise(r => setTimeout(r, intervalMs));
105
+ throw err;
106
+ }
107
+ if (unifiedResult.incompleteNoAsync) {
108
+ throw new Error(
109
+ 'Report incomplete: async polling disabled (--no-async) but server returned partial report.'
110
+ );
86
111
  }
87
- throw new Error(
88
- `E2E test run did not complete within ${timeoutMs / 1000}s (run ID: ${testRunId})`
89
- );
90
112
  }
91
113
 
92
114
  /**
93
- * Run E2E test for one datasource (Bearer token or API key required; no client credentials).
94
- * Default: async start + polling until completed/failed. Use options.async === false for sync.
95
- *
115
+ * Run E2E test for one datasource (unified validation API; deployment auth like test-integration).
96
116
  * @async
97
- * @param {string} datasourceKey - Datasource key (used as sourceIdOrKey)
98
- * @param {Object} options - Options
99
- * @param {string} [options.app] - App key (or resolve from cwd)
100
- * @param {string} [options.environment] - Environment (dev, tst, pro)
101
- * @param {boolean} [options.debug] - Include debug, write log file
102
- * @param {boolean} [options.verbose] - Verbose output (e.g. poll progress)
103
- * @param {boolean} [options.async] - If false, use sync mode (no polling). Default true.
104
- * @param {boolean} [options.testCrud] - Set body testCrud true
105
- * @param {string} [options.recordId] - Set body recordId
106
- * @param {boolean} [options.cleanup] - Set body cleanup (default true)
107
- * @param {string} [options.primaryKeyValue] - Set body primaryKeyValue (string or @path to JSON)
108
- * @param {number} [options.pollIntervalMs] - Poll interval in ms (default 2500)
109
- * @param {number} [options.pollTimeoutMs] - Poll timeout in ms (default 15 min)
110
- * @returns {Promise<Object>} E2E test result (steps, success, error, etc.)
117
+ * @param {string} datasourceKey
118
+ * @param {Object} options
119
+ * @param {boolean} [options.sync] - Publish local datasource JSON before validation when true
120
+ * @returns {Promise<Object>} Shape compatible with displayE2EResults (steps, success, status)
111
121
  */
112
122
  async function runDatasourceTestE2E(datasourceKey, options = {}) {
113
123
  if (!datasourceKey || typeof datasourceKey !== 'string') {
114
124
  throw new Error('Datasource key is required');
115
125
  }
116
126
  const { appKey } = await resolveAppKeyForDatasource(datasourceKey, options.app);
117
- const controllerUrl = await resolveControllerUrl();
118
- const { resolveEnvironment } = require('../core/config');
119
- const environment = options.environment || await resolveEnvironment();
120
- const authConfig = await getDeviceOnlyAuth(controllerUrl);
121
- const dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig);
122
127
 
123
- logger.log(chalk.blue(`\n🧪 Running E2E test for datasource: ${datasourceKey}`));
128
+ logE2eDatasourceBanner(datasourceKey, options.verbose);
129
+
130
+ const pk = await resolvePrimaryKeyValue(options.primaryKeyValue);
131
+ const timeoutRaw =
132
+ options.timeout !== undefined && options.timeout !== null && options.timeout !== ''
133
+ ? parseInt(String(options.timeout), 10)
134
+ : options.pollTimeoutMs;
135
+ const timeoutMs =
136
+ Number.isFinite(timeoutRaw) && timeoutRaw > 0 ? timeoutRaw : DEFAULT_POLL_TIMEOUT_MS;
124
137
 
125
- const body = await buildE2EBody(options);
126
- const useAsync = options.async !== false;
127
138
  const requestMeta = {
128
- sourceIdOrKey: datasourceKey,
129
- dataplaneUrl,
130
- includeDebug: options.debug,
139
+ datasourceKey,
140
+ runType: 'e2e',
141
+ includeDebug: includeDebugForRequest(options.debug),
131
142
  testCrud: options.testCrud,
132
143
  recordId: options.recordId,
133
144
  cleanup: options.cleanup,
134
- primaryKeyValue: options.primaryKeyValue !== undefined && options.primaryKeyValue !== null
145
+ primaryKeyValue: pk !== undefined && pk !== null,
146
+ minVectorHits: options.minVectorHits,
147
+ minProcessed: options.minProcessed,
148
+ minRecordCount: options.minRecordCount
135
149
  };
136
150
 
137
- const execOpts = {
138
- dataplaneUrl,
151
+ const unifiedResult = await runUnifiedDatasourceValidation(
139
152
  datasourceKey,
140
- authConfig,
141
- body,
142
- useAsync,
143
- verbose: options.verbose,
144
- pollIntervalMs: options.pollIntervalMs,
145
- pollTimeoutMs: options.pollTimeoutMs
146
- };
147
- let data;
148
- try {
149
- data = await executeE2EWithOptionalPoll(execOpts);
150
- } catch (error) {
151
- if (options.debug) {
152
- const appPath = getIntegrationPath(appKey);
153
- const integrationDir = path.dirname(appPath);
154
- await writeTestLog(appKey, { request: requestMeta, error: error.message }, 'test-e2e', integrationDir);
155
- }
156
- throw error;
157
- }
153
+ buildUnifiedE2eRunOptions(options, timeoutMs, pk)
154
+ );
158
155
 
159
- if (options.debug) {
160
- const appPath = getIntegrationPath(appKey);
161
- const integrationDir = path.dirname(appPath);
162
- const logPath = await writeTestLog(appKey, { request: requestMeta, response: data }, 'test-e2e', integrationDir);
163
- logger.log(chalk.gray(` Debug log: ${logPath}`));
164
- }
156
+ await throwIfUnifiedE2EBlocked(unifiedResult, appKey, options, requestMeta);
165
157
 
166
- return data;
167
- }
158
+ const display = e2eShapeFromEnvelope(unifiedResult.envelope);
159
+ Object.assign(display, { datasourceTestRun: unifiedResult.envelope });
168
160
 
169
- /**
170
- * Call E2E API and optionally poll until completed. On throw, caller should log if debug.
171
- * @param {Object} opts - Options
172
- * @param {string} opts.dataplaneUrl - Dataplane URL
173
- * @param {string} opts.datasourceKey - Source key
174
- * @param {Object} opts.authConfig - Auth config
175
- * @param {Object} opts.body - Request body
176
- * @param {boolean} opts.useAsync - Whether to use async + poll
177
- * @param {boolean} opts.verbose - Verbose poll progress
178
- * @param {number} [opts.pollIntervalMs] - Override poll interval (ms)
179
- * @param {number} [opts.pollTimeoutMs] - Override poll timeout (ms)
180
- * @returns {Promise<Object>} Final result data
181
- */
182
- /* eslint-disable-next-line max-params -- single opts object; destructuring in body */
183
- async function executeE2EWithOptionalPoll(opts) {
184
- const { dataplaneUrl, datasourceKey, authConfig, body, useAsync, verbose, pollIntervalMs, pollTimeoutMs } = opts;
185
- const response = await testDatasourceE2E(dataplaneUrl, datasourceKey, authConfig, body, {
186
- asyncRun: useAsync
187
- });
188
- let data = response.data || response;
189
- const runId = (data?.testRunId !== null && data?.testRunId !== undefined)
190
- ? (typeof data.testRunId === 'string' ? data.testRunId : data.testRunId.id || data.testRunId.key)
191
- : null;
192
- if (useAsync && runId) {
193
- data = await pollE2ETestRun(
194
- dataplaneUrl,
195
- datasourceKey,
196
- runId,
197
- authConfig,
198
- {
199
- intervalMs: pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,
200
- timeoutMs: pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS,
201
- verbose
202
- }
161
+ if (options.debug) {
162
+ const logPath = await writeTestLog(
163
+ appKey,
164
+ { request: requestMeta, response: unifiedResult.envelope },
165
+ 'test-e2e',
166
+ e2eIntegrationLogDir(appKey)
203
167
  );
168
+ logger.log(chalk.gray(` Debug log: ${logPath}`));
204
169
  }
205
- return data;
170
+
171
+ return display;
206
172
  }
207
173
 
208
174
  module.exports = {
209
- runDatasourceTestE2E
175
+ runDatasourceTestE2E,
176
+ resolvePrimaryKeyValue
210
177
  };
@@ -1,174 +1,166 @@
1
1
  /**
2
- * Datasource integration test - run config test for one datasource via pipeline
2
+ * Datasource integration test — unified dataplane validation (runType=integration).
3
3
  * @fileoverview Datasource integration test logic
4
4
  * @author AI Fabrix Team
5
5
  * @version 2.0.0
6
6
  */
7
- /* eslint-disable max-lines-per-function,max-statements,complexity -- Load config, resolve datasource, call pipeline test */
8
7
 
9
- const path = require('path');
10
8
  const chalk = require('chalk');
11
9
  const logger = require('../utils/logger');
12
- const { getIntegrationPath } = require('../utils/paths');
13
10
  const { resolveAppKeyForDatasource } = require('./resolve-app');
14
- const { resolveApplicationConfigPath } = require('../utils/app-config-resolver');
15
- const { loadConfigFile } = require('../utils/config-format');
16
- const { setupIntegrationTestAuth } = require('../external-system/test-auth');
17
- const { getConfig } = require('../core/config');
18
- const { testDatasourceViaPipeline } = require('../api/pipeline.api');
11
+ const { infoLine } = require('../utils/cli-test-layout-chalk');
12
+ const {
13
+ getSystemKeyFromAppKey,
14
+ findDatasourceFileByKey
15
+ } = require('./integration-context');
16
+ const { runUnifiedDatasourceValidation } = require('./unified-validation-run');
17
+ const { integrationResultFromEnvelope } = require('../utils/datasource-test-run-legacy-adapter');
19
18
  const { writeTestLog } = require('../utils/test-log-writer');
20
- const testHelpers = require('../utils/external-system-test-helpers');
21
- const fs = require('fs').promises;
22
19
 
23
20
  /**
24
- * Get systemKey for an integration app (from application config and first system file)
25
- * @param {string} appKey - Integration app key
21
+ * @param {string} appKey - Integration folder name (same as --app; system key in publish flows)
26
22
  * @returns {Promise<string>} systemKey
27
23
  */
28
- async function getSystemKeyFromAppKey(appKey) {
29
- const appPath = getIntegrationPath(appKey);
30
- const configPath = resolveApplicationConfigPath(appPath);
31
- const config = loadConfigFile(configPath);
32
- if (!config.externalIntegration || !config.externalIntegration.systems || config.externalIntegration.systems.length === 0) {
33
- throw new Error(`No externalIntegration.systems found in ${configPath}`);
34
- }
35
- const systemFile = config.externalIntegration.systems[0];
36
- const systemPath = path.isAbsolute(systemFile)
37
- ? systemFile
38
- : path.join(appPath, systemFile);
39
- const systemContent = await fs.readFile(systemPath, 'utf8');
40
- const yaml = require('js-yaml');
41
- const systemConfig = yaml.load(systemContent);
42
- return systemConfig?.key || path.basename(systemFile, '-system.yaml').replace('-system', '');
24
+ async function getSystemKeyFromAppKeyExport(appKey) {
25
+ return getSystemKeyFromAppKey(appKey);
26
+ }
27
+
28
+ function legacyFailureShell(datasourceKey, systemKey, error, datasourceTestRun, runMeta) {
29
+ return {
30
+ key: datasourceKey,
31
+ systemKey,
32
+ success: false,
33
+ skipped: false,
34
+ validationResults: {},
35
+ fieldMappingResults: {},
36
+ endpointTestResults: {},
37
+ error,
38
+ datasourceTestRun,
39
+ runMeta
40
+ };
43
41
  }
44
42
 
45
43
  /**
46
- * Find a datasource filename by matching the key inside the file (fallback when filename-base match fails).
47
- * @param {string} appPath - Integration app directory path
48
- * @param {string} schemaBasePath - Schema base path (relative or absolute)
49
- * @param {string[]} datasourceFiles - List of datasource filenames from application config
50
- * @param {string} datasourceKey - Datasource key to find
51
- * @returns {string|null} Filename if found, null otherwise
44
+ * @returns {{ body: Object, apiErrMsg?: string }|null}
52
45
  */
53
- function findDatasourceFileByKey(appPath, schemaBasePath, datasourceFiles, datasourceKey) {
54
- const fsSync = require('fs');
55
- for (const f of datasourceFiles) {
56
- if (!f || typeof f !== 'string') continue;
57
- const fullPath = path.isAbsolute(schemaBasePath)
58
- ? path.join(schemaBasePath, f)
59
- : path.join(appPath, schemaBasePath, f);
60
- if (!fsSync.existsSync(fullPath)) continue;
61
- try {
62
- const parsed = loadConfigFile(fullPath);
63
- if (parsed && parsed.key === datasourceKey) return f;
64
- } catch {
65
- // skip unreadable or invalid files
66
- }
46
+ function integrationEarlyExitBody(datasourceKey, systemKey, unifiedResult, runMeta) {
47
+ if (unifiedResult.apiError) {
48
+ const errMsg =
49
+ unifiedResult.apiError.formattedError ||
50
+ unifiedResult.apiError.error ||
51
+ 'Request failed';
52
+ return {
53
+ body: legacyFailureShell(datasourceKey, systemKey, errMsg, null, runMeta),
54
+ apiErrMsg: errMsg
55
+ };
56
+ }
57
+ if (unifiedResult.pollTimedOut) {
58
+ return {
59
+ body: legacyFailureShell(
60
+ datasourceKey,
61
+ systemKey,
62
+ 'Report incomplete: timeout',
63
+ unifiedResult.envelope,
64
+ runMeta
65
+ )
66
+ };
67
+ }
68
+ if (unifiedResult.incompleteNoAsync) {
69
+ return {
70
+ body: legacyFailureShell(
71
+ datasourceKey,
72
+ systemKey,
73
+ 'Report incomplete (async required)',
74
+ unifiedResult.envelope,
75
+ runMeta
76
+ )
77
+ };
67
78
  }
68
79
  return null;
69
80
  }
70
81
 
71
82
  /**
72
- * Run integration test for one datasource
83
+ * Run integration test for one datasource (unified validation API).
73
84
  * @async
74
85
  * @param {string} datasourceKey - Datasource key
75
86
  * @param {Object} options - Options
76
87
  * @param {string} [options.app] - App key (or resolve from cwd)
77
88
  * @param {string} [options.payload] - Path to custom payload file
78
89
  * @param {string} [options.environment] - Environment (dev, tst, pro)
79
- * @param {boolean} [options.debug] - Include debug, write log file
80
- * @param {number} [options.timeout] - Request timeout ms
81
- * @returns {Promise<Object>} Test result
90
+ * @param {boolean} [options.verbose] - explain=true on request
91
+ * @param {boolean|string} [options.debug] - Truthy enables includeDebug and log file; string `summary`|`full`|`raw` selects TTY appendix (CLI)
92
+ * @param {number|string} [options.timeout] - Aggregate timeout ms
93
+ * @param {boolean} [options.sync] - Publish local datasource JSON before validation when true
94
+ * @returns {Promise<Object>} Legacy-shaped result + datasourceTestRun / runMeta when present
82
95
  */
96
+ function logIntegrationDatasourceBanner(datasourceKey, systemKey, verbose) {
97
+ if (!verbose) return;
98
+ logger.log('');
99
+ logger.log(infoLine(`šŸ“” Testing datasource: ${datasourceKey} (system: ${systemKey})`));
100
+ }
101
+
83
102
  async function runDatasourceTestIntegration(datasourceKey, options = {}) {
84
103
  if (!datasourceKey || typeof datasourceKey !== 'string') {
85
104
  throw new Error('Datasource key is required');
86
105
  }
87
106
  const { appKey } = await resolveAppKeyForDatasource(datasourceKey, options.app);
88
107
  const systemKey = await getSystemKeyFromAppKey(appKey);
89
- const appPath = getIntegrationPath(appKey);
90
- const config = loadConfigFile(resolveApplicationConfigPath(appPath));
91
- const schemaBasePath = config.externalIntegration?.schemaBasePath || './';
92
- const datasourceFiles = config.externalIntegration?.dataSources || [];
93
- let datasourceFile = datasourceFiles.find(f => {
94
- const base = path.basename(f, path.extname(f));
95
- return base === datasourceKey || base.includes(datasourceKey);
96
- });
97
- if (!datasourceFile) {
98
- datasourceFile = findDatasourceFileByKey(appPath, schemaBasePath, datasourceFiles, datasourceKey);
99
- }
100
- if (!datasourceFile) {
101
- throw new Error(`Datasource '${datasourceKey}' not found in application config`);
102
- }
103
- const datasourcePath = path.isAbsolute(schemaBasePath)
104
- ? path.join(schemaBasePath, datasourceFile)
105
- : path.join(appPath, schemaBasePath, datasourceFile);
106
- const datasource = loadConfigFile(datasourcePath);
107
- if (datasource.key !== datasourceKey) {
108
- throw new Error(`Datasource key mismatch: file has '${datasource.key}', expected '${datasourceKey}'`);
109
- }
110
108
 
111
- const configObj = await getConfig();
112
- const { authConfig, dataplaneUrl } = await setupIntegrationTestAuth(appKey, options, configObj);
113
- const customPayload = await testHelpers.loadCustomPayload(options.payload);
114
- const payloadTemplate = testHelpers.determinePayloadTemplate(datasource, datasourceKey, customPayload);
115
- if (!payloadTemplate) {
116
- throw new Error(`No test payload found for datasource '${datasourceKey}'`);
117
- }
109
+ logIntegrationDatasourceBanner(datasourceKey, systemKey, options.verbose);
118
110
 
119
- logger.log(chalk.blue(`\nšŸ“” Testing datasource: ${datasourceKey} (system: ${systemKey})`));
111
+ const unifiedResult = await runUnifiedDatasourceValidation(datasourceKey, {
112
+ app: options.app,
113
+ environment: options.environment,
114
+ runType: 'integration',
115
+ payload: options.payload,
116
+ debug: options.debug,
117
+ verbose: options.verbose,
118
+ timeout: options.timeout,
119
+ async: true,
120
+ noAsync: false,
121
+ sync: options.sync === true
122
+ });
120
123
 
121
- const testData = { payloadTemplate };
122
- if (options.debug) {
123
- testData.includeDebug = true;
124
- }
125
- const timeout = parseInt(options.timeout, 10) || 30000;
124
+ const runMeta = {
125
+ apiError: unifiedResult.apiError,
126
+ pollTimedOut: unifiedResult.pollTimedOut,
127
+ incompleteNoAsync: unifiedResult.incompleteNoAsync
128
+ };
126
129
 
127
- let response;
128
- try {
129
- response = await testDatasourceViaPipeline({
130
- dataplaneUrl,
131
- systemKey,
132
- datasourceKey,
133
- authConfig,
134
- testData,
135
- options: { timeout }
136
- });
137
- } catch (error) {
138
- const result = { key: datasourceKey, success: false, error: error.message };
139
- if (options.debug) {
140
- await writeTestLog(appKey, { request: { systemKey, datasourceKey }, error: error.message }, 'test-integration');
130
+ const early = integrationEarlyExitBody(datasourceKey, systemKey, unifiedResult, runMeta);
131
+ if (early) {
132
+ if (early.apiErrMsg && options.debug) {
133
+ await writeTestLog(
134
+ appKey,
135
+ { request: { systemKey, datasourceKey }, error: early.apiErrMsg },
136
+ 'test-integration'
137
+ );
141
138
  }
142
- return result;
139
+ return early.body;
143
140
  }
144
141
 
145
- const data = response.data || response;
146
- const success = data.success !== false;
147
- const result = {
148
- key: datasourceKey,
149
- systemKey,
150
- success,
151
- skipped: false,
152
- validationResults: data.validationResults || {},
153
- fieldMappingResults: data.fieldMappingResults || {},
154
- endpointTestResults: data.endpointTestResults || {}
155
- };
156
- if (data.error) {
157
- result.error = data.error;
158
- }
142
+ const legacy = integrationResultFromEnvelope(unifiedResult.envelope, datasourceKey);
143
+ legacy.systemKey = systemKey;
144
+ legacy.datasourceTestRun = unifiedResult.envelope;
145
+ legacy.runMeta = { apiError: null, pollTimedOut: false, incompleteNoAsync: false };
159
146
 
160
- if (options.debug) {
161
- const logPath = await writeTestLog(appKey, {
162
- request: { systemKey, datasourceKey, includeDebug: true },
163
- response: data
164
- }, 'test-integration');
147
+ if (options.debug && unifiedResult.envelope) {
148
+ const logPath = await writeTestLog(
149
+ appKey,
150
+ {
151
+ request: { systemKey, datasourceKey, includeDebug: true },
152
+ response: unifiedResult.envelope
153
+ },
154
+ 'test-integration'
155
+ );
165
156
  logger.log(chalk.gray(` Debug log: ${logPath}`));
166
157
  }
167
158
 
168
- return result;
159
+ return legacy;
169
160
  }
170
161
 
171
162
  module.exports = {
172
163
  runDatasourceTestIntegration,
173
- getSystemKeyFromAppKey
164
+ getSystemKeyFromAppKey: getSystemKeyFromAppKeyExport,
165
+ findDatasourceFileByKey
174
166
  };