@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,357 @@
1
+ import { BaseAgent } from './base-agent';
2
+ import { resolveEnvironment } from '../helpers/env-resolver';
3
+ import { login } from '../helpers/navigation';
4
+ /** Timeout (ms) for individual signup/onboarding operations. */
5
+ const OP_TIMEOUT_MS = 5_000;
6
+ /** Common registration page paths to probe. */
7
+ const REGISTER_PATHS = ['/register', '/signup', '/sign-up'];
8
+ /** Selectors indicating onboarding/welcome UI. */
9
+ const ONBOARDING_SELECTORS = [
10
+ '[data-testid*="onboard"]',
11
+ '.onboarding',
12
+ '.welcome',
13
+ '.tour',
14
+ '[class*="tour"]',
15
+ '[class*="welcome"]',
16
+ '[class*="onboard"]',
17
+ ];
18
+ export class SignupOnboardingTesterAgent extends BaseAgent {
19
+ agentId = 24;
20
+ agentName = 'Signup & Onboarding Tester';
21
+ baseUrl = '';
22
+ async preFlight() {
23
+ const { env } = await resolveEnvironment(this.config, this.phase);
24
+ this.baseUrl = env.baseUrl;
25
+ }
26
+ async execute() {
27
+ const findings = [];
28
+ const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
29
+ const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
30
+ const credentials = this.config.auth.credentials?.['admin'] ??
31
+ Object.values(this.config.auth.credentials ?? {})[0];
32
+ const { chromium } = await import('playwright');
33
+ let browser = null;
34
+ try {
35
+ browser = await chromium.launch({ headless: true });
36
+ const page = await browser.newPage();
37
+ // Test 1: Registration page exists
38
+ const regFindings = await this.testRegistrationPage(page);
39
+ findings.push(...regFindings);
40
+ // Test 2: Registration validation
41
+ const validationFindings = await this.testRegistrationValidation(page);
42
+ findings.push(...validationFindings);
43
+ // Test 3: Login page
44
+ const loginPageFindings = await this.testLoginPage(page, loginUrl);
45
+ findings.push(...loginPageFindings);
46
+ // Test 4: Login flow
47
+ if (credentials) {
48
+ const loginFlowFindings = await this.testLoginFlow(page, credentials, loginUrl);
49
+ findings.push(...loginFlowFindings);
50
+ }
51
+ else {
52
+ findings.push({
53
+ id: `${this.agentId}-no-credentials`,
54
+ type: 'infra-issue',
55
+ severity: 'medium',
56
+ agentId: this.agentId,
57
+ module: 'signup-onboarding',
58
+ description: 'No credentials configured — skipping login flow test',
59
+ });
60
+ }
61
+ // Test 5: Onboarding detection
62
+ const onboardFindings = await this.testOnboardingDetection(page);
63
+ findings.push(...onboardFindings);
64
+ // Test 6: Forgot password
65
+ const forgotFindings = await this.testForgotPassword(page);
66
+ findings.push(...forgotFindings);
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: 'signup-onboarding',
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
+ /**
86
+ * Test 1: Check if a registration page exists.
87
+ * Tries config.auth.registerUrl first, then common paths.
88
+ */
89
+ async testRegistrationPage(page) {
90
+ const findings = [];
91
+ const configRegisterUrl = this.config.auth.registerUrl;
92
+ const pathsToTry = configRegisterUrl ? [configRegisterUrl] : [...REGISTER_PATHS];
93
+ let found = false;
94
+ for (const p of pathsToTry) {
95
+ const url = p.startsWith('http') ? p : `${this.baseUrl}${p}`;
96
+ try {
97
+ const response = await Promise.race([
98
+ page.goto(url, { waitUntil: 'domcontentloaded' }),
99
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
100
+ ]);
101
+ // Check for registration form elements
102
+ const nameField = await page
103
+ .locator('input[name="name"], input[placeholder*="name" i], input[autocomplete="name"]')
104
+ .count();
105
+ const emailField = await page
106
+ .locator('input[type="email"], input[name="email"], input[placeholder*="email" i]')
107
+ .count();
108
+ const passwordField = await page.locator('input[type="password"]').count();
109
+ const submitButton = await page
110
+ .locator('button[type="submit"], button:has-text("Register"), button:has-text("Sign up")')
111
+ .count();
112
+ if (emailField > 0 && passwordField > 0) {
113
+ found = true;
114
+ if (submitButton === 0) {
115
+ findings.push({
116
+ id: `${this.agentId}-register-no-submit`,
117
+ type: 'test-bug',
118
+ severity: 'medium',
119
+ agentId: this.agentId,
120
+ module: 'signup-onboarding',
121
+ description: `Registration page at ${p} has form fields but no submit button`,
122
+ });
123
+ }
124
+ break;
125
+ }
126
+ }
127
+ catch {
128
+ // Path not reachable — try next
129
+ }
130
+ }
131
+ if (!found) {
132
+ findings.push({
133
+ id: `${this.agentId}-no-register-page`,
134
+ type: 'test-bug',
135
+ severity: 'medium',
136
+ agentId: this.agentId,
137
+ module: 'signup-onboarding',
138
+ description: `No registration page found at paths: ${pathsToTry.join(', ')}`,
139
+ });
140
+ }
141
+ return findings;
142
+ }
143
+ /**
144
+ * Test 2: Submit empty registration form and expect validation errors.
145
+ */
146
+ async testRegistrationValidation(page) {
147
+ const findings = [];
148
+ // Only run if we're on a registration page with a submit button
149
+ const submitBtn = page.locator('button[type="submit"], button:has-text("Register"), button:has-text("Sign up")');
150
+ let hasSubmit = false;
151
+ try {
152
+ hasSubmit = (await submitBtn.count()) > 0;
153
+ }
154
+ catch {
155
+ return findings;
156
+ }
157
+ if (!hasSubmit) {
158
+ return findings;
159
+ }
160
+ try {
161
+ await Promise.race([
162
+ submitBtn.first().click(),
163
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
164
+ ]);
165
+ // Wait briefly for validation
166
+ await page.waitForTimeout(500);
167
+ const errorCount = await page
168
+ .locator('.error, [aria-invalid="true"], [class*="error"], [role="alert"], .validation-error')
169
+ .count();
170
+ if (errorCount === 0) {
171
+ findings.push({
172
+ id: `${this.agentId}-register-no-validation`,
173
+ type: 'test-bug',
174
+ severity: 'high',
175
+ agentId: this.agentId,
176
+ module: 'signup-onboarding',
177
+ description: 'Registration form accepts empty submission without validation errors',
178
+ });
179
+ }
180
+ }
181
+ catch {
182
+ // Submit failed — non-critical
183
+ }
184
+ return findings;
185
+ }
186
+ /**
187
+ * Test 3: Verify the login page has expected elements.
188
+ */
189
+ async testLoginPage(page, loginUrl) {
190
+ const findings = [];
191
+ try {
192
+ await Promise.race([
193
+ page.goto(loginUrl, { waitUntil: 'domcontentloaded' }),
194
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
195
+ ]);
196
+ const emailInput = await page
197
+ .locator('input[type="email"], input[name="email"], input[placeholder*="email" i]')
198
+ .count();
199
+ const passwordInput = await page.locator('input[type="password"]').count();
200
+ const submitButton = await page
201
+ .locator('button[type="submit"], button:has-text("Login"), button:has-text("Sign in"), button:has-text("Log in")')
202
+ .count();
203
+ if (emailInput === 0 || passwordInput === 0) {
204
+ findings.push({
205
+ id: `${this.agentId}-login-missing-inputs`,
206
+ type: 'test-bug',
207
+ severity: 'high',
208
+ agentId: this.agentId,
209
+ module: 'signup-onboarding',
210
+ description: `Login page missing required inputs — email: ${emailInput}, password: ${passwordInput}`,
211
+ });
212
+ }
213
+ if (submitButton === 0) {
214
+ findings.push({
215
+ id: `${this.agentId}-login-no-submit`,
216
+ type: 'test-bug',
217
+ severity: 'high',
218
+ agentId: this.agentId,
219
+ module: 'signup-onboarding',
220
+ description: 'Login page has no submit button',
221
+ });
222
+ }
223
+ }
224
+ catch (navError) {
225
+ findings.push({
226
+ id: `${this.agentId}-login-page-nav-failed`,
227
+ type: 'test-bug',
228
+ severity: 'medium',
229
+ agentId: this.agentId,
230
+ module: 'signup-onboarding',
231
+ description: `Failed to navigate to login page: ${navError instanceof Error ? navError.message.split('\n')[0] : String(navError)}`,
232
+ });
233
+ }
234
+ return findings;
235
+ }
236
+ /**
237
+ * Test 4: Fill credentials and submit login form.
238
+ */
239
+ async testLoginFlow(page, credentials, loginUrl) {
240
+ const findings = [];
241
+ try {
242
+ await Promise.race([
243
+ page.goto(loginUrl, { waitUntil: 'domcontentloaded' }),
244
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
245
+ ]);
246
+ try {
247
+ await login(page, credentials, loginUrl);
248
+ }
249
+ catch {
250
+ // login helper failed — try manual approach
251
+ }
252
+ const currentUrl = page.url();
253
+ if (currentUrl.includes('/login') || currentUrl.includes('/signin')) {
254
+ findings.push({
255
+ id: `${this.agentId}-login-flow-stuck`,
256
+ type: 'test-bug',
257
+ severity: 'medium',
258
+ agentId: this.agentId,
259
+ module: 'signup-onboarding',
260
+ description: 'Login flow did not navigate away from login page — credentials may be invalid or login flow is broken',
261
+ });
262
+ }
263
+ }
264
+ catch (flowError) {
265
+ findings.push({
266
+ id: `${this.agentId}-login-flow-error`,
267
+ type: 'test-bug',
268
+ severity: 'medium',
269
+ agentId: this.agentId,
270
+ module: 'signup-onboarding',
271
+ description: `Login flow test failed: ${flowError instanceof Error ? flowError.message.split('\n')[0] : String(flowError)}`,
272
+ });
273
+ }
274
+ return findings;
275
+ }
276
+ /**
277
+ * Test 5: After login, look for onboarding/welcome/tour modals.
278
+ */
279
+ async testOnboardingDetection(page) {
280
+ const findings = [];
281
+ const selector = ONBOARDING_SELECTORS.join(', ');
282
+ try {
283
+ const onboardingCount = await Promise.race([
284
+ page.locator(selector).count(),
285
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
286
+ ]);
287
+ if (onboardingCount > 0) {
288
+ findings.push({
289
+ id: `${this.agentId}-onboarding-detected`,
290
+ type: 'infra-issue',
291
+ severity: 'info',
292
+ agentId: this.agentId,
293
+ module: 'signup-onboarding',
294
+ description: `Onboarding/welcome UI detected — found ${onboardingCount} element(s) matching onboarding selectors`,
295
+ });
296
+ }
297
+ else {
298
+ findings.push({
299
+ id: `${this.agentId}-no-onboarding`,
300
+ type: 'infra-issue',
301
+ severity: 'info',
302
+ agentId: this.agentId,
303
+ module: 'signup-onboarding',
304
+ description: 'No onboarding/welcome/tour UI detected after login',
305
+ });
306
+ }
307
+ }
308
+ catch {
309
+ // Timeout — non-critical
310
+ }
311
+ return findings;
312
+ }
313
+ /**
314
+ * Test 6: Check if forgot-password page exists with expected elements.
315
+ */
316
+ async testForgotPassword(page) {
317
+ const findings = [];
318
+ const forgotUrl = `${this.baseUrl}/forgot-password`;
319
+ try {
320
+ await Promise.race([
321
+ page.goto(forgotUrl, { waitUntil: 'domcontentloaded' }),
322
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
323
+ ]);
324
+ const emailInput = await page
325
+ .locator('input[type="email"], input[name="email"], input[placeholder*="email" i]')
326
+ .count();
327
+ const submitButton = await page
328
+ .locator('button[type="submit"], button:has-text("Reset"), button:has-text("Send"), button:has-text("Submit")')
329
+ .count();
330
+ if (emailInput > 0 && submitButton > 0) {
331
+ findings.push({
332
+ id: `${this.agentId}-forgot-password-found`,
333
+ type: 'infra-issue',
334
+ severity: 'info',
335
+ agentId: this.agentId,
336
+ module: 'signup-onboarding',
337
+ description: 'Forgot password page found with email input and submit button',
338
+ });
339
+ }
340
+ else if (emailInput > 0) {
341
+ findings.push({
342
+ id: `${this.agentId}-forgot-password-no-submit`,
343
+ type: 'test-bug',
344
+ severity: 'medium',
345
+ agentId: this.agentId,
346
+ module: 'signup-onboarding',
347
+ description: 'Forgot password page has email input but no submit button',
348
+ });
349
+ }
350
+ }
351
+ catch {
352
+ // Forgot password page not found — not critical
353
+ }
354
+ return findings;
355
+ }
356
+ }
357
+ //# sourceMappingURL=24-signup-onboarding-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"24-signup-onboarding-tester.js","sourceRoot":"","sources":["../../agents/24-signup-onboarding-tester.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,gEAAgE;AAChE,MAAM,aAAa,GAAG,KAAK,CAAC;AAE5B,+CAA+C;AAC/C,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAErE,kDAAkD;AAClD,MAAM,oBAAoB,GAAG;IAC3B,0BAA0B;IAC1B,aAAa;IACb,UAAU;IACV,OAAO;IACP,iBAAiB;IACjB,oBAAoB;IACpB,oBAAoB;CACZ,CAAC;AAEX,MAAM,OAAO,2BAA4B,SAAQ,SAAS;IAC/C,OAAO,GAAG,EAAE,CAAC;IACb,SAAS,GAAG,4BAA4B,CAAC;IAC1C,OAAO,GAAG,EAAE,CAAC;IAEX,KAAK,CAAC,SAAS;QACvB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC7B,CAAC;IAES,KAAK,CAAC,OAAO;QACrB,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAC1D,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,CAAC;QAChG,MAAM,WAAW,GACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAEhD,IAAI,OAAO,GAAmB,IAAI,CAAC;QAEnC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAErC,mCAAmC;YACnC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YAE9B,kCAAkC;YAClC,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;YACvE,QAAQ,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC;YAErC,qBAAqB;YACrB,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACnE,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;YAEpC,qBAAqB;YACrB,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAChF,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,iBAAiB;oBACpC,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,mBAAmB;oBAC3B,WAAW,EAAE,sDAAsD;iBACpE,CAAC,CAAC;YACL,CAAC;YAED,+BAA+B;YAC/B,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;YACjE,QAAQ,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;YAElC,0BAA0B;YAC1B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YAEjC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,eAAe,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,qBAAqB;gBACxC,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,mBAAmB;gBAC3B,WAAW,EAAE,gCAAgC,eAAe,YAAY,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;aACnJ,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO;gBAAE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,oBAAoB,CAAC,IAAU;QAC3C,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,MAAM,iBAAiB,GAAI,IAAI,CAAC,MAAM,CAAC,IAAgC,CAAC,WAE3D,CAAC;QAEd,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC;QACjF,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBAClC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;oBACjD,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC9B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,aAAa,CAAC,CACzE;iBACF,CAAC,CAAC;gBAEH,uCAAuC;gBACvC,MAAM,SAAS,GAAG,MAAM,IAAI;qBACzB,OAAO,CAAC,8EAA8E,CAAC;qBACvF,KAAK,EAAE,CAAC;gBACX,MAAM,UAAU,GAAG,MAAM,IAAI;qBAC1B,OAAO,CAAC,yEAAyE,CAAC;qBAClF,KAAK,EAAE,CAAC;gBACX,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC3E,MAAM,YAAY,GAAG,MAAM,IAAI;qBAC5B,OAAO,CAAC,gFAAgF,CAAC;qBACzF,KAAK,EAAE,CAAC;gBAEX,IAAI,UAAU,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;oBACxC,KAAK,GAAG,IAAI,CAAC;oBAEb,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;wBACvB,QAAQ,CAAC,IAAI,CAAC;4BACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,qBAAqB;4BACxC,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,QAAQ;4BAClB,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,MAAM,EAAE,mBAAmB;4BAC3B,WAAW,EAAE,wBAAwB,CAAC,uCAAuC;yBAC9E,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,mBAAmB;gBACtC,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,mBAAmB;gBAC3B,WAAW,EAAE,wCAAwC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC7E,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,0BAA0B,CAAC,IAAU;QACjD,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,gEAAgE;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAC5B,gFAAgF,CACjF,CAAC;QAEF,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC;YACH,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE;gBACzB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACxB,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAC9D;aACF,CAAC,CAAC;YAEH,8BAA8B;YAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAE/B,MAAM,UAAU,GAAG,MAAM,IAAI;iBAC1B,OAAO,CACN,oFAAoF,CACrF;iBACA,KAAK,EAAE,CAAC;YAEX,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,yBAAyB;oBAC5C,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,mBAAmB;oBAC3B,WAAW,EAAE,sEAAsE;iBACpF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,IAAU,EAAE,QAAgB;QACtD,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;gBACtD,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACxB,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,aAAa,CAAC,CACzE;aACF,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,IAAI;iBAC1B,OAAO,CAAC,yEAAyE,CAAC;iBAClF,KAAK,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;YAC3E,MAAM,YAAY,GAAG,MAAM,IAAI;iBAC5B,OAAO,CACN,wGAAwG,CACzG;iBACA,KAAK,EAAE,CAAC;YAEX,IAAI,UAAU,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;gBAC5C,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,uBAAuB;oBAC1C,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,mBAAmB;oBAC3B,WAAW,EAAE,+CAA+C,UAAU,eAAe,aAAa,EAAE;iBACrG,CAAC,CAAC;YACL,CAAC;YAED,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,kBAAkB;oBACrC,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,mBAAmB;oBAC3B,WAAW,EAAE,iCAAiC;iBAC/C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,wBAAwB;gBAC3C,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,mBAAmB;gBAC3B,WAAW,EAAE,qCAAqC,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;aACnI,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CACzB,IAAU,EACV,WAAgD,EAChD,QAAgB;QAEhB,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;gBACtD,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACxB,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,aAAa,CAAC,CACzE;aACF,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,4CAA4C;YAC9C,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpE,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,mBAAmB;oBACtC,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,mBAAmB;oBAC3B,WAAW,EACT,uGAAuG;iBAC1G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,mBAAmB;gBACtC,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,mBAAmB;gBAC3B,WAAW,EAAE,2BAA2B,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;aAC5H,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CAAC,IAAU;QAC9C,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBACzC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE;gBAC9B,IAAI,OAAO,CAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAChC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAC9D;aACF,CAAW,CAAC;YAEb,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,sBAAsB;oBACzC,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,mBAAmB;oBAC3B,WAAW,EAAE,0CAA0C,eAAe,2CAA2C;iBAClH,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,gBAAgB;oBACnC,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,mBAAmB;oBAC3B,WAAW,EAAE,oDAAoD;iBAClE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,IAAU;QACzC,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,OAAO,kBAAkB,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;gBACvD,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACxB,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,EAAE,aAAa,CAAC,CACzE;aACF,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,IAAI;iBAC1B,OAAO,CAAC,yEAAyE,CAAC;iBAClF,KAAK,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,MAAM,IAAI;iBAC5B,OAAO,CACN,qGAAqG,CACtG;iBACA,KAAK,EAAE,CAAC;YAEX,IAAI,UAAU,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACvC,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,wBAAwB;oBAC3C,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,mBAAmB;oBAC3B,WAAW,EAAE,+DAA+D;iBAC7E,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,4BAA4B;oBAC/C,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,mBAAmB;oBAC3B,WAAW,EAAE,2DAA2D;iBACzE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { Finding } from '../core/types';
2
+ import { BaseAgent } from './base-agent';
3
+ export declare class CrudFlowTesterAgent extends BaseAgent {
4
+ readonly agentId = 25;
5
+ readonly agentName = "CRUD Flow Tester";
6
+ private baseUrl;
7
+ protected preFlight(): Promise<void>;
8
+ protected execute(): Promise<Finding[]>;
9
+ private testModuleCrud;
10
+ }
11
+ //# sourceMappingURL=25-crud-flow-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"25-crud-flow-tester.d.ts","sourceRoot":"","sources":["../../agents/25-crud-flow-tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAqCzC,qBAAa,mBAAoB,SAAQ,SAAS;IAChD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,sBAAsB;IACxC,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAS1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAiE/B,cAAc;CAuL7B"}
@@ -0,0 +1,253 @@
1
+ import { BaseAgent } from './base-agent';
2
+ import { resolveEnvironment } from '../helpers/env-resolver';
3
+ import { login } from '../helpers/navigation';
4
+ /** Timeout (ms) for individual module CRUD operations. */
5
+ const OP_TIMEOUT_MS = 5_000;
6
+ /** Selectors that indicate common CRUD action buttons. */
7
+ const CREATE_SELECTORS = [
8
+ 'button:has-text("Create")',
9
+ 'button:has-text("Add")',
10
+ 'button:has-text("New")',
11
+ '[data-testid*="create"]',
12
+ '[data-testid*="add"]',
13
+ '[data-testid*="new"]',
14
+ ];
15
+ const EDIT_SELECTORS = [
16
+ 'button:has-text("Edit")',
17
+ '[data-testid*="edit"]',
18
+ 'a:has-text("Edit")',
19
+ ];
20
+ const DELETE_SELECTORS = [
21
+ 'button:has-text("Delete")',
22
+ '[data-testid*="delete"]',
23
+ 'button:has-text("Remove")',
24
+ ];
25
+ const SUCCESS_SELECTORS = [
26
+ '[class*="toast"]',
27
+ '[role="alert"]',
28
+ '[data-testid*="success"]',
29
+ '.success',
30
+ '.notification',
31
+ ];
32
+ export class CrudFlowTesterAgent extends BaseAgent {
33
+ agentId = 25;
34
+ agentName = 'CRUD Flow Tester';
35
+ baseUrl = '';
36
+ async preFlight() {
37
+ if (!this.config.modules || this.config.modules.length === 0) {
38
+ throw new Error('CrudFlowTesterAgent requires at least one module in config.modules');
39
+ }
40
+ const { env } = await resolveEnvironment(this.config, this.phase);
41
+ this.baseUrl = env.baseUrl;
42
+ }
43
+ async execute() {
44
+ const findings = [];
45
+ const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
46
+ const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
47
+ const credentials = this.config.auth.credentials?.['admin'] ??
48
+ Object.values(this.config.auth.credentials ?? {})[0];
49
+ if (!credentials) {
50
+ findings.push({
51
+ id: `${this.agentId}-no-credentials`,
52
+ type: 'infra-issue',
53
+ severity: 'medium',
54
+ agentId: this.agentId,
55
+ module: 'crud-flow-tester',
56
+ description: 'No credentials configured — continuing without authentication',
57
+ });
58
+ }
59
+ const { chromium } = await import('playwright');
60
+ let browser = null;
61
+ try {
62
+ browser = await chromium.launch({ headless: true });
63
+ const page = await browser.newPage();
64
+ if (credentials) {
65
+ try {
66
+ await login(page, credentials, loginUrl);
67
+ }
68
+ catch (loginError) {
69
+ findings.push({
70
+ id: `${this.agentId}-login-failed`,
71
+ type: 'infra-issue',
72
+ severity: 'medium',
73
+ agentId: this.agentId,
74
+ module: 'crud-flow-tester',
75
+ description: `Login failed — continuing anonymously: ${loginError instanceof Error ? loginError.message.split('\n')[0] : String(loginError)}`,
76
+ });
77
+ }
78
+ }
79
+ for (const mod of this.config.modules) {
80
+ const moduleFindings = await this.testModuleCrud(page, mod.id, mod.route);
81
+ findings.push(...moduleFindings);
82
+ }
83
+ await page.close().catch(() => undefined);
84
+ }
85
+ catch (playwrightError) {
86
+ findings.push({
87
+ id: `${this.agentId}-playwright-failure`,
88
+ type: 'infra-issue',
89
+ severity: 'medium',
90
+ agentId: this.agentId,
91
+ module: 'crud-flow-tester',
92
+ description: `Playwright execution failed: ${playwrightError instanceof Error ? playwrightError.message.split('\n')[0] : String(playwrightError)}`,
93
+ });
94
+ }
95
+ finally {
96
+ if (browser)
97
+ await browser.close().catch(() => undefined);
98
+ }
99
+ return findings;
100
+ }
101
+ async testModuleCrud(page, moduleId, moduleRoute) {
102
+ const findings = [];
103
+ const fullUrl = moduleRoute.startsWith('http')
104
+ ? moduleRoute
105
+ : `${this.baseUrl}${moduleRoute}`;
106
+ try {
107
+ await Promise.race([
108
+ page.goto(fullUrl, { waitUntil: 'domcontentloaded' }),
109
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
110
+ ]);
111
+ }
112
+ catch {
113
+ findings.push({
114
+ id: `${this.agentId}-nav-failed-${moduleId}`,
115
+ type: 'test-bug',
116
+ severity: 'medium',
117
+ agentId: this.agentId,
118
+ module: moduleId,
119
+ description: `Failed to navigate to module ${moduleId} at ${moduleRoute}`,
120
+ });
121
+ return findings;
122
+ }
123
+ // Discover create buttons
124
+ const createSelector = CREATE_SELECTORS.join(', ');
125
+ let hasCreateButton = false;
126
+ try {
127
+ const createCount = await Promise.race([
128
+ page.locator(createSelector).count(),
129
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
130
+ ]);
131
+ hasCreateButton = createCount > 0;
132
+ }
133
+ catch {
134
+ // Timeout or error discovering create buttons
135
+ }
136
+ if (!hasCreateButton) {
137
+ // Check for edit/delete as well
138
+ const editSelector = EDIT_SELECTORS.join(', ');
139
+ const deleteSelector = DELETE_SELECTORS.join(', ');
140
+ let hasEditOrDelete = false;
141
+ try {
142
+ const editCount = await Promise.race([
143
+ page.locator(editSelector).count(),
144
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
145
+ ]);
146
+ const deleteCount = await Promise.race([
147
+ page.locator(deleteSelector).count(),
148
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
149
+ ]);
150
+ hasEditOrDelete = editCount > 0 || deleteCount > 0;
151
+ }
152
+ catch {
153
+ // Timeout or error
154
+ }
155
+ if (!hasEditOrDelete) {
156
+ findings.push({
157
+ id: `${this.agentId}-no-crud-${moduleId}`,
158
+ type: 'test-bug',
159
+ severity: 'low',
160
+ agentId: this.agentId,
161
+ module: moduleId,
162
+ description: `No CRUD actions found for module ${moduleId}`,
163
+ });
164
+ return findings;
165
+ }
166
+ }
167
+ // Attempt create flow
168
+ if (hasCreateButton) {
169
+ try {
170
+ await Promise.race([
171
+ page.locator(createSelector).first().click(),
172
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
173
+ ]);
174
+ // Look for form or modal
175
+ const formCount = await page.locator('form, [role="dialog"], .modal').count();
176
+ if (formCount > 0) {
177
+ // Fill text inputs with test data
178
+ const inputs = page.locator('form input[type="text"], [role="dialog"] input[type="text"]');
179
+ const inputCount = await inputs.count();
180
+ for (let i = 0; i < inputCount; i++) {
181
+ await inputs.nth(i).fill(`Test Data ${i + 1}`).catch(() => undefined);
182
+ }
183
+ // Try submit
184
+ const submitBtn = page.locator('button[type="submit"], button:has-text("Save"), button:has-text("Submit"), button:has-text("Create")');
185
+ if (await submitBtn.count() > 0) {
186
+ await submitBtn.first().click().catch(() => undefined);
187
+ // Check for success indicator
188
+ const successSelector = SUCCESS_SELECTORS.join(', ');
189
+ try {
190
+ await page.waitForSelector(successSelector, { timeout: OP_TIMEOUT_MS });
191
+ }
192
+ catch {
193
+ findings.push({
194
+ id: `${this.agentId}-create-no-feedback-${moduleId}`,
195
+ type: 'test-bug',
196
+ severity: 'medium',
197
+ agentId: this.agentId,
198
+ module: moduleId,
199
+ description: `Create action in module ${moduleId} did not produce a visible success/error response`,
200
+ });
201
+ }
202
+ }
203
+ }
204
+ }
205
+ catch (createError) {
206
+ findings.push({
207
+ id: `${this.agentId}-create-failed-${moduleId}`,
208
+ type: 'test-bug',
209
+ severity: 'medium',
210
+ agentId: this.agentId,
211
+ module: moduleId,
212
+ description: `Create action failed for module ${moduleId}: ${createError instanceof Error ? createError.message.split('\n')[0] : String(createError)}`,
213
+ });
214
+ }
215
+ }
216
+ // Check for delete buttons on the page
217
+ const deleteSelector = DELETE_SELECTORS.join(', ');
218
+ try {
219
+ const deleteCount = await Promise.race([
220
+ page.locator(deleteSelector).count(),
221
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
222
+ ]);
223
+ if (deleteCount > 0) {
224
+ try {
225
+ await Promise.race([
226
+ page.locator(deleteSelector).first().click(),
227
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
228
+ ]);
229
+ // Look for confirm dialog
230
+ const confirmBtn = page.locator('button:has-text("Confirm"), button:has-text("Yes"), button:has-text("OK")');
231
+ if (await confirmBtn.count() > 0) {
232
+ await confirmBtn.first().click().catch(() => undefined);
233
+ }
234
+ }
235
+ catch (deleteError) {
236
+ findings.push({
237
+ id: `${this.agentId}-delete-failed-${moduleId}`,
238
+ type: 'test-bug',
239
+ severity: 'medium',
240
+ agentId: this.agentId,
241
+ module: moduleId,
242
+ description: `Delete action failed for module ${moduleId}: ${deleteError instanceof Error ? deleteError.message.split('\n')[0] : String(deleteError)}`,
243
+ });
244
+ }
245
+ }
246
+ }
247
+ catch {
248
+ // Timeout discovering delete buttons — non-critical
249
+ }
250
+ return findings;
251
+ }
252
+ }
253
+ //# sourceMappingURL=25-crud-flow-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"25-crud-flow-tester.js","sourceRoot":"","sources":["../../agents/25-crud-flow-tester.ts"],"names":[],"mappings":"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"}