@avi770/testteam 1.2.0 → 3.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 (324) hide show
  1. package/CHANGELOG.md +53 -1
  2. package/README.md +72 -7
  3. package/agents/15-regression-sentinel.ts +3 -2
  4. package/agents/24-signup-onboarding-tester.ts +429 -0
  5. package/agents/25-crud-flow-tester.ts +302 -0
  6. package/agents/26-form-validator.ts +297 -0
  7. package/agents/27-search-filter-tester.ts +326 -0
  8. package/agents/28-navigation-routing-tester.ts +425 -0
  9. package/agents/29-responsive-interaction-tester.ts +350 -0
  10. package/agents/30-multi-user-scenario-tester.ts +319 -0
  11. package/agents/31-load-tester.ts +134 -0
  12. package/agents/32-memory-leak-detector.ts +194 -0
  13. package/agents/33-bundle-analyzer.ts +132 -0
  14. package/agents/34-xss-scanner.ts +191 -0
  15. package/agents/35-csrf-tester.ts +82 -0
  16. package/agents/36-auth-fuzzer.ts +194 -0
  17. package/agents/37-dependency-scanner.ts +176 -0
  18. package/agents/38-secrets-scanner.ts +137 -0
  19. package/agents/39-api-contract-tester.ts +199 -0
  20. package/agents/40-rate-limit-tester.ts +94 -0
  21. package/agents/41-api-pagination-tester.ts +97 -0
  22. package/agents/42-graphql-tester.ts +222 -0
  23. package/agents/43-data-consistency-checker.ts +205 -0
  24. package/agents/44-backup-recovery-tester.ts +152 -0
  25. package/agents/45-data-privacy-scanner.ts +125 -0
  26. package/agents/46-seo-auditor.ts +294 -0
  27. package/agents/47-social-preview-tester.ts +232 -0
  28. package/agents/48-lighthouse-auditor.ts +213 -0
  29. package/agents/49-i18n-tester.ts +198 -0
  30. package/agents/50-timezone-tester.ts +173 -0
  31. package/agents/51-error-recovery-tester.ts +155 -0
  32. package/agents/52-offline-mode-tester.ts +180 -0
  33. package/agents/53-graceful-degradation-tester.ts +156 -0
  34. package/agents/54-websocket-tester.ts +151 -0
  35. package/agents/55-realtime-sync-tester.ts +194 -0
  36. package/agents/56-file-upload-tester.ts +194 -0
  37. package/agents/57-export-tester.ts +174 -0
  38. package/agents/58-payment-flow-tester.ts +183 -0
  39. package/agents/59-ssl-tls-auditor.ts +141 -0
  40. package/agents/60-dns-cdn-tester.ts +117 -0
  41. package/agents/61-docker-health-checker.ts +111 -0
  42. package/agents/62-env-config-validator.ts +152 -0
  43. package/agents/63-log-quality-auditor.ts +136 -0
  44. package/agents/64-analytics-tracker-tester.ts +165 -0
  45. package/agents/65-gdpr-compliance-tester.ts +215 -0
  46. package/agents/66-soc2-control-validator.ts +210 -0
  47. package/agents/67-wcag-aaa-tester.ts +241 -0
  48. package/agents/68-dead-code-detector.ts +135 -0
  49. package/agents/69-type-safety-auditor.ts +164 -0
  50. package/agents/70-complexity-analyzer.ts +179 -0
  51. package/agents/__tests__/24-signup-onboarding-tester.test.ts +274 -0
  52. package/agents/__tests__/25-crud-flow-tester.test.ts +322 -0
  53. package/agents/__tests__/26-form-validator.test.ts +345 -0
  54. package/agents/__tests__/27-search-filter-tester.test.ts +311 -0
  55. package/agents/__tests__/28-navigation-routing-tester.test.ts +328 -0
  56. package/agents/__tests__/29-responsive-interaction-tester.test.ts +297 -0
  57. package/agents/__tests__/30-multi-user-scenario-tester.test.ts +328 -0
  58. package/agents/__tests__/31-load-tester.test.ts +189 -0
  59. package/agents/__tests__/32-memory-leak-detector.test.ts +251 -0
  60. package/agents/__tests__/33-bundle-analyzer.test.ts +237 -0
  61. package/agents/__tests__/34-xss-scanner.test.ts +258 -0
  62. package/agents/__tests__/35-csrf-tester.test.ts +200 -0
  63. package/agents/__tests__/36-auth-fuzzer.test.ts +214 -0
  64. package/agents/__tests__/37-dependency-scanner.test.ts +266 -0
  65. package/agents/__tests__/38-secrets-scanner.test.ts +224 -0
  66. package/agents/__tests__/39-api-contract-tester.test.ts +312 -0
  67. package/agents/__tests__/40-rate-limit-tester.test.ts +192 -0
  68. package/agents/__tests__/41-api-pagination-tester.test.ts +198 -0
  69. package/agents/__tests__/42-graphql-tester.test.ts +252 -0
  70. package/agents/__tests__/43-data-consistency-checker.test.ts +232 -0
  71. package/agents/__tests__/44-backup-recovery-tester.test.ts +222 -0
  72. package/agents/__tests__/45-data-privacy-scanner.test.ts +223 -0
  73. package/agents/__tests__/46-seo-auditor.test.ts +261 -0
  74. package/agents/__tests__/47-social-preview-tester.test.ts +245 -0
  75. package/agents/__tests__/48-lighthouse-auditor.test.ts +276 -0
  76. package/agents/__tests__/49-i18n-tester.test.ts +201 -0
  77. package/agents/__tests__/50-timezone-tester.test.ts +172 -0
  78. package/agents/__tests__/51-error-recovery-tester.test.ts +162 -0
  79. package/agents/__tests__/52-offline-mode-tester.test.ts +164 -0
  80. package/agents/__tests__/53-graceful-degradation-tester.test.ts +168 -0
  81. package/agents/__tests__/54-websocket-tester.test.ts +157 -0
  82. package/agents/__tests__/55-realtime-sync-tester.test.ts +181 -0
  83. package/agents/__tests__/56-file-upload-tester.test.ts +172 -0
  84. package/agents/__tests__/57-export-tester.test.ts +169 -0
  85. package/agents/__tests__/58-payment-flow-tester.test.ts +182 -0
  86. package/agents/__tests__/59-ssl-tls-auditor.test.ts +179 -0
  87. package/agents/__tests__/60-dns-cdn-tester.test.ts +176 -0
  88. package/agents/__tests__/61-docker-health-checker.test.ts +150 -0
  89. package/agents/__tests__/62-env-config-validator.test.ts +166 -0
  90. package/agents/__tests__/63-log-quality-auditor.test.ts +175 -0
  91. package/agents/__tests__/64-analytics-tracker-tester.test.ts +158 -0
  92. package/agents/__tests__/65-gdpr-compliance-tester.test.ts +174 -0
  93. package/agents/__tests__/66-soc2-control-validator.test.ts +183 -0
  94. package/agents/__tests__/67-wcag-aaa-tester.test.ts +190 -0
  95. package/agents/__tests__/68-dead-code-detector.test.ts +174 -0
  96. package/agents/__tests__/69-type-safety-auditor.test.ts +173 -0
  97. package/agents/__tests__/70-complexity-analyzer.test.ts +177 -0
  98. package/agents/__tests__/registry.test.ts +13 -13
  99. package/agents/base-agent.ts +8 -0
  100. package/agents/registry.ts +171 -28
  101. package/core/__tests__/integration.test.ts +4 -4
  102. package/core/__tests__/orchestrator.test.ts +17 -16
  103. package/core/cli.ts +128 -6
  104. package/core/license.ts +208 -211
  105. package/core/orchestrator.ts +78 -5
  106. package/dist/agents/15-regression-sentinel.d.ts +2 -1
  107. package/dist/agents/15-regression-sentinel.d.ts.map +1 -1
  108. package/dist/agents/15-regression-sentinel.js +2 -2
  109. package/dist/agents/15-regression-sentinel.js.map +1 -1
  110. package/dist/agents/24-signup-onboarding-tester.d.ts +35 -0
  111. package/dist/agents/24-signup-onboarding-tester.d.ts.map +1 -0
  112. package/dist/agents/24-signup-onboarding-tester.js +357 -0
  113. package/dist/agents/24-signup-onboarding-tester.js.map +1 -0
  114. package/dist/agents/25-crud-flow-tester.d.ts +11 -0
  115. package/dist/agents/25-crud-flow-tester.d.ts.map +1 -0
  116. package/dist/agents/25-crud-flow-tester.js +253 -0
  117. package/dist/agents/25-crud-flow-tester.js.map +1 -0
  118. package/dist/agents/26-form-validator.d.ts +12 -0
  119. package/dist/agents/26-form-validator.d.ts.map +1 -0
  120. package/dist/agents/26-form-validator.js +257 -0
  121. package/dist/agents/26-form-validator.js.map +1 -0
  122. package/dist/agents/27-search-filter-tester.d.ts +20 -0
  123. package/dist/agents/27-search-filter-tester.d.ts.map +1 -0
  124. package/dist/agents/27-search-filter-tester.js +267 -0
  125. package/dist/agents/27-search-filter-tester.js.map +1 -0
  126. package/dist/agents/28-navigation-routing-tester.d.ts +32 -0
  127. package/dist/agents/28-navigation-routing-tester.d.ts.map +1 -0
  128. package/dist/agents/28-navigation-routing-tester.js +363 -0
  129. package/dist/agents/28-navigation-routing-tester.js.map +1 -0
  130. package/dist/agents/29-responsive-interaction-tester.d.ts +26 -0
  131. package/dist/agents/29-responsive-interaction-tester.d.ts.map +1 -0
  132. package/dist/agents/29-responsive-interaction-tester.js +272 -0
  133. package/dist/agents/29-responsive-interaction-tester.js.map +1 -0
  134. package/dist/agents/30-multi-user-scenario-tester.d.ts +24 -0
  135. package/dist/agents/30-multi-user-scenario-tester.d.ts.map +1 -0
  136. package/dist/agents/30-multi-user-scenario-tester.js +254 -0
  137. package/dist/agents/30-multi-user-scenario-tester.js.map +1 -0
  138. package/dist/agents/31-load-tester.d.ts +12 -0
  139. package/dist/agents/31-load-tester.d.ts.map +1 -0
  140. package/dist/agents/31-load-tester.js +110 -0
  141. package/dist/agents/31-load-tester.js.map +1 -0
  142. package/dist/agents/32-memory-leak-detector.d.ts +12 -0
  143. package/dist/agents/32-memory-leak-detector.d.ts.map +1 -0
  144. package/dist/agents/32-memory-leak-detector.js +167 -0
  145. package/dist/agents/32-memory-leak-detector.js.map +1 -0
  146. package/dist/agents/33-bundle-analyzer.d.ts +10 -0
  147. package/dist/agents/33-bundle-analyzer.d.ts.map +1 -0
  148. package/dist/agents/33-bundle-analyzer.js +111 -0
  149. package/dist/agents/33-bundle-analyzer.js.map +1 -0
  150. package/dist/agents/34-xss-scanner.d.ts +11 -0
  151. package/dist/agents/34-xss-scanner.d.ts.map +1 -0
  152. package/dist/agents/34-xss-scanner.js +164 -0
  153. package/dist/agents/34-xss-scanner.js.map +1 -0
  154. package/dist/agents/35-csrf-tester.d.ts +11 -0
  155. package/dist/agents/35-csrf-tester.d.ts.map +1 -0
  156. package/dist/agents/35-csrf-tester.js +70 -0
  157. package/dist/agents/35-csrf-tester.js.map +1 -0
  158. package/dist/agents/36-auth-fuzzer.d.ts +13 -0
  159. package/dist/agents/36-auth-fuzzer.d.ts.map +1 -0
  160. package/dist/agents/36-auth-fuzzer.js +163 -0
  161. package/dist/agents/36-auth-fuzzer.js.map +1 -0
  162. package/dist/agents/37-dependency-scanner.d.ts +11 -0
  163. package/dist/agents/37-dependency-scanner.d.ts.map +1 -0
  164. package/dist/agents/37-dependency-scanner.js +139 -0
  165. package/dist/agents/37-dependency-scanner.js.map +1 -0
  166. package/dist/agents/38-secrets-scanner.d.ts +11 -0
  167. package/dist/agents/38-secrets-scanner.d.ts.map +1 -0
  168. package/dist/agents/38-secrets-scanner.js +116 -0
  169. package/dist/agents/38-secrets-scanner.js.map +1 -0
  170. package/dist/agents/39-api-contract-tester.d.ts +12 -0
  171. package/dist/agents/39-api-contract-tester.d.ts.map +1 -0
  172. package/dist/agents/39-api-contract-tester.js +142 -0
  173. package/dist/agents/39-api-contract-tester.js.map +1 -0
  174. package/dist/agents/40-rate-limit-tester.d.ts +12 -0
  175. package/dist/agents/40-rate-limit-tester.d.ts.map +1 -0
  176. package/dist/agents/40-rate-limit-tester.js +79 -0
  177. package/dist/agents/40-rate-limit-tester.js.map +1 -0
  178. package/dist/agents/41-api-pagination-tester.d.ts +12 -0
  179. package/dist/agents/41-api-pagination-tester.d.ts.map +1 -0
  180. package/dist/agents/41-api-pagination-tester.js +79 -0
  181. package/dist/agents/41-api-pagination-tester.js.map +1 -0
  182. package/dist/agents/42-graphql-tester.d.ts +13 -0
  183. package/dist/agents/42-graphql-tester.d.ts.map +1 -0
  184. package/dist/agents/42-graphql-tester.js +187 -0
  185. package/dist/agents/42-graphql-tester.js.map +1 -0
  186. package/dist/agents/43-data-consistency-checker.d.ts +11 -0
  187. package/dist/agents/43-data-consistency-checker.d.ts.map +1 -0
  188. package/dist/agents/43-data-consistency-checker.js +176 -0
  189. package/dist/agents/43-data-consistency-checker.js.map +1 -0
  190. package/dist/agents/44-backup-recovery-tester.d.ts +11 -0
  191. package/dist/agents/44-backup-recovery-tester.d.ts.map +1 -0
  192. package/dist/agents/44-backup-recovery-tester.js +128 -0
  193. package/dist/agents/44-backup-recovery-tester.js.map +1 -0
  194. package/dist/agents/45-data-privacy-scanner.d.ts +11 -0
  195. package/dist/agents/45-data-privacy-scanner.d.ts.map +1 -0
  196. package/dist/agents/45-data-privacy-scanner.js +100 -0
  197. package/dist/agents/45-data-privacy-scanner.js.map +1 -0
  198. package/dist/agents/46-seo-auditor.d.ts +12 -0
  199. package/dist/agents/46-seo-auditor.d.ts.map +1 -0
  200. package/dist/agents/46-seo-auditor.js +275 -0
  201. package/dist/agents/46-seo-auditor.js.map +1 -0
  202. package/dist/agents/47-social-preview-tester.d.ts +11 -0
  203. package/dist/agents/47-social-preview-tester.d.ts.map +1 -0
  204. package/dist/agents/47-social-preview-tester.js +219 -0
  205. package/dist/agents/47-social-preview-tester.js.map +1 -0
  206. package/dist/agents/48-lighthouse-auditor.d.ts +11 -0
  207. package/dist/agents/48-lighthouse-auditor.d.ts.map +1 -0
  208. package/dist/agents/48-lighthouse-auditor.js +192 -0
  209. package/dist/agents/48-lighthouse-auditor.js.map +1 -0
  210. package/dist/agents/49-i18n-tester.d.ts +13 -0
  211. package/dist/agents/49-i18n-tester.d.ts.map +1 -0
  212. package/dist/agents/49-i18n-tester.js +172 -0
  213. package/dist/agents/49-i18n-tester.js.map +1 -0
  214. package/dist/agents/50-timezone-tester.d.ts +11 -0
  215. package/dist/agents/50-timezone-tester.d.ts.map +1 -0
  216. package/dist/agents/50-timezone-tester.js +152 -0
  217. package/dist/agents/50-timezone-tester.js.map +1 -0
  218. package/dist/agents/51-error-recovery-tester.d.ts +11 -0
  219. package/dist/agents/51-error-recovery-tester.d.ts.map +1 -0
  220. package/dist/agents/51-error-recovery-tester.js +134 -0
  221. package/dist/agents/51-error-recovery-tester.js.map +1 -0
  222. package/dist/agents/52-offline-mode-tester.d.ts +12 -0
  223. package/dist/agents/52-offline-mode-tester.d.ts.map +1 -0
  224. package/dist/agents/52-offline-mode-tester.js +161 -0
  225. package/dist/agents/52-offline-mode-tester.js.map +1 -0
  226. package/dist/agents/53-graceful-degradation-tester.d.ts +12 -0
  227. package/dist/agents/53-graceful-degradation-tester.d.ts.map +1 -0
  228. package/dist/agents/53-graceful-degradation-tester.js +130 -0
  229. package/dist/agents/53-graceful-degradation-tester.js.map +1 -0
  230. package/dist/agents/54-websocket-tester.d.ts +10 -0
  231. package/dist/agents/54-websocket-tester.d.ts.map +1 -0
  232. package/dist/agents/54-websocket-tester.js +132 -0
  233. package/dist/agents/54-websocket-tester.js.map +1 -0
  234. package/dist/agents/55-realtime-sync-tester.d.ts +11 -0
  235. package/dist/agents/55-realtime-sync-tester.d.ts.map +1 -0
  236. package/dist/agents/55-realtime-sync-tester.js +175 -0
  237. package/dist/agents/55-realtime-sync-tester.js.map +1 -0
  238. package/dist/agents/56-file-upload-tester.d.ts +12 -0
  239. package/dist/agents/56-file-upload-tester.d.ts.map +1 -0
  240. package/dist/agents/56-file-upload-tester.js +166 -0
  241. package/dist/agents/56-file-upload-tester.js.map +1 -0
  242. package/dist/agents/57-export-tester.d.ts +11 -0
  243. package/dist/agents/57-export-tester.d.ts.map +1 -0
  244. package/dist/agents/57-export-tester.js +155 -0
  245. package/dist/agents/57-export-tester.js.map +1 -0
  246. package/dist/agents/58-payment-flow-tester.d.ts +11 -0
  247. package/dist/agents/58-payment-flow-tester.d.ts.map +1 -0
  248. package/dist/agents/58-payment-flow-tester.js +159 -0
  249. package/dist/agents/58-payment-flow-tester.js.map +1 -0
  250. package/dist/agents/59-ssl-tls-auditor.d.ts +10 -0
  251. package/dist/agents/59-ssl-tls-auditor.d.ts.map +1 -0
  252. package/dist/agents/59-ssl-tls-auditor.js +132 -0
  253. package/dist/agents/59-ssl-tls-auditor.js.map +1 -0
  254. package/dist/agents/60-dns-cdn-tester.d.ts +10 -0
  255. package/dist/agents/60-dns-cdn-tester.d.ts.map +1 -0
  256. package/dist/agents/60-dns-cdn-tester.js +105 -0
  257. package/dist/agents/60-dns-cdn-tester.js.map +1 -0
  258. package/dist/agents/61-docker-health-checker.d.ts +10 -0
  259. package/dist/agents/61-docker-health-checker.d.ts.map +1 -0
  260. package/dist/agents/61-docker-health-checker.js +95 -0
  261. package/dist/agents/61-docker-health-checker.js.map +1 -0
  262. package/dist/agents/62-env-config-validator.d.ts +10 -0
  263. package/dist/agents/62-env-config-validator.d.ts.map +1 -0
  264. package/dist/agents/62-env-config-validator.js +132 -0
  265. package/dist/agents/62-env-config-validator.js.map +1 -0
  266. package/dist/agents/63-log-quality-auditor.d.ts +9 -0
  267. package/dist/agents/63-log-quality-auditor.d.ts.map +1 -0
  268. package/dist/agents/63-log-quality-auditor.js +121 -0
  269. package/dist/agents/63-log-quality-auditor.js.map +1 -0
  270. package/dist/agents/64-analytics-tracker-tester.d.ts +10 -0
  271. package/dist/agents/64-analytics-tracker-tester.d.ts.map +1 -0
  272. package/dist/agents/64-analytics-tracker-tester.js +146 -0
  273. package/dist/agents/64-analytics-tracker-tester.js.map +1 -0
  274. package/dist/agents/65-gdpr-compliance-tester.d.ts +13 -0
  275. package/dist/agents/65-gdpr-compliance-tester.d.ts.map +1 -0
  276. package/dist/agents/65-gdpr-compliance-tester.js +186 -0
  277. package/dist/agents/65-gdpr-compliance-tester.js.map +1 -0
  278. package/dist/agents/66-soc2-control-validator.d.ts +14 -0
  279. package/dist/agents/66-soc2-control-validator.d.ts.map +1 -0
  280. package/dist/agents/66-soc2-control-validator.js +178 -0
  281. package/dist/agents/66-soc2-control-validator.js.map +1 -0
  282. package/dist/agents/67-wcag-aaa-tester.d.ts +13 -0
  283. package/dist/agents/67-wcag-aaa-tester.d.ts.map +1 -0
  284. package/dist/agents/67-wcag-aaa-tester.js +207 -0
  285. package/dist/agents/67-wcag-aaa-tester.js.map +1 -0
  286. package/dist/agents/68-dead-code-detector.d.ts +9 -0
  287. package/dist/agents/68-dead-code-detector.d.ts.map +1 -0
  288. package/dist/agents/68-dead-code-detector.js +116 -0
  289. package/dist/agents/68-dead-code-detector.js.map +1 -0
  290. package/dist/agents/69-type-safety-auditor.d.ts +9 -0
  291. package/dist/agents/69-type-safety-auditor.d.ts.map +1 -0
  292. package/dist/agents/69-type-safety-auditor.js +148 -0
  293. package/dist/agents/69-type-safety-auditor.js.map +1 -0
  294. package/dist/agents/70-complexity-analyzer.d.ts +10 -0
  295. package/dist/agents/70-complexity-analyzer.d.ts.map +1 -0
  296. package/dist/agents/70-complexity-analyzer.js +154 -0
  297. package/dist/agents/70-complexity-analyzer.js.map +1 -0
  298. package/dist/agents/base-agent.d.ts +3 -1
  299. package/dist/agents/base-agent.d.ts.map +1 -1
  300. package/dist/agents/base-agent.js +7 -1
  301. package/dist/agents/base-agent.js.map +1 -1
  302. package/dist/agents/registry.d.ts +5 -4
  303. package/dist/agents/registry.d.ts.map +1 -1
  304. package/dist/agents/registry.js +170 -29
  305. package/dist/agents/registry.js.map +1 -1
  306. package/dist/clients/agent-mvp.d.ts +66 -0
  307. package/dist/clients/agent-mvp.d.ts.map +1 -0
  308. package/dist/clients/agent-mvp.js +91 -0
  309. package/dist/clients/agent-mvp.js.map +1 -0
  310. package/dist/clients/total-recall.d.ts +37 -0
  311. package/dist/clients/total-recall.d.ts.map +1 -0
  312. package/dist/clients/total-recall.js +224 -0
  313. package/dist/clients/total-recall.js.map +1 -0
  314. package/dist/core/cli.d.ts +3 -0
  315. package/dist/core/cli.d.ts.map +1 -1
  316. package/dist/core/cli.js +122 -6
  317. package/dist/core/cli.js.map +1 -1
  318. package/dist/core/license.js +2 -5
  319. package/dist/core/license.js.map +1 -1
  320. package/dist/core/orchestrator.d.ts +10 -1
  321. package/dist/core/orchestrator.d.ts.map +1 -1
  322. package/dist/core/orchestrator.js +66 -5
  323. package/dist/core/orchestrator.js.map +1 -1
  324. package/package.json +2 -2
@@ -0,0 +1,172 @@
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
+ auth: { loginUrl: 'http://localhost/login', credentials: { admin: { email: 'a@t.com', password: 's' } } },
9
+ modules: [{ id: 'dashboard', route: '/dashboard', sidebarIcon: true }],
10
+ environments: { alpha: { baseUrl: 'http://localhost:3000', seed: false } },
11
+ portals: [], breakpoints: [], integrations: [], workers: [], workflows: [],
12
+ accuracy: { enabled: false, decimalPrecision: 2, currencySymbol: '$', timezone: 'UTC' },
13
+ tenancy: { enabled: false, isolationField: 'firmId', testFirms: [] },
14
+ costBudget: { maxPerRun: 100, maxPerAgent: 10, alertThreshold: 0.8, onExceeded: 'abort' },
15
+ agentClassification: { blocking: [], advisory: [] },
16
+ 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 },
17
+ disabledAgents: [], disabledAgentSet: new Set<number>(),
18
+ ...overrides,
19
+ };
20
+ }
21
+
22
+ const fetchMock = vi.fn();
23
+ vi.stubGlobal('fetch', fetchMock);
24
+
25
+ const loginMock = vi.fn().mockResolvedValue(undefined);
26
+ vi.mock('../../helpers/navigation', () => ({
27
+ login: (...args: unknown[]) => loginMock(...args),
28
+ waitForSectionLoad: vi.fn().mockResolvedValue(undefined),
29
+ navigateToSection: vi.fn().mockResolvedValue(undefined),
30
+ switchPortal: vi.fn().mockResolvedValue(undefined),
31
+ }));
32
+
33
+ vi.mock('node:fs', () => ({
34
+ writeFileSync: vi.fn(),
35
+ unlinkSync: vi.fn(),
36
+ existsSync: vi.fn().mockReturnValue(true),
37
+ readFileSync: vi.fn().mockReturnValue(''),
38
+ }));
39
+
40
+ vi.mock('node:os', () => ({
41
+ tmpdir: vi.fn().mockReturnValue('/tmp'),
42
+ }));
43
+
44
+ function makeMockLocator(countVal = 0) {
45
+ const loc: Record<string, ReturnType<typeof vi.fn>> = {
46
+ count: vi.fn().mockResolvedValue(countVal),
47
+ first: vi.fn(),
48
+ setInputFiles: vi.fn().mockResolvedValue(undefined),
49
+ };
50
+ loc.first.mockReturnValue(loc);
51
+ return loc;
52
+ }
53
+
54
+ function makeMockPage() {
55
+ return {
56
+ close: vi.fn().mockResolvedValue(undefined),
57
+ goto: vi.fn().mockResolvedValue(undefined),
58
+ locator: vi.fn().mockReturnValue(makeMockLocator(0)),
59
+ on: vi.fn(),
60
+ };
61
+ }
62
+
63
+ let currentMockPage: ReturnType<typeof makeMockPage>;
64
+ let mockBrowser: { newPage: ReturnType<typeof vi.fn>; close: ReturnType<typeof vi.fn> };
65
+
66
+ vi.mock('playwright', async () => ({
67
+ chromium: { launch: vi.fn().mockImplementation(async () => mockBrowser) },
68
+ }));
69
+
70
+ const { FileUploadTesterAgent } = await import('../56-file-upload-tester');
71
+
72
+ function createAgent(config: ValidatedConfig = makeConfig(), phase: Phase = 'beta') {
73
+ return new FileUploadTesterAgent(config, phase, '/tmp/test-run');
74
+ }
75
+
76
+ describe('FileUploadTesterAgent', () => {
77
+ beforeEach(() => {
78
+ fetchMock.mockReset().mockResolvedValue({ ok: true, status: 200 });
79
+ loginMock.mockReset().mockResolvedValue(undefined);
80
+ currentMockPage = makeMockPage();
81
+ mockBrowser = {
82
+ newPage: vi.fn().mockResolvedValue(currentMockPage),
83
+ close: vi.fn().mockResolvedValue(undefined),
84
+ };
85
+ });
86
+
87
+ it('has agentId 56 and correct name', () => {
88
+ const agent = createAgent();
89
+ expect(agent.agentId).toBe(56);
90
+ expect(agent.agentName).toBe('File Upload Tester');
91
+ });
92
+
93
+ it('throws when modules empty', async () => {
94
+ const agent = createAgent(makeConfig({ modules: [] }));
95
+ const result = await agent.run();
96
+ expect(result.status).toBe('failed');
97
+ });
98
+
99
+ it('skips module with no file inputs', async () => {
100
+ currentMockPage.locator.mockReturnValue(makeMockLocator(0));
101
+ const agent = createAgent();
102
+ const result = await agent.run();
103
+ // No upload-related findings
104
+ const uploadFindings = result.findings.filter(f => f.id.includes('upload') || f.id.includes('exe'));
105
+ expect(uploadFindings.length).toBe(0);
106
+ });
107
+
108
+ it('reports no feedback when upload has no response', async () => {
109
+ const fileLocator = makeMockLocator(1);
110
+ const noFeedbackLocator = makeMockLocator(0);
111
+ currentMockPage.locator.mockImplementation((sel: string) => {
112
+ if (sel.includes('file')) return fileLocator;
113
+ return noFeedbackLocator;
114
+ });
115
+ const agent = createAgent();
116
+ const result = await agent.run();
117
+ const finding = result.findings.find(f => f.id.includes('no-upload-feedback'));
118
+ expect(finding).toBeDefined();
119
+ });
120
+
121
+ it('reports exe not rejected when no error shown', async () => {
122
+ const fileLocator = makeMockLocator(1);
123
+ const noErrorLocator = makeMockLocator(0);
124
+ currentMockPage.locator.mockImplementation((sel: string) => {
125
+ if (sel.includes('file')) return fileLocator;
126
+ return noErrorLocator;
127
+ });
128
+ const agent = createAgent();
129
+ const result = await agent.run();
130
+ const finding = result.findings.find(f => f.id.includes('exe-not-rejected'));
131
+ expect(finding).toBeDefined();
132
+ expect(finding!.severity).toBe('high');
133
+ });
134
+
135
+ it('handles login failure', async () => {
136
+ loginMock.mockRejectedValue(new Error('Login failed'));
137
+ const agent = createAgent();
138
+ const result = await agent.run();
139
+ const finding = result.findings.find(f => f.id.includes('login-failed'));
140
+ expect(finding).toBeDefined();
141
+ });
142
+
143
+ it('handles playwright crash', async () => {
144
+ mockBrowser.newPage.mockRejectedValue(new Error('Crash'));
145
+ const agent = createAgent();
146
+ const result = await agent.run();
147
+ const finding = result.findings.find(f => f.id.includes('playwright-failure'));
148
+ expect(finding).toBeDefined();
149
+ });
150
+
151
+ it('closes browser in finally', async () => {
152
+ mockBrowser.newPage.mockRejectedValue(new Error('Crash'));
153
+ const agent = createAgent();
154
+ await agent.run();
155
+ expect(mockBrowser.close).toHaveBeenCalled();
156
+ });
157
+
158
+ it('handles nav failure for module', async () => {
159
+ currentMockPage.goto.mockRejectedValue(new Error('Nav failed'));
160
+ const agent = createAgent();
161
+ const result = await agent.run();
162
+ // Should not crash
163
+ expect(result.status).toBeDefined();
164
+ });
165
+
166
+ it('no credentials continues', async () => {
167
+ const config = makeConfig({ auth: { loginUrl: '/login', credentials: {} } });
168
+ const agent = createAgent(config);
169
+ const result = await agent.run();
170
+ expect(result.status).toBeDefined();
171
+ });
172
+ });
@@ -0,0 +1,169 @@
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
+ auth: { loginUrl: 'http://localhost/login', credentials: { admin: { email: 'a@t.com', password: 's' } } },
9
+ modules: [{ id: 'dashboard', route: '/dashboard', sidebarIcon: true }],
10
+ environments: { alpha: { baseUrl: 'http://localhost:3000', seed: false } },
11
+ portals: [], breakpoints: [], integrations: [], workers: [], workflows: [],
12
+ accuracy: { enabled: false, decimalPrecision: 2, currencySymbol: '$', timezone: 'UTC' },
13
+ tenancy: { enabled: false, isolationField: 'firmId', testFirms: [] },
14
+ costBudget: { maxPerRun: 100, maxPerAgent: 10, alertThreshold: 0.8, onExceeded: 'abort' },
15
+ agentClassification: { blocking: [], advisory: [] },
16
+ 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 },
17
+ disabledAgents: [], disabledAgentSet: new Set<number>(),
18
+ ...overrides,
19
+ };
20
+ }
21
+
22
+ const fetchMock = vi.fn();
23
+ vi.stubGlobal('fetch', fetchMock);
24
+
25
+ const loginMock = vi.fn().mockResolvedValue(undefined);
26
+ vi.mock('../../helpers/navigation', () => ({
27
+ login: (...args: unknown[]) => loginMock(...args),
28
+ waitForSectionLoad: vi.fn().mockResolvedValue(undefined),
29
+ navigateToSection: vi.fn().mockResolvedValue(undefined),
30
+ switchPortal: vi.fn().mockResolvedValue(undefined),
31
+ }));
32
+
33
+ function makeMockLocator(countVal = 0) {
34
+ const loc: Record<string, ReturnType<typeof vi.fn>> = {
35
+ count: vi.fn().mockResolvedValue(countVal),
36
+ first: vi.fn(),
37
+ click: vi.fn().mockResolvedValue(undefined),
38
+ };
39
+ loc.first.mockReturnValue(loc);
40
+ return loc;
41
+ }
42
+
43
+ function makeMockPage() {
44
+ return {
45
+ close: vi.fn().mockResolvedValue(undefined),
46
+ goto: vi.fn().mockResolvedValue(undefined),
47
+ locator: vi.fn().mockReturnValue(makeMockLocator(0)),
48
+ waitForEvent: vi.fn().mockRejectedValue(new Error('Timeout')),
49
+ on: vi.fn(),
50
+ };
51
+ }
52
+
53
+ let currentMockPage: ReturnType<typeof makeMockPage>;
54
+ let mockBrowser: { newPage: ReturnType<typeof vi.fn>; close: ReturnType<typeof vi.fn> };
55
+
56
+ vi.mock('playwright', async () => ({
57
+ chromium: { launch: vi.fn().mockImplementation(async () => mockBrowser) },
58
+ }));
59
+
60
+ const { ExportTesterAgent } = await import('../57-export-tester');
61
+
62
+ function createAgent(config: ValidatedConfig = makeConfig(), phase: Phase = 'beta') {
63
+ return new ExportTesterAgent(config, phase, '/tmp/test-run');
64
+ }
65
+
66
+ describe('ExportTesterAgent', () => {
67
+ beforeEach(() => {
68
+ fetchMock.mockReset().mockResolvedValue({ ok: true, status: 200 });
69
+ loginMock.mockReset().mockResolvedValue(undefined);
70
+ currentMockPage = makeMockPage();
71
+ mockBrowser = {
72
+ newPage: vi.fn().mockResolvedValue(currentMockPage),
73
+ close: vi.fn().mockResolvedValue(undefined),
74
+ };
75
+ });
76
+
77
+ it('has agentId 57 and correct name', () => {
78
+ const agent = createAgent();
79
+ expect(agent.agentId).toBe(57);
80
+ expect(agent.agentName).toBe('Export Tester');
81
+ });
82
+
83
+ it('throws when modules empty', async () => {
84
+ const agent = createAgent(makeConfig({ modules: [] }));
85
+ const result = await agent.run();
86
+ expect(result.status).toBe('failed');
87
+ });
88
+
89
+ it('skips module with no export buttons', async () => {
90
+ currentMockPage.locator.mockReturnValue(makeMockLocator(0));
91
+ const agent = createAgent();
92
+ const result = await agent.run();
93
+ const exportFindings = result.findings.filter(f => f.id.includes('download') || f.id.includes('export'));
94
+ expect(exportFindings.length).toBe(0);
95
+ });
96
+
97
+ it('reports no download when export button click produces none', async () => {
98
+ currentMockPage.locator.mockReturnValue(makeMockLocator(1));
99
+ currentMockPage.waitForEvent.mockRejectedValue(new Error('Timeout'));
100
+ const agent = createAgent();
101
+ const result = await agent.run();
102
+ const finding = result.findings.find(f => f.id.includes('no-download'));
103
+ expect(finding).toBeDefined();
104
+ expect(finding!.severity).toBe('medium');
105
+ });
106
+
107
+ it('reports empty download file', async () => {
108
+ currentMockPage.locator.mockReturnValue(makeMockLocator(1));
109
+ const mockDownload = {
110
+ suggestedFilename: vi.fn().mockReturnValue('data.csv'),
111
+ path: vi.fn().mockResolvedValue(null), // null path means we can't check size
112
+ };
113
+ currentMockPage.waitForEvent.mockResolvedValue(mockDownload);
114
+
115
+ const agent = createAgent();
116
+ const result = await agent.run();
117
+ // When path is null, no empty-download finding, but download succeeds
118
+ expect(result.status).toBeDefined();
119
+ });
120
+
121
+ it('handles login failure', async () => {
122
+ loginMock.mockRejectedValue(new Error('Login failed'));
123
+ const agent = createAgent();
124
+ const result = await agent.run();
125
+ const finding = result.findings.find(f => f.id.includes('login-failed'));
126
+ expect(finding).toBeDefined();
127
+ });
128
+
129
+ it('handles playwright crash', async () => {
130
+ mockBrowser.newPage.mockRejectedValue(new Error('Crash'));
131
+ const agent = createAgent();
132
+ const result = await agent.run();
133
+ const finding = result.findings.find(f => f.id.includes('playwright-failure'));
134
+ expect(finding).toBeDefined();
135
+ });
136
+
137
+ it('closes browser in finally', async () => {
138
+ mockBrowser.newPage.mockRejectedValue(new Error('Crash'));
139
+ const agent = createAgent();
140
+ await agent.run();
141
+ expect(mockBrowser.close).toHaveBeenCalled();
142
+ });
143
+
144
+ it('handles nav failure', async () => {
145
+ currentMockPage.goto.mockRejectedValue(new Error('Nav failed'));
146
+ const agent = createAgent();
147
+ const result = await agent.run();
148
+ expect(result.status).toBeDefined();
149
+ });
150
+
151
+ it('handles export click failure', async () => {
152
+ const clickLocator = makeMockLocator(1);
153
+ clickLocator.first.mockReturnValue({
154
+ click: vi.fn().mockRejectedValue(new Error('Click failed')),
155
+ });
156
+ currentMockPage.locator.mockReturnValue(clickLocator);
157
+ const agent = createAgent();
158
+ const result = await agent.run();
159
+ const finding = result.findings.find(f => f.id.includes('export-click-failed'));
160
+ expect(finding).toBeDefined();
161
+ });
162
+
163
+ it('no credentials continues', async () => {
164
+ const config = makeConfig({ auth: { loginUrl: '/login', credentials: {} } });
165
+ const agent = createAgent(config);
166
+ const result = await agent.run();
167
+ expect(result.status).toBeDefined();
168
+ });
169
+ });
@@ -0,0 +1,182 @@
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
+ auth: { loginUrl: 'http://localhost/login', credentials: { admin: { email: 'a@t.com', password: 's' } } },
9
+ modules: [{ id: 'dashboard', route: '/dashboard', sidebarIcon: true }],
10
+ environments: { alpha: { baseUrl: 'http://localhost:3000', seed: false } },
11
+ portals: [], breakpoints: [], integrations: [], workers: [], workflows: [],
12
+ accuracy: { enabled: false, decimalPrecision: 2, currencySymbol: '$', timezone: 'UTC' },
13
+ tenancy: { enabled: false, isolationField: 'firmId', testFirms: [] },
14
+ costBudget: { maxPerRun: 100, maxPerAgent: 10, alertThreshold: 0.8, onExceeded: 'abort' },
15
+ agentClassification: { blocking: [], advisory: [] },
16
+ 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 },
17
+ disabledAgents: [], disabledAgentSet: new Set<number>(),
18
+ ...overrides,
19
+ };
20
+ }
21
+
22
+ const fetchMock = vi.fn();
23
+ vi.stubGlobal('fetch', fetchMock);
24
+
25
+ const loginMock = vi.fn().mockResolvedValue(undefined);
26
+ vi.mock('../../helpers/navigation', () => ({
27
+ login: (...args: unknown[]) => loginMock(...args),
28
+ waitForSectionLoad: vi.fn().mockResolvedValue(undefined),
29
+ navigateToSection: vi.fn().mockResolvedValue(undefined),
30
+ switchPortal: vi.fn().mockResolvedValue(undefined),
31
+ }));
32
+
33
+ function makeMockLocator(countVal = 0) {
34
+ const loc: Record<string, ReturnType<typeof vi.fn>> = {
35
+ count: vi.fn().mockResolvedValue(countVal),
36
+ first: vi.fn(),
37
+ click: vi.fn().mockResolvedValue(undefined),
38
+ };
39
+ loc.first.mockReturnValue(loc);
40
+ return loc;
41
+ }
42
+
43
+ function makeMockPage() {
44
+ return {
45
+ close: vi.fn().mockResolvedValue(undefined),
46
+ goto: vi.fn().mockResolvedValue({ ok: () => true }),
47
+ locator: vi.fn().mockReturnValue(makeMockLocator(0)),
48
+ on: vi.fn(),
49
+ };
50
+ }
51
+
52
+ let currentMockPage: ReturnType<typeof makeMockPage>;
53
+ let mockBrowser: { newPage: ReturnType<typeof vi.fn>; close: ReturnType<typeof vi.fn> };
54
+
55
+ vi.mock('playwright', async () => ({
56
+ chromium: { launch: vi.fn().mockImplementation(async () => mockBrowser) },
57
+ }));
58
+
59
+ const { PaymentFlowTesterAgent } = await import('../58-payment-flow-tester');
60
+
61
+ function createAgent(config: ValidatedConfig = makeConfig(), phase: Phase = 'beta') {
62
+ return new PaymentFlowTesterAgent(config, phase, '/tmp/test-run');
63
+ }
64
+
65
+ describe('PaymentFlowTesterAgent', () => {
66
+ beforeEach(() => {
67
+ fetchMock.mockReset().mockResolvedValue({ ok: true, status: 200 });
68
+ loginMock.mockReset().mockResolvedValue(undefined);
69
+ currentMockPage = makeMockPage();
70
+ mockBrowser = {
71
+ newPage: vi.fn().mockResolvedValue(currentMockPage),
72
+ close: vi.fn().mockResolvedValue(undefined),
73
+ };
74
+ });
75
+
76
+ it('has agentId 58 and correct name', () => {
77
+ const agent = createAgent();
78
+ expect(agent.agentId).toBe(58);
79
+ expect(agent.agentName).toBe('Payment Flow Tester');
80
+ });
81
+
82
+ it('skips when no stripe integration', async () => {
83
+ const agent = createAgent();
84
+ const result = await agent.run();
85
+ const finding = result.findings.find(f => f.id.includes('no-stripe'));
86
+ expect(finding).toBeDefined();
87
+ expect(finding!.severity).toBe('low');
88
+ });
89
+
90
+ it('reports no billing page when routes not found', async () => {
91
+ const config = makeConfig({ integrations: [{ name: 'stripe' }] });
92
+ currentMockPage.goto.mockResolvedValue({ ok: () => false });
93
+ const agent = createAgent(config);
94
+ const result = await agent.run();
95
+ const finding = result.findings.find(f => f.id.includes('no-billing-page'));
96
+ expect(finding).toBeDefined();
97
+ });
98
+
99
+ it('reports no stripe elements on billing page', async () => {
100
+ const config = makeConfig({ integrations: [{ name: 'stripe' }] });
101
+ currentMockPage.goto.mockResolvedValue({ ok: () => true });
102
+ currentMockPage.locator.mockReturnValue(makeMockLocator(0));
103
+ const agent = createAgent(config);
104
+ const result = await agent.run();
105
+ const finding = result.findings.find(f => f.id.includes('no-stripe-elements'));
106
+ expect(finding).toBeDefined();
107
+ });
108
+
109
+ it('detects stripe iframe', async () => {
110
+ const config = makeConfig({ integrations: [{ name: 'stripe' }] });
111
+ currentMockPage.goto.mockResolvedValue({ ok: () => true });
112
+ currentMockPage.locator.mockImplementation((sel: string) => {
113
+ if (sel.includes('stripe')) return makeMockLocator(1);
114
+ return makeMockLocator(0);
115
+ });
116
+ const agent = createAgent(config);
117
+ const result = await agent.run();
118
+ const noElements = result.findings.find(f => f.id.includes('no-stripe-elements'));
119
+ expect(noElements).toBeUndefined();
120
+ });
121
+
122
+ it('handles login failure', async () => {
123
+ const config = makeConfig({ integrations: [{ name: 'stripe' }] });
124
+ loginMock.mockRejectedValue(new Error('Login failed'));
125
+ const agent = createAgent(config);
126
+ const result = await agent.run();
127
+ const finding = result.findings.find(f => f.id.includes('login-failed'));
128
+ expect(finding).toBeDefined();
129
+ });
130
+
131
+ it('handles playwright crash', async () => {
132
+ const config = makeConfig({ integrations: [{ name: 'stripe' }] });
133
+ mockBrowser.newPage.mockRejectedValue(new Error('Crash'));
134
+ const agent = createAgent(config);
135
+ const result = await agent.run();
136
+ const finding = result.findings.find(f => f.id.includes('playwright-failure'));
137
+ expect(finding).toBeDefined();
138
+ });
139
+
140
+ it('closes browser in finally', async () => {
141
+ const config = makeConfig({ integrations: [{ name: 'stripe' }] });
142
+ mockBrowser.newPage.mockRejectedValue(new Error('Crash'));
143
+ const agent = createAgent(config);
144
+ await agent.run();
145
+ expect(mockBrowser.close).toHaveBeenCalled();
146
+ });
147
+
148
+ it('handles nav failure for billing routes', async () => {
149
+ const config = makeConfig({ integrations: [{ name: 'stripe' }] });
150
+ currentMockPage.goto.mockRejectedValue(new Error('Nav failed'));
151
+ const agent = createAgent(config);
152
+ const result = await agent.run();
153
+ const finding = result.findings.find(f => f.id.includes('no-billing-page'));
154
+ expect(finding).toBeDefined();
155
+ });
156
+
157
+ it('no credentials continues', async () => {
158
+ const config = makeConfig({ auth: { loginUrl: '/login', credentials: {} }, integrations: [{ name: 'stripe' }] });
159
+ const agent = createAgent(config);
160
+ const result = await agent.run();
161
+ expect(result.status).toBeDefined();
162
+ });
163
+
164
+ it('reports stripe iframe not loaded after checkout click', async () => {
165
+ const config = makeConfig({ integrations: [{ name: 'stripe' }] });
166
+ currentMockPage.goto.mockResolvedValue({ ok: () => true });
167
+ let callNum = 0;
168
+ currentMockPage.locator.mockImplementation((sel: string) => {
169
+ callNum++;
170
+ // First call: combined stripe selectors — found
171
+ if (callNum === 1) return makeMockLocator(1);
172
+ // iframe check
173
+ if (sel.includes('iframe[src*="stripe"]')) return makeMockLocator(0);
174
+ // checkout button
175
+ if (sel.includes('Subscribe') || sel.includes('Checkout')) return makeMockLocator(1);
176
+ return makeMockLocator(0);
177
+ });
178
+ const agent = createAgent(config);
179
+ const result = await agent.run();
180
+ expect(result.status).toBeDefined();
181
+ });
182
+ });