@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
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import type { ValidatedConfig } from '../../core/config';
|
|
3
|
+
import type { Phase } from '../../core/types';
|
|
4
|
+
|
|
5
|
+
function makeConfig(overrides: Partial<ValidatedConfig> = {}): ValidatedConfig {
|
|
6
|
+
return {
|
|
7
|
+
schemaVersion: 1, name: 'test',
|
|
8
|
+
projectRoot: '/fake/project',
|
|
9
|
+
auth: { loginUrl: '/login', credentials: { admin: { email: 'a@t.com', password: 's' } } },
|
|
10
|
+
modules: [{ id: 'dashboard', route: '/dashboard', sidebarIcon: true }],
|
|
11
|
+
environments: { alpha: { baseUrl: 'http://localhost:3000', seed: false } },
|
|
12
|
+
portals: [], breakpoints: [], integrations: [], workers: [], workflows: [],
|
|
13
|
+
accuracy: { enabled: false, decimalPrecision: 2, currencySymbol: '$', timezone: 'UTC' },
|
|
14
|
+
tenancy: { enabled: false, isolationField: 'firmId', testFirms: [] },
|
|
15
|
+
costBudget: { maxPerRun: 100, maxPerAgent: 10, alertThreshold: 0.8, onExceeded: 'abort' },
|
|
16
|
+
agentClassification: { blocking: [], advisory: [] },
|
|
17
|
+
thresholds: { unitCoverage: { lines: 80, functions: 80, branches: 80, statements: 80 }, lighthouse: { accessibility: 90, performance: 90, bestPractices: 90, seo: 90 }, apiResponseTime: 2000, bundleSizeLimit: 500000, maxConsoleErrors: 0 },
|
|
18
|
+
disabledAgents: [], disabledAgentSet: new Set<number>(),
|
|
19
|
+
...overrides,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const fetchMock = vi.fn().mockResolvedValue({ ok: true, status: 200 });
|
|
24
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
25
|
+
|
|
26
|
+
vi.mock('../../helpers/navigation', () => ({
|
|
27
|
+
login: vi.fn().mockResolvedValue(undefined),
|
|
28
|
+
waitForSectionLoad: vi.fn().mockResolvedValue(undefined),
|
|
29
|
+
navigateToSection: vi.fn().mockResolvedValue(undefined),
|
|
30
|
+
switchPortal: vi.fn().mockResolvedValue(undefined),
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
const existsSyncMock = vi.fn();
|
|
34
|
+
const readFileSyncMock = vi.fn();
|
|
35
|
+
const readdirSyncMock = vi.fn();
|
|
36
|
+
|
|
37
|
+
vi.mock('node:fs', () => ({
|
|
38
|
+
existsSync: (...args: unknown[]) => existsSyncMock(...args),
|
|
39
|
+
readFileSync: (...args: unknown[]) => readFileSyncMock(...args),
|
|
40
|
+
readdirSync: (...args: unknown[]) => readdirSyncMock(...args),
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
const { ComplexityAnalyzerAgent } = await import('../70-complexity-analyzer');
|
|
44
|
+
|
|
45
|
+
function createAgent(config: ValidatedConfig = makeConfig(), phase: Phase = 'beta') {
|
|
46
|
+
return new ComplexityAnalyzerAgent(config, phase, '/tmp/test-run');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
describe('ComplexityAnalyzerAgent', () => {
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
existsSyncMock.mockReset().mockReturnValue(true);
|
|
52
|
+
readFileSyncMock.mockReset();
|
|
53
|
+
readdirSyncMock.mockReset();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('has agentId 70 and correct name', () => {
|
|
57
|
+
const agent = createAgent();
|
|
58
|
+
expect(agent.agentId).toBe(70);
|
|
59
|
+
expect(agent.agentName).toBe('Complexity Analyzer');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('reports no src dir', async () => {
|
|
63
|
+
existsSyncMock.mockReturnValue(false);
|
|
64
|
+
const agent = createAgent();
|
|
65
|
+
const result = await agent.run();
|
|
66
|
+
const finding = result.findings.find(f => f.id.includes('no-src-dir'));
|
|
67
|
+
expect(finding).toBeDefined();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('reports files over 500 lines as low', async () => {
|
|
71
|
+
readdirSyncMock.mockReturnValue([
|
|
72
|
+
{ name: 'big.ts', isFile: () => true, isDirectory: () => false },
|
|
73
|
+
]);
|
|
74
|
+
readFileSyncMock.mockReturnValue(Array(600).fill('const x = 1;').join('\n'));
|
|
75
|
+
const agent = createAgent();
|
|
76
|
+
const result = await agent.run();
|
|
77
|
+
const finding = result.findings.find(f => f.id.includes('long-file'));
|
|
78
|
+
expect(finding).toBeDefined();
|
|
79
|
+
expect(finding!.severity).toBe('low');
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('reports files over 1000 lines as medium', async () => {
|
|
83
|
+
readdirSyncMock.mockReturnValue([
|
|
84
|
+
{ name: 'huge.ts', isFile: () => true, isDirectory: () => false },
|
|
85
|
+
]);
|
|
86
|
+
readFileSyncMock.mockReturnValue(Array(1100).fill('const x = 1;').join('\n'));
|
|
87
|
+
const agent = createAgent();
|
|
88
|
+
const result = await agent.run();
|
|
89
|
+
const finding = result.findings.find(f => f.id.includes('very-long-file'));
|
|
90
|
+
expect(finding).toBeDefined();
|
|
91
|
+
expect(finding!.severity).toBe('medium');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('reports complex functions with >15 branches', async () => {
|
|
95
|
+
readdirSyncMock.mockReturnValue([
|
|
96
|
+
{ name: 'complex.ts', isFile: () => true, isDirectory: () => false },
|
|
97
|
+
]);
|
|
98
|
+
const branches = Array(20).fill(' if (x) { y++; }').join('\n');
|
|
99
|
+
readFileSyncMock.mockReturnValue(`function complexFn() {\n${branches}\n}`);
|
|
100
|
+
const agent = createAgent();
|
|
101
|
+
const result = await agent.run();
|
|
102
|
+
const finding = result.findings.find(f => f.id.includes('complex-function'));
|
|
103
|
+
expect(finding).toBeDefined();
|
|
104
|
+
expect(finding!.severity).toBe('medium');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('no findings for simple code', async () => {
|
|
108
|
+
readdirSyncMock.mockReturnValue([
|
|
109
|
+
{ name: 'simple.ts', isFile: () => true, isDirectory: () => false },
|
|
110
|
+
]);
|
|
111
|
+
readFileSyncMock.mockReturnValue('function simple() {\n return 1;\n}');
|
|
112
|
+
const agent = createAgent();
|
|
113
|
+
const result = await agent.run();
|
|
114
|
+
const complexFinding = result.findings.find(f => f.id.includes('complex-function'));
|
|
115
|
+
expect(complexFinding).toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('skips test files', async () => {
|
|
119
|
+
readdirSyncMock.mockReturnValue([
|
|
120
|
+
{ name: 'app.test.ts', isFile: () => true, isDirectory: () => false },
|
|
121
|
+
]);
|
|
122
|
+
const agent = createAgent();
|
|
123
|
+
const result = await agent.run();
|
|
124
|
+
expect(result.status).toBeDefined();
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('limits complex function findings to 10', async () => {
|
|
128
|
+
readdirSyncMock.mockReturnValue([
|
|
129
|
+
{ name: 'complex.ts', isFile: () => true, isDirectory: () => false },
|
|
130
|
+
]);
|
|
131
|
+
const funcs = Array.from({ length: 15 }, (_, i) => {
|
|
132
|
+
const branches = Array(20).fill(' if (x) { y++; }').join('\n');
|
|
133
|
+
return `function fn${i}() {\n${branches}\n}`;
|
|
134
|
+
}).join('\n');
|
|
135
|
+
readFileSyncMock.mockReturnValue(funcs);
|
|
136
|
+
const agent = createAgent();
|
|
137
|
+
const result = await agent.run();
|
|
138
|
+
const complexFindings = result.findings.filter(f => f.id.match(/complex-function-\d+/));
|
|
139
|
+
expect(complexFindings.length).toBe(10);
|
|
140
|
+
const summary = result.findings.find(f => f.id.includes('complex-functions-summary'));
|
|
141
|
+
expect(summary).toBeDefined();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('adds evidence with scan stats', async () => {
|
|
145
|
+
readdirSyncMock.mockReturnValue([
|
|
146
|
+
{ name: 'app.ts', isFile: () => true, isDirectory: () => false },
|
|
147
|
+
]);
|
|
148
|
+
readFileSyncMock.mockReturnValue('const x = 1;');
|
|
149
|
+
const agent = createAgent();
|
|
150
|
+
const result = await agent.run();
|
|
151
|
+
expect(result.evidence.length).toBeGreaterThan(0);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('recurses into subdirectories', async () => {
|
|
155
|
+
readdirSyncMock
|
|
156
|
+
.mockReturnValueOnce([
|
|
157
|
+
{ name: 'sub', isFile: () => false, isDirectory: () => true },
|
|
158
|
+
])
|
|
159
|
+
.mockReturnValueOnce([
|
|
160
|
+
{ name: 'helper.ts', isFile: () => true, isDirectory: () => false },
|
|
161
|
+
]);
|
|
162
|
+
readFileSyncMock.mockReturnValue('const x = 1;');
|
|
163
|
+
const agent = createAgent();
|
|
164
|
+
const result = await agent.run();
|
|
165
|
+
expect(result.status).toBeDefined();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('handles empty file', async () => {
|
|
169
|
+
readdirSyncMock.mockReturnValue([
|
|
170
|
+
{ name: 'empty.ts', isFile: () => true, isDirectory: () => false },
|
|
171
|
+
]);
|
|
172
|
+
readFileSyncMock.mockReturnValue('');
|
|
173
|
+
const agent = createAgent();
|
|
174
|
+
const result = await agent.run();
|
|
175
|
+
expect(result.status).toBeDefined();
|
|
176
|
+
});
|
|
177
|
+
});
|
|
@@ -7,8 +7,8 @@ import {
|
|
|
7
7
|
} from '../registry';
|
|
8
8
|
|
|
9
9
|
describe('AGENT_TIERS', () => {
|
|
10
|
-
it('should contain exactly
|
|
11
|
-
expect(Object.keys(AGENT_TIERS)).toHaveLength(
|
|
10
|
+
it('should contain exactly 70 agents', () => {
|
|
11
|
+
expect(Object.keys(AGENT_TIERS)).toHaveLength(70);
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
it('should have 8 free-tier agents', () => {
|
|
@@ -16,14 +16,14 @@ describe('AGENT_TIERS', () => {
|
|
|
16
16
|
expect(freeAgents).toHaveLength(8);
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
it('should have
|
|
19
|
+
it('should have 26 pro-tier agents', () => {
|
|
20
20
|
const proAgents = Object.entries(AGENT_TIERS).filter(([, t]) => t === 'pro');
|
|
21
|
-
expect(proAgents).toHaveLength(
|
|
21
|
+
expect(proAgents).toHaveLength(26);
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
it('should have
|
|
24
|
+
it('should have 36 enterprise-tier agents', () => {
|
|
25
25
|
const entAgents = Object.entries(AGENT_TIERS).filter(([, t]) => t === 'enterprise');
|
|
26
|
-
expect(entAgents).toHaveLength(
|
|
26
|
+
expect(entAgents).toHaveLength(36);
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
it('should classify known agents correctly', () => {
|
|
@@ -52,8 +52,8 @@ describe('getAgentTier', () => {
|
|
|
52
52
|
|
|
53
53
|
describe('isAgentAvailable', () => {
|
|
54
54
|
const freeAgents = [1, 2, 3, 4, 5, 9, 10, 11];
|
|
55
|
-
const proAgents = [6, 7, 8, 12, 13, 15, 21, 22, 23];
|
|
56
|
-
const enterpriseAgents = [14, 16, 17, 18, 19, 20];
|
|
55
|
+
const proAgents = [6, 7, 8, 12, 13, 15, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 37, 38, 46, 48, 62, 68, 69, 70];
|
|
56
|
+
const enterpriseAgents = [14, 16, 17, 18, 19, 20, 30, 34, 35, 36, 39, 40, 41, 42, 43, 44, 45, 47, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67];
|
|
57
57
|
|
|
58
58
|
describe('free license', () => {
|
|
59
59
|
it('should allow free-tier agents', () => {
|
|
@@ -113,10 +113,10 @@ describe('isAgentAvailable', () => {
|
|
|
113
113
|
// ---------------------------------------------------------------------------
|
|
114
114
|
|
|
115
115
|
describe('registerAllAgents', () => {
|
|
116
|
-
// We need to test that registerAllAgents creates
|
|
116
|
+
// We need to test that registerAllAgents creates 70 agents and registers them all.
|
|
117
117
|
// We mock the orchestrator's registerAgent method.
|
|
118
118
|
|
|
119
|
-
it('registers all
|
|
119
|
+
it('registers all 70 agents with the orchestrator', async () => {
|
|
120
120
|
// We need to dynamically import to avoid circular dependencies with mocked modules
|
|
121
121
|
// Instead, test the function signature by checking it registers the right count
|
|
122
122
|
const { registerAllAgents } = await import('../registry');
|
|
@@ -158,13 +158,13 @@ describe('registerAllAgents', () => {
|
|
|
158
158
|
'/tmp/run',
|
|
159
159
|
);
|
|
160
160
|
|
|
161
|
-
expect(mockOrchestrator.registerAgent).toHaveBeenCalledTimes(
|
|
161
|
+
expect(mockOrchestrator.registerAgent).toHaveBeenCalledTimes(70);
|
|
162
162
|
|
|
163
|
-
// Verify agent IDs 1-
|
|
163
|
+
// Verify agent IDs 1-70 are all registered
|
|
164
164
|
const registeredIds = mockOrchestrator.registerAgent.mock.calls.map(
|
|
165
165
|
(call: unknown[]) => call[0],
|
|
166
166
|
);
|
|
167
|
-
for (let i = 1; i <=
|
|
167
|
+
for (let i = 1; i <= 70; i++) {
|
|
168
168
|
expect(registeredIds).toContain(i);
|
|
169
169
|
}
|
|
170
170
|
});
|
package/agents/registry.ts
CHANGED
|
@@ -8,8 +8,8 @@ export type LicenseTier = 'free' | 'pro' | 'enterprise';
|
|
|
8
8
|
/**
|
|
9
9
|
* Maps each agent number to its license tier.
|
|
10
10
|
* - free (8 agents): core testing pipeline
|
|
11
|
-
* - pro (
|
|
12
|
-
* - enterprise (
|
|
11
|
+
* - pro (26 agents): advanced testing capabilities
|
|
12
|
+
* - enterprise (36 agents): full platform auditing
|
|
13
13
|
*/
|
|
14
14
|
export const AGENT_TIERS: Record<number, LicenseTier> = {
|
|
15
15
|
/* ── Free tier (8) ── */
|
|
@@ -22,7 +22,7 @@ export const AGENT_TIERS: Record<number, LicenseTier> = {
|
|
|
22
22
|
10: 'free', // Reporter
|
|
23
23
|
11: 'free', // Fixer
|
|
24
24
|
|
|
25
|
-
/* ── Pro tier (
|
|
25
|
+
/* ── Pro tier (26) ── */
|
|
26
26
|
6: 'pro', // API Exerciser
|
|
27
27
|
7: 'pro', // Security Scout
|
|
28
28
|
8: 'pro', // A11y Guardian
|
|
@@ -32,14 +32,61 @@ export const AGENT_TIERS: Record<number, LicenseTier> = {
|
|
|
32
32
|
21: 'pro', // State & Session Tester
|
|
33
33
|
22: 'pro', // Email Notification Verifier
|
|
34
34
|
23: 'pro', // Migration Tester
|
|
35
|
+
24: 'pro', // Signup & Onboarding Tester
|
|
36
|
+
25: 'pro', // CRUD Flow Tester
|
|
37
|
+
26: 'pro', // Form Validator
|
|
38
|
+
27: 'pro', // Search & Filter Tester
|
|
39
|
+
28: 'pro', // Navigation & Routing Tester
|
|
40
|
+
29: 'pro', // Responsive Interaction Tester
|
|
41
|
+
31: 'pro', // Load Tester
|
|
42
|
+
32: 'pro', // Memory Leak Detector
|
|
43
|
+
33: 'pro', // Bundle Analyzer
|
|
44
|
+
37: 'pro', // Dependency Scanner
|
|
45
|
+
38: 'pro', // Secrets Scanner
|
|
46
|
+
46: 'pro', // SEO Auditor
|
|
47
|
+
48: 'pro', // Lighthouse Auditor
|
|
48
|
+
62: 'pro', // Env Config Validator
|
|
49
|
+
68: 'pro', // Dead Code Detector
|
|
50
|
+
69: 'pro', // Type Safety Auditor
|
|
51
|
+
70: 'pro', // Complexity Analyzer
|
|
35
52
|
|
|
36
|
-
/* ── Enterprise tier (
|
|
53
|
+
/* ── Enterprise tier (36) ── */
|
|
37
54
|
14: 'enterprise', // Data Integrity Auditor
|
|
38
55
|
16: 'enterprise', // Chaos Agent
|
|
39
56
|
17: 'enterprise', // Documentation Validator
|
|
40
57
|
18: 'enterprise', // Integration Watchdog
|
|
41
58
|
19: 'enterprise', // Tenant Isolation Auditor
|
|
42
59
|
20: 'enterprise', // Workflow Completion Tester
|
|
60
|
+
30: 'enterprise', // Multi-User Scenario Tester
|
|
61
|
+
34: 'enterprise', // XSS Scanner
|
|
62
|
+
35: 'enterprise', // CSRF Tester
|
|
63
|
+
36: 'enterprise', // Auth Fuzzer
|
|
64
|
+
39: 'enterprise', // API Contract Tester
|
|
65
|
+
40: 'enterprise', // Rate Limit Tester
|
|
66
|
+
41: 'enterprise', // API Pagination Tester
|
|
67
|
+
42: 'enterprise', // GraphQL Tester
|
|
68
|
+
43: 'enterprise', // Data Consistency Checker
|
|
69
|
+
44: 'enterprise', // Backup Recovery Tester
|
|
70
|
+
45: 'enterprise', // Data Privacy Scanner
|
|
71
|
+
47: 'enterprise', // Social Preview Tester
|
|
72
|
+
49: 'enterprise', // i18n Tester
|
|
73
|
+
50: 'enterprise', // Timezone Tester
|
|
74
|
+
51: 'enterprise', // Error Recovery Tester
|
|
75
|
+
52: 'enterprise', // Offline Mode Tester
|
|
76
|
+
53: 'enterprise', // Graceful Degradation Tester
|
|
77
|
+
54: 'enterprise', // WebSocket Tester
|
|
78
|
+
55: 'enterprise', // Realtime Sync Tester
|
|
79
|
+
56: 'enterprise', // File Upload Tester
|
|
80
|
+
57: 'enterprise', // Export Tester
|
|
81
|
+
58: 'enterprise', // Payment Flow Tester
|
|
82
|
+
59: 'enterprise', // SSL/TLS Auditor
|
|
83
|
+
60: 'enterprise', // DNS/CDN Tester
|
|
84
|
+
61: 'enterprise', // Docker Health Checker
|
|
85
|
+
63: 'enterprise', // Log Quality Auditor
|
|
86
|
+
64: 'enterprise', // Analytics Tracker Tester
|
|
87
|
+
65: 'enterprise', // GDPR Compliance Tester
|
|
88
|
+
66: 'enterprise', // SOC2 Control Validator
|
|
89
|
+
67: 'enterprise', // WCAG AAA Tester
|
|
43
90
|
};
|
|
44
91
|
|
|
45
92
|
/** Returns the tier classification for a given agent number. */
|
|
@@ -91,9 +138,56 @@ import { WorkflowCompletionTesterAgent } from './20-workflow-completion-tester';
|
|
|
91
138
|
import { StateSessionTesterAgent } from './21-state-session-tester';
|
|
92
139
|
import { EmailNotificationVerifierAgent } from './22-email-notification-verifier';
|
|
93
140
|
import { MigrationTesterAgent } from './23-migration-tester';
|
|
141
|
+
import { CrudFlowTesterAgent } from './25-crud-flow-tester';
|
|
142
|
+
import { FormValidatorAgent } from './26-form-validator';
|
|
143
|
+
import { SignupOnboardingTesterAgent } from './24-signup-onboarding-tester';
|
|
144
|
+
import { NavigationRoutingTesterAgent } from './28-navigation-routing-tester';
|
|
145
|
+
import { SearchFilterTesterAgent } from './27-search-filter-tester';
|
|
146
|
+
import { ResponsiveInteractionTesterAgent } from './29-responsive-interaction-tester';
|
|
147
|
+
import { MultiUserScenarioTesterAgent } from './30-multi-user-scenario-tester';
|
|
148
|
+
import { LoadTesterAgent } from './31-load-tester';
|
|
149
|
+
import { MemoryLeakDetectorAgent } from './32-memory-leak-detector';
|
|
150
|
+
import { BundleAnalyzerAgent } from './33-bundle-analyzer';
|
|
151
|
+
import { XssScannerAgent } from './34-xss-scanner';
|
|
152
|
+
import { CsrfTesterAgent } from './35-csrf-tester';
|
|
153
|
+
import { AuthFuzzerAgent } from './36-auth-fuzzer';
|
|
154
|
+
import { DependencyScannerAgent } from './37-dependency-scanner';
|
|
155
|
+
import { SecretsScannerAgent } from './38-secrets-scanner';
|
|
156
|
+
import { ApiContractTesterAgent } from './39-api-contract-tester';
|
|
157
|
+
import { RateLimitTesterAgent } from './40-rate-limit-tester';
|
|
158
|
+
import { ApiPaginationTesterAgent } from './41-api-pagination-tester';
|
|
159
|
+
import { GraphqlTesterAgent } from './42-graphql-tester';
|
|
160
|
+
import { DataConsistencyCheckerAgent } from './43-data-consistency-checker';
|
|
161
|
+
import { BackupRecoveryTesterAgent } from './44-backup-recovery-tester';
|
|
162
|
+
import { DataPrivacyScannerAgent } from './45-data-privacy-scanner';
|
|
163
|
+
import { SeoAuditorAgent } from './46-seo-auditor';
|
|
164
|
+
import { SocialPreviewTesterAgent } from './47-social-preview-tester';
|
|
165
|
+
import { LighthouseAuditorAgent } from './48-lighthouse-auditor';
|
|
166
|
+
import { I18nTesterAgent } from './49-i18n-tester';
|
|
167
|
+
import { TimezoneTesterAgent } from './50-timezone-tester';
|
|
168
|
+
import { ErrorRecoveryTesterAgent } from './51-error-recovery-tester';
|
|
169
|
+
import { OfflineModeTesterAgent } from './52-offline-mode-tester';
|
|
170
|
+
import { GracefulDegradationTesterAgent } from './53-graceful-degradation-tester';
|
|
171
|
+
import { WebSocketTesterAgent } from './54-websocket-tester';
|
|
172
|
+
import { RealtimeSyncTesterAgent } from './55-realtime-sync-tester';
|
|
173
|
+
import { FileUploadTesterAgent } from './56-file-upload-tester';
|
|
174
|
+
import { ExportTesterAgent } from './57-export-tester';
|
|
175
|
+
import { PaymentFlowTesterAgent } from './58-payment-flow-tester';
|
|
176
|
+
import { SslTlsAuditorAgent } from './59-ssl-tls-auditor';
|
|
177
|
+
import { DnsCdnTesterAgent } from './60-dns-cdn-tester';
|
|
178
|
+
import { DockerHealthCheckerAgent } from './61-docker-health-checker';
|
|
179
|
+
import { EnvConfigValidatorAgent } from './62-env-config-validator';
|
|
180
|
+
import { LogQualityAuditorAgent } from './63-log-quality-auditor';
|
|
181
|
+
import { AnalyticsTrackerTesterAgent } from './64-analytics-tracker-tester';
|
|
182
|
+
import { GdprComplianceTesterAgent } from './65-gdpr-compliance-tester';
|
|
183
|
+
import { Soc2ControlValidatorAgent } from './66-soc2-control-validator';
|
|
184
|
+
import { WcagAaaTesterAgent } from './67-wcag-aaa-tester';
|
|
185
|
+
import { DeadCodeDetectorAgent } from './68-dead-code-detector';
|
|
186
|
+
import { TypeSafetyAuditorAgent } from './69-type-safety-auditor';
|
|
187
|
+
import { ComplexityAnalyzerAgent } from './70-complexity-analyzer';
|
|
94
188
|
|
|
95
189
|
/**
|
|
96
|
-
* Register all
|
|
190
|
+
* Register all 70 agents with the orchestrator.
|
|
97
191
|
* Each agent is instantiated with the validated config, phase, and run directory.
|
|
98
192
|
* Since agents may run in different phases, we register them for all phases
|
|
99
193
|
* and the orchestrator handles dispatching only the ones needed per phase.
|
|
@@ -128,6 +222,53 @@ export function registerAllAgents(
|
|
|
128
222
|
new StateSessionTesterAgent(config, phase, runDir),
|
|
129
223
|
new EmailNotificationVerifierAgent(config, phase, runDir),
|
|
130
224
|
new MigrationTesterAgent(config, phase, runDir),
|
|
225
|
+
new SignupOnboardingTesterAgent(config, phase, runDir),
|
|
226
|
+
new CrudFlowTesterAgent(config, phase, runDir),
|
|
227
|
+
new FormValidatorAgent(config, phase, runDir),
|
|
228
|
+
new SearchFilterTesterAgent(config, phase, runDir),
|
|
229
|
+
new NavigationRoutingTesterAgent(config, phase, runDir),
|
|
230
|
+
new ResponsiveInteractionTesterAgent(config, phase, runDir),
|
|
231
|
+
new MultiUserScenarioTesterAgent(config, phase, runDir),
|
|
232
|
+
new LoadTesterAgent(config, phase, runDir),
|
|
233
|
+
new MemoryLeakDetectorAgent(config, phase, runDir),
|
|
234
|
+
new BundleAnalyzerAgent(config, phase, runDir),
|
|
235
|
+
new XssScannerAgent(config, phase, runDir),
|
|
236
|
+
new CsrfTesterAgent(config, phase, runDir),
|
|
237
|
+
new AuthFuzzerAgent(config, phase, runDir),
|
|
238
|
+
new DependencyScannerAgent(config, phase, runDir),
|
|
239
|
+
new SecretsScannerAgent(config, phase, runDir),
|
|
240
|
+
new ApiContractTesterAgent(config, phase, runDir),
|
|
241
|
+
new RateLimitTesterAgent(config, phase, runDir),
|
|
242
|
+
new ApiPaginationTesterAgent(config, phase, runDir),
|
|
243
|
+
new GraphqlTesterAgent(config, phase, runDir),
|
|
244
|
+
new DataConsistencyCheckerAgent(config, phase, runDir),
|
|
245
|
+
new BackupRecoveryTesterAgent(config, phase, runDir),
|
|
246
|
+
new DataPrivacyScannerAgent(config, phase, runDir),
|
|
247
|
+
new SeoAuditorAgent(config, phase, runDir),
|
|
248
|
+
new SocialPreviewTesterAgent(config, phase, runDir),
|
|
249
|
+
new LighthouseAuditorAgent(config, phase, runDir),
|
|
250
|
+
new I18nTesterAgent(config, phase, runDir),
|
|
251
|
+
new TimezoneTesterAgent(config, phase, runDir),
|
|
252
|
+
new ErrorRecoveryTesterAgent(config, phase, runDir),
|
|
253
|
+
new OfflineModeTesterAgent(config, phase, runDir),
|
|
254
|
+
new GracefulDegradationTesterAgent(config, phase, runDir),
|
|
255
|
+
new WebSocketTesterAgent(config, phase, runDir),
|
|
256
|
+
new RealtimeSyncTesterAgent(config, phase, runDir),
|
|
257
|
+
new FileUploadTesterAgent(config, phase, runDir),
|
|
258
|
+
new ExportTesterAgent(config, phase, runDir),
|
|
259
|
+
new PaymentFlowTesterAgent(config, phase, runDir),
|
|
260
|
+
new SslTlsAuditorAgent(config, phase, runDir),
|
|
261
|
+
new DnsCdnTesterAgent(config, phase, runDir),
|
|
262
|
+
new DockerHealthCheckerAgent(config, phase, runDir),
|
|
263
|
+
new EnvConfigValidatorAgent(config, phase, runDir),
|
|
264
|
+
new LogQualityAuditorAgent(config, phase, runDir),
|
|
265
|
+
new AnalyticsTrackerTesterAgent(config, phase, runDir),
|
|
266
|
+
new GdprComplianceTesterAgent(config, phase, runDir),
|
|
267
|
+
new Soc2ControlValidatorAgent(config, phase, runDir),
|
|
268
|
+
new WcagAaaTesterAgent(config, phase, runDir),
|
|
269
|
+
new DeadCodeDetectorAgent(config, phase, runDir),
|
|
270
|
+
new TypeSafetyAuditorAgent(config, phase, runDir),
|
|
271
|
+
new ComplexityAnalyzerAgent(config, phase, runDir),
|
|
131
272
|
];
|
|
132
273
|
|
|
133
274
|
for (const agent of agents) {
|
|
@@ -169,20 +169,20 @@ describe('Sample Platform — TestTeam Integration', () => {
|
|
|
169
169
|
});
|
|
170
170
|
|
|
171
171
|
describe('Orchestrator.dryRun with sample config', () => {
|
|
172
|
-
it('returns agent IDs [1, 2, 23, 3, 4, 5] for alpha phase', () => {
|
|
172
|
+
it('returns agent IDs [1, 2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70] for alpha phase', () => {
|
|
173
173
|
const validated = validateConfig(sampleConfig);
|
|
174
174
|
const orchestrator = new Orchestrator(validated);
|
|
175
175
|
const plan = orchestrator.dryRun('alpha');
|
|
176
176
|
|
|
177
|
-
expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 3, 4, 5]);
|
|
177
|
+
expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70]);
|
|
178
178
|
});
|
|
179
179
|
|
|
180
|
-
it('returns agent IDs
|
|
180
|
+
it('returns all 59 agent IDs for beta phase', () => {
|
|
181
181
|
const validated = validateConfig(sampleConfig);
|
|
182
182
|
const orchestrator = new Orchestrator(validated);
|
|
183
183
|
const plan = orchestrator.dryRun('beta');
|
|
184
184
|
|
|
185
|
-
expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
|
|
185
|
+
expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
|
|
186
186
|
});
|
|
187
187
|
|
|
188
188
|
it('marks all alpha agents as unregistered when no agents are registered', () => {
|
|
@@ -62,21 +62,21 @@ describe('Orchestrator', () => {
|
|
|
62
62
|
const orchestrator = new Orchestrator(stubConfig);
|
|
63
63
|
const plan = orchestrator.dryRun('alpha');
|
|
64
64
|
|
|
65
|
-
expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 3, 4, 5]);
|
|
65
|
+
expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70]);
|
|
66
66
|
});
|
|
67
67
|
|
|
68
68
|
it('returns the correct agent IDs for beta', () => {
|
|
69
69
|
const orchestrator = new Orchestrator(stubConfig);
|
|
70
70
|
const plan = orchestrator.dryRun('beta');
|
|
71
71
|
|
|
72
|
-
expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
|
|
72
|
+
expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
|
|
73
73
|
});
|
|
74
74
|
|
|
75
75
|
it('returns the correct agent IDs for uat', () => {
|
|
76
76
|
const orchestrator = new Orchestrator(stubConfig);
|
|
77
77
|
const plan = orchestrator.dryRun('uat');
|
|
78
78
|
|
|
79
|
-
expect(plan.map(e => e.agentId)).toEqual([5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17]);
|
|
79
|
+
expect(plan.map(e => e.agentId)).toEqual([5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
82
|
it('returns the correct agent IDs for release', () => {
|
|
@@ -163,12 +163,12 @@ describe('Orchestrator', () => {
|
|
|
163
163
|
|
|
164
164
|
it('skips unregistered agents and includes them in skippedAgents', async () => {
|
|
165
165
|
const orchestrator = new Orchestrator(stubConfig, tmpDir);
|
|
166
|
-
// Register only agent 1, not
|
|
166
|
+
// Register only agent 1, not the others in alpha dispatch
|
|
167
167
|
orchestrator.registerAgent(1, createMockAgent(1));
|
|
168
168
|
|
|
169
169
|
const result = await orchestrator.runPhase('alpha');
|
|
170
170
|
|
|
171
|
-
expect(result.skippedAgents).toEqual(expect.arrayContaining([2, 23, 3, 4, 5]));
|
|
171
|
+
expect(result.skippedAgents).toEqual(expect.arrayContaining([2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70]));
|
|
172
172
|
expect(result.skippedAgents).not.toContain(1);
|
|
173
173
|
});
|
|
174
174
|
|
|
@@ -255,7 +255,7 @@ describe('Orchestrator', () => {
|
|
|
255
255
|
|
|
256
256
|
it('free tier blocks beta phase', async () => {
|
|
257
257
|
const orchestrator = createOrchestratorWithTier('free');
|
|
258
|
-
registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
|
|
258
|
+
registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
|
|
259
259
|
|
|
260
260
|
const result = await orchestrator.runPhase('beta');
|
|
261
261
|
|
|
@@ -266,7 +266,7 @@ describe('Orchestrator', () => {
|
|
|
266
266
|
|
|
267
267
|
it('free tier blocks uat phase', async () => {
|
|
268
268
|
const orchestrator = createOrchestratorWithTier('free');
|
|
269
|
-
registerPhaseAgents(orchestrator, [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17]);
|
|
269
|
+
registerPhaseAgents(orchestrator, [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
|
|
270
270
|
|
|
271
271
|
const result = await orchestrator.runPhase('uat');
|
|
272
272
|
|
|
@@ -321,8 +321,8 @@ describe('Orchestrator', () => {
|
|
|
321
321
|
|
|
322
322
|
it('free tier skips pro agents with info finding', async () => {
|
|
323
323
|
const orchestrator = createOrchestratorWithTier('free');
|
|
324
|
-
// Alpha phase: [1, 2, 23, 3, 4, 5]. Agent 23
|
|
325
|
-
registerPhaseAgents(orchestrator, [1, 2, 23, 3, 4, 5]);
|
|
324
|
+
// Alpha phase: [1, 2, 23, 24, 3, 4, 5]. Agent 23 and 24 are pro tier.
|
|
325
|
+
registerPhaseAgents(orchestrator, [1, 2, 23, 24, 3, 4, 5]);
|
|
326
326
|
|
|
327
327
|
const result = await orchestrator.runPhase('alpha');
|
|
328
328
|
|
|
@@ -360,11 +360,11 @@ describe('Orchestrator', () => {
|
|
|
360
360
|
it('pro tier skips enterprise agents with info finding', async () => {
|
|
361
361
|
const orchestrator = createOrchestratorWithTier('pro');
|
|
362
362
|
// Beta phase includes enterprise agents: 14, 16, 18, 19
|
|
363
|
-
registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
|
|
363
|
+
registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
|
|
364
364
|
|
|
365
365
|
const result = await orchestrator.runPhase('beta');
|
|
366
366
|
|
|
367
|
-
// Enterprise agents 14, 16, 18, 19 should be skipped
|
|
367
|
+
// Enterprise agents 14, 16, 18, 19, 30 should be skipped
|
|
368
368
|
expect(result.skippedAgents).toContain(14);
|
|
369
369
|
expect(result.skippedAgents).toContain(16);
|
|
370
370
|
expect(result.skippedAgents).toContain(18);
|
|
@@ -384,7 +384,7 @@ describe('Orchestrator', () => {
|
|
|
384
384
|
it('pro tier allows all phases but gates enterprise agents', async () => {
|
|
385
385
|
const orchestrator = createOrchestratorWithTier('pro');
|
|
386
386
|
// UAT includes enterprise agents: 14, 18, 19, 20
|
|
387
|
-
registerPhaseAgents(orchestrator, [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17]);
|
|
387
|
+
registerPhaseAgents(orchestrator, [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
|
|
388
388
|
|
|
389
389
|
const result = await orchestrator.runPhase('uat');
|
|
390
390
|
|
|
@@ -397,12 +397,13 @@ describe('Orchestrator', () => {
|
|
|
397
397
|
expect(result.agentResults[18].status).toBe('skipped');
|
|
398
398
|
expect(result.agentResults[19].status).toBe('skipped');
|
|
399
399
|
expect(result.agentResults[20].status).toBe('skipped');
|
|
400
|
+
expect(result.agentResults[30].status).toBe('skipped');
|
|
400
401
|
});
|
|
401
402
|
|
|
402
403
|
it('enterprise tier allows all agents', async () => {
|
|
403
404
|
const orchestrator = createOrchestratorWithTier('enterprise');
|
|
404
405
|
// Beta phase: all agents should run
|
|
405
|
-
registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
|
|
406
|
+
registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
|
|
406
407
|
|
|
407
408
|
const result = await orchestrator.runPhase('beta');
|
|
408
409
|
|
|
@@ -430,7 +431,7 @@ describe('Orchestrator', () => {
|
|
|
430
431
|
orchestrator._getLicenseTier = () => 'enterprise';
|
|
431
432
|
|
|
432
433
|
// Register all alpha agents
|
|
433
|
-
for (const id of [1, 2, 23, 3, 4, 5]) {
|
|
434
|
+
for (const id of [1, 2, 23, 24, 3, 4, 5]) {
|
|
434
435
|
orchestrator.registerAgent(id, createMockAgent(id, { durationMs: 100000 }));
|
|
435
436
|
}
|
|
436
437
|
|
|
@@ -450,7 +451,7 @@ describe('Orchestrator', () => {
|
|
|
450
451
|
|
|
451
452
|
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => undefined);
|
|
452
453
|
|
|
453
|
-
for (const id of [1, 2, 23, 3, 4, 5]) {
|
|
454
|
+
for (const id of [1, 2, 23, 24, 3, 4, 5]) {
|
|
454
455
|
orchestrator.registerAgent(id, createMockAgent(id, { durationMs: 100000 }));
|
|
455
456
|
}
|
|
456
457
|
|
|
@@ -466,7 +467,7 @@ describe('Orchestrator', () => {
|
|
|
466
467
|
orchestrator._getLicenseTier = () => 'enterprise';
|
|
467
468
|
|
|
468
469
|
// Beta phase has parallel-safe agents: 6, 7, 8, 12, 13, etc.
|
|
469
|
-
for (const id of [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]) {
|
|
470
|
+
for (const id of [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]) {
|
|
470
471
|
orchestrator.registerAgent(id, createMockAgent(id));
|
|
471
472
|
}
|
|
472
473
|
|