@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.
- package/.cursor/rules/anchor-docs.mdc +15 -0
- package/.cursor/rules/cli-layout.mdc +75 -0
- package/.cursor/rules/project-rules.mdc +8 -0
- package/.npmrc.token +1 -0
- package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
- package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -0
- package/README.md +1 -1
- package/anchor-docs/README.md +10 -0
- package/anchor-docs/_TEMPLATE +24 -0
- package/bin/aifabrix.js +13 -4
- package/integration/hubspot-test/README.md +31 -0
- package/integration/hubspot-test/create-hubspot.js +5 -5
- package/integration/hubspot-test/hubspot-test-datasource-company.json +58 -462
- package/integration/hubspot-test/hubspot-test-datasource-contact.json +61 -555
- package/integration/hubspot-test/hubspot-test-datasource-deal.json +63 -506
- package/integration/hubspot-test/hubspot-test-datasource-users.json +42 -83
- package/integration/hubspot-test/hubspot-test-deploy.json +3 -3
- package/integration/hubspot-test/test-dataplane-down-tests.js +1 -7
- package/integration/hubspot-test/test-dataplane-down.js +3 -3
- package/integration/hubspot-test/test.js +35 -43
- package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
- package/integration/roundtrip-test-local/README.md +144 -0
- package/integration/roundtrip-test-local/application.yaml +13 -0
- package/integration/roundtrip-test-local/env.template +15 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
- package/integration/roundtrip-test-local2/README.md +144 -0
- package/integration/roundtrip-test-local2/application.yaml +13 -0
- package/integration/roundtrip-test-local2/env.template +15 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
- package/integration/test/wizard.yaml +8 -0
- package/jest.config.default.js +10 -0
- package/jest.config.integration.fixtures.js +22 -0
- package/jest.config.integration.js +21 -18
- package/jest.config.isolated.js +10 -0
- package/jest.projects.js +301 -0
- package/lib/api/certificates.api.js +62 -0
- package/lib/api/datasources-core.api.js +3 -3
- package/lib/api/dev-mtls-request.js +110 -0
- package/lib/api/dev-server-https.js +145 -0
- package/lib/api/dev.api.js +133 -144
- package/lib/api/index.js +11 -3
- package/lib/api/pipeline.api.js +67 -20
- package/lib/api/types/certificates.types.js +48 -0
- package/lib/api/types/dev.types.js +4 -3
- package/lib/api/types/pipeline.types.js +8 -5
- package/lib/api/types/validation-run.types.js +56 -0
- package/lib/api/validation-run.api.js +111 -0
- package/lib/api/validation-runner.js +109 -0
- package/lib/app/certification-show-enrich.js +129 -0
- package/lib/app/certification-verify-rows.js +60 -0
- package/lib/app/config.js +1 -1
- package/lib/app/deploy-status-display.js +2 -2
- package/lib/app/deploy.js +7 -6
- package/lib/app/display.js +2 -1
- package/lib/app/dockerfile.js +3 -2
- package/lib/app/down.js +2 -1
- package/lib/app/helpers.js +6 -5
- package/lib/app/index.js +27 -8
- package/lib/app/list.js +7 -6
- package/lib/app/push.js +4 -3
- package/lib/app/register.js +16 -7
- package/lib/app/rotate-secret.js +14 -13
- package/lib/app/run-container-start.js +184 -0
- package/lib/app/run-docker-fallback.js +108 -0
- package/lib/app/run-env-compose.js +30 -42
- package/lib/app/run-helpers.js +49 -126
- package/lib/app/run-infra-requirements.js +30 -0
- package/lib/app/run-resolve-image.js +21 -0
- package/lib/app/run.js +74 -21
- package/lib/app/show-display.js +44 -1
- package/lib/app/show.js +93 -9
- package/lib/build/index.js +13 -10
- package/lib/certification/cli-cert-sync-skip.js +21 -0
- package/lib/certification/merge-certification-from-artifact.js +185 -0
- package/lib/certification/post-unified-cert-sync.js +33 -0
- package/lib/certification/sync-after-external-command.js +52 -0
- package/lib/certification/sync-system-certification.js +197 -0
- package/lib/cli/index.js +2 -0
- package/lib/cli/setup-app.help.js +67 -0
- package/lib/cli/setup-app.js +61 -121
- package/lib/cli/setup-app.test-commands.js +195 -0
- package/lib/cli/setup-auth.js +19 -5
- package/lib/cli/setup-credential-deployment.js +22 -8
- package/lib/cli/setup-dev-path-commands.js +124 -0
- package/lib/cli/setup-dev.js +170 -113
- package/lib/cli/setup-environment.js +7 -1
- package/lib/cli/setup-external-system.js +84 -23
- package/lib/cli/setup-infra.js +126 -47
- package/lib/cli/setup-parameters.js +32 -0
- package/lib/cli/setup-secrets.js +137 -18
- package/lib/cli/setup-service-user.js +1 -1
- package/lib/cli/setup-utility.js +54 -22
- package/lib/commands/app-down.js +5 -7
- package/lib/commands/app-install.js +14 -7
- package/lib/commands/app-logs.js +13 -10
- package/lib/commands/app-shell.js +4 -1
- package/lib/commands/app-test.js +25 -19
- package/lib/commands/app.js +32 -11
- package/lib/commands/auth-config.js +6 -6
- package/lib/commands/auth-status.js +4 -3
- package/lib/commands/credential-env.js +4 -3
- package/lib/commands/credential-list.js +5 -4
- package/lib/commands/credential-push.js +4 -3
- package/lib/commands/datasource-unified-test-cli.js +428 -0
- package/lib/commands/datasource-unified-test-cli.options.js +191 -0
- package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +106 -0
- package/lib/commands/datasource-validation-cli.js +143 -0
- package/lib/commands/datasource.js +125 -95
- package/lib/commands/deployment-list.js +6 -5
- package/lib/commands/dev-cli-handlers.js +122 -18
- package/lib/commands/dev-down.js +4 -3
- package/lib/commands/dev-init.js +231 -116
- package/lib/commands/dev-show-display.js +473 -0
- package/lib/commands/login-credentials.js +3 -2
- package/lib/commands/login-device.js +4 -3
- package/lib/commands/login.js +5 -4
- package/lib/commands/logout.js +8 -7
- package/lib/commands/parameters-validate.js +54 -0
- package/lib/commands/repair-datasource.js +314 -68
- package/lib/commands/repair-env-template.js +2 -2
- package/lib/commands/repair.js +21 -3
- package/lib/commands/secrets-list.js +23 -12
- package/lib/commands/secrets-remove-all.js +220 -0
- package/lib/commands/secrets-remove.js +21 -12
- package/lib/commands/secrets-set.js +21 -12
- package/lib/commands/secrets-validate.js +4 -4
- package/lib/commands/secure.js +10 -9
- package/lib/commands/service-user.js +26 -25
- package/lib/commands/test-e2e-external.js +27 -1
- package/lib/commands/up-common.js +3 -2
- package/lib/commands/up-dataplane.js +29 -16
- package/lib/commands/up-miso.js +19 -29
- package/lib/commands/upload.js +149 -39
- package/lib/commands/wizard-core-helpers.js +1 -1
- package/lib/commands/wizard-dataplane.js +4 -3
- package/lib/commands/wizard-helpers.js +3 -3
- package/lib/commands/wizard.js +2 -2
- package/lib/core/admin-secrets.js +14 -5
- package/lib/core/audit-logger.js +12 -4
- package/lib/core/config-attach-extensions.js +46 -0
- package/lib/core/config-runtime-paths.js +29 -0
- package/lib/core/config.js +55 -56
- package/lib/core/diff.js +3 -2
- package/lib/core/ensure-encryption-key.js +1 -1
- package/lib/core/secrets-ensure-infra.js +77 -0
- package/lib/core/secrets-ensure.js +120 -64
- package/lib/core/secrets-env-write.js +35 -7
- package/lib/core/secrets-infra-placeholder-sync.js +61 -0
- package/lib/core/secrets.js +200 -37
- package/lib/core/templates-env.js +4 -3
- package/lib/datasource/abac-validator.js +1 -10
- package/lib/datasource/deploy.js +75 -53
- package/lib/datasource/field-reference-validator.js +9 -6
- package/lib/datasource/integration-context.js +63 -0
- package/lib/datasource/list.js +8 -7
- package/lib/datasource/log-viewer.js +189 -67
- package/lib/datasource/resolve-app.js +4 -4
- package/lib/datasource/test-e2e.js +113 -146
- package/lib/datasource/test-integration.js +114 -122
- package/lib/datasource/unified-validation-run-body.js +68 -0
- package/lib/datasource/unified-validation-run-post.js +23 -0
- package/lib/datasource/unified-validation-run-resolve.js +43 -0
- package/lib/datasource/unified-validation-run.js +93 -0
- package/lib/datasource/validate.js +157 -13
- package/lib/deployment/deployer.js +4 -3
- package/lib/deployment/environment.js +7 -6
- package/lib/deployment/push.js +17 -8
- package/lib/external-system/delete.js +4 -3
- package/lib/external-system/deploy.js +166 -53
- package/lib/external-system/download-helpers.js +1 -1
- package/lib/external-system/download.js +7 -6
- package/lib/external-system/generator.js +92 -6
- package/lib/external-system/integration-test-dispatch.js +26 -0
- package/lib/external-system/test-execution.js +5 -1
- package/lib/external-system/test-helpers.js +0 -4
- package/lib/external-system/test-system-level-helpers.js +110 -0
- package/lib/external-system/test-system-level.js +83 -44
- package/lib/external-system/test.js +59 -8
- package/lib/generator/builders.js +23 -11
- package/lib/generator/deploy-manifest-azure-kv.js +81 -0
- package/lib/generator/external.js +16 -4
- package/lib/generator/helpers.js +58 -3
- package/lib/generator/index.js +4 -0
- package/lib/generator/split-readme.js +12 -7
- package/lib/generator/split-variables.js +2 -1
- package/lib/generator/split.js +1 -1
- package/lib/generator/wizard-readme.js +3 -3
- package/lib/generator/wizard.js +8 -8
- package/lib/infrastructure/compose.js +70 -7
- package/lib/infrastructure/helpers-docker-check.js +67 -0
- package/lib/infrastructure/helpers.js +203 -42
- package/lib/infrastructure/index.js +31 -18
- package/lib/infrastructure/services.js +21 -67
- package/lib/internal/fs-real-sync.js +104 -0
- package/lib/internal/node-fs.js +98 -0
- package/lib/parameters/database-secret-values.js +173 -0
- package/lib/parameters/infra-kv-discovery.js +121 -0
- package/lib/parameters/infra-parameter-catalog.js +458 -0
- package/lib/parameters/infra-parameter-validate.js +64 -0
- package/lib/schema/application-schema.json +37 -17
- package/lib/schema/datasource-test-run.schema.json +493 -0
- package/lib/schema/deployment-rules.yaml +102 -63
- package/lib/schema/external-datasource.schema.json +1200 -442
- package/lib/schema/external-system.schema.json +203 -5
- package/lib/schema/flag-map-validation-run.json +31 -0
- package/lib/schema/infra-parameter.schema.json +106 -0
- package/lib/schema/infra.parameter.yaml +421 -0
- package/lib/schema/type/credential-auth-templates.json +40 -0
- package/lib/schema/type/document-storage.json +226 -0
- package/lib/schema/type/message-service.json +123 -0
- package/lib/schema/type/vector-store.json +88 -0
- package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
- package/lib/utils/api-error-handler.js +2 -2
- package/lib/utils/api.js +77 -17
- package/lib/utils/app-register-api.js +3 -2
- package/lib/utils/app-register-auth.js +1 -1
- package/lib/utils/app-register-config.js +4 -4
- package/lib/utils/app-register-display.js +3 -2
- package/lib/utils/app-register-validator.js +3 -2
- package/lib/utils/app-run-containers.js +26 -22
- package/lib/utils/app-scoped-config.js +31 -0
- package/lib/utils/app-service-env-from-builder.js +164 -0
- package/lib/utils/build-copy.js +1 -1
- package/lib/utils/build-helpers.js +20 -20
- package/lib/utils/build-resolve-image.js +165 -0
- package/lib/utils/cli-layout-chalk.js +8 -0
- package/lib/utils/cli-test-layout-chalk.js +267 -0
- package/lib/utils/cli-utils.js +88 -11
- package/lib/utils/compose-db-passwords.js +138 -0
- package/lib/utils/compose-generate-docker-compose.js +216 -0
- package/lib/utils/compose-generator.js +197 -291
- package/lib/utils/compose-miso-env.js +18 -0
- package/lib/utils/compose-traefik-ingress-base.js +158 -0
- package/lib/utils/config-paths.js +166 -7
- package/lib/utils/config-scoped-resources-preference.js +41 -0
- package/lib/utils/configuration-env-resolver.js +11 -8
- package/lib/utils/controller-deployment-outcome.js +68 -0
- package/lib/utils/credential-display.js +2 -2
- package/lib/utils/credential-secrets-env.js +5 -5
- package/lib/utils/dataplane-pipeline-warning.js +4 -3
- package/lib/utils/datasource-test-run-capability-scope.js +43 -0
- package/lib/utils/datasource-test-run-certificate-tty.js +82 -0
- package/lib/utils/datasource-test-run-debug-display.js +137 -0
- package/lib/utils/datasource-test-run-debug-slice.js +93 -0
- package/lib/utils/datasource-test-run-display.js +459 -0
- package/lib/utils/datasource-test-run-exit.js +83 -0
- package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
- package/lib/utils/datasource-test-run-report-version.js +51 -0
- package/lib/utils/datasource-test-run-schema-sync.js +59 -0
- package/lib/utils/datasource-test-run-tty-log.js +81 -0
- package/lib/utils/datasource-validation-watch.js +266 -0
- package/lib/utils/declarative-url-ports.js +47 -0
- package/lib/utils/derive-env-key-from-client-id.js +41 -0
- package/lib/utils/dev-ca-install.js +185 -23
- package/lib/utils/dev-cert-helper.js +266 -17
- package/lib/utils/dev-hosts-helper.js +307 -0
- package/lib/utils/dev-init-cert-hints.js +37 -0
- package/lib/utils/dev-init-health-messages.js +52 -0
- package/lib/utils/dev-init-resolve.js +86 -0
- package/lib/utils/dev-init-ssh-merge.js +65 -0
- package/lib/utils/dev-ssh-config-helper.js +196 -0
- package/lib/utils/dev-user-groups.js +93 -0
- package/lib/utils/docker-build.js +42 -17
- package/lib/utils/docker-exec.js +28 -0
- package/lib/utils/docker-manifest-public-port.js +116 -0
- package/lib/utils/docker-not-running-hint.js +52 -0
- package/lib/utils/docker.js +98 -11
- package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
- package/lib/utils/env-config-loader.js +10 -91
- package/lib/utils/env-copy.js +19 -10
- package/lib/utils/env-map.js +35 -8
- package/lib/utils/env-template.js +2 -2
- package/lib/utils/environment-scoped-resources.js +144 -0
- package/lib/utils/error-formatter.js +92 -13
- package/lib/utils/error-formatters/http-status-errors.js +6 -5
- package/lib/utils/error-formatters/network-errors.js +2 -1
- package/lib/utils/error-formatters/permission-errors.js +2 -1
- package/lib/utils/error-formatters/validation-errors.js +2 -1
- package/lib/utils/external-readme.js +8 -1
- package/lib/utils/external-system-display.js +242 -136
- package/lib/utils/external-system-local-test-tty.js +389 -0
- package/lib/utils/external-system-readiness-core.js +377 -0
- package/lib/utils/external-system-readiness-deploy-display.js +270 -0
- package/lib/utils/external-system-readiness-display-internals.js +150 -0
- package/lib/utils/external-system-readiness-display.js +186 -0
- package/lib/utils/external-system-system-test-tty-overview.js +120 -0
- package/lib/utils/external-system-system-test-tty.js +417 -0
- package/lib/utils/external-system-test-helpers.js +24 -6
- package/lib/utils/external-system-validators.js +30 -12
- package/lib/utils/health-check-url.js +119 -0
- package/lib/utils/health-check.js +59 -25
- package/lib/utils/help-builder.js +11 -8
- package/lib/utils/image-version.js +4 -8
- package/lib/utils/infra-containers.js +4 -7
- package/lib/utils/infra-env-defaults.js +162 -0
- package/lib/utils/infra-status-display.js +167 -0
- package/lib/utils/infra-status.js +16 -8
- package/lib/utils/local-secrets.js +3 -4
- package/lib/utils/paths.js +148 -47
- package/lib/utils/port-resolver.js +10 -23
- package/lib/utils/redis-env-scope.js +62 -0
- package/lib/utils/register-aifabrix-shell-env.js +204 -0
- package/lib/utils/remote-builder-validation.js +99 -0
- package/lib/utils/remote-dev-auth.js +117 -21
- package/lib/utils/remote-docker-env.js +67 -15
- package/lib/utils/remote-secrets-loader.js +13 -4
- package/lib/utils/resolve-docker-image-ref.js +124 -0
- package/lib/utils/schema-loader.js +22 -9
- package/lib/utils/secrets-bash-kv.js +25 -0
- package/lib/utils/secrets-generator.js +169 -49
- package/lib/utils/secrets-helpers.js +70 -59
- package/lib/utils/secrets-kv-scope.js +60 -0
- package/lib/utils/secrets-utils.js +32 -38
- package/lib/utils/secrets-validation.js +3 -1
- package/lib/utils/secrets-yaml-preserve.js +109 -0
- package/lib/utils/ssh-key-helper.js +4 -2
- package/lib/utils/template-helpers.js +2 -2
- package/lib/utils/test-log-writer.js +3 -3
- package/lib/utils/token-manager.js +1 -2
- package/lib/utils/url-declarative-public-base.js +188 -0
- package/lib/utils/url-declarative-resolve-build.js +493 -0
- package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
- package/lib/utils/url-declarative-resolve.js +220 -0
- package/lib/utils/url-declarative-token-parse.js +74 -0
- package/lib/utils/url-declarative-url-flags.js +50 -0
- package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
- package/lib/utils/url-public-path-prefix.js +34 -0
- package/lib/utils/urls-local-registry.js +220 -0
- package/lib/utils/validation-report-tty-kit.js +77 -0
- package/lib/utils/validation-run-poll.js +112 -0
- package/lib/utils/validation-run-post-retry.js +85 -0
- package/lib/utils/validation-run-request.js +116 -0
- package/lib/utils/variable-transformer.js +21 -4
- package/lib/utils/yaml-preserve.js +33 -14
- package/lib/validation/datasource-warnings.js +56 -0
- package/lib/validation/env-template-auth.js +1 -1
- package/lib/validation/external-manifest-validator.js +27 -7
- package/lib/validation/validate-display.js +37 -31
- package/lib/validation/validate-external-cert-sync.js +23 -0
- package/lib/validation/validate.js +8 -14
- package/lib/validation/validator-unresolved-placeholders.js +98 -0
- package/lib/validation/validator.js +22 -65
- package/lib/validation/wizard-config-validator.js +2 -1
- package/package.json +9 -4
- package/scripts/check-datasource-test-run-schema-sync.js +34 -0
- package/scripts/diagnose-cli.js +150 -0
- package/scripts/install-local.js +307 -55
- package/scripts/pnpm-global-remove.js +48 -0
- package/templates/README.md +15 -2
- package/templates/applications/dataplane/application.yaml +52 -2
- package/templates/applications/dataplane/env.template +79 -17
- package/templates/applications/dataplane/rbac.yaml +8 -0
- package/templates/applications/keycloak/application.yaml +9 -1
- package/templates/applications/keycloak/env.template +15 -6
- package/templates/applications/miso-controller/application.yaml +10 -2
- package/templates/applications/miso-controller/env.template +42 -12
- package/templates/applications/miso-controller/rbac.yaml +5 -0
- package/templates/external-system/README.md.hbs +20 -7
- package/templates/external-system/deploy.js.hbs +5 -5
- package/templates/external-system/external-datasource.yaml.hbs +197 -118
- package/templates/infra/compose.yaml.hbs +33 -16
- package/templates/infra/servers.json.hbs +3 -1
- package/templates/python/docker-compose.hbs +16 -0
- package/templates/typescript/docker-compose.hbs +16 -0
- package/lib/api/external-test.api.js +0 -111
- package/lib/schema/env-config.yaml +0 -60
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Datasource E2E test
|
|
3
|
-
* @fileoverview Datasource E2E
|
|
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 {
|
|
16
|
-
const {
|
|
17
|
-
const {
|
|
18
|
-
const {
|
|
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]
|
|
27
|
-
* @returns {Promise<string|Object|null>}
|
|
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
|
-
|
|
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
|
-
*
|
|
60
|
-
* @
|
|
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
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
|
98
|
-
* @param {Object} options
|
|
99
|
-
* @param {
|
|
100
|
-
* @
|
|
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
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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:
|
|
145
|
+
primaryKeyValue: pk !== undefined && pk !== null,
|
|
146
|
+
minVectorHits: options.minVectorHits,
|
|
147
|
+
minProcessed: options.minProcessed,
|
|
148
|
+
minRecordCount: options.minRecordCount
|
|
135
149
|
};
|
|
136
150
|
|
|
137
|
-
const
|
|
138
|
-
dataplaneUrl,
|
|
151
|
+
const unifiedResult = await runUnifiedDatasourceValidation(
|
|
139
152
|
datasourceKey,
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
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
|
-
|
|
167
|
-
}
|
|
158
|
+
const display = e2eShapeFromEnvelope(unifiedResult.envelope);
|
|
159
|
+
Object.assign(display, { datasourceTestRun: unifiedResult.envelope });
|
|
168
160
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
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
|
|
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 {
|
|
15
|
-
const {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
*
|
|
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
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
*
|
|
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
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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.
|
|
80
|
-
* @param {
|
|
81
|
-
* @
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
const runMeta = {
|
|
125
|
+
apiError: unifiedResult.apiError,
|
|
126
|
+
pollTimedOut: unifiedResult.pollTimedOut,
|
|
127
|
+
incompleteNoAsync: unifiedResult.incompleteNoAsync
|
|
128
|
+
};
|
|
126
129
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
|
139
|
+
return early.body;
|
|
143
140
|
}
|
|
144
141
|
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
|
159
|
+
return legacy;
|
|
169
160
|
}
|
|
170
161
|
|
|
171
162
|
module.exports = {
|
|
172
163
|
runDatasourceTestIntegration,
|
|
173
|
-
getSystemKeyFromAppKey
|
|
164
|
+
getSystemKeyFromAppKey: getSystemKeyFromAppKeyExport,
|
|
165
|
+
findDatasourceFileByKey
|
|
174
166
|
};
|