create-appraisejs 0.1.6 → 0.1.8-alpha
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.
- package/README.md +45 -45
- package/dist/cli.js +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/copy-template.d.ts +2 -1
- package/dist/copy-template.d.ts.map +1 -1
- package/dist/copy-template.js +10 -7
- package/dist/copy-template.js.map +1 -1
- package/dist/copy-template.test.js +19 -0
- package/dist/copy-template.test.js.map +1 -1
- package/package.json +69 -67
- package/templates/default/.vscode/settings.json +5 -0
- package/templates/default/appraisejs.config.json +1 -1
- package/templates/default/components.json +24 -24
- package/templates/default/cucumber.mjs +16 -0
- package/templates/default/eslint.config.mjs +15 -15
- package/templates/default/next.config.ts +13 -7
- package/templates/default/package-lock.json +13732 -14321
- package/templates/default/package.json +11 -9
- package/templates/default/postcss.config.mjs +8 -8
- package/templates/default/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
- package/templates/default/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
- package/templates/default/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
- package/templates/default/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
- package/templates/default/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
- package/templates/default/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
- package/templates/default/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
- package/templates/default/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
- package/templates/default/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
- package/templates/default/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
- package/templates/default/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
- package/templates/default/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
- package/templates/default/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
- package/templates/default/prisma/schema.prisma +554 -554
- package/templates/default/scripts/regenerate-features.ts +94 -94
- package/templates/default/scripts/setup-env.ts +19 -19
- package/templates/default/scripts/sync-all.ts +341 -341
- package/templates/default/scripts/sync-appraise-base-template.ts +52 -2
- package/templates/default/scripts/sync-environments.ts +323 -323
- package/templates/default/scripts/sync-locator-groups.ts +413 -413
- package/templates/default/scripts/sync-locators.ts +402 -402
- package/templates/default/scripts/sync-modules.ts +349 -349
- package/templates/default/scripts/sync-tags.ts +292 -292
- package/templates/default/scripts/sync-template-step-groups.ts +399 -399
- package/templates/default/scripts/sync-template-steps.ts +806 -806
- package/templates/default/scripts/sync-test-cases.ts +905 -905
- package/templates/default/scripts/sync-test-suites.ts +411 -411
- package/templates/default/src/actions/conflict/conflict.action.ts +33 -33
- package/templates/default/src/actions/dashboard/dashboard-actions.ts +240 -240
- package/templates/default/src/actions/environments/environment-actions.ts +205 -205
- package/templates/default/src/actions/locator/locator-actions.ts +547 -547
- package/templates/default/src/actions/locator-groups/locator-group-actions.ts +344 -344
- package/templates/default/src/actions/modules/module-actions.ts +133 -133
- package/templates/default/src/actions/reports/report-actions.ts +613 -613
- package/templates/default/src/actions/review/review-actions.ts +147 -147
- package/templates/default/src/actions/tags/tag-actions.ts +104 -104
- package/templates/default/src/actions/template-step/template-step-actions.ts +332 -332
- package/templates/default/src/actions/template-step-group/template-step-group-actions.ts +278 -278
- package/templates/default/src/actions/template-test-case/template-test-case-actions.ts +238 -238
- package/templates/default/src/actions/test-case/test-case-actions.ts +419 -419
- package/templates/default/src/actions/test-run/test-run-actions.ts +1185 -1185
- package/templates/default/src/actions/test-suite/test-suite-actions.ts +253 -253
- package/templates/default/src/actions/user/user-actions.ts +13 -13
- package/templates/default/src/app/(base)/environments/create/page.tsx +28 -28
- package/templates/default/src/app/(base)/environments/environment-form.tsx +219 -219
- package/templates/default/src/app/(base)/environments/environment-table-columns.tsx +96 -96
- package/templates/default/src/app/(base)/environments/environment-table.tsx +24 -24
- package/templates/default/src/app/(base)/environments/modify/[id]/page.tsx +46 -46
- package/templates/default/src/app/(base)/environments/page.tsx +59 -59
- package/templates/default/src/app/(base)/layout.tsx +10 -10
- package/templates/default/src/app/(base)/locator-groups/create/page.tsx +44 -44
- package/templates/default/src/app/(base)/locator-groups/locator-group-form.tsx +215 -215
- package/templates/default/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
- package/templates/default/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
- package/templates/default/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
- package/templates/default/src/app/(base)/locator-groups/page.tsx +61 -61
- package/templates/default/src/app/(base)/locators/create/page.tsx +38 -38
- package/templates/default/src/app/(base)/locators/locator-form.tsx +163 -163
- package/templates/default/src/app/(base)/locators/locator-table-columns.tsx +73 -90
- package/templates/default/src/app/(base)/locators/locator-table.tsx +28 -28
- package/templates/default/src/app/(base)/locators/modify/[id]/page.tsx +45 -45
- package/templates/default/src/app/(base)/locators/page.tsx +65 -65
- package/templates/default/src/app/(base)/locators/sync-locators-button.tsx +66 -66
- package/templates/default/src/app/(base)/modules/create/page.tsx +34 -34
- package/templates/default/src/app/(base)/modules/modify/[id]/page.tsx +46 -46
- package/templates/default/src/app/(base)/modules/module-form.tsx +126 -126
- package/templates/default/src/app/(base)/modules/module-table-columns.tsx +85 -85
- package/templates/default/src/app/(base)/modules/module-table.tsx +24 -24
- package/templates/default/src/app/(base)/modules/page.tsx +59 -59
- package/templates/default/src/app/(base)/reports/[id]/page.tsx +517 -517
- package/templates/default/src/app/(base)/reports/duration-chart.tsx +33 -33
- package/templates/default/src/app/(base)/reports/feature-chart.tsx +78 -78
- package/templates/default/src/app/(base)/reports/overview-chart.tsx +46 -46
- package/templates/default/src/app/(base)/reports/page.tsx +98 -98
- package/templates/default/src/app/(base)/reports/report-metric-card.tsx +16 -16
- package/templates/default/src/app/(base)/reports/report-table-columns.tsx +189 -189
- package/templates/default/src/app/(base)/reports/report-table.tsx +72 -72
- package/templates/default/src/app/(base)/reports/report-view-table-columns.tsx +131 -131
- package/templates/default/src/app/(base)/reports/report-view-table.tsx +82 -82
- package/templates/default/src/app/(base)/reports/test-cases/page.tsx +42 -42
- package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +115 -115
- package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
- package/templates/default/src/app/(base)/reports/test-suites/page.tsx +42 -42
- package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +79 -79
- package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +27 -27
- package/templates/default/src/app/(base)/reports/view-logs-button.tsx +60 -60
- package/templates/default/src/app/(base)/reviews/create/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/created-reviews-table.tsx +15 -15
- package/templates/default/src/app/(base)/reviews/modify/[id]/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/review/[id]/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/review-form.tsx +11 -11
- package/templates/default/src/app/(base)/reviews/review-table-by-creator-columns.tsx +9 -9
- package/templates/default/src/app/(base)/reviews/review-table-by-reviewer-columns.tsx +9 -9
- package/templates/default/src/app/(base)/reviews/reviewer-reviews-table.tsx +15 -15
- package/templates/default/src/app/(base)/tags/create/page.tsx +39 -39
- package/templates/default/src/app/(base)/tags/modify/[id]/page.tsx +50 -50
- package/templates/default/src/app/(base)/tags/page.tsx +58 -58
- package/templates/default/src/app/(base)/tags/tag-form.tsx +147 -147
- package/templates/default/src/app/(base)/tags/tag-table-columns.tsx +63 -63
- package/templates/default/src/app/(base)/tags/tag-table.tsx +29 -29
- package/templates/default/src/app/(base)/template-step-groups/create/page.tsx +28 -28
- package/templates/default/src/app/(base)/template-step-groups/modify/[id]/page.tsx +45 -45
- package/templates/default/src/app/(base)/template-step-groups/page.tsx +60 -60
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-form.tsx +167 -167
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-table-columns.tsx +89 -89
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-table.tsx +32 -32
- package/templates/default/src/app/(base)/template-steps/create/page.tsx +37 -37
- package/templates/default/src/app/(base)/template-steps/modify/[id]/page.tsx +49 -49
- package/templates/default/src/app/(base)/template-steps/page.tsx +59 -59
- package/templates/default/src/app/(base)/template-steps/paramChip.tsx +213 -213
- package/templates/default/src/app/(base)/template-steps/template-step-form.tsx +384 -384
- package/templates/default/src/app/(base)/template-steps/template-step-table-columns.tsx +158 -158
- package/templates/default/src/app/(base)/template-steps/template-step-table.tsx +24 -24
- package/templates/default/src/app/(base)/template-test-cases/create/page.tsx +56 -56
- package/templates/default/src/app/(base)/template-test-cases/modify/[id]/page.tsx +89 -89
- package/templates/default/src/app/(base)/template-test-cases/page.tsx +58 -58
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-flow.tsx +84 -84
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-form.tsx +262 -262
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
- package/templates/default/src/app/(base)/test-cases/create/page.tsx +76 -76
- package/templates/default/src/app/(base)/test-cases/create-from-template/generate/[id]/page.tsx +96 -96
- package/templates/default/src/app/(base)/test-cases/create-from-template/page.tsx +38 -38
- package/templates/default/src/app/(base)/test-cases/create-from-template/template-selection-form.tsx +73 -73
- package/templates/default/src/app/(base)/test-cases/modify/[id]/page.tsx +106 -106
- package/templates/default/src/app/(base)/test-cases/page.tsx +60 -60
- package/templates/default/src/app/(base)/test-cases/test-case-flow.tsx +82 -82
- package/templates/default/src/app/(base)/test-cases/test-case-form.tsx +395 -395
- package/templates/default/src/app/(base)/test-cases/test-case-table-columns.tsx +90 -90
- package/templates/default/src/app/(base)/test-cases/test-case-table.tsx +35 -35
- package/templates/default/src/app/(base)/test-runs/[id]/page.tsx +56 -56
- package/templates/default/src/app/(base)/test-runs/create/page.tsx +47 -47
- package/templates/default/src/app/(base)/test-runs/page.tsx +60 -60
- package/templates/default/src/app/(base)/test-runs/test-run-form.tsx +508 -512
- package/templates/default/src/app/(base)/test-runs/test-run-table-columns.tsx +229 -229
- package/templates/default/src/app/(base)/test-runs/test-run-table.tsx +127 -127
- package/templates/default/src/app/(base)/test-suites/create/page.tsx +45 -45
- package/templates/default/src/app/(base)/test-suites/modify/[id]/page.tsx +55 -55
- package/templates/default/src/app/(base)/test-suites/page.tsx +82 -82
- package/templates/default/src/app/(base)/test-suites/test-suite-form.tsx +269 -269
- package/templates/default/src/app/(base)/test-suites/test-suite-table-columns.tsx +97 -97
- package/templates/default/src/app/(base)/test-suites/test-suite-table.tsx +29 -29
- package/templates/default/src/app/(dashboard-components)/app-drawer.tsx +187 -187
- package/templates/default/src/app/(dashboard-components)/data-card-grid.tsx +12 -12
- package/templates/default/src/app/(dashboard-components)/data-card.tsx +26 -26
- package/templates/default/src/app/(dashboard-components)/execution-health-panel.tsx +56 -56
- package/templates/default/src/app/(dashboard-components)/ongoing-test-runs-card.tsx +87 -87
- package/templates/default/src/app/(dashboard-components)/quick-actions-drawer.tsx +44 -44
- package/templates/default/src/app/api/test-runs/[runId]/download/route.ts +133 -133
- package/templates/default/src/app/api/test-runs/[runId]/logs/route.ts +420 -420
- package/templates/default/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.ts +146 -146
- package/templates/default/src/app/globals.css +147 -147
- package/templates/default/src/app/layout.tsx +171 -171
- package/templates/default/src/app/page.tsx +64 -64
- package/templates/default/src/assets/icons/empty-tube.tsx +23 -23
- package/templates/default/src/assets/icons/tube-plus.tsx +29 -29
- package/templates/default/src/components/base-node.tsx +21 -21
- package/templates/default/src/components/chart/pie-chart.tsx +73 -73
- package/templates/default/src/components/data-extraction/locator-inspector.tsx +460 -460
- package/templates/default/src/components/data-state/empty-state.tsx +40 -40
- package/templates/default/src/components/data-visualization/info-card.tsx +70 -70
- package/templates/default/src/components/data-visualization/info-grid.tsx +22 -22
- package/templates/default/src/components/devtools/providers.tsx +19 -13
- package/templates/default/src/components/diagram/button-edge.tsx +54 -54
- package/templates/default/src/components/diagram/dynamic-parameters.tsx +438 -438
- package/templates/default/src/components/diagram/edit-header-option.tsx +36 -36
- package/templates/default/src/components/diagram/flow-diagram.tsx +470 -470
- package/templates/default/src/components/diagram/node-form.tsx +262 -262
- package/templates/default/src/components/diagram/options-header-node.tsx +57 -57
- package/templates/default/src/components/diagram/template-step-combobox.tsx +155 -155
- package/templates/default/src/components/form/error-message.tsx +7 -7
- package/templates/default/src/components/kokonutui/smooth-tab.tsx +453 -453
- package/templates/default/src/components/loading-skeleton/data-table/data-table-skeleton.tsx +30 -30
- package/templates/default/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
- package/templates/default/src/components/loading-skeleton/form/icon-button-skeleton.tsx +8 -8
- package/templates/default/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
- package/templates/default/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
- package/templates/default/src/components/logo.tsx +15 -15
- package/templates/default/src/components/navigation/command-badge.tsx +34 -34
- package/templates/default/src/components/navigation/command-chain-input.tsx +51 -51
- package/templates/default/src/components/navigation/entity-search-command.tsx +116 -116
- package/templates/default/src/components/navigation/nav-card.tsx +31 -31
- package/templates/default/src/components/navigation/nav-command.tsx +508 -508
- package/templates/default/src/components/navigation/nav-link.tsx +60 -60
- package/templates/default/src/components/navigation/nav-menu-card-deck.tsx +112 -112
- package/templates/default/src/components/node-header.tsx +159 -159
- package/templates/default/src/components/reports/test-case-logs-modal.tsx +253 -253
- package/templates/default/src/components/table/table-actions.tsx +172 -172
- package/templates/default/src/components/test-run/download-logs-button.tsx +99 -99
- package/templates/default/src/components/test-run/log-viewer.tsx +445 -445
- package/templates/default/src/components/test-run/test-run-details.tsx +611 -611
- package/templates/default/src/components/test-run/test-run-header.tsx +149 -149
- package/templates/default/src/components/test-run/view-report-button.tsx +102 -102
- package/templates/default/src/components/theme/mode-toggle.tsx +54 -54
- package/templates/default/src/components/theme/theme-provider.tsx +8 -8
- package/templates/default/src/components/typography/page-header-subtitle.tsx +7 -7
- package/templates/default/src/components/typography/page-header.tsx +7 -7
- package/templates/default/src/components/ui/alert-dialog.tsx +106 -106
- package/templates/default/src/components/ui/alert.tsx +43 -43
- package/templates/default/src/components/ui/avatar.tsx +40 -40
- package/templates/default/src/components/ui/badge.tsx +29 -29
- package/templates/default/src/components/ui/button.tsx +47 -47
- package/templates/default/src/components/ui/calendar.tsx +158 -158
- package/templates/default/src/components/ui/card.tsx +43 -43
- package/templates/default/src/components/ui/checkbox.tsx +28 -28
- package/templates/default/src/components/ui/command.tsx +135 -135
- package/templates/default/src/components/ui/data-table-column-header.tsx +61 -61
- package/templates/default/src/components/ui/data-table-pagination.tsx +87 -87
- package/templates/default/src/components/ui/data-table-view-options.tsx +50 -50
- package/templates/default/src/components/ui/data-table.tsx +267 -267
- package/templates/default/src/components/ui/dialog.tsx +97 -97
- package/templates/default/src/components/ui/dropdown-menu.tsx +182 -182
- package/templates/default/src/components/ui/input.tsx +22 -22
- package/templates/default/src/components/ui/kbd.tsx +28 -28
- package/templates/default/src/components/ui/label.tsx +19 -19
- package/templates/default/src/components/ui/loading.tsx +12 -12
- package/templates/default/src/components/ui/multi-select-with-preview.tsx +116 -116
- package/templates/default/src/components/ui/multi-select.tsx +142 -142
- package/templates/default/src/components/ui/navigation-menu.tsx +120 -120
- package/templates/default/src/components/ui/popover.tsx +33 -33
- package/templates/default/src/components/ui/progress.tsx +25 -25
- package/templates/default/src/components/ui/radio-group.tsx +44 -44
- package/templates/default/src/components/ui/scroll-area.tsx +40 -40
- package/templates/default/src/components/ui/select.tsx +151 -144
- package/templates/default/src/components/ui/separator.tsx +22 -22
- package/templates/default/src/components/ui/skeleton.tsx +7 -7
- package/templates/default/src/components/ui/table.tsx +76 -76
- package/templates/default/src/components/ui/tabs.tsx +55 -55
- package/templates/default/src/components/ui/textarea.tsx +21 -21
- package/templates/default/src/components/ui/toast.tsx +113 -113
- package/templates/default/src/components/ui/toaster.tsx +26 -26
- package/templates/default/src/components/user-prompt/delete-prompt.tsx +87 -87
- package/templates/default/src/config/db-config.ts +10 -10
- package/templates/default/src/constants/form-opts/diagram/node-form.ts +30 -30
- package/templates/default/src/constants/form-opts/environment-form-opts.ts +24 -24
- package/templates/default/src/constants/form-opts/locator-form-opts.ts +20 -20
- package/templates/default/src/constants/form-opts/locator-group-form-opts.ts +28 -28
- package/templates/default/src/constants/form-opts/module-form-opts.ts +21 -21
- package/templates/default/src/constants/form-opts/review-form-opts.ts +23 -23
- package/templates/default/src/constants/form-opts/tag-form-opts.ts +42 -42
- package/templates/default/src/constants/form-opts/template-selection-form-opts.ts +16 -16
- package/templates/default/src/constants/form-opts/template-step-group-form-opts.ts +24 -24
- package/templates/default/src/constants/form-opts/template-test-case-form-opts.ts +39 -39
- package/templates/default/src/constants/form-opts/template-test-step-form-opts.ts +36 -36
- package/templates/default/src/constants/form-opts/test-case-form-opts.ts +43 -43
- package/templates/default/src/constants/form-opts/test-run-form-opts.ts +31 -31
- package/templates/default/src/constants/form-opts/test-suite-form-opts.ts +24 -24
- package/templates/default/src/hooks/use-toast.ts +187 -187
- package/templates/default/src/lib/bidirectional-sync.ts +432 -432
- package/templates/default/src/lib/database-sync.ts +531 -531
- package/templates/default/src/lib/environment-file-utils.ts +221 -221
- package/templates/default/src/lib/feature-file-generator.ts +411 -411
- package/templates/default/src/lib/gherkin-parser.ts +259 -259
- package/templates/default/src/lib/locator-group-file-utils.ts +370 -370
- package/templates/default/src/lib/metrics/metric-calculator.ts +613 -613
- package/templates/default/src/lib/module-hierarchy-builder.ts +205 -205
- package/templates/default/src/lib/path-helpers/module-path.ts +71 -71
- package/templates/default/src/lib/test-case-utils.ts +6 -6
- package/templates/default/src/lib/test-run/log-formatter.ts +83 -83
- package/templates/default/src/lib/test-run/process-manager.ts +191 -191
- package/templates/default/src/lib/test-run/report-parser.ts +316 -316
- package/templates/default/src/lib/test-run/test-run-executor.ts +144 -144
- package/templates/default/src/lib/test-run/winston-logger.ts +95 -95
- package/templates/default/src/lib/transformers/gherkin-converter.ts +42 -42
- package/templates/default/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
- package/templates/default/src/lib/transformers/template-test-case-converter.ts +160 -160
- package/templates/default/src/lib/utils/node-param-validation.ts +81 -81
- package/templates/default/src/lib/utils/template-step-file-generator.ts +167 -167
- package/templates/default/src/lib/utils/template-step-file-manager-intelligent.ts +723 -723
- package/templates/default/src/lib/utils/template-step-file-manager.ts +166 -166
- package/templates/default/src/lib/utils.ts +31 -31
- package/templates/default/src/tests/config/executor/world.ts +41 -41
- package/templates/default/src/tests/executor.ts +80 -80
- package/templates/default/src/tests/hooks/hooks.ts +99 -99
- package/templates/default/src/tests/mapping/locator-map.json +1 -1
- package/templates/default/src/tests/steps/actions/click.step.ts +62 -62
- package/templates/default/src/tests/steps/actions/navigation.step.ts +73 -72
- package/templates/default/src/tests/steps/validations/active_state_assertion.step.ts +34 -34
- package/templates/default/src/tests/steps/validations/navigation_assertion.step.ts +24 -23
- package/templates/default/src/tests/steps/validations/text_assertion.step.ts +111 -111
- package/templates/default/src/tests/steps/validations/visibility_assertion.step.ts +30 -30
- package/templates/default/src/tests/support/parameter-types.ts +12 -12
- package/templates/default/src/tests/utils/cache.util.ts +260 -260
- package/templates/default/src/tests/utils/cli.util.ts +177 -177
- package/templates/default/src/tests/utils/environment.util.ts +65 -65
- package/templates/default/src/tests/utils/locator.util.ts +248 -248
- package/templates/default/src/tests/utils/random-data.util.ts +44 -44
- package/templates/default/src/tests/utils/spawner.util.ts +617 -617
- package/templates/default/src/types/diagram/diagram.ts +34 -34
- package/templates/default/src/types/diagram/template-step.ts +11 -11
- package/templates/default/src/types/executor/browser.type.ts +1 -1
- package/templates/default/src/types/form/actionHandler.ts +6 -6
- package/templates/default/src/types/locator/locator.type.ts +11 -11
- package/templates/default/src/types/step/step.type.ts +1 -1
- package/templates/default/src/types/table/data-table.ts +6 -6
- package/templates/default/tailwind.config.ts +62 -62
- package/templates/default/.env +0 -2
- package/templates/default/next-env.d.ts +0 -6
- package/templates/default/prisma/prisma/dev.db +0 -0
- package/templates/default/src/tests/config/environments/environments.json +0 -14
|
@@ -1,127 +1,127 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import { deleteTestRunAction, getTestRunByIdAction } from '@/actions/test-run/test-run-actions'
|
|
4
|
-
import { DataTable } from '@/components/ui/data-table'
|
|
5
|
-
import { Environment, Tag, TestRun, TestRunTestCase, TestRunStatus } from '@prisma/client'
|
|
6
|
-
import React, { useEffect, useState, useRef, useMemo } from 'react'
|
|
7
|
-
import { testRunTableCols } from './test-run-table-columns'
|
|
8
|
-
|
|
9
|
-
type TestRunData = TestRun & { testCases: TestRunTestCase[]; tags: Tag[]; environment: Environment }
|
|
10
|
-
|
|
11
|
-
interface TestRunTableProps {
|
|
12
|
-
initialData: TestRunData[]
|
|
13
|
-
filter: 'recentFailed' | 'all'
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const TestRunTable = ({ initialData, filter = 'all' }: TestRunTableProps) => {
|
|
17
|
-
const [testRuns, setTestRuns] = useState<TestRunData[]>(initialData)
|
|
18
|
-
const pollingRef = useRef<NodeJS.Timeout | null>(null)
|
|
19
|
-
|
|
20
|
-
// Memoize running test run IDs to avoid unnecessary effect re-runs
|
|
21
|
-
// Include RUNNING, QUEUED, and CANCELLING statuses for polling
|
|
22
|
-
const runningTestRunIds = useMemo(() => {
|
|
23
|
-
return testRuns
|
|
24
|
-
.filter(
|
|
25
|
-
tr =>
|
|
26
|
-
tr.status === TestRunStatus.RUNNING ||
|
|
27
|
-
tr.status === TestRunStatus.QUEUED ||
|
|
28
|
-
tr.status === TestRunStatus.CANCELLING,
|
|
29
|
-
)
|
|
30
|
-
.map(tr => tr.id)
|
|
31
|
-
}, [testRuns])
|
|
32
|
-
|
|
33
|
-
// Create a stable dependency string for useEffect
|
|
34
|
-
const runningTestRunIdsKey = useMemo(() => runningTestRunIds.join(','), [runningTestRunIds])
|
|
35
|
-
|
|
36
|
-
// Poll for status updates while test runs are running
|
|
37
|
-
useEffect(() => {
|
|
38
|
-
// Clear any existing polling interval
|
|
39
|
-
if (pollingRef.current) {
|
|
40
|
-
clearInterval(pollingRef.current)
|
|
41
|
-
pollingRef.current = null
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// If no running test runs, don't poll
|
|
45
|
-
if (runningTestRunIds.length === 0) {
|
|
46
|
-
return
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
pollingRef.current = setInterval(async () => {
|
|
50
|
-
try {
|
|
51
|
-
// Poll only running test runs in parallel
|
|
52
|
-
const updatePromises = runningTestRunIds.map(async id => {
|
|
53
|
-
const { data, error } = await getTestRunByIdAction(id)
|
|
54
|
-
if (error || !data) {
|
|
55
|
-
return null
|
|
56
|
-
}
|
|
57
|
-
// getTestRunByIdAction returns testCases with nested testCase, but we need to flatten it
|
|
58
|
-
const testRun = data as TestRun & {
|
|
59
|
-
testCases: (TestRunTestCase & { testCase: { title: string } })[]
|
|
60
|
-
tags: Tag[]
|
|
61
|
-
environment: Environment
|
|
62
|
-
}
|
|
63
|
-
// Convert to the format expected by the table (flatten testCases)
|
|
64
|
-
return {
|
|
65
|
-
...testRun,
|
|
66
|
-
testCases: testRun.testCases.map(tc => ({
|
|
67
|
-
id: tc.id,
|
|
68
|
-
testRunId: tc.testRunId,
|
|
69
|
-
testCaseId: tc.testCaseId,
|
|
70
|
-
status: tc.status,
|
|
71
|
-
result: tc.result,
|
|
72
|
-
})) as TestRunTestCase[],
|
|
73
|
-
} as TestRunData
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
const updates = await Promise.all(updatePromises)
|
|
77
|
-
const validUpdates = updates.filter((u): u is TestRunData => u !== null)
|
|
78
|
-
|
|
79
|
-
// Update only the changed test runs
|
|
80
|
-
setTestRuns(prev =>
|
|
81
|
-
prev.map(tr => {
|
|
82
|
-
const update = validUpdates.find(u => u.id === tr.id)
|
|
83
|
-
return update || tr
|
|
84
|
-
}),
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
// Check if any are still running (including CANCELLING)
|
|
88
|
-
const stillRunning = validUpdates.filter(
|
|
89
|
-
u =>
|
|
90
|
-
u.status === TestRunStatus.RUNNING ||
|
|
91
|
-
u.status === TestRunStatus.QUEUED ||
|
|
92
|
-
u.status === TestRunStatus.CANCELLING,
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
// If no test runs are running anymore, stop polling
|
|
96
|
-
if (stillRunning.length === 0 && pollingRef.current) {
|
|
97
|
-
clearInterval(pollingRef.current)
|
|
98
|
-
pollingRef.current = null
|
|
99
|
-
}
|
|
100
|
-
} catch (error) {
|
|
101
|
-
console.error('Error polling test runs status:', error)
|
|
102
|
-
}
|
|
103
|
-
}, 2000) // Poll every 2 seconds
|
|
104
|
-
|
|
105
|
-
return () => {
|
|
106
|
-
if (pollingRef.current) {
|
|
107
|
-
clearInterval(pollingRef.current)
|
|
108
|
-
pollingRef.current = null
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}, [runningTestRunIdsKey, runningTestRunIds])
|
|
112
|
-
|
|
113
|
-
return (
|
|
114
|
-
<>
|
|
115
|
-
<DataTable
|
|
116
|
-
columns={testRunTableCols}
|
|
117
|
-
data={testRuns}
|
|
118
|
-
filterColumn="name"
|
|
119
|
-
filterPlaceholder="Filter by name..."
|
|
120
|
-
deleteAction={deleteTestRunAction}
|
|
121
|
-
createLink={filter === 'all' ? '/test-runs/create' : undefined}
|
|
122
|
-
/>
|
|
123
|
-
</>
|
|
124
|
-
)
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export default TestRunTable
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { deleteTestRunAction, getTestRunByIdAction } from '@/actions/test-run/test-run-actions'
|
|
4
|
+
import { DataTable } from '@/components/ui/data-table'
|
|
5
|
+
import { Environment, Tag, TestRun, TestRunTestCase, TestRunStatus } from '@prisma/client'
|
|
6
|
+
import React, { useEffect, useState, useRef, useMemo } from 'react'
|
|
7
|
+
import { testRunTableCols } from './test-run-table-columns'
|
|
8
|
+
|
|
9
|
+
type TestRunData = TestRun & { testCases: TestRunTestCase[]; tags: Tag[]; environment: Environment }
|
|
10
|
+
|
|
11
|
+
interface TestRunTableProps {
|
|
12
|
+
initialData: TestRunData[]
|
|
13
|
+
filter: 'recentFailed' | 'all'
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const TestRunTable = ({ initialData, filter = 'all' }: TestRunTableProps) => {
|
|
17
|
+
const [testRuns, setTestRuns] = useState<TestRunData[]>(initialData)
|
|
18
|
+
const pollingRef = useRef<NodeJS.Timeout | null>(null)
|
|
19
|
+
|
|
20
|
+
// Memoize running test run IDs to avoid unnecessary effect re-runs
|
|
21
|
+
// Include RUNNING, QUEUED, and CANCELLING statuses for polling
|
|
22
|
+
const runningTestRunIds = useMemo(() => {
|
|
23
|
+
return testRuns
|
|
24
|
+
.filter(
|
|
25
|
+
tr =>
|
|
26
|
+
tr.status === TestRunStatus.RUNNING ||
|
|
27
|
+
tr.status === TestRunStatus.QUEUED ||
|
|
28
|
+
tr.status === TestRunStatus.CANCELLING,
|
|
29
|
+
)
|
|
30
|
+
.map(tr => tr.id)
|
|
31
|
+
}, [testRuns])
|
|
32
|
+
|
|
33
|
+
// Create a stable dependency string for useEffect
|
|
34
|
+
const runningTestRunIdsKey = useMemo(() => runningTestRunIds.join(','), [runningTestRunIds])
|
|
35
|
+
|
|
36
|
+
// Poll for status updates while test runs are running
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
// Clear any existing polling interval
|
|
39
|
+
if (pollingRef.current) {
|
|
40
|
+
clearInterval(pollingRef.current)
|
|
41
|
+
pollingRef.current = null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// If no running test runs, don't poll
|
|
45
|
+
if (runningTestRunIds.length === 0) {
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
pollingRef.current = setInterval(async () => {
|
|
50
|
+
try {
|
|
51
|
+
// Poll only running test runs in parallel
|
|
52
|
+
const updatePromises = runningTestRunIds.map(async id => {
|
|
53
|
+
const { data, error } = await getTestRunByIdAction(id)
|
|
54
|
+
if (error || !data) {
|
|
55
|
+
return null
|
|
56
|
+
}
|
|
57
|
+
// getTestRunByIdAction returns testCases with nested testCase, but we need to flatten it
|
|
58
|
+
const testRun = data as TestRun & {
|
|
59
|
+
testCases: (TestRunTestCase & { testCase: { title: string } })[]
|
|
60
|
+
tags: Tag[]
|
|
61
|
+
environment: Environment
|
|
62
|
+
}
|
|
63
|
+
// Convert to the format expected by the table (flatten testCases)
|
|
64
|
+
return {
|
|
65
|
+
...testRun,
|
|
66
|
+
testCases: testRun.testCases.map(tc => ({
|
|
67
|
+
id: tc.id,
|
|
68
|
+
testRunId: tc.testRunId,
|
|
69
|
+
testCaseId: tc.testCaseId,
|
|
70
|
+
status: tc.status,
|
|
71
|
+
result: tc.result,
|
|
72
|
+
})) as TestRunTestCase[],
|
|
73
|
+
} as TestRunData
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
const updates = await Promise.all(updatePromises)
|
|
77
|
+
const validUpdates = updates.filter((u): u is TestRunData => u !== null)
|
|
78
|
+
|
|
79
|
+
// Update only the changed test runs
|
|
80
|
+
setTestRuns(prev =>
|
|
81
|
+
prev.map(tr => {
|
|
82
|
+
const update = validUpdates.find(u => u.id === tr.id)
|
|
83
|
+
return update || tr
|
|
84
|
+
}),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
// Check if any are still running (including CANCELLING)
|
|
88
|
+
const stillRunning = validUpdates.filter(
|
|
89
|
+
u =>
|
|
90
|
+
u.status === TestRunStatus.RUNNING ||
|
|
91
|
+
u.status === TestRunStatus.QUEUED ||
|
|
92
|
+
u.status === TestRunStatus.CANCELLING,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
// If no test runs are running anymore, stop polling
|
|
96
|
+
if (stillRunning.length === 0 && pollingRef.current) {
|
|
97
|
+
clearInterval(pollingRef.current)
|
|
98
|
+
pollingRef.current = null
|
|
99
|
+
}
|
|
100
|
+
} catch (error) {
|
|
101
|
+
console.error('Error polling test runs status:', error)
|
|
102
|
+
}
|
|
103
|
+
}, 2000) // Poll every 2 seconds
|
|
104
|
+
|
|
105
|
+
return () => {
|
|
106
|
+
if (pollingRef.current) {
|
|
107
|
+
clearInterval(pollingRef.current)
|
|
108
|
+
pollingRef.current = null
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}, [runningTestRunIdsKey, runningTestRunIds])
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
<>
|
|
115
|
+
<DataTable
|
|
116
|
+
columns={testRunTableCols}
|
|
117
|
+
data={testRuns}
|
|
118
|
+
filterColumn="name"
|
|
119
|
+
filterPlaceholder="Filter by name..."
|
|
120
|
+
deleteAction={deleteTestRunAction}
|
|
121
|
+
createLink={filter === 'all' ? '/test-runs/create' : undefined}
|
|
122
|
+
/>
|
|
123
|
+
</>
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export default TestRunTable
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import { createTestSuiteAction } from '@/actions/test-suite/test-suite-actions'
|
|
2
|
-
import { TestSuiteForm } from '../test-suite-form'
|
|
3
|
-
import PageHeader from '@/components/typography/page-header'
|
|
4
|
-
import HeaderSubtitle from '@/components/typography/page-header-subtitle'
|
|
5
|
-
import { getAllTestCasesAction } from '@/actions/test-case/test-case-actions'
|
|
6
|
-
import { Module, TestCase, Tag } from '@prisma/client'
|
|
7
|
-
import { getAllModulesAction } from '@/actions/modules/module-actions'
|
|
8
|
-
import { getAllTagsAction } from '@/actions/tags/tag-actions'
|
|
9
|
-
import { Metadata } from 'next'
|
|
10
|
-
|
|
11
|
-
export const metadata: Metadata = {
|
|
12
|
-
title: 'Appraise | Create Test Suite',
|
|
13
|
-
description: 'Create a new test suite to run your tests against',
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const CreateTestSuite = async () => {
|
|
17
|
-
const { data: testCases, error: testCasesError } = await getAllTestCasesAction()
|
|
18
|
-
|
|
19
|
-
const { data: moduleList, error: moduleListError } = await getAllModulesAction()
|
|
20
|
-
|
|
21
|
-
const { data: tags, error: tagsError } = await getAllTagsAction()
|
|
22
|
-
|
|
23
|
-
if (testCasesError || moduleListError || tagsError) {
|
|
24
|
-
return <div>Error: {testCasesError || moduleListError || tagsError}</div>
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return (
|
|
28
|
-
<>
|
|
29
|
-
<div className="mb-8">
|
|
30
|
-
<PageHeader>Create Test Suite</PageHeader>
|
|
31
|
-
<HeaderSubtitle>Create a new test suite to run your tests against</HeaderSubtitle>
|
|
32
|
-
</div>
|
|
33
|
-
<TestSuiteForm
|
|
34
|
-
successTitle="Suite created"
|
|
35
|
-
successMessage="Test suite created successfully"
|
|
36
|
-
onSubmitAction={createTestSuiteAction}
|
|
37
|
-
testCases={testCases as TestCase[]}
|
|
38
|
-
moduleList={moduleList as Module[]}
|
|
39
|
-
tags={tags as Tag[]}
|
|
40
|
-
/>
|
|
41
|
-
</>
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export default CreateTestSuite
|
|
1
|
+
import { createTestSuiteAction } from '@/actions/test-suite/test-suite-actions'
|
|
2
|
+
import { TestSuiteForm } from '../test-suite-form'
|
|
3
|
+
import PageHeader from '@/components/typography/page-header'
|
|
4
|
+
import HeaderSubtitle from '@/components/typography/page-header-subtitle'
|
|
5
|
+
import { getAllTestCasesAction } from '@/actions/test-case/test-case-actions'
|
|
6
|
+
import { Module, TestCase, Tag } from '@prisma/client'
|
|
7
|
+
import { getAllModulesAction } from '@/actions/modules/module-actions'
|
|
8
|
+
import { getAllTagsAction } from '@/actions/tags/tag-actions'
|
|
9
|
+
import { Metadata } from 'next'
|
|
10
|
+
|
|
11
|
+
export const metadata: Metadata = {
|
|
12
|
+
title: 'Appraise | Create Test Suite',
|
|
13
|
+
description: 'Create a new test suite to run your tests against',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const CreateTestSuite = async () => {
|
|
17
|
+
const { data: testCases, error: testCasesError } = await getAllTestCasesAction()
|
|
18
|
+
|
|
19
|
+
const { data: moduleList, error: moduleListError } = await getAllModulesAction()
|
|
20
|
+
|
|
21
|
+
const { data: tags, error: tagsError } = await getAllTagsAction()
|
|
22
|
+
|
|
23
|
+
if (testCasesError || moduleListError || tagsError) {
|
|
24
|
+
return <div>Error: {testCasesError || moduleListError || tagsError}</div>
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<>
|
|
29
|
+
<div className="mb-8">
|
|
30
|
+
<PageHeader>Create Test Suite</PageHeader>
|
|
31
|
+
<HeaderSubtitle>Create a new test suite to run your tests against</HeaderSubtitle>
|
|
32
|
+
</div>
|
|
33
|
+
<TestSuiteForm
|
|
34
|
+
successTitle="Suite created"
|
|
35
|
+
successMessage="Test suite created successfully"
|
|
36
|
+
onSubmitAction={createTestSuiteAction}
|
|
37
|
+
testCases={testCases as TestCase[]}
|
|
38
|
+
moduleList={moduleList as Module[]}
|
|
39
|
+
tags={tags as Tag[]}
|
|
40
|
+
/>
|
|
41
|
+
</>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default CreateTestSuite
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import { getTestSuiteByIdAction, updateTestSuiteAction } from '@/actions/test-suite/test-suite-actions'
|
|
2
|
-
import { TestSuiteForm } from '../../test-suite-form'
|
|
3
|
-
import React from 'react'
|
|
4
|
-
import { TestSuite, Tag } from '@prisma/client'
|
|
5
|
-
import { getAllTestCasesAction } from '@/actions/test-case/test-case-actions'
|
|
6
|
-
import { Module, TestCase } from '@prisma/client'
|
|
7
|
-
import { getAllModulesAction } from '@/actions/modules/module-actions'
|
|
8
|
-
import { getAllTagsAction } from '@/actions/tags/tag-actions'
|
|
9
|
-
import { Metadata } from 'next'
|
|
10
|
-
|
|
11
|
-
export const metadata: Metadata = {
|
|
12
|
-
title: 'Appraise | Modify Test Suite',
|
|
13
|
-
description: 'Update test suite configuration',
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const ModifyTestSuite = async ({ params }: { params: Promise<{ id: string }> }) => {
|
|
17
|
-
const { id } = await params
|
|
18
|
-
const { data: testSuite, error } = await getTestSuiteByIdAction(id)
|
|
19
|
-
const { data: testCases } = await getAllTestCasesAction()
|
|
20
|
-
|
|
21
|
-
const { data: moduleList, error: moduleListError } = await getAllModulesAction()
|
|
22
|
-
|
|
23
|
-
const { data: tags, error: tagsError } = await getAllTagsAction()
|
|
24
|
-
|
|
25
|
-
if (error || moduleListError || tagsError) {
|
|
26
|
-
return <div>Error: {error || moduleListError || tagsError}</div>
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const testSuiteData = testSuite as TestSuite & {
|
|
30
|
-
testCases: TestCase[]
|
|
31
|
-
module: Module
|
|
32
|
-
tags: Tag[]
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return (
|
|
36
|
-
<TestSuiteForm
|
|
37
|
-
defaultValues={{
|
|
38
|
-
name: testSuiteData.name ?? '',
|
|
39
|
-
description: testSuiteData.description ?? '',
|
|
40
|
-
testCases: testSuiteData.testCases.map(testCase => testCase.id),
|
|
41
|
-
moduleId: testSuiteData.moduleId ?? '',
|
|
42
|
-
tagIds: testSuiteData.tags?.map(tag => tag.id) || [],
|
|
43
|
-
}}
|
|
44
|
-
successTitle="Suite updated"
|
|
45
|
-
successMessage="Test suite updated successfully"
|
|
46
|
-
onSubmitAction={updateTestSuiteAction}
|
|
47
|
-
id={id}
|
|
48
|
-
testCases={testCases as TestCase[]}
|
|
49
|
-
moduleList={moduleList as Module[]}
|
|
50
|
-
tags={tags as Tag[]}
|
|
51
|
-
/>
|
|
52
|
-
)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export default ModifyTestSuite
|
|
1
|
+
import { getTestSuiteByIdAction, updateTestSuiteAction } from '@/actions/test-suite/test-suite-actions'
|
|
2
|
+
import { TestSuiteForm } from '../../test-suite-form'
|
|
3
|
+
import React from 'react'
|
|
4
|
+
import { TestSuite, Tag } from '@prisma/client'
|
|
5
|
+
import { getAllTestCasesAction } from '@/actions/test-case/test-case-actions'
|
|
6
|
+
import { Module, TestCase } from '@prisma/client'
|
|
7
|
+
import { getAllModulesAction } from '@/actions/modules/module-actions'
|
|
8
|
+
import { getAllTagsAction } from '@/actions/tags/tag-actions'
|
|
9
|
+
import { Metadata } from 'next'
|
|
10
|
+
|
|
11
|
+
export const metadata: Metadata = {
|
|
12
|
+
title: 'Appraise | Modify Test Suite',
|
|
13
|
+
description: 'Update test suite configuration',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const ModifyTestSuite = async ({ params }: { params: Promise<{ id: string }> }) => {
|
|
17
|
+
const { id } = await params
|
|
18
|
+
const { data: testSuite, error } = await getTestSuiteByIdAction(id)
|
|
19
|
+
const { data: testCases } = await getAllTestCasesAction()
|
|
20
|
+
|
|
21
|
+
const { data: moduleList, error: moduleListError } = await getAllModulesAction()
|
|
22
|
+
|
|
23
|
+
const { data: tags, error: tagsError } = await getAllTagsAction()
|
|
24
|
+
|
|
25
|
+
if (error || moduleListError || tagsError) {
|
|
26
|
+
return <div>Error: {error || moduleListError || tagsError}</div>
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const testSuiteData = testSuite as TestSuite & {
|
|
30
|
+
testCases: TestCase[]
|
|
31
|
+
module: Module
|
|
32
|
+
tags: Tag[]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<TestSuiteForm
|
|
37
|
+
defaultValues={{
|
|
38
|
+
name: testSuiteData.name ?? '',
|
|
39
|
+
description: testSuiteData.description ?? '',
|
|
40
|
+
testCases: testSuiteData.testCases.map(testCase => testCase.id),
|
|
41
|
+
moduleId: testSuiteData.moduleId ?? '',
|
|
42
|
+
tagIds: testSuiteData.tags?.map(tag => tag.id) || [],
|
|
43
|
+
}}
|
|
44
|
+
successTitle="Suite updated"
|
|
45
|
+
successMessage="Test suite updated successfully"
|
|
46
|
+
onSubmitAction={updateTestSuiteAction}
|
|
47
|
+
id={id}
|
|
48
|
+
testCases={testCases as TestCase[]}
|
|
49
|
+
moduleList={moduleList as Module[]}
|
|
50
|
+
tags={tags as Tag[]}
|
|
51
|
+
/>
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export default ModifyTestSuite
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import PageHeader from '@/components/typography/page-header'
|
|
2
|
-
import HeaderSubtitle from '@/components/typography/page-header-subtitle'
|
|
3
|
-
import { TestTubes } from 'lucide-react'
|
|
4
|
-
import TestSuiteTable from './test-suite-table'
|
|
5
|
-
import { Suspense } from 'react'
|
|
6
|
-
import DataTableSkeleton from '@/components/loading-skeleton/data-table/data-table-skeleton'
|
|
7
|
-
import { getAllTestSuitesAction } from '@/actions/test-suite/test-suite-actions'
|
|
8
|
-
import { TestCase, TestSuite } from '@prisma/client'
|
|
9
|
-
import InfoGrid from '@/components/data-visualization/info-grid'
|
|
10
|
-
import EmptyState from '@/components/data-state/empty-state'
|
|
11
|
-
import { Metadata } from 'next'
|
|
12
|
-
import { TubePlus } from '@/assets/icons/tube-plus'
|
|
13
|
-
import EmptyTube from '@/assets/icons/empty-tube'
|
|
14
|
-
|
|
15
|
-
export const metadata: Metadata = {
|
|
16
|
-
title: 'Appraise | Test Suites',
|
|
17
|
-
description: 'Manage test suites and their configurations',
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const TestSuites = async () => {
|
|
21
|
-
const { data: testSuites, error: testSuitesError } = await getAllTestSuitesAction()
|
|
22
|
-
|
|
23
|
-
if (testSuitesError) {
|
|
24
|
-
return <div>Error: {testSuitesError}</div>
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const testSuitesData = testSuites as (TestSuite & { testCases: TestCase[] })[]
|
|
28
|
-
const emptyTestSuites = testSuitesData.filter(testSuite => testSuite.testCases.length === 0)
|
|
29
|
-
const latestCreatedTestSuite = testSuitesData.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())[0]
|
|
30
|
-
|
|
31
|
-
if (testSuitesData.length === 0) {
|
|
32
|
-
return (
|
|
33
|
-
<div className="flex min-h-[calc(100vh-20rem)] items-center justify-center">
|
|
34
|
-
<EmptyState
|
|
35
|
-
icon={<TestTubes className="h-8 w-8" />}
|
|
36
|
-
title="No test suites found"
|
|
37
|
-
description="Get started by creating a test suite and grouping tests together"
|
|
38
|
-
createRoute="/test-suites/create"
|
|
39
|
-
createText="Create Test Suite"
|
|
40
|
-
/>
|
|
41
|
-
</div>
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
return (
|
|
45
|
-
<>
|
|
46
|
-
<div className="mb-8">
|
|
47
|
-
<PageHeader>
|
|
48
|
-
<span className="flex items-center">
|
|
49
|
-
<TestTubes className="mr-2 h-8 w-8" />
|
|
50
|
-
Test Suites
|
|
51
|
-
</span>
|
|
52
|
-
</PageHeader>
|
|
53
|
-
<HeaderSubtitle>
|
|
54
|
-
Test suites are collections of tests that are used to test a specific feature or functionality
|
|
55
|
-
</HeaderSubtitle>
|
|
56
|
-
<InfoGrid
|
|
57
|
-
infoCards={[
|
|
58
|
-
{
|
|
59
|
-
showHighlightGroup: testSuitesData.length > 0,
|
|
60
|
-
highlight: emptyTestSuites.length.toString(),
|
|
61
|
-
legend: 'Empty test suite(s)',
|
|
62
|
-
defaultText: 'Empty test suites count. Will update when test suites are created.',
|
|
63
|
-
icon: <EmptyTube className="h-12 w-12 rounded-sm bg-muted p-2" />,
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
showHighlightGroup: testSuitesData.length > 0,
|
|
67
|
-
highlight: latestCreatedTestSuite ? latestCreatedTestSuite.name : 'N/A',
|
|
68
|
-
legend: 'Latest test suite',
|
|
69
|
-
defaultText: 'Latest created test suite. Will update when test suites are created.',
|
|
70
|
-
icon: <TubePlus className="h-12 w-12 rounded-sm bg-muted p-2" />,
|
|
71
|
-
},
|
|
72
|
-
]}
|
|
73
|
-
/>
|
|
74
|
-
</div>
|
|
75
|
-
<Suspense fallback={<DataTableSkeleton />}>
|
|
76
|
-
<TestSuiteTable />
|
|
77
|
-
</Suspense>
|
|
78
|
-
</>
|
|
79
|
-
)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export default TestSuites
|
|
1
|
+
import PageHeader from '@/components/typography/page-header'
|
|
2
|
+
import HeaderSubtitle from '@/components/typography/page-header-subtitle'
|
|
3
|
+
import { TestTubes } from 'lucide-react'
|
|
4
|
+
import TestSuiteTable from './test-suite-table'
|
|
5
|
+
import { Suspense } from 'react'
|
|
6
|
+
import DataTableSkeleton from '@/components/loading-skeleton/data-table/data-table-skeleton'
|
|
7
|
+
import { getAllTestSuitesAction } from '@/actions/test-suite/test-suite-actions'
|
|
8
|
+
import { TestCase, TestSuite } from '@prisma/client'
|
|
9
|
+
import InfoGrid from '@/components/data-visualization/info-grid'
|
|
10
|
+
import EmptyState from '@/components/data-state/empty-state'
|
|
11
|
+
import { Metadata } from 'next'
|
|
12
|
+
import { TubePlus } from '@/assets/icons/tube-plus'
|
|
13
|
+
import EmptyTube from '@/assets/icons/empty-tube'
|
|
14
|
+
|
|
15
|
+
export const metadata: Metadata = {
|
|
16
|
+
title: 'Appraise | Test Suites',
|
|
17
|
+
description: 'Manage test suites and their configurations',
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const TestSuites = async () => {
|
|
21
|
+
const { data: testSuites, error: testSuitesError } = await getAllTestSuitesAction()
|
|
22
|
+
|
|
23
|
+
if (testSuitesError) {
|
|
24
|
+
return <div>Error: {testSuitesError}</div>
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const testSuitesData = testSuites as (TestSuite & { testCases: TestCase[] })[]
|
|
28
|
+
const emptyTestSuites = testSuitesData.filter(testSuite => testSuite.testCases.length === 0)
|
|
29
|
+
const latestCreatedTestSuite = testSuitesData.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())[0]
|
|
30
|
+
|
|
31
|
+
if (testSuitesData.length === 0) {
|
|
32
|
+
return (
|
|
33
|
+
<div className="flex min-h-[calc(100vh-20rem)] items-center justify-center">
|
|
34
|
+
<EmptyState
|
|
35
|
+
icon={<TestTubes className="h-8 w-8" />}
|
|
36
|
+
title="No test suites found"
|
|
37
|
+
description="Get started by creating a test suite and grouping tests together"
|
|
38
|
+
createRoute="/test-suites/create"
|
|
39
|
+
createText="Create Test Suite"
|
|
40
|
+
/>
|
|
41
|
+
</div>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
return (
|
|
45
|
+
<>
|
|
46
|
+
<div className="mb-8">
|
|
47
|
+
<PageHeader>
|
|
48
|
+
<span className="flex items-center">
|
|
49
|
+
<TestTubes className="mr-2 h-8 w-8" />
|
|
50
|
+
Test Suites
|
|
51
|
+
</span>
|
|
52
|
+
</PageHeader>
|
|
53
|
+
<HeaderSubtitle>
|
|
54
|
+
Test suites are collections of tests that are used to test a specific feature or functionality
|
|
55
|
+
</HeaderSubtitle>
|
|
56
|
+
<InfoGrid
|
|
57
|
+
infoCards={[
|
|
58
|
+
{
|
|
59
|
+
showHighlightGroup: testSuitesData.length > 0,
|
|
60
|
+
highlight: emptyTestSuites.length.toString(),
|
|
61
|
+
legend: 'Empty test suite(s)',
|
|
62
|
+
defaultText: 'Empty test suites count. Will update when test suites are created.',
|
|
63
|
+
icon: <EmptyTube className="h-12 w-12 rounded-sm bg-muted p-2" />,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
showHighlightGroup: testSuitesData.length > 0,
|
|
67
|
+
highlight: latestCreatedTestSuite ? latestCreatedTestSuite.name : 'N/A',
|
|
68
|
+
legend: 'Latest test suite',
|
|
69
|
+
defaultText: 'Latest created test suite. Will update when test suites are created.',
|
|
70
|
+
icon: <TubePlus className="h-12 w-12 rounded-sm bg-muted p-2" />,
|
|
71
|
+
},
|
|
72
|
+
]}
|
|
73
|
+
/>
|
|
74
|
+
</div>
|
|
75
|
+
<Suspense fallback={<DataTableSkeleton />}>
|
|
76
|
+
<TestSuiteTable />
|
|
77
|
+
</Suspense>
|
|
78
|
+
</>
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export default TestSuites
|