@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.
Files changed (300) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/README.md +53 -6
  3. package/agents/24-signup-onboarding-tester.ts +429 -0
  4. package/agents/25-crud-flow-tester.ts +302 -0
  5. package/agents/26-form-validator.ts +297 -0
  6. package/agents/27-search-filter-tester.ts +326 -0
  7. package/agents/28-navigation-routing-tester.ts +425 -0
  8. package/agents/29-responsive-interaction-tester.ts +350 -0
  9. package/agents/30-multi-user-scenario-tester.ts +319 -0
  10. package/agents/31-load-tester.ts +134 -0
  11. package/agents/32-memory-leak-detector.ts +194 -0
  12. package/agents/33-bundle-analyzer.ts +132 -0
  13. package/agents/34-xss-scanner.ts +191 -0
  14. package/agents/35-csrf-tester.ts +82 -0
  15. package/agents/36-auth-fuzzer.ts +194 -0
  16. package/agents/37-dependency-scanner.ts +176 -0
  17. package/agents/38-secrets-scanner.ts +137 -0
  18. package/agents/39-api-contract-tester.ts +199 -0
  19. package/agents/40-rate-limit-tester.ts +94 -0
  20. package/agents/41-api-pagination-tester.ts +97 -0
  21. package/agents/42-graphql-tester.ts +222 -0
  22. package/agents/43-data-consistency-checker.ts +205 -0
  23. package/agents/44-backup-recovery-tester.ts +152 -0
  24. package/agents/45-data-privacy-scanner.ts +125 -0
  25. package/agents/46-seo-auditor.ts +294 -0
  26. package/agents/47-social-preview-tester.ts +232 -0
  27. package/agents/48-lighthouse-auditor.ts +213 -0
  28. package/agents/49-i18n-tester.ts +198 -0
  29. package/agents/50-timezone-tester.ts +173 -0
  30. package/agents/51-error-recovery-tester.ts +155 -0
  31. package/agents/52-offline-mode-tester.ts +180 -0
  32. package/agents/53-graceful-degradation-tester.ts +156 -0
  33. package/agents/54-websocket-tester.ts +151 -0
  34. package/agents/55-realtime-sync-tester.ts +194 -0
  35. package/agents/56-file-upload-tester.ts +194 -0
  36. package/agents/57-export-tester.ts +174 -0
  37. package/agents/58-payment-flow-tester.ts +183 -0
  38. package/agents/59-ssl-tls-auditor.ts +141 -0
  39. package/agents/60-dns-cdn-tester.ts +117 -0
  40. package/agents/61-docker-health-checker.ts +111 -0
  41. package/agents/62-env-config-validator.ts +152 -0
  42. package/agents/63-log-quality-auditor.ts +136 -0
  43. package/agents/64-analytics-tracker-tester.ts +165 -0
  44. package/agents/65-gdpr-compliance-tester.ts +215 -0
  45. package/agents/66-soc2-control-validator.ts +210 -0
  46. package/agents/67-wcag-aaa-tester.ts +241 -0
  47. package/agents/68-dead-code-detector.ts +135 -0
  48. package/agents/69-type-safety-auditor.ts +164 -0
  49. package/agents/70-complexity-analyzer.ts +179 -0
  50. package/agents/__tests__/24-signup-onboarding-tester.test.ts +274 -0
  51. package/agents/__tests__/25-crud-flow-tester.test.ts +322 -0
  52. package/agents/__tests__/26-form-validator.test.ts +345 -0
  53. package/agents/__tests__/27-search-filter-tester.test.ts +311 -0
  54. package/agents/__tests__/28-navigation-routing-tester.test.ts +328 -0
  55. package/agents/__tests__/29-responsive-interaction-tester.test.ts +297 -0
  56. package/agents/__tests__/30-multi-user-scenario-tester.test.ts +328 -0
  57. package/agents/__tests__/31-load-tester.test.ts +189 -0
  58. package/agents/__tests__/32-memory-leak-detector.test.ts +251 -0
  59. package/agents/__tests__/33-bundle-analyzer.test.ts +237 -0
  60. package/agents/__tests__/34-xss-scanner.test.ts +258 -0
  61. package/agents/__tests__/35-csrf-tester.test.ts +200 -0
  62. package/agents/__tests__/36-auth-fuzzer.test.ts +214 -0
  63. package/agents/__tests__/37-dependency-scanner.test.ts +266 -0
  64. package/agents/__tests__/38-secrets-scanner.test.ts +224 -0
  65. package/agents/__tests__/39-api-contract-tester.test.ts +312 -0
  66. package/agents/__tests__/40-rate-limit-tester.test.ts +192 -0
  67. package/agents/__tests__/41-api-pagination-tester.test.ts +198 -0
  68. package/agents/__tests__/42-graphql-tester.test.ts +252 -0
  69. package/agents/__tests__/43-data-consistency-checker.test.ts +232 -0
  70. package/agents/__tests__/44-backup-recovery-tester.test.ts +222 -0
  71. package/agents/__tests__/45-data-privacy-scanner.test.ts +223 -0
  72. package/agents/__tests__/46-seo-auditor.test.ts +261 -0
  73. package/agents/__tests__/47-social-preview-tester.test.ts +245 -0
  74. package/agents/__tests__/48-lighthouse-auditor.test.ts +276 -0
  75. package/agents/__tests__/49-i18n-tester.test.ts +201 -0
  76. package/agents/__tests__/50-timezone-tester.test.ts +172 -0
  77. package/agents/__tests__/51-error-recovery-tester.test.ts +162 -0
  78. package/agents/__tests__/52-offline-mode-tester.test.ts +164 -0
  79. package/agents/__tests__/53-graceful-degradation-tester.test.ts +168 -0
  80. package/agents/__tests__/54-websocket-tester.test.ts +157 -0
  81. package/agents/__tests__/55-realtime-sync-tester.test.ts +181 -0
  82. package/agents/__tests__/56-file-upload-tester.test.ts +172 -0
  83. package/agents/__tests__/57-export-tester.test.ts +169 -0
  84. package/agents/__tests__/58-payment-flow-tester.test.ts +182 -0
  85. package/agents/__tests__/59-ssl-tls-auditor.test.ts +179 -0
  86. package/agents/__tests__/60-dns-cdn-tester.test.ts +176 -0
  87. package/agents/__tests__/61-docker-health-checker.test.ts +150 -0
  88. package/agents/__tests__/62-env-config-validator.test.ts +166 -0
  89. package/agents/__tests__/63-log-quality-auditor.test.ts +175 -0
  90. package/agents/__tests__/64-analytics-tracker-tester.test.ts +158 -0
  91. package/agents/__tests__/65-gdpr-compliance-tester.test.ts +174 -0
  92. package/agents/__tests__/66-soc2-control-validator.test.ts +183 -0
  93. package/agents/__tests__/67-wcag-aaa-tester.test.ts +190 -0
  94. package/agents/__tests__/68-dead-code-detector.test.ts +174 -0
  95. package/agents/__tests__/69-type-safety-auditor.test.ts +173 -0
  96. package/agents/__tests__/70-complexity-analyzer.test.ts +177 -0
  97. package/agents/__tests__/registry.test.ts +13 -13
  98. package/agents/registry.ts +146 -5
  99. package/core/__tests__/integration.test.ts +4 -4
  100. package/core/__tests__/orchestrator.test.ts +17 -16
  101. package/core/license.ts +208 -211
  102. package/core/orchestrator.ts +6 -4
  103. package/dist/agents/24-signup-onboarding-tester.d.ts +35 -0
  104. package/dist/agents/24-signup-onboarding-tester.d.ts.map +1 -0
  105. package/dist/agents/24-signup-onboarding-tester.js +357 -0
  106. package/dist/agents/24-signup-onboarding-tester.js.map +1 -0
  107. package/dist/agents/25-crud-flow-tester.d.ts +11 -0
  108. package/dist/agents/25-crud-flow-tester.d.ts.map +1 -0
  109. package/dist/agents/25-crud-flow-tester.js +253 -0
  110. package/dist/agents/25-crud-flow-tester.js.map +1 -0
  111. package/dist/agents/26-form-validator.d.ts +12 -0
  112. package/dist/agents/26-form-validator.d.ts.map +1 -0
  113. package/dist/agents/26-form-validator.js +257 -0
  114. package/dist/agents/26-form-validator.js.map +1 -0
  115. package/dist/agents/27-search-filter-tester.d.ts +20 -0
  116. package/dist/agents/27-search-filter-tester.d.ts.map +1 -0
  117. package/dist/agents/27-search-filter-tester.js +267 -0
  118. package/dist/agents/27-search-filter-tester.js.map +1 -0
  119. package/dist/agents/28-navigation-routing-tester.d.ts +32 -0
  120. package/dist/agents/28-navigation-routing-tester.d.ts.map +1 -0
  121. package/dist/agents/28-navigation-routing-tester.js +363 -0
  122. package/dist/agents/28-navigation-routing-tester.js.map +1 -0
  123. package/dist/agents/29-responsive-interaction-tester.d.ts +26 -0
  124. package/dist/agents/29-responsive-interaction-tester.d.ts.map +1 -0
  125. package/dist/agents/29-responsive-interaction-tester.js +272 -0
  126. package/dist/agents/29-responsive-interaction-tester.js.map +1 -0
  127. package/dist/agents/30-multi-user-scenario-tester.d.ts +24 -0
  128. package/dist/agents/30-multi-user-scenario-tester.d.ts.map +1 -0
  129. package/dist/agents/30-multi-user-scenario-tester.js +254 -0
  130. package/dist/agents/30-multi-user-scenario-tester.js.map +1 -0
  131. package/dist/agents/31-load-tester.d.ts +12 -0
  132. package/dist/agents/31-load-tester.d.ts.map +1 -0
  133. package/dist/agents/31-load-tester.js +110 -0
  134. package/dist/agents/31-load-tester.js.map +1 -0
  135. package/dist/agents/32-memory-leak-detector.d.ts +12 -0
  136. package/dist/agents/32-memory-leak-detector.d.ts.map +1 -0
  137. package/dist/agents/32-memory-leak-detector.js +167 -0
  138. package/dist/agents/32-memory-leak-detector.js.map +1 -0
  139. package/dist/agents/33-bundle-analyzer.d.ts +10 -0
  140. package/dist/agents/33-bundle-analyzer.d.ts.map +1 -0
  141. package/dist/agents/33-bundle-analyzer.js +111 -0
  142. package/dist/agents/33-bundle-analyzer.js.map +1 -0
  143. package/dist/agents/34-xss-scanner.d.ts +11 -0
  144. package/dist/agents/34-xss-scanner.d.ts.map +1 -0
  145. package/dist/agents/34-xss-scanner.js +164 -0
  146. package/dist/agents/34-xss-scanner.js.map +1 -0
  147. package/dist/agents/35-csrf-tester.d.ts +11 -0
  148. package/dist/agents/35-csrf-tester.d.ts.map +1 -0
  149. package/dist/agents/35-csrf-tester.js +70 -0
  150. package/dist/agents/35-csrf-tester.js.map +1 -0
  151. package/dist/agents/36-auth-fuzzer.d.ts +13 -0
  152. package/dist/agents/36-auth-fuzzer.d.ts.map +1 -0
  153. package/dist/agents/36-auth-fuzzer.js +163 -0
  154. package/dist/agents/36-auth-fuzzer.js.map +1 -0
  155. package/dist/agents/37-dependency-scanner.d.ts +11 -0
  156. package/dist/agents/37-dependency-scanner.d.ts.map +1 -0
  157. package/dist/agents/37-dependency-scanner.js +139 -0
  158. package/dist/agents/37-dependency-scanner.js.map +1 -0
  159. package/dist/agents/38-secrets-scanner.d.ts +11 -0
  160. package/dist/agents/38-secrets-scanner.d.ts.map +1 -0
  161. package/dist/agents/38-secrets-scanner.js +116 -0
  162. package/dist/agents/38-secrets-scanner.js.map +1 -0
  163. package/dist/agents/39-api-contract-tester.d.ts +12 -0
  164. package/dist/agents/39-api-contract-tester.d.ts.map +1 -0
  165. package/dist/agents/39-api-contract-tester.js +142 -0
  166. package/dist/agents/39-api-contract-tester.js.map +1 -0
  167. package/dist/agents/40-rate-limit-tester.d.ts +12 -0
  168. package/dist/agents/40-rate-limit-tester.d.ts.map +1 -0
  169. package/dist/agents/40-rate-limit-tester.js +79 -0
  170. package/dist/agents/40-rate-limit-tester.js.map +1 -0
  171. package/dist/agents/41-api-pagination-tester.d.ts +12 -0
  172. package/dist/agents/41-api-pagination-tester.d.ts.map +1 -0
  173. package/dist/agents/41-api-pagination-tester.js +79 -0
  174. package/dist/agents/41-api-pagination-tester.js.map +1 -0
  175. package/dist/agents/42-graphql-tester.d.ts +13 -0
  176. package/dist/agents/42-graphql-tester.d.ts.map +1 -0
  177. package/dist/agents/42-graphql-tester.js +187 -0
  178. package/dist/agents/42-graphql-tester.js.map +1 -0
  179. package/dist/agents/43-data-consistency-checker.d.ts +11 -0
  180. package/dist/agents/43-data-consistency-checker.d.ts.map +1 -0
  181. package/dist/agents/43-data-consistency-checker.js +176 -0
  182. package/dist/agents/43-data-consistency-checker.js.map +1 -0
  183. package/dist/agents/44-backup-recovery-tester.d.ts +11 -0
  184. package/dist/agents/44-backup-recovery-tester.d.ts.map +1 -0
  185. package/dist/agents/44-backup-recovery-tester.js +128 -0
  186. package/dist/agents/44-backup-recovery-tester.js.map +1 -0
  187. package/dist/agents/45-data-privacy-scanner.d.ts +11 -0
  188. package/dist/agents/45-data-privacy-scanner.d.ts.map +1 -0
  189. package/dist/agents/45-data-privacy-scanner.js +100 -0
  190. package/dist/agents/45-data-privacy-scanner.js.map +1 -0
  191. package/dist/agents/46-seo-auditor.d.ts +12 -0
  192. package/dist/agents/46-seo-auditor.d.ts.map +1 -0
  193. package/dist/agents/46-seo-auditor.js +275 -0
  194. package/dist/agents/46-seo-auditor.js.map +1 -0
  195. package/dist/agents/47-social-preview-tester.d.ts +11 -0
  196. package/dist/agents/47-social-preview-tester.d.ts.map +1 -0
  197. package/dist/agents/47-social-preview-tester.js +219 -0
  198. package/dist/agents/47-social-preview-tester.js.map +1 -0
  199. package/dist/agents/48-lighthouse-auditor.d.ts +11 -0
  200. package/dist/agents/48-lighthouse-auditor.d.ts.map +1 -0
  201. package/dist/agents/48-lighthouse-auditor.js +192 -0
  202. package/dist/agents/48-lighthouse-auditor.js.map +1 -0
  203. package/dist/agents/49-i18n-tester.d.ts +13 -0
  204. package/dist/agents/49-i18n-tester.d.ts.map +1 -0
  205. package/dist/agents/49-i18n-tester.js +172 -0
  206. package/dist/agents/49-i18n-tester.js.map +1 -0
  207. package/dist/agents/50-timezone-tester.d.ts +11 -0
  208. package/dist/agents/50-timezone-tester.d.ts.map +1 -0
  209. package/dist/agents/50-timezone-tester.js +152 -0
  210. package/dist/agents/50-timezone-tester.js.map +1 -0
  211. package/dist/agents/51-error-recovery-tester.d.ts +11 -0
  212. package/dist/agents/51-error-recovery-tester.d.ts.map +1 -0
  213. package/dist/agents/51-error-recovery-tester.js +134 -0
  214. package/dist/agents/51-error-recovery-tester.js.map +1 -0
  215. package/dist/agents/52-offline-mode-tester.d.ts +12 -0
  216. package/dist/agents/52-offline-mode-tester.d.ts.map +1 -0
  217. package/dist/agents/52-offline-mode-tester.js +161 -0
  218. package/dist/agents/52-offline-mode-tester.js.map +1 -0
  219. package/dist/agents/53-graceful-degradation-tester.d.ts +12 -0
  220. package/dist/agents/53-graceful-degradation-tester.d.ts.map +1 -0
  221. package/dist/agents/53-graceful-degradation-tester.js +130 -0
  222. package/dist/agents/53-graceful-degradation-tester.js.map +1 -0
  223. package/dist/agents/54-websocket-tester.d.ts +10 -0
  224. package/dist/agents/54-websocket-tester.d.ts.map +1 -0
  225. package/dist/agents/54-websocket-tester.js +132 -0
  226. package/dist/agents/54-websocket-tester.js.map +1 -0
  227. package/dist/agents/55-realtime-sync-tester.d.ts +11 -0
  228. package/dist/agents/55-realtime-sync-tester.d.ts.map +1 -0
  229. package/dist/agents/55-realtime-sync-tester.js +175 -0
  230. package/dist/agents/55-realtime-sync-tester.js.map +1 -0
  231. package/dist/agents/56-file-upload-tester.d.ts +12 -0
  232. package/dist/agents/56-file-upload-tester.d.ts.map +1 -0
  233. package/dist/agents/56-file-upload-tester.js +166 -0
  234. package/dist/agents/56-file-upload-tester.js.map +1 -0
  235. package/dist/agents/57-export-tester.d.ts +11 -0
  236. package/dist/agents/57-export-tester.d.ts.map +1 -0
  237. package/dist/agents/57-export-tester.js +155 -0
  238. package/dist/agents/57-export-tester.js.map +1 -0
  239. package/dist/agents/58-payment-flow-tester.d.ts +11 -0
  240. package/dist/agents/58-payment-flow-tester.d.ts.map +1 -0
  241. package/dist/agents/58-payment-flow-tester.js +159 -0
  242. package/dist/agents/58-payment-flow-tester.js.map +1 -0
  243. package/dist/agents/59-ssl-tls-auditor.d.ts +10 -0
  244. package/dist/agents/59-ssl-tls-auditor.d.ts.map +1 -0
  245. package/dist/agents/59-ssl-tls-auditor.js +132 -0
  246. package/dist/agents/59-ssl-tls-auditor.js.map +1 -0
  247. package/dist/agents/60-dns-cdn-tester.d.ts +10 -0
  248. package/dist/agents/60-dns-cdn-tester.d.ts.map +1 -0
  249. package/dist/agents/60-dns-cdn-tester.js +105 -0
  250. package/dist/agents/60-dns-cdn-tester.js.map +1 -0
  251. package/dist/agents/61-docker-health-checker.d.ts +10 -0
  252. package/dist/agents/61-docker-health-checker.d.ts.map +1 -0
  253. package/dist/agents/61-docker-health-checker.js +95 -0
  254. package/dist/agents/61-docker-health-checker.js.map +1 -0
  255. package/dist/agents/62-env-config-validator.d.ts +10 -0
  256. package/dist/agents/62-env-config-validator.d.ts.map +1 -0
  257. package/dist/agents/62-env-config-validator.js +132 -0
  258. package/dist/agents/62-env-config-validator.js.map +1 -0
  259. package/dist/agents/63-log-quality-auditor.d.ts +9 -0
  260. package/dist/agents/63-log-quality-auditor.d.ts.map +1 -0
  261. package/dist/agents/63-log-quality-auditor.js +121 -0
  262. package/dist/agents/63-log-quality-auditor.js.map +1 -0
  263. package/dist/agents/64-analytics-tracker-tester.d.ts +10 -0
  264. package/dist/agents/64-analytics-tracker-tester.d.ts.map +1 -0
  265. package/dist/agents/64-analytics-tracker-tester.js +146 -0
  266. package/dist/agents/64-analytics-tracker-tester.js.map +1 -0
  267. package/dist/agents/65-gdpr-compliance-tester.d.ts +13 -0
  268. package/dist/agents/65-gdpr-compliance-tester.d.ts.map +1 -0
  269. package/dist/agents/65-gdpr-compliance-tester.js +186 -0
  270. package/dist/agents/65-gdpr-compliance-tester.js.map +1 -0
  271. package/dist/agents/66-soc2-control-validator.d.ts +14 -0
  272. package/dist/agents/66-soc2-control-validator.d.ts.map +1 -0
  273. package/dist/agents/66-soc2-control-validator.js +178 -0
  274. package/dist/agents/66-soc2-control-validator.js.map +1 -0
  275. package/dist/agents/67-wcag-aaa-tester.d.ts +13 -0
  276. package/dist/agents/67-wcag-aaa-tester.d.ts.map +1 -0
  277. package/dist/agents/67-wcag-aaa-tester.js +207 -0
  278. package/dist/agents/67-wcag-aaa-tester.js.map +1 -0
  279. package/dist/agents/68-dead-code-detector.d.ts +9 -0
  280. package/dist/agents/68-dead-code-detector.d.ts.map +1 -0
  281. package/dist/agents/68-dead-code-detector.js +116 -0
  282. package/dist/agents/68-dead-code-detector.js.map +1 -0
  283. package/dist/agents/69-type-safety-auditor.d.ts +9 -0
  284. package/dist/agents/69-type-safety-auditor.d.ts.map +1 -0
  285. package/dist/agents/69-type-safety-auditor.js +148 -0
  286. package/dist/agents/69-type-safety-auditor.js.map +1 -0
  287. package/dist/agents/70-complexity-analyzer.d.ts +10 -0
  288. package/dist/agents/70-complexity-analyzer.d.ts.map +1 -0
  289. package/dist/agents/70-complexity-analyzer.js +154 -0
  290. package/dist/agents/70-complexity-analyzer.js.map +1 -0
  291. package/dist/agents/registry.d.ts +3 -3
  292. package/dist/agents/registry.d.ts.map +1 -1
  293. package/dist/agents/registry.js +146 -5
  294. package/dist/agents/registry.js.map +1 -1
  295. package/dist/core/license.js +2 -5
  296. package/dist/core/license.js.map +1 -1
  297. package/dist/core/orchestrator.d.ts.map +1 -1
  298. package/dist/core/orchestrator.js +6 -4
  299. package/dist/core/orchestrator.js.map +1 -1
  300. package/package.json +2 -2
@@ -0,0 +1,363 @@
1
+ import { BaseAgent } from './base-agent';
2
+ import { resolveEnvironment } from '../helpers/env-resolver';
3
+ import { login } from '../helpers/navigation';
4
+ /** Timeout (ms) for individual navigation operations. */
5
+ const NAV_TIMEOUT_MS = 3_000;
6
+ export class NavigationRoutingTesterAgent extends BaseAgent {
7
+ agentId = 28;
8
+ agentName = 'Navigation & Routing Tester';
9
+ baseUrl = '';
10
+ async preFlight() {
11
+ if (!this.config.modules || this.config.modules.length === 0) {
12
+ throw new Error('NavigationRoutingTesterAgent requires at least one module in config.modules');
13
+ }
14
+ const { env } = await resolveEnvironment(this.config, this.phase);
15
+ this.baseUrl = env.baseUrl;
16
+ }
17
+ async execute() {
18
+ const findings = [];
19
+ const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
20
+ const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
21
+ const credentials = this.config.auth.credentials?.['admin'] ??
22
+ Object.values(this.config.auth.credentials ?? {})[0];
23
+ if (!credentials) {
24
+ findings.push({
25
+ id: `${this.agentId}-no-credentials`,
26
+ type: 'infra-issue',
27
+ severity: 'medium',
28
+ agentId: this.agentId,
29
+ module: 'navigation-routing-tester',
30
+ description: 'No credentials configured — continuing without authentication',
31
+ });
32
+ }
33
+ const { chromium } = await import('playwright');
34
+ let browser = null;
35
+ try {
36
+ browser = await chromium.launch({ headless: true });
37
+ const page = await browser.newPage();
38
+ let loggedIn = false;
39
+ if (credentials) {
40
+ try {
41
+ await login(page, credentials, loginUrl);
42
+ loggedIn = true;
43
+ }
44
+ catch (loginError) {
45
+ findings.push({
46
+ id: `${this.agentId}-login-failed`,
47
+ type: 'infra-issue',
48
+ severity: 'medium',
49
+ agentId: this.agentId,
50
+ module: 'navigation-routing-tester',
51
+ description: `Login failed — continuing anonymously: ${loginError instanceof Error ? loginError.message.split('\n')[0] : String(loginError)}`,
52
+ });
53
+ }
54
+ }
55
+ // Test 1: Sidebar navigation
56
+ const sidebarFindings = await this.testSidebarNavigation(page);
57
+ findings.push(...sidebarFindings);
58
+ // Test 2: 404 handling
59
+ const notFoundFindings = await this.test404Handling(page);
60
+ findings.push(...notFoundFindings);
61
+ // Test 3: Protected routes (only if we have credentials and successfully logged in)
62
+ if (credentials && loggedIn) {
63
+ const protectedFindings = await this.testProtectedRoutes(browser);
64
+ findings.push(...protectedFindings);
65
+ }
66
+ // Test 4: Link integrity
67
+ const linkFindings = await this.testLinkIntegrity(page);
68
+ findings.push(...linkFindings);
69
+ // Test 5: Back/forward navigation
70
+ const historyFindings = await this.testBackForward(page);
71
+ findings.push(...historyFindings);
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: 'navigation-routing-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
+ /**
91
+ * Test 1: For each module with sidebarIcon: true, click its sidebar link
92
+ * and verify the URL changes and content loads.
93
+ */
94
+ async testSidebarNavigation(page) {
95
+ const findings = [];
96
+ const sidebarModules = this.config.modules.filter((m) => m.sidebarIcon);
97
+ for (const mod of sidebarModules) {
98
+ const expectedUrl = mod.route.startsWith('http')
99
+ ? mod.route
100
+ : `${this.baseUrl}${mod.route}`;
101
+ try {
102
+ await Promise.race([
103
+ page.goto(expectedUrl, { waitUntil: 'domcontentloaded' }),
104
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), NAV_TIMEOUT_MS)),
105
+ ]);
106
+ // Check the page has content (not blank)
107
+ const bodyText = await page.locator('body').innerText().catch(() => '');
108
+ if (bodyText.trim().length === 0) {
109
+ findings.push({
110
+ id: `${this.agentId}-sidebar-blank-${mod.id}`,
111
+ type: 'test-bug',
112
+ severity: 'medium',
113
+ agentId: this.agentId,
114
+ module: mod.id,
115
+ description: `Sidebar navigation to module ${mod.id} (${mod.route}) resulted in a blank page`,
116
+ });
117
+ }
118
+ }
119
+ catch (navError) {
120
+ findings.push({
121
+ id: `${this.agentId}-sidebar-nav-failed-${mod.id}`,
122
+ type: 'test-bug',
123
+ severity: 'medium',
124
+ agentId: this.agentId,
125
+ module: mod.id,
126
+ description: `Sidebar navigation to module ${mod.id} failed: ${navError instanceof Error ? navError.message.split('\n')[0] : String(navError)}`,
127
+ });
128
+ }
129
+ }
130
+ return findings;
131
+ }
132
+ /**
133
+ * Test 2: Navigate to a fake route and verify 404 handling.
134
+ */
135
+ async test404Handling(page) {
136
+ const findings = [];
137
+ const fakeRoute = `${this.baseUrl}/this-page-does-not-exist-12345`;
138
+ try {
139
+ await Promise.race([
140
+ page.goto(fakeRoute, { waitUntil: 'domcontentloaded' }),
141
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), NAV_TIMEOUT_MS)),
142
+ ]);
143
+ // Check if the page shows a 404 indicator or redirect
144
+ const bodyText = await page.locator('body').innerText().catch(() => '');
145
+ const url = page.url();
146
+ const has404Indicator = bodyText.toLowerCase().includes('404') ||
147
+ bodyText.toLowerCase().includes('not found') ||
148
+ bodyText.toLowerCase().includes('page not found') ||
149
+ url.includes('/login') || // Redirected to login = acceptable
150
+ url !== fakeRoute; // Redirected somewhere = acceptable
151
+ if (!has404Indicator && bodyText.trim().length === 0) {
152
+ findings.push({
153
+ id: `${this.agentId}-404-blank`,
154
+ type: 'test-bug',
155
+ severity: 'high',
156
+ agentId: this.agentId,
157
+ module: 'routing',
158
+ description: 'App shows a blank page for non-existent routes instead of a 404 page or redirect',
159
+ });
160
+ }
161
+ else if (!has404Indicator) {
162
+ findings.push({
163
+ id: `${this.agentId}-404-no-handler`,
164
+ type: 'test-bug',
165
+ severity: 'medium',
166
+ agentId: this.agentId,
167
+ module: 'routing',
168
+ description: 'Non-existent route did not show a clear 404 indicator or redirect — page may silently render without error handling',
169
+ });
170
+ }
171
+ }
172
+ catch (navError) {
173
+ findings.push({
174
+ id: `${this.agentId}-404-nav-error`,
175
+ type: 'test-bug',
176
+ severity: 'medium',
177
+ agentId: this.agentId,
178
+ module: 'routing',
179
+ description: `404 test navigation failed: ${navError instanceof Error ? navError.message.split('\n')[0] : String(navError)}`,
180
+ });
181
+ }
182
+ return findings;
183
+ }
184
+ /**
185
+ * Test 3: Open a new incognito context (no auth) and navigate to protected routes.
186
+ * Should redirect to login; if the page renders without auth, that is critical.
187
+ */
188
+ async testProtectedRoutes(browser) {
189
+ const findings = [];
190
+ let incognitoContext = null;
191
+ try {
192
+ incognitoContext = await browser.newContext();
193
+ const incognitoPage = await incognitoContext.newPage();
194
+ for (const mod of this.config.modules) {
195
+ const fullUrl = mod.route.startsWith('http')
196
+ ? mod.route
197
+ : `${this.baseUrl}${mod.route}`;
198
+ try {
199
+ await Promise.race([
200
+ incognitoPage.goto(fullUrl, { waitUntil: 'domcontentloaded' }),
201
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), NAV_TIMEOUT_MS)),
202
+ ]);
203
+ const currentUrl = incognitoPage.url();
204
+ const redirectedToLogin = currentUrl.includes('/login') ||
205
+ currentUrl.includes('/auth') ||
206
+ currentUrl.includes('/signin');
207
+ if (!redirectedToLogin) {
208
+ // Check if the page actually has meaningful content (not just a shell)
209
+ const bodyText = await incognitoPage.locator('body').innerText().catch(() => '');
210
+ if (bodyText.trim().length > 0) {
211
+ findings.push({
212
+ id: `${this.agentId}-unprotected-${mod.id}`,
213
+ type: 'code-bug-security',
214
+ severity: 'critical',
215
+ agentId: this.agentId,
216
+ module: mod.id,
217
+ description: `Module ${mod.id} accessible without authentication — no redirect to login page`,
218
+ });
219
+ }
220
+ }
221
+ }
222
+ catch {
223
+ // Navigation error for this module — skip
224
+ }
225
+ }
226
+ await incognitoPage.close().catch(() => undefined);
227
+ }
228
+ catch {
229
+ // Incognito context creation failure — non-critical
230
+ }
231
+ finally {
232
+ if (incognitoContext)
233
+ await incognitoContext.close().catch(() => undefined);
234
+ }
235
+ return findings;
236
+ }
237
+ /**
238
+ * Test 4: On each module page, find internal links and verify they load.
239
+ */
240
+ async testLinkIntegrity(page) {
241
+ const findings = [];
242
+ const testedUrls = new Set();
243
+ for (const mod of this.config.modules) {
244
+ const fullUrl = mod.route.startsWith('http')
245
+ ? mod.route
246
+ : `${this.baseUrl}${mod.route}`;
247
+ try {
248
+ await Promise.race([
249
+ page.goto(fullUrl, { waitUntil: 'domcontentloaded' }),
250
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), NAV_TIMEOUT_MS)),
251
+ ]);
252
+ // Find all internal links
253
+ const links = await page.locator('a[href^="/"]').evaluateAll((elements) => elements.map((el) => el.getAttribute('href')).filter(Boolean)).catch(() => []);
254
+ for (const href of links) {
255
+ if (!href || testedUrls.has(href))
256
+ continue;
257
+ testedUrls.add(href);
258
+ const linkUrl = `${this.baseUrl}${href}`;
259
+ try {
260
+ await Promise.race([
261
+ page.goto(linkUrl, { waitUntil: 'domcontentloaded' }),
262
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), NAV_TIMEOUT_MS)),
263
+ ]);
264
+ const bodyText = await page.locator('body').innerText().catch(() => '');
265
+ if (bodyText.trim().length === 0) {
266
+ findings.push({
267
+ id: `${this.agentId}-broken-link-${mod.id}-${href.replace(/\//g, '-')}`,
268
+ type: 'test-bug',
269
+ severity: 'medium',
270
+ agentId: this.agentId,
271
+ module: mod.id,
272
+ description: `Link ${href} on module ${mod.id} leads to a blank page`,
273
+ });
274
+ }
275
+ }
276
+ catch {
277
+ findings.push({
278
+ id: `${this.agentId}-link-error-${mod.id}-${href.replace(/\//g, '-')}`,
279
+ type: 'test-bug',
280
+ severity: 'medium',
281
+ agentId: this.agentId,
282
+ module: mod.id,
283
+ description: `Link ${href} on module ${mod.id} failed to load`,
284
+ });
285
+ }
286
+ }
287
+ }
288
+ catch {
289
+ // Navigation to module failed — already covered by sidebar test
290
+ }
291
+ }
292
+ return findings;
293
+ }
294
+ /**
295
+ * Test 5: Navigate between two modules, test back/forward browser history.
296
+ */
297
+ async testBackForward(page) {
298
+ const findings = [];
299
+ if (this.config.modules.length < 2) {
300
+ return findings;
301
+ }
302
+ const mod1 = this.config.modules[0];
303
+ const mod2 = this.config.modules[1];
304
+ const url1 = mod1.route.startsWith('http')
305
+ ? mod1.route
306
+ : `${this.baseUrl}${mod1.route}`;
307
+ const url2 = mod2.route.startsWith('http')
308
+ ? mod2.route
309
+ : `${this.baseUrl}${mod2.route}`;
310
+ try {
311
+ // Navigate to module 1
312
+ await Promise.race([
313
+ page.goto(url1, { waitUntil: 'domcontentloaded' }),
314
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), NAV_TIMEOUT_MS)),
315
+ ]);
316
+ // Navigate to module 2
317
+ await Promise.race([
318
+ page.goto(url2, { waitUntil: 'domcontentloaded' }),
319
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), NAV_TIMEOUT_MS)),
320
+ ]);
321
+ // Press back
322
+ await page.goBack({ timeout: NAV_TIMEOUT_MS });
323
+ const afterBack = page.url();
324
+ const expectedUrl1 = new URL(url1).pathname;
325
+ if (!afterBack.includes(expectedUrl1)) {
326
+ findings.push({
327
+ id: `${this.agentId}-back-nav-failed`,
328
+ type: 'test-bug',
329
+ severity: 'medium',
330
+ agentId: this.agentId,
331
+ module: 'routing',
332
+ description: `Back navigation did not return to ${mod1.id} (${mod1.route}) — got ${afterBack}`,
333
+ });
334
+ }
335
+ // Press forward
336
+ await page.goForward({ timeout: NAV_TIMEOUT_MS });
337
+ const afterForward = page.url();
338
+ const expectedUrl2 = new URL(url2).pathname;
339
+ if (!afterForward.includes(expectedUrl2)) {
340
+ findings.push({
341
+ id: `${this.agentId}-forward-nav-failed`,
342
+ type: 'test-bug',
343
+ severity: 'medium',
344
+ agentId: this.agentId,
345
+ module: 'routing',
346
+ description: `Forward navigation did not return to ${mod2.id} (${mod2.route}) — got ${afterForward}`,
347
+ });
348
+ }
349
+ }
350
+ catch (historyError) {
351
+ findings.push({
352
+ id: `${this.agentId}-history-nav-error`,
353
+ type: 'test-bug',
354
+ severity: 'medium',
355
+ agentId: this.agentId,
356
+ module: 'routing',
357
+ description: `Back/forward navigation test failed: ${historyError instanceof Error ? historyError.message.split('\n')[0] : String(historyError)}`,
358
+ });
359
+ }
360
+ return findings;
361
+ }
362
+ }
363
+ //# sourceMappingURL=28-navigation-routing-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"28-navigation-routing-tester.js","sourceRoot":"","sources":["../../agents/28-navigation-routing-tester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Finding } from '../core/types';
2
+ import { BaseAgent } from './base-agent';
3
+ export declare class ResponsiveInteractionTesterAgent extends BaseAgent {
4
+ readonly agentId = 29;
5
+ readonly agentName = "Responsive Interaction Tester";
6
+ private baseUrl;
7
+ protected preFlight(): Promise<void>;
8
+ protected execute(): Promise<Finding[]>;
9
+ /**
10
+ * Test hamburger menu: find toggle button, click it, verify nav panel opens.
11
+ */
12
+ private testHamburgerMenu;
13
+ /**
14
+ * Test touch targets: find clickable elements with dimensions < 44px.
15
+ */
16
+ private testTouchTargets;
17
+ /**
18
+ * Test modal overflow: look for a modal trigger, click it, check width.
19
+ */
20
+ private testModalOverflow;
21
+ /**
22
+ * Test horizontal scrolling: check if scrollWidth > clientWidth.
23
+ */
24
+ private testHorizontalScroll;
25
+ }
26
+ //# sourceMappingURL=29-responsive-interaction-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"29-responsive-interaction-tester.d.ts","sourceRoot":"","sources":["../../agents/29-responsive-interaction-tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAyBzC,qBAAa,gCAAiC,SAAQ,SAAS;IAC7D,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,mCAAmC;IACrD,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAW1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAuG7C;;OAEG;YACW,iBAAiB;IA+C/B;;OAEG;YACW,gBAAgB;IAkD9B;;OAEG;YACW,iBAAiB;IA4D/B;;OAEG;YACW,oBAAoB;CAkCnC"}