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
@@ -8,7 +8,7 @@ import {
8
8
  StepStatus,
9
9
  Prisma,
10
10
  } from '@prisma/client'
11
- import { Calendar, CheckCircle, Clock, Compass, Flame, Info, XCircle } from 'lucide-react'
11
+ import { Calendar, ChartLine, CheckCircle, Clock, Compass, Flame, Info, XCircle } from 'lucide-react'
12
12
  import { Metadata } from 'next'
13
13
  import ReportMetricCard from '../report-metric-card'
14
14
  import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
@@ -53,6 +53,7 @@ type ReportDetailWithRelations = Prisma.ReportGetPayload<{
53
53
  tags: true
54
54
  }
55
55
  }
56
+ testSuite: true
56
57
  }
57
58
  }
58
59
  reportScenario: {
@@ -343,6 +344,7 @@ const ViewReport = async ({ params }: { params: Promise<{ id: string }> }) => {
343
344
  const totalTests = report.testCases.length
344
345
  const passedTests = report.testCases.filter(rtc => rtc.testRunTestCase.result === 'PASSED').length
345
346
  const failedTests = report.testCases.filter(rtc => rtc.testRunTestCase.result === 'FAILED').length
347
+ const untestedTests = report.testCases.filter(rtc => rtc.testRunTestCase.result === 'UNTESTED').length
346
348
 
347
349
  // Calculate overview chart data
348
350
  const overviewData = [
@@ -418,39 +420,41 @@ const ViewReport = async ({ params }: { params: Promise<{ id: string }> }) => {
418
420
 
419
421
  return (
420
422
  <>
421
- <div className="flex justify-between">
422
- <div>
423
- <PageHeader className="mb-2 flex items-center gap-2 text-3xl">
424
- <div>
425
- <span>Test Run Report: </span>
426
- <span>{report.testRun.name}</span>
427
- </div>
428
- {testRunResultToBadge(testRun.result)}
429
- </PageHeader>
430
- <div className="flex gap-2">
431
- {testRun.completedAt && (
432
- <div className="flex items-center gap-1 text-sm text-gray-400">
433
- <Calendar className="h-4 w-4" />
434
- {formatDateTime(testRun.completedAt)}
435
- </div>
436
- )}
437
- {testRun.completedAt && testRun.startedAt && (
438
- <div className="flex items-center gap-1 text-sm text-gray-400">
439
- <Clock className="h-4 w-4" />
440
- {formatDuration(testRun.startedAt, testRun.completedAt)}
441
- </div>
442
- )}
443
- </div>
423
+
424
+ <div>
425
+ <div className="w-fit mb-2">
426
+ {testRunResultToBadge(testRun.result)}
444
427
  </div>
445
- <div className="flex w-1/2 justify-between gap-1">
446
- <ReportMetricCard title="Total Tests" value={totalTests.toString()} />
447
- <ReportMetricCard title="Passed" value={passedTests.toString()} />
448
- <ReportMetricCard title="Failed" value={failedTests.toString()} />
428
+ <PageHeader className="mb-2 text-4xl">
429
+ <div>
430
+ <span>Test Run Report: </span>
431
+ <span>{report.testRun.name}</span>
432
+ </div>
433
+ </PageHeader>
434
+ <div className="flex gap-2">
435
+ {testRun.completedAt && (
436
+ <div className="flex items-center gap-1 text-sm text-gray-400">
437
+ <Calendar className="h-4 w-4" />
438
+ {formatDateTime(testRun.completedAt)}
439
+ </div>
440
+ )}
441
+ {testRun.completedAt && testRun.startedAt && (
442
+ <div className="flex items-center gap-1 text-sm text-gray-400">
443
+ <Clock className="h-4 w-4" />
444
+ {formatDuration(testRun.startedAt, testRun.completedAt)}
445
+ </div>
446
+ )}
449
447
  </div>
450
448
  </div>
449
+ <div className="mt-6 grid gap-4 sm:grid-cols-2 xl:grid-cols-4">
450
+ <ReportMetricCard title="Total Tests" value={totalTests.toString()} />
451
+ <ReportMetricCard title="Passed" value={passedTests.toString()} />
452
+ <ReportMetricCard title="Failed" value={failedTests.toString()} />
453
+ <ReportMetricCard title="Untested" value={untestedTests.toString()} />
454
+ </div>
451
455
  <Separator className="my-4 bg-muted" />
452
456
  <div className="flex gap-6">
453
- <Card className="flex h-[420px] min-w-0 flex-1 flex-col">
457
+ <Card className="flex h-[420px] min-w-0 flex-1 flex-col shadow-none bg-gray-500/10 border-none">
454
458
  <CardHeader className="flex-shrink-0">
455
459
  <div className="flex items-center gap-2">
456
460
  <Info className="h-6 w-6" />
@@ -484,13 +488,16 @@ const ViewReport = async ({ params }: { params: Promise<{ id: string }> }) => {
484
488
  </div>
485
489
  </CardContent>
486
490
  </Card>
487
- <Card className="flex h-[420px] min-w-0 flex-1 flex-col">
488
- <CardHeader className="flex-shrink-0">
489
- <CardTitle>Visualizations</CardTitle>
491
+ <Card className="flex h-[420px] min-w-0 flex-1 flex-col shadow-none bg-gray-500/10 border-none">
492
+ <CardHeader className="flex-shrink-0 ">
493
+ <div className="flex items-center gap-2">
494
+ <ChartLine className="h-6 w-6" />
495
+ <CardTitle className="text-lg font-semibold">Visualizations</CardTitle>
496
+ </div>
490
497
  </CardHeader>
491
498
  <CardContent className="flex flex-1 flex-col overflow-hidden">
492
499
  <Tabs defaultValue="overview" className="flex min-w-0 flex-1 flex-col overflow-hidden">
493
- <TabsList className="flex-shrink-0">
500
+ <TabsList className="flex-shrink-0 bg-gray-500/15 w-fit mx-auto p-2">
494
501
  <TabsTrigger value="overview">Overview</TabsTrigger>
495
502
  <TabsTrigger value="feature">Feature</TabsTrigger>
496
503
  <TabsTrigger value="duration">Duration</TabsTrigger>
@@ -1,33 +1,33 @@
1
- 'use client'
2
-
3
- import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
4
- import { Bar, BarChart, XAxis, YAxis } from 'recharts'
5
-
6
- export default function DurationChart({
7
- config,
8
- data,
9
- }: {
10
- config: ChartConfig
11
- data: Array<{ feature: string; duration: number }>
12
- }) {
13
- return (
14
- <>
15
- <p className="mb-6 mt-2 text-center text-xs text-muted-foreground">Duration by Feature(Seconds)</p>
16
- <ChartContainer config={config} className="min-h-[300px] w-full">
17
- <BarChart
18
- accessibilityLayer
19
- data={data}
20
- layout="vertical"
21
- margin={{
22
- left: 5,
23
- }}
24
- >
25
- <YAxis dataKey="feature" type="category" tickLine={false} tickMargin={10} axisLine={false} width={100} />
26
- <XAxis dataKey="duration" type="number" hide />
27
- <ChartTooltip cursor={false} content={<ChartTooltipContent hideLabel />} />
28
- <Bar dataKey="duration" fill="oklch(54.6% 0.245 262.881)" />
29
- </BarChart>
30
- </ChartContainer>
31
- </>
32
- )
33
- }
1
+ 'use client'
2
+
3
+ import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
4
+ import { Bar, BarChart, XAxis, YAxis } from 'recharts'
5
+
6
+ export default function DurationChart({
7
+ config,
8
+ data,
9
+ }: {
10
+ config: ChartConfig
11
+ data: Array<{ feature: string; duration: number }>
12
+ }) {
13
+ return (
14
+ <>
15
+ <p className="mb-6 mt-2 text-center text-xs text-muted-foreground">Duration by Feature(Seconds)</p>
16
+ <ChartContainer config={config} className="min-h-[300px] w-full">
17
+ <BarChart
18
+ accessibilityLayer
19
+ data={data}
20
+ layout="vertical"
21
+ margin={{
22
+ left: 5,
23
+ }}
24
+ >
25
+ <YAxis dataKey="feature" type="category" tickLine={false} tickMargin={10} axisLine={false} width={100} />
26
+ <XAxis dataKey="duration" type="number" hide />
27
+ <ChartTooltip cursor={false} content={<ChartTooltipContent hideLabel />} />
28
+ <Bar dataKey="duration" fill="oklch(54.6% 0.245 262.881)" />
29
+ </BarChart>
30
+ </ChartContainer>
31
+ </>
32
+ )
33
+ }
@@ -1,78 +1,78 @@
1
- 'use client'
2
-
3
- import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
4
- import { Bar, BarChart, XAxis, YAxis } from 'recharts'
5
-
6
- interface FeatureChartProps {
7
- config: ChartConfig
8
- data: Array<{
9
- feature: string
10
- passed: number
11
- failed: number
12
- cancelled: number
13
- unknown: number
14
- total: number
15
- }>
16
- }
17
-
18
- export default function FeatureChart({ config, data }: FeatureChartProps) {
19
- // Calculate height based on number of items (each bar needs ~40px)
20
- // Set a maximum height to prevent bars from becoming too thick when there are few items
21
- const barHeight = 40
22
- const maxHeight = 300 // Maximum height to prevent bars from becoming too thick
23
- const calculatedHeight = data.length * barHeight
24
- const minHeight = Math.min(Math.max(calculatedHeight, 200), maxHeight) // Cap at maxHeight
25
-
26
- return (
27
- <>
28
- <p className="mb-6 mt-2 text-center text-xs text-muted-foreground">Results by Feature</p>
29
- <ChartContainer
30
- config={config}
31
- className="min-h-[200px] w-full"
32
- style={{ minHeight: `${minHeight}px`, maxHeight: `${maxHeight}px` }}
33
- >
34
- <BarChart
35
- accessibilityLayer
36
- data={data}
37
- layout="vertical"
38
- barCategoryGap="20%"
39
- margin={{
40
- left: 5,
41
- }}
42
- >
43
- <YAxis dataKey="feature" type="category" tickLine={false} tickMargin={10} axisLine={false} width={100} />
44
- <XAxis dataKey="total" type="number" hide />
45
- <ChartTooltip cursor={false} content={<ChartTooltipContent hideLabel />} />
46
- <Bar
47
- dataKey="passed"
48
- stackId="scenarios"
49
- radius={[0, 0, 0, 0]}
50
- fill={config['passed']?.color as string}
51
- stroke="none"
52
- />
53
- <Bar
54
- dataKey="failed"
55
- stackId="scenarios"
56
- radius={[0, 0, 0, 0]}
57
- fill={config['failed']?.color as string}
58
- stroke="none"
59
- />
60
- <Bar
61
- dataKey="cancelled"
62
- stackId="scenarios"
63
- radius={[0, 0, 0, 0]}
64
- fill={config['cancelled']?.color as string}
65
- stroke="none"
66
- />
67
- <Bar
68
- dataKey="unknown"
69
- stackId="scenarios"
70
- radius={[0, 0, 0, 0]}
71
- fill={config['unknown']?.color as string}
72
- stroke="none"
73
- />
74
- </BarChart>
75
- </ChartContainer>
76
- </>
77
- )
78
- }
1
+ 'use client'
2
+
3
+ import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
4
+ import { Bar, BarChart, XAxis, YAxis } from 'recharts'
5
+
6
+ interface FeatureChartProps {
7
+ config: ChartConfig
8
+ data: Array<{
9
+ feature: string
10
+ passed: number
11
+ failed: number
12
+ cancelled: number
13
+ unknown: number
14
+ total: number
15
+ }>
16
+ }
17
+
18
+ export default function FeatureChart({ config, data }: FeatureChartProps) {
19
+ // Calculate height based on number of items (each bar needs ~40px)
20
+ // Set a maximum height to prevent bars from becoming too thick when there are few items
21
+ const barHeight = 40
22
+ const maxHeight = 300 // Maximum height to prevent bars from becoming too thick
23
+ const calculatedHeight = data.length * barHeight
24
+ const minHeight = Math.min(Math.max(calculatedHeight, 200), maxHeight) // Cap at maxHeight
25
+
26
+ return (
27
+ <>
28
+ <p className="mb-6 mt-2 text-center text-xs text-muted-foreground">Results by Feature</p>
29
+ <ChartContainer
30
+ config={config}
31
+ className="min-h-[200px] w-full"
32
+ style={{ minHeight: `${minHeight}px`, maxHeight: `${maxHeight}px` }}
33
+ >
34
+ <BarChart
35
+ accessibilityLayer
36
+ data={data}
37
+ layout="vertical"
38
+ barCategoryGap="20%"
39
+ margin={{
40
+ left: 5,
41
+ }}
42
+ >
43
+ <YAxis dataKey="feature" type="category" tickLine={false} tickMargin={10} axisLine={false} width={100} />
44
+ <XAxis dataKey="total" type="number" hide />
45
+ <ChartTooltip cursor={false} content={<ChartTooltipContent hideLabel />} />
46
+ <Bar
47
+ dataKey="passed"
48
+ stackId="scenarios"
49
+ radius={[0, 0, 0, 0]}
50
+ fill={config['passed']?.color as string}
51
+ stroke="none"
52
+ />
53
+ <Bar
54
+ dataKey="failed"
55
+ stackId="scenarios"
56
+ radius={[0, 0, 0, 0]}
57
+ fill={config['failed']?.color as string}
58
+ stroke="none"
59
+ />
60
+ <Bar
61
+ dataKey="cancelled"
62
+ stackId="scenarios"
63
+ radius={[0, 0, 0, 0]}
64
+ fill={config['cancelled']?.color as string}
65
+ stroke="none"
66
+ />
67
+ <Bar
68
+ dataKey="unknown"
69
+ stackId="scenarios"
70
+ radius={[0, 0, 0, 0]}
71
+ fill={config['unknown']?.color as string}
72
+ stroke="none"
73
+ />
74
+ </BarChart>
75
+ </ChartContainer>
76
+ </>
77
+ )
78
+ }
@@ -1,46 +1,49 @@
1
- 'use client'
2
-
3
- import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
4
- import { Pie, PieChart, Label } from 'recharts'
5
-
6
- interface OverviewChartProps {
7
- config: ChartConfig
8
- data: Array<{ result: string; value: number; fill: string }>
9
- }
10
-
11
- const calculatePassRate = (data: Array<{ result: string; value: number; fill: string }>) => {
12
- const total = data.reduce((acc, curr) => acc + curr.value, 0)
13
- const passed = data.find(item => item.result === 'passed')?.value || 0
14
- return Math.round((passed / total) * 100)
15
- }
16
-
17
- export default function OverviewChart({ config, data }: OverviewChartProps) {
18
- return (
19
- <>
20
- <p className="mt-2 text-center text-xs text-muted-foreground">Status(%) by Feature</p>
21
- <ChartContainer config={config} className="mx-auto aspect-square max-h-[250px]">
22
- <PieChart>
23
- <ChartTooltip cursor={false} content={<ChartTooltipContent hideLabel />} />
24
- <Pie data={data} dataKey="value" nameKey="result" innerRadius={60} strokeWidth={5}>
25
- <Label
26
- content={({ viewBox }) => {
27
- if (viewBox && 'cx' in viewBox && 'cy' in viewBox) {
28
- return (
29
- <text x={viewBox.cx} y={viewBox.cy} textAnchor="middle" dominantBaseline="middle">
30
- <tspan x={viewBox.cx} y={viewBox.cy} className="fill-foreground text-3xl font-bold">
31
- {calculatePassRate(data)}%
32
- </tspan>
33
- <tspan x={viewBox.cx} y={(viewBox.cy || 0) + 24} className="fill-muted-foreground">
34
- Pass Rate
35
- </tspan>
36
- </text>
37
- )
38
- }
39
- }}
40
- />
41
- </Pie>
42
- </PieChart>
43
- </ChartContainer>
44
- </>
45
- )
46
- }
1
+ 'use client'
2
+
3
+ import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart'
4
+ import { Pie, PieChart, Label } from 'recharts'
5
+
6
+ interface OverviewChartProps {
7
+ config: ChartConfig
8
+ data: Array<{ result: string; value: number; fill: string }>
9
+ }
10
+
11
+ const calculatePassRate = (data: Array<{ result: string; value: number; fill: string }>) => {
12
+ const total = data.reduce((acc, curr) => acc + curr.value, 0)
13
+ if (total === 0) {
14
+ return 0
15
+ }
16
+ const passed = data.find(item => item.result === 'passed')?.value || 0
17
+ return Math.round((passed / total) * 100)
18
+ }
19
+
20
+ export default function OverviewChart({ config, data }: OverviewChartProps) {
21
+ return (
22
+ <>
23
+ <p className="mt-2 text-center text-xs text-muted-foreground">Status(%) by Feature</p>
24
+ <ChartContainer config={config} className="mx-auto aspect-square max-h-[250px]">
25
+ <PieChart>
26
+ <ChartTooltip cursor={false} content={<ChartTooltipContent hideLabel />} />
27
+ <Pie data={data} dataKey="value" nameKey="result" innerRadius={60} strokeWidth={5}>
28
+ <Label
29
+ content={({ viewBox }) => {
30
+ if (viewBox && 'cx' in viewBox && 'cy' in viewBox) {
31
+ return (
32
+ <text x={viewBox.cx} y={viewBox.cy} textAnchor="middle" dominantBaseline="middle">
33
+ <tspan x={viewBox.cx} y={viewBox.cy} className="fill-foreground text-3xl font-bold">
34
+ {calculatePassRate(data)}%
35
+ </tspan>
36
+ <tspan x={viewBox.cx} y={(viewBox.cy || 0) + 24} className="fill-muted-foreground">
37
+ Pass Rate
38
+ </tspan>
39
+ </text>
40
+ )
41
+ }
42
+ }}
43
+ />
44
+ </Pie>
45
+ </PieChart>
46
+ </ChartContainer>
47
+ </>
48
+ )
49
+ }
@@ -1,98 +1,98 @@
1
- import PageHeader from '@/components/typography/page-header'
2
- import HeaderSubtitle from '@/components/typography/page-header-subtitle'
3
- import { FileCheck } from 'lucide-react'
4
- import { Metadata } from 'next'
5
- import ReportTable from './report-table'
6
- import EmptyState from '@/components/data-state/empty-state'
7
- import { getAllReportsAction } from '@/actions/reports/report-actions'
8
- import { Prisma } from '@prisma/client'
9
-
10
- type ReportWithRelations = Prisma.ReportGetPayload<{
11
- include: {
12
- testRun: {
13
- include: {
14
- environment: true
15
- tags: true
16
- }
17
- }
18
- testCases: {
19
- include: {
20
- testRunTestCase: {
21
- include: {
22
- testCase: {
23
- include: {
24
- tags: true
25
- }
26
- }
27
- }
28
- }
29
- reportScenario: {
30
- include: {
31
- reportFeature: true
32
- }
33
- }
34
- }
35
- }
36
- }
37
- }>
38
-
39
- export const metadata: Metadata = {
40
- title: 'Appraise | Reports',
41
- description: 'Manage reports for test runs',
42
- }
43
-
44
- const Reports = async () => {
45
- const { data: reports, error: reportsError } = await getAllReportsAction()
46
-
47
- if (reportsError) {
48
- return <div>Error: {reportsError}</div>
49
- }
50
-
51
- // Type guard to validate the data structure
52
- const isValidReportData = (data: unknown): data is ReportWithRelations[] => {
53
- if (!Array.isArray(data)) return false
54
- return data.every(
55
- item =>
56
- item &&
57
- typeof item === 'object' &&
58
- 'id' in item &&
59
- 'testRun' in item &&
60
- 'testCases' in item &&
61
- Array.isArray(item.testCases),
62
- )
63
- }
64
-
65
- if (!reports || !isValidReportData(reports)) {
66
- return <div>Error: Invalid report data format</div>
67
- }
68
-
69
- if (!reports || reports.length === 0) {
70
- return (
71
- <div className="flex min-h-[calc(100vh-20rem)] items-center justify-center">
72
- <EmptyState
73
- icon={<FileCheck className="h-8 w-8" />}
74
- title="No reports found"
75
- description="Get started by creating a test run to generate reports"
76
- createRoute="/test-runs/create"
77
- createText="Create Test Run"
78
- />
79
- </div>
80
- )
81
- }
82
- return (
83
- <>
84
- <div className="mb-8">
85
- <PageHeader>
86
- <span className="flex items-center">
87
- <FileCheck className="mr-2 h-8 w-8" />
88
- Reports
89
- </span>
90
- </PageHeader>
91
- <HeaderSubtitle>Review test execution details, identify patterns, and optimize performance</HeaderSubtitle>
92
- </div>
93
- <ReportTable />
94
- </>
95
- )
96
- }
97
-
98
- export default Reports
1
+ import PageHeader from '@/components/typography/page-header'
2
+ import HeaderSubtitle from '@/components/typography/page-header-subtitle'
3
+ import { FileCheck } from 'lucide-react'
4
+ import { Metadata } from 'next'
5
+ import ReportTable from './report-table'
6
+ import EmptyState from '@/components/data-state/empty-state'
7
+ import { getAllReportsAction } from '@/actions/reports/report-actions'
8
+ import { Prisma } from '@prisma/client'
9
+
10
+ type ReportWithRelations = Prisma.ReportGetPayload<{
11
+ include: {
12
+ testRun: {
13
+ include: {
14
+ environment: true
15
+ tags: true
16
+ }
17
+ }
18
+ testCases: {
19
+ include: {
20
+ testRunTestCase: {
21
+ include: {
22
+ testCase: {
23
+ include: {
24
+ tags: true
25
+ }
26
+ }
27
+ }
28
+ }
29
+ reportScenario: {
30
+ include: {
31
+ reportFeature: true
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }>
38
+
39
+ export const metadata: Metadata = {
40
+ title: 'Appraise | Reports',
41
+ description: 'Manage reports for test runs',
42
+ }
43
+
44
+ const Reports = async () => {
45
+ const { data: reports, error: reportsError } = await getAllReportsAction()
46
+
47
+ if (reportsError) {
48
+ return <div>Error: {reportsError}</div>
49
+ }
50
+
51
+ // Type guard to validate the data structure
52
+ const isValidReportData = (data: unknown): data is ReportWithRelations[] => {
53
+ if (!Array.isArray(data)) return false
54
+ return data.every(
55
+ item =>
56
+ item &&
57
+ typeof item === 'object' &&
58
+ 'id' in item &&
59
+ 'testRun' in item &&
60
+ 'testCases' in item &&
61
+ Array.isArray(item.testCases),
62
+ )
63
+ }
64
+
65
+ if (!reports || !isValidReportData(reports)) {
66
+ return <div>Error: Invalid report data format</div>
67
+ }
68
+
69
+ if (!reports || reports.length === 0) {
70
+ return (
71
+ <div className="flex min-h-[calc(100vh-20rem)] items-center justify-center">
72
+ <EmptyState
73
+ icon={<FileCheck className="h-8 w-8" />}
74
+ title="No reports found"
75
+ description="Get started by creating a test run to generate reports"
76
+ createRoute="/test-runs/create"
77
+ createText="Create Test Run"
78
+ />
79
+ </div>
80
+ )
81
+ }
82
+ return (
83
+ <>
84
+ <div className="mb-8">
85
+ <PageHeader>
86
+ <span className="flex items-center">
87
+ <FileCheck className="mr-2 h-8 w-8" />
88
+ Reports
89
+ </span>
90
+ </PageHeader>
91
+ <HeaderSubtitle>Review test execution details, identify patterns, and optimize performance</HeaderSubtitle>
92
+ </div>
93
+ <ReportTable />
94
+ </>
95
+ )
96
+ }
97
+
98
+ export default Reports