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,531 @@
|
|
|
1
|
+
import { relative } from 'path'
|
|
2
|
+
import prisma from '@/config/db-config'
|
|
3
|
+
import { ParsedFeature, ParsedStep } from './gherkin-parser'
|
|
4
|
+
import { buildModuleHierarchy } from './module-hierarchy-builder'
|
|
5
|
+
import { TemplateStepType, TemplateStepIcon, TestCase, TagType } from '@prisma/client'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Syncs feature files to the database by creating missing test suites and test cases
|
|
9
|
+
* @param parsedFeatures - Array of parsed feature files
|
|
10
|
+
* @param featuresBaseDir - Base directory for features
|
|
11
|
+
* @returns Promise<{createdTestSuites: number, createdTestCases: number, createdTemplateSteps: number}>
|
|
12
|
+
*/
|
|
13
|
+
export async function syncFeaturesToDatabase(
|
|
14
|
+
parsedFeatures: ParsedFeature[],
|
|
15
|
+
featuresBaseDir: string,
|
|
16
|
+
): Promise<{
|
|
17
|
+
createdTestSuites: number
|
|
18
|
+
createdTestCases: number
|
|
19
|
+
createdTemplateSteps: number
|
|
20
|
+
}> {
|
|
21
|
+
let createdTestSuites = 0
|
|
22
|
+
let createdTestCases = 0
|
|
23
|
+
let createdTemplateSteps = 0
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
for (const feature of parsedFeatures) {
|
|
27
|
+
// Extract module path from file path
|
|
28
|
+
const modulePath = extractModulePathFromFilePath(feature.filePath, featuresBaseDir)
|
|
29
|
+
|
|
30
|
+
// Build or find the module hierarchy
|
|
31
|
+
const moduleId = await buildModuleHierarchy(modulePath)
|
|
32
|
+
|
|
33
|
+
// Find or create test suite
|
|
34
|
+
const testSuiteId = await findOrCreateTestSuite(
|
|
35
|
+
feature.featureName,
|
|
36
|
+
feature.featureDescription,
|
|
37
|
+
moduleId,
|
|
38
|
+
feature.tags,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
if (testSuiteId) {
|
|
42
|
+
createdTestSuites++
|
|
43
|
+
|
|
44
|
+
// Process each scenario in the feature
|
|
45
|
+
for (const scenario of feature.scenarios) {
|
|
46
|
+
const testCaseId = await findOrCreateTestCase(
|
|
47
|
+
scenario.name,
|
|
48
|
+
scenario.description || '',
|
|
49
|
+
testSuiteId,
|
|
50
|
+
scenario.tags,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
if (testCaseId) {
|
|
54
|
+
createdTestCases++
|
|
55
|
+
|
|
56
|
+
// Process steps for this test case
|
|
57
|
+
for (const step of scenario.steps) {
|
|
58
|
+
const templateStepId = await findOrCreateTemplateStep(step)
|
|
59
|
+
|
|
60
|
+
if (templateStepId) {
|
|
61
|
+
createdTemplateSteps++
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Create or update test case step
|
|
65
|
+
if (testCaseId && templateStepId) {
|
|
66
|
+
await createOrUpdateTestCaseStep(testCaseId, step, templateStepId)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
console.log(
|
|
75
|
+
`Sync completed: ${createdTestSuites} test suites, ${createdTestCases} test cases, ${createdTemplateSteps} template steps created`,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
createdTestSuites,
|
|
80
|
+
createdTestCases,
|
|
81
|
+
createdTemplateSteps,
|
|
82
|
+
}
|
|
83
|
+
} catch (error) {
|
|
84
|
+
console.error('Error syncing features to database:', error)
|
|
85
|
+
throw error
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Determines the tag type based on the tag expression pattern
|
|
91
|
+
* Pattern: @xx_id_xxxxxxxx where xx is any 2 chars, xxxxxxxx is any chars
|
|
92
|
+
* @param tagExpression - The tag expression (e.g., "@tc_id_ue4qwoml" or "@smoke")
|
|
93
|
+
* @returns TagType - IDENTIFIER if matches pattern, FILTER otherwise
|
|
94
|
+
*/
|
|
95
|
+
function determineTagType(tagExpression: string): TagType {
|
|
96
|
+
// Pattern: @xx_id_xxxxxxxx where:
|
|
97
|
+
// - @ = literal @
|
|
98
|
+
// - xx = any 2 characters
|
|
99
|
+
// - _id_ = literal string
|
|
100
|
+
// - xxxxxxxx = any characters
|
|
101
|
+
const identifierPattern = /^@.{2}_id_.+$/
|
|
102
|
+
return identifierPattern.test(tagExpression) ? TagType.IDENTIFIER : TagType.FILTER
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Derives the tag name from the tag expression by removing the @ symbol
|
|
107
|
+
* @param tagExpression - The tag expression (e.g., "@smoke")
|
|
108
|
+
* @returns string - The tag name without @ (e.g., "smoke")
|
|
109
|
+
*/
|
|
110
|
+
function deriveTagName(tagExpression: string): string {
|
|
111
|
+
return tagExpression.startsWith('@') ? tagExpression.substring(1) : tagExpression
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Finds or creates a tag in the database
|
|
116
|
+
* If the tag exists, updates its type if it differs from the expected type
|
|
117
|
+
* @param tagExpression - The tag expression (e.g., "@smoke")
|
|
118
|
+
* @returns Promise<string> - The tag ID
|
|
119
|
+
*/
|
|
120
|
+
async function findOrCreateTag(tagExpression: string): Promise<string> {
|
|
121
|
+
try {
|
|
122
|
+
// Find existing tag by tagExpression
|
|
123
|
+
const existingTag = await prisma.tag.findFirst({
|
|
124
|
+
where: {
|
|
125
|
+
tagExpression: tagExpression,
|
|
126
|
+
},
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
const expectedType = determineTagType(tagExpression)
|
|
130
|
+
const tagName = deriveTagName(tagExpression)
|
|
131
|
+
|
|
132
|
+
if (existingTag) {
|
|
133
|
+
// Update type if it differs from expected type
|
|
134
|
+
if (existingTag.type !== expectedType) {
|
|
135
|
+
await prisma.tag.update({
|
|
136
|
+
where: { id: existingTag.id },
|
|
137
|
+
data: { type: expectedType },
|
|
138
|
+
})
|
|
139
|
+
console.log(`Updated tag type for ${tagExpression} from ${existingTag.type} to ${expectedType}`)
|
|
140
|
+
}
|
|
141
|
+
return existingTag.id
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Create new tag
|
|
145
|
+
const newTag = await prisma.tag.create({
|
|
146
|
+
data: {
|
|
147
|
+
name: tagName,
|
|
148
|
+
tagExpression: tagExpression,
|
|
149
|
+
type: expectedType,
|
|
150
|
+
},
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
console.log(`Created tag: ${tagExpression} (${expectedType})`)
|
|
154
|
+
return newTag.id
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error(`Error finding/creating tag ${tagExpression}:`, error)
|
|
157
|
+
throw error
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Extracts module path from feature file path
|
|
163
|
+
* Works cross-platform (Windows, Mac, Linux)
|
|
164
|
+
*/
|
|
165
|
+
function extractModulePathFromFilePath(featureFilePath: string, featuresBaseDir: string): string {
|
|
166
|
+
// Use path.relative for cross-platform path handling
|
|
167
|
+
const relativePath = relative(featuresBaseDir, featureFilePath)
|
|
168
|
+
|
|
169
|
+
// Normalize to forward slashes for module path format (database uses /)
|
|
170
|
+
const normalizedPath = relativePath.replace(/\\/g, '/')
|
|
171
|
+
const pathParts = normalizedPath.split('/').filter(part => part && part !== '')
|
|
172
|
+
|
|
173
|
+
// Remove the filename and join the remaining parts
|
|
174
|
+
const moduleParts = pathParts.slice(0, -1)
|
|
175
|
+
return moduleParts.length > 0 ? '/' + moduleParts.join('/') : '/'
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Finds or creates a test suite
|
|
180
|
+
*/
|
|
181
|
+
async function findOrCreateTestSuite(
|
|
182
|
+
name: string,
|
|
183
|
+
description: string | undefined,
|
|
184
|
+
moduleId: string,
|
|
185
|
+
tags?: string[],
|
|
186
|
+
): Promise<string | null> {
|
|
187
|
+
try {
|
|
188
|
+
// Try to find existing test suite
|
|
189
|
+
const existingTestSuite = await prisma.testSuite.findFirst({
|
|
190
|
+
where: {
|
|
191
|
+
name: name,
|
|
192
|
+
moduleId: moduleId,
|
|
193
|
+
},
|
|
194
|
+
include: {
|
|
195
|
+
tags: true,
|
|
196
|
+
},
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
if (existingTestSuite) {
|
|
200
|
+
// Associate tags if provided
|
|
201
|
+
if (tags && tags.length > 0) {
|
|
202
|
+
const tagIds = await Promise.all(tags.map(tag => findOrCreateTag(tag)))
|
|
203
|
+
await prisma.testSuite.update({
|
|
204
|
+
where: { id: existingTestSuite.id },
|
|
205
|
+
data: {
|
|
206
|
+
tags: {
|
|
207
|
+
connect: tagIds.map(id => ({ id })),
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
})
|
|
211
|
+
}
|
|
212
|
+
return existingTestSuite.id
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Create new test suite with tags
|
|
216
|
+
const tagIds = tags && tags.length > 0 ? await Promise.all(tags.map(tag => findOrCreateTag(tag))) : []
|
|
217
|
+
|
|
218
|
+
const newTestSuite = await prisma.testSuite.create({
|
|
219
|
+
data: {
|
|
220
|
+
name: name,
|
|
221
|
+
description: description || null,
|
|
222
|
+
moduleId: moduleId,
|
|
223
|
+
tags: tagIds.length > 0 ? { connect: tagIds.map(id => ({ id })) } : undefined,
|
|
224
|
+
},
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
console.log(`Created test suite: ${name}`)
|
|
228
|
+
return newTestSuite.id
|
|
229
|
+
} catch (error) {
|
|
230
|
+
console.error(`Error creating test suite ${name}:`, error)
|
|
231
|
+
return null
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Finds or creates a test case
|
|
237
|
+
*/
|
|
238
|
+
async function findOrCreateTestCase(
|
|
239
|
+
title: string,
|
|
240
|
+
description: string,
|
|
241
|
+
testSuiteId: string,
|
|
242
|
+
tags?: string[],
|
|
243
|
+
): Promise<string | null> {
|
|
244
|
+
try {
|
|
245
|
+
// Try to find existing test case
|
|
246
|
+
const existingTestCase: TestCase | null = await prisma.testCase.findFirst({
|
|
247
|
+
where: {
|
|
248
|
+
title: title,
|
|
249
|
+
TestSuite: {
|
|
250
|
+
some: {
|
|
251
|
+
id: testSuiteId,
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
include: {
|
|
256
|
+
tags: true,
|
|
257
|
+
},
|
|
258
|
+
})
|
|
259
|
+
|
|
260
|
+
if (existingTestCase) {
|
|
261
|
+
// Associate tags if provided
|
|
262
|
+
if (tags && tags.length > 0) {
|
|
263
|
+
const tagIds = await Promise.all(tags.map(tag => findOrCreateTag(tag)))
|
|
264
|
+
await prisma.testCase.update({
|
|
265
|
+
where: { id: existingTestCase.id },
|
|
266
|
+
data: {
|
|
267
|
+
tags: {
|
|
268
|
+
connect: tagIds.map(id => ({ id })),
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
})
|
|
272
|
+
}
|
|
273
|
+
return existingTestCase.id
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Create new test case with tags
|
|
277
|
+
const tagIds = tags && tags.length > 0 ? await Promise.all(tags.map(tag => findOrCreateTag(tag))) : []
|
|
278
|
+
|
|
279
|
+
const newTestCase = await prisma.testCase.create({
|
|
280
|
+
data: {
|
|
281
|
+
title: title,
|
|
282
|
+
description: description,
|
|
283
|
+
TestSuite: {
|
|
284
|
+
connect: {
|
|
285
|
+
id: testSuiteId,
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
tags: tagIds.length > 0 ? { connect: tagIds.map(id => ({ id })) } : undefined,
|
|
289
|
+
},
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
console.log(`Created test case: ${title}`)
|
|
293
|
+
return newTestCase.id
|
|
294
|
+
} catch (error) {
|
|
295
|
+
console.error(`Error creating test case ${title}:`, error)
|
|
296
|
+
return null
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Finds or creates a template step
|
|
302
|
+
*/
|
|
303
|
+
async function findOrCreateTemplateStep(step: ParsedStep): Promise<string | null> {
|
|
304
|
+
try {
|
|
305
|
+
// Try to find existing template step by signature
|
|
306
|
+
const signature = `${step.keyword} ${step.text}`
|
|
307
|
+
const existingTemplateStep = await prisma.templateStep.findFirst({
|
|
308
|
+
where: {
|
|
309
|
+
signature: signature,
|
|
310
|
+
},
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
if (existingTemplateStep) {
|
|
314
|
+
return existingTemplateStep.id
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Create a default template step group if none exists
|
|
318
|
+
let templateStepGroup = await prisma.templateStepGroup.findFirst()
|
|
319
|
+
if (!templateStepGroup) {
|
|
320
|
+
templateStepGroup = await prisma.templateStepGroup.create({
|
|
321
|
+
data: {
|
|
322
|
+
name: 'Default Steps',
|
|
323
|
+
description: 'Auto-generated template step group for feature file steps',
|
|
324
|
+
},
|
|
325
|
+
})
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Determine step type and icon based on keyword
|
|
329
|
+
const { type, icon } = determineStepTypeAndIcon(step.keyword)
|
|
330
|
+
|
|
331
|
+
// Create new template step
|
|
332
|
+
const newTemplateStep = await prisma.templateStep.create({
|
|
333
|
+
data: {
|
|
334
|
+
name: step.text.substring(0, 50) + (step.text.length > 50 ? '...' : ''),
|
|
335
|
+
description: `Auto-generated step: ${step.text}`,
|
|
336
|
+
signature: signature,
|
|
337
|
+
type: type,
|
|
338
|
+
icon: icon,
|
|
339
|
+
templateStepGroupId: templateStepGroup.id,
|
|
340
|
+
},
|
|
341
|
+
})
|
|
342
|
+
|
|
343
|
+
console.log(`Created template step: ${signature}`)
|
|
344
|
+
return newTemplateStep.id
|
|
345
|
+
} catch (error) {
|
|
346
|
+
console.error(`Error creating template step for ${step.keyword} ${step.text}:`, error)
|
|
347
|
+
return null
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Determines the step type and icon based on the Gherkin keyword
|
|
353
|
+
*/
|
|
354
|
+
function determineStepTypeAndIcon(keyword: string): { type: TemplateStepType; icon: TemplateStepIcon } {
|
|
355
|
+
const lowerKeyword = keyword.toLowerCase().trim()
|
|
356
|
+
|
|
357
|
+
if (lowerKeyword === 'given') {
|
|
358
|
+
return { type: 'ACTION', icon: 'NAVIGATION' }
|
|
359
|
+
} else if (lowerKeyword === 'when') {
|
|
360
|
+
return { type: 'ACTION', icon: 'MOUSE' }
|
|
361
|
+
} else if (lowerKeyword === 'then') {
|
|
362
|
+
return { type: 'ASSERTION', icon: 'VALIDATION' }
|
|
363
|
+
} else if (lowerKeyword === 'and' || lowerKeyword === 'but') {
|
|
364
|
+
return { type: 'ACTION', icon: 'MOUSE' }
|
|
365
|
+
} else {
|
|
366
|
+
// Default fallback
|
|
367
|
+
return { type: 'ACTION', icon: 'MOUSE' }
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Creates or updates a test case step
|
|
373
|
+
*/
|
|
374
|
+
async function createOrUpdateTestCaseStep(testCaseId: string, step: ParsedStep, templateStepId: string): Promise<void> {
|
|
375
|
+
try {
|
|
376
|
+
// Check if step already exists
|
|
377
|
+
const existingStep = await prisma.testCaseStep.findFirst({
|
|
378
|
+
where: {
|
|
379
|
+
testCaseId: testCaseId,
|
|
380
|
+
order: step.order,
|
|
381
|
+
gherkinStep: `${step.keyword} ${step.text}`,
|
|
382
|
+
},
|
|
383
|
+
})
|
|
384
|
+
|
|
385
|
+
if (existingStep) {
|
|
386
|
+
// Update existing step
|
|
387
|
+
await prisma.testCaseStep.update({
|
|
388
|
+
where: { id: existingStep.id },
|
|
389
|
+
data: {
|
|
390
|
+
gherkinStep: `${step.keyword} ${step.text}`,
|
|
391
|
+
label: step.text,
|
|
392
|
+
templateStepId: templateStepId,
|
|
393
|
+
},
|
|
394
|
+
})
|
|
395
|
+
} else {
|
|
396
|
+
// Create new step
|
|
397
|
+
await prisma.testCaseStep.create({
|
|
398
|
+
data: {
|
|
399
|
+
testCaseId: testCaseId,
|
|
400
|
+
order: step.order,
|
|
401
|
+
gherkinStep: `${step.keyword} ${step.text}`,
|
|
402
|
+
icon: determineStepTypeAndIcon(step.keyword).icon,
|
|
403
|
+
label: step.text,
|
|
404
|
+
templateStepId: templateStepId,
|
|
405
|
+
},
|
|
406
|
+
})
|
|
407
|
+
}
|
|
408
|
+
} catch (error) {
|
|
409
|
+
console.error(`Error creating/updating test case step:`, error)
|
|
410
|
+
throw error
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Merges scenarios from feature files with existing test suites
|
|
416
|
+
* This handles conflicts by adding missing scenarios to existing test suites
|
|
417
|
+
*/
|
|
418
|
+
export async function mergeScenariosWithExistingTestSuites(
|
|
419
|
+
parsedFeatures: ParsedFeature[],
|
|
420
|
+
featuresBaseDir: string,
|
|
421
|
+
): Promise<{
|
|
422
|
+
mergedTestSuites: number
|
|
423
|
+
addedScenarios: number
|
|
424
|
+
}> {
|
|
425
|
+
let mergedTestSuites = 0
|
|
426
|
+
let addedScenarios = 0
|
|
427
|
+
|
|
428
|
+
try {
|
|
429
|
+
for (const feature of parsedFeatures) {
|
|
430
|
+
const modulePath = extractModulePathFromFilePath(feature.filePath, featuresBaseDir)
|
|
431
|
+
const moduleId = await buildModuleHierarchy(modulePath)
|
|
432
|
+
|
|
433
|
+
// Find existing test suite
|
|
434
|
+
const existingTestSuite = await prisma.testSuite.findFirst({
|
|
435
|
+
where: {
|
|
436
|
+
name: feature.featureName,
|
|
437
|
+
moduleId: moduleId,
|
|
438
|
+
},
|
|
439
|
+
include: {
|
|
440
|
+
testCases: true,
|
|
441
|
+
},
|
|
442
|
+
})
|
|
443
|
+
|
|
444
|
+
if (existingTestSuite) {
|
|
445
|
+
mergedTestSuites++
|
|
446
|
+
|
|
447
|
+
// Associate feature-level tags with existing test suite
|
|
448
|
+
if (feature.tags && feature.tags.length > 0) {
|
|
449
|
+
const tagIds = await Promise.all(feature.tags.map(tag => findOrCreateTag(tag)))
|
|
450
|
+
await prisma.testSuite.update({
|
|
451
|
+
where: { id: existingTestSuite.id },
|
|
452
|
+
data: {
|
|
453
|
+
tags: {
|
|
454
|
+
connect: tagIds.map(id => ({ id })),
|
|
455
|
+
},
|
|
456
|
+
},
|
|
457
|
+
})
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// Check each scenario and add if it doesn't exist
|
|
461
|
+
for (const scenario of feature.scenarios) {
|
|
462
|
+
const existingTestCase = existingTestSuite.testCases.find(tc => tc.title === scenario.name)
|
|
463
|
+
|
|
464
|
+
if (!existingTestCase) {
|
|
465
|
+
// Create new test case for this scenario
|
|
466
|
+
const testCaseId = await findOrCreateTestCase(
|
|
467
|
+
scenario.name,
|
|
468
|
+
scenario.description || '',
|
|
469
|
+
existingTestSuite.id,
|
|
470
|
+
scenario.tags,
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
if (testCaseId) {
|
|
474
|
+
addedScenarios++
|
|
475
|
+
|
|
476
|
+
// Add steps for this test case
|
|
477
|
+
for (const step of scenario.steps) {
|
|
478
|
+
const templateStepId = await findOrCreateTemplateStep(step)
|
|
479
|
+
if (templateStepId && testCaseId) {
|
|
480
|
+
await createOrUpdateTestCaseStep(testCaseId, step, templateStepId)
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
} else {
|
|
487
|
+
// Create new test suite with all scenarios
|
|
488
|
+
const testSuiteId = await findOrCreateTestSuite(
|
|
489
|
+
feature.featureName,
|
|
490
|
+
feature.featureDescription,
|
|
491
|
+
moduleId,
|
|
492
|
+
feature.tags,
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
if (testSuiteId) {
|
|
496
|
+
mergedTestSuites++
|
|
497
|
+
|
|
498
|
+
for (const scenario of feature.scenarios) {
|
|
499
|
+
const testCaseId = await findOrCreateTestCase(
|
|
500
|
+
scenario.name,
|
|
501
|
+
scenario.description || '',
|
|
502
|
+
testSuiteId,
|
|
503
|
+
scenario.tags,
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
if (testCaseId) {
|
|
507
|
+
addedScenarios++
|
|
508
|
+
|
|
509
|
+
for (const step of scenario.steps) {
|
|
510
|
+
const templateStepId = await findOrCreateTemplateStep(step)
|
|
511
|
+
if (templateStepId && testCaseId) {
|
|
512
|
+
await createOrUpdateTestCaseStep(testCaseId, step, templateStepId)
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
console.log(`Merge completed: ${mergedTestSuites} test suites processed, ${addedScenarios} new scenarios added`)
|
|
522
|
+
|
|
523
|
+
return {
|
|
524
|
+
mergedTestSuites,
|
|
525
|
+
addedScenarios,
|
|
526
|
+
}
|
|
527
|
+
} catch (error) {
|
|
528
|
+
console.error('Error merging scenarios with existing test suites:', error)
|
|
529
|
+
throw error
|
|
530
|
+
}
|
|
531
|
+
}
|