@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,12 @@
|
|
|
1
|
+
import type { Finding } from '../core/types';
|
|
2
|
+
import { BaseAgent } from './base-agent';
|
|
3
|
+
export declare class FormValidatorAgent extends BaseAgent {
|
|
4
|
+
readonly agentId = 26;
|
|
5
|
+
readonly agentName = "Form Validator";
|
|
6
|
+
private baseUrl;
|
|
7
|
+
protected preFlight(): Promise<void>;
|
|
8
|
+
protected execute(): Promise<Finding[]>;
|
|
9
|
+
private testModuleForms;
|
|
10
|
+
private testSingleForm;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=26-form-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"26-form-validator.d.ts","sourceRoot":"","sources":["../../agents/26-form-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBzC,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,oBAAoB;IACtC,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAS1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAiE/B,eAAe;YA8Df,cAAc;CAuI7B"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent';
|
|
2
|
+
import { resolveEnvironment } from '../helpers/env-resolver';
|
|
3
|
+
import { login } from '../helpers/navigation';
|
|
4
|
+
/** Timeout (ms) for individual form test operations. */
|
|
5
|
+
const OP_TIMEOUT_MS = 5_000;
|
|
6
|
+
/** Selectors that indicate validation error messages. */
|
|
7
|
+
const VALIDATION_ERROR_SELECTORS = [
|
|
8
|
+
'.error',
|
|
9
|
+
'[aria-invalid="true"]',
|
|
10
|
+
'.text-red',
|
|
11
|
+
'[class*="error"]',
|
|
12
|
+
'[role="alert"]',
|
|
13
|
+
'.field-error',
|
|
14
|
+
'.validation-error',
|
|
15
|
+
];
|
|
16
|
+
export class FormValidatorAgent extends BaseAgent {
|
|
17
|
+
agentId = 26;
|
|
18
|
+
agentName = 'Form Validator';
|
|
19
|
+
baseUrl = '';
|
|
20
|
+
async preFlight() {
|
|
21
|
+
if (!this.config.modules || this.config.modules.length === 0) {
|
|
22
|
+
throw new Error('FormValidatorAgent requires at least one module in config.modules');
|
|
23
|
+
}
|
|
24
|
+
const { env } = await resolveEnvironment(this.config, this.phase);
|
|
25
|
+
this.baseUrl = env.baseUrl;
|
|
26
|
+
}
|
|
27
|
+
async execute() {
|
|
28
|
+
const findings = [];
|
|
29
|
+
const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
|
|
30
|
+
const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
|
|
31
|
+
const credentials = this.config.auth.credentials?.['admin'] ??
|
|
32
|
+
Object.values(this.config.auth.credentials ?? {})[0];
|
|
33
|
+
if (!credentials) {
|
|
34
|
+
findings.push({
|
|
35
|
+
id: `${this.agentId}-no-credentials`,
|
|
36
|
+
type: 'infra-issue',
|
|
37
|
+
severity: 'medium',
|
|
38
|
+
agentId: this.agentId,
|
|
39
|
+
module: 'form-validator',
|
|
40
|
+
description: 'No credentials configured — continuing without authentication',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const { chromium } = await import('playwright');
|
|
44
|
+
let browser = null;
|
|
45
|
+
try {
|
|
46
|
+
browser = await chromium.launch({ headless: true });
|
|
47
|
+
const page = await browser.newPage();
|
|
48
|
+
if (credentials) {
|
|
49
|
+
try {
|
|
50
|
+
await login(page, credentials, loginUrl);
|
|
51
|
+
}
|
|
52
|
+
catch (loginError) {
|
|
53
|
+
findings.push({
|
|
54
|
+
id: `${this.agentId}-login-failed`,
|
|
55
|
+
type: 'infra-issue',
|
|
56
|
+
severity: 'medium',
|
|
57
|
+
agentId: this.agentId,
|
|
58
|
+
module: 'form-validator',
|
|
59
|
+
description: `Login failed — continuing anonymously: ${loginError instanceof Error ? loginError.message.split('\n')[0] : String(loginError)}`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const mod of this.config.modules) {
|
|
64
|
+
const moduleFindings = await this.testModuleForms(page, mod.id, mod.route);
|
|
65
|
+
findings.push(...moduleFindings);
|
|
66
|
+
}
|
|
67
|
+
await page.close().catch(() => undefined);
|
|
68
|
+
}
|
|
69
|
+
catch (playwrightError) {
|
|
70
|
+
findings.push({
|
|
71
|
+
id: `${this.agentId}-playwright-failure`,
|
|
72
|
+
type: 'infra-issue',
|
|
73
|
+
severity: 'medium',
|
|
74
|
+
agentId: this.agentId,
|
|
75
|
+
module: 'form-validator',
|
|
76
|
+
description: `Playwright execution failed: ${playwrightError instanceof Error ? playwrightError.message.split('\n')[0] : String(playwrightError)}`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
if (browser)
|
|
81
|
+
await browser.close().catch(() => undefined);
|
|
82
|
+
}
|
|
83
|
+
return findings;
|
|
84
|
+
}
|
|
85
|
+
async testModuleForms(page, moduleId, moduleRoute) {
|
|
86
|
+
const findings = [];
|
|
87
|
+
const fullUrl = moduleRoute.startsWith('http')
|
|
88
|
+
? moduleRoute
|
|
89
|
+
: `${this.baseUrl}${moduleRoute}`;
|
|
90
|
+
try {
|
|
91
|
+
await Promise.race([
|
|
92
|
+
page.goto(fullUrl, { waitUntil: 'domcontentloaded' }),
|
|
93
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
|
|
94
|
+
]);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
findings.push({
|
|
98
|
+
id: `${this.agentId}-nav-failed-${moduleId}`,
|
|
99
|
+
type: 'test-bug',
|
|
100
|
+
severity: 'medium',
|
|
101
|
+
agentId: this.agentId,
|
|
102
|
+
module: moduleId,
|
|
103
|
+
description: `Failed to navigate to module ${moduleId} at ${moduleRoute}`,
|
|
104
|
+
});
|
|
105
|
+
return findings;
|
|
106
|
+
}
|
|
107
|
+
// Find all forms
|
|
108
|
+
let formCount = 0;
|
|
109
|
+
try {
|
|
110
|
+
formCount = await Promise.race([
|
|
111
|
+
page.locator('form').count(),
|
|
112
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Timeout discovering forms
|
|
117
|
+
}
|
|
118
|
+
if (formCount === 0) {
|
|
119
|
+
findings.push({
|
|
120
|
+
id: `${this.agentId}-no-forms-${moduleId}`,
|
|
121
|
+
type: 'test-bug',
|
|
122
|
+
severity: 'low',
|
|
123
|
+
agentId: this.agentId,
|
|
124
|
+
module: moduleId,
|
|
125
|
+
description: `No forms found in module ${moduleId}`,
|
|
126
|
+
});
|
|
127
|
+
return findings;
|
|
128
|
+
}
|
|
129
|
+
for (let formIdx = 0; formIdx < formCount; formIdx++) {
|
|
130
|
+
const formFindings = await this.testSingleForm(page, moduleId, formIdx);
|
|
131
|
+
findings.push(...formFindings);
|
|
132
|
+
}
|
|
133
|
+
return findings;
|
|
134
|
+
}
|
|
135
|
+
async testSingleForm(page, moduleId, formIndex) {
|
|
136
|
+
const findings = [];
|
|
137
|
+
const form = page.locator('form').nth(formIndex);
|
|
138
|
+
// Count inputs
|
|
139
|
+
let inputCount = 0;
|
|
140
|
+
try {
|
|
141
|
+
inputCount = await Promise.race([
|
|
142
|
+
form.locator('input, textarea, select').count(),
|
|
143
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
144
|
+
]);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return findings;
|
|
148
|
+
}
|
|
149
|
+
if (inputCount === 0) {
|
|
150
|
+
return findings;
|
|
151
|
+
}
|
|
152
|
+
// Empty submit test: click submit without filling anything
|
|
153
|
+
const submitBtn = form.locator('button[type="submit"], input[type="submit"], button:has-text("Submit"), button:has-text("Save")');
|
|
154
|
+
let hasSubmitButton = false;
|
|
155
|
+
try {
|
|
156
|
+
hasSubmitButton = (await submitBtn.count()) > 0;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return findings;
|
|
160
|
+
}
|
|
161
|
+
if (!hasSubmitButton) {
|
|
162
|
+
return findings;
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
await Promise.race([
|
|
166
|
+
submitBtn.first().click(),
|
|
167
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
168
|
+
]);
|
|
169
|
+
// Wait briefly for validation errors to appear
|
|
170
|
+
await page.waitForTimeout(500);
|
|
171
|
+
// Check for validation errors
|
|
172
|
+
const errorSelector = VALIDATION_ERROR_SELECTORS.join(', ');
|
|
173
|
+
let errorCount = 0;
|
|
174
|
+
try {
|
|
175
|
+
errorCount = await page.locator(errorSelector).count();
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Error counting validation indicators
|
|
179
|
+
}
|
|
180
|
+
if (errorCount === 0) {
|
|
181
|
+
findings.push({
|
|
182
|
+
id: `${this.agentId}-empty-submit-${moduleId}-form${formIndex}`,
|
|
183
|
+
type: 'test-bug',
|
|
184
|
+
severity: 'high',
|
|
185
|
+
agentId: this.agentId,
|
|
186
|
+
module: moduleId,
|
|
187
|
+
description: `Form ${formIndex} in module ${moduleId} accepts empty submission without validation`,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (submitError) {
|
|
192
|
+
findings.push({
|
|
193
|
+
id: `${this.agentId}-submit-error-${moduleId}-form${formIndex}`,
|
|
194
|
+
type: 'test-bug',
|
|
195
|
+
severity: 'medium',
|
|
196
|
+
agentId: this.agentId,
|
|
197
|
+
module: moduleId,
|
|
198
|
+
description: `Form ${formIndex} submit test failed in module ${moduleId}: ${submitError instanceof Error ? submitError.message.split('\n')[0] : String(submitError)}`,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// Valid submit test: fill required inputs with test data
|
|
202
|
+
try {
|
|
203
|
+
const inputs = form.locator('input, textarea, select');
|
|
204
|
+
const count = await inputs.count();
|
|
205
|
+
for (let i = 0; i < count; i++) {
|
|
206
|
+
const input = inputs.nth(i);
|
|
207
|
+
const tagName = await input.evaluate((el) => el.tagName.toLowerCase());
|
|
208
|
+
const inputType = await input.getAttribute('type') ?? 'text';
|
|
209
|
+
if (tagName === 'select') {
|
|
210
|
+
// Select second option if available
|
|
211
|
+
const optionCount = await input.locator('option').count();
|
|
212
|
+
if (optionCount > 1) {
|
|
213
|
+
const value = await input.locator('option').nth(1).getAttribute('value');
|
|
214
|
+
if (value) {
|
|
215
|
+
await input.selectOption(value).catch(() => undefined);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else if (inputType === 'email') {
|
|
220
|
+
await input.fill('test@example.com').catch(() => undefined);
|
|
221
|
+
}
|
|
222
|
+
else if (inputType === 'number') {
|
|
223
|
+
await input.fill('42').catch(() => undefined);
|
|
224
|
+
}
|
|
225
|
+
else if (inputType === 'tel') {
|
|
226
|
+
await input.fill('+1234567890').catch(() => undefined);
|
|
227
|
+
}
|
|
228
|
+
else if (inputType === 'checkbox' || inputType === 'radio') {
|
|
229
|
+
await input.check().catch(() => undefined);
|
|
230
|
+
}
|
|
231
|
+
else if (tagName === 'textarea' || inputType === 'text' || inputType === 'search') {
|
|
232
|
+
await input.fill('Test input data').catch(() => undefined);
|
|
233
|
+
}
|
|
234
|
+
else if (inputType === 'password') {
|
|
235
|
+
await input.fill('TestPassword123!').catch(() => undefined);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Submit with filled data
|
|
239
|
+
await Promise.race([
|
|
240
|
+
submitBtn.first().click(),
|
|
241
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
242
|
+
]);
|
|
243
|
+
}
|
|
244
|
+
catch (validSubmitError) {
|
|
245
|
+
findings.push({
|
|
246
|
+
id: `${this.agentId}-valid-submit-error-${moduleId}-form${formIndex}`,
|
|
247
|
+
type: 'test-bug',
|
|
248
|
+
severity: 'medium',
|
|
249
|
+
agentId: this.agentId,
|
|
250
|
+
module: moduleId,
|
|
251
|
+
description: `Valid submission test failed for form ${formIndex} in module ${moduleId}: ${validSubmitError instanceof Error ? validSubmitError.message.split('\n')[0] : String(validSubmitError)}`,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return findings;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=26-form-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"26-form-validator.js","sourceRoot":"","sources":["../../agents/26-form-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Finding } from '../core/types';
|
|
2
|
+
import { BaseAgent } from './base-agent';
|
|
3
|
+
export declare class SearchFilterTesterAgent extends BaseAgent {
|
|
4
|
+
readonly agentId = 27;
|
|
5
|
+
readonly agentName = "Search & Filter Tester";
|
|
6
|
+
private baseUrl;
|
|
7
|
+
protected preFlight(): Promise<void>;
|
|
8
|
+
protected execute(): Promise<Finding[]>;
|
|
9
|
+
private testModuleSearchFilter;
|
|
10
|
+
/**
|
|
11
|
+
* Test search functionality: type query, check results change,
|
|
12
|
+
* clear, check restore, type gibberish, check empty state.
|
|
13
|
+
*/
|
|
14
|
+
private testSearch;
|
|
15
|
+
/**
|
|
16
|
+
* Test filter controls: click/select, verify list updates.
|
|
17
|
+
*/
|
|
18
|
+
private testFilter;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=27-search-filter-tester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"27-search-filter-tester.d.ts","sourceRoot":"","sources":["../../agents/27-search-filter-tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwBzC,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,4BAA4B;IAC9C,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAS1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAiE/B,sBAAsB;IAiFpC;;;OAGG;YACW,UAAU;IA6ExB;;OAEG;YACW,UAAU;CAuDzB"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent';
|
|
2
|
+
import { resolveEnvironment } from '../helpers/env-resolver';
|
|
3
|
+
import { login } from '../helpers/navigation';
|
|
4
|
+
/** Timeout (ms) for individual search/filter operations. */
|
|
5
|
+
const OP_TIMEOUT_MS = 5_000;
|
|
6
|
+
/** Selectors for search inputs. */
|
|
7
|
+
const SEARCH_SELECTORS = [
|
|
8
|
+
'input[type="search"]',
|
|
9
|
+
'input[placeholder*="search" i]',
|
|
10
|
+
'input[placeholder*="find" i]',
|
|
11
|
+
'[data-testid*="search"]',
|
|
12
|
+
'[role="searchbox"]',
|
|
13
|
+
];
|
|
14
|
+
/** Selectors for filter controls. */
|
|
15
|
+
const FILTER_SELECTORS = [
|
|
16
|
+
'select',
|
|
17
|
+
'[role="combobox"]',
|
|
18
|
+
'button:has-text("Filter")',
|
|
19
|
+
'[data-testid*="filter"]',
|
|
20
|
+
];
|
|
21
|
+
export class SearchFilterTesterAgent extends BaseAgent {
|
|
22
|
+
agentId = 27;
|
|
23
|
+
agentName = 'Search & Filter Tester';
|
|
24
|
+
baseUrl = '';
|
|
25
|
+
async preFlight() {
|
|
26
|
+
if (!this.config.modules || this.config.modules.length === 0) {
|
|
27
|
+
throw new Error('SearchFilterTesterAgent requires at least one module in config.modules');
|
|
28
|
+
}
|
|
29
|
+
const { env } = await resolveEnvironment(this.config, this.phase);
|
|
30
|
+
this.baseUrl = env.baseUrl;
|
|
31
|
+
}
|
|
32
|
+
async execute() {
|
|
33
|
+
const findings = [];
|
|
34
|
+
const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
|
|
35
|
+
const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
|
|
36
|
+
const credentials = this.config.auth.credentials?.['admin'] ??
|
|
37
|
+
Object.values(this.config.auth.credentials ?? {})[0];
|
|
38
|
+
if (!credentials) {
|
|
39
|
+
findings.push({
|
|
40
|
+
id: `${this.agentId}-no-credentials`,
|
|
41
|
+
type: 'infra-issue',
|
|
42
|
+
severity: 'medium',
|
|
43
|
+
agentId: this.agentId,
|
|
44
|
+
module: 'search-filter-tester',
|
|
45
|
+
description: 'No credentials configured — continuing without authentication',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const { chromium } = await import('playwright');
|
|
49
|
+
let browser = null;
|
|
50
|
+
try {
|
|
51
|
+
browser = await chromium.launch({ headless: true });
|
|
52
|
+
const page = await browser.newPage();
|
|
53
|
+
if (credentials) {
|
|
54
|
+
try {
|
|
55
|
+
await login(page, credentials, loginUrl);
|
|
56
|
+
}
|
|
57
|
+
catch (loginError) {
|
|
58
|
+
findings.push({
|
|
59
|
+
id: `${this.agentId}-login-failed`,
|
|
60
|
+
type: 'infra-issue',
|
|
61
|
+
severity: 'medium',
|
|
62
|
+
agentId: this.agentId,
|
|
63
|
+
module: 'search-filter-tester',
|
|
64
|
+
description: `Login failed — continuing anonymously: ${loginError instanceof Error ? loginError.message.split('\n')[0] : String(loginError)}`,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const mod of this.config.modules) {
|
|
69
|
+
const moduleFindings = await this.testModuleSearchFilter(page, mod.id, mod.route);
|
|
70
|
+
findings.push(...moduleFindings);
|
|
71
|
+
}
|
|
72
|
+
await page.close().catch(() => undefined);
|
|
73
|
+
}
|
|
74
|
+
catch (playwrightError) {
|
|
75
|
+
findings.push({
|
|
76
|
+
id: `${this.agentId}-playwright-failure`,
|
|
77
|
+
type: 'infra-issue',
|
|
78
|
+
severity: 'medium',
|
|
79
|
+
agentId: this.agentId,
|
|
80
|
+
module: 'search-filter-tester',
|
|
81
|
+
description: `Playwright execution failed: ${playwrightError instanceof Error ? playwrightError.message.split('\n')[0] : String(playwrightError)}`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
if (browser)
|
|
86
|
+
await browser.close().catch(() => undefined);
|
|
87
|
+
}
|
|
88
|
+
return findings;
|
|
89
|
+
}
|
|
90
|
+
async testModuleSearchFilter(page, moduleId, moduleRoute) {
|
|
91
|
+
const findings = [];
|
|
92
|
+
const fullUrl = moduleRoute.startsWith('http')
|
|
93
|
+
? moduleRoute
|
|
94
|
+
: `${this.baseUrl}${moduleRoute}`;
|
|
95
|
+
try {
|
|
96
|
+
await Promise.race([
|
|
97
|
+
page.goto(fullUrl, { waitUntil: 'domcontentloaded' }),
|
|
98
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
findings.push({
|
|
103
|
+
id: `${this.agentId}-nav-failed-${moduleId}`,
|
|
104
|
+
type: 'test-bug',
|
|
105
|
+
severity: 'medium',
|
|
106
|
+
agentId: this.agentId,
|
|
107
|
+
module: moduleId,
|
|
108
|
+
description: `Failed to navigate to module ${moduleId} at ${moduleRoute}`,
|
|
109
|
+
});
|
|
110
|
+
return findings;
|
|
111
|
+
}
|
|
112
|
+
// Find search inputs
|
|
113
|
+
const searchSelector = SEARCH_SELECTORS.join(', ');
|
|
114
|
+
let searchCount = 0;
|
|
115
|
+
try {
|
|
116
|
+
searchCount = await Promise.race([
|
|
117
|
+
page.locator(searchSelector).count(),
|
|
118
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
119
|
+
]);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Timeout discovering search inputs
|
|
123
|
+
}
|
|
124
|
+
if (searchCount > 0) {
|
|
125
|
+
const searchFindings = await this.testSearch(page, moduleId);
|
|
126
|
+
findings.push(...searchFindings);
|
|
127
|
+
}
|
|
128
|
+
// Find filters
|
|
129
|
+
const filterSelector = FILTER_SELECTORS.join(', ');
|
|
130
|
+
let filterCount = 0;
|
|
131
|
+
try {
|
|
132
|
+
filterCount = await Promise.race([
|
|
133
|
+
page.locator(filterSelector).count(),
|
|
134
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Timeout discovering filters
|
|
139
|
+
}
|
|
140
|
+
if (filterCount > 0) {
|
|
141
|
+
const filterFindings = await this.testFilter(page, moduleId, filterCount);
|
|
142
|
+
findings.push(...filterFindings);
|
|
143
|
+
}
|
|
144
|
+
if (searchCount === 0 && filterCount === 0) {
|
|
145
|
+
findings.push({
|
|
146
|
+
id: `${this.agentId}-no-search-filter-${moduleId}`,
|
|
147
|
+
type: 'test-bug',
|
|
148
|
+
severity: 'low',
|
|
149
|
+
agentId: this.agentId,
|
|
150
|
+
module: moduleId,
|
|
151
|
+
description: `No search or filter UI found in module ${moduleId}`,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return findings;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Test search functionality: type query, check results change,
|
|
158
|
+
* clear, check restore, type gibberish, check empty state.
|
|
159
|
+
*/
|
|
160
|
+
async testSearch(page, moduleId) {
|
|
161
|
+
const findings = [];
|
|
162
|
+
const searchSelector = SEARCH_SELECTORS.join(', ');
|
|
163
|
+
const searchInput = page.locator(searchSelector).first();
|
|
164
|
+
try {
|
|
165
|
+
// Type "test" and wait for results
|
|
166
|
+
await Promise.race([
|
|
167
|
+
searchInput.fill('test'),
|
|
168
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
169
|
+
]);
|
|
170
|
+
await page.waitForTimeout(1000);
|
|
171
|
+
// Clear search
|
|
172
|
+
await Promise.race([
|
|
173
|
+
searchInput.fill(''),
|
|
174
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
175
|
+
]);
|
|
176
|
+
await page.waitForTimeout(1000);
|
|
177
|
+
// Type gibberish
|
|
178
|
+
await Promise.race([
|
|
179
|
+
searchInput.fill('zzz999xxx'),
|
|
180
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
181
|
+
]);
|
|
182
|
+
await page.waitForTimeout(1000);
|
|
183
|
+
// Check if results area shows content (meaning search may not be filtering)
|
|
184
|
+
const noResultsIndicators = await page
|
|
185
|
+
.locator(':text("no results"), :text("not found"), :text("no matches"), [data-testid*="empty"], .empty-state')
|
|
186
|
+
.count()
|
|
187
|
+
.catch(() => 0);
|
|
188
|
+
// Check if list items still exist
|
|
189
|
+
const listItems = await page
|
|
190
|
+
.locator('tr, [class*="list-item"], [class*="card"], li')
|
|
191
|
+
.count()
|
|
192
|
+
.catch(() => 0);
|
|
193
|
+
if (noResultsIndicators === 0 && listItems > 0) {
|
|
194
|
+
findings.push({
|
|
195
|
+
id: `${this.agentId}-search-not-filtering-${moduleId}`,
|
|
196
|
+
type: 'test-bug',
|
|
197
|
+
severity: 'medium',
|
|
198
|
+
agentId: this.agentId,
|
|
199
|
+
module: moduleId,
|
|
200
|
+
description: 'Search may not be filtering — gibberish query still shows list items',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Clear search for next tests
|
|
204
|
+
await searchInput.fill('').catch(() => undefined);
|
|
205
|
+
}
|
|
206
|
+
catch (searchError) {
|
|
207
|
+
findings.push({
|
|
208
|
+
id: `${this.agentId}-search-error-${moduleId}`,
|
|
209
|
+
type: 'test-bug',
|
|
210
|
+
severity: 'medium',
|
|
211
|
+
agentId: this.agentId,
|
|
212
|
+
module: moduleId,
|
|
213
|
+
description: `Search test failed in module ${moduleId}: ${searchError instanceof Error ? searchError.message.split('\n')[0] : String(searchError)}`,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return findings;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Test filter controls: click/select, verify list updates.
|
|
220
|
+
*/
|
|
221
|
+
async testFilter(page, moduleId, filterCount) {
|
|
222
|
+
const findings = [];
|
|
223
|
+
const filterSelector = FILTER_SELECTORS.join(', ');
|
|
224
|
+
try {
|
|
225
|
+
const firstFilter = page.locator(filterSelector).first();
|
|
226
|
+
const tagName = await firstFilter.evaluate((el) => el.tagName.toLowerCase()).catch(() => '');
|
|
227
|
+
if (tagName === 'select') {
|
|
228
|
+
const optionCount = await firstFilter.locator('option').count();
|
|
229
|
+
if (optionCount > 1) {
|
|
230
|
+
const value = await firstFilter.locator('option').nth(1).getAttribute('value');
|
|
231
|
+
if (value) {
|
|
232
|
+
await Promise.race([
|
|
233
|
+
firstFilter.selectOption(value),
|
|
234
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
235
|
+
]);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
await Promise.race([
|
|
241
|
+
firstFilter.click(),
|
|
242
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
|
|
243
|
+
]);
|
|
244
|
+
}
|
|
245
|
+
findings.push({
|
|
246
|
+
id: `${this.agentId}-filter-found-${moduleId}`,
|
|
247
|
+
type: 'infra-issue',
|
|
248
|
+
severity: 'info',
|
|
249
|
+
agentId: this.agentId,
|
|
250
|
+
module: moduleId,
|
|
251
|
+
description: `Found ${filterCount} filter control(s) in module ${moduleId}`,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
catch (filterError) {
|
|
255
|
+
findings.push({
|
|
256
|
+
id: `${this.agentId}-filter-error-${moduleId}`,
|
|
257
|
+
type: 'test-bug',
|
|
258
|
+
severity: 'medium',
|
|
259
|
+
agentId: this.agentId,
|
|
260
|
+
module: moduleId,
|
|
261
|
+
description: `Filter test failed in module ${moduleId}: ${filterError instanceof Error ? filterError.message.split('\n')[0] : String(filterError)}`,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return findings;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=27-search-filter-tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"27-search-filter-tester.js","sourceRoot":"","sources":["../../agents/27-search-filter-tester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Finding } from '../core/types';
|
|
2
|
+
import { BaseAgent } from './base-agent';
|
|
3
|
+
export declare class NavigationRoutingTesterAgent extends BaseAgent {
|
|
4
|
+
readonly agentId = 28;
|
|
5
|
+
readonly agentName = "Navigation & Routing Tester";
|
|
6
|
+
private baseUrl;
|
|
7
|
+
protected preFlight(): Promise<void>;
|
|
8
|
+
protected execute(): Promise<Finding[]>;
|
|
9
|
+
/**
|
|
10
|
+
* Test 1: For each module with sidebarIcon: true, click its sidebar link
|
|
11
|
+
* and verify the URL changes and content loads.
|
|
12
|
+
*/
|
|
13
|
+
private testSidebarNavigation;
|
|
14
|
+
/**
|
|
15
|
+
* Test 2: Navigate to a fake route and verify 404 handling.
|
|
16
|
+
*/
|
|
17
|
+
private test404Handling;
|
|
18
|
+
/**
|
|
19
|
+
* Test 3: Open a new incognito context (no auth) and navigate to protected routes.
|
|
20
|
+
* Should redirect to login; if the page renders without auth, that is critical.
|
|
21
|
+
*/
|
|
22
|
+
private testProtectedRoutes;
|
|
23
|
+
/**
|
|
24
|
+
* Test 4: On each module page, find internal links and verify they load.
|
|
25
|
+
*/
|
|
26
|
+
private testLinkIntegrity;
|
|
27
|
+
/**
|
|
28
|
+
* Test 5: Navigate between two modules, test back/forward browser history.
|
|
29
|
+
*/
|
|
30
|
+
private testBackForward;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=28-navigation-routing-tester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"28-navigation-routing-tester.d.ts","sourceRoot":"","sources":["../../agents/28-navigation-routing-tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,qBAAa,4BAA6B,SAAQ,SAAS;IACzD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,iCAAiC;IACnD,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAW1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAoF7C;;;OAGG;YACW,qBAAqB;IA4CnC;;OAEG;YACW,eAAe;IAyD7B;;;OAGG;YACW,mBAAmB;IAwDjC;;OAEG;YACW,iBAAiB;IAiE/B;;OAEG;YACW,eAAe;CA4E9B"}
|