qa360 2.2.1 → 2.2.13
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/CHANGELOG.md +28 -0
- package/README.md +79 -0
- package/cli/dist/cli-minimal.d.ts +6 -0
- package/cli/dist/cli-minimal.js +36 -0
- package/cli/dist/commands/ai.d.ts +43 -0
- package/cli/dist/commands/ai.js +616 -0
- package/cli/dist/commands/ask.d.ts +94 -0
- package/cli/dist/commands/ask.js +582 -0
- package/cli/dist/commands/coverage.d.ts +8 -0
- package/cli/dist/commands/coverage.js +252 -0
- package/cli/dist/commands/crawl.d.ts +24 -0
- package/cli/dist/commands/crawl.js +121 -0
- package/cli/dist/commands/doctor.d.ts +54 -0
- package/cli/dist/commands/doctor.js +513 -0
- package/cli/dist/commands/examples.d.ts +33 -0
- package/cli/dist/commands/examples.js +193 -0
- package/cli/dist/commands/explain.d.ts +27 -0
- package/cli/dist/commands/explain.js +630 -0
- package/cli/dist/commands/flakiness.d.ts +73 -0
- package/cli/dist/commands/flakiness.js +435 -0
- package/cli/dist/commands/generate.d.ts +66 -0
- package/cli/dist/commands/generate.js +438 -0
- package/cli/dist/commands/history.d.ts +76 -0
- package/cli/dist/commands/history.js +755 -0
- package/cli/dist/commands/init.d.ts +106 -0
- package/cli/dist/commands/init.js +616 -0
- package/cli/dist/commands/monitor.d.ts +27 -0
- package/cli/dist/commands/monitor.js +225 -0
- package/cli/dist/commands/ollama.d.ts +40 -0
- package/cli/dist/commands/ollama.js +346 -0
- package/cli/dist/commands/pack.d.ts +70 -0
- package/cli/dist/commands/pack.js +413 -0
- package/cli/dist/commands/regression.d.ts +8 -0
- package/cli/dist/commands/regression.js +340 -0
- package/cli/dist/commands/repair.d.ts +26 -0
- package/cli/dist/commands/repair.js +307 -0
- package/cli/dist/commands/report.d.ts +62 -0
- package/cli/dist/commands/report.js +378 -0
- package/cli/dist/commands/retry.d.ts +43 -0
- package/cli/dist/commands/retry.js +275 -0
- package/cli/dist/commands/run.d.ts +41 -0
- package/cli/dist/commands/run.js +171 -0
- package/cli/dist/commands/scan.d.ts +5 -0
- package/cli/dist/commands/scan.js +155 -0
- package/cli/dist/commands/secrets.d.ts +58 -0
- package/cli/dist/commands/secrets.js +289 -0
- package/cli/dist/commands/serve.d.ts +13 -0
- package/cli/dist/commands/serve.js +156 -0
- package/cli/dist/commands/slo.d.ts +8 -0
- package/cli/dist/commands/slo.js +327 -0
- package/cli/dist/commands/verify.d.ts +32 -0
- package/cli/dist/commands/verify.js +278 -0
- package/cli/dist/core/adapters/gitleaks-secrets.d.ts +114 -0
- package/cli/dist/core/adapters/gitleaks-secrets.js +410 -0
- package/cli/dist/core/adapters/jest-adapter.d.ts +44 -0
- package/cli/dist/core/adapters/jest-adapter.js +261 -0
- package/cli/dist/core/adapters/k6-perf.d.ts +85 -0
- package/cli/dist/core/adapters/k6-perf.js +398 -0
- package/cli/dist/core/adapters/osv-deps.d.ts +123 -0
- package/cli/dist/core/adapters/osv-deps.js +372 -0
- package/cli/dist/core/adapters/playwright-native-adapter.d.ts +121 -0
- package/cli/dist/core/adapters/playwright-native-adapter.js +339 -0
- package/cli/dist/core/adapters/playwright-native-api.d.ts +183 -0
- package/cli/dist/core/adapters/playwright-native-api.js +465 -0
- package/cli/dist/core/adapters/playwright-ui.d.ts +197 -0
- package/cli/dist/core/adapters/playwright-ui.js +864 -0
- package/cli/dist/core/adapters/pytest-adapter.d.ts +49 -0
- package/cli/dist/core/adapters/pytest-adapter.js +324 -0
- package/cli/dist/core/adapters/semgrep-sast.d.ts +99 -0
- package/cli/dist/core/adapters/semgrep-sast.js +322 -0
- package/cli/dist/core/adapters/unit-test-types.d.ts +119 -0
- package/cli/dist/core/adapters/unit-test-types.js +6 -0
- package/cli/dist/core/adapters/vitest-adapter.d.ts +46 -0
- package/cli/dist/core/adapters/vitest-adapter.js +272 -0
- package/cli/dist/core/adapters/zap-dast.d.ts +133 -0
- package/cli/dist/core/adapters/zap-dast.js +424 -0
- package/cli/dist/core/ai/anthropic-provider.d.ts +50 -0
- package/cli/dist/core/ai/anthropic-provider.js +223 -0
- package/cli/dist/core/ai/deepseek-provider.d.ts +81 -0
- package/cli/dist/core/ai/deepseek-provider.js +266 -0
- package/cli/dist/core/ai/index.d.ts +60 -0
- package/cli/dist/core/ai/index.js +18 -0
- package/cli/dist/core/ai/llm-client.d.ts +45 -0
- package/cli/dist/core/ai/llm-client.js +7 -0
- package/cli/dist/core/ai/mock-provider.d.ts +49 -0
- package/cli/dist/core/ai/mock-provider.js +121 -0
- package/cli/dist/core/ai/ollama-provider.d.ts +78 -0
- package/cli/dist/core/ai/ollama-provider.js +216 -0
- package/cli/dist/core/ai/openai-provider.d.ts +48 -0
- package/cli/dist/core/ai/openai-provider.js +200 -0
- package/cli/dist/core/ai/provider-factory.d.ts +160 -0
- package/cli/dist/core/ai/provider-factory.js +269 -0
- package/cli/dist/core/artifacts/index.d.ts +6 -0
- package/cli/dist/core/artifacts/index.js +6 -0
- package/cli/dist/core/artifacts/ui-artifacts.d.ts +133 -0
- package/cli/dist/core/artifacts/ui-artifacts.js +304 -0
- package/cli/dist/core/assertions/engine.d.ts +51 -0
- package/cli/dist/core/assertions/engine.js +530 -0
- package/cli/dist/core/assertions/index.d.ts +11 -0
- package/cli/dist/core/assertions/index.js +11 -0
- package/cli/dist/core/assertions/types.d.ts +121 -0
- package/cli/dist/core/assertions/types.js +37 -0
- package/cli/dist/core/auth/api-key-provider.d.ts +16 -0
- package/cli/dist/core/auth/api-key-provider.js +63 -0
- package/cli/dist/core/auth/aws-iam-provider.d.ts +35 -0
- package/cli/dist/core/auth/aws-iam-provider.js +177 -0
- package/cli/dist/core/auth/azure-ad-provider.d.ts +15 -0
- package/cli/dist/core/auth/azure-ad-provider.js +99 -0
- package/cli/dist/core/auth/basic-auth-provider.d.ts +26 -0
- package/cli/dist/core/auth/basic-auth-provider.js +111 -0
- package/cli/dist/core/auth/gcp-adc-provider.d.ts +27 -0
- package/cli/dist/core/auth/gcp-adc-provider.js +126 -0
- package/cli/dist/core/auth/index.d.ts +238 -0
- package/cli/dist/core/auth/index.js +82 -0
- package/cli/dist/core/auth/jwt-provider.d.ts +19 -0
- package/cli/dist/core/auth/jwt-provider.js +160 -0
- package/cli/dist/core/auth/manager.d.ts +84 -0
- package/cli/dist/core/auth/manager.js +230 -0
- package/cli/dist/core/auth/oauth2-provider.d.ts +17 -0
- package/cli/dist/core/auth/oauth2-provider.js +114 -0
- package/cli/dist/core/auth/totp-provider.d.ts +31 -0
- package/cli/dist/core/auth/totp-provider.js +134 -0
- package/cli/dist/core/auth/ui-login-provider.d.ts +26 -0
- package/cli/dist/core/auth/ui-login-provider.js +198 -0
- package/cli/dist/core/cache/index.d.ts +7 -0
- package/cli/dist/core/cache/index.js +6 -0
- package/cli/dist/core/cache/lru-cache.d.ts +203 -0
- package/cli/dist/core/cache/lru-cache.js +397 -0
- package/cli/dist/core/coverage/analyzer.d.ts +101 -0
- package/cli/dist/core/coverage/analyzer.js +415 -0
- package/cli/dist/core/coverage/collector.d.ts +74 -0
- package/cli/dist/core/coverage/collector.js +459 -0
- package/cli/dist/core/coverage/config.d.ts +37 -0
- package/cli/dist/core/coverage/config.js +156 -0
- package/cli/dist/core/coverage/index.d.ts +11 -0
- package/cli/dist/core/coverage/index.js +15 -0
- package/cli/dist/core/coverage/types.d.ts +267 -0
- package/cli/dist/core/coverage/types.js +6 -0
- package/cli/dist/core/coverage/vault.d.ts +95 -0
- package/cli/dist/core/coverage/vault.js +405 -0
- package/cli/dist/core/crawler/index.d.ts +57 -0
- package/cli/dist/core/crawler/index.js +281 -0
- package/cli/dist/core/crawler/journey-generator.d.ts +49 -0
- package/cli/dist/core/crawler/journey-generator.js +412 -0
- package/cli/dist/core/crawler/page-analyzer.d.ts +88 -0
- package/cli/dist/core/crawler/page-analyzer.js +709 -0
- package/cli/dist/core/crawler/selector-generator.d.ts +34 -0
- package/cli/dist/core/crawler/selector-generator.js +309 -0
- package/cli/dist/core/crawler/types.d.ts +353 -0
- package/cli/dist/core/crawler/types.js +6 -0
- package/cli/dist/core/dashboard/assets.d.ts +6 -0
- package/cli/dist/core/dashboard/assets.js +690 -0
- package/cli/dist/core/dashboard/index.d.ts +6 -0
- package/cli/dist/core/dashboard/index.js +5 -0
- package/cli/dist/core/dashboard/server.d.ts +72 -0
- package/cli/dist/core/dashboard/server.js +354 -0
- package/cli/dist/core/dashboard/types.d.ts +70 -0
- package/cli/dist/core/dashboard/types.js +5 -0
- package/cli/dist/core/discoverer/index.d.ts +115 -0
- package/cli/dist/core/discoverer/index.js +250 -0
- package/cli/dist/core/fixtures/index.d.ts +8 -0
- package/cli/dist/core/fixtures/index.js +8 -0
- package/cli/dist/core/fixtures/loader.d.ts +65 -0
- package/cli/dist/core/fixtures/loader.js +161 -0
- package/cli/dist/core/fixtures/resolver.d.ts +79 -0
- package/cli/dist/core/fixtures/resolver.js +181 -0
- package/cli/dist/core/fixtures/types.d.ts +75 -0
- package/cli/dist/core/fixtures/types.js +30 -0
- package/cli/dist/core/flakiness/index.d.ts +228 -0
- package/cli/dist/core/flakiness/index.js +384 -0
- package/cli/dist/core/generation/code-formatter.d.ts +111 -0
- package/cli/dist/core/generation/code-formatter.js +307 -0
- package/cli/dist/core/generation/code-generator.d.ts +144 -0
- package/cli/dist/core/generation/code-generator.js +293 -0
- package/cli/dist/core/generation/crawler-pack-generator.d.ts +44 -0
- package/cli/dist/core/generation/crawler-pack-generator.js +245 -0
- package/cli/dist/core/generation/generator.d.ts +40 -0
- package/cli/dist/core/generation/generator.js +76 -0
- package/cli/dist/core/generation/index.d.ts +32 -0
- package/cli/dist/core/generation/index.js +30 -0
- package/cli/dist/core/generation/pack-generator.d.ts +107 -0
- package/cli/dist/core/generation/pack-generator.js +416 -0
- package/cli/dist/core/generation/prompt-builder.d.ts +132 -0
- package/cli/dist/core/generation/prompt-builder.js +672 -0
- package/cli/dist/core/generation/source-analyzer.d.ts +213 -0
- package/cli/dist/core/generation/source-analyzer.js +657 -0
- package/cli/dist/core/generation/test-optimizer.d.ts +117 -0
- package/cli/dist/core/generation/test-optimizer.js +328 -0
- package/cli/dist/core/generation/types.d.ts +214 -0
- package/cli/dist/core/generation/types.js +4 -0
- package/cli/dist/core/hooks/compose.d.ts +61 -0
- package/cli/dist/core/hooks/compose.js +225 -0
- package/cli/dist/core/hooks/runner.d.ts +68 -0
- package/cli/dist/core/hooks/runner.js +303 -0
- package/cli/dist/core/index.d.ts +110 -0
- package/cli/dist/core/index.js +99 -0
- package/cli/dist/core/pack/migrator.d.ts +51 -0
- package/cli/dist/core/pack/migrator.js +304 -0
- package/cli/dist/core/pack/validator.d.ts +42 -0
- package/cli/dist/core/pack/validator.js +330 -0
- package/cli/dist/core/pack-v2/index.d.ts +9 -0
- package/cli/dist/core/pack-v2/index.js +8 -0
- package/cli/dist/core/pack-v2/loader.d.ts +63 -0
- package/cli/dist/core/pack-v2/loader.js +292 -0
- package/cli/dist/core/pack-v2/migrator.d.ts +62 -0
- package/cli/dist/core/pack-v2/migrator.js +505 -0
- package/cli/dist/core/pack-v2/validator.d.ts +65 -0
- package/cli/dist/core/pack-v2/validator.js +629 -0
- package/cli/dist/core/parallel/index.d.ts +6 -0
- package/cli/dist/core/parallel/index.js +6 -0
- package/cli/dist/core/parallel/parallel-runner.d.ts +107 -0
- package/cli/dist/core/parallel/parallel-runner.js +192 -0
- package/cli/dist/core/pom/base-page.d.ts +237 -0
- package/cli/dist/core/pom/base-page.js +354 -0
- package/cli/dist/core/pom/index.d.ts +22 -0
- package/cli/dist/core/pom/index.js +23 -0
- package/cli/dist/core/pom/loader.d.ts +118 -0
- package/cli/dist/core/pom/loader.js +382 -0
- package/cli/dist/core/pom/types.d.ts +112 -0
- package/cli/dist/core/pom/types.js +9 -0
- package/cli/dist/core/proof/bundle.d.ts +137 -0
- package/cli/dist/core/proof/bundle.js +160 -0
- package/cli/dist/core/proof/canonicalize.d.ts +47 -0
- package/cli/dist/core/proof/canonicalize.js +105 -0
- package/cli/dist/core/proof/index.d.ts +13 -0
- package/cli/dist/core/proof/index.js +18 -0
- package/cli/dist/core/proof/schema.d.ts +217 -0
- package/cli/dist/core/proof/schema.js +263 -0
- package/cli/dist/core/proof/signer.d.ts +111 -0
- package/cli/dist/core/proof/signer.js +226 -0
- package/cli/dist/core/proof/verifier.d.ts +97 -0
- package/cli/dist/core/proof/verifier.js +308 -0
- package/cli/dist/core/regression/detector.d.ts +107 -0
- package/cli/dist/core/regression/detector.js +497 -0
- package/cli/dist/core/regression/index.d.ts +9 -0
- package/cli/dist/core/regression/index.js +11 -0
- package/cli/dist/core/regression/trend-analyzer.d.ts +102 -0
- package/cli/dist/core/regression/trend-analyzer.js +345 -0
- package/cli/dist/core/regression/types.d.ts +222 -0
- package/cli/dist/core/regression/types.js +7 -0
- package/cli/dist/core/regression/vault.d.ts +87 -0
- package/cli/dist/core/regression/vault.js +289 -0
- package/cli/dist/core/repair/engine/fixer.d.ts +24 -0
- package/cli/dist/core/repair/engine/fixer.js +226 -0
- package/cli/dist/core/repair/engine/suggestion-engine.d.ts +18 -0
- package/cli/dist/core/repair/engine/suggestion-engine.js +187 -0
- package/cli/dist/core/repair/index.d.ts +10 -0
- package/cli/dist/core/repair/index.js +13 -0
- package/cli/dist/core/repair/repairer.d.ts +90 -0
- package/cli/dist/core/repair/repairer.js +284 -0
- package/cli/dist/core/repair/types.d.ts +91 -0
- package/cli/dist/core/repair/types.js +6 -0
- package/cli/dist/core/repair/utils/error-analyzer.d.ts +28 -0
- package/cli/dist/core/repair/utils/error-analyzer.js +264 -0
- package/cli/dist/core/reporting/html-reporter.d.ts +119 -0
- package/cli/dist/core/reporting/html-reporter.js +737 -0
- package/cli/dist/core/reporting/index.d.ts +6 -0
- package/cli/dist/core/reporting/index.js +6 -0
- package/cli/dist/core/retry/flakiness-integration.d.ts +60 -0
- package/cli/dist/core/retry/flakiness-integration.js +228 -0
- package/cli/dist/core/retry/index.d.ts +14 -0
- package/cli/dist/core/retry/index.js +16 -0
- package/cli/dist/core/retry/retry-engine.d.ts +80 -0
- package/cli/dist/core/retry/retry-engine.js +296 -0
- package/cli/dist/core/retry/types.d.ts +178 -0
- package/cli/dist/core/retry/types.js +52 -0
- package/cli/dist/core/retry/vault.d.ts +77 -0
- package/cli/dist/core/retry/vault.js +304 -0
- package/cli/dist/core/runner/e2e-helpers.d.ts +102 -0
- package/cli/dist/core/runner/e2e-helpers.js +153 -0
- package/cli/dist/core/runner/phase3-runner.d.ts +249 -0
- package/cli/dist/core/runner/phase3-runner.js +1323 -0
- package/cli/dist/core/schemas/pack.schema.json +236 -0
- package/cli/dist/core/secrets/crypto.d.ts +75 -0
- package/cli/dist/core/secrets/crypto.js +223 -0
- package/cli/dist/core/secrets/manager.d.ts +76 -0
- package/cli/dist/core/secrets/manager.js +219 -0
- package/cli/dist/core/security/redaction-patterns-extended.d.ts +27 -0
- package/cli/dist/core/security/redaction-patterns-extended.js +247 -0
- package/cli/dist/core/security/redactor.d.ts +71 -0
- package/cli/dist/core/security/redactor.js +279 -0
- package/cli/dist/core/self-healing/assertion-healer.d.ts +97 -0
- package/cli/dist/core/self-healing/assertion-healer.js +371 -0
- package/cli/dist/core/self-healing/engine.d.ts +122 -0
- package/cli/dist/core/self-healing/engine.js +538 -0
- package/cli/dist/core/self-healing/index.d.ts +10 -0
- package/cli/dist/core/self-healing/index.js +11 -0
- package/cli/dist/core/self-healing/selector-healer.d.ts +103 -0
- package/cli/dist/core/self-healing/selector-healer.js +372 -0
- package/cli/dist/core/self-healing/types.d.ts +152 -0
- package/cli/dist/core/self-healing/types.js +6 -0
- package/cli/dist/core/serve/diagnostics-collector.d.ts +32 -0
- package/cli/dist/core/serve/diagnostics-collector.js +149 -0
- package/cli/dist/core/serve/health-checker.d.ts +44 -0
- package/cli/dist/core/serve/health-checker.js +219 -0
- package/cli/dist/core/serve/index.d.ts +8 -0
- package/cli/dist/core/serve/index.js +8 -0
- package/cli/dist/core/serve/metrics-collector.d.ts +24 -0
- package/cli/dist/core/serve/metrics-collector.js +322 -0
- package/cli/dist/core/serve/process-manager.d.ts +36 -0
- package/cli/dist/core/serve/process-manager.js +213 -0
- package/cli/dist/core/serve/server.d.ts +36 -0
- package/cli/dist/core/serve/server.js +191 -0
- package/cli/dist/core/slo/config.d.ts +107 -0
- package/cli/dist/core/slo/config.js +360 -0
- package/cli/dist/core/slo/index.d.ts +11 -0
- package/cli/dist/core/slo/index.js +15 -0
- package/cli/dist/core/slo/sli-calculator.d.ts +92 -0
- package/cli/dist/core/slo/sli-calculator.js +364 -0
- package/cli/dist/core/slo/slo-tracker.d.ts +148 -0
- package/cli/dist/core/slo/slo-tracker.js +379 -0
- package/cli/dist/core/slo/types.d.ts +281 -0
- package/cli/dist/core/slo/types.js +7 -0
- package/cli/dist/core/slo/vault.d.ts +102 -0
- package/cli/dist/core/slo/vault.js +427 -0
- package/cli/dist/core/tui/index.d.ts +7 -0
- package/cli/dist/core/tui/index.js +6 -0
- package/cli/dist/core/tui/monitor.d.ts +92 -0
- package/cli/dist/core/tui/monitor.js +271 -0
- package/cli/dist/core/tui/renderer.d.ts +33 -0
- package/cli/dist/core/tui/renderer.js +218 -0
- package/cli/dist/core/tui/types.d.ts +63 -0
- package/cli/dist/core/tui/types.js +5 -0
- package/cli/dist/core/types/pack-v1.d.ts +251 -0
- package/cli/dist/core/types/pack-v1.js +5 -0
- package/cli/dist/core/types/pack-v2.d.ts +456 -0
- package/cli/dist/core/types/pack-v2.js +8 -0
- package/cli/dist/core/types/trust-score.d.ts +69 -0
- package/cli/dist/core/types/trust-score.js +191 -0
- package/cli/dist/core/vault/cas.d.ts +90 -0
- package/cli/dist/core/vault/cas.js +261 -0
- package/cli/dist/core/vault/index.d.ts +326 -0
- package/cli/dist/core/vault/index.js +1042 -0
- package/cli/dist/core/visual/index.d.ts +6 -0
- package/cli/dist/core/visual/index.js +6 -0
- package/cli/dist/core/visual/visual-regression.d.ts +113 -0
- package/cli/dist/core/visual/visual-regression.js +236 -0
- package/cli/dist/core/watch/index.d.ts +7 -0
- package/cli/dist/core/watch/index.js +6 -0
- package/cli/dist/core/watch/watch-mode.d.ts +213 -0
- package/cli/dist/core/watch/watch-mode.js +389 -0
- package/cli/dist/generators/index.d.ts +5 -0
- package/cli/dist/generators/index.js +5 -0
- package/cli/dist/generators/json-reporter.d.ts +10 -0
- package/cli/dist/generators/json-reporter.js +12 -0
- package/cli/dist/generators/test-generator.d.ts +18 -0
- package/cli/dist/generators/test-generator.js +78 -0
- package/cli/dist/index.d.ts +8 -0
- package/cli/dist/index.js +262 -0
- package/cli/dist/scanners/dom-scanner.d.ts +52 -0
- package/cli/dist/scanners/dom-scanner.js +296 -0
- package/cli/dist/scanners/index.d.ts +4 -0
- package/cli/dist/scanners/index.js +4 -0
- package/cli/dist/schemas/pack.schema.json +236 -0
- package/cli/dist/types/scan.d.ts +68 -0
- package/cli/dist/types/scan.js +4 -0
- package/cli/dist/utils/config.d.ts +35 -0
- package/cli/dist/utils/config.js +196 -0
- package/cli/package.json +1 -1
- package/package.json +26 -2
- package/.BETA_TESTING_FEEDBACK.md +0 -256
- package/.claude/settings.local.json +0 -154
- package/.editorconfig +0 -21
- package/.github/CODEOWNERS +0 -23
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -108
- package/.github/ISSUE_TEMPLATE/feedback_dx.yml +0 -121
- package/.github/dependabot.yml +0 -35
- package/.github/workflows/mcp-dx.yml +0 -106
- package/.github/workflows/release.yml +0 -26
- package/.github/workflows/test.yml +0 -93
- package/.nvmrc +0 -1
- package/.qa360/vault.db +0 -0
- package/.qa360/vault.db-shm +0 -0
- package/.qa360/vault.db-wal +0 -0
- package/.qa360-artifacts/.gitkeep +0 -0
- package/.qa360-artifacts/baselines/.gitkeep +0 -0
- package/.qa360-artifacts/cache/.gitkeep +0 -0
- package/.qa360-artifacts/reports/.gitkeep +0 -0
- package/.qa360-artifacts/screenshots/.gitkeep +0 -0
- package/.qa360-baselines/www_xyqo_ai.baseline.json +0 -33
- package/CODEOWNERS +0 -43
- package/NOVICE_USER_GUIDE.md +0 -272
- package/adapters/README.md +0 -46
- package/check-branches.sh +0 -32
- package/cli/.qa360/keys/ed25519.key +0 -1
- package/cli/.qa360/keys/ed25519.pub +0 -1
- package/cli/examples/README.md +0 -160
- package/cli/examples/accessibility.yml +0 -48
- package/cli/examples/api-basic.yml +0 -27
- package/cli/examples/complete.yml +0 -146
- package/cli/examples/crawler.yml +0 -38
- package/cli/examples/fullstack.yml +0 -78
- package/cli/examples/security.yml +0 -58
- package/cli/examples/ui-advanced.yml +0 -49
- package/cli/examples/ui-basic.yml +0 -24
- package/cli/scripts/bundle-for-npm.sh +0 -51
- package/cli/scripts/validate-package.js +0 -116
- package/cli/src/__tests__/commands/doctor.test.ts +0 -108
- package/cli/src/__tests__/index.test.ts +0 -15
- package/cli/src/cli-minimal.ts +0 -44
- package/cli/src/commands/__tests__/crawl.test.ts +0 -412
- package/cli/src/commands/__tests__/doctor-qa360-home.test.ts +0 -156
- package/cli/src/commands/__tests__/e2e-ui-tests.test.ts +0 -494
- package/cli/src/commands/__tests__/e2e.test.ts +0 -187
- package/cli/src/commands/__tests__/flakiness.test.ts +0 -528
- package/cli/src/commands/__tests__/generate.test.ts +0 -507
- package/cli/src/commands/__tests__/history.integration.test.ts +0 -358
- package/cli/src/commands/__tests__/history.test.ts +0 -433
- package/cli/src/commands/__tests__/monitor-realworld.test.ts +0 -199
- package/cli/src/commands/__tests__/monitor.test.ts +0 -81
- package/cli/src/commands/__tests__/ollama.test.ts +0 -529
- package/cli/src/commands/__tests__/repair.test.ts +0 -225
- package/cli/src/commands/__tests__/report.integration.test.ts +0 -167
- package/cli/src/commands/__tests__/report.test.ts +0 -294
- package/cli/src/commands/__tests__/report.vitest.ts +0 -288
- package/cli/src/commands/__tests__/retry.test.ts +0 -78
- package/cli/src/commands/__tests__/run.integration.test.ts +0 -240
- package/cli/src/commands/__tests__/run.test.ts +0 -346
- package/cli/src/commands/__tests__/run.vitest.ts +0 -301
- package/cli/src/commands/__tests__/secrets.test.ts +0 -114
- package/cli/src/commands/__tests__/serve.test.ts +0 -80
- package/cli/src/commands/__tests__/verify.test.ts +0 -103
- package/cli/src/commands/ai.ts +0 -702
- package/cli/src/commands/ask.ts +0 -678
- package/cli/src/commands/coverage.ts +0 -305
- package/cli/src/commands/crawl.ts +0 -155
- package/cli/src/commands/doctor.ts +0 -610
- package/cli/src/commands/examples.ts +0 -248
- package/cli/src/commands/explain.ts +0 -710
- package/cli/src/commands/flakiness.ts +0 -560
- package/cli/src/commands/generate.ts +0 -566
- package/cli/src/commands/history.ts +0 -914
- package/cli/src/commands/init.ts +0 -777
- package/cli/src/commands/monitor.ts +0 -270
- package/cli/src/commands/ollama.ts +0 -337
- package/cli/src/commands/pack.ts +0 -497
- package/cli/src/commands/regression.ts +0 -400
- package/cli/src/commands/repair.ts +0 -356
- package/cli/src/commands/report.ts +0 -463
- package/cli/src/commands/retry.ts +0 -380
- package/cli/src/commands/run.ts +0 -220
- package/cli/src/commands/scan.ts +0 -177
- package/cli/src/commands/secrets.ts +0 -340
- package/cli/src/commands/serve.ts +0 -194
- package/cli/src/commands/slo.ts +0 -387
- package/cli/src/commands/verify-temp-note.md +0 -11
- package/cli/src/commands/verify.ts +0 -322
- package/cli/src/generators/index.ts +0 -6
- package/cli/src/generators/json-reporter.ts +0 -15
- package/cli/src/generators/test-generator.ts +0 -90
- package/cli/src/index.ts +0 -289
- package/cli/src/scanners/dom-scanner.ts +0 -360
- package/cli/src/scanners/index.ts +0 -5
- package/cli/src/types/scan.ts +0 -84
- package/cli/src/utils/config.ts +0 -145
- package/cli/tsconfig.bundle.json +0 -12
- package/cli/tsconfig.json +0 -23
- package/cli/vitest.config.ts +0 -59
- package/core/src/__tests__/adapters-contract/adapters-contract.test.md +0 -156
- package/core/src/__tests__/index.test.ts +0 -31
- package/core/src/__tests__/integration/phase3.test.ts +0 -405
- package/core/src/__tests__/pack/validator.test.ts +0 -312
- package/core/src/__tests__/secrets/crypto.test.ts +0 -190
- package/core/src/__tests__/secrets/manager.test.ts +0 -316
- package/core/src/__tests__/security/redactor-phase3.test.ts +0 -233
- package/core/src/__tests__/serve/health-checker.test.ts +0 -155
- package/core/src/__tests__/serve/process-manager.test.ts +0 -213
- package/core/src/__tests__/serve/server.test.ts +0 -103
- package/core/src/__tests__/vault/cas.test.ts +0 -178
- package/core/src/__tests__/vault/vault.test.ts +0 -296
- package/core/src/adapters/__tests__/fixtures/jest-coverage.json +0 -8
- package/core/src/adapters/__tests__/fixtures/jest-results.json +0 -41
- package/core/src/adapters/__tests__/fixtures/pytest-junit.xml +0 -16
- package/core/src/adapters/__tests__/fixtures/vitest-coverage.json +0 -8
- package/core/src/adapters/__tests__/fixtures/vitest-results.json +0 -50
- package/core/src/adapters/__tests__/gitleaks-secrets.test.ts +0 -452
- package/core/src/adapters/__tests__/jest-adapter.test.ts +0 -276
- package/core/src/adapters/__tests__/k6-perf.test.ts +0 -538
- package/core/src/adapters/__tests__/osv-deps.test.ts +0 -471
- package/core/src/adapters/__tests__/playwright-native-api.test.ts +0 -792
- package/core/src/adapters/__tests__/playwright-ui-e2e.test.ts +0 -431
- package/core/src/adapters/__tests__/playwright-ui.test.ts +0 -1073
- package/core/src/adapters/__tests__/pytest-adapter.test.ts +0 -207
- package/core/src/adapters/__tests__/semgrep-sast.test.ts +0 -436
- package/core/src/adapters/__tests__/vitest-adapter.test.ts +0 -208
- package/core/src/adapters/__tests__/zap-dast.test.ts +0 -453
- package/core/src/adapters/gitleaks-secrets.ts +0 -521
- package/core/src/adapters/jest-adapter.ts +0 -306
- package/core/src/adapters/k6-perf.ts +0 -479
- package/core/src/adapters/osv-deps.ts +0 -467
- package/core/src/adapters/playwright-native-adapter.ts +0 -472
- package/core/src/adapters/playwright-native-api.ts +0 -619
- package/core/src/adapters/playwright-ui.ts +0 -1088
- package/core/src/adapters/pytest-adapter.ts +0 -472
- package/core/src/adapters/semgrep-sast.ts +0 -410
- package/core/src/adapters/unit-test-types.ts +0 -106
- package/core/src/adapters/vitest-adapter.ts +0 -295
- package/core/src/adapters/zap-dast.ts +0 -551
- package/core/src/ai/__tests__/deepseek-provider.test.ts +0 -586
- package/core/src/ai/__tests__/ollama-provider.test.ts +0 -641
- package/core/src/ai/anthropic-provider.ts +0 -262
- package/core/src/ai/deepseek-provider.ts +0 -315
- package/core/src/ai/index.ts +0 -87
- package/core/src/ai/llm-client.ts +0 -52
- package/core/src/ai/mock-provider.ts +0 -146
- package/core/src/ai/ollama-provider.ts +0 -269
- package/core/src/ai/openai-provider.ts +0 -240
- package/core/src/ai/provider-factory.ts +0 -408
- package/core/src/artifacts/README.md +0 -78
- package/core/src/artifacts/index.ts +0 -16
- package/core/src/artifacts/ui-artifacts.ts +0 -412
- package/core/src/assertions/__tests__/engine.test.ts +0 -360
- package/core/src/assertions/engine.ts +0 -577
- package/core/src/assertions/index.ts +0 -13
- package/core/src/assertions/types.ts +0 -229
- package/core/src/auth/__tests__/api-key-provider.test.ts +0 -282
- package/core/src/auth/__tests__/auth-manager.test.ts +0 -430
- package/core/src/auth/__tests__/basic-auth-provider.test.ts +0 -364
- package/core/src/auth/__tests__/cloud-providers.test.ts +0 -751
- package/core/src/auth/__tests__/jwt-provider.test.ts +0 -400
- package/core/src/auth/__tests__/oauth2-provider.test.ts +0 -383
- package/core/src/auth/__tests__/totp-provider.test.ts +0 -294
- package/core/src/auth/__tests__/ui-login-provider.test.ts +0 -323
- package/core/src/auth/api-key-provider.ts +0 -75
- package/core/src/auth/aws-iam-provider.ts +0 -212
- package/core/src/auth/azure-ad-provider.ts +0 -126
- package/core/src/auth/basic-auth-provider.ts +0 -133
- package/core/src/auth/gcp-adc-provider.ts +0 -146
- package/core/src/auth/index.ts +0 -342
- package/core/src/auth/jwt-provider.ts +0 -193
- package/core/src/auth/manager.ts +0 -281
- package/core/src/auth/oauth2-provider.ts +0 -141
- package/core/src/auth/totp-provider.ts +0 -163
- package/core/src/auth/ui-login-provider.ts +0 -242
- package/core/src/cache/__tests__/lru-cache.test.ts +0 -564
- package/core/src/cache/index.ts +0 -13
- package/core/src/cache/lru-cache.ts +0 -536
- package/core/src/crawler/__tests__/journey-generator.test.ts +0 -344
- package/core/src/crawler/__tests__/selector-generator.test.ts +0 -211
- package/core/src/crawler/index.ts +0 -335
- package/core/src/crawler/journey-generator.ts +0 -471
- package/core/src/crawler/page-analyzer.ts +0 -857
- package/core/src/crawler/selector-generator.ts +0 -280
- package/core/src/crawler/types.ts +0 -475
- package/core/src/dashboard/__tests__/real-world.test.ts +0 -430
- package/core/src/dashboard/__tests__/server.test.ts +0 -283
- package/core/src/dashboard/__tests__/types.test.ts +0 -208
- package/core/src/dashboard/assets.ts +0 -692
- package/core/src/dashboard/index.ts +0 -17
- package/core/src/dashboard/server.ts +0 -401
- package/core/src/dashboard/types.ts +0 -78
- package/core/src/discoverer/__tests__/test-discoverer.test.ts +0 -444
- package/core/src/discoverer/index.ts +0 -374
- package/core/src/fixtures/__tests__/loader.test.ts +0 -246
- package/core/src/fixtures/__tests__/resolver.test.ts +0 -334
- package/core/src/fixtures/index.ts +0 -9
- package/core/src/fixtures/loader.ts +0 -200
- package/core/src/fixtures/resolver.ts +0 -221
- package/core/src/fixtures/types.ts +0 -86
- package/core/src/flakiness/__tests__/flakiness.test.ts +0 -554
- package/core/src/flakiness/index.ts +0 -536
- package/core/src/generation/__tests__/code-formatter.test.ts +0 -170
- package/core/src/generation/__tests__/code-generator-contract.test.ts +0 -207
- package/core/src/generation/__tests__/code-generator.test.ts +0 -586
- package/core/src/generation/__tests__/crawler-pack-generator.test.ts +0 -479
- package/core/src/generation/__tests__/generation-e2e-b2bshop.test.ts +0 -718
- package/core/src/generation/__tests__/generation-integration.test.ts +0 -655
- package/core/src/generation/__tests__/pack-generator.test.ts +0 -408
- package/core/src/generation/__tests__/prompt-builder.test.ts +0 -200
- package/core/src/generation/__tests__/real-provider-integration.test.ts +0 -414
- package/core/src/generation/__tests__/source-analyzer.test.ts +0 -774
- package/core/src/generation/__tests__/test-optimizer.test.ts +0 -255
- package/core/src/generation/code-formatter.ts +0 -408
- package/core/src/generation/code-generator.ts +0 -470
- package/core/src/generation/crawler-pack-generator.ts +0 -289
- package/core/src/generation/generator.ts +0 -113
- package/core/src/generation/index.ts +0 -59
- package/core/src/generation/pack-generator.ts +0 -527
- package/core/src/generation/prompt-builder.ts +0 -772
- package/core/src/generation/source-analyzer.ts +0 -830
- package/core/src/generation/test-optimizer.ts +0 -474
- package/core/src/generation/types.ts +0 -217
- package/core/src/hooks/__tests__/compose.test.ts +0 -636
- package/core/src/hooks/__tests__/runner.test.ts +0 -478
- package/core/src/hooks/compose.ts +0 -268
- package/core/src/hooks/runner.ts +0 -364
- package/core/src/index.ts +0 -255
- package/core/src/pack/__tests__/migrator.test.ts +0 -594
- package/core/src/pack/__tests__/validator.test.ts +0 -759
- package/core/src/pack/migrator.ts +0 -353
- package/core/src/pack/validator.ts +0 -359
- package/core/src/pack-v2/__tests__/loader.test.ts +0 -533
- package/core/src/pack-v2/__tests__/migrator.test.ts +0 -455
- package/core/src/pack-v2/__tests__/validator.test.ts +0 -609
- package/core/src/pack-v2/index.ts +0 -41
- package/core/src/pack-v2/loader.ts +0 -358
- package/core/src/pack-v2/migrator.ts +0 -540
- package/core/src/pack-v2/validator.ts +0 -731
- package/core/src/parallel/README.md +0 -143
- package/core/src/parallel/index.ts +0 -16
- package/core/src/parallel/parallel-runner.ts +0 -282
- package/core/src/pom/__tests__/loader.test.ts +0 -378
- package/core/src/pom/base-page.ts +0 -425
- package/core/src/pom/index.ts +0 -45
- package/core/src/pom/loader.ts +0 -480
- package/core/src/pom/types.ts +0 -146
- package/core/src/proof/__tests__/proof-roundtrip.test.ts +0 -149
- package/core/src/proof/__tests__/schema-validation-manual.mjs +0 -211
- package/core/src/proof/__tests__/schema-validation.test.ts +0 -336
- package/core/src/proof/__tests__/signer.test.ts +0 -486
- package/core/src/proof/__tests__/temporal-regression.test.ts +0 -537
- package/core/src/proof/__tests__/verifier-advanced.test.ts +0 -588
- package/core/src/proof/__tests__/verifier.test.ts +0 -413
- package/core/src/proof/bundle.ts +0 -290
- package/core/src/proof/canonicalize.ts +0 -116
- package/core/src/proof/index.ts +0 -74
- package/core/src/proof/schema.ts +0 -285
- package/core/src/proof/signer.ts +0 -293
- package/core/src/proof/verifier.ts +0 -380
- package/core/src/regression/__tests__/detector.test.ts +0 -396
- package/core/src/regression/__tests__/trend-analyzer.test.ts +0 -300
- package/core/src/regression/detector.ts +0 -629
- package/core/src/regression/index.ts +0 -34
- package/core/src/regression/trend-analyzer.ts +0 -468
- package/core/src/regression/types.ts +0 -295
- package/core/src/regression/vault.ts +0 -419
- package/core/src/repair/__tests__/repairer.test.ts +0 -572
- package/core/src/repair/__tests__/types.test.ts +0 -302
- package/core/src/repair/engine/__tests__/fixer.test.ts +0 -482
- package/core/src/repair/engine/__tests__/suggestion-engine.test.ts +0 -395
- package/core/src/repair/engine/fixer.ts +0 -271
- package/core/src/repair/engine/suggestion-engine.ts +0 -234
- package/core/src/repair/index.ts +0 -53
- package/core/src/repair/repairer.ts +0 -376
- package/core/src/repair/types.ts +0 -119
- package/core/src/repair/utils/__tests__/error-analyzer.test.ts +0 -454
- package/core/src/repair/utils/error-analyzer.ts +0 -308
- package/core/src/reporting/README.md +0 -144
- package/core/src/reporting/html-reporter.ts +0 -835
- package/core/src/reporting/index.ts +0 -16
- package/core/src/retry/README.md +0 -192
- package/core/src/retry/__tests__/flakiness-integration.test.ts +0 -475
- package/core/src/retry/__tests__/retry-engine.test.ts +0 -424
- package/core/src/retry/flakiness-integration.ts +0 -267
- package/core/src/retry/index.ts +0 -48
- package/core/src/retry/retry-engine.ts +0 -368
- package/core/src/retry/types.ts +0 -208
- package/core/src/retry/vault.ts +0 -413
- package/core/src/runner/__tests__/flakiness-integration.test.ts +0 -566
- package/core/src/runner/__tests__/phase3-e2e-b2bshop.test.ts +0 -218
- package/core/src/runner/__tests__/phase3-e2e-reqres.test.ts +0 -199
- package/core/src/runner/__tests__/phase3-runner.test.ts +0 -1118
- package/core/src/runner/e2e-helpers.ts +0 -216
- package/core/src/runner/phase3-runner.ts +0 -1536
- package/core/src/schemas/gherkin-report.json +0 -122
- package/core/src/secrets/__tests__/crypto.test.ts +0 -180
- package/core/src/secrets/crypto.ts +0 -289
- package/core/src/secrets/manager.ts +0 -272
- package/core/src/security/__tests__/hardening.test.ts +0 -480
- package/core/src/security/redaction-patterns-extended.ts +0 -278
- package/core/src/security/redactor.ts +0 -326
- package/core/src/self-healing/assertion-healer.ts +0 -485
- package/core/src/self-healing/engine.ts +0 -626
- package/core/src/self-healing/index.ts +0 -33
- package/core/src/self-healing/selector-healer.ts +0 -488
- package/core/src/self-healing/types.ts +0 -193
- package/core/src/serve/diagnostics-collector.ts +0 -201
- package/core/src/serve/health-checker.ts +0 -274
- package/core/src/serve/index.ts +0 -9
- package/core/src/serve/metrics-collector.ts +0 -386
- package/core/src/serve/process-manager.ts +0 -265
- package/core/src/serve/server.ts +0 -230
- package/core/src/slo/config.ts +0 -408
- package/core/src/slo/index.ts +0 -68
- package/core/src/slo/sli-calculator.ts +0 -474
- package/core/src/slo/slo-tracker.ts +0 -481
- package/core/src/slo/types.ts +0 -408
- package/core/src/slo/vault.ts +0 -600
- package/core/src/tui/__tests__/monitor.test.ts +0 -336
- package/core/src/tui/__tests__/real-world.test.ts +0 -376
- package/core/src/tui/__tests__/renderer.test.ts +0 -201
- package/core/src/tui/__tests__/types.test.ts +0 -295
- package/core/src/tui/index.ts +0 -19
- package/core/src/tui/monitor.ts +0 -331
- package/core/src/tui/renderer.ts +0 -269
- package/core/src/tui/types.ts +0 -68
- package/core/src/types/pack-v1.ts +0 -305
- package/core/src/types/pack-v2.ts +0 -525
- package/core/src/types/trust-score.ts +0 -258
- package/core/src/vault/__tests__/flakiness-vault.test.ts +0 -562
- package/core/src/vault/__tests__/vault.test.ts +0 -259
- package/core/src/vault/cas.ts +0 -323
- package/core/src/vault/index.ts +0 -1361
- package/core/src/vault/schema.sql +0 -168
- package/core/src/visual/README.md +0 -185
- package/core/src/visual/index.ts +0 -14
- package/core/src/visual/visual-regression.ts +0 -347
- package/core/src/watch/__tests__/watch-mode.test.ts +0 -192
- package/core/src/watch/index.ts +0 -14
- package/core/src/watch/watch-mode.ts +0 -565
- package/core/tsconfig.json +0 -12
- package/core/vitest.config.ts +0 -52
- package/docs/ARCHITECTURE.md +0 -901
- package/docs/AUDIT-GLOBAL-DEC2025.md +0 -271
- package/docs/BETA_TESTING.md +0 -257
- package/docs/BETA_TESTING_PLAN.md +0 -727
- package/docs/CERTIFICATION-REPORT.md +0 -142
- package/docs/COMPLETE_AUDIT_REFACTORING.md +0 -965
- package/docs/DEVELOPMENT.md +0 -545
- package/docs/DEVELOPMENT_HISTORY.md +0 -345
- package/docs/LIMITATIONS.md +0 -176
- package/docs/MIGRATION.md +0 -303
- package/docs/OPTION_3_4_EXPLORATION.md +0 -1257
- package/docs/PHASE1_PERFORMANCE.md +0 -144
- package/docs/QA360_Cloud.postman_collection.json +0 -89
- package/docs/QA360_TESTING_PHILOSOPHY.md +0 -769
- package/docs/QA_TEST_PLAN.md +0 -727
- package/docs/README.md +0 -50
- package/docs/STATUS.md +0 -198
- package/docs/STRATEGIC_STUDY_GOOSE_INTEGRATION.md +0 -615
- package/docs/USER_GUIDE.md +0 -687
- package/docs/WORK-DONE-ADAPTER-TESTS.md +0 -136
- package/docs/adapters-security.md +0 -485
- package/docs/architecture-diagram.mmd +0 -168
- package/docs/archive/ARCH-01-DAY6-BUILD-FIXES.md +0 -396
- package/docs/archive/ARCH-01-DAY6-FINAL-STATUS.md +0 -324
- package/docs/archive/ARCH-01_MCP_MERGE_ANALYSIS.md +0 -644
- package/docs/archive/ARCH-01_NEXT_STEPS.md +0 -60
- package/docs/archive/BRANCH_PROTECTION.md +0 -183
- package/docs/archive/CI_LOCKDOWN_CHECKLIST.md +0 -222
- package/docs/archive/HANDOFF_TEST-01.md +0 -669
- package/docs/archive/LEGAL_READY_PLACEHOLDERS.md +0 -372
- package/docs/archive/NODE_UPGRADE_GUIDE.md +0 -188
- package/docs/archive/PHASE1_COMPLETION.md +0 -386
- package/docs/archive/PHASE2_COMPLETION.md +0 -404
- package/docs/archive/PHASE3_AND_4_FINAL.md +0 -360
- package/docs/archive/PHASE3_COMPLETE.md +0 -301
- package/docs/archive/PHASE3_STATUS.md +0 -255
- package/docs/archive/PRE-WEEK2-AUDIT.md +0 -364
- package/docs/archive/README.md +0 -16
- package/docs/archive/SCHEMA_AJV_2020_FIX.md +0 -245
- package/docs/archive/TEST-01_AUDIT_REPORT.md +0 -240
- package/docs/archive/TEST-01_COVERAGE_PLAN.md +0 -423
- package/docs/archive/obsolete-proposals/dom-element-discovery-mode.md +0 -250
- package/docs/archive/obsolete-proposals/qa360-comprehensive-test-plan.md +0 -1249
- package/docs/archive/obsolete-proposals/qa360-quick-start-guide.md +0 -298
- package/docs/archive/obsolete-proposals/technical-plan-dom-discovery.md +0 -870
- package/docs/budgets-advanced.md +0 -308
- package/docs/examples/history-export-gc.md +0 -285
- package/docs/examples/pack-v2-complete.yaml +0 -158
- package/docs/examples/pack-v2-quickstart.yaml +0 -24
- package/docs/examples/pack-v2-ui-login.yaml +0 -81
- package/docs/examples/qa360-report.json +0 -50
- package/docs/history.md +0 -565
- package/docs/hooks.md +0 -304
- package/docs/llm-providers.md +0 -512
- package/docs/mcp-server.md +0 -651
- package/docs/mcp-tools.md +0 -1131
- package/docs/pack-v1.md +0 -383
- package/docs/pack-v2.md +0 -558
- package/docs/page-objects.md +0 -366
- package/docs/proofs.md +0 -670
- package/docs/quickstart-5min.md +0 -257
- package/docs/readiness-ci.md +0 -654
- package/docs/rfc/README.md +0 -20
- package/docs/rfc/proof-bundle-v1.md +0 -787
- package/docs/secrets.md +0 -392
- package/docs/serve.md +0 -494
- package/docs/unit-test-adapters.md +0 -168
- package/docs/vault.md +0 -491
- package/e2e/qa360-e2e.test.ts +0 -696
- package/e2e/vitest.config.ts +0 -18
- package/examples/README.md +0 -50
- package/examples/ci/docker-compose-serve.yml +0 -375
- package/examples/ci/github-actions-serve.yml +0 -345
- package/examples/ci/gitlab-ci-serve.yml +0 -407
- package/examples/datasets/README.md +0 -101
- package/examples/datasets/b2bshop.ts +0 -155
- package/examples/datasets/index.ts +0 -57
- package/examples/datasets/reqres.ts +0 -195
- package/examples/fixtures-demo/fixtures/users.yml +0 -39
- package/examples/fixtures-demo/pack.yml +0 -71
- package/examples/future-api/README.md +0 -16
- package/examples/future-api/diag.js +0 -7
- package/examples/future-api/health.js +0 -4
- package/examples/future-api/packs.js +0 -13
- package/examples/future-api/runpack.js +0 -10
- package/examples/generation/README.md +0 -148
- package/examples/generation/pack-generator-example.js +0 -115
- package/examples/generation/source-analyzer-example.js +0 -115
- package/examples/httpbin/pack.yml +0 -59
- package/examples/load-testing/mcp-load.yml +0 -115
- package/examples/load-testing/mcp-stdio.yml +0 -95
- package/examples/mcp/claude-desktop-config.json +0 -33
- package/examples/mcp/claude-desktop.json +0 -16
- package/examples/mcp/conversation-sample.md +0 -131
- package/examples/mcp/demo-60s.md +0 -330
- package/examples/mcp/sample-conversation.jsonl +0 -21
- package/examples/mcp/vscode-settings.json +0 -22
- package/examples/pack-v2-complete.yml +0 -242
- package/examples/pack-v2-examples.md +0 -244
- package/examples/pack-v2-quickstart.yml +0 -55
- package/examples/packs-business/ecommerce-api.yml +0 -121
- package/examples/packs-business/saas-dashboard-ui.yml +0 -133
- package/examples/packs-conformance/compose-multi.yml +0 -174
- package/examples/packs-conformance/full.yml +0 -152
- package/examples/packs-conformance/heavy-artifacts.yml +0 -152
- package/examples/packs-conformance/minimal.yml +0 -71
- package/examples/packs-conformance/secrets-missing.yml +0 -97
- package/examples/packs-conformance/timeouts.yml +0 -77
- package/examples/pom-demo/README.md +0 -104
- package/examples/pom-demo/pack.yml +0 -60
- package/examples/pom-demo/pages/DashboardPage.page.ts +0 -73
- package/examples/pom-demo/pages/LoginPage.page.ts +0 -76
- package/examples/proofs/e2e-playwright-proof.json +0 -75
- package/examples/proofs/httpbin-proof.json +0 -69
- package/examples/proofs/multi-adapter-proof.json +0 -117
- package/examples/proofs/test-proof.json +0 -26
- package/examples/restful-api-dev/README.md +0 -102
- package/examples/restful-api-dev/restful-api-advanced.yml +0 -29
- package/examples/restful-api-dev/restful-api-basic.yml +0 -29
- package/examples/web-lite/.github/workflows/qa360-phase3.yml +0 -73
- package/examples/web-lite/api-mock/server.js +0 -258
- package/examples/web-lite/pack.yml +0 -71
- package/examples/web-lite/services.yml +0 -43
- package/examples/web-lite/web-content/healthz +0 -1
- package/examples/web-lite/web-content/index.html +0 -259
- package/packages/mcp/CHANGELOG.md +0 -109
- package/packages/mcp/IMPLEMENTATION_SUMMARY.md +0 -350
- package/packages/mcp/LICENSE +0 -21
- package/packages/mcp/QUICK_START.md +0 -291
- package/packages/mcp/README.md +0 -294
- package/packages/mcp/TELEMETRY.md +0 -220
- package/packages/mcp/package.json +0 -91
- package/packages/mcp/scripts/generate-sbom-fallback.cjs +0 -84
- package/packages/mcp/scripts/safe-postinstall.cjs +0 -32
- package/packages/mcp/src/__tests__/contract.test.ts +0 -902
- package/packages/mcp/src/cli/cli.ts +0 -137
- package/packages/mcp/src/cli/doctor.ts +0 -286
- package/packages/mcp/src/cli/fix.ts +0 -99
- package/packages/mcp/src/cli/init.ts +0 -233
- package/packages/mcp/src/cli/postinstall.ts +0 -14
- package/packages/mcp/src/cli/reset.ts +0 -44
- package/packages/mcp/src/cli/telemetry.ts +0 -166
- package/packages/mcp/src/cli/test-dx.ts +0 -94
- package/packages/mcp/src/cli/uninstall.ts +0 -80
- package/packages/mcp/src/cli/up.ts +0 -178
- package/packages/mcp/src/index.ts +0 -12
- package/packages/mcp/src/scripts/e2e-local.ts +0 -337
- package/packages/mcp/src/scripts/verify-settings.ts +0 -242
- package/packages/mcp/src/security/audit.ts +0 -244
- package/packages/mcp/src/security/manager.ts +0 -242
- package/packages/mcp/src/server/full-server.ts +0 -212
- package/packages/mcp/src/server/minimal-server.ts +0 -134
- package/packages/mcp/src/tools/history.ts +0 -388
- package/packages/mcp/src/tools/pack.ts +0 -449
- package/packages/mcp/src/tools/registry.ts +0 -638
- package/packages/mcp/src/tools/report.ts +0 -100
- package/packages/mcp/src/tools/run.ts +0 -268
- package/packages/mcp/src/tools/secrets.ts +0 -198
- package/packages/mcp/src/tools/serve.ts +0 -221
- package/packages/mcp/src/tools/triage.ts +0 -532
- package/packages/mcp/src/tools/types.ts +0 -26
- package/packages/mcp/src/tools/vault.ts +0 -164
- package/packages/mcp/src/tools/verify.ts +0 -166
- package/packages/mcp/src/types/index.ts +0 -311
- package/packages/mcp/src/types/mcp-stubs.ts +0 -83
- package/packages/mcp/tsconfig.json +0 -16
- package/playwright.config.ts +0 -20
- package/pnpm-workspace.yaml +0 -4
- package/run-test-and-push.sh +0 -20
- package/scripts/build-proof-cli.sh +0 -110
- package/scripts/ci/check-windows-paths.js +0 -92
- package/scripts/ci/invariants.sh +0 -124
- package/scripts/ci/make-final-bundle.js +0 -106
- package/scripts/ci/mcp-run-multipack.js +0 -305
- package/scripts/ci/run-pack-suite.sh +0 -103
- package/scripts/ci/run-phase7-final.sh +0 -190
- package/scripts/ci/slo-assert.js +0 -158
- package/scripts/ci/test-fault-tolerance.sh +0 -301
- package/scripts/install-mcp.sh +0 -66
- package/scripts/mcp-smoke.mjs +0 -27
- package/scripts/smoke.sh +0 -26
- package/scripts/stress-test.js +0 -288
- package/scripts/sync-version.mjs +0 -50
- package/scripts/validate-examples.mjs +0 -404
- package/scripts/validation/simple-pack-check.sh +0 -51
- package/scripts/validation/validate-universal-pack.mjs +0 -77
- package/scripts/verify-persistence.js +0 -127
- package/test-pack.yaml +0 -43
- package/test-results/.last-run.json +0 -4
- package/test-runner.mjs +0 -87
- package/tests/artifacts.spec.js +0 -147
- package/tests/contracts.spec.js +0 -239
- package/tests/e2e/assertions.test.mjs +0 -370
- package/tests/e2e/crawler.test.mjs +0 -451
- package/tests/e2e/playwright-plus-plus.test.mjs +0 -604
- package/tests/e2e/proof-bundle.test.mjs +0 -258
- package/tests/e2e/real-world/saucedemo.test.mjs +0 -714
- package/tests/e2e/real-world/the-internet-herokuapp.test.mjs +0 -760
- package/tests/e2e/ui-actions.test.mjs +0 -546
- package/tests/gherkin.e2e.spec.ts +0 -310
- package/tests/no-console-errors.spec.js +0 -136
- package/tests/pdf.spec.ts +0 -252
- package/tests/run-pack.spec.ts +0 -58
- package/tsconfig.base.json +0 -15
- package/tsconfig.build.json +0 -8
- package/tsconfig.json +0 -37
- package/tsconfig.test.json +0 -18
- package/typedoc.json +0 -37
- package/ui/README.md +0 -50
- package/verify-proof.mjs +0 -60
|
@@ -1,760 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* QA360 Real-World E2E Tests - The Internet (Herokuapp)
|
|
4
|
-
*
|
|
5
|
-
* Tests on https://the-internet.herokuapp.com/
|
|
6
|
-
* This is a popular testing site with many interactive elements.
|
|
7
|
-
*
|
|
8
|
-
* Usage: node tests/e2e/real-world/the-internet-herokuapp.test.mjs
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { chromium } from '@playwright/test';
|
|
12
|
-
import { join, dirname } from 'path';
|
|
13
|
-
import { fileURLToPath } from 'url';
|
|
14
|
-
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
-
const __dirname = dirname(__filename);
|
|
17
|
-
|
|
18
|
-
// Test utilities
|
|
19
|
-
let testsPassed = 0;
|
|
20
|
-
let testsFailed = 0;
|
|
21
|
-
|
|
22
|
-
// Timeout configuration for real-world tests (network can be slow)
|
|
23
|
-
const TIMEOUTS = {
|
|
24
|
-
default: 10000, // 10s for normal operations
|
|
25
|
-
navigation: 15000, // 15s for page loads
|
|
26
|
-
network: 20000, // 20s for network idle
|
|
27
|
-
dialog: 5000, // 5s for dialogs
|
|
28
|
-
short: 3000, // 3s for quick transitions
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
function log(message, type = 'info') {
|
|
32
|
-
const colors = {
|
|
33
|
-
info: '\x1b[36m',
|
|
34
|
-
success: '\x1b[32m',
|
|
35
|
-
error: '\x1b[31m',
|
|
36
|
-
warning: '\x1b[33m',
|
|
37
|
-
dim: '\x1b[90m',
|
|
38
|
-
};
|
|
39
|
-
const reset = '\x1b[0m';
|
|
40
|
-
console.log(`${colors[type] || ''}${message}${reset}`);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function assert(condition, message) {
|
|
44
|
-
if (condition) {
|
|
45
|
-
testsPassed++;
|
|
46
|
-
log(` OK ${message}`, 'success');
|
|
47
|
-
} else {
|
|
48
|
-
testsFailed++;
|
|
49
|
-
log(` FAIL ${message}`, 'error');
|
|
50
|
-
throw new Error(`Assertion failed: ${message}`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function assertEqual(actual, expected, message) {
|
|
55
|
-
if (actual === expected) {
|
|
56
|
-
testsPassed++;
|
|
57
|
-
log(` OK ${message}`, 'success');
|
|
58
|
-
} else {
|
|
59
|
-
testsFailed++;
|
|
60
|
-
log(` FAIL ${message}`, 'error');
|
|
61
|
-
log(` Expected: "${expected}"`, 'dim');
|
|
62
|
-
log(` Got: "${actual}"`, 'dim');
|
|
63
|
-
throw new Error(`Assertion failed: ${message}`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function assertContains(haystack, needle, message) {
|
|
68
|
-
if (haystack.includes(needle)) {
|
|
69
|
-
testsPassed++;
|
|
70
|
-
log(` OK ${message}`, 'success');
|
|
71
|
-
} else {
|
|
72
|
-
testsFailed++;
|
|
73
|
-
log(` FAIL ${message}`, 'error');
|
|
74
|
-
log(` Expected to contain: "${needle}"`, 'dim');
|
|
75
|
-
log(` In: "${haystack}"`, 'dim');
|
|
76
|
-
throw new Error(`Assertion failed: ${message}`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const BASE_URL = 'https://the-internet.herokuapp.com';
|
|
81
|
-
|
|
82
|
-
// ============================================================================
|
|
83
|
-
// TESTS
|
|
84
|
-
// ============================================================================
|
|
85
|
-
|
|
86
|
-
async function testHomePageLoads() {
|
|
87
|
-
log('\n[Test 1] Home page loads', 'info');
|
|
88
|
-
|
|
89
|
-
const browser = await chromium.launch({ headless: true });
|
|
90
|
-
const context = await browser.newContext();
|
|
91
|
-
const page = await context.newPage();
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
await page.goto(BASE_URL);
|
|
95
|
-
const title = await page.title();
|
|
96
|
-
assertEqual(title, 'The Internet', 'Page title is correct');
|
|
97
|
-
|
|
98
|
-
const heading = await page.textContent('h1');
|
|
99
|
-
assertContains(heading || '', 'Welcome to', 'Main heading is correct');
|
|
100
|
-
|
|
101
|
-
// Check that examples list exists
|
|
102
|
-
const examples = await page.locator('#content ul li').count();
|
|
103
|
-
assert(examples > 0, `Examples list has ${examples} items`);
|
|
104
|
-
|
|
105
|
-
} finally {
|
|
106
|
-
await browser.close();
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
async function testCheckboxes() {
|
|
111
|
-
log('\n[Test 2] Checkboxes interaction', 'info');
|
|
112
|
-
|
|
113
|
-
const browser = await chromium.launch({ headless: true });
|
|
114
|
-
const context = await browser.newContext();
|
|
115
|
-
const page = await context.newPage();
|
|
116
|
-
|
|
117
|
-
try {
|
|
118
|
-
await page.goto(`${BASE_URL}/checkboxes`);
|
|
119
|
-
|
|
120
|
-
// Wait for checkboxes to load
|
|
121
|
-
await page.waitForSelector('input[type="checkbox"]');
|
|
122
|
-
|
|
123
|
-
const checkboxes = await page.locator('input[type="checkbox"]').count();
|
|
124
|
-
assertEqual(checkboxes, 2, 'There are 2 checkboxes');
|
|
125
|
-
|
|
126
|
-
// Check first checkbox
|
|
127
|
-
await page.check('input[type="checkbox"]:first-child');
|
|
128
|
-
let isChecked1 = await page.isChecked('input[type="checkbox"]:first-child');
|
|
129
|
-
assert(isChecked1, 'First checkbox is checked');
|
|
130
|
-
|
|
131
|
-
// Uncheck first checkbox
|
|
132
|
-
await page.uncheck('input[type="checkbox"]:first-child');
|
|
133
|
-
isChecked1 = await page.isChecked('input[type="checkbox"]:first-child');
|
|
134
|
-
assert(!isChecked1, 'First checkbox is unchecked');
|
|
135
|
-
|
|
136
|
-
// Check second checkbox
|
|
137
|
-
await page.check('input[type="checkbox"]:last-child');
|
|
138
|
-
const isChecked2 = await page.isChecked('input[type="checkbox"]:last-child');
|
|
139
|
-
assert(isChecked2, 'Second checkbox is checked');
|
|
140
|
-
|
|
141
|
-
} finally {
|
|
142
|
-
await browser.close();
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
async function testDropdown() {
|
|
147
|
-
log('\n[Test 3] Dropdown list interaction', 'info');
|
|
148
|
-
|
|
149
|
-
const browser = await chromium.launch({ headless: true });
|
|
150
|
-
const context = await browser.newContext();
|
|
151
|
-
const page = await context.newPage();
|
|
152
|
-
|
|
153
|
-
try {
|
|
154
|
-
await page.goto(`${BASE_URL}/dropdown`);
|
|
155
|
-
|
|
156
|
-
const dropdown = page.locator('#dropdown');
|
|
157
|
-
await dropdown.waitFor();
|
|
158
|
-
|
|
159
|
-
// Select option 1
|
|
160
|
-
await dropdown.selectOption('1');
|
|
161
|
-
let value = await dropdown.inputValue();
|
|
162
|
-
assertEqual(value, '1', 'Selected option 1');
|
|
163
|
-
|
|
164
|
-
// Select option 2
|
|
165
|
-
await dropdown.selectOption('2');
|
|
166
|
-
value = await dropdown.inputValue();
|
|
167
|
-
assertEqual(value, '2', 'Selected option 2');
|
|
168
|
-
|
|
169
|
-
// Check all options exist
|
|
170
|
-
const options = await dropdown.locator('option').count();
|
|
171
|
-
assertEqual(options, 3, 'Dropdown has 3 options (Please select, Option 1, Option 2)');
|
|
172
|
-
|
|
173
|
-
} finally {
|
|
174
|
-
await browser.close();
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
async function testInputs() {
|
|
179
|
-
log('\n[Test 4] Input field interaction', 'info');
|
|
180
|
-
|
|
181
|
-
const browser = await chromium.launch({ headless: true });
|
|
182
|
-
const context = await browser.newContext();
|
|
183
|
-
const page = await context.newPage();
|
|
184
|
-
|
|
185
|
-
try {
|
|
186
|
-
await page.goto(`${BASE_URL}/inputs`);
|
|
187
|
-
|
|
188
|
-
const input = page.locator('input[type="number"]');
|
|
189
|
-
await input.waitFor();
|
|
190
|
-
|
|
191
|
-
// Type a number
|
|
192
|
-
await input.fill('123');
|
|
193
|
-
let value = await input.inputValue();
|
|
194
|
-
assertEqual(value, '123', 'Input value is 123');
|
|
195
|
-
|
|
196
|
-
// Clear and type another number
|
|
197
|
-
await input.fill('456');
|
|
198
|
-
value = await input.inputValue();
|
|
199
|
-
assertEqual(value, '456', 'Input value is 456');
|
|
200
|
-
|
|
201
|
-
// Use keyboard arrows
|
|
202
|
-
await input.click();
|
|
203
|
-
await page.keyboard.press('ArrowUp');
|
|
204
|
-
value = await input.inputValue();
|
|
205
|
-
assertEqual(value, '457', 'Value increased to 457 after ArrowUp');
|
|
206
|
-
|
|
207
|
-
} finally {
|
|
208
|
-
await browser.close();
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
async function testKeyPresses() {
|
|
213
|
-
log('\n[Test 5] Key presses', 'info');
|
|
214
|
-
|
|
215
|
-
const browser = await chromium.launch({ headless: true });
|
|
216
|
-
const context = await browser.newContext();
|
|
217
|
-
const page = await context.newPage();
|
|
218
|
-
|
|
219
|
-
try {
|
|
220
|
-
await page.goto(`${BASE_URL}/key_presses`, { timeout: TIMEOUTS.navigation });
|
|
221
|
-
|
|
222
|
-
const input = page.locator('#target');
|
|
223
|
-
await input.waitFor({ state: 'visible', timeout: TIMEOUTS.default });
|
|
224
|
-
|
|
225
|
-
// Press a key
|
|
226
|
-
await input.press('KeyA');
|
|
227
|
-
// Wait for result to update
|
|
228
|
-
await page.waitForSelector('#result:not(:empty)', { timeout: TIMEOUTS.short });
|
|
229
|
-
const result = await page.textContent('#result');
|
|
230
|
-
assertContains(result || '', 'A', 'Result shows key A was pressed');
|
|
231
|
-
|
|
232
|
-
// Press Enter
|
|
233
|
-
await input.press('Enter');
|
|
234
|
-
// Wait for result content to change - use waitForFunction for better reliability
|
|
235
|
-
await page.waitForFunction(() => {
|
|
236
|
-
const result = document.querySelector('#result');
|
|
237
|
-
return result && result.textContent !== '' && result.textContent.includes('You entered');
|
|
238
|
-
}, { timeout: TIMEOUTS.short });
|
|
239
|
-
const result2 = await page.textContent('#result');
|
|
240
|
-
assert(result2 !== '', 'Result shows key was pressed');
|
|
241
|
-
|
|
242
|
-
} finally {
|
|
243
|
-
await browser.close();
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
async function testHorizontalSlider() {
|
|
248
|
-
log('\n[Test 6] Horizontal slider', 'info');
|
|
249
|
-
|
|
250
|
-
const browser = await chromium.launch({ headless: true });
|
|
251
|
-
const context = await browser.newContext();
|
|
252
|
-
const page = await context.newPage();
|
|
253
|
-
|
|
254
|
-
try {
|
|
255
|
-
await page.goto(`${BASE_URL}/horizontal_slider`);
|
|
256
|
-
|
|
257
|
-
const slider = page.locator('input[type="range"]');
|
|
258
|
-
const valueDisplay = page.locator('#range');
|
|
259
|
-
await slider.waitFor();
|
|
260
|
-
|
|
261
|
-
// Get initial value
|
|
262
|
-
const initialValue = await valueDisplay.textContent();
|
|
263
|
-
log(` Initial slider value: ${initialValue}`, 'dim');
|
|
264
|
-
|
|
265
|
-
// Set slider value
|
|
266
|
-
await slider.fill('5');
|
|
267
|
-
await page.waitForTimeout(100);
|
|
268
|
-
|
|
269
|
-
const finalValue = await valueDisplay.textContent();
|
|
270
|
-
assertEqual(finalValue, '5', 'Slider value changed to 5');
|
|
271
|
-
|
|
272
|
-
} finally {
|
|
273
|
-
await browser.close();
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
async function testAlerts() {
|
|
278
|
-
log('\n[Test 7] JavaScript Alerts', 'info');
|
|
279
|
-
|
|
280
|
-
const browser = await chromium.launch({ headless: true });
|
|
281
|
-
const context = await browser.newContext();
|
|
282
|
-
const page = await context.newPage();
|
|
283
|
-
|
|
284
|
-
try {
|
|
285
|
-
await page.goto(`${BASE_URL}/javascript_alerts`);
|
|
286
|
-
|
|
287
|
-
const result = page.locator('#result');
|
|
288
|
-
const clickButton = page.locator('button[onclick="jsAlert()"]');
|
|
289
|
-
|
|
290
|
-
// Handle alert
|
|
291
|
-
page.on('dialog', async dialog => {
|
|
292
|
-
assertEqual(dialog.type(), 'alert', 'Dialog type is alert');
|
|
293
|
-
assertEqual(dialog.message(), 'I am a JS Alert', 'Alert message is correct');
|
|
294
|
-
await dialog.accept();
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
await clickButton.click();
|
|
298
|
-
await page.waitForTimeout(100);
|
|
299
|
-
|
|
300
|
-
const resultText = await result.textContent();
|
|
301
|
-
assertContains(resultText || '', 'successfully clicked an alert', 'Result shows alert was clicked');
|
|
302
|
-
|
|
303
|
-
} finally {
|
|
304
|
-
await browser.close();
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
async function testConfirm() {
|
|
309
|
-
log('\n[Test 8] JavaScript Confirm', 'info');
|
|
310
|
-
|
|
311
|
-
const browser = await chromium.launch({ headless: true });
|
|
312
|
-
const context = await browser.newContext();
|
|
313
|
-
const page = await context.newPage();
|
|
314
|
-
|
|
315
|
-
try {
|
|
316
|
-
await page.goto(`${BASE_URL}/javascript_alerts`);
|
|
317
|
-
|
|
318
|
-
const result = page.locator('#result');
|
|
319
|
-
const confirmButton = page.locator('button[onclick="jsConfirm()"]');
|
|
320
|
-
|
|
321
|
-
// Accept confirm
|
|
322
|
-
page.on('dialog', async dialog => {
|
|
323
|
-
assertEqual(dialog.type(), 'confirm', 'Dialog type is confirm');
|
|
324
|
-
assertEqual(dialog.message(), 'I am a JS Confirm', 'Confirm message is correct');
|
|
325
|
-
await dialog.accept();
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
await confirmButton.click();
|
|
329
|
-
await page.waitForTimeout(100);
|
|
330
|
-
|
|
331
|
-
let resultText = await result.textContent();
|
|
332
|
-
assertContains(resultText, 'You clicked: Ok', 'Result shows Ok was clicked');
|
|
333
|
-
|
|
334
|
-
// Dismiss confirm
|
|
335
|
-
page.removeAllListeners('dialog');
|
|
336
|
-
page.on('dialog', async dialog => {
|
|
337
|
-
await dialog.dismiss();
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
await confirmButton.click();
|
|
341
|
-
await page.waitForTimeout(100);
|
|
342
|
-
|
|
343
|
-
resultText = await result.textContent();
|
|
344
|
-
assertContains(resultText, 'You clicked: Cancel', 'Result shows Cancel was clicked');
|
|
345
|
-
|
|
346
|
-
} finally {
|
|
347
|
-
await browser.close();
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
async function testPrompt() {
|
|
352
|
-
log('\n[Test 9] JavaScript Prompt', 'info');
|
|
353
|
-
|
|
354
|
-
const browser = await chromium.launch({ headless: true });
|
|
355
|
-
const context = await browser.newContext();
|
|
356
|
-
const page = await context.newPage();
|
|
357
|
-
|
|
358
|
-
try {
|
|
359
|
-
await page.goto(`${BASE_URL}/javascript_alerts`);
|
|
360
|
-
|
|
361
|
-
const result = page.locator('#result');
|
|
362
|
-
const promptButton = page.locator('button[onclick="jsPrompt()"]');
|
|
363
|
-
|
|
364
|
-
// Accept prompt with text
|
|
365
|
-
page.on('dialog', async dialog => {
|
|
366
|
-
assertEqual(dialog.type(), 'prompt', 'Dialog type is prompt');
|
|
367
|
-
assertEqual(dialog.message(), 'I am a JS prompt', 'Prompt message is correct');
|
|
368
|
-
await dialog.accept('Hello World');
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
await promptButton.click();
|
|
372
|
-
await page.waitForTimeout(100);
|
|
373
|
-
|
|
374
|
-
const resultText = await result.textContent();
|
|
375
|
-
assertContains(resultText, 'You entered: Hello World', 'Result shows entered text');
|
|
376
|
-
|
|
377
|
-
} finally {
|
|
378
|
-
await browser.close();
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
async function testFrames() {
|
|
383
|
-
log('\n[Test 10] Frames', 'info');
|
|
384
|
-
|
|
385
|
-
const browser = await chromium.launch({ headless: true });
|
|
386
|
-
const context = await browser.newContext();
|
|
387
|
-
const page = await context.newPage();
|
|
388
|
-
|
|
389
|
-
try {
|
|
390
|
-
await page.goto(`${BASE_URL}/frames`);
|
|
391
|
-
|
|
392
|
-
// Wait for frames to load
|
|
393
|
-
await page.waitForTimeout(500);
|
|
394
|
-
|
|
395
|
-
const frames = page.frames();
|
|
396
|
-
const contentFrame = frames.find(f => f.url().includes('frames'));
|
|
397
|
-
assert(contentFrame !== undefined, 'Frame exists');
|
|
398
|
-
|
|
399
|
-
const heading = await contentFrame?.locator('h3').textContent();
|
|
400
|
-
assertEqual(heading, 'Frames', 'Frame heading is correct');
|
|
401
|
-
|
|
402
|
-
} finally {
|
|
403
|
-
await browser.close();
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
async function testIframes() {
|
|
408
|
-
log('\n[Test 11] IFrames', 'info');
|
|
409
|
-
|
|
410
|
-
const browser = await chromium.launch({ headless: true });
|
|
411
|
-
const context = await browser.newContext();
|
|
412
|
-
const page = await context.newPage();
|
|
413
|
-
|
|
414
|
-
try {
|
|
415
|
-
await page.goto(`${BASE_URL}/iframe`);
|
|
416
|
-
|
|
417
|
-
// Wait for iframe to load
|
|
418
|
-
await page.waitForTimeout(500);
|
|
419
|
-
|
|
420
|
-
// Get iframe - the iframe has id mce_0_ifr
|
|
421
|
-
const iframeElement = await page.$('#mce_0_ifr');
|
|
422
|
-
assert(iframeElement !== null, 'Iframe element exists');
|
|
423
|
-
|
|
424
|
-
const iframe = page.frameLocator('#mce_0_ifr');
|
|
425
|
-
|
|
426
|
-
// Wait for content in iframe
|
|
427
|
-
await iframe.locator('body').waitFor({ state: 'visible', timeout: 5000 });
|
|
428
|
-
|
|
429
|
-
const text = await iframe.locator('body').textContent();
|
|
430
|
-
assert(text !== null && text.length > 0, 'Iframe has content');
|
|
431
|
-
|
|
432
|
-
} finally {
|
|
433
|
-
await browser.close();
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
async function testHover() {
|
|
438
|
-
log('\n[Test 12] Hover effect', 'info');
|
|
439
|
-
|
|
440
|
-
const browser = await chromium.launch({ headless: true });
|
|
441
|
-
const context = await browser.newContext();
|
|
442
|
-
const page = await context.newPage();
|
|
443
|
-
|
|
444
|
-
try {
|
|
445
|
-
await page.goto(`${BASE_URL}/hovers`);
|
|
446
|
-
|
|
447
|
-
// Wait for images to load
|
|
448
|
-
await page.waitForSelector('.figure', { state: 'visible' });
|
|
449
|
-
|
|
450
|
-
const figure = page.locator('.figure').first();
|
|
451
|
-
await figure.hover();
|
|
452
|
-
|
|
453
|
-
const caption = await figure.locator('.figcaption').isVisible();
|
|
454
|
-
assert(caption, 'Caption is visible on hover');
|
|
455
|
-
|
|
456
|
-
const captionText = await figure.locator('.figcaption h5').textContent();
|
|
457
|
-
assertContains(captionText || '', 'user1', 'Caption shows user1');
|
|
458
|
-
|
|
459
|
-
} finally {
|
|
460
|
-
await browser.close();
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
async function testDoubleClick() {
|
|
465
|
-
log('\n[Test 13] Double click', 'info');
|
|
466
|
-
|
|
467
|
-
const browser = await chromium.launch({ headless: true });
|
|
468
|
-
const context = await browser.newContext();
|
|
469
|
-
const page = await context.newPage();
|
|
470
|
-
|
|
471
|
-
try {
|
|
472
|
-
await page.goto(`${BASE_URL}/double_click`);
|
|
473
|
-
|
|
474
|
-
// Wait for page to load and check if element exists
|
|
475
|
-
const buttonExists = await page.$('#double-click-btn');
|
|
476
|
-
if (buttonExists) {
|
|
477
|
-
const button = page.locator('#double-click-btn');
|
|
478
|
-
await button.waitFor({ state: 'visible', timeout: 5000 });
|
|
479
|
-
|
|
480
|
-
// Double click
|
|
481
|
-
await button.dblclick();
|
|
482
|
-
|
|
483
|
-
await page.waitForTimeout(200);
|
|
484
|
-
|
|
485
|
-
// Check if color changed (the double click should change the background color)
|
|
486
|
-
const className = await button.getAttribute('class');
|
|
487
|
-
assert(className?.includes('success') || className?.includes('danger'), 'Button color changed on double click');
|
|
488
|
-
} else {
|
|
489
|
-
// Skip test if element doesn't exist
|
|
490
|
-
log(' SKIPPED: Double click button not found', 'warning');
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
} finally {
|
|
494
|
-
await browser.close();
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
async function testDragAndDrop() {
|
|
499
|
-
log('\n[Test 14] Drag and Drop', 'info');
|
|
500
|
-
|
|
501
|
-
const browser = await chromium.launch({ headless: true });
|
|
502
|
-
const context = await browser.newContext();
|
|
503
|
-
const page = await context.newPage();
|
|
504
|
-
|
|
505
|
-
try {
|
|
506
|
-
await page.goto(`${BASE_URL}/drag_and_drop`);
|
|
507
|
-
|
|
508
|
-
const columnA = page.locator('#column-a');
|
|
509
|
-
const columnB = page.locator('#column-b');
|
|
510
|
-
|
|
511
|
-
await columnA.waitFor();
|
|
512
|
-
await columnB.waitFor();
|
|
513
|
-
|
|
514
|
-
// Get initial text
|
|
515
|
-
const initialTextA = await columnA.textContent();
|
|
516
|
-
assertEqual(initialTextA, 'A', 'Column A has text A');
|
|
517
|
-
|
|
518
|
-
// Drag from A to B using drag and drop API
|
|
519
|
-
await columnA.dragTo(columnB);
|
|
520
|
-
|
|
521
|
-
await page.waitForTimeout(500);
|
|
522
|
-
|
|
523
|
-
// Get text after drag and drop
|
|
524
|
-
const newTextA = await columnA.textContent();
|
|
525
|
-
assertEqual(newTextA, 'B', 'Column A now has text B after drag and drop');
|
|
526
|
-
|
|
527
|
-
} finally {
|
|
528
|
-
await browser.close();
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
async function testFormAuthentication() {
|
|
533
|
-
log('\n[Test 15] Form Authentication', 'info');
|
|
534
|
-
|
|
535
|
-
const browser = await chromium.launch({ headless: true });
|
|
536
|
-
const context = await browser.newContext();
|
|
537
|
-
const page = await context.newPage();
|
|
538
|
-
|
|
539
|
-
try {
|
|
540
|
-
await page.goto(`${BASE_URL}/login`);
|
|
541
|
-
|
|
542
|
-
const usernameInput = page.locator('#username');
|
|
543
|
-
const passwordInput = page.locator('#password');
|
|
544
|
-
const loginButton = page.locator('button[type="submit"]');
|
|
545
|
-
|
|
546
|
-
// Fill in credentials
|
|
547
|
-
await usernameInput.fill('tomsmith');
|
|
548
|
-
await passwordInput.fill('SuperSecretPassword!');
|
|
549
|
-
|
|
550
|
-
// Submit form
|
|
551
|
-
await loginButton.click();
|
|
552
|
-
|
|
553
|
-
// Check for successful login
|
|
554
|
-
await page.waitForURL('**/secure');
|
|
555
|
-
const flashMessage = await page.textContent('#flash');
|
|
556
|
-
assertContains(flashMessage || '', 'You logged into a secure area!', 'Login successful');
|
|
557
|
-
|
|
558
|
-
// Logout
|
|
559
|
-
await page.click('.button.secondary');
|
|
560
|
-
await page.waitForURL('**/login');
|
|
561
|
-
|
|
562
|
-
const backOnLogin = page.url().includes('/login');
|
|
563
|
-
assert(backOnLogin, 'Logged out and back on login page');
|
|
564
|
-
|
|
565
|
-
} finally {
|
|
566
|
-
await browser.close();
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
async function testFileUpload() {
|
|
571
|
-
log('\n[Test 16] File Upload', 'info');
|
|
572
|
-
|
|
573
|
-
const browser = await chromium.launch({ headless: true });
|
|
574
|
-
const context = await browser.newContext();
|
|
575
|
-
const page = await context.newPage();
|
|
576
|
-
|
|
577
|
-
try {
|
|
578
|
-
await page.goto(`${BASE_URL}/upload`);
|
|
579
|
-
|
|
580
|
-
const fileInput = page.locator('#file-upload');
|
|
581
|
-
const uploadButton = page.locator('#file-submit');
|
|
582
|
-
|
|
583
|
-
// For the file upload test, we'll just verify the elements exist
|
|
584
|
-
// since we don't have a real file to upload
|
|
585
|
-
await fileInput.waitFor();
|
|
586
|
-
await uploadButton.waitFor();
|
|
587
|
-
|
|
588
|
-
assert(await fileInput.isVisible(), 'File input is visible');
|
|
589
|
-
assert(await uploadButton.isVisible(), 'Upload button is visible');
|
|
590
|
-
|
|
591
|
-
} finally {
|
|
592
|
-
await browser.close();
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
async function testDownload() {
|
|
597
|
-
log('\n[Test 17] File Download', 'info');
|
|
598
|
-
|
|
599
|
-
const browser = await chromium.launch({ headless: true });
|
|
600
|
-
const context = await browser.newContext();
|
|
601
|
-
const page = await context.newPage();
|
|
602
|
-
|
|
603
|
-
try {
|
|
604
|
-
await page.goto(`${BASE_URL}/download`);
|
|
605
|
-
|
|
606
|
-
const downloadLink = page.locator('a[href^="download/"]');
|
|
607
|
-
const linkText = await downloadLink.first().textContent();
|
|
608
|
-
assert(linkText, 'Download link exists');
|
|
609
|
-
|
|
610
|
-
// Check that multiple download links exist
|
|
611
|
-
const linksCount = await page.locator('a[href^="download/"]').count();
|
|
612
|
-
assert(linksCount > 0, `Found ${linksCount} download links`);
|
|
613
|
-
|
|
614
|
-
} finally {
|
|
615
|
-
await browser.close();
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
async function testDynamicContent() {
|
|
620
|
-
log('\n[Test 18] Dynamic Loading', 'info');
|
|
621
|
-
|
|
622
|
-
const browser = await chromium.launch({ headless: true });
|
|
623
|
-
const context = await browser.newContext();
|
|
624
|
-
const page = await context.newPage();
|
|
625
|
-
|
|
626
|
-
try {
|
|
627
|
-
await page.goto(`${BASE_URL}/dynamic_loading`);
|
|
628
|
-
|
|
629
|
-
const startButton = page.locator('a[href="/dynamic_loading/1"]');
|
|
630
|
-
await startButton.click();
|
|
631
|
-
|
|
632
|
-
// Click start button
|
|
633
|
-
await page.locator('#start button').click();
|
|
634
|
-
|
|
635
|
-
// Wait for dynamic content to load
|
|
636
|
-
await page.waitForSelector('#finish', { timeout: 10000 });
|
|
637
|
-
|
|
638
|
-
const finishText = await page.textContent('#finish');
|
|
639
|
-
assertContains(finishText || '', 'Hello World!', 'Dynamic content loaded');
|
|
640
|
-
|
|
641
|
-
} finally {
|
|
642
|
-
await browser.close();
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
async function testMultipleWindows() {
|
|
647
|
-
log('\n[Test 19] Multiple Windows', 'info');
|
|
648
|
-
|
|
649
|
-
const browser = await chromium.launch({ headless: true });
|
|
650
|
-
const context = await browser.newContext();
|
|
651
|
-
const page = await context.newPage();
|
|
652
|
-
|
|
653
|
-
try {
|
|
654
|
-
await page.goto(`${BASE_URL}/windows`);
|
|
655
|
-
|
|
656
|
-
const clickHereLink = page.locator('a[href="/windows/new"]');
|
|
657
|
-
const [newPage] = await Promise.all([
|
|
658
|
-
context.waitForEvent('page'),
|
|
659
|
-
clickHereLink.click(),
|
|
660
|
-
]);
|
|
661
|
-
|
|
662
|
-
await newPage.waitForLoadState();
|
|
663
|
-
|
|
664
|
-
const newPageHeading = await newPage.locator('h3').textContent();
|
|
665
|
-
assertEqual(newPageHeading, 'New Window', 'New window opened');
|
|
666
|
-
|
|
667
|
-
await newPage.close();
|
|
668
|
-
|
|
669
|
-
} finally {
|
|
670
|
-
await browser.close();
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
async function testNotificationMessage() {
|
|
675
|
-
log('\n[Test 20] Notification Messages', 'info');
|
|
676
|
-
|
|
677
|
-
const browser = await chromium.launch({ headless: true });
|
|
678
|
-
const context = await browser.newContext();
|
|
679
|
-
const page = await context.newPage();
|
|
680
|
-
|
|
681
|
-
try {
|
|
682
|
-
await page.goto(`${BASE_URL}/notification_message_rendered`);
|
|
683
|
-
|
|
684
|
-
const link = page.locator('a[href="/notification_message"]');
|
|
685
|
-
await link.click();
|
|
686
|
-
|
|
687
|
-
await page.waitForSelector('#flash');
|
|
688
|
-
|
|
689
|
-
const flashMessage = await page.textContent('#flash');
|
|
690
|
-
assert(flashMessage, 'Flash message is displayed');
|
|
691
|
-
|
|
692
|
-
// Check that message contains actionable content
|
|
693
|
-
const messageText = flashMessage?.toLowerCase() || '';
|
|
694
|
-
assert(
|
|
695
|
-
messageText.includes('successful') ||
|
|
696
|
-
messageText.includes('unsucessful') ||
|
|
697
|
-
messageText.includes('action'),
|
|
698
|
-
'Notification message has meaningful content'
|
|
699
|
-
);
|
|
700
|
-
|
|
701
|
-
} finally {
|
|
702
|
-
await browser.close();
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
// ============================================================================
|
|
707
|
-
// MAIN
|
|
708
|
-
// ============================================================================
|
|
709
|
-
|
|
710
|
-
async function main() {
|
|
711
|
-
log('\nQA360 Real-World E2E Tests - The Internet (Herokuapp)', 'info');
|
|
712
|
-
log('='.repeat(60), 'info');
|
|
713
|
-
|
|
714
|
-
const tests = [
|
|
715
|
-
testHomePageLoads,
|
|
716
|
-
testCheckboxes,
|
|
717
|
-
testDropdown,
|
|
718
|
-
testInputs,
|
|
719
|
-
testKeyPresses,
|
|
720
|
-
testHorizontalSlider,
|
|
721
|
-
testAlerts,
|
|
722
|
-
testConfirm,
|
|
723
|
-
testPrompt,
|
|
724
|
-
testFrames,
|
|
725
|
-
testIframes,
|
|
726
|
-
testHover,
|
|
727
|
-
testDoubleClick,
|
|
728
|
-
testDragAndDrop,
|
|
729
|
-
testFormAuthentication,
|
|
730
|
-
testFileUpload,
|
|
731
|
-
testDownload,
|
|
732
|
-
testDynamicContent,
|
|
733
|
-
testMultipleWindows,
|
|
734
|
-
testNotificationMessage,
|
|
735
|
-
];
|
|
736
|
-
|
|
737
|
-
for (const test of tests) {
|
|
738
|
-
try {
|
|
739
|
-
await test();
|
|
740
|
-
} catch (error) {
|
|
741
|
-
if (!error.message.includes('Assertion failed')) {
|
|
742
|
-
log(` ERROR ${error.message}`, 'error');
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
log('\n' + '='.repeat(60), 'info');
|
|
748
|
-
log(`\nResults: ${testsPassed} passed, ${testsFailed} failed`, 'info');
|
|
749
|
-
|
|
750
|
-
if (testsFailed > 0) {
|
|
751
|
-
process.exit(1);
|
|
752
|
-
} else {
|
|
753
|
-
log('\nAll real-world E2E tests passed!', 'success');
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
main().catch(error => {
|
|
758
|
-
console.error(error);
|
|
759
|
-
process.exit(1);
|
|
760
|
-
});
|