create-appraisejs 0.1.10-alpha.8 → 0.2.0-alpha.1

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 (414) hide show
  1. package/README.md +52 -52
  2. package/dist/cli.e2e.test.d.ts +2 -0
  3. package/dist/cli.e2e.test.d.ts.map +1 -0
  4. package/dist/cli.e2e.test.js +73 -0
  5. package/dist/cli.e2e.test.js.map +1 -0
  6. package/dist/config.test.d.ts +2 -0
  7. package/dist/config.test.d.ts.map +1 -0
  8. package/dist/config.test.js +65 -0
  9. package/dist/config.test.js.map +1 -0
  10. package/dist/copy-template.test.d.ts +2 -0
  11. package/dist/copy-template.test.d.ts.map +1 -0
  12. package/dist/copy-template.test.js +71 -0
  13. package/dist/copy-template.test.js.map +1 -0
  14. package/dist/download-repo.test.d.ts +2 -0
  15. package/dist/download-repo.test.d.ts.map +1 -0
  16. package/dist/download-repo.test.js +14 -0
  17. package/dist/download-repo.test.js.map +1 -0
  18. package/dist/install.test.d.ts +2 -0
  19. package/dist/install.test.d.ts.map +1 -0
  20. package/dist/install.test.js +119 -0
  21. package/dist/install.test.js.map +1 -0
  22. package/dist/prepare-template-utils.d.ts.map +1 -1
  23. package/dist/prepare-template-utils.js +5 -0
  24. package/dist/prepare-template-utils.js.map +1 -1
  25. package/dist/prompts.test.d.ts +2 -0
  26. package/dist/prompts.test.d.ts.map +1 -0
  27. package/dist/prompts.test.js +58 -0
  28. package/dist/prompts.test.js.map +1 -0
  29. package/dist/scaffold-gitignore.d.ts +1 -0
  30. package/dist/scaffold-gitignore.d.ts.map +1 -1
  31. package/dist/scaffold-gitignore.js +3 -0
  32. package/dist/scaffold-gitignore.js.map +1 -1
  33. package/package.json +3 -2
  34. package/templates/default/.appraise-template-meta.json +2 -2
  35. package/templates/default/.env.example +2 -2
  36. package/templates/default/.vscode/settings.json +2 -1
  37. package/templates/default/README.md +53 -53
  38. package/templates/default/automation/mapping/locator-map.json +1 -14
  39. package/templates/default/automation/steps/actions/click.step.ts +58 -58
  40. package/templates/default/automation/steps/actions/hover.step.ts +27 -27
  41. package/templates/default/automation/steps/actions/input.step.ts +84 -84
  42. package/templates/default/automation/steps/actions/navigation.step.ts +70 -70
  43. package/templates/default/automation/steps/actions/random_data.step.ts +142 -142
  44. package/templates/default/automation/steps/actions/store.step.ts +86 -86
  45. package/templates/default/automation/steps/actions/wait.step.ts +90 -90
  46. package/templates/default/automation/steps/validations/active_state_assertion.step.ts +30 -30
  47. package/templates/default/automation/steps/validations/navigation_assertion.step.ts +22 -22
  48. package/templates/default/automation/steps/validations/text_assertion.step.ts +107 -107
  49. package/templates/default/automation/steps/validations/visibility_assertion.step.ts +26 -26
  50. package/templates/default/components.json +24 -24
  51. package/templates/default/cucumber.mjs +16 -16
  52. package/templates/default/eslint.config.mjs +16 -16
  53. package/templates/default/gitignore +3 -0
  54. package/templates/default/next-env.d.ts +6 -6
  55. package/templates/default/next.config.ts +11 -11
  56. package/templates/default/package-lock.json +146 -75
  57. package/templates/default/package.json +2 -1
  58. package/templates/default/packages/cucumber-runtime/package.json +13 -13
  59. package/templates/default/packages/cucumber-runtime/src/cache.util.ts +93 -93
  60. package/templates/default/packages/cucumber-runtime/src/cli.ts +68 -68
  61. package/templates/default/packages/cucumber-runtime/src/environment.util.ts +21 -21
  62. package/templates/default/packages/cucumber-runtime/src/executor.ts +32 -32
  63. package/templates/default/packages/cucumber-runtime/src/hooks.ts +25 -3
  64. package/templates/default/packages/cucumber-runtime/src/index.ts +17 -17
  65. package/templates/default/packages/cucumber-runtime/src/locator.util.ts +234 -234
  66. package/templates/default/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  67. package/templates/default/packages/cucumber-runtime/src/paths.ts +66 -1
  68. package/templates/default/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  69. package/templates/default/packages/cucumber-runtime/src/types.ts +13 -13
  70. package/templates/default/packages/cucumber-runtime/src/world.ts +44 -44
  71. package/templates/default/packages/cucumber-runtime/tsconfig.json +11 -11
  72. package/templates/default/packages/locator-picker-companion/dist/cli.d.ts +1 -0
  73. package/templates/default/packages/locator-picker-companion/dist/cli.js +302 -0
  74. package/templates/default/packages/locator-picker-companion/dist/index.d.ts +3 -0
  75. package/templates/default/packages/locator-picker-companion/dist/index.js +3 -0
  76. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.d.ts +1 -0
  77. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.js +615 -0
  78. package/templates/default/packages/locator-picker-companion/dist/launcher.d.ts +11 -0
  79. package/templates/default/packages/locator-picker-companion/dist/launcher.js +59 -0
  80. package/templates/default/packages/locator-picker-companion/dist/selector-generator.d.ts +3 -0
  81. package/templates/default/packages/locator-picker-companion/dist/selector-generator.js +257 -0
  82. package/templates/default/packages/locator-picker-companion/dist/session-file.d.ts +22 -0
  83. package/templates/default/packages/locator-picker-companion/dist/session-file.js +150 -0
  84. package/templates/default/packages/locator-picker-companion/dist/types.d.ts +31 -0
  85. package/templates/default/packages/locator-picker-companion/dist/types.js +1 -0
  86. package/templates/default/packages/locator-picker-companion/package.json +17 -0
  87. package/templates/default/packages/locator-picker-companion/src/cli.ts +428 -0
  88. package/templates/default/packages/locator-picker-companion/src/index.ts +3 -0
  89. package/templates/default/packages/locator-picker-companion/src/injected-picker-script.ts +771 -0
  90. package/templates/default/packages/locator-picker-companion/src/launcher.ts +77 -0
  91. package/templates/default/packages/locator-picker-companion/src/selector-generator.ts +339 -0
  92. package/templates/default/packages/locator-picker-companion/src/session-file.ts +226 -0
  93. package/templates/default/packages/locator-picker-companion/src/types.ts +42 -0
  94. package/templates/default/packages/locator-picker-companion/tsconfig.json +14 -0
  95. package/templates/default/postcss.config.mjs +8 -8
  96. package/templates/default/prisma/dev.db +0 -0
  97. package/templates/default/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
  98. package/templates/default/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
  99. package/templates/default/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
  100. package/templates/default/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
  101. package/templates/default/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
  102. package/templates/default/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
  103. package/templates/default/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
  104. package/templates/default/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
  105. package/templates/default/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
  106. package/templates/default/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
  107. package/templates/default/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
  108. package/templates/default/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
  109. package/templates/default/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
  110. package/templates/default/prisma/migrations/20260313093000_add_report_step_screenshot_path/migration.sql +1 -0
  111. package/templates/default/prisma/migrations/20260318120000_add_test_suite_context_to_test_run_test_case/migration.sql +20 -0
  112. package/templates/default/prisma/migrations/20260318173512_add_support_of_test_suite_level_runs/migration.sql +2 -0
  113. package/templates/default/prisma/schema.prisma +4 -0
  114. package/templates/default/scripts/install-playwright.ts +20 -0
  115. package/templates/default/scripts/protect-seeded-files.ts +38 -38
  116. package/templates/default/scripts/regenerate-features.ts +94 -94
  117. package/templates/default/scripts/setup-env.ts +19 -19
  118. package/templates/default/scripts/sync-all.ts +22 -66
  119. package/templates/default/scripts/sync-appraise-base-template.ts +57 -19
  120. package/templates/default/scripts/sync-environments.ts +40 -21
  121. package/templates/default/scripts/sync-locator-groups.ts +410 -410
  122. package/templates/default/scripts/sync-locators.ts +398 -398
  123. package/templates/default/scripts/sync-modules.ts +341 -341
  124. package/templates/default/scripts/sync-tags.ts +2 -3
  125. package/templates/default/scripts/sync-template-step-groups.ts +0 -3
  126. package/templates/default/scripts/sync-template-steps.ts +37 -11
  127. package/templates/default/scripts/sync-test-cases.ts +68 -16
  128. package/templates/default/scripts/sync-test-suites.ts +7 -5
  129. package/templates/default/src/actions/conflict/conflict.action.ts +33 -33
  130. package/templates/default/src/actions/dashboard/dashboard-actions.ts +240 -240
  131. package/templates/default/src/actions/environments/environment-actions.ts +188 -188
  132. package/templates/default/src/actions/locator/locator-actions.ts +490 -490
  133. package/templates/default/src/actions/locator-groups/locator-group-actions.ts +6 -3
  134. package/templates/default/src/actions/locator-picker/locator-picker-actions.ts +243 -0
  135. package/templates/default/src/actions/modules/module-actions.ts +135 -135
  136. package/templates/default/src/actions/reports/report-actions.ts +51 -49
  137. package/templates/default/src/actions/review/review-actions.ts +147 -147
  138. package/templates/default/src/actions/settings/sync-actions.ts +46 -0
  139. package/templates/default/src/actions/tags/tag-actions.ts +107 -107
  140. package/templates/default/src/actions/template-step/template-step-actions.ts +38 -4
  141. package/templates/default/src/actions/template-step-group/template-step-group-actions.ts +10 -3
  142. package/templates/default/src/actions/template-test-case/template-test-case-actions.ts +238 -238
  143. package/templates/default/src/actions/test-case/test-case-actions.ts +356 -356
  144. package/templates/default/src/actions/test-run/test-run-actions.ts +222 -129
  145. package/templates/default/src/actions/test-suite/test-suite-actions.ts +95 -17
  146. package/templates/default/src/actions/user/user-actions.ts +13 -13
  147. package/templates/default/src/app/(base)/environments/create/page.tsx +28 -28
  148. package/templates/default/src/app/(base)/environments/environment-form.tsx +219 -219
  149. package/templates/default/src/app/(base)/environments/environment-table-columns.tsx +96 -96
  150. package/templates/default/src/app/(base)/environments/environment-table.tsx +24 -24
  151. package/templates/default/src/app/(base)/environments/modify/[id]/page.tsx +46 -46
  152. package/templates/default/src/app/(base)/environments/page.tsx +59 -59
  153. package/templates/default/src/app/(base)/layout.tsx +10 -10
  154. package/templates/default/src/app/(base)/locator-groups/create/page.tsx +44 -44
  155. package/templates/default/src/app/(base)/locator-groups/locator-group-form.tsx +215 -215
  156. package/templates/default/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  157. package/templates/default/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  158. package/templates/default/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  159. package/templates/default/src/app/(base)/locator-groups/page.tsx +20 -8
  160. package/templates/default/src/app/(base)/locators/create/create-locator-workspace.tsx +542 -0
  161. package/templates/default/src/app/(base)/locators/create/page.tsx +32 -19
  162. package/templates/default/src/app/(base)/locators/locator-form.tsx +163 -163
  163. package/templates/default/src/app/(base)/locators/locator-table-columns.tsx +73 -73
  164. package/templates/default/src/app/(base)/locators/locator-table.tsx +28 -28
  165. package/templates/default/src/app/(base)/locators/modify/[id]/page.tsx +56 -27
  166. package/templates/default/src/app/(base)/locators/page.tsx +13 -13
  167. package/templates/default/src/app/(base)/locators/picker/page.tsx +7 -0
  168. package/templates/default/src/app/(base)/locators/sync-locators-button.tsx +66 -66
  169. package/templates/default/src/app/(base)/modules/create/page.tsx +34 -34
  170. package/templates/default/src/app/(base)/modules/modify/[id]/page.tsx +46 -46
  171. package/templates/default/src/app/(base)/modules/module-form.tsx +126 -126
  172. package/templates/default/src/app/(base)/modules/module-table-columns.tsx +85 -85
  173. package/templates/default/src/app/(base)/modules/module-table.tsx +24 -24
  174. package/templates/default/src/app/(base)/modules/page.tsx +59 -59
  175. package/templates/default/src/app/(base)/reports/[id]/page.tsx +40 -33
  176. package/templates/default/src/app/(base)/reports/duration-chart.tsx +33 -33
  177. package/templates/default/src/app/(base)/reports/feature-chart.tsx +78 -78
  178. package/templates/default/src/app/(base)/reports/overview-chart.tsx +49 -46
  179. package/templates/default/src/app/(base)/reports/page.tsx +98 -98
  180. package/templates/default/src/app/(base)/reports/report-metric-card.tsx +78 -16
  181. package/templates/default/src/app/(base)/reports/report-table-columns.tsx +189 -189
  182. package/templates/default/src/app/(base)/reports/report-table.tsx +72 -72
  183. package/templates/default/src/app/(base)/reports/report-view-table-columns.tsx +12 -1
  184. package/templates/default/src/app/(base)/reports/report-view-table.tsx +1 -0
  185. package/templates/default/src/app/(base)/reports/test-cases/page.tsx +40 -42
  186. package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +115 -115
  187. package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  188. package/templates/default/src/app/(base)/reports/test-suites/page.tsx +42 -42
  189. package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +79 -79
  190. package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +27 -27
  191. package/templates/default/src/app/(base)/reports/view-logs-button.tsx +58 -60
  192. package/templates/default/src/app/(base)/reviews/create/page.tsx +26 -26
  193. package/templates/default/src/app/(base)/reviews/created-reviews-table.tsx +15 -15
  194. package/templates/default/src/app/(base)/reviews/modify/[id]/page.tsx +26 -26
  195. package/templates/default/src/app/(base)/reviews/page.tsx +26 -26
  196. package/templates/default/src/app/(base)/reviews/review/[id]/page.tsx +26 -26
  197. package/templates/default/src/app/(base)/reviews/review-form.tsx +11 -11
  198. package/templates/default/src/app/(base)/reviews/review-table-by-creator-columns.tsx +9 -9
  199. package/templates/default/src/app/(base)/reviews/review-table-by-reviewer-columns.tsx +9 -9
  200. package/templates/default/src/app/(base)/reviews/reviewer-reviews-table.tsx +15 -15
  201. package/templates/default/src/app/(base)/settings/page.tsx +30 -0
  202. package/templates/default/src/app/(base)/settings/settings-sync-panel.tsx +261 -0
  203. package/templates/default/src/app/(base)/tags/create/page.tsx +39 -39
  204. package/templates/default/src/app/(base)/tags/modify/[id]/page.tsx +50 -50
  205. package/templates/default/src/app/(base)/tags/page.tsx +58 -58
  206. package/templates/default/src/app/(base)/tags/tag-form.tsx +147 -147
  207. package/templates/default/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  208. package/templates/default/src/app/(base)/tags/tag-table.tsx +29 -29
  209. package/templates/default/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  210. package/templates/default/src/app/(base)/template-step-groups/modify/[id]/page.tsx +45 -45
  211. package/templates/default/src/app/(base)/template-step-groups/page.tsx +60 -60
  212. package/templates/default/src/app/(base)/template-step-groups/template-step-group-form.tsx +167 -167
  213. package/templates/default/src/app/(base)/template-step-groups/template-step-group-table-columns.tsx +89 -89
  214. package/templates/default/src/app/(base)/template-step-groups/template-step-group-table.tsx +32 -32
  215. package/templates/default/src/app/(base)/template-steps/create/page.tsx +37 -37
  216. package/templates/default/src/app/(base)/template-steps/modify/[id]/page.tsx +49 -49
  217. package/templates/default/src/app/(base)/template-steps/page.tsx +58 -58
  218. package/templates/default/src/app/(base)/template-steps/paramChip.tsx +213 -213
  219. package/templates/default/src/app/(base)/template-steps/template-step-form.tsx +384 -384
  220. package/templates/default/src/app/(base)/template-steps/template-step-table-columns.tsx +158 -158
  221. package/templates/default/src/app/(base)/template-steps/template-step-table.tsx +24 -24
  222. package/templates/default/src/app/(base)/template-test-cases/create/page.tsx +56 -56
  223. package/templates/default/src/app/(base)/template-test-cases/modify/[id]/page.tsx +89 -89
  224. package/templates/default/src/app/(base)/template-test-cases/page.tsx +58 -58
  225. package/templates/default/src/app/(base)/template-test-cases/template-test-case-flow.tsx +84 -84
  226. package/templates/default/src/app/(base)/template-test-cases/template-test-case-form.tsx +262 -262
  227. package/templates/default/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  228. package/templates/default/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  229. package/templates/default/src/app/(base)/test-cases/create/page.tsx +76 -76
  230. package/templates/default/src/app/(base)/test-cases/create-from-template/generate/[id]/page.tsx +96 -96
  231. package/templates/default/src/app/(base)/test-cases/create-from-template/page.tsx +38 -38
  232. package/templates/default/src/app/(base)/test-cases/create-from-template/template-selection-form.tsx +73 -73
  233. package/templates/default/src/app/(base)/test-cases/modify/[id]/page.tsx +106 -106
  234. package/templates/default/src/app/(base)/test-cases/page.tsx +2 -2
  235. package/templates/default/src/app/(base)/test-cases/test-case-flow.tsx +82 -82
  236. package/templates/default/src/app/(base)/test-cases/test-case-form.tsx +395 -395
  237. package/templates/default/src/app/(base)/test-cases/test-case-table-columns.tsx +6 -71
  238. package/templates/default/src/app/(base)/test-cases/test-case-table.tsx +2 -2
  239. package/templates/default/src/app/(base)/test-runs/[id]/page.tsx +4 -1
  240. package/templates/default/src/app/(base)/test-runs/create/page.tsx +11 -9
  241. package/templates/default/src/app/(base)/test-runs/page.tsx +60 -60
  242. package/templates/default/src/app/(base)/test-runs/test-run-form.tsx +37 -44
  243. package/templates/default/src/app/(base)/test-runs/test-run-table-columns.tsx +229 -229
  244. package/templates/default/src/app/(base)/test-runs/test-run-table.tsx +127 -127
  245. package/templates/default/src/app/(base)/test-suites/create/page.tsx +3 -2
  246. package/templates/default/src/app/(base)/test-suites/modify/[id]/page.tsx +2 -1
  247. package/templates/default/src/app/(base)/test-suites/page.tsx +57 -21
  248. package/templates/default/src/app/(base)/test-suites/test-suite-form.tsx +16 -17
  249. package/templates/default/src/app/(base)/test-suites/test-suite-table-columns.tsx +2 -1
  250. package/templates/default/src/app/(base)/test-suites/test-suite-table.tsx +29 -29
  251. package/templates/default/src/app/(dashboard-components)/app-drawer.tsx +187 -187
  252. package/templates/default/src/app/(dashboard-components)/data-card-grid.tsx +12 -12
  253. package/templates/default/src/app/(dashboard-components)/data-card.tsx +26 -26
  254. package/templates/default/src/app/(dashboard-components)/execution-health-panel.tsx +56 -56
  255. package/templates/default/src/app/(dashboard-components)/ongoing-test-runs-card.tsx +87 -87
  256. package/templates/default/src/app/(dashboard-components)/quick-actions-drawer.tsx +44 -44
  257. package/templates/default/src/app/api/reports/steps/[stepId]/screenshot/route.ts +52 -0
  258. package/templates/default/src/app/api/test-runs/[runId]/download/route.ts +97 -34
  259. package/templates/default/src/app/api/test-runs/[runId]/logs/route.ts +4 -1
  260. package/templates/default/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.ts +146 -147
  261. package/templates/default/src/app/globals.css +147 -147
  262. package/templates/default/src/app/layout.tsx +4 -0
  263. package/templates/default/src/app/page.tsx +2 -0
  264. package/templates/default/src/assets/icons/empty-tube.tsx +23 -23
  265. package/templates/default/src/assets/icons/tube-plus.tsx +29 -29
  266. package/templates/default/src/components/base-node.tsx +21 -21
  267. package/templates/default/src/components/chart/pie-chart.tsx +73 -73
  268. package/templates/default/src/components/data-extraction/locator-inspector.tsx +460 -460
  269. package/templates/default/src/components/data-state/empty-state.tsx +40 -40
  270. package/templates/default/src/components/data-visualization/info-card.tsx +70 -70
  271. package/templates/default/src/components/data-visualization/info-grid.tsx +22 -22
  272. package/templates/default/src/components/diagram/button-edge.tsx +54 -54
  273. package/templates/default/src/components/diagram/dynamic-parameters.tsx +474 -474
  274. package/templates/default/src/components/diagram/edit-header-option.tsx +36 -36
  275. package/templates/default/src/components/diagram/flow-diagram.tsx +470 -470
  276. package/templates/default/src/components/diagram/node-form.tsx +262 -262
  277. package/templates/default/src/components/diagram/options-header-node.tsx +57 -57
  278. package/templates/default/src/components/diagram/template-step-combobox.tsx +155 -155
  279. package/templates/default/src/components/form/error-message.tsx +7 -7
  280. package/templates/default/src/components/kokonutui/smooth-tab.tsx +453 -453
  281. package/templates/default/src/components/loading-skeleton/data-table/data-table-skeleton.tsx +30 -30
  282. package/templates/default/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  283. package/templates/default/src/components/loading-skeleton/form/icon-button-skeleton.tsx +8 -8
  284. package/templates/default/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  285. package/templates/default/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  286. package/templates/default/src/components/logo.tsx +15 -15
  287. package/templates/default/src/components/navigation/command-badge.tsx +34 -34
  288. package/templates/default/src/components/navigation/command-chain-input.tsx +51 -51
  289. package/templates/default/src/components/navigation/entity-search-command.tsx +116 -116
  290. package/templates/default/src/components/navigation/nav-card.tsx +31 -31
  291. package/templates/default/src/components/navigation/nav-command.tsx +13 -0
  292. package/templates/default/src/components/navigation/nav-link.tsx +60 -60
  293. package/templates/default/src/components/navigation/nav-menu-card-deck.tsx +112 -112
  294. package/templates/default/src/components/node-header.tsx +159 -159
  295. package/templates/default/src/components/reports/test-case-logs-modal.tsx +310 -253
  296. package/templates/default/src/components/table/table-actions.tsx +172 -172
  297. package/templates/default/src/components/test-case/test-case-columns.tsx +76 -0
  298. package/templates/default/src/components/test-case/test-case-picker.tsx +244 -0
  299. package/templates/default/src/components/test-run/download-logs-button.tsx +92 -99
  300. package/templates/default/src/components/test-run/log-viewer.tsx +1 -14
  301. package/templates/default/src/components/test-run/test-run-details.tsx +15 -2
  302. package/templates/default/src/components/test-run/test-run-header.tsx +149 -149
  303. package/templates/default/src/components/test-run/view-report-button.tsx +102 -102
  304. package/templates/default/src/components/test-suite/test-suite-picker.tsx +444 -0
  305. package/templates/default/src/components/theme/mode-toggle.tsx +54 -54
  306. package/templates/default/src/components/theme/theme-provider.tsx +8 -8
  307. package/templates/default/src/components/typography/page-header-subtitle.tsx +7 -7
  308. package/templates/default/src/components/typography/page-header.tsx +7 -7
  309. package/templates/default/src/components/ui/alert-dialog.tsx +106 -106
  310. package/templates/default/src/components/ui/alert.tsx +43 -43
  311. package/templates/default/src/components/ui/avatar.tsx +40 -40
  312. package/templates/default/src/components/ui/badge.tsx +29 -29
  313. package/templates/default/src/components/ui/button.tsx +47 -47
  314. package/templates/default/src/components/ui/calendar.tsx +158 -158
  315. package/templates/default/src/components/ui/card.tsx +43 -43
  316. package/templates/default/src/components/ui/checkbox.tsx +28 -28
  317. package/templates/default/src/components/ui/command.tsx +135 -135
  318. package/templates/default/src/components/ui/data-table-column-header.tsx +61 -61
  319. package/templates/default/src/components/ui/data-table-pagination.tsx +87 -87
  320. package/templates/default/src/components/ui/data-table-view-options.tsx +50 -50
  321. package/templates/default/src/components/ui/data-table.tsx +261 -261
  322. package/templates/default/src/components/ui/dialog.tsx +97 -97
  323. package/templates/default/src/components/ui/dropdown-menu.tsx +182 -182
  324. package/templates/default/src/components/ui/input.tsx +22 -22
  325. package/templates/default/src/components/ui/kbd.tsx +28 -28
  326. package/templates/default/src/components/ui/label.tsx +19 -19
  327. package/templates/default/src/components/ui/loading.tsx +12 -12
  328. package/templates/default/src/components/ui/multi-select-with-preview.tsx +116 -116
  329. package/templates/default/src/components/ui/multi-select.tsx +142 -142
  330. package/templates/default/src/components/ui/navigation-menu.tsx +120 -120
  331. package/templates/default/src/components/ui/popover.tsx +33 -33
  332. package/templates/default/src/components/ui/progress.tsx +25 -25
  333. package/templates/default/src/components/ui/radio-group.tsx +44 -44
  334. package/templates/default/src/components/ui/scroll-area.tsx +40 -40
  335. package/templates/default/src/components/ui/select.tsx +151 -151
  336. package/templates/default/src/components/ui/separator.tsx +22 -22
  337. package/templates/default/src/components/ui/skeleton.tsx +7 -7
  338. package/templates/default/src/components/ui/table.tsx +76 -76
  339. package/templates/default/src/components/ui/tabs.tsx +55 -55
  340. package/templates/default/src/components/ui/textarea.tsx +21 -21
  341. package/templates/default/src/components/ui/toast.tsx +113 -113
  342. package/templates/default/src/components/ui/toaster.tsx +26 -26
  343. package/templates/default/src/components/user-prompt/delete-prompt.tsx +87 -87
  344. package/templates/default/src/config/db-config.ts +10 -10
  345. package/templates/default/src/constants/form-opts/diagram/node-form.ts +30 -30
  346. package/templates/default/src/constants/form-opts/environment-form-opts.ts +24 -24
  347. package/templates/default/src/constants/form-opts/locator-form-opts.ts +20 -20
  348. package/templates/default/src/constants/form-opts/locator-group-form-opts.ts +28 -28
  349. package/templates/default/src/constants/form-opts/module-form-opts.ts +21 -21
  350. package/templates/default/src/constants/form-opts/review-form-opts.ts +23 -23
  351. package/templates/default/src/constants/form-opts/tag-form-opts.ts +42 -42
  352. package/templates/default/src/constants/form-opts/template-selection-form-opts.ts +16 -16
  353. package/templates/default/src/constants/form-opts/template-step-group-form-opts.ts +24 -24
  354. package/templates/default/src/constants/form-opts/template-test-case-form-opts.ts +39 -39
  355. package/templates/default/src/constants/form-opts/template-test-step-form-opts.ts +36 -36
  356. package/templates/default/src/constants/form-opts/test-case-form-opts.ts +43 -43
  357. package/templates/default/src/constants/form-opts/test-run-form-opts.ts +5 -3
  358. package/templates/default/src/constants/form-opts/test-suite-form-opts.ts +24 -24
  359. package/templates/default/src/hooks/use-toast.ts +187 -187
  360. package/templates/default/src/lib/automation/paths.ts +42 -12
  361. package/templates/default/src/lib/automation/projection-service.ts +2 -1
  362. package/templates/default/src/lib/bidirectional-sync.ts +432 -432
  363. package/templates/default/src/lib/database-sync.ts +2 -7
  364. package/templates/default/src/lib/environment-file-utils.ts +184 -184
  365. package/templates/default/src/lib/executor/local-executor-adapter.ts +24 -25
  366. package/templates/default/src/lib/executor/types.ts +2 -2
  367. package/templates/default/src/lib/feature-file-generator.ts +5 -66
  368. package/templates/default/src/lib/gherkin-parser.ts +259 -259
  369. package/templates/default/src/lib/locator-group-file-utils.ts +307 -307
  370. package/templates/default/src/lib/locator-picker/session-manager.ts +452 -0
  371. package/templates/default/src/lib/locator-picker/suggestions.ts +124 -0
  372. package/templates/default/src/lib/metrics/metric-calculator.ts +5 -0
  373. package/templates/default/src/lib/module-hierarchy-builder.ts +205 -205
  374. package/templates/default/src/lib/path-helpers/module-path.ts +71 -71
  375. package/templates/default/src/lib/process/task-spawner.ts +39 -2
  376. package/templates/default/src/lib/sync/projected-feature-utils.ts +113 -0
  377. package/templates/default/src/lib/sync/sync-executor.ts +130 -0
  378. package/templates/default/src/lib/sync/sync-pending-counts.test.ts +239 -0
  379. package/templates/default/src/lib/sync/sync-pending-counts.ts +1358 -0
  380. package/templates/default/src/lib/sync/sync-registry.ts +149 -0
  381. package/templates/default/src/lib/tag-utils.ts +28 -0
  382. package/templates/default/src/lib/template-sync-utils.d.ts +6 -6
  383. package/templates/default/src/lib/template-sync-utils.js +46 -46
  384. package/templates/default/src/lib/template-sync-utils.ts +63 -63
  385. package/templates/default/src/lib/test-case-utils.ts +6 -6
  386. package/templates/default/src/lib/test-run/log-formatter.ts +83 -83
  387. package/templates/default/src/lib/test-run/matching.ts +117 -0
  388. package/templates/default/src/lib/test-run/process-manager.ts +2 -0
  389. package/templates/default/src/lib/test-run/report-parser.ts +352 -316
  390. package/templates/default/src/lib/test-run/test-run-executor.ts +13 -15
  391. package/templates/default/src/lib/test-run/winston-logger.ts +64 -66
  392. package/templates/default/src/lib/test-suite-identifier-service.ts +76 -0
  393. package/templates/default/src/lib/test-suite-utils.ts +6 -0
  394. package/templates/default/src/lib/transformers/gherkin-converter.ts +42 -42
  395. package/templates/default/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  396. package/templates/default/src/lib/transformers/template-test-case-converter.ts +160 -160
  397. package/templates/default/src/lib/utils/node-param-validation.ts +81 -81
  398. package/templates/default/src/lib/utils/template-step-file-generator.ts +104 -104
  399. package/templates/default/src/lib/utils/template-step-file-manager-intelligent.ts +0 -8
  400. package/templates/default/src/lib/utils/template-step-file-manager.ts +166 -166
  401. package/templates/default/src/lib/utils.ts +31 -31
  402. package/templates/default/src/types/diagram/diagram.ts +34 -34
  403. package/templates/default/src/types/diagram/template-step.ts +11 -11
  404. package/templates/default/src/types/executor/browser.type.ts +1 -1
  405. package/templates/default/src/types/form/actionHandler.ts +6 -6
  406. package/templates/default/src/types/locator/locator.type.ts +11 -11
  407. package/templates/default/src/types/locator-picker.ts +65 -0
  408. package/templates/default/src/types/step/step.type.ts +1 -1
  409. package/templates/default/src/types/table/data-table.ts +6 -6
  410. package/templates/default/src/types/test-case-picker.ts +6 -0
  411. package/templates/default/src/types/test-suite-picker.ts +18 -0
  412. package/templates/default/tailwind.config.ts +62 -62
  413. package/templates/default/tsconfig.json +4 -1
  414. package/templates/default/appraisejs.config.json +0 -1
@@ -1,79 +1,14 @@
1
1
  'use client'
2
2
 
3
- import { DataTableColumnHeader } from '@/components/ui/data-table-column-header'
4
- import { TestCase, TestCaseStep, Tag } from '@prisma/client'
5
- import { ColumnDef } from '@tanstack/react-table'
6
- import { Checkbox } from '@/components/ui/checkbox'
7
3
  import { deleteTestCaseAction } from '@/actions/test-case/test-case-actions'
4
+ import { testCaseDataColumns, testCaseSelectionColumn } from '@/components/test-case/test-case-columns'
8
5
  import TableActions from '@/components/table/table-actions'
9
- import { formatDateTime } from '@/lib/utils'
10
- import { Badge } from '@/components/ui/badge'
6
+ import { TestCasePickerRow } from '@/types/test-case-picker'
7
+ import { ColumnDef } from '@tanstack/react-table'
11
8
 
12
- export const testCaseTableCols: ColumnDef<TestCase & { steps: TestCaseStep[]; tags?: Tag[] }>[] = [
13
- {
14
- id: 'select',
15
- header: ({ table }) => (
16
- <Checkbox
17
- checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && 'indeterminate')}
18
- onCheckedChange={value => table.toggleAllPageRowsSelected(!!value)}
19
- aria-label="Select all"
20
- className="mr-2"
21
- />
22
- ),
23
- cell: ({ row }) => (
24
- <Checkbox
25
- checked={row.getIsSelected()}
26
- onCheckedChange={value => row.toggleSelected(!!value)}
27
- aria-label="Select row"
28
- className="mr-2"
29
- />
30
- ),
31
- enableSorting: false,
32
- enableHiding: false,
33
- },
34
- {
35
- accessorKey: 'title',
36
- header: ({ column }) => <DataTableColumnHeader column={column} title="Title" />,
37
- },
38
- {
39
- accessorKey: 'description',
40
- header: ({ column }) => <DataTableColumnHeader column={column} title="Description" />,
41
- },
42
- {
43
- accessorKey: 'tags',
44
- header: ({ column }) => <DataTableColumnHeader column={column} title="Tags" />,
45
- cell: ({ row }) => {
46
- const testCase = row.original
47
- const tags = testCase.tags || []
48
- return (
49
- <div className="flex flex-wrap gap-1">
50
- {tags.length > 0 ? tags.map(tag => <Badge key={tag.id}>{tag.name}</Badge>) : '-'}
51
- </div>
52
- )
53
- },
54
- },
55
- {
56
- accessorKey: 'steps',
57
- header: ({ column }) => <DataTableColumnHeader column={column} title="Steps" />,
58
- cell: ({ row }) => {
59
- const testCase = row.original
60
- return <div>{testCase.steps.length}</div>
61
- },
62
- },
63
- {
64
- accessorKey: 'createdAt',
65
- header: ({ column }) => <DataTableColumnHeader column={column} title="Created At" />,
66
- cell: ({ row }) => {
67
- return formatDateTime(row.original.createdAt)
68
- },
69
- },
70
- {
71
- accessorKey: 'updatedAt',
72
- header: ({ column }) => <DataTableColumnHeader column={column} title="Updated At" />,
73
- cell: ({ row }) => {
74
- return formatDateTime(row.original.updatedAt)
75
- },
76
- },
9
+ export const testCaseTableCols: ColumnDef<TestCasePickerRow>[] = [
10
+ testCaseSelectionColumn,
11
+ ...testCaseDataColumns,
77
12
  {
78
13
  id: 'actions',
79
14
  cell: ({ row }) => {
@@ -1,6 +1,6 @@
1
1
  import { deleteTestCaseAction, getAllTestCasesAction } from '@/actions/test-case/test-case-actions'
2
2
  import { DataTable } from '@/components/ui/data-table'
3
- import { TestCase, TestCaseStep } from '@prisma/client'
3
+ import { TestCasePickerRow } from '@/types/test-case-picker'
4
4
  import { testCaseTableCols } from './test-case-table-columns'
5
5
  import { Cog, LayoutPanelTop } from 'lucide-react'
6
6
 
@@ -11,7 +11,7 @@ export default async function TestCaseTable() {
11
11
  <>
12
12
  <DataTable
13
13
  columns={testCaseTableCols}
14
- data={testCases as (TestCase & { steps: TestCaseStep[] })[]}
14
+ data={testCases as TestCasePickerRow[]}
15
15
  filterColumn="title"
16
16
  filterPlaceholder="Filter by title..."
17
17
  modifyLink="/test-cases/modify"
@@ -34,7 +34,10 @@ export default async function TestRunDetailPage({ params }: TestRunDetailPagePro
34
34
 
35
35
  // TypeScript now knows response.data is defined
36
36
  const testRun = response.data as TestRun & {
37
- testCases: (TestRunTestCase & { testCase: { title: string; description: string } })[]
37
+ testCases: (TestRunTestCase & {
38
+ testCase: { title: string; description: string }
39
+ testSuite: { id: string; name: string } | null
40
+ })[]
38
41
  tags: Tag[]
39
42
  environment: Environment
40
43
  reports: Report[]
@@ -1,28 +1,30 @@
1
- import { createTestRunAction, getAllTestSuiteTestCasesAction } from '@/actions/test-run/test-run-actions'
1
+ import { createTestRunAction } from '@/actions/test-run/test-run-actions'
2
2
  import PageHeader from '@/components/typography/page-header'
3
3
  import HeaderSubtitle from '@/components/typography/page-header-subtitle'
4
- import { Environment, Tag, TestCase, TestSuite } from '@prisma/client'
4
+ import { Environment, Tag } from '@prisma/client'
5
5
  import React from 'react'
6
6
  import TestRunForm from '../test-run-form'
7
7
  import { getAllEnvironmentsAction } from '@/actions/environments/environment-actions'
8
8
  import { getAllTagsAction } from '@/actions/tags/tag-actions'
9
9
  import { Metadata } from 'next'
10
+ import { getAllTestSuiteTestCasesAction } from '@/actions/test-run/test-run-actions'
11
+ import { TestSuitePickerRow } from '@/types/test-suite-picker'
10
12
 
11
13
  export const metadata: Metadata = {
12
14
  title: 'Appraise | Create Test Run',
13
- description: 'Create a new test run to execute your test cases',
15
+ description: 'Create a new test run to execute your selected suites or tagged tests',
14
16
  }
15
17
 
16
18
  const CreateTestRun = async () => {
17
- const { data: testSuiteTestCases, error: testSuiteTestCasesError } = await getAllTestSuiteTestCasesAction()
19
+ const { data: testSuites, error: testSuitesError } = await getAllTestSuiteTestCasesAction()
18
20
  const { data: environments, error: environmentsError } = await getAllEnvironmentsAction()
19
21
  const { data: tags, error: tagsError } = await getAllTagsAction()
20
22
 
21
- if (testSuiteTestCasesError || environmentsError || tagsError) {
22
- return <div>Error: {testSuiteTestCasesError || environmentsError || tagsError}</div>
23
+ if (testSuitesError || environmentsError || tagsError) {
24
+ return <div>Error: {testSuitesError || environmentsError || tagsError}</div>
23
25
  }
24
26
 
25
- const testSuiteTestCasesData = testSuiteTestCases as (TestSuite & { testCases: TestCase[] })[]
27
+ const testSuitesData = testSuites as TestSuitePickerRow[]
26
28
  const environmentsData = environments as Environment[]
27
29
  const tagsData = tags as Tag[]
28
30
 
@@ -30,10 +32,10 @@ const CreateTestRun = async () => {
30
32
  <>
31
33
  <div className="mb-8">
32
34
  <PageHeader>Create Test Run</PageHeader>
33
- <HeaderSubtitle>Create a new test run to execute your test cases</HeaderSubtitle>
35
+ <HeaderSubtitle>Create a new test run to execute selected suites or tagged tests</HeaderSubtitle>
34
36
  </div>
35
37
  <TestRunForm
36
- testSuiteTestCases={testSuiteTestCasesData}
38
+ testSuites={testSuitesData}
37
39
  environments={environmentsData}
38
40
  tags={tagsData}
39
41
  onSubmitAction={createTestRunAction}
@@ -1,60 +1,60 @@
1
- import DataTableSkeleton from '@/components/loading-skeleton/data-table/data-table-skeleton'
2
- import PageHeader from '@/components/typography/page-header'
3
- import HeaderSubtitle from '@/components/typography/page-header-subtitle'
4
- import { ListChecks } from 'lucide-react'
5
- import React, { Suspense } from 'react'
6
- import TestRunTable from './test-run-table'
7
- import { getAllTestRunsAction } from '@/actions/test-run/test-run-actions'
8
- import EmptyState from '@/components/data-state/empty-state'
9
- import { Environment, Tag, TestRun, TestRunTestCase } from '@prisma/client'
10
- import { Metadata } from 'next'
11
-
12
- export const metadata: Metadata = {
13
- title: 'Appraise | Test Runs',
14
- description: 'Manage test runs and their execution results',
15
- }
16
-
17
- const TestRuns = async ({ searchParams }: { searchParams: Promise<{ filter?: string }> }) => {
18
- const resolvedSearchParams = await searchParams
19
- const filter = resolvedSearchParams?.filter
20
- const { data: testRuns, error: testRunsError } = await getAllTestRunsAction(filter)
21
-
22
- if (testRunsError) {
23
- return <div>Error: {testRunsError}</div>
24
- }
25
-
26
- const testRunsData = testRuns as (TestRun & { testCases: TestRunTestCase[]; tags: Tag[]; environment: Environment })[]
27
-
28
- if (!testRunsData || testRunsData.length === 0) {
29
- return (
30
- <div className="flex min-h-[calc(100vh-20rem)] items-center justify-center">
31
- <EmptyState
32
- icon={<ListChecks className="h-8 w-8" />}
33
- title="No test runs found"
34
- description="Get started by creating a test run to execute your test cases"
35
- createRoute="/test-runs/create"
36
- createText="Create Test Run"
37
- />
38
- </div>
39
- )
40
- }
41
-
42
- return (
43
- <>
44
- <div className="mb-8">
45
- <PageHeader>
46
- <span className="flex items-center">
47
- <ListChecks className="mr-2 h-8 w-8" />
48
- Test Runs
49
- </span>
50
- </PageHeader>
51
- <HeaderSubtitle>Orchestrate tests and track the execution progress with detailed results</HeaderSubtitle>
52
- </div>
53
- <Suspense fallback={<DataTableSkeleton />}>
54
- <TestRunTable initialData={testRunsData} filter={filter as 'recentFailed' | 'all'} />
55
- </Suspense>
56
- </>
57
- )
58
- }
59
-
60
- export default TestRuns
1
+ import DataTableSkeleton from '@/components/loading-skeleton/data-table/data-table-skeleton'
2
+ import PageHeader from '@/components/typography/page-header'
3
+ import HeaderSubtitle from '@/components/typography/page-header-subtitle'
4
+ import { ListChecks } from 'lucide-react'
5
+ import React, { Suspense } from 'react'
6
+ import TestRunTable from './test-run-table'
7
+ import { getAllTestRunsAction } from '@/actions/test-run/test-run-actions'
8
+ import EmptyState from '@/components/data-state/empty-state'
9
+ import { Environment, Tag, TestRun, TestRunTestCase } from '@prisma/client'
10
+ import { Metadata } from 'next'
11
+
12
+ export const metadata: Metadata = {
13
+ title: 'Appraise | Test Runs',
14
+ description: 'Manage test runs and their execution results',
15
+ }
16
+
17
+ const TestRuns = async ({ searchParams }: { searchParams: Promise<{ filter?: string }> }) => {
18
+ const resolvedSearchParams = await searchParams
19
+ const filter = resolvedSearchParams?.filter
20
+ const { data: testRuns, error: testRunsError } = await getAllTestRunsAction(filter)
21
+
22
+ if (testRunsError) {
23
+ return <div>Error: {testRunsError}</div>
24
+ }
25
+
26
+ const testRunsData = testRuns as (TestRun & { testCases: TestRunTestCase[]; tags: Tag[]; environment: Environment })[]
27
+
28
+ if (!testRunsData || testRunsData.length === 0) {
29
+ return (
30
+ <div className="flex min-h-[calc(100vh-20rem)] items-center justify-center">
31
+ <EmptyState
32
+ icon={<ListChecks className="h-8 w-8" />}
33
+ title="No test runs found"
34
+ description="Get started by creating a test run to execute your test cases"
35
+ createRoute="/test-runs/create"
36
+ createText="Create Test Run"
37
+ />
38
+ </div>
39
+ )
40
+ }
41
+
42
+ return (
43
+ <>
44
+ <div className="mb-8">
45
+ <PageHeader>
46
+ <span className="flex items-center">
47
+ <ListChecks className="mr-2 h-8 w-8" />
48
+ Test Runs
49
+ </span>
50
+ </PageHeader>
51
+ <HeaderSubtitle>Orchestrate tests and track the execution progress with detailed results</HeaderSubtitle>
52
+ </div>
53
+ <Suspense fallback={<DataTableSkeleton />}>
54
+ <TestRunTable initialData={testRunsData} filter={filter as 'recentFailed' | 'all'} />
55
+ </Suspense>
56
+ </>
57
+ )
58
+ }
59
+
60
+ export default TestRuns
@@ -1,6 +1,7 @@
1
1
  'use client'
2
2
 
3
3
  import { Button } from '@/components/ui/button'
4
+ import TestSuitePicker from '@/components/test-suite/test-suite-picker'
4
5
  import { Input } from '@/components/ui/input'
5
6
  import { Label } from '@/components/ui/label'
6
7
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
@@ -8,7 +9,7 @@ import { MultiSelect } from '@/components/ui/multi-select'
8
9
  import { formOpts, TestRun } from '@/constants/form-opts/test-run-form-opts'
9
10
  import { toast } from '@/hooks/use-toast'
10
11
  import { ActionResponse } from '@/types/form/actionHandler'
11
- import { BrowserEngine, Environment, Tag, TestCase, TestRunTestCase, TestSuite } from '@prisma/client'
12
+ import { BrowserEngine, Environment, Tag } from '@prisma/client'
12
13
  import { useForm } from '@tanstack/react-form'
13
14
  import { useRouter } from 'next/navigation'
14
15
  import { useState, useRef, useEffect, useCallback } from 'react'
@@ -17,17 +18,18 @@ import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'
17
18
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
18
19
  import { checkTestRunNameUniqueAction } from '@/actions/test-run/test-run-actions'
19
20
  import { Info, Play } from 'lucide-react'
21
+ import { TestSuitePickerRow } from '@/types/test-suite-picker'
20
22
 
21
23
  enum TestSelectionType {
22
24
  TAGS = 'tags',
23
- TEST_CASES = 'testCases',
25
+ TEST_SUITES = 'testSuites',
24
26
  }
25
27
 
26
28
  const TestRunForm = ({
27
29
  defaultValues,
28
30
  successTitle,
29
31
  successMessage,
30
- testSuiteTestCases,
32
+ testSuites,
31
33
  environments,
32
34
  tags,
33
35
  id,
@@ -36,14 +38,16 @@ const TestRunForm = ({
36
38
  defaultValues?: TestRun
37
39
  successTitle: string
38
40
  successMessage: string
39
- testSuiteTestCases: (TestSuite & { testCases: TestCase[] })[]
41
+ testSuites: TestSuitePickerRow[]
40
42
  environments: Environment[]
41
43
  tags: Tag[]
42
44
  id?: string
43
45
  onSubmitAction: (_prev: unknown, value: TestRun, id?: string) => Promise<ActionResponse>
44
46
  }) => {
45
47
  const router = useRouter()
46
- const [testSelectionType, setTestSelectionType] = useState<TestSelectionType>(TestSelectionType.TAGS)
48
+ const [testSelectionType, setTestSelectionType] = useState<TestSelectionType>(() =>
49
+ defaultValues?.testSuites?.length ? TestSelectionType.TEST_SUITES : TestSelectionType.TAGS,
50
+ )
47
51
  const testSelectionTypeRef = useRef<TestSelectionType>(testSelectionType)
48
52
  const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null)
49
53
 
@@ -118,7 +122,7 @@ const TestRunForm = ({
118
122
  const submitValue = {
119
123
  ...value,
120
124
  tags: testSelectionType === TestSelectionType.TAGS ? value.tags : [],
121
- testCases: testSelectionType === TestSelectionType.TEST_CASES ? value.testCases : [],
125
+ testSuites: testSelectionType === TestSelectionType.TEST_SUITES ? value.testSuites : [],
122
126
  }
123
127
  const res = await onSubmitAction(undefined, submitValue, id)
124
128
  if (res.status === 200) {
@@ -174,15 +178,15 @@ const TestRunForm = ({
174
178
  setTestSelectionType(newType)
175
179
  // Clear the other field when switching filter types
176
180
  if (newType === TestSelectionType.TAGS) {
177
- form.setFieldValue('testCases', [])
181
+ form.setFieldValue('testSuites', [])
178
182
  // Validate both fields to clear any errors
179
183
  form.validateField('tags', 'change')
180
- form.validateField('testCases', 'change')
184
+ form.validateField('testSuites', 'change')
181
185
  } else {
182
186
  form.setFieldValue('tags', [])
183
187
  // Validate both fields to clear any errors
184
188
  form.validateField('tags', 'change')
185
- form.validateField('testCases', 'change')
189
+ form.validateField('testSuites', 'change')
186
190
  }
187
191
  }}
188
192
  className="mb-4 flex gap-4"
@@ -192,8 +196,8 @@ const TestRunForm = ({
192
196
  <Label htmlFor={TestSelectionType.TAGS}>By Tags</Label>
193
197
  </div>
194
198
  <div className="flex items-center space-x-2">
195
- <RadioGroupItem value={TestSelectionType.TEST_CASES} id={TestSelectionType.TEST_CASES} />
196
- <Label htmlFor={TestSelectionType.TEST_CASES}>By Test Cases</Label>
199
+ <RadioGroupItem value={TestSelectionType.TEST_SUITES} id={TestSelectionType.TEST_SUITES} />
200
+ <Label htmlFor={TestSelectionType.TEST_SUITES}>By Test Suites</Label>
197
201
  </div>
198
202
  </RadioGroup>
199
203
 
@@ -235,13 +239,20 @@ const TestRunForm = ({
235
239
  </form.Field>
236
240
 
237
241
  <form.Field
238
- name="testCases"
242
+ name="testSuites"
239
243
  validators={{
240
244
  onChange: ({ value }) => {
241
245
  const currentSelectionType = testSelectionTypeRef.current
242
- if (currentSelectionType === TestSelectionType.TEST_CASES) {
246
+ if (currentSelectionType === TestSelectionType.TEST_SUITES) {
243
247
  if (!Array.isArray(value) || value.length === 0) {
244
- return 'Test cases are required'
248
+ return 'At least one test suite is required'
249
+ }
250
+
251
+ const invalidSuite = value.find(
252
+ suiteSelection => !suiteSelection.runAll && suiteSelection.testCaseIds.length === 0,
253
+ )
254
+ if (invalidSuite) {
255
+ return 'Partial suite selections must include at least one test case'
245
256
  }
246
257
  }
247
258
  return undefined
@@ -251,34 +262,16 @@ const TestRunForm = ({
251
262
  {field => {
252
263
  return (
253
264
  <div
254
- className={`mb-4 flex flex-col gap-2 ${testSelectionType === TestSelectionType.TEST_CASES ? 'block' : 'hidden'}`}
265
+ className={`mb-4 flex flex-col gap-2 ${testSelectionType === TestSelectionType.TEST_SUITES ? 'block' : 'hidden'}`}
255
266
  >
256
- <MultiSelect
257
- options={(() => {
258
- const seen = new Set<string | number>()
259
- return testSuiteTestCases.flatMap(testSuite =>
260
- testSuite.testCases
261
- .filter(testCase => {
262
- if (!seen.has(testCase.id)) {
263
- seen.add(testCase.id)
264
- return true
265
- }
266
- return false
267
- })
268
- .map(testCase => ({
269
- label: testCase.title,
270
- value: testCase.id,
271
- })),
272
- )
273
- })()}
274
- selected={field.state.value.map(testCase => testCase.testCaseId)}
275
- onChange={value =>
276
- field.handleChange(
277
- value.map(testCaseId => ({ testCaseId: testCaseId }) as unknown as TestRunTestCase),
278
- )
279
- }
280
- placeholder="Select test cases"
281
- emptyMessage="No test cases available"
267
+ <TestSuitePicker
268
+ testSuites={testSuites}
269
+ selectedSuites={field.state.value}
270
+ onSave={value => field.handleChange(value)}
271
+ triggerPlaceholder="Select test suite(s)"
272
+ dialogTitle="Select Test Suites"
273
+ dialogDescription="Browse suites, expand child test cases, and save the suite-scoped selection for this test run."
274
+ selectedLabel="Selected test suite(s)"
282
275
  />
283
276
  {field.state.meta.isTouched &&
284
277
  field.state.meta.errors.map((error, index) => (
@@ -449,7 +442,7 @@ const TestRunForm = ({
449
442
  <div className="flex flex-col gap-1">
450
443
  <span className="text-base font-bold">Select the environment for your test run</span>
451
444
  <span className="text-sm text-muted-foreground">
452
- Choose the environment that best suits your selected test cases
445
+ Choose the environment that best suits your selected tests
453
446
  </span>
454
447
  </div>
455
448
  </div>
@@ -469,9 +462,9 @@ const TestRunForm = ({
469
462
  4
470
463
  </span>
471
464
  <div className="flex flex-col gap-1">
472
- <span className="text-base font-bold">Select the test cases or tags for your test run</span>
465
+ <span className="text-base font-bold">Select the test suites or tags for your test run</span>
473
466
  <span className="text-sm text-muted-foreground">
474
- You can filter your test cases by tags or select specific test cases
467
+ You can filter by tags or browse suites and choose full suites or child subsets
475
468
  </span>
476
469
  </div>
477
470
  </div>