create-appraisejs 0.2.0 → 0.3.0-alpha.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 (485) hide show
  1. package/README.md +12 -1
  2. package/package.json +1 -1
  3. package/templates/default/.appraise-template-meta.json +2 -2
  4. package/templates/default/.env.example +2 -2
  5. package/templates/default/README.md +57 -53
  6. package/templates/default/automation/steps/actions/click.step.ts +58 -58
  7. package/templates/default/automation/steps/actions/hover.step.ts +27 -27
  8. package/templates/default/automation/steps/actions/navigation.step.ts +70 -70
  9. package/templates/default/automation/steps/actions/random_data.step.ts +142 -142
  10. package/templates/default/automation/steps/actions/store.step.ts +86 -86
  11. package/templates/default/automation/steps/actions/wait.step.ts +110 -90
  12. package/templates/default/automation/steps/validations/active_state_assertion.step.ts +30 -30
  13. package/templates/default/automation/steps/validations/navigation_assertion.step.ts +22 -22
  14. package/templates/default/automation/steps/validations/text_assertion.step.ts +107 -107
  15. package/templates/default/automation/steps/validations/visibility_assertion.step.ts +26 -26
  16. package/templates/default/components.json +24 -24
  17. package/templates/default/cucumber.mjs +16 -16
  18. package/templates/default/eslint.config.mjs +20 -16
  19. package/templates/default/next-env.d.ts +6 -6
  20. package/templates/default/next.config.ts +20 -11
  21. package/templates/default/package-lock.json +1775 -74
  22. package/templates/default/package.json +8 -1
  23. package/templates/default/packages/cucumber-runtime/package.json +13 -13
  24. package/templates/default/packages/cucumber-runtime/src/cache.util.ts +93 -93
  25. package/templates/default/packages/cucumber-runtime/src/cli.ts +68 -68
  26. package/templates/default/packages/cucumber-runtime/src/environment.util.ts +21 -21
  27. package/templates/default/packages/cucumber-runtime/src/executor.ts +32 -32
  28. package/templates/default/packages/cucumber-runtime/src/index.ts +17 -17
  29. package/templates/default/packages/cucumber-runtime/src/locator.util.ts +234 -234
  30. package/templates/default/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  31. package/templates/default/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  32. package/templates/default/packages/cucumber-runtime/src/types.ts +13 -13
  33. package/templates/default/packages/cucumber-runtime/src/world.ts +44 -44
  34. package/templates/default/packages/cucumber-runtime/tsconfig.json +11 -11
  35. package/templates/default/postcss.config.mjs +8 -8
  36. package/templates/default/prisma/dev.db +0 -0
  37. package/templates/default/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
  38. package/templates/default/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
  39. package/templates/default/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
  40. package/templates/default/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
  41. package/templates/default/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
  42. package/templates/default/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
  43. package/templates/default/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
  44. package/templates/default/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
  45. package/templates/default/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
  46. package/templates/default/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
  47. package/templates/default/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
  48. package/templates/default/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
  49. package/templates/default/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
  50. package/templates/default/prisma/migrations/20260313093000_add_report_step_screenshot_path/migration.sql +1 -1
  51. package/templates/default/scripts/build-step-registry.ts +33 -0
  52. package/templates/default/scripts/install-playwright.ts +17 -8
  53. package/templates/default/scripts/install-template-step.ts +128 -0
  54. package/templates/default/scripts/lib/filename-utils.test.ts +24 -0
  55. package/templates/default/scripts/lib/filename-utils.ts +24 -0
  56. package/templates/default/scripts/lib/jsdoc-parser.test.ts +63 -0
  57. package/templates/default/scripts/lib/jsdoc-parser.ts +88 -0
  58. package/templates/default/scripts/lib/step-file-parser.test.ts +71 -0
  59. package/templates/default/scripts/lib/step-file-parser.ts +315 -0
  60. package/templates/default/scripts/lib/step-matcher.test.ts +86 -0
  61. package/templates/default/scripts/lib/step-matcher.ts +120 -0
  62. package/templates/default/scripts/lib/sync-script-runner.ts +23 -0
  63. package/templates/default/scripts/lib/sync-summary.ts +29 -0
  64. package/templates/default/scripts/lib/tag-parsing.test.ts +20 -0
  65. package/templates/default/scripts/lib/tag-parsing.ts +10 -0
  66. package/templates/default/scripts/lib/template-step-installer.test.ts +225 -0
  67. package/templates/default/scripts/lib/template-step-installer.ts +404 -0
  68. package/templates/default/scripts/lib/template-step-registry.test.ts +118 -0
  69. package/templates/default/scripts/lib/template-step-registry.ts +137 -0
  70. package/templates/default/scripts/protect-seeded-files.ts +51 -38
  71. package/templates/default/scripts/regenerate-features.ts +98 -94
  72. package/templates/default/scripts/run-vitest.ts +59 -0
  73. package/templates/default/scripts/setup-env.ts +26 -19
  74. package/templates/default/scripts/sync-all.ts +44 -54
  75. package/templates/default/scripts/sync-appraise-base-template.ts +44 -16
  76. package/templates/default/scripts/sync-environments.ts +22 -66
  77. package/templates/default/scripts/sync-locator-groups.ts +358 -410
  78. package/templates/default/scripts/sync-locators.ts +348 -398
  79. package/templates/default/scripts/sync-modules.ts +302 -341
  80. package/templates/default/scripts/sync-tags.ts +29 -65
  81. package/templates/default/scripts/sync-template-step-groups.ts +24 -182
  82. package/templates/default/scripts/sync-template-steps.ts +36 -493
  83. package/templates/default/scripts/sync-test-cases.ts +296 -539
  84. package/templates/default/scripts/sync-test-suites.ts +32 -79
  85. package/templates/default/src/actions/dashboard/dashboard-actions.ts +70 -241
  86. package/templates/default/src/actions/environments/environment-actions.ts +102 -188
  87. package/templates/default/src/actions/locator/locator-actions.ts +77 -490
  88. package/templates/default/src/actions/locator-groups/locator-group-actions.ts +34 -212
  89. package/templates/default/src/actions/locator-picker/locator-picker-actions.test.ts +81 -0
  90. package/templates/default/src/actions/locator-picker/locator-picker-actions.ts +20 -161
  91. package/templates/default/src/actions/modules/module-actions.ts +99 -135
  92. package/templates/default/src/actions/reports/report-actions.ts +28 -565
  93. package/templates/default/src/actions/settings/sync-actions.test.ts +58 -0
  94. package/templates/default/src/actions/tags/tag-actions.ts +99 -107
  95. package/templates/default/src/actions/template-step/template-step-actions.ts +33 -194
  96. package/templates/default/src/actions/template-step-group/template-step-group-actions.ts +35 -92
  97. package/templates/default/src/actions/template-test-case/template-test-case-actions.ts +98 -238
  98. package/templates/default/src/actions/test-case/test-case-actions.ts +108 -356
  99. package/templates/default/src/actions/test-run/test-run-actions.ts +74 -1081
  100. package/templates/default/src/actions/test-suite/test-suite-actions.ts +35 -202
  101. package/templates/default/src/app/(base)/environments/create/page.tsx +28 -28
  102. package/templates/default/src/app/(base)/environments/environment-form.test.tsx +92 -0
  103. package/templates/default/src/app/(base)/environments/environment-form.tsx +228 -219
  104. package/templates/default/src/app/(base)/environments/environment-helpers.ts +58 -0
  105. package/templates/default/src/app/(base)/environments/environment-table-columns.tsx +96 -96
  106. package/templates/default/src/app/(base)/environments/environment-table.tsx +25 -24
  107. package/templates/default/src/app/(base)/environments/modify/[id]/page.tsx +49 -46
  108. package/templates/default/src/app/(base)/environments/page.tsx +59 -59
  109. package/templates/default/src/app/(base)/layout.tsx +10 -10
  110. package/templates/default/src/app/(base)/locator-groups/create/page.tsx +44 -44
  111. package/templates/default/src/app/(base)/locator-groups/locator-group-form.tsx +215 -215
  112. package/templates/default/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  113. package/templates/default/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  114. package/templates/default/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  115. package/templates/default/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +71 -0
  116. package/templates/default/src/app/(base)/locators/create/create-locator-workspace-helpers.ts +333 -0
  117. package/templates/default/src/app/(base)/locators/create/create-locator-workspace.test.tsx +125 -0
  118. package/templates/default/src/app/(base)/locators/create/create-locator-workspace.tsx +56 -274
  119. package/templates/default/src/app/(base)/locators/create/page.tsx +8 -4
  120. package/templates/default/src/app/(base)/locators/create/use-locator-workspace.ts +183 -0
  121. package/templates/default/src/app/(base)/locators/locator-helpers.test.ts +28 -0
  122. package/templates/default/src/app/(base)/locators/locator-helpers.ts +59 -0
  123. package/templates/default/src/app/(base)/locators/locator-table-columns.tsx +74 -73
  124. package/templates/default/src/app/(base)/locators/locator-table.tsx +30 -28
  125. package/templates/default/src/app/(base)/locators/modify/[id]/page.tsx +20 -8
  126. package/templates/default/src/app/(base)/locators/page.tsx +3 -6
  127. package/templates/default/src/app/(base)/locators/sync-locators-button.tsx +67 -66
  128. package/templates/default/src/app/(base)/modules/create/page.tsx +33 -34
  129. package/templates/default/src/app/(base)/modules/modify/[id]/page.tsx +43 -46
  130. package/templates/default/src/app/(base)/modules/module-form.test.tsx +84 -0
  131. package/templates/default/src/app/(base)/modules/module-form.tsx +159 -126
  132. package/templates/default/src/app/(base)/modules/module-helpers.ts +64 -0
  133. package/templates/default/src/app/(base)/modules/module-table-columns.tsx +81 -85
  134. package/templates/default/src/app/(base)/modules/module-table.tsx +25 -24
  135. package/templates/default/src/app/(base)/modules/page.tsx +59 -59
  136. package/templates/default/src/app/(base)/reports/[id]/page.tsx +20 -260
  137. package/templates/default/src/app/(base)/reports/duration-chart.tsx +33 -33
  138. package/templates/default/src/app/(base)/reports/feature-chart.tsx +79 -78
  139. package/templates/default/src/app/(base)/reports/overview-chart.tsx +49 -49
  140. package/templates/default/src/app/(base)/reports/page.tsx +98 -98
  141. package/templates/default/src/app/(base)/reports/report-detail-helpers.test.ts +109 -0
  142. package/templates/default/src/app/(base)/reports/report-detail-helpers.ts +247 -0
  143. package/templates/default/src/app/(base)/reports/report-metric-card.tsx +78 -78
  144. package/templates/default/src/app/(base)/reports/report-table-columns.tsx +189 -189
  145. package/templates/default/src/app/(base)/reports/report-table.tsx +72 -72
  146. package/templates/default/src/app/(base)/reports/test-cases/page.tsx +40 -40
  147. package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +115 -115
  148. package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  149. package/templates/default/src/app/(base)/reports/test-suites/page.tsx +42 -42
  150. package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +79 -79
  151. package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +27 -27
  152. package/templates/default/src/app/(base)/reports/view-logs-button.tsx +58 -58
  153. package/templates/default/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +40 -0
  154. package/templates/default/src/app/(base)/settings/settings-sync-panel-helpers.tsx +110 -0
  155. package/templates/default/src/app/(base)/settings/settings-sync-panel.test.tsx +127 -0
  156. package/templates/default/src/app/(base)/settings/settings-sync-panel.tsx +19 -134
  157. package/templates/default/src/app/(base)/settings/use-settings-sync.ts +66 -0
  158. package/templates/default/src/app/(base)/tags/create/page.tsx +39 -39
  159. package/templates/default/src/app/(base)/tags/modify/[id]/page.tsx +50 -50
  160. package/templates/default/src/app/(base)/tags/page.tsx +58 -58
  161. package/templates/default/src/app/(base)/tags/tag-form-helpers.ts +13 -0
  162. package/templates/default/src/app/(base)/tags/tag-form.test.tsx +83 -0
  163. package/templates/default/src/app/(base)/tags/tag-form.tsx +143 -147
  164. package/templates/default/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  165. package/templates/default/src/app/(base)/tags/tag-table.tsx +29 -29
  166. package/templates/default/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  167. package/templates/default/src/app/(base)/template-step-groups/modify/[id]/page.tsx +43 -45
  168. package/templates/default/src/app/(base)/template-step-groups/page.tsx +60 -60
  169. package/templates/default/src/app/(base)/template-step-groups/template-step-group-form.test.tsx +82 -0
  170. package/templates/default/src/app/(base)/template-step-groups/template-step-group-form.tsx +181 -167
  171. package/templates/default/src/app/(base)/template-step-groups/template-step-group-helpers.ts +54 -0
  172. package/templates/default/src/app/(base)/template-step-groups/template-step-group-table-columns.tsx +89 -89
  173. package/templates/default/src/app/(base)/template-step-groups/template-step-group-table.tsx +34 -32
  174. package/templates/default/src/app/(base)/template-steps/create/page.tsx +40 -37
  175. package/templates/default/src/app/(base)/template-steps/modify/[id]/page.tsx +54 -49
  176. package/templates/default/src/app/(base)/template-steps/page.tsx +59 -58
  177. package/templates/default/src/app/(base)/template-steps/paramChip.tsx +233 -213
  178. package/templates/default/src/app/(base)/template-steps/template-step-form.test.tsx +132 -0
  179. package/templates/default/src/app/(base)/template-steps/template-step-form.tsx +342 -384
  180. package/templates/default/src/app/(base)/template-steps/template-step-helpers.test.ts +99 -0
  181. package/templates/default/src/app/(base)/template-steps/template-step-helpers.ts +176 -0
  182. package/templates/default/src/app/(base)/template-steps/template-step-table-columns.tsx +153 -158
  183. package/templates/default/src/app/(base)/template-steps/template-step-table.tsx +26 -24
  184. package/templates/default/src/app/(base)/template-test-cases/create/page.tsx +56 -56
  185. package/templates/default/src/app/(base)/template-test-cases/modify/[id]/page.tsx +89 -89
  186. package/templates/default/src/app/(base)/template-test-cases/page.tsx +58 -58
  187. package/templates/default/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +109 -0
  188. package/templates/default/src/app/(base)/template-test-cases/template-test-case-flow.tsx +45 -84
  189. package/templates/default/src/app/(base)/template-test-cases/template-test-case-form.test.tsx +140 -0
  190. package/templates/default/src/app/(base)/template-test-cases/template-test-case-form.tsx +154 -262
  191. package/templates/default/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  192. package/templates/default/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  193. package/templates/default/src/app/(base)/test-cases/create/page.tsx +90 -76
  194. package/templates/default/src/app/(base)/test-cases/create-from-template/create-from-template-helpers.test.ts +94 -0
  195. package/templates/default/src/app/(base)/test-cases/create-from-template/create-from-template-helpers.ts +171 -0
  196. package/templates/default/src/app/(base)/test-cases/create-from-template/generate/[id]/page.tsx +105 -96
  197. package/templates/default/src/app/(base)/test-cases/create-from-template/page.tsx +40 -38
  198. package/templates/default/src/app/(base)/test-cases/create-from-template/template-selection-form.test.tsx +87 -0
  199. package/templates/default/src/app/(base)/test-cases/create-from-template/template-selection-form.tsx +83 -73
  200. package/templates/default/src/app/(base)/test-cases/modify/[id]/page.tsx +106 -106
  201. package/templates/default/src/app/(base)/test-cases/page.tsx +3 -2
  202. package/templates/default/src/app/(base)/test-cases/test-case-flow.test.tsx +108 -0
  203. package/templates/default/src/app/(base)/test-cases/test-case-flow.tsx +43 -82
  204. package/templates/default/src/app/(base)/test-cases/test-case-form.test.tsx +202 -0
  205. package/templates/default/src/app/(base)/test-cases/test-case-form.tsx +263 -395
  206. package/templates/default/src/app/(base)/test-cases/test-case-route-helpers.test.ts +95 -0
  207. package/templates/default/src/app/(base)/test-cases/test-case-route-helpers.ts +147 -0
  208. package/templates/default/src/app/(base)/test-cases/test-case-table.tsx +4 -2
  209. package/templates/default/src/app/(base)/test-runs/[id]/page.tsx +11 -10
  210. package/templates/default/src/app/(base)/test-runs/create/page.tsx +4 -5
  211. package/templates/default/src/app/(base)/test-runs/page.tsx +60 -60
  212. package/templates/default/src/app/(base)/test-runs/test-run-form-helpers.test.ts +50 -0
  213. package/templates/default/src/app/(base)/test-runs/test-run-form-helpers.ts +168 -0
  214. package/templates/default/src/app/(base)/test-runs/test-run-form.test.tsx +138 -0
  215. package/templates/default/src/app/(base)/test-runs/test-run-form.tsx +111 -256
  216. package/templates/default/src/app/(base)/test-runs/test-run-table-columns.tsx +229 -229
  217. package/templates/default/src/app/(base)/test-runs/test-run-table.tsx +127 -127
  218. package/templates/default/src/app/(base)/test-runs/use-test-run-name-validation.ts +74 -0
  219. package/templates/default/src/app/(base)/test-suites/create/page.tsx +17 -12
  220. package/templates/default/src/app/(base)/test-suites/modify/[id]/page.tsx +22 -19
  221. package/templates/default/src/app/(base)/test-suites/page.tsx +14 -56
  222. package/templates/default/src/app/(base)/test-suites/test-suite-form.test.tsx +127 -0
  223. package/templates/default/src/app/(base)/test-suites/test-suite-form.tsx +45 -64
  224. package/templates/default/src/app/(base)/test-suites/test-suite-helpers.test.ts +67 -0
  225. package/templates/default/src/app/(base)/test-suites/test-suite-helpers.ts +215 -0
  226. package/templates/default/src/app/(base)/test-suites/test-suite-table.tsx +32 -29
  227. package/templates/default/src/app/(dashboard-components)/app-drawer.tsx +187 -187
  228. package/templates/default/src/app/(dashboard-components)/data-card-grid.tsx +12 -12
  229. package/templates/default/src/app/(dashboard-components)/data-card.tsx +26 -26
  230. package/templates/default/src/app/(dashboard-components)/execution-health-panel.tsx +56 -56
  231. package/templates/default/src/app/(dashboard-components)/ongoing-test-runs-card.tsx +87 -87
  232. package/templates/default/src/app/(dashboard-components)/quick-actions-drawer.tsx +44 -44
  233. package/templates/default/src/app/api/reports/steps/[stepId]/screenshot/route.test.ts +83 -0
  234. package/templates/default/src/app/api/reports/steps/[stepId]/screenshot/route.ts +52 -52
  235. package/templates/default/src/app/api/test-runs/[runId]/download/route.test.ts +169 -0
  236. package/templates/default/src/app/api/test-runs/[runId]/download/route.ts +1 -1
  237. package/templates/default/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +135 -0
  238. package/templates/default/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.ts +146 -146
  239. package/templates/default/src/app/globals.css +147 -147
  240. package/templates/default/src/app/page.tsx +1 -1
  241. package/templates/default/src/assets/icons/empty-tube.tsx +23 -23
  242. package/templates/default/src/assets/icons/tube-plus.tsx +29 -29
  243. package/templates/default/src/components/base-node.tsx +21 -21
  244. package/templates/default/src/components/chart/pie-chart.tsx +73 -73
  245. package/templates/default/src/components/data-extraction/locator-inspector-helpers.test.ts +32 -0
  246. package/templates/default/src/components/data-extraction/locator-inspector-helpers.ts +183 -0
  247. package/templates/default/src/components/data-extraction/locator-inspector.tsx +349 -460
  248. package/templates/default/src/components/data-state/empty-state.tsx +40 -40
  249. package/templates/default/src/components/data-visualization/info-card.tsx +70 -70
  250. package/templates/default/src/components/data-visualization/info-grid.tsx +22 -22
  251. package/templates/default/src/components/diagram/button-edge.tsx +54 -54
  252. package/templates/default/src/components/diagram/dynamic-parameters-helpers.test.ts +83 -0
  253. package/templates/default/src/components/diagram/dynamic-parameters-helpers.ts +158 -0
  254. package/templates/default/src/components/diagram/dynamic-parameters.tsx +350 -474
  255. package/templates/default/src/components/diagram/edit-header-option.tsx +36 -36
  256. package/templates/default/src/components/diagram/flow-diagram-helpers.test.ts +117 -0
  257. package/templates/default/src/components/diagram/flow-diagram-helpers.ts +251 -0
  258. package/templates/default/src/components/diagram/flow-diagram.tsx +247 -470
  259. package/templates/default/src/components/diagram/flow-host-helpers.test.ts +74 -0
  260. package/templates/default/src/components/diagram/flow-host-helpers.ts +51 -0
  261. package/templates/default/src/components/diagram/node-form-helpers.test.ts +92 -0
  262. package/templates/default/src/components/diagram/node-form-helpers.ts +100 -0
  263. package/templates/default/src/components/diagram/node-form.test.tsx +168 -0
  264. package/templates/default/src/components/diagram/node-form.tsx +199 -262
  265. package/templates/default/src/components/diagram/options-header-node.tsx +57 -57
  266. package/templates/default/src/components/diagram/template-step-combobox.tsx +155 -155
  267. package/templates/default/src/components/diagram/use-flow-node-order.ts +49 -0
  268. package/templates/default/src/components/form/error-message.tsx +7 -7
  269. package/templates/default/src/components/kokonutui/smooth-tab.tsx +453 -453
  270. package/templates/default/src/components/loading-skeleton/data-table/data-table-skeleton.tsx +30 -30
  271. package/templates/default/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  272. package/templates/default/src/components/loading-skeleton/form/icon-button-skeleton.tsx +8 -8
  273. package/templates/default/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  274. package/templates/default/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  275. package/templates/default/src/components/navigation/command-badge.tsx +34 -34
  276. package/templates/default/src/components/navigation/command-chain-input.tsx +51 -51
  277. package/templates/default/src/components/navigation/entity-search-command.tsx +118 -116
  278. package/templates/default/src/components/navigation/nav-card.tsx +31 -31
  279. package/templates/default/src/components/navigation/nav-command-helpers.ts +122 -0
  280. package/templates/default/src/components/navigation/nav-command-search.tsx +125 -0
  281. package/templates/default/src/components/navigation/nav-command.test.tsx +106 -0
  282. package/templates/default/src/components/navigation/nav-command.tsx +49 -472
  283. package/templates/default/src/components/navigation/nav-link.tsx +60 -60
  284. package/templates/default/src/components/navigation/nav-menu-card-deck.tsx +112 -112
  285. package/templates/default/src/components/navigation/use-nav-command.ts +58 -0
  286. package/templates/default/src/components/node-header.tsx +159 -159
  287. package/templates/default/src/components/reports/test-case-logs-modal.tsx +310 -310
  288. package/templates/default/src/components/table/table-actions.tsx +174 -172
  289. package/templates/default/src/components/test-case/test-case-form-helpers.test.ts +100 -0
  290. package/templates/default/src/components/test-case/test-case-form-helpers.ts +140 -0
  291. package/templates/default/src/components/test-case/test-case-picker-helpers.test.ts +40 -0
  292. package/templates/default/src/components/test-case/test-case-picker-helpers.ts +41 -0
  293. package/templates/default/src/components/test-case/test-case-picker.test.tsx +44 -0
  294. package/templates/default/src/components/test-case/test-case-picker.tsx +16 -35
  295. package/templates/default/src/components/test-case/test-scenario-preview.tsx +34 -0
  296. package/templates/default/src/components/test-run/download-logs-button.tsx +92 -92
  297. package/templates/default/src/components/test-run/log-viewer-helpers.test.ts +37 -0
  298. package/templates/default/src/components/test-run/log-viewer-helpers.ts +80 -0
  299. package/templates/default/src/components/test-run/log-viewer.test.tsx +118 -0
  300. package/templates/default/src/components/test-run/log-viewer.tsx +51 -350
  301. package/templates/default/src/components/test-run/test-run-details-helpers.test.ts +31 -0
  302. package/templates/default/src/components/test-run/test-run-details-helpers.ts +208 -0
  303. package/templates/default/src/components/test-run/test-run-details.test.tsx +174 -0
  304. package/templates/default/src/components/test-run/test-run-details.tsx +155 -457
  305. package/templates/default/src/components/test-run/test-run-header-helpers.test.ts +31 -0
  306. package/templates/default/src/components/test-run/test-run-header-helpers.ts +23 -0
  307. package/templates/default/src/components/test-run/test-run-header.test.tsx +103 -0
  308. package/templates/default/src/components/test-run/test-run-header.tsx +27 -149
  309. package/templates/default/src/components/test-run/use-log-viewer.ts +213 -0
  310. package/templates/default/src/components/test-run/use-test-run-details.ts +184 -0
  311. package/templates/default/src/components/test-run/use-test-run-header.ts +89 -0
  312. package/templates/default/src/components/test-run/view-report-button.tsx +102 -102
  313. package/templates/default/src/components/test-suite/test-suite-picker-helpers.test.ts +68 -0
  314. package/templates/default/src/components/test-suite/test-suite-picker-helpers.ts +76 -0
  315. package/templates/default/src/components/test-suite/test-suite-picker.test.tsx +65 -0
  316. package/templates/default/src/components/test-suite/test-suite-picker.tsx +4 -72
  317. package/templates/default/src/components/theme/mode-toggle.tsx +54 -54
  318. package/templates/default/src/components/theme/theme-provider.tsx +8 -8
  319. package/templates/default/src/components/typography/page-header-subtitle.tsx +7 -7
  320. package/templates/default/src/components/typography/page-header.tsx +7 -7
  321. package/templates/default/src/components/ui/alert-dialog.tsx +106 -106
  322. package/templates/default/src/components/ui/alert.tsx +43 -43
  323. package/templates/default/src/components/ui/avatar.tsx +40 -40
  324. package/templates/default/src/components/ui/badge.tsx +29 -29
  325. package/templates/default/src/components/ui/button.tsx +47 -47
  326. package/templates/default/src/components/ui/calendar.tsx +158 -158
  327. package/templates/default/src/components/ui/card.tsx +43 -43
  328. package/templates/default/src/components/ui/checkbox.tsx +28 -28
  329. package/templates/default/src/components/ui/command.tsx +135 -135
  330. package/templates/default/src/components/ui/data-table-column-header.tsx +61 -61
  331. package/templates/default/src/components/ui/data-table-pagination.tsx +87 -87
  332. package/templates/default/src/components/ui/data-table-view-options.tsx +50 -50
  333. package/templates/default/src/components/ui/data-table.test.tsx +122 -0
  334. package/templates/default/src/components/ui/data-table.tsx +298 -261
  335. package/templates/default/src/components/ui/dialog.tsx +97 -97
  336. package/templates/default/src/components/ui/dropdown-menu.tsx +182 -182
  337. package/templates/default/src/components/ui/input.tsx +22 -22
  338. package/templates/default/src/components/ui/kbd.tsx +28 -28
  339. package/templates/default/src/components/ui/label.tsx +19 -19
  340. package/templates/default/src/components/ui/loading.tsx +12 -12
  341. package/templates/default/src/components/ui/multi-select-with-preview.tsx +116 -116
  342. package/templates/default/src/components/ui/multi-select.test.tsx +45 -0
  343. package/templates/default/src/components/ui/multi-select.tsx +158 -142
  344. package/templates/default/src/components/ui/navigation-menu.tsx +120 -120
  345. package/templates/default/src/components/ui/popover.tsx +33 -33
  346. package/templates/default/src/components/ui/progress.tsx +25 -25
  347. package/templates/default/src/components/ui/radio-group.tsx +44 -44
  348. package/templates/default/src/components/ui/scroll-area.tsx +40 -40
  349. package/templates/default/src/components/ui/select.tsx +151 -151
  350. package/templates/default/src/components/ui/separator.tsx +22 -22
  351. package/templates/default/src/components/ui/skeleton.tsx +7 -7
  352. package/templates/default/src/components/ui/table.tsx +76 -76
  353. package/templates/default/src/components/ui/tabs.tsx +55 -55
  354. package/templates/default/src/components/ui/textarea.tsx +21 -21
  355. package/templates/default/src/components/ui/toast.tsx +113 -113
  356. package/templates/default/src/components/ui/toaster.tsx +26 -26
  357. package/templates/default/src/components/user-prompt/delete-prompt.test.tsx +60 -0
  358. package/templates/default/src/components/user-prompt/delete-prompt.tsx +118 -87
  359. package/templates/default/src/constants/form-opts/diagram/node-form.ts +30 -30
  360. package/templates/default/src/constants/form-opts/environment-form-opts.ts +24 -24
  361. package/templates/default/src/constants/form-opts/locator-group-form-opts.ts +28 -28
  362. package/templates/default/src/constants/form-opts/module-form-opts.ts +21 -21
  363. package/templates/default/src/constants/form-opts/tag-form-opts.ts +42 -42
  364. package/templates/default/src/constants/form-opts/template-selection-form-opts.ts +16 -16
  365. package/templates/default/src/constants/form-opts/template-step-group-form-opts.ts +24 -24
  366. package/templates/default/src/constants/form-opts/template-test-case-form-opts.ts +39 -39
  367. package/templates/default/src/constants/form-opts/template-test-step-form-opts.ts +36 -36
  368. package/templates/default/src/constants/form-opts/test-case-form-opts.ts +43 -43
  369. package/templates/default/src/constants/form-opts/test-suite-form-opts.ts +24 -24
  370. package/templates/default/src/hooks/use-toast.ts +187 -187
  371. package/templates/default/src/lib/automation/automation-path-roots.ts +95 -0
  372. package/templates/default/src/lib/automation/automation-workspace.ts +147 -0
  373. package/templates/default/src/lib/automation/paths.ts +6 -211
  374. package/templates/default/src/lib/bidirectional-sync.ts +432 -432
  375. package/templates/default/src/lib/environment-file-utils.ts +2 -1
  376. package/templates/default/src/lib/executor/local-executor-adapter.ts +2 -5
  377. package/templates/default/src/lib/feature-file-generator.ts +2 -1
  378. package/templates/default/src/lib/gherkin-parser.ts +0 -2
  379. package/templates/default/src/lib/locator-group-file-utils.ts +304 -307
  380. package/templates/default/src/lib/locator-picker/session-manager.ts +0 -21
  381. package/templates/default/src/lib/locator-picker/suggestions.ts +4 -2
  382. package/templates/default/src/lib/metrics/metric-calculator.ts +2 -6
  383. package/templates/default/src/lib/module-hierarchy-builder.ts +205 -205
  384. package/templates/default/src/lib/path-helpers/module-path.ts +71 -71
  385. package/templates/default/src/lib/sync/sync-executor.test.ts +76 -0
  386. package/templates/default/src/lib/sync/sync-pending-counts.test.ts +227 -226
  387. package/templates/default/src/lib/sync/sync-pending-counts.ts +2 -5
  388. package/templates/default/src/lib/template-sync-utils.d.ts +6 -6
  389. package/templates/default/src/lib/template-sync-utils.js +46 -46
  390. package/templates/default/src/lib/template-sync-utils.ts +63 -63
  391. package/templates/default/src/lib/test-case-utils.ts +6 -6
  392. package/templates/default/src/lib/test-run/log-formatter.ts +83 -83
  393. package/templates/default/src/lib/test-run/report-parser.ts +352 -352
  394. package/templates/default/src/lib/test-run/test-run-executor.ts +13 -13
  395. package/templates/default/src/lib/test-run/winston-logger.ts +65 -64
  396. package/templates/default/src/lib/transformers/gherkin-converter.ts +42 -42
  397. package/templates/default/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  398. package/templates/default/src/lib/transformers/template-test-case-converter.ts +160 -160
  399. package/templates/default/src/lib/utils/node-param-validation.ts +81 -81
  400. package/templates/default/src/lib/utils/template-step-file-generator.ts +2 -2
  401. package/templates/default/src/lib/utils/template-step-file-manager.ts +166 -166
  402. package/templates/default/src/lib/utils.ts +31 -31
  403. package/templates/default/src/services/dashboard/dashboard-service.test.ts +106 -0
  404. package/templates/default/src/services/dashboard/dashboard-service.ts +173 -0
  405. package/templates/default/src/services/environment/environment-service.test.ts +137 -0
  406. package/templates/default/src/services/environment/environment-service.ts +96 -0
  407. package/templates/default/src/services/locator/locator-path-utils.test.ts +14 -0
  408. package/templates/default/src/services/locator/locator-path-utils.ts +14 -0
  409. package/templates/default/src/services/locator/locator-service.test.ts +63 -0
  410. package/templates/default/src/services/locator/locator-service.ts +479 -0
  411. package/templates/default/src/services/locator/locator-sync-utils.test.ts +19 -0
  412. package/templates/default/src/services/locator/locator-sync-utils.ts +21 -0
  413. package/templates/default/src/services/locator-group/locator-group-service.test.ts +123 -0
  414. package/templates/default/src/services/locator-group/locator-group-service.ts +180 -0
  415. package/templates/default/src/services/module/module-service.test.ts +89 -0
  416. package/templates/default/src/services/module/module-service.ts +66 -0
  417. package/templates/default/src/services/report/report-service.test.ts +244 -0
  418. package/templates/default/src/services/report/report-service.ts +438 -0
  419. package/templates/default/src/services/shared/constants.ts +2 -0
  420. package/templates/default/src/services/shared/errors.test.ts +38 -0
  421. package/templates/default/src/services/shared/errors.ts +44 -0
  422. package/templates/default/src/services/shared/index.ts +7 -0
  423. package/templates/default/src/services/tag/tag-service.test.ts +22 -0
  424. package/templates/default/src/services/tag/tag-service.ts +41 -0
  425. package/templates/default/src/services/template-step/template-step-service.test.ts +22 -0
  426. package/templates/default/src/services/template-step/template-step-service.ts +171 -0
  427. package/templates/default/src/services/template-step-group/template-step-group-service.test.ts +22 -0
  428. package/templates/default/src/services/template-step-group/template-step-group-service.ts +81 -0
  429. package/templates/default/src/services/template-test-case/template-test-case-service.test.ts +22 -0
  430. package/templates/default/src/services/template-test-case/template-test-case-service.ts +128 -0
  431. package/templates/default/src/services/test-case/test-case-service.test.ts +175 -0
  432. package/templates/default/src/services/test-case/test-case-service.ts +298 -0
  433. package/templates/default/src/services/test-run/test-run-helpers.ts +61 -0
  434. package/templates/default/src/services/test-run/test-run-service.test.ts +647 -0
  435. package/templates/default/src/services/test-run/test-run-service.ts +917 -0
  436. package/templates/default/src/services/test-suite/test-suite-service.test.ts +127 -0
  437. package/templates/default/src/services/test-suite/test-suite-service.ts +197 -0
  438. package/templates/default/src/types/diagram/diagram.ts +34 -34
  439. package/templates/default/src/types/diagram/template-step.ts +11 -11
  440. package/templates/default/src/types/executor/browser.type.ts +1 -1
  441. package/templates/default/src/types/form/actionHandler.ts +19 -6
  442. package/templates/default/src/types/locator/locator.type.ts +11 -11
  443. package/templates/default/src/types/step/step.type.ts +1 -1
  444. package/templates/default/src/types/table/data-table.ts +6 -6
  445. package/templates/default/tailwind.config.ts +62 -62
  446. package/templates/default/tsconfig.json +1 -1
  447. package/dist/cli.e2e.test.d.ts +0 -2
  448. package/dist/cli.e2e.test.d.ts.map +0 -1
  449. package/dist/cli.e2e.test.js +0 -73
  450. package/dist/cli.e2e.test.js.map +0 -1
  451. package/dist/config.test.d.ts +0 -2
  452. package/dist/config.test.d.ts.map +0 -1
  453. package/dist/config.test.js +0 -65
  454. package/dist/config.test.js.map +0 -1
  455. package/dist/copy-template.test.d.ts +0 -2
  456. package/dist/copy-template.test.d.ts.map +0 -1
  457. package/dist/copy-template.test.js +0 -71
  458. package/dist/copy-template.test.js.map +0 -1
  459. package/dist/download-repo.test.d.ts +0 -2
  460. package/dist/download-repo.test.d.ts.map +0 -1
  461. package/dist/download-repo.test.js +0 -14
  462. package/dist/download-repo.test.js.map +0 -1
  463. package/dist/install.test.d.ts +0 -2
  464. package/dist/install.test.d.ts.map +0 -1
  465. package/dist/install.test.js +0 -119
  466. package/dist/install.test.js.map +0 -1
  467. package/dist/prompts.test.d.ts +0 -2
  468. package/dist/prompts.test.d.ts.map +0 -1
  469. package/dist/prompts.test.js +0 -58
  470. package/dist/prompts.test.js.map +0 -1
  471. package/templates/default/src/actions/conflict/conflict.action.ts +0 -33
  472. package/templates/default/src/actions/review/review-actions.ts +0 -147
  473. package/templates/default/src/actions/user/user-actions.ts +0 -13
  474. package/templates/default/src/app/(base)/locators/locator-form.tsx +0 -163
  475. package/templates/default/src/app/(base)/reviews/create/page.tsx +0 -26
  476. package/templates/default/src/app/(base)/reviews/created-reviews-table.tsx +0 -15
  477. package/templates/default/src/app/(base)/reviews/modify/[id]/page.tsx +0 -26
  478. package/templates/default/src/app/(base)/reviews/page.tsx +0 -26
  479. package/templates/default/src/app/(base)/reviews/review/[id]/page.tsx +0 -26
  480. package/templates/default/src/app/(base)/reviews/review-form.tsx +0 -11
  481. package/templates/default/src/app/(base)/reviews/review-table-by-creator-columns.tsx +0 -9
  482. package/templates/default/src/app/(base)/reviews/review-table-by-reviewer-columns.tsx +0 -9
  483. package/templates/default/src/app/(base)/reviews/reviewer-reviews-table.tsx +0 -15
  484. package/templates/default/src/constants/form-opts/locator-form-opts.ts +0 -20
  485. package/templates/default/src/constants/form-opts/review-form-opts.ts +0 -23
@@ -1,615 +1,78 @@
1
1
  'use server'
2
2
 
3
3
  import { ActionResponse } from '@/types/form/actionHandler'
4
- import prisma from '@/config/db-config'
5
- import { parseCucumberReport, getStepStatusEnum, getStepKeywordEnum } from '@/lib/test-run/report-parser'
6
- import { Prisma } from '@prisma/client'
7
- import { existsSync } from 'fs'
8
- import { updateTestSuiteMetrics } from '@/lib/metrics/metric-calculator'
9
- import { resolveStoredPath, toProjectRelativePath } from '@/lib/automation/paths'
10
- import { findMatchingTestRunTestCase } from '@/lib/test-run/matching'
11
-
12
- /**
13
- * Type for report with all relations from getAllReportsAction
14
- */
15
- type ReportWithRelations = Prisma.ReportGetPayload<{
16
- include: {
17
- testRun: {
18
- include: {
19
- environment: true
20
- tags: true
21
- }
22
- }
23
- testCases: {
24
- include: {
25
- testRunTestCase: {
26
- include: {
27
- testCase: {
28
- include: {
29
- tags: true
30
- }
31
- }
32
- testSuite: true
33
- }
34
- }
35
- reportScenario: {
36
- include: {
37
- reportFeature: true
38
- }
39
- }
40
- }
41
- }
42
- }
43
- }>
44
-
45
- /**
46
- * Type for report with all relations from getReportByIdAction
47
- */
48
- type ReportDetailWithRelations = Prisma.ReportGetPayload<{
49
- include: {
50
- testRun: {
51
- include: {
52
- environment: true
53
- tags: true
54
- }
55
- }
56
- features: {
57
- include: {
58
- tags: true
59
- scenarios: {
60
- include: {
61
- tags: true
62
- steps: true
63
- hooks: true
64
- }
65
- }
66
- }
67
- }
68
- testCases: {
69
- include: {
70
- testRunTestCase: {
71
- include: {
72
- testCase: {
73
- include: {
74
- tags: true
75
- }
76
- }
77
- testSuite: true
78
- }
79
- }
80
- reportScenario: {
81
- include: {
82
- reportFeature: true
83
- }
84
- }
85
- }
86
- }
87
- }
88
- }>
89
-
90
- /**
91
- * Stores a cucumber.json report in the database
92
- * Parses the report file and creates all related records (features, scenarios, steps, hooks, tags)
93
- *
94
- * @param testRunId - The test run ID (runId, not id)
95
- * @param reportPath - Path to the cucumber.json file
96
- * @returns ActionResponse indicating success or failure
97
- */
98
- export async function storeReportFromFile(testRunId: string, reportPath: string): Promise<ActionResponse> {
4
+ import {
5
+ getAllTestCaseMetricsForFilter,
6
+ getAllTestSuiteMetricsForFilter,
7
+ getReportByIdOrThrow,
8
+ listReports,
9
+ } from '@/services/report/report-service'
10
+ import { ServiceError, serviceErrorToActionResponse, unknownErrorToActionResponse } from '@/services/shared/errors'
11
+
12
+ export async function getAllReportsAction(): Promise<ActionResponse> {
99
13
  try {
100
- const resolvedReportPath = resolveStoredPath(reportPath)
101
-
102
- // Check if file exists
103
- if (!existsSync(resolvedReportPath)) {
104
- console.warn(`[ReportActions] Report file not found at ${reportPath} for testRunId: ${testRunId}`)
105
- return {
106
- status: 404,
107
- error: `Report file not found at ${reportPath}`,
108
- }
109
- }
110
-
111
- // Find the test run
112
- const testRun = await prisma.testRun.findUnique({
113
- where: { runId: testRunId },
114
- include: {
115
- testCases: {
116
- include: {
117
- testCase: {
118
- include: {
119
- tags: true,
120
- },
121
- },
122
- testSuite: {
123
- include: {
124
- tags: true,
125
- },
126
- },
127
- },
128
- },
129
- },
130
- })
131
-
132
- if (!testRun) {
133
- return {
134
- status: 404,
135
- error: `Test run not found for runId: ${testRunId}`,
136
- }
137
- }
138
-
139
- // Parse the report
140
- const parsedReport = await parseCucumberReport(resolvedReportPath)
141
-
142
- // Create Report record
143
- const report = await prisma.report.create({
144
- data: {
145
- name: `Test Run Report - ${testRun.name}`,
146
- description: `Report for test run: ${testRun.name}`,
147
- reportPath: toProjectRelativePath(reportPath),
148
- testRunId: testRun.id,
149
- },
150
- })
151
-
152
- // Track test case IDs that were matched and executed
153
- const executedSuiteIds = new Set<string>()
154
- const executedLegacyTestCaseIds = new Set<string>()
155
-
156
- // Process each feature
157
- for (const feature of parsedReport.features) {
158
- // Create ReportFeature
159
- const reportFeature = await prisma.reportFeature.create({
160
- data: {
161
- reportId: report.id,
162
- name: feature.name,
163
- description: feature.description,
164
- uri: feature.uri,
165
- line: feature.line,
166
- keyword: feature.keyword,
167
- },
168
- })
169
-
170
- // Create feature tags
171
- for (const tag of feature.tags) {
172
- await prisma.reportFeatureTag.create({
173
- data: {
174
- reportFeatureId: reportFeature.id,
175
- tagName: tag.name,
176
- line: tag.line,
177
- },
178
- })
179
- }
180
-
181
- // Process each scenario
182
- for (const scenario of feature.scenarios) {
183
- // Create ReportScenario
184
- const reportScenario = await prisma.reportScenario.create({
185
- data: {
186
- reportFeatureId: reportFeature.id,
187
- name: scenario.name,
188
- description: scenario.description,
189
- line: scenario.line,
190
- keyword: scenario.keyword,
191
- type: scenario.type,
192
- cucumberId: scenario.cucumberId,
193
- },
194
- })
195
-
196
- // Create scenario tags
197
- for (const tag of scenario.tags) {
198
- await prisma.reportScenarioTag.create({
199
- data: {
200
- reportScenarioId: reportScenario.id,
201
- tagName: tag.name,
202
- line: tag.line,
203
- },
204
- })
205
- }
206
-
207
- // Create steps
208
- for (const step of scenario.steps) {
209
- await prisma.reportStep.create({
210
- data: {
211
- reportScenarioId: reportScenario.id,
212
- keyword: getStepKeywordEnum(step.keyword),
213
- line: step.line,
214
- name: step.name,
215
- matchLocation: step.matchLocation,
216
- status: getStepStatusEnum(step.status),
217
- duration: String(step.duration),
218
- errorMessage: step.errorMessage,
219
- errorTrace: step.errorTrace,
220
- screenshotPath: step.screenshotPath ? toProjectRelativePath(step.screenshotPath) : null,
221
- hidden: step.hidden,
222
- order: step.order,
223
- },
224
- })
225
- }
226
-
227
- // Create hooks
228
- for (const hook of scenario.hooks) {
229
- await prisma.reportHook.create({
230
- data: {
231
- reportScenarioId: reportScenario.id,
232
- keyword: getStepKeywordEnum(hook.keyword),
233
- status: getStepStatusEnum(hook.status),
234
- duration: String(hook.duration),
235
- errorMessage: hook.errorMessage,
236
- errorTrace: hook.errorTrace,
237
- hidden: hook.hidden,
238
- },
239
- })
240
- }
241
-
242
- // Try to match scenario to test case
243
- // Method 1: Extract test case title from scenario name (format: "[Title] Description")
244
- const matchedTestCase = findMatchingTestRunTestCase(testRun.testCases, {
245
- scenarioName: scenario.name,
246
- scenarioTags: scenario.tags.map(tag => tag.name),
247
- })
248
-
249
- // If we found a matching test case, create ReportTestCase link
250
- if (matchedTestCase) {
251
- if (matchedTestCase.testSuiteId) {
252
- executedSuiteIds.add(matchedTestCase.testSuiteId)
253
- } else {
254
- executedLegacyTestCaseIds.add(matchedTestCase.testCaseId)
255
- }
256
-
257
- // Calculate scenario duration
258
- const scenarioDuration =
259
- scenario.steps.reduce((total, step) => total + step.duration, 0) +
260
- scenario.hooks.reduce((total, hook) => total + hook.duration, 0)
261
-
262
- await prisma.reportTestCase.create({
263
- data: {
264
- reportId: report.id,
265
- testCaseId: matchedTestCase.testCaseId,
266
- testRunTestCaseId: matchedTestCase.id,
267
- reportScenarioId: reportScenario.id,
268
- duration: String(scenarioDuration),
269
- },
270
- })
271
- }
272
- }
273
- }
274
-
275
- // Update test suite metrics for all test suites that had test cases executed
276
- // This serves as a backup to ensure metrics are updated even if updateTestSuitesForTestRun missed some
277
- if (executedSuiteIds.size > 0 || executedLegacyTestCaseIds.size > 0) {
278
- try {
279
- const executedAt = testRun.completedAt || testRun.startedAt || new Date()
280
- const allSuiteIds = new Set(executedSuiteIds)
281
-
282
- if (executedLegacyTestCaseIds.size > 0) {
283
- const legacyTestCases = await prisma.testCase.findMany({
284
- where: {
285
- id: {
286
- in: Array.from(executedLegacyTestCaseIds),
287
- },
288
- },
289
- include: {
290
- TestSuite: true,
291
- },
292
- })
293
-
294
- legacyTestCases.forEach(testCase => {
295
- testCase.TestSuite.forEach(testSuite => {
296
- allSuiteIds.add(testSuite.id)
297
- })
298
- })
299
- }
300
-
301
- for (const suiteId of allSuiteIds) {
302
- await updateTestSuiteMetrics(suiteId, executedAt)
303
- }
304
-
305
- if (allSuiteIds.size > 0) {
306
- console.log(
307
- `[ReportActions] Updated test suite metrics for ${allSuiteIds.size} executed suite(s)`,
308
- )
309
- }
310
- } catch (error) {
311
- console.error(
312
- `[ReportActions] Error updating test suite metrics after storing report: ${error instanceof Error ? error.message : 'Unknown error'}`,
313
- )
314
- // Don't fail the report storage if metrics update fails
315
- }
316
- }
14
+ const reports = await listReports()
317
15
 
318
16
  return {
319
17
  status: 200,
320
- message: 'Report stored successfully',
321
- data: { reportId: report.id },
322
- }
323
- } catch (error) {
324
- console.error(`[ReportActions] Error storing report from file ${reportPath}:`, error)
325
- return {
326
- status: 500,
327
- error: `Failed to store report: ${error instanceof Error ? error.message : 'Unknown error'}`,
328
- }
329
- }
330
- }
331
-
332
- /**
333
- * Gets all reports from the database
334
- */
335
- export const getAllReportsAction = async (): Promise<ActionResponse> => {
336
- try {
337
- const reports = await prisma.report.findMany({
338
- include: {
339
- testRun: {
340
- include: {
341
- environment: true,
342
- tags: true,
343
- },
344
- },
345
- testCases: {
346
- include: {
347
- testRunTestCase: {
348
- include: {
349
- testCase: {
350
- include: {
351
- tags: true,
352
- },
353
- },
354
- testSuite: true,
355
- },
356
- },
357
- reportScenario: {
358
- include: {
359
- reportFeature: true,
360
- },
361
- },
362
- },
363
- },
364
- },
365
- orderBy: {
366
- createdAt: 'desc',
367
- },
368
- })
369
-
370
- return {
371
- status: 200,
372
- data: reports as ReportWithRelations[],
18
+ success: true,
19
+ data: reports,
373
20
  }
374
21
  } catch (error) {
375
22
  console.error('[ReportActions] Error fetching all reports:', error)
376
- return {
377
- status: 500,
378
- error: `Server error occurred: ${error instanceof Error ? error.message : 'Unknown error'}`,
379
- }
23
+ return unknownErrorToActionResponse(error)
380
24
  }
381
25
  }
382
26
 
383
- /**
384
- * Gets a report by ID with all related data
385
- */
386
- export const getReportByIdAction = async (reportId: string): Promise<ActionResponse> => {
27
+ export async function getReportByIdAction(reportId: string): Promise<ActionResponse> {
387
28
  try {
388
- const report = await prisma.report.findUnique({
389
- where: { id: reportId },
390
- include: {
391
- testRun: {
392
- include: {
393
- environment: true,
394
- tags: true,
395
- },
396
- },
397
- features: {
398
- include: {
399
- tags: true,
400
- scenarios: {
401
- include: {
402
- tags: true,
403
- steps: {
404
- orderBy: {
405
- order: 'asc',
406
- },
407
- },
408
- hooks: true,
409
- },
410
- },
411
- },
412
- },
413
- testCases: {
414
- include: {
415
- testRunTestCase: {
416
- include: {
417
- testCase: {
418
- include: {
419
- tags: true,
420
- },
421
- },
422
- testSuite: true,
423
- },
424
- },
425
- reportScenario: {
426
- include: {
427
- reportFeature: true,
428
- tags: true,
429
- steps: {
430
- orderBy: {
431
- order: 'asc',
432
- },
433
- },
434
- hooks: true,
435
- },
436
- },
437
- },
438
- },
439
- },
440
- })
441
-
442
- if (!report) {
443
- return {
444
- status: 404,
445
- error: 'Report not found',
446
- }
447
- }
29
+ const report = await getReportByIdOrThrow(reportId)
448
30
 
449
31
  return {
450
32
  status: 200,
451
- data: report as ReportDetailWithRelations,
33
+ success: true,
34
+ data: report,
452
35
  }
453
36
  } catch (error) {
454
37
  console.error(`[ReportActions] Error fetching report ${reportId}:`, error)
455
- return {
456
- status: 500,
457
- error: `Server error occurred: ${error instanceof Error ? error.message : 'Unknown error'}`,
458
- }
459
- }
460
- }
461
-
462
- /**
463
- * Gets a report by test run ID
464
- */
465
- export const getReportByTestRunIdAction = async (testRunId: string): Promise<ActionResponse> => {
466
- try {
467
- // Find test run by runId
468
- const testRun = await prisma.testRun.findUnique({
469
- where: { runId: testRunId },
470
- select: { id: true },
471
- })
472
-
473
- if (!testRun) {
474
- return {
475
- status: 404,
476
- error: 'Test run not found',
477
- }
478
- }
479
-
480
- // Find report by testRun.id
481
- const report = await prisma.report.findFirst({
482
- where: { testRunId: testRun.id },
483
- include: {
484
- testRun: {
485
- include: {
486
- environment: true,
487
- tags: true,
488
- },
489
- },
490
- features: {
491
- include: {
492
- tags: true,
493
- scenarios: {
494
- include: {
495
- tags: true,
496
- steps: {
497
- orderBy: {
498
- order: 'asc',
499
- },
500
- },
501
- hooks: true,
502
- },
503
- },
504
- },
505
- },
506
- testCases: {
507
- include: {
508
- testRunTestCase: {
509
- include: {
510
- testCase: {
511
- include: {
512
- tags: true,
513
- },
514
- },
515
- testSuite: true,
516
- },
517
- },
518
- reportScenario: {
519
- include: {
520
- reportFeature: true,
521
- },
522
- },
523
- },
524
- },
525
- },
526
- })
527
-
528
- if (!report) {
529
- return {
530
- status: 404,
531
- error: 'Report not found for this test run',
532
- }
533
- }
534
-
535
- return {
536
- status: 200,
537
- data: report as ReportDetailWithRelations,
538
- }
539
- } catch (error) {
540
- console.error(`[ReportActions] Error fetching report for testRunId ${testRunId}:`, error)
541
- return {
542
- status: 500,
543
- error: `Server error occurred: ${error instanceof Error ? error.message : 'Unknown error'}`,
38
+ if (error instanceof ServiceError) {
39
+ return serviceErrorToActionResponse(error)
544
40
  }
41
+ return unknownErrorToActionResponse(error)
545
42
  }
546
43
  }
547
44
 
548
- /**
549
- * Gets the test case metrics for a report
550
- */
551
- export const getAllTestCaseMetricsAction = async (filter: string): Promise<ActionResponse> => {
45
+ export async function getAllTestCaseMetricsAction(filter: string): Promise<ActionResponse> {
552
46
  try {
553
- let testCaseMetrics = await prisma.testCaseMetrics.findMany({
554
- include: {
555
- testCase: {
556
- include: {
557
- tags: true,
558
- },
559
- },
560
- },
561
- })
562
- if (filter === 'repeatedlyFailing') {
563
- testCaseMetrics = testCaseMetrics.filter(tc => tc.isRepeatedlyFailing)
564
- } else if (filter === 'flaky') {
565
- testCaseMetrics = testCaseMetrics.filter(tc => tc.isFlaky)
566
- }
47
+ const testCaseMetrics = await getAllTestCaseMetricsForFilter(filter)
567
48
  return {
568
49
  status: 200,
50
+ success: true,
569
51
  data: testCaseMetrics,
570
52
  }
571
53
  } catch (error) {
572
54
  console.error(`[ReportActions] Error fetching all test case metrics:`, error)
573
55
  return {
574
56
  status: 500,
57
+ success: false,
575
58
  error: `Server error occurred: ${error instanceof Error ? error.message : 'Unknown error'}`,
576
59
  }
577
60
  }
578
61
  }
579
62
 
580
- /**
581
- * Gets the test suite metrics for a report
582
- */
583
- export const getAllTestSuiteMetricsAction = async (filter: string): Promise<ActionResponse> => {
63
+ export async function getAllTestSuiteMetricsAction(filter: string): Promise<ActionResponse> {
584
64
  try {
585
- let testSuiteMetrics = await prisma.testSuiteMetrics.findMany({
586
- include: {
587
- testSuite: {
588
- include: {
589
- tags: true,
590
- testCases: true,
591
- },
592
- },
593
- },
594
- })
595
- if (filter === 'notExecutedRecently') {
596
- // Calculate the date threshold for recent runs (7 days ago)
597
- const recentPeriodDate = new Date()
598
- recentPeriodDate.setDate(recentPeriodDate.getDate() - 7)
599
-
600
- // Filter for suites that have never been executed OR were executed more than 7 days ago
601
- testSuiteMetrics = testSuiteMetrics.filter(
602
- ts => ts.lastExecutedAt === null || ts.lastExecutedAt < recentPeriodDate,
603
- )
604
- }
65
+ const testSuiteMetrics = await getAllTestSuiteMetricsForFilter(filter)
605
66
  return {
606
67
  status: 200,
68
+ success: true,
607
69
  data: testSuiteMetrics,
608
70
  }
609
71
  } catch (error) {
610
72
  console.error(`[ReportActions] Error fetching all test suite metrics:`, error)
611
73
  return {
612
74
  status: 500,
75
+ success: false,
613
76
  error: `Server error occurred: ${error instanceof Error ? error.message : 'Unknown error'}`,
614
77
  }
615
78
  }
@@ -0,0 +1,58 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest'
2
+
3
+ vi.mock('next/cache', () => ({
4
+ revalidatePath: vi.fn(),
5
+ }))
6
+
7
+ vi.mock('@/lib/sync/sync-executor', () => ({
8
+ runRequestedSync: vi.fn(),
9
+ }))
10
+
11
+ vi.mock('@/lib/sync/sync-pending-counts', () => ({
12
+ getSyncPendingCounts: vi.fn(),
13
+ }))
14
+
15
+ import { revalidatePath } from 'next/cache'
16
+ import { runRequestedSync } from '@/lib/sync/sync-executor'
17
+ import { runSyncAction } from './sync-actions'
18
+
19
+ describe('runSyncAction', () => {
20
+ beforeEach(() => {
21
+ vi.clearAllMocks()
22
+ })
23
+
24
+ it('rejects an invalid sync request id without executing anything', async () => {
25
+ const result = await runSyncAction('not-a-sync-target')
26
+
27
+ expect(result).toEqual({
28
+ requestedScriptId: 'not-a-sync-target',
29
+ executedScriptIds: [],
30
+ success: false,
31
+ exitCode: 400,
32
+ durationMs: 0,
33
+ cause: 'Invalid sync target requested.',
34
+ })
35
+ expect(runRequestedSync).not.toHaveBeenCalled()
36
+ expect(revalidatePath).not.toHaveBeenCalled()
37
+ })
38
+
39
+ it('revalidates settings after a successful sync request', async () => {
40
+ vi.mocked(runRequestedSync).mockResolvedValue({
41
+ requestedScriptId: 'sync-tags',
42
+ executedScriptIds: ['sync-tags'],
43
+ success: true,
44
+ durationMs: 12,
45
+ })
46
+
47
+ const result = await runSyncAction('sync-tags')
48
+
49
+ expect(result).toEqual({
50
+ requestedScriptId: 'sync-tags',
51
+ executedScriptIds: ['sync-tags'],
52
+ success: true,
53
+ durationMs: 12,
54
+ })
55
+ expect(runRequestedSync).toHaveBeenCalledWith('sync-tags')
56
+ expect(revalidatePath).toHaveBeenCalledWith('/settings')
57
+ })
58
+ })