create-appraise 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -0
- package/package.json +63 -0
- package/templates/default/.env.example +2 -0
- package/templates/default/README.md +51 -0
- package/templates/default/appraise.config.json +4 -0
- package/templates/default/components.json +24 -0
- package/templates/default/eslint.config.mjs +15 -0
- package/templates/default/next-env.d.ts +6 -0
- package/templates/default/next.config.ts +7 -0
- package/templates/default/package-lock.json +14321 -0
- package/templates/default/package.json +124 -0
- package/templates/default/postcss.config.mjs +8 -0
- package/templates/default/prisma/migrations/20251026202316_migrate_back_to_sqlite/migration.sql +257 -0
- package/templates/default/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -0
- package/templates/default/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -0
- package/templates/default/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -0
- package/templates/default/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -0
- package/templates/default/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -0
- package/templates/default/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -0
- package/templates/default/prisma/migrations/20251130190737_add_trace_path_to_test_run_test_case/migration.sql +2 -0
- package/templates/default/prisma/migrations/20251213074835_add_log_path_to_test_run/migration.sql +2 -0
- package/templates/default/prisma/migrations/20251213183952_add_name_property_for_the_test_run_entities/migration.sql +30 -0
- package/templates/default/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -0
- package/templates/default/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -0
- package/templates/default/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -0
- package/templates/default/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -0
- package/templates/default/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -0
- package/templates/default/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -0
- package/templates/default/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -0
- package/templates/default/prisma/migrations/migration_lock.toml +3 -0
- package/templates/default/prisma/schema.prisma +554 -0
- package/templates/default/public/favicon.ico +0 -0
- package/templates/default/public/file.svg +1 -0
- package/templates/default/public/globe.svg +1 -0
- package/templates/default/public/next.svg +1 -0
- package/templates/default/public/vercel.svg +1 -0
- package/templates/default/public/window.svg +1 -0
- package/templates/default/scripts/regenerate-features.ts +94 -0
- package/templates/default/scripts/setup-env.ts +19 -0
- package/templates/default/scripts/sync-all.ts +341 -0
- package/templates/default/scripts/sync-environments.ts +323 -0
- package/templates/default/scripts/sync-locator-groups.ts +413 -0
- package/templates/default/scripts/sync-locators.ts +402 -0
- package/templates/default/scripts/sync-modules.ts +349 -0
- package/templates/default/scripts/sync-tags.ts +292 -0
- package/templates/default/scripts/sync-template-step-groups.ts +399 -0
- package/templates/default/scripts/sync-template-steps.ts +806 -0
- package/templates/default/scripts/sync-test-cases.ts +905 -0
- package/templates/default/scripts/sync-test-suites.ts +411 -0
- package/templates/default/src/actions/conflict/conflict.action.ts +33 -0
- package/templates/default/src/actions/dashboard/dashboard-actions.ts +241 -0
- package/templates/default/src/actions/environments/environment-actions.ts +205 -0
- package/templates/default/src/actions/locator/locator-actions.ts +547 -0
- package/templates/default/src/actions/locator-groups/locator-group-actions.ts +344 -0
- package/templates/default/src/actions/modules/module-actions.ts +133 -0
- package/templates/default/src/actions/reports/report-actions.ts +614 -0
- package/templates/default/src/actions/review/review-actions.ts +147 -0
- package/templates/default/src/actions/tags/tag-actions.ts +104 -0
- package/templates/default/src/actions/template-step/template-step-actions.ts +332 -0
- package/templates/default/src/actions/template-step-group/template-step-group-actions.ts +278 -0
- package/templates/default/src/actions/template-test-case/template-test-case-actions.ts +238 -0
- package/templates/default/src/actions/test-case/test-case-actions.ts +419 -0
- package/templates/default/src/actions/test-run/test-run-actions.ts +1185 -0
- package/templates/default/src/actions/test-suite/test-suite-actions.ts +253 -0
- package/templates/default/src/actions/user/user-actions.ts +13 -0
- package/templates/default/src/app/(base)/environments/create/page.tsx +28 -0
- package/templates/default/src/app/(base)/environments/environment-form.tsx +219 -0
- package/templates/default/src/app/(base)/environments/environment-table-columns.tsx +96 -0
- package/templates/default/src/app/(base)/environments/environment-table.tsx +24 -0
- package/templates/default/src/app/(base)/environments/modify/[id]/page.tsx +46 -0
- package/templates/default/src/app/(base)/environments/page.tsx +59 -0
- package/templates/default/src/app/(base)/layout.tsx +10 -0
- package/templates/default/src/app/(base)/locator-groups/create/page.tsx +44 -0
- package/templates/default/src/app/(base)/locator-groups/locator-group-form.tsx +215 -0
- package/templates/default/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -0
- package/templates/default/src/app/(base)/locator-groups/locator-group-table.tsx +28 -0
- package/templates/default/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -0
- package/templates/default/src/app/(base)/locator-groups/page.tsx +61 -0
- package/templates/default/src/app/(base)/locators/create/page.tsx +38 -0
- package/templates/default/src/app/(base)/locators/locator-form.tsx +163 -0
- package/templates/default/src/app/(base)/locators/locator-table-columns.tsx +90 -0
- package/templates/default/src/app/(base)/locators/locator-table.tsx +28 -0
- package/templates/default/src/app/(base)/locators/modify/[id]/page.tsx +45 -0
- package/templates/default/src/app/(base)/locators/page.tsx +65 -0
- package/templates/default/src/app/(base)/locators/sync-locators-button.tsx +66 -0
- package/templates/default/src/app/(base)/modules/create/page.tsx +34 -0
- package/templates/default/src/app/(base)/modules/modify/[id]/page.tsx +46 -0
- package/templates/default/src/app/(base)/modules/module-form.tsx +126 -0
- package/templates/default/src/app/(base)/modules/module-table-columns.tsx +85 -0
- package/templates/default/src/app/(base)/modules/module-table.tsx +24 -0
- package/templates/default/src/app/(base)/modules/page.tsx +59 -0
- package/templates/default/src/app/(base)/reports/[id]/page.tsx +517 -0
- package/templates/default/src/app/(base)/reports/duration-chart.tsx +33 -0
- package/templates/default/src/app/(base)/reports/feature-chart.tsx +78 -0
- package/templates/default/src/app/(base)/reports/overview-chart.tsx +46 -0
- package/templates/default/src/app/(base)/reports/page.tsx +98 -0
- package/templates/default/src/app/(base)/reports/report-metric-card.tsx +16 -0
- package/templates/default/src/app/(base)/reports/report-table-columns.tsx +189 -0
- package/templates/default/src/app/(base)/reports/report-table.tsx +72 -0
- package/templates/default/src/app/(base)/reports/report-view-table-columns.tsx +131 -0
- package/templates/default/src/app/(base)/reports/report-view-table.tsx +82 -0
- package/templates/default/src/app/(base)/reports/test-cases/page.tsx +42 -0
- package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +115 -0
- package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -0
- package/templates/default/src/app/(base)/reports/test-suites/page.tsx +42 -0
- package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +79 -0
- package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +27 -0
- package/templates/default/src/app/(base)/reports/view-logs-button.tsx +60 -0
- package/templates/default/src/app/(base)/reviews/create/page.tsx +26 -0
- package/templates/default/src/app/(base)/reviews/created-reviews-table.tsx +15 -0
- package/templates/default/src/app/(base)/reviews/modify/[id]/page.tsx +26 -0
- package/templates/default/src/app/(base)/reviews/page.tsx +26 -0
- package/templates/default/src/app/(base)/reviews/review/[id]/page.tsx +26 -0
- package/templates/default/src/app/(base)/reviews/review-form.tsx +11 -0
- package/templates/default/src/app/(base)/reviews/review-table-by-creator-columns.tsx +9 -0
- package/templates/default/src/app/(base)/reviews/review-table-by-reviewer-columns.tsx +9 -0
- package/templates/default/src/app/(base)/reviews/reviewer-reviews-table.tsx +15 -0
- package/templates/default/src/app/(base)/tags/create/page.tsx +39 -0
- package/templates/default/src/app/(base)/tags/modify/[id]/page.tsx +50 -0
- package/templates/default/src/app/(base)/tags/page.tsx +58 -0
- package/templates/default/src/app/(base)/tags/tag-form.tsx +147 -0
- package/templates/default/src/app/(base)/tags/tag-table-columns.tsx +63 -0
- package/templates/default/src/app/(base)/tags/tag-table.tsx +29 -0
- package/templates/default/src/app/(base)/template-step-groups/create/page.tsx +28 -0
- package/templates/default/src/app/(base)/template-step-groups/modify/[id]/page.tsx +45 -0
- package/templates/default/src/app/(base)/template-step-groups/page.tsx +60 -0
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-form.tsx +167 -0
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-table-columns.tsx +89 -0
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-table.tsx +32 -0
- package/templates/default/src/app/(base)/template-steps/create/page.tsx +37 -0
- package/templates/default/src/app/(base)/template-steps/modify/[id]/page.tsx +49 -0
- package/templates/default/src/app/(base)/template-steps/page.tsx +59 -0
- package/templates/default/src/app/(base)/template-steps/paramChip.tsx +213 -0
- package/templates/default/src/app/(base)/template-steps/template-step-form.tsx +384 -0
- package/templates/default/src/app/(base)/template-steps/template-step-table-columns.tsx +158 -0
- package/templates/default/src/app/(base)/template-steps/template-step-table.tsx +24 -0
- package/templates/default/src/app/(base)/template-test-cases/create/page.tsx +56 -0
- package/templates/default/src/app/(base)/template-test-cases/modify/[id]/page.tsx +89 -0
- package/templates/default/src/app/(base)/template-test-cases/page.tsx +58 -0
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-flow.tsx +84 -0
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-form.tsx +262 -0
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -0
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -0
- package/templates/default/src/app/(base)/test-cases/create/page.tsx +76 -0
- package/templates/default/src/app/(base)/test-cases/create-from-template/generate/[id]/page.tsx +96 -0
- package/templates/default/src/app/(base)/test-cases/create-from-template/page.tsx +38 -0
- package/templates/default/src/app/(base)/test-cases/create-from-template/template-selection-form.tsx +73 -0
- package/templates/default/src/app/(base)/test-cases/modify/[id]/page.tsx +106 -0
- package/templates/default/src/app/(base)/test-cases/page.tsx +60 -0
- package/templates/default/src/app/(base)/test-cases/test-case-flow.tsx +82 -0
- package/templates/default/src/app/(base)/test-cases/test-case-form.tsx +395 -0
- package/templates/default/src/app/(base)/test-cases/test-case-table-columns.tsx +90 -0
- package/templates/default/src/app/(base)/test-cases/test-case-table.tsx +35 -0
- package/templates/default/src/app/(base)/test-runs/[id]/page.tsx +56 -0
- package/templates/default/src/app/(base)/test-runs/create/page.tsx +47 -0
- package/templates/default/src/app/(base)/test-runs/page.tsx +60 -0
- package/templates/default/src/app/(base)/test-runs/test-run-form.tsx +512 -0
- package/templates/default/src/app/(base)/test-runs/test-run-table-columns.tsx +229 -0
- package/templates/default/src/app/(base)/test-runs/test-run-table.tsx +127 -0
- package/templates/default/src/app/(base)/test-suites/create/page.tsx +45 -0
- package/templates/default/src/app/(base)/test-suites/modify/[id]/page.tsx +55 -0
- package/templates/default/src/app/(base)/test-suites/page.tsx +82 -0
- package/templates/default/src/app/(base)/test-suites/test-suite-form.tsx +269 -0
- package/templates/default/src/app/(base)/test-suites/test-suite-table-columns.tsx +97 -0
- package/templates/default/src/app/(base)/test-suites/test-suite-table.tsx +29 -0
- package/templates/default/src/app/(dashboard-components)/app-drawer.tsx +187 -0
- package/templates/default/src/app/(dashboard-components)/data-card-grid.tsx +13 -0
- package/templates/default/src/app/(dashboard-components)/data-card.tsx +27 -0
- package/templates/default/src/app/(dashboard-components)/execution-health-panel.tsx +57 -0
- package/templates/default/src/app/(dashboard-components)/ongoing-test-runs-card.tsx +87 -0
- package/templates/default/src/app/(dashboard-components)/quick-actions-drawer.tsx +45 -0
- package/templates/default/src/app/api/test-runs/[runId]/download/route.ts +133 -0
- package/templates/default/src/app/api/test-runs/[runId]/logs/route.ts +420 -0
- package/templates/default/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.ts +146 -0
- package/templates/default/src/app/favicon.ico +0 -0
- package/templates/default/src/app/globals.css +147 -0
- package/templates/default/src/app/layout.tsx +171 -0
- package/templates/default/src/app/page.tsx +64 -0
- package/templates/default/src/assets/icons/empty-tube.tsx +23 -0
- package/templates/default/src/assets/icons/tube-plus.tsx +29 -0
- package/templates/default/src/components/base-node.tsx +21 -0
- package/templates/default/src/components/chart/pie-chart.tsx +73 -0
- package/templates/default/src/components/data-extraction/locator-inspector.tsx +460 -0
- package/templates/default/src/components/data-state/empty-state.tsx +40 -0
- package/templates/default/src/components/data-visualization/info-card.tsx +70 -0
- package/templates/default/src/components/data-visualization/info-grid.tsx +22 -0
- package/templates/default/src/components/devtools/providers.tsx +13 -0
- package/templates/default/src/components/diagram/button-edge.tsx +54 -0
- package/templates/default/src/components/diagram/dynamic-parameters.tsx +438 -0
- package/templates/default/src/components/diagram/edit-header-option.tsx +36 -0
- package/templates/default/src/components/diagram/flow-diagram.tsx +470 -0
- package/templates/default/src/components/diagram/node-form.tsx +262 -0
- package/templates/default/src/components/diagram/options-header-node.tsx +57 -0
- package/templates/default/src/components/diagram/template-step-combobox.tsx +155 -0
- package/templates/default/src/components/form/error-message.tsx +7 -0
- package/templates/default/src/components/kokonutui/smooth-tab.tsx +453 -0
- package/templates/default/src/components/loading-skeleton/data-table/data-table-skeleton.tsx +30 -0
- package/templates/default/src/components/loading-skeleton/form/button-skeleton.tsx +8 -0
- package/templates/default/src/components/loading-skeleton/form/icon-button-skeleton.tsx +8 -0
- package/templates/default/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -0
- package/templates/default/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -0
- package/templates/default/src/components/logo.tsx +15 -0
- package/templates/default/src/components/navigation/command-badge.tsx +34 -0
- package/templates/default/src/components/navigation/command-chain-input.tsx +51 -0
- package/templates/default/src/components/navigation/entity-search-command.tsx +116 -0
- package/templates/default/src/components/navigation/nav-card.tsx +31 -0
- package/templates/default/src/components/navigation/nav-command.tsx +508 -0
- package/templates/default/src/components/navigation/nav-link.tsx +60 -0
- package/templates/default/src/components/navigation/nav-menu-card-deck.tsx +112 -0
- package/templates/default/src/components/node-header.tsx +159 -0
- package/templates/default/src/components/reports/test-case-logs-modal.tsx +253 -0
- package/templates/default/src/components/table/table-actions.tsx +172 -0
- package/templates/default/src/components/test-run/download-logs-button.tsx +99 -0
- package/templates/default/src/components/test-run/log-viewer.tsx +445 -0
- package/templates/default/src/components/test-run/test-run-details.tsx +611 -0
- package/templates/default/src/components/test-run/test-run-header.tsx +149 -0
- package/templates/default/src/components/test-run/view-report-button.tsx +102 -0
- package/templates/default/src/components/theme/mode-toggle.tsx +54 -0
- package/templates/default/src/components/theme/theme-provider.tsx +8 -0
- package/templates/default/src/components/typography/page-header-subtitle.tsx +7 -0
- package/templates/default/src/components/typography/page-header.tsx +7 -0
- package/templates/default/src/components/ui/alert-dialog.tsx +106 -0
- package/templates/default/src/components/ui/alert.tsx +43 -0
- package/templates/default/src/components/ui/avatar.tsx +40 -0
- package/templates/default/src/components/ui/badge.tsx +29 -0
- package/templates/default/src/components/ui/button.tsx +47 -0
- package/templates/default/src/components/ui/calendar.tsx +158 -0
- package/templates/default/src/components/ui/card.tsx +43 -0
- package/templates/default/src/components/ui/chart.tsx +369 -0
- package/templates/default/src/components/ui/checkbox.tsx +28 -0
- package/templates/default/src/components/ui/command.tsx +135 -0
- package/templates/default/src/components/ui/data-table-column-header.tsx +61 -0
- package/templates/default/src/components/ui/data-table-pagination.tsx +87 -0
- package/templates/default/src/components/ui/data-table-view-options.tsx +50 -0
- package/templates/default/src/components/ui/data-table.tsx +267 -0
- package/templates/default/src/components/ui/dialog.tsx +97 -0
- package/templates/default/src/components/ui/dropdown-menu.tsx +182 -0
- package/templates/default/src/components/ui/empty.tsx +104 -0
- package/templates/default/src/components/ui/input.tsx +22 -0
- package/templates/default/src/components/ui/kbd.tsx +28 -0
- package/templates/default/src/components/ui/label.tsx +19 -0
- package/templates/default/src/components/ui/loading.tsx +12 -0
- package/templates/default/src/components/ui/multi-select-with-preview.tsx +116 -0
- package/templates/default/src/components/ui/multi-select.tsx +142 -0
- package/templates/default/src/components/ui/navigation-menu.tsx +120 -0
- package/templates/default/src/components/ui/popover.tsx +33 -0
- package/templates/default/src/components/ui/progress.tsx +25 -0
- package/templates/default/src/components/ui/radio-group.tsx +44 -0
- package/templates/default/src/components/ui/scroll-area.tsx +40 -0
- package/templates/default/src/components/ui/select.tsx +144 -0
- package/templates/default/src/components/ui/separator.tsx +22 -0
- package/templates/default/src/components/ui/skeleton.tsx +7 -0
- package/templates/default/src/components/ui/table.tsx +76 -0
- package/templates/default/src/components/ui/tabs.tsx +55 -0
- package/templates/default/src/components/ui/textarea.tsx +21 -0
- package/templates/default/src/components/ui/toast.tsx +113 -0
- package/templates/default/src/components/ui/toaster.tsx +26 -0
- package/templates/default/src/components/ui/tooltip.tsx +32 -0
- package/templates/default/src/components/user-prompt/delete-prompt.tsx +87 -0
- package/templates/default/src/config/db-config.ts +10 -0
- package/templates/default/src/constants/form-opts/diagram/node-form.ts +30 -0
- package/templates/default/src/constants/form-opts/environment-form-opts.ts +24 -0
- package/templates/default/src/constants/form-opts/locator-form-opts.ts +20 -0
- package/templates/default/src/constants/form-opts/locator-group-form-opts.ts +28 -0
- package/templates/default/src/constants/form-opts/module-form-opts.ts +21 -0
- package/templates/default/src/constants/form-opts/review-form-opts.ts +23 -0
- package/templates/default/src/constants/form-opts/tag-form-opts.ts +42 -0
- package/templates/default/src/constants/form-opts/template-selection-form-opts.ts +16 -0
- package/templates/default/src/constants/form-opts/template-step-group-form-opts.ts +24 -0
- package/templates/default/src/constants/form-opts/template-test-case-form-opts.ts +39 -0
- package/templates/default/src/constants/form-opts/template-test-step-form-opts.ts +36 -0
- package/templates/default/src/constants/form-opts/test-case-form-opts.ts +43 -0
- package/templates/default/src/constants/form-opts/test-run-form-opts.ts +31 -0
- package/templates/default/src/constants/form-opts/test-suite-form-opts.ts +24 -0
- package/templates/default/src/hooks/use-toast.ts +187 -0
- package/templates/default/src/lib/bidirectional-sync.ts +432 -0
- package/templates/default/src/lib/database-sync.ts +531 -0
- package/templates/default/src/lib/environment-file-utils.ts +221 -0
- package/templates/default/src/lib/feature-file-generator.ts +411 -0
- package/templates/default/src/lib/gherkin-parser.ts +259 -0
- package/templates/default/src/lib/locator-group-file-utils.ts +370 -0
- package/templates/default/src/lib/metrics/metric-calculator.ts +613 -0
- package/templates/default/src/lib/module-hierarchy-builder.ts +205 -0
- package/templates/default/src/lib/path-helpers/module-path.ts +71 -0
- package/templates/default/src/lib/test-case-utils.ts +6 -0
- package/templates/default/src/lib/test-run/log-formatter.ts +83 -0
- package/templates/default/src/lib/test-run/process-manager.ts +191 -0
- package/templates/default/src/lib/test-run/report-parser.ts +316 -0
- package/templates/default/src/lib/test-run/test-run-executor.ts +144 -0
- package/templates/default/src/lib/test-run/winston-logger.ts +95 -0
- package/templates/default/src/lib/transformers/gherkin-converter.ts +42 -0
- package/templates/default/src/lib/transformers/key-to-icon-transformer.tsx +95 -0
- package/templates/default/src/lib/transformers/template-test-case-converter.ts +160 -0
- package/templates/default/src/lib/utils/node-param-validation.ts +81 -0
- package/templates/default/src/lib/utils/template-step-file-generator.ts +167 -0
- package/templates/default/src/lib/utils/template-step-file-manager-intelligent.ts +723 -0
- package/templates/default/src/lib/utils/template-step-file-manager.ts +166 -0
- package/templates/default/src/lib/utils.ts +31 -0
- package/templates/default/src/tests/config/environments/environments.json +14 -0
- package/templates/default/src/tests/config/executor/world.ts +41 -0
- package/templates/default/src/tests/executor.ts +80 -0
- package/templates/default/src/tests/hooks/hooks.ts +99 -0
- package/templates/default/src/tests/mapping/locator-map.json +1 -0
- package/templates/default/src/tests/steps/actions/click.step.ts +62 -0
- package/templates/default/src/tests/steps/actions/hover.step.ts +31 -0
- package/templates/default/src/tests/steps/actions/input.step.ts +149 -0
- package/templates/default/src/tests/steps/actions/navigation.step.ts +72 -0
- package/templates/default/src/tests/steps/actions/random_data.step.ts +146 -0
- package/templates/default/src/tests/steps/actions/store.step.ts +90 -0
- package/templates/default/src/tests/steps/actions/wait.step.ts +107 -0
- package/templates/default/src/tests/steps/validations/active_state_assertion.step.ts +34 -0
- package/templates/default/src/tests/steps/validations/navigation_assertion.step.ts +23 -0
- package/templates/default/src/tests/steps/validations/text_assertion.step.ts +111 -0
- package/templates/default/src/tests/steps/validations/visibility_assertion.step.ts +30 -0
- package/templates/default/src/tests/support/parameter-types.ts +12 -0
- package/templates/default/src/tests/utils/cache.util.ts +260 -0
- package/templates/default/src/tests/utils/cli.util.ts +177 -0
- package/templates/default/src/tests/utils/environment.util.ts +65 -0
- package/templates/default/src/tests/utils/locator.util.ts +248 -0
- package/templates/default/src/tests/utils/random-data.util.ts +45 -0
- package/templates/default/src/tests/utils/spawner.util.ts +617 -0
- package/templates/default/src/types/diagram/diagram.ts +34 -0
- package/templates/default/src/types/diagram/template-step.ts +11 -0
- package/templates/default/src/types/executor/browser.type.ts +1 -0
- package/templates/default/src/types/form/actionHandler.ts +6 -0
- package/templates/default/src/types/locator/locator.type.ts +11 -0
- package/templates/default/src/types/step/step.type.ts +1 -0
- package/templates/default/src/types/table/data-table.ts +6 -0
- package/templates/default/tailwind.config.ts +62 -0
- package/templates/default/tsconfig.json +28 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TemplateTestCase,
|
|
3
|
+
TemplateTestCaseStep,
|
|
4
|
+
TemplateTestCaseStepParameter,
|
|
5
|
+
TemplateStepIcon,
|
|
6
|
+
StepParameterType,
|
|
7
|
+
} from '@prisma/client'
|
|
8
|
+
import { NodeOrderMap } from '@/types/diagram/diagram'
|
|
9
|
+
|
|
10
|
+
export interface ConvertedTestCaseData {
|
|
11
|
+
title: string
|
|
12
|
+
description: string
|
|
13
|
+
testSuiteIds: string[]
|
|
14
|
+
nodesOrder: NodeOrderMap
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface TestCaseFormData {
|
|
18
|
+
title: string
|
|
19
|
+
description: string
|
|
20
|
+
testSuiteIds: string[]
|
|
21
|
+
steps: {
|
|
22
|
+
gherkinStep: string
|
|
23
|
+
label: string
|
|
24
|
+
icon: TemplateStepIcon
|
|
25
|
+
parameters: {
|
|
26
|
+
name: string
|
|
27
|
+
value: string
|
|
28
|
+
type: StepParameterType
|
|
29
|
+
order: number
|
|
30
|
+
}[]
|
|
31
|
+
order: number
|
|
32
|
+
templateStepId: string
|
|
33
|
+
}[]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Converts a template test case to the format expected by the test case form component
|
|
38
|
+
* @param templateTestCase - The template test case with steps and parameters
|
|
39
|
+
* @returns Converted data in the format expected by TestCaseForm
|
|
40
|
+
*/
|
|
41
|
+
export const templateTestCaseToTestCaseConverter = (
|
|
42
|
+
templateTestCase: TemplateTestCase & {
|
|
43
|
+
steps: (TemplateTestCaseStep & {
|
|
44
|
+
parameters: TemplateTestCaseStepParameter[]
|
|
45
|
+
})[]
|
|
46
|
+
},
|
|
47
|
+
): ConvertedTestCaseData => {
|
|
48
|
+
// Convert template test case to test case format
|
|
49
|
+
const title = templateTestCase.name
|
|
50
|
+
const description = templateTestCase.description || ''
|
|
51
|
+
const testSuiteIds: string[] = [] // Will be populated by user selection
|
|
52
|
+
|
|
53
|
+
// Convert steps to NodeOrderMap format
|
|
54
|
+
const nodesOrder: NodeOrderMap = {}
|
|
55
|
+
|
|
56
|
+
templateTestCase.steps.forEach((step, index) => {
|
|
57
|
+
const nodeId = `node-${index}`
|
|
58
|
+
|
|
59
|
+
// Convert parameters from template format to test case format
|
|
60
|
+
const parameters = step.parameters.map(param => ({
|
|
61
|
+
name: param.name,
|
|
62
|
+
value: param.defaultValue, // Convert defaultValue to value
|
|
63
|
+
type: param.type,
|
|
64
|
+
order: param.order,
|
|
65
|
+
}))
|
|
66
|
+
|
|
67
|
+
nodesOrder[nodeId] = {
|
|
68
|
+
order: step.order,
|
|
69
|
+
label: step.label,
|
|
70
|
+
gherkinStep: step.gherkinStep,
|
|
71
|
+
icon: step.icon as TemplateStepIcon,
|
|
72
|
+
parameters,
|
|
73
|
+
templateStepId: step.templateStepId,
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
title,
|
|
79
|
+
description,
|
|
80
|
+
testSuiteIds,
|
|
81
|
+
nodesOrder,
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Converts NodeOrderMap to the format expected by TestCaseForm and createTestCaseAction
|
|
87
|
+
* @param nodesOrder - The NodeOrderMap from the converter
|
|
88
|
+
* @returns Data in the format expected by the test case form
|
|
89
|
+
*/
|
|
90
|
+
export const convertNodeOrderMapToTestCaseFormData = (nodesOrder: NodeOrderMap): TestCaseFormData['steps'] => {
|
|
91
|
+
return Object.entries(nodesOrder)
|
|
92
|
+
.map(([, nodeData]) => ({
|
|
93
|
+
gherkinStep: nodeData.gherkinStep || '',
|
|
94
|
+
label: nodeData.label,
|
|
95
|
+
icon: nodeData.icon as TemplateStepIcon,
|
|
96
|
+
parameters: nodeData.parameters,
|
|
97
|
+
order: nodeData.order,
|
|
98
|
+
templateStepId: nodeData.templateStepId,
|
|
99
|
+
}))
|
|
100
|
+
.sort((a, b) => a.order - b.order)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Converts a template test case directly to the format expected by createTestCaseAction
|
|
105
|
+
* @param templateTestCase - The template test case with steps and parameters
|
|
106
|
+
* @param testSuiteIds - Optional test suite IDs to assign
|
|
107
|
+
* @returns Data ready for test case creation
|
|
108
|
+
*/
|
|
109
|
+
export const templateTestCaseToTestCaseFormData = (
|
|
110
|
+
templateTestCase: TemplateTestCase & {
|
|
111
|
+
steps: (TemplateTestCaseStep & {
|
|
112
|
+
parameters: TemplateTestCaseStepParameter[]
|
|
113
|
+
})[]
|
|
114
|
+
},
|
|
115
|
+
testSuiteIds: string[] = [],
|
|
116
|
+
): TestCaseFormData => {
|
|
117
|
+
const convertedData = templateTestCaseToTestCaseConverter(templateTestCase)
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
title: convertedData.title,
|
|
121
|
+
description: convertedData.description,
|
|
122
|
+
testSuiteIds: testSuiteIds.length > 0 ? testSuiteIds : convertedData.testSuiteIds,
|
|
123
|
+
steps: convertNodeOrderMapToTestCaseFormData(convertedData.nodesOrder),
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Validates if the converted data is ready for test case creation
|
|
129
|
+
* @param convertedData - The converted test case data
|
|
130
|
+
* @returns Validation result with any errors
|
|
131
|
+
*/
|
|
132
|
+
export const validateConvertedTestCaseData = (
|
|
133
|
+
convertedData: ConvertedTestCaseData,
|
|
134
|
+
): { isValid: boolean; errors: string[] } => {
|
|
135
|
+
const errors: string[] = []
|
|
136
|
+
|
|
137
|
+
if (!convertedData.title || convertedData.title.trim().length < 3) {
|
|
138
|
+
errors.push('Title must be at least 3 characters long')
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (Object.keys(convertedData.nodesOrder).length === 0) {
|
|
142
|
+
errors.push('At least one step is required')
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Validate each step
|
|
146
|
+
Object.entries(convertedData.nodesOrder).forEach(([nodeId, nodeData]) => {
|
|
147
|
+
if (!nodeData.label || nodeData.label.trim().length === 0) {
|
|
148
|
+
errors.push(`Step ${nodeId}: Label is required`)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (!nodeData.templateStepId) {
|
|
152
|
+
errors.push(`Step ${nodeId}: Template step ID is required`)
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
isValid: errors.length === 0,
|
|
158
|
+
errors,
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { StepParameterType, TemplateStepParameter } from '@prisma/client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Type for node data with parameters needed for validation
|
|
5
|
+
*/
|
|
6
|
+
type NodeDataForValidation = {
|
|
7
|
+
templateStepId: string
|
|
8
|
+
parameters: {
|
|
9
|
+
name: string
|
|
10
|
+
value: string
|
|
11
|
+
type: StepParameterType
|
|
12
|
+
order: number
|
|
13
|
+
}[]
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Checks if a node has missing mandatory parameters
|
|
18
|
+
* @param nodeData - The node data to validate (must have templateStepId and parameters)
|
|
19
|
+
* @param templateStepParams - All available template step parameters
|
|
20
|
+
* @param defaultValueInput - If true, all parameters are optional (skip validation)
|
|
21
|
+
* @returns true if any mandatory parameter is missing, false otherwise
|
|
22
|
+
*/
|
|
23
|
+
export function checkMissingMandatoryParams(
|
|
24
|
+
nodeData: NodeDataForValidation,
|
|
25
|
+
templateStepParams: TemplateStepParameter[],
|
|
26
|
+
defaultValueInput: boolean,
|
|
27
|
+
): boolean {
|
|
28
|
+
// Skip all validation if defaultValueInput is true (all fields are optional)
|
|
29
|
+
if (defaultValueInput) {
|
|
30
|
+
return false
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Get all template step parameters for this node's templateStepId
|
|
34
|
+
const nodeParams = templateStepParams.filter(param => param.templateStepId === nodeData.templateStepId)
|
|
35
|
+
|
|
36
|
+
// Create a map of node parameters by name for quick lookup
|
|
37
|
+
const nodeParamMap = new Map(nodeData.parameters.map(param => [param.name, param.value]))
|
|
38
|
+
|
|
39
|
+
// Check each required parameter
|
|
40
|
+
for (const param of nodeParams) {
|
|
41
|
+
const value = nodeParamMap.get(param.name)
|
|
42
|
+
|
|
43
|
+
// LOCATOR: Check if value is empty (we can't check locator group selection from node data)
|
|
44
|
+
if (param.type === 'LOCATOR') {
|
|
45
|
+
if (!value || value.trim() === '') {
|
|
46
|
+
return true
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// STRING: Check if value is empty
|
|
51
|
+
if (param.type === 'STRING') {
|
|
52
|
+
if (!value || value.trim() === '') {
|
|
53
|
+
return true
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// NUMBER: Check if value is empty
|
|
58
|
+
if (param.type === 'NUMBER') {
|
|
59
|
+
if (!value || value.trim() === '') {
|
|
60
|
+
return true
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// DATE: Check if value is empty or invalid
|
|
65
|
+
if (param.type === 'DATE') {
|
|
66
|
+
if (!value || value.trim() === '') {
|
|
67
|
+
return true
|
|
68
|
+
}
|
|
69
|
+
// Try to parse the date to check if it's valid
|
|
70
|
+
const date = new Date(value)
|
|
71
|
+
if (isNaN(date.getTime())) {
|
|
72
|
+
return true
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// BOOLEAN: Always has a value (true/false), so skip validation
|
|
77
|
+
// No validation needed for BOOLEAN type
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return false
|
|
81
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { promises as fs } from 'fs'
|
|
2
|
+
import { join } from 'path'
|
|
3
|
+
import prettier from 'prettier'
|
|
4
|
+
import { TemplateStep, TemplateStepGroupType } from '@prisma/client'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Sanitizes a template step group name for file naming
|
|
8
|
+
* Converts to kebab-case (lowercase with underscores for spaces)
|
|
9
|
+
*/
|
|
10
|
+
export function sanitizeFileName(groupName: string): string {
|
|
11
|
+
return groupName
|
|
12
|
+
.toLowerCase()
|
|
13
|
+
.trim()
|
|
14
|
+
.replace(/\s+/g, '_') // Replace spaces with underscores
|
|
15
|
+
.replace(/[^a-z0-9_]/g, '') // Remove special characters except underscores
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generates the content for a template step group file
|
|
20
|
+
* Concatenates all function definitions from template steps in the group
|
|
21
|
+
*/
|
|
22
|
+
export function generateFileContent(templateSteps: TemplateStep[]): string {
|
|
23
|
+
// Required imports for all template step group files
|
|
24
|
+
const requiredImports = `import { When } from '@cucumber/cucumber';
|
|
25
|
+
import { CustomWorld } from '../../config/executor/world.js';
|
|
26
|
+
import { SelectorName } from '@/types/locator/locator.type';
|
|
27
|
+
import { resolveLocator } from '../../utils/locator.util';
|
|
28
|
+
|
|
29
|
+
`
|
|
30
|
+
|
|
31
|
+
if (!templateSteps || templateSteps.length === 0) {
|
|
32
|
+
return (
|
|
33
|
+
requiredImports + '// This file is generated automatically. Add template steps to this group to generate content.'
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Extract and concatenate function definitions
|
|
38
|
+
const functionDefinitions = templateSteps
|
|
39
|
+
.map(step => step.functionDefinition)
|
|
40
|
+
.filter(Boolean) // Remove undefined/null values
|
|
41
|
+
.join('\n\n')
|
|
42
|
+
|
|
43
|
+
return requiredImports + functionDefinitions
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Formats the file content using Prettier
|
|
48
|
+
*/
|
|
49
|
+
export async function formatFileContent(content: string): Promise<string> {
|
|
50
|
+
try {
|
|
51
|
+
const formattedContent = await prettier.format(content, {
|
|
52
|
+
parser: 'typescript',
|
|
53
|
+
semi: true,
|
|
54
|
+
singleQuote: true,
|
|
55
|
+
trailingComma: 'es5',
|
|
56
|
+
printWidth: 80,
|
|
57
|
+
tabWidth: 2,
|
|
58
|
+
})
|
|
59
|
+
return formattedContent
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error('Prettier formatting failed:', error)
|
|
62
|
+
// Return original content if formatting fails
|
|
63
|
+
return content
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Gets the subdirectory name for a given template step group type
|
|
69
|
+
*/
|
|
70
|
+
export function getSubdirectoryName(type: TemplateStepGroupType | string): string {
|
|
71
|
+
const typeStr = String(type)
|
|
72
|
+
return typeStr === 'ACTION' ? 'actions' : 'validations'
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Ensures the steps directory and subdirectories exist, creates them if they don't
|
|
77
|
+
*/
|
|
78
|
+
export async function ensureStepsDirectory(): Promise<string> {
|
|
79
|
+
const stepsDir = join(process.cwd(), 'src', 'tests', 'steps')
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
await fs.access(stepsDir)
|
|
83
|
+
} catch {
|
|
84
|
+
// Directory doesn't exist, create it
|
|
85
|
+
await fs.mkdir(stepsDir, { recursive: true })
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Ensure both subdirectories exist
|
|
89
|
+
const actionsDir = join(stepsDir, 'actions')
|
|
90
|
+
const validationsDir = join(stepsDir, 'validations')
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
await fs.access(actionsDir)
|
|
94
|
+
} catch {
|
|
95
|
+
await fs.mkdir(actionsDir, { recursive: true })
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
await fs.access(validationsDir)
|
|
100
|
+
} catch {
|
|
101
|
+
await fs.mkdir(validationsDir, { recursive: true })
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return stepsDir
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Generates the full file path for a template step group
|
|
109
|
+
*/
|
|
110
|
+
export function getFilePath(groupName: string, type: TemplateStepGroupType | string): string {
|
|
111
|
+
const sanitizedName = sanitizeFileName(groupName)
|
|
112
|
+
const subdirectory = getSubdirectoryName(type)
|
|
113
|
+
return join(process.cwd(), 'src', 'tests', 'steps', subdirectory, `${sanitizedName}.step.ts`)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Writes content to a template step group file
|
|
118
|
+
*/
|
|
119
|
+
export async function writeTemplateStepFile(
|
|
120
|
+
groupName: string,
|
|
121
|
+
content: string,
|
|
122
|
+
type: TemplateStepGroupType | string,
|
|
123
|
+
): Promise<void> {
|
|
124
|
+
try {
|
|
125
|
+
// Ensure directory exists
|
|
126
|
+
await ensureStepsDirectory()
|
|
127
|
+
|
|
128
|
+
// Format content with Prettier
|
|
129
|
+
const formattedContent = await formatFileContent(content)
|
|
130
|
+
|
|
131
|
+
// Get file path
|
|
132
|
+
const filePath = getFilePath(groupName, type)
|
|
133
|
+
|
|
134
|
+
// Write file
|
|
135
|
+
await fs.writeFile(filePath, formattedContent, 'utf8')
|
|
136
|
+
|
|
137
|
+
console.log(`Template step file generated: ${filePath}`)
|
|
138
|
+
} catch (error) {
|
|
139
|
+
console.error(`Failed to write template step file for group "${groupName}":`, error)
|
|
140
|
+
throw new Error(`File generation failed: ${error}`)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Deletes a template step group file
|
|
146
|
+
*/
|
|
147
|
+
export async function deleteTemplateStepFile(groupName: string, type: TemplateStepGroupType | string): Promise<void> {
|
|
148
|
+
try {
|
|
149
|
+
const filePath = getFilePath(groupName, type)
|
|
150
|
+
|
|
151
|
+
// Check if file exists before trying to delete
|
|
152
|
+
try {
|
|
153
|
+
await fs.access(filePath)
|
|
154
|
+
} catch {
|
|
155
|
+
// File doesn't exist, nothing to delete
|
|
156
|
+
return
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Delete file
|
|
160
|
+
await fs.unlink(filePath)
|
|
161
|
+
|
|
162
|
+
console.log(`Template step file deleted: ${filePath}`)
|
|
163
|
+
} catch (error) {
|
|
164
|
+
console.error(`Failed to delete template step file for group "${groupName}":`, error)
|
|
165
|
+
throw new Error(`File deletion failed: ${error}`)
|
|
166
|
+
}
|
|
167
|
+
}
|