@avi770/testteam 1.2.0 → 2.0.0
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 +29 -1
- package/README.md +53 -6
- package/agents/24-signup-onboarding-tester.ts +429 -0
- package/agents/25-crud-flow-tester.ts +302 -0
- package/agents/26-form-validator.ts +297 -0
- package/agents/27-search-filter-tester.ts +326 -0
- package/agents/28-navigation-routing-tester.ts +425 -0
- package/agents/29-responsive-interaction-tester.ts +350 -0
- package/agents/30-multi-user-scenario-tester.ts +319 -0
- package/agents/31-load-tester.ts +134 -0
- package/agents/32-memory-leak-detector.ts +194 -0
- package/agents/33-bundle-analyzer.ts +132 -0
- package/agents/34-xss-scanner.ts +191 -0
- package/agents/35-csrf-tester.ts +82 -0
- package/agents/36-auth-fuzzer.ts +194 -0
- package/agents/37-dependency-scanner.ts +176 -0
- package/agents/38-secrets-scanner.ts +137 -0
- package/agents/39-api-contract-tester.ts +199 -0
- package/agents/40-rate-limit-tester.ts +94 -0
- package/agents/41-api-pagination-tester.ts +97 -0
- package/agents/42-graphql-tester.ts +222 -0
- package/agents/43-data-consistency-checker.ts +205 -0
- package/agents/44-backup-recovery-tester.ts +152 -0
- package/agents/45-data-privacy-scanner.ts +125 -0
- package/agents/46-seo-auditor.ts +294 -0
- package/agents/47-social-preview-tester.ts +232 -0
- package/agents/48-lighthouse-auditor.ts +213 -0
- package/agents/49-i18n-tester.ts +198 -0
- package/agents/50-timezone-tester.ts +173 -0
- package/agents/51-error-recovery-tester.ts +155 -0
- package/agents/52-offline-mode-tester.ts +180 -0
- package/agents/53-graceful-degradation-tester.ts +156 -0
- package/agents/54-websocket-tester.ts +151 -0
- package/agents/55-realtime-sync-tester.ts +194 -0
- package/agents/56-file-upload-tester.ts +194 -0
- package/agents/57-export-tester.ts +174 -0
- package/agents/58-payment-flow-tester.ts +183 -0
- package/agents/59-ssl-tls-auditor.ts +141 -0
- package/agents/60-dns-cdn-tester.ts +117 -0
- package/agents/61-docker-health-checker.ts +111 -0
- package/agents/62-env-config-validator.ts +152 -0
- package/agents/63-log-quality-auditor.ts +136 -0
- package/agents/64-analytics-tracker-tester.ts +165 -0
- package/agents/65-gdpr-compliance-tester.ts +215 -0
- package/agents/66-soc2-control-validator.ts +210 -0
- package/agents/67-wcag-aaa-tester.ts +241 -0
- package/agents/68-dead-code-detector.ts +135 -0
- package/agents/69-type-safety-auditor.ts +164 -0
- package/agents/70-complexity-analyzer.ts +179 -0
- package/agents/__tests__/24-signup-onboarding-tester.test.ts +274 -0
- package/agents/__tests__/25-crud-flow-tester.test.ts +322 -0
- package/agents/__tests__/26-form-validator.test.ts +345 -0
- package/agents/__tests__/27-search-filter-tester.test.ts +311 -0
- package/agents/__tests__/28-navigation-routing-tester.test.ts +328 -0
- package/agents/__tests__/29-responsive-interaction-tester.test.ts +297 -0
- package/agents/__tests__/30-multi-user-scenario-tester.test.ts +328 -0
- package/agents/__tests__/31-load-tester.test.ts +189 -0
- package/agents/__tests__/32-memory-leak-detector.test.ts +251 -0
- package/agents/__tests__/33-bundle-analyzer.test.ts +237 -0
- package/agents/__tests__/34-xss-scanner.test.ts +258 -0
- package/agents/__tests__/35-csrf-tester.test.ts +200 -0
- package/agents/__tests__/36-auth-fuzzer.test.ts +214 -0
- package/agents/__tests__/37-dependency-scanner.test.ts +266 -0
- package/agents/__tests__/38-secrets-scanner.test.ts +224 -0
- package/agents/__tests__/39-api-contract-tester.test.ts +312 -0
- package/agents/__tests__/40-rate-limit-tester.test.ts +192 -0
- package/agents/__tests__/41-api-pagination-tester.test.ts +198 -0
- package/agents/__tests__/42-graphql-tester.test.ts +252 -0
- package/agents/__tests__/43-data-consistency-checker.test.ts +232 -0
- package/agents/__tests__/44-backup-recovery-tester.test.ts +222 -0
- package/agents/__tests__/45-data-privacy-scanner.test.ts +223 -0
- package/agents/__tests__/46-seo-auditor.test.ts +261 -0
- package/agents/__tests__/47-social-preview-tester.test.ts +245 -0
- package/agents/__tests__/48-lighthouse-auditor.test.ts +276 -0
- package/agents/__tests__/49-i18n-tester.test.ts +201 -0
- package/agents/__tests__/50-timezone-tester.test.ts +172 -0
- package/agents/__tests__/51-error-recovery-tester.test.ts +162 -0
- package/agents/__tests__/52-offline-mode-tester.test.ts +164 -0
- package/agents/__tests__/53-graceful-degradation-tester.test.ts +168 -0
- package/agents/__tests__/54-websocket-tester.test.ts +157 -0
- package/agents/__tests__/55-realtime-sync-tester.test.ts +181 -0
- package/agents/__tests__/56-file-upload-tester.test.ts +172 -0
- package/agents/__tests__/57-export-tester.test.ts +169 -0
- package/agents/__tests__/58-payment-flow-tester.test.ts +182 -0
- package/agents/__tests__/59-ssl-tls-auditor.test.ts +179 -0
- package/agents/__tests__/60-dns-cdn-tester.test.ts +176 -0
- package/agents/__tests__/61-docker-health-checker.test.ts +150 -0
- package/agents/__tests__/62-env-config-validator.test.ts +166 -0
- package/agents/__tests__/63-log-quality-auditor.test.ts +175 -0
- package/agents/__tests__/64-analytics-tracker-tester.test.ts +158 -0
- package/agents/__tests__/65-gdpr-compliance-tester.test.ts +174 -0
- package/agents/__tests__/66-soc2-control-validator.test.ts +183 -0
- package/agents/__tests__/67-wcag-aaa-tester.test.ts +190 -0
- package/agents/__tests__/68-dead-code-detector.test.ts +174 -0
- package/agents/__tests__/69-type-safety-auditor.test.ts +173 -0
- package/agents/__tests__/70-complexity-analyzer.test.ts +177 -0
- package/agents/__tests__/registry.test.ts +13 -13
- package/agents/registry.ts +146 -5
- package/core/__tests__/integration.test.ts +4 -4
- package/core/__tests__/orchestrator.test.ts +17 -16
- package/core/license.ts +208 -211
- package/core/orchestrator.ts +6 -4
- package/dist/agents/24-signup-onboarding-tester.d.ts +35 -0
- package/dist/agents/24-signup-onboarding-tester.d.ts.map +1 -0
- package/dist/agents/24-signup-onboarding-tester.js +357 -0
- package/dist/agents/24-signup-onboarding-tester.js.map +1 -0
- package/dist/agents/25-crud-flow-tester.d.ts +11 -0
- package/dist/agents/25-crud-flow-tester.d.ts.map +1 -0
- package/dist/agents/25-crud-flow-tester.js +253 -0
- package/dist/agents/25-crud-flow-tester.js.map +1 -0
- package/dist/agents/26-form-validator.d.ts +12 -0
- package/dist/agents/26-form-validator.d.ts.map +1 -0
- package/dist/agents/26-form-validator.js +257 -0
- package/dist/agents/26-form-validator.js.map +1 -0
- package/dist/agents/27-search-filter-tester.d.ts +20 -0
- package/dist/agents/27-search-filter-tester.d.ts.map +1 -0
- package/dist/agents/27-search-filter-tester.js +267 -0
- package/dist/agents/27-search-filter-tester.js.map +1 -0
- package/dist/agents/28-navigation-routing-tester.d.ts +32 -0
- package/dist/agents/28-navigation-routing-tester.d.ts.map +1 -0
- package/dist/agents/28-navigation-routing-tester.js +363 -0
- package/dist/agents/28-navigation-routing-tester.js.map +1 -0
- package/dist/agents/29-responsive-interaction-tester.d.ts +26 -0
- package/dist/agents/29-responsive-interaction-tester.d.ts.map +1 -0
- package/dist/agents/29-responsive-interaction-tester.js +272 -0
- package/dist/agents/29-responsive-interaction-tester.js.map +1 -0
- package/dist/agents/30-multi-user-scenario-tester.d.ts +24 -0
- package/dist/agents/30-multi-user-scenario-tester.d.ts.map +1 -0
- package/dist/agents/30-multi-user-scenario-tester.js +254 -0
- package/dist/agents/30-multi-user-scenario-tester.js.map +1 -0
- package/dist/agents/31-load-tester.d.ts +12 -0
- package/dist/agents/31-load-tester.d.ts.map +1 -0
- package/dist/agents/31-load-tester.js +110 -0
- package/dist/agents/31-load-tester.js.map +1 -0
- package/dist/agents/32-memory-leak-detector.d.ts +12 -0
- package/dist/agents/32-memory-leak-detector.d.ts.map +1 -0
- package/dist/agents/32-memory-leak-detector.js +167 -0
- package/dist/agents/32-memory-leak-detector.js.map +1 -0
- package/dist/agents/33-bundle-analyzer.d.ts +10 -0
- package/dist/agents/33-bundle-analyzer.d.ts.map +1 -0
- package/dist/agents/33-bundle-analyzer.js +111 -0
- package/dist/agents/33-bundle-analyzer.js.map +1 -0
- package/dist/agents/34-xss-scanner.d.ts +11 -0
- package/dist/agents/34-xss-scanner.d.ts.map +1 -0
- package/dist/agents/34-xss-scanner.js +164 -0
- package/dist/agents/34-xss-scanner.js.map +1 -0
- package/dist/agents/35-csrf-tester.d.ts +11 -0
- package/dist/agents/35-csrf-tester.d.ts.map +1 -0
- package/dist/agents/35-csrf-tester.js +70 -0
- package/dist/agents/35-csrf-tester.js.map +1 -0
- package/dist/agents/36-auth-fuzzer.d.ts +13 -0
- package/dist/agents/36-auth-fuzzer.d.ts.map +1 -0
- package/dist/agents/36-auth-fuzzer.js +163 -0
- package/dist/agents/36-auth-fuzzer.js.map +1 -0
- package/dist/agents/37-dependency-scanner.d.ts +11 -0
- package/dist/agents/37-dependency-scanner.d.ts.map +1 -0
- package/dist/agents/37-dependency-scanner.js +139 -0
- package/dist/agents/37-dependency-scanner.js.map +1 -0
- package/dist/agents/38-secrets-scanner.d.ts +11 -0
- package/dist/agents/38-secrets-scanner.d.ts.map +1 -0
- package/dist/agents/38-secrets-scanner.js +116 -0
- package/dist/agents/38-secrets-scanner.js.map +1 -0
- package/dist/agents/39-api-contract-tester.d.ts +12 -0
- package/dist/agents/39-api-contract-tester.d.ts.map +1 -0
- package/dist/agents/39-api-contract-tester.js +142 -0
- package/dist/agents/39-api-contract-tester.js.map +1 -0
- package/dist/agents/40-rate-limit-tester.d.ts +12 -0
- package/dist/agents/40-rate-limit-tester.d.ts.map +1 -0
- package/dist/agents/40-rate-limit-tester.js +79 -0
- package/dist/agents/40-rate-limit-tester.js.map +1 -0
- package/dist/agents/41-api-pagination-tester.d.ts +12 -0
- package/dist/agents/41-api-pagination-tester.d.ts.map +1 -0
- package/dist/agents/41-api-pagination-tester.js +79 -0
- package/dist/agents/41-api-pagination-tester.js.map +1 -0
- package/dist/agents/42-graphql-tester.d.ts +13 -0
- package/dist/agents/42-graphql-tester.d.ts.map +1 -0
- package/dist/agents/42-graphql-tester.js +187 -0
- package/dist/agents/42-graphql-tester.js.map +1 -0
- package/dist/agents/43-data-consistency-checker.d.ts +11 -0
- package/dist/agents/43-data-consistency-checker.d.ts.map +1 -0
- package/dist/agents/43-data-consistency-checker.js +176 -0
- package/dist/agents/43-data-consistency-checker.js.map +1 -0
- package/dist/agents/44-backup-recovery-tester.d.ts +11 -0
- package/dist/agents/44-backup-recovery-tester.d.ts.map +1 -0
- package/dist/agents/44-backup-recovery-tester.js +128 -0
- package/dist/agents/44-backup-recovery-tester.js.map +1 -0
- package/dist/agents/45-data-privacy-scanner.d.ts +11 -0
- package/dist/agents/45-data-privacy-scanner.d.ts.map +1 -0
- package/dist/agents/45-data-privacy-scanner.js +100 -0
- package/dist/agents/45-data-privacy-scanner.js.map +1 -0
- package/dist/agents/46-seo-auditor.d.ts +12 -0
- package/dist/agents/46-seo-auditor.d.ts.map +1 -0
- package/dist/agents/46-seo-auditor.js +275 -0
- package/dist/agents/46-seo-auditor.js.map +1 -0
- package/dist/agents/47-social-preview-tester.d.ts +11 -0
- package/dist/agents/47-social-preview-tester.d.ts.map +1 -0
- package/dist/agents/47-social-preview-tester.js +219 -0
- package/dist/agents/47-social-preview-tester.js.map +1 -0
- package/dist/agents/48-lighthouse-auditor.d.ts +11 -0
- package/dist/agents/48-lighthouse-auditor.d.ts.map +1 -0
- package/dist/agents/48-lighthouse-auditor.js +192 -0
- package/dist/agents/48-lighthouse-auditor.js.map +1 -0
- package/dist/agents/49-i18n-tester.d.ts +13 -0
- package/dist/agents/49-i18n-tester.d.ts.map +1 -0
- package/dist/agents/49-i18n-tester.js +172 -0
- package/dist/agents/49-i18n-tester.js.map +1 -0
- package/dist/agents/50-timezone-tester.d.ts +11 -0
- package/dist/agents/50-timezone-tester.d.ts.map +1 -0
- package/dist/agents/50-timezone-tester.js +152 -0
- package/dist/agents/50-timezone-tester.js.map +1 -0
- package/dist/agents/51-error-recovery-tester.d.ts +11 -0
- package/dist/agents/51-error-recovery-tester.d.ts.map +1 -0
- package/dist/agents/51-error-recovery-tester.js +134 -0
- package/dist/agents/51-error-recovery-tester.js.map +1 -0
- package/dist/agents/52-offline-mode-tester.d.ts +12 -0
- package/dist/agents/52-offline-mode-tester.d.ts.map +1 -0
- package/dist/agents/52-offline-mode-tester.js +161 -0
- package/dist/agents/52-offline-mode-tester.js.map +1 -0
- package/dist/agents/53-graceful-degradation-tester.d.ts +12 -0
- package/dist/agents/53-graceful-degradation-tester.d.ts.map +1 -0
- package/dist/agents/53-graceful-degradation-tester.js +130 -0
- package/dist/agents/53-graceful-degradation-tester.js.map +1 -0
- package/dist/agents/54-websocket-tester.d.ts +10 -0
- package/dist/agents/54-websocket-tester.d.ts.map +1 -0
- package/dist/agents/54-websocket-tester.js +132 -0
- package/dist/agents/54-websocket-tester.js.map +1 -0
- package/dist/agents/55-realtime-sync-tester.d.ts +11 -0
- package/dist/agents/55-realtime-sync-tester.d.ts.map +1 -0
- package/dist/agents/55-realtime-sync-tester.js +175 -0
- package/dist/agents/55-realtime-sync-tester.js.map +1 -0
- package/dist/agents/56-file-upload-tester.d.ts +12 -0
- package/dist/agents/56-file-upload-tester.d.ts.map +1 -0
- package/dist/agents/56-file-upload-tester.js +166 -0
- package/dist/agents/56-file-upload-tester.js.map +1 -0
- package/dist/agents/57-export-tester.d.ts +11 -0
- package/dist/agents/57-export-tester.d.ts.map +1 -0
- package/dist/agents/57-export-tester.js +155 -0
- package/dist/agents/57-export-tester.js.map +1 -0
- package/dist/agents/58-payment-flow-tester.d.ts +11 -0
- package/dist/agents/58-payment-flow-tester.d.ts.map +1 -0
- package/dist/agents/58-payment-flow-tester.js +159 -0
- package/dist/agents/58-payment-flow-tester.js.map +1 -0
- package/dist/agents/59-ssl-tls-auditor.d.ts +10 -0
- package/dist/agents/59-ssl-tls-auditor.d.ts.map +1 -0
- package/dist/agents/59-ssl-tls-auditor.js +132 -0
- package/dist/agents/59-ssl-tls-auditor.js.map +1 -0
- package/dist/agents/60-dns-cdn-tester.d.ts +10 -0
- package/dist/agents/60-dns-cdn-tester.d.ts.map +1 -0
- package/dist/agents/60-dns-cdn-tester.js +105 -0
- package/dist/agents/60-dns-cdn-tester.js.map +1 -0
- package/dist/agents/61-docker-health-checker.d.ts +10 -0
- package/dist/agents/61-docker-health-checker.d.ts.map +1 -0
- package/dist/agents/61-docker-health-checker.js +95 -0
- package/dist/agents/61-docker-health-checker.js.map +1 -0
- package/dist/agents/62-env-config-validator.d.ts +10 -0
- package/dist/agents/62-env-config-validator.d.ts.map +1 -0
- package/dist/agents/62-env-config-validator.js +132 -0
- package/dist/agents/62-env-config-validator.js.map +1 -0
- package/dist/agents/63-log-quality-auditor.d.ts +9 -0
- package/dist/agents/63-log-quality-auditor.d.ts.map +1 -0
- package/dist/agents/63-log-quality-auditor.js +121 -0
- package/dist/agents/63-log-quality-auditor.js.map +1 -0
- package/dist/agents/64-analytics-tracker-tester.d.ts +10 -0
- package/dist/agents/64-analytics-tracker-tester.d.ts.map +1 -0
- package/dist/agents/64-analytics-tracker-tester.js +146 -0
- package/dist/agents/64-analytics-tracker-tester.js.map +1 -0
- package/dist/agents/65-gdpr-compliance-tester.d.ts +13 -0
- package/dist/agents/65-gdpr-compliance-tester.d.ts.map +1 -0
- package/dist/agents/65-gdpr-compliance-tester.js +186 -0
- package/dist/agents/65-gdpr-compliance-tester.js.map +1 -0
- package/dist/agents/66-soc2-control-validator.d.ts +14 -0
- package/dist/agents/66-soc2-control-validator.d.ts.map +1 -0
- package/dist/agents/66-soc2-control-validator.js +178 -0
- package/dist/agents/66-soc2-control-validator.js.map +1 -0
- package/dist/agents/67-wcag-aaa-tester.d.ts +13 -0
- package/dist/agents/67-wcag-aaa-tester.d.ts.map +1 -0
- package/dist/agents/67-wcag-aaa-tester.js +207 -0
- package/dist/agents/67-wcag-aaa-tester.js.map +1 -0
- package/dist/agents/68-dead-code-detector.d.ts +9 -0
- package/dist/agents/68-dead-code-detector.d.ts.map +1 -0
- package/dist/agents/68-dead-code-detector.js +116 -0
- package/dist/agents/68-dead-code-detector.js.map +1 -0
- package/dist/agents/69-type-safety-auditor.d.ts +9 -0
- package/dist/agents/69-type-safety-auditor.d.ts.map +1 -0
- package/dist/agents/69-type-safety-auditor.js +148 -0
- package/dist/agents/69-type-safety-auditor.js.map +1 -0
- package/dist/agents/70-complexity-analyzer.d.ts +10 -0
- package/dist/agents/70-complexity-analyzer.d.ts.map +1 -0
- package/dist/agents/70-complexity-analyzer.js +154 -0
- package/dist/agents/70-complexity-analyzer.js.map +1 -0
- package/dist/agents/registry.d.ts +3 -3
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +146 -5
- package/dist/agents/registry.js.map +1 -1
- package/dist/core/license.js +2 -5
- package/dist/core/license.js.map +1 -1
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +6 -4
- package/dist/core/orchestrator.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,33 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.0.0] - 2026-03-30
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- 40 new specialized agents (31-70), expanding from 30 to 70 total agents
|
|
12
|
+
- **Performance & Reliability:** Load Tester (31), Memory Leak Detector (32), Bundle Analyzer (33)
|
|
13
|
+
- **Security:** XSS Scanner (34), CSRF Tester (35), Auth Fuzzer (36), Dependency Scanner (37), Secrets Scanner (38)
|
|
14
|
+
- **API Testing:** API Contract Tester (39), Rate Limit Tester (40), API Pagination Tester (41), GraphQL Tester (42)
|
|
15
|
+
- **Data Integrity:** Data Consistency Checker (43), Backup Recovery Tester (44), Data Privacy Scanner (45)
|
|
16
|
+
- **Frontend Quality:** SEO Auditor (46), Social Preview Tester (47), Lighthouse Auditor (48)
|
|
17
|
+
- **Internationalization:** i18n Tester (49), Timezone Tester (50)
|
|
18
|
+
- **Resilience:** Error Recovery Tester (51), Offline Mode Tester (52), Graceful Degradation Tester (53)
|
|
19
|
+
- **Real-time:** WebSocket Tester (54), Realtime Sync Tester (55)
|
|
20
|
+
- **File & Export:** File Upload Tester (56), Export Tester (57)
|
|
21
|
+
- **Payments:** Payment Flow Tester (58)
|
|
22
|
+
- **Infrastructure:** SSL/TLS Auditor (59), DNS/CDN Tester (60), Docker Health Checker (61), Env Config Validator (62)
|
|
23
|
+
- **Observability:** Log Quality Auditor (63), Analytics Tracker Tester (64)
|
|
24
|
+
- **Compliance:** GDPR Compliance Tester (65), SOC2 Control Validator (66), WCAG AAA Tester (67)
|
|
25
|
+
- **Code Quality:** Dead Code Detector (68), Type Safety Auditor (69), Complexity Analyzer (70)
|
|
26
|
+
- Alpha phase now includes code quality and dependency scanning agents (37, 38, 62, 68, 69, 70)
|
|
27
|
+
- UAT phase expanded with 37 new agents (excludes destructive agents 34, 36, 40)
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- Version bumped to 2.0.0 (major: new agent roster is a significant capability expansion)
|
|
31
|
+
- Licensing tiers updated: Pro tier now includes 26 agents, Enterprise tier includes all 70
|
|
32
|
+
- All 40 new agents classified as advisory (non-blocking) in default configuration
|
|
33
|
+
- All 40 new agents marked as parallel-safe for concurrent execution
|
|
34
|
+
|
|
8
35
|
## [1.1.0] - Unreleased
|
|
9
36
|
|
|
10
37
|
### Added
|
|
@@ -50,5 +77,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
50
77
|
- 595 unit tests
|
|
51
78
|
- TypeScript strict mode throughout with full type safety
|
|
52
79
|
|
|
53
|
-
[
|
|
80
|
+
[2.0.0]: https://github.com/BAS-More/E2E-Tester/compare/v1.1.0...HEAD
|
|
81
|
+
[1.1.0]: https://github.com/BAS-More/E2E-Tester/compare/v1.0.0...v1.1.0
|
|
54
82
|
[1.0.0]: https://github.com/BAS-More/E2E-Tester/releases/tag/v1.0.0
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<h1 align="center">TestTeam</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<strong>
|
|
8
|
+
<strong>70-agent AI testing orchestration framework</strong>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
|
-
Autonomous multi-phase testing pipeline with
|
|
21
|
+
Autonomous multi-phase testing pipeline with 70 specialized agents. Runs Alpha through Release with quality gates, self-healing fix loops, and zero manual intervention.
|
|
22
22
|
|
|
23
23
|
## Quick Start
|
|
24
24
|
|
|
@@ -38,7 +38,7 @@ The init wizard auto-detects your framework, test runner, and scaffolds configur
|
|
|
38
38
|
## Why TestTeam
|
|
39
39
|
|
|
40
40
|
- **4-phase pipeline** -- Alpha, Beta, UAT, Release with quality gates that block promotion on failure
|
|
41
|
-
- **
|
|
41
|
+
- **70 specialized agents** -- each owns a single testing concern (a11y, security, perf, visual regression, chaos, load testing, compliance, and more)
|
|
42
42
|
- **Self-healing fix loop** -- Healer and Fixer agents attempt automatic remediation before gate evaluation
|
|
43
43
|
- **Visual regression** -- pixel-level screenshot diffing with baseline management
|
|
44
44
|
- **Cost-controlled** -- per-run and per-agent budget limits with configurable abort/alert policies
|
|
@@ -71,6 +71,53 @@ The init wizard auto-detects your framework, test runner, and scaffolds configur
|
|
|
71
71
|
| 21 | State/Session Tester | Beta, UAT | Enterprise |
|
|
72
72
|
| 22 | Email/Notification Verifier | Beta, UAT | Enterprise |
|
|
73
73
|
| 23 | Migration Tester | Alpha | Enterprise |
|
|
74
|
+
| 24 | Signup & Onboarding Tester | Alpha | Pro |
|
|
75
|
+
| 25 | CRUD Flow Tester | Beta, UAT | Pro |
|
|
76
|
+
| 26 | Form Validator | Beta, UAT | Pro |
|
|
77
|
+
| 27 | Search & Filter Tester | Beta, UAT | Pro |
|
|
78
|
+
| 28 | Navigation & Routing Tester | Beta, UAT | Pro |
|
|
79
|
+
| 29 | Responsive Interaction Tester | Beta, UAT | Pro |
|
|
80
|
+
| 30 | Multi-User Scenario Tester | Beta, UAT | Enterprise |
|
|
81
|
+
| 31 | Load Tester | Beta, UAT | Pro |
|
|
82
|
+
| 32 | Memory Leak Detector | Beta, UAT | Pro |
|
|
83
|
+
| 33 | Bundle Analyzer | Beta, UAT | Pro |
|
|
84
|
+
| 34 | XSS Scanner | Beta | Enterprise |
|
|
85
|
+
| 35 | CSRF Tester | Beta, UAT | Enterprise |
|
|
86
|
+
| 36 | Auth Fuzzer | Beta | Enterprise |
|
|
87
|
+
| 37 | Dependency Scanner | Alpha, Beta, UAT | Pro |
|
|
88
|
+
| 38 | Secrets Scanner | Alpha, Beta, UAT | Pro |
|
|
89
|
+
| 39 | API Contract Tester | Beta, UAT | Enterprise |
|
|
90
|
+
| 40 | Rate Limit Tester | Beta | Enterprise |
|
|
91
|
+
| 41 | API Pagination Tester | Beta, UAT | Enterprise |
|
|
92
|
+
| 42 | GraphQL Tester | Beta, UAT | Enterprise |
|
|
93
|
+
| 43 | Data Consistency Checker | Beta, UAT | Enterprise |
|
|
94
|
+
| 44 | Backup Recovery Tester | Beta, UAT | Enterprise |
|
|
95
|
+
| 45 | Data Privacy Scanner | Beta, UAT | Enterprise |
|
|
96
|
+
| 46 | SEO Auditor | Beta, UAT | Pro |
|
|
97
|
+
| 47 | Social Preview Tester | Beta, UAT | Enterprise |
|
|
98
|
+
| 48 | Lighthouse Auditor | Beta, UAT | Pro |
|
|
99
|
+
| 49 | i18n Tester | Beta, UAT | Enterprise |
|
|
100
|
+
| 50 | Timezone Tester | Beta, UAT | Enterprise |
|
|
101
|
+
| 51 | Error Recovery Tester | Beta, UAT | Enterprise |
|
|
102
|
+
| 52 | Offline Mode Tester | Beta, UAT | Enterprise |
|
|
103
|
+
| 53 | Graceful Degradation Tester | Beta, UAT | Enterprise |
|
|
104
|
+
| 54 | WebSocket Tester | Beta, UAT | Enterprise |
|
|
105
|
+
| 55 | Realtime Sync Tester | Beta, UAT | Enterprise |
|
|
106
|
+
| 56 | File Upload Tester | Beta, UAT | Enterprise |
|
|
107
|
+
| 57 | Export Tester | Beta, UAT | Enterprise |
|
|
108
|
+
| 58 | Payment Flow Tester | Beta, UAT | Enterprise |
|
|
109
|
+
| 59 | SSL/TLS Auditor | Beta, UAT | Enterprise |
|
|
110
|
+
| 60 | DNS/CDN Tester | Beta, UAT | Enterprise |
|
|
111
|
+
| 61 | Docker Health Checker | Beta, UAT | Enterprise |
|
|
112
|
+
| 62 | Env Config Validator | Alpha, Beta, UAT | Pro |
|
|
113
|
+
| 63 | Log Quality Auditor | Beta, UAT | Enterprise |
|
|
114
|
+
| 64 | Analytics Tracker Tester | Beta, UAT | Enterprise |
|
|
115
|
+
| 65 | GDPR Compliance Tester | Beta, UAT | Enterprise |
|
|
116
|
+
| 66 | SOC2 Control Validator | Beta, UAT | Enterprise |
|
|
117
|
+
| 67 | WCAG AAA Tester | Beta, UAT | Enterprise |
|
|
118
|
+
| 68 | Dead Code Detector | Alpha, Beta, UAT | Pro |
|
|
119
|
+
| 69 | Type Safety Auditor | Alpha, Beta, UAT | Pro |
|
|
120
|
+
| 70 | Complexity Analyzer | Alpha, Beta, UAT | Pro |
|
|
74
121
|
|
|
75
122
|
## Architecture
|
|
76
123
|
|
|
@@ -86,9 +133,9 @@ Each phase dispatches its agents, evaluates findings against blocking/advisory c
|
|
|
86
133
|
|
|
87
134
|
| Plan | Price | Agents | Support |
|
|
88
135
|
|------|-------|--------|---------|
|
|
89
|
-
| **Free** | $0 | 8 agents
|
|
90
|
-
| **Pro** | $49/mo |
|
|
91
|
-
| **Enterprise** | $199/mo | All
|
|
136
|
+
| **Free** | $0 | 8 agents | Community |
|
|
137
|
+
| **Pro** | $49/mo | 34 agents | Priority email |
|
|
138
|
+
| **Enterprise** | $199/mo | All 70 agents + custom | Dedicated support, SLA |
|
|
92
139
|
|
|
93
140
|
All plans include the CLI, init wizard, and config validation. Pro and Enterprise unlock the fix loop, Reporter, and advanced agents.
|
|
94
141
|
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import type { Browser, Page } from 'playwright';
|
|
2
|
+
import type { Finding } from '../core/types';
|
|
3
|
+
import { BaseAgent } from './base-agent';
|
|
4
|
+
import { resolveEnvironment } from '../helpers/env-resolver';
|
|
5
|
+
import { login } from '../helpers/navigation';
|
|
6
|
+
|
|
7
|
+
/** Timeout (ms) for individual signup/onboarding operations. */
|
|
8
|
+
const OP_TIMEOUT_MS = 5_000;
|
|
9
|
+
|
|
10
|
+
/** Common registration page paths to probe. */
|
|
11
|
+
const REGISTER_PATHS = ['/register', '/signup', '/sign-up'] as const;
|
|
12
|
+
|
|
13
|
+
/** Selectors indicating onboarding/welcome UI. */
|
|
14
|
+
const ONBOARDING_SELECTORS = [
|
|
15
|
+
'[data-testid*="onboard"]',
|
|
16
|
+
'.onboarding',
|
|
17
|
+
'.welcome',
|
|
18
|
+
'.tour',
|
|
19
|
+
'[class*="tour"]',
|
|
20
|
+
'[class*="welcome"]',
|
|
21
|
+
'[class*="onboard"]',
|
|
22
|
+
] as const;
|
|
23
|
+
|
|
24
|
+
export class SignupOnboardingTesterAgent extends BaseAgent {
|
|
25
|
+
readonly agentId = 24;
|
|
26
|
+
readonly agentName = 'Signup & Onboarding Tester';
|
|
27
|
+
private baseUrl = '';
|
|
28
|
+
|
|
29
|
+
protected async preFlight(): Promise<void> {
|
|
30
|
+
const { env } = await resolveEnvironment(this.config, this.phase);
|
|
31
|
+
this.baseUrl = env.baseUrl;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
protected async execute(): Promise<Finding[]> {
|
|
35
|
+
const findings: Finding[] = [];
|
|
36
|
+
|
|
37
|
+
const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
|
|
38
|
+
const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
|
|
39
|
+
const credentials =
|
|
40
|
+
this.config.auth.credentials?.['admin'] ??
|
|
41
|
+
Object.values(this.config.auth.credentials ?? {})[0];
|
|
42
|
+
|
|
43
|
+
const { chromium } = await import('playwright');
|
|
44
|
+
|
|
45
|
+
let browser: Browser | null = null;
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
browser = await chromium.launch({ headless: true });
|
|
49
|
+
const page = await browser.newPage();
|
|
50
|
+
|
|
51
|
+
// Test 1: Registration page exists
|
|
52
|
+
const regFindings = await this.testRegistrationPage(page);
|
|
53
|
+
findings.push(...regFindings);
|
|
54
|
+
|
|
55
|
+
// Test 2: Registration validation
|
|
56
|
+
const validationFindings = await this.testRegistrationValidation(page);
|
|
57
|
+
findings.push(...validationFindings);
|
|
58
|
+
|
|
59
|
+
// Test 3: Login page
|
|
60
|
+
const loginPageFindings = await this.testLoginPage(page, loginUrl);
|
|
61
|
+
findings.push(...loginPageFindings);
|
|
62
|
+
|
|
63
|
+
// Test 4: Login flow
|
|
64
|
+
if (credentials) {
|
|
65
|
+
const loginFlowFindings = await this.testLoginFlow(page, credentials, loginUrl);
|
|
66
|
+
findings.push(...loginFlowFindings);
|
|
67
|
+
} else {
|
|
68
|
+
findings.push({
|
|
69
|
+
id: `${this.agentId}-no-credentials`,
|
|
70
|
+
type: 'infra-issue',
|
|
71
|
+
severity: 'medium',
|
|
72
|
+
agentId: this.agentId,
|
|
73
|
+
module: 'signup-onboarding',
|
|
74
|
+
description: 'No credentials configured — skipping login flow test',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Test 5: Onboarding detection
|
|
79
|
+
const onboardFindings = await this.testOnboardingDetection(page);
|
|
80
|
+
findings.push(...onboardFindings);
|
|
81
|
+
|
|
82
|
+
// Test 6: Forgot password
|
|
83
|
+
const forgotFindings = await this.testForgotPassword(page);
|
|
84
|
+
findings.push(...forgotFindings);
|
|
85
|
+
|
|
86
|
+
await page.close().catch(() => undefined);
|
|
87
|
+
} catch (playwrightError) {
|
|
88
|
+
findings.push({
|
|
89
|
+
id: `${this.agentId}-playwright-failure`,
|
|
90
|
+
type: 'infra-issue',
|
|
91
|
+
severity: 'medium',
|
|
92
|
+
agentId: this.agentId,
|
|
93
|
+
module: 'signup-onboarding',
|
|
94
|
+
description: `Playwright execution failed: ${playwrightError instanceof Error ? playwrightError.message.split('\n')[0] : String(playwrightError)}`,
|
|
95
|
+
});
|
|
96
|
+
} finally {
|
|
97
|
+
if (browser) await browser.close().catch(() => undefined);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return findings;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Test 1: Check if a registration page exists.
|
|
105
|
+
* Tries config.auth.registerUrl first, then common paths.
|
|
106
|
+
*/
|
|
107
|
+
private async testRegistrationPage(page: Page): Promise<Finding[]> {
|
|
108
|
+
const findings: Finding[] = [];
|
|
109
|
+
|
|
110
|
+
const configRegisterUrl = (this.config.auth as Record<string, unknown>).registerUrl as
|
|
111
|
+
| string
|
|
112
|
+
| undefined;
|
|
113
|
+
|
|
114
|
+
const pathsToTry = configRegisterUrl ? [configRegisterUrl] : [...REGISTER_PATHS];
|
|
115
|
+
let found = false;
|
|
116
|
+
|
|
117
|
+
for (const p of pathsToTry) {
|
|
118
|
+
const url = p.startsWith('http') ? p : `${this.baseUrl}${p}`;
|
|
119
|
+
try {
|
|
120
|
+
const response = await Promise.race([
|
|
121
|
+
page.goto(url, { waitUntil: 'domcontentloaded' }),
|
|
122
|
+
new Promise<null>((_, reject) =>
|
|
123
|
+
setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS),
|
|
124
|
+
),
|
|
125
|
+
]);
|
|
126
|
+
|
|
127
|
+
// Check for registration form elements
|
|
128
|
+
const nameField = await page
|
|
129
|
+
.locator('input[name="name"], input[placeholder*="name" i], input[autocomplete="name"]')
|
|
130
|
+
.count();
|
|
131
|
+
const emailField = await page
|
|
132
|
+
.locator('input[type="email"], input[name="email"], input[placeholder*="email" i]')
|
|
133
|
+
.count();
|
|
134
|
+
const passwordField = await page.locator('input[type="password"]').count();
|
|
135
|
+
const submitButton = await page
|
|
136
|
+
.locator('button[type="submit"], button:has-text("Register"), button:has-text("Sign up")')
|
|
137
|
+
.count();
|
|
138
|
+
|
|
139
|
+
if (emailField > 0 && passwordField > 0) {
|
|
140
|
+
found = true;
|
|
141
|
+
|
|
142
|
+
if (submitButton === 0) {
|
|
143
|
+
findings.push({
|
|
144
|
+
id: `${this.agentId}-register-no-submit`,
|
|
145
|
+
type: 'test-bug',
|
|
146
|
+
severity: 'medium',
|
|
147
|
+
agentId: this.agentId,
|
|
148
|
+
module: 'signup-onboarding',
|
|
149
|
+
description: `Registration page at ${p} has form fields but no submit button`,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
} catch {
|
|
155
|
+
// Path not reachable — try next
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (!found) {
|
|
160
|
+
findings.push({
|
|
161
|
+
id: `${this.agentId}-no-register-page`,
|
|
162
|
+
type: 'test-bug',
|
|
163
|
+
severity: 'medium',
|
|
164
|
+
agentId: this.agentId,
|
|
165
|
+
module: 'signup-onboarding',
|
|
166
|
+
description: `No registration page found at paths: ${pathsToTry.join(', ')}`,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return findings;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Test 2: Submit empty registration form and expect validation errors.
|
|
175
|
+
*/
|
|
176
|
+
private async testRegistrationValidation(page: Page): Promise<Finding[]> {
|
|
177
|
+
const findings: Finding[] = [];
|
|
178
|
+
|
|
179
|
+
// Only run if we're on a registration page with a submit button
|
|
180
|
+
const submitBtn = page.locator(
|
|
181
|
+
'button[type="submit"], button:has-text("Register"), button:has-text("Sign up")',
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
let hasSubmit = false;
|
|
185
|
+
try {
|
|
186
|
+
hasSubmit = (await submitBtn.count()) > 0;
|
|
187
|
+
} catch {
|
|
188
|
+
return findings;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (!hasSubmit) {
|
|
192
|
+
return findings;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
await Promise.race([
|
|
197
|
+
submitBtn.first().click(),
|
|
198
|
+
new Promise((_, reject) =>
|
|
199
|
+
setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS),
|
|
200
|
+
),
|
|
201
|
+
]);
|
|
202
|
+
|
|
203
|
+
// Wait briefly for validation
|
|
204
|
+
await page.waitForTimeout(500);
|
|
205
|
+
|
|
206
|
+
const errorCount = await page
|
|
207
|
+
.locator(
|
|
208
|
+
'.error, [aria-invalid="true"], [class*="error"], [role="alert"], .validation-error',
|
|
209
|
+
)
|
|
210
|
+
.count();
|
|
211
|
+
|
|
212
|
+
if (errorCount === 0) {
|
|
213
|
+
findings.push({
|
|
214
|
+
id: `${this.agentId}-register-no-validation`,
|
|
215
|
+
type: 'test-bug',
|
|
216
|
+
severity: 'high',
|
|
217
|
+
agentId: this.agentId,
|
|
218
|
+
module: 'signup-onboarding',
|
|
219
|
+
description: 'Registration form accepts empty submission without validation errors',
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
} catch {
|
|
223
|
+
// Submit failed — non-critical
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return findings;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Test 3: Verify the login page has expected elements.
|
|
231
|
+
*/
|
|
232
|
+
private async testLoginPage(page: Page, loginUrl: string): Promise<Finding[]> {
|
|
233
|
+
const findings: Finding[] = [];
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
await Promise.race([
|
|
237
|
+
page.goto(loginUrl, { waitUntil: 'domcontentloaded' }),
|
|
238
|
+
new Promise((_, reject) =>
|
|
239
|
+
setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS),
|
|
240
|
+
),
|
|
241
|
+
]);
|
|
242
|
+
|
|
243
|
+
const emailInput = await page
|
|
244
|
+
.locator('input[type="email"], input[name="email"], input[placeholder*="email" i]')
|
|
245
|
+
.count();
|
|
246
|
+
const passwordInput = await page.locator('input[type="password"]').count();
|
|
247
|
+
const submitButton = await page
|
|
248
|
+
.locator(
|
|
249
|
+
'button[type="submit"], button:has-text("Login"), button:has-text("Sign in"), button:has-text("Log in")',
|
|
250
|
+
)
|
|
251
|
+
.count();
|
|
252
|
+
|
|
253
|
+
if (emailInput === 0 || passwordInput === 0) {
|
|
254
|
+
findings.push({
|
|
255
|
+
id: `${this.agentId}-login-missing-inputs`,
|
|
256
|
+
type: 'test-bug',
|
|
257
|
+
severity: 'high',
|
|
258
|
+
agentId: this.agentId,
|
|
259
|
+
module: 'signup-onboarding',
|
|
260
|
+
description: `Login page missing required inputs — email: ${emailInput}, password: ${passwordInput}`,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (submitButton === 0) {
|
|
265
|
+
findings.push({
|
|
266
|
+
id: `${this.agentId}-login-no-submit`,
|
|
267
|
+
type: 'test-bug',
|
|
268
|
+
severity: 'high',
|
|
269
|
+
agentId: this.agentId,
|
|
270
|
+
module: 'signup-onboarding',
|
|
271
|
+
description: 'Login page has no submit button',
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
} catch (navError) {
|
|
275
|
+
findings.push({
|
|
276
|
+
id: `${this.agentId}-login-page-nav-failed`,
|
|
277
|
+
type: 'test-bug',
|
|
278
|
+
severity: 'medium',
|
|
279
|
+
agentId: this.agentId,
|
|
280
|
+
module: 'signup-onboarding',
|
|
281
|
+
description: `Failed to navigate to login page: ${navError instanceof Error ? navError.message.split('\n')[0] : String(navError)}`,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return findings;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Test 4: Fill credentials and submit login form.
|
|
290
|
+
*/
|
|
291
|
+
private async testLoginFlow(
|
|
292
|
+
page: Page,
|
|
293
|
+
credentials: { email: string; password: string },
|
|
294
|
+
loginUrl: string,
|
|
295
|
+
): Promise<Finding[]> {
|
|
296
|
+
const findings: Finding[] = [];
|
|
297
|
+
|
|
298
|
+
try {
|
|
299
|
+
await Promise.race([
|
|
300
|
+
page.goto(loginUrl, { waitUntil: 'domcontentloaded' }),
|
|
301
|
+
new Promise((_, reject) =>
|
|
302
|
+
setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS),
|
|
303
|
+
),
|
|
304
|
+
]);
|
|
305
|
+
|
|
306
|
+
try {
|
|
307
|
+
await login(page, credentials, loginUrl);
|
|
308
|
+
} catch {
|
|
309
|
+
// login helper failed — try manual approach
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const currentUrl = page.url();
|
|
313
|
+
if (currentUrl.includes('/login') || currentUrl.includes('/signin')) {
|
|
314
|
+
findings.push({
|
|
315
|
+
id: `${this.agentId}-login-flow-stuck`,
|
|
316
|
+
type: 'test-bug',
|
|
317
|
+
severity: 'medium',
|
|
318
|
+
agentId: this.agentId,
|
|
319
|
+
module: 'signup-onboarding',
|
|
320
|
+
description:
|
|
321
|
+
'Login flow did not navigate away from login page — credentials may be invalid or login flow is broken',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
} catch (flowError) {
|
|
325
|
+
findings.push({
|
|
326
|
+
id: `${this.agentId}-login-flow-error`,
|
|
327
|
+
type: 'test-bug',
|
|
328
|
+
severity: 'medium',
|
|
329
|
+
agentId: this.agentId,
|
|
330
|
+
module: 'signup-onboarding',
|
|
331
|
+
description: `Login flow test failed: ${flowError instanceof Error ? flowError.message.split('\n')[0] : String(flowError)}`,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return findings;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Test 5: After login, look for onboarding/welcome/tour modals.
|
|
340
|
+
*/
|
|
341
|
+
private async testOnboardingDetection(page: Page): Promise<Finding[]> {
|
|
342
|
+
const findings: Finding[] = [];
|
|
343
|
+
|
|
344
|
+
const selector = ONBOARDING_SELECTORS.join(', ');
|
|
345
|
+
|
|
346
|
+
try {
|
|
347
|
+
const onboardingCount = await Promise.race([
|
|
348
|
+
page.locator(selector).count(),
|
|
349
|
+
new Promise<number>((_, reject) =>
|
|
350
|
+
setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS),
|
|
351
|
+
),
|
|
352
|
+
]) as number;
|
|
353
|
+
|
|
354
|
+
if (onboardingCount > 0) {
|
|
355
|
+
findings.push({
|
|
356
|
+
id: `${this.agentId}-onboarding-detected`,
|
|
357
|
+
type: 'infra-issue',
|
|
358
|
+
severity: 'info',
|
|
359
|
+
agentId: this.agentId,
|
|
360
|
+
module: 'signup-onboarding',
|
|
361
|
+
description: `Onboarding/welcome UI detected — found ${onboardingCount} element(s) matching onboarding selectors`,
|
|
362
|
+
});
|
|
363
|
+
} else {
|
|
364
|
+
findings.push({
|
|
365
|
+
id: `${this.agentId}-no-onboarding`,
|
|
366
|
+
type: 'infra-issue',
|
|
367
|
+
severity: 'info',
|
|
368
|
+
agentId: this.agentId,
|
|
369
|
+
module: 'signup-onboarding',
|
|
370
|
+
description: 'No onboarding/welcome/tour UI detected after login',
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
} catch {
|
|
374
|
+
// Timeout — non-critical
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return findings;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Test 6: Check if forgot-password page exists with expected elements.
|
|
382
|
+
*/
|
|
383
|
+
private async testForgotPassword(page: Page): Promise<Finding[]> {
|
|
384
|
+
const findings: Finding[] = [];
|
|
385
|
+
const forgotUrl = `${this.baseUrl}/forgot-password`;
|
|
386
|
+
|
|
387
|
+
try {
|
|
388
|
+
await Promise.race([
|
|
389
|
+
page.goto(forgotUrl, { waitUntil: 'domcontentloaded' }),
|
|
390
|
+
new Promise((_, reject) =>
|
|
391
|
+
setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS),
|
|
392
|
+
),
|
|
393
|
+
]);
|
|
394
|
+
|
|
395
|
+
const emailInput = await page
|
|
396
|
+
.locator('input[type="email"], input[name="email"], input[placeholder*="email" i]')
|
|
397
|
+
.count();
|
|
398
|
+
const submitButton = await page
|
|
399
|
+
.locator(
|
|
400
|
+
'button[type="submit"], button:has-text("Reset"), button:has-text("Send"), button:has-text("Submit")',
|
|
401
|
+
)
|
|
402
|
+
.count();
|
|
403
|
+
|
|
404
|
+
if (emailInput > 0 && submitButton > 0) {
|
|
405
|
+
findings.push({
|
|
406
|
+
id: `${this.agentId}-forgot-password-found`,
|
|
407
|
+
type: 'infra-issue',
|
|
408
|
+
severity: 'info',
|
|
409
|
+
agentId: this.agentId,
|
|
410
|
+
module: 'signup-onboarding',
|
|
411
|
+
description: 'Forgot password page found with email input and submit button',
|
|
412
|
+
});
|
|
413
|
+
} else if (emailInput > 0) {
|
|
414
|
+
findings.push({
|
|
415
|
+
id: `${this.agentId}-forgot-password-no-submit`,
|
|
416
|
+
type: 'test-bug',
|
|
417
|
+
severity: 'medium',
|
|
418
|
+
agentId: this.agentId,
|
|
419
|
+
module: 'signup-onboarding',
|
|
420
|
+
description: 'Forgot password page has email input but no submit button',
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
} catch {
|
|
424
|
+
// Forgot password page not found — not critical
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return findings;
|
|
428
|
+
}
|
|
429
|
+
}
|