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,144 +1,144 @@
|
|
|
1
|
-
import { BrowserEngine, Environment, Tag } from '@prisma/client'
|
|
2
|
-
import { spawnTask } from '@/tests/utils/spawner.util'
|
|
3
|
-
import { processManager } from './process-manager'
|
|
4
|
-
import type { SpawnedProcess } from '@/tests/utils/spawner.util'
|
|
5
|
-
import { join } from 'path'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Configuration for executing a test run
|
|
9
|
-
*/
|
|
10
|
-
export interface TestRunExecutionConfig {
|
|
11
|
-
testRunId: string
|
|
12
|
-
environment: Environment
|
|
13
|
-
tags: Tag[]
|
|
14
|
-
testWorkersCount: number
|
|
15
|
-
browserEngine: BrowserEngine
|
|
16
|
-
headless?: boolean
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Maps BrowserEngine enum to browser name string for CLI
|
|
21
|
-
*/
|
|
22
|
-
function mapBrowserEngineToName(browserEngine: BrowserEngine): 'chromium' | 'firefox' | 'webkit' {
|
|
23
|
-
switch (browserEngine) {
|
|
24
|
-
case BrowserEngine.CHROMIUM:
|
|
25
|
-
return 'chromium'
|
|
26
|
-
case BrowserEngine.FIREFOX:
|
|
27
|
-
return 'firefox'
|
|
28
|
-
case BrowserEngine.WEBKIT:
|
|
29
|
-
return 'webkit'
|
|
30
|
-
default:
|
|
31
|
-
return 'chromium'
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Combines multiple tag expressions into a single Cucumber tag expression
|
|
37
|
-
* Uses OR logic to combine tags: (@tag1 or @tag2 or @tag3)
|
|
38
|
-
*/
|
|
39
|
-
function combineTagExpressions(tags: Tag[]): string | null {
|
|
40
|
-
if (tags.length === 0) {
|
|
41
|
-
return null
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (tags.length === 1) {
|
|
45
|
-
return tags[0].tagExpression
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Combine multiple tag expressions with OR
|
|
49
|
-
return tags.map(tag => `(${tag.tagExpression})`).join(' or ')
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Generates a unique report path for a test run
|
|
54
|
-
* Format: src/tests/reports/cucumber-{testRunId}-{timestamp}.json
|
|
55
|
-
*
|
|
56
|
-
* @param testRunId - The test run ID (runId, not id)
|
|
57
|
-
* @returns The full path to the report file
|
|
58
|
-
*/
|
|
59
|
-
export function generateReportPath(testRunId: string): string {
|
|
60
|
-
const timestamp = Date.now()
|
|
61
|
-
const reportFileName = `cucumber-${testRunId}-${timestamp}.json`
|
|
62
|
-
const reportPath = join(process.cwd(), 'src', 'tests', 'reports', reportFileName)
|
|
63
|
-
return reportPath
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Sets environment variables for the test execution
|
|
68
|
-
*/
|
|
69
|
-
function setEnvironmentVariables(
|
|
70
|
-
environment: Environment,
|
|
71
|
-
headless: boolean,
|
|
72
|
-
browser: string,
|
|
73
|
-
reportPath?: string,
|
|
74
|
-
): void {
|
|
75
|
-
process.env.ENVIRONMENT = environment.name
|
|
76
|
-
process.env.HEADLESS = headless.toString()
|
|
77
|
-
process.env.BROWSER = browser
|
|
78
|
-
if (reportPath) {
|
|
79
|
-
process.env.REPORT_PATH = reportPath
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Executes a test run by spawning a cucumber process
|
|
85
|
-
*
|
|
86
|
-
* @param config - Test run execution configuration
|
|
87
|
-
* @returns Promise that resolves to an object containing the spawned process and report path
|
|
88
|
-
*/
|
|
89
|
-
export async function executeTestRun(config: TestRunExecutionConfig): Promise<{
|
|
90
|
-
process: SpawnedProcess
|
|
91
|
-
reportPath: string
|
|
92
|
-
}> {
|
|
93
|
-
const { testRunId, environment, tags, testWorkersCount, browserEngine, headless = true } = config
|
|
94
|
-
|
|
95
|
-
// Generate unique report path
|
|
96
|
-
const reportPath = generateReportPath(testRunId)
|
|
97
|
-
|
|
98
|
-
// Map browser engine to browser name
|
|
99
|
-
const browserName = mapBrowserEngineToName(browserEngine)
|
|
100
|
-
|
|
101
|
-
// Set environment variables including report path
|
|
102
|
-
setEnvironmentVariables(environment, headless, browserName, reportPath)
|
|
103
|
-
|
|
104
|
-
// Build cucumber command arguments
|
|
105
|
-
const cucumberArgs: string[] = []
|
|
106
|
-
|
|
107
|
-
// Add tag expression if tags are provided
|
|
108
|
-
const tagExpression = combineTagExpressions(tags)
|
|
109
|
-
if (tagExpression) {
|
|
110
|
-
cucumberArgs.push('-t', tagExpression)
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Add parallel flag if workers > 1
|
|
114
|
-
if (testWorkersCount > 1) {
|
|
115
|
-
cucumberArgs.push('--parallel', testWorkersCount.toString())
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Spawn the cucumber test process
|
|
119
|
-
// Enable streamLogs to see output in console for debugging
|
|
120
|
-
// Use captureOutput: true to capture logs for streaming
|
|
121
|
-
const process = await spawnTask('npx', ['cucumber-js', ...cucumberArgs], {
|
|
122
|
-
streamLogs: true, // Enable console output to verify logs are being generated
|
|
123
|
-
prefixLogs: true, // Add prefix to identify logs
|
|
124
|
-
logPrefix: `test-run-${testRunId}`,
|
|
125
|
-
captureOutput: true, // Capture output for streaming
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
// Register the process in ProcessManager
|
|
129
|
-
console.log(`[TestRunExecutor] Registering process for testRunId: ${testRunId}, process name: ${process.name}`)
|
|
130
|
-
processManager.register(testRunId, process)
|
|
131
|
-
console.log(`[TestRunExecutor] Process registered. ProcessManager now has ${processManager.size()} processes`)
|
|
132
|
-
|
|
133
|
-
// Set up exit handler - Immediately unregister process to free up memory
|
|
134
|
-
process.process.on('exit', code => {
|
|
135
|
-
// Immediately unregister the process to free up memory
|
|
136
|
-
// Log storage will be handled in createTestRunAction after process completion
|
|
137
|
-
processManager.unregister(testRunId)
|
|
138
|
-
console.log(
|
|
139
|
-
`[TestRunExecutor] Process exited for testRunId: ${testRunId} with code ${code}, unregistered from ProcessManager`,
|
|
140
|
-
)
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
return { process, reportPath }
|
|
144
|
-
}
|
|
1
|
+
import { BrowserEngine, Environment, Tag } from '@prisma/client'
|
|
2
|
+
import { spawnTask } from '@/tests/utils/spawner.util'
|
|
3
|
+
import { processManager } from './process-manager'
|
|
4
|
+
import type { SpawnedProcess } from '@/tests/utils/spawner.util'
|
|
5
|
+
import { join } from 'path'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Configuration for executing a test run
|
|
9
|
+
*/
|
|
10
|
+
export interface TestRunExecutionConfig {
|
|
11
|
+
testRunId: string
|
|
12
|
+
environment: Environment
|
|
13
|
+
tags: Tag[]
|
|
14
|
+
testWorkersCount: number
|
|
15
|
+
browserEngine: BrowserEngine
|
|
16
|
+
headless?: boolean
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Maps BrowserEngine enum to browser name string for CLI
|
|
21
|
+
*/
|
|
22
|
+
function mapBrowserEngineToName(browserEngine: BrowserEngine): 'chromium' | 'firefox' | 'webkit' {
|
|
23
|
+
switch (browserEngine) {
|
|
24
|
+
case BrowserEngine.CHROMIUM:
|
|
25
|
+
return 'chromium'
|
|
26
|
+
case BrowserEngine.FIREFOX:
|
|
27
|
+
return 'firefox'
|
|
28
|
+
case BrowserEngine.WEBKIT:
|
|
29
|
+
return 'webkit'
|
|
30
|
+
default:
|
|
31
|
+
return 'chromium'
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Combines multiple tag expressions into a single Cucumber tag expression
|
|
37
|
+
* Uses OR logic to combine tags: (@tag1 or @tag2 or @tag3)
|
|
38
|
+
*/
|
|
39
|
+
function combineTagExpressions(tags: Tag[]): string | null {
|
|
40
|
+
if (tags.length === 0) {
|
|
41
|
+
return null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (tags.length === 1) {
|
|
45
|
+
return tags[0].tagExpression
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Combine multiple tag expressions with OR
|
|
49
|
+
return tags.map(tag => `(${tag.tagExpression})`).join(' or ')
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Generates a unique report path for a test run
|
|
54
|
+
* Format: src/tests/reports/cucumber-{testRunId}-{timestamp}.json
|
|
55
|
+
*
|
|
56
|
+
* @param testRunId - The test run ID (runId, not id)
|
|
57
|
+
* @returns The full path to the report file
|
|
58
|
+
*/
|
|
59
|
+
export function generateReportPath(testRunId: string): string {
|
|
60
|
+
const timestamp = Date.now()
|
|
61
|
+
const reportFileName = `cucumber-${testRunId}-${timestamp}.json`
|
|
62
|
+
const reportPath = join(process.cwd(), 'src', 'tests', 'reports', reportFileName)
|
|
63
|
+
return reportPath
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Sets environment variables for the test execution
|
|
68
|
+
*/
|
|
69
|
+
function setEnvironmentVariables(
|
|
70
|
+
environment: Environment,
|
|
71
|
+
headless: boolean,
|
|
72
|
+
browser: string,
|
|
73
|
+
reportPath?: string,
|
|
74
|
+
): void {
|
|
75
|
+
process.env.ENVIRONMENT = environment.name
|
|
76
|
+
process.env.HEADLESS = headless.toString()
|
|
77
|
+
process.env.BROWSER = browser
|
|
78
|
+
if (reportPath) {
|
|
79
|
+
process.env.REPORT_PATH = reportPath
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Executes a test run by spawning a cucumber process
|
|
85
|
+
*
|
|
86
|
+
* @param config - Test run execution configuration
|
|
87
|
+
* @returns Promise that resolves to an object containing the spawned process and report path
|
|
88
|
+
*/
|
|
89
|
+
export async function executeTestRun(config: TestRunExecutionConfig): Promise<{
|
|
90
|
+
process: SpawnedProcess
|
|
91
|
+
reportPath: string
|
|
92
|
+
}> {
|
|
93
|
+
const { testRunId, environment, tags, testWorkersCount, browserEngine, headless = true } = config
|
|
94
|
+
|
|
95
|
+
// Generate unique report path
|
|
96
|
+
const reportPath = generateReportPath(testRunId)
|
|
97
|
+
|
|
98
|
+
// Map browser engine to browser name
|
|
99
|
+
const browserName = mapBrowserEngineToName(browserEngine)
|
|
100
|
+
|
|
101
|
+
// Set environment variables including report path
|
|
102
|
+
setEnvironmentVariables(environment, headless, browserName, reportPath)
|
|
103
|
+
|
|
104
|
+
// Build cucumber command arguments
|
|
105
|
+
const cucumberArgs: string[] = []
|
|
106
|
+
|
|
107
|
+
// Add tag expression if tags are provided
|
|
108
|
+
const tagExpression = combineTagExpressions(tags)
|
|
109
|
+
if (tagExpression) {
|
|
110
|
+
cucumberArgs.push('-t', tagExpression)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Add parallel flag if workers > 1
|
|
114
|
+
if (testWorkersCount > 1) {
|
|
115
|
+
cucumberArgs.push('--parallel', testWorkersCount.toString())
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Spawn the cucumber test process
|
|
119
|
+
// Enable streamLogs to see output in console for debugging
|
|
120
|
+
// Use captureOutput: true to capture logs for streaming
|
|
121
|
+
const process = await spawnTask('npx', ['cucumber-js', ...cucumberArgs], {
|
|
122
|
+
streamLogs: true, // Enable console output to verify logs are being generated
|
|
123
|
+
prefixLogs: true, // Add prefix to identify logs
|
|
124
|
+
logPrefix: `test-run-${testRunId}`,
|
|
125
|
+
captureOutput: true, // Capture output for streaming
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
// Register the process in ProcessManager
|
|
129
|
+
console.log(`[TestRunExecutor] Registering process for testRunId: ${testRunId}, process name: ${process.name}`)
|
|
130
|
+
processManager.register(testRunId, process)
|
|
131
|
+
console.log(`[TestRunExecutor] Process registered. ProcessManager now has ${processManager.size()} processes`)
|
|
132
|
+
|
|
133
|
+
// Set up exit handler - Immediately unregister process to free up memory
|
|
134
|
+
process.process.on('exit', code => {
|
|
135
|
+
// Immediately unregister the process to free up memory
|
|
136
|
+
// Log storage will be handled in createTestRunAction after process completion
|
|
137
|
+
processManager.unregister(testRunId)
|
|
138
|
+
console.log(
|
|
139
|
+
`[TestRunExecutor] Process exited for testRunId: ${testRunId} with code ${code}, unregistered from ProcessManager`,
|
|
140
|
+
)
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
return { process, reportPath }
|
|
144
|
+
}
|
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
import winston from 'winston'
|
|
2
|
-
import path from 'path'
|
|
3
|
-
import { promises as fs } from 'fs'
|
|
4
|
-
|
|
5
|
-
const LOGS_DIR = path.join(process.cwd(), 'src', 'tests', 'reports', 'logs')
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Ensures the logs directory exists, creating it if necessary
|
|
9
|
-
*/
|
|
10
|
-
async function ensureLogsDirectory(): Promise<void> {
|
|
11
|
-
try {
|
|
12
|
-
await fs.access(LOGS_DIR)
|
|
13
|
-
} catch {
|
|
14
|
-
// Directory doesn't exist, create it
|
|
15
|
-
await fs.mkdir(LOGS_DIR, { recursive: true })
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Creates a Winston logger instance for a specific test run
|
|
21
|
-
* @param testRunId - The unique test run ID (runId, not id)
|
|
22
|
-
* @returns A configured Winston logger instance
|
|
23
|
-
*/
|
|
24
|
-
export async function createTestRunLogger(testRunId: string): Promise<winston.Logger> {
|
|
25
|
-
// Ensure logs directory exists
|
|
26
|
-
await ensureLogsDirectory()
|
|
27
|
-
|
|
28
|
-
// Create log file path
|
|
29
|
-
const logFilePath = path.join(LOGS_DIR, `${testRunId}.log`)
|
|
30
|
-
|
|
31
|
-
// Define log format
|
|
32
|
-
const logFormat = winston.format.combine(
|
|
33
|
-
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
34
|
-
winston.format.errors({ stack: true }),
|
|
35
|
-
winston.format.printf(({ timestamp, level, message, stack }) => {
|
|
36
|
-
if (stack) {
|
|
37
|
-
return `${timestamp} [${level.toUpperCase()}]: ${message}\n${stack}`
|
|
38
|
-
}
|
|
39
|
-
return `${timestamp} [${level.toUpperCase()}]: ${message}`
|
|
40
|
-
}),
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
// Create logger with console and file transports
|
|
44
|
-
const logger = winston.createLogger({
|
|
45
|
-
level: 'info',
|
|
46
|
-
format: logFormat,
|
|
47
|
-
transports: [
|
|
48
|
-
// Console transport (stdout)
|
|
49
|
-
new winston.transports.Console({
|
|
50
|
-
format: winston.format.combine(
|
|
51
|
-
winston.format.colorize(),
|
|
52
|
-
winston.format.printf(({ timestamp, level, message, stack }) => {
|
|
53
|
-
if (stack) {
|
|
54
|
-
return `${timestamp} [${level}]: ${message}\n${stack}`
|
|
55
|
-
}
|
|
56
|
-
return `${timestamp} [${level}]: ${message}`
|
|
57
|
-
}),
|
|
58
|
-
),
|
|
59
|
-
}),
|
|
60
|
-
// File transport
|
|
61
|
-
new winston.transports.File({
|
|
62
|
-
filename: logFilePath,
|
|
63
|
-
maxsize: 10 * 1024 * 1024, // 10MB
|
|
64
|
-
maxFiles: 5,
|
|
65
|
-
}),
|
|
66
|
-
],
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
return logger
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Closes a Winston logger instance, ensuring all logs are flushed
|
|
74
|
-
* @param logger - The logger instance to close
|
|
75
|
-
*/
|
|
76
|
-
export async function closeLogger(logger: winston.Logger): Promise<void> {
|
|
77
|
-
return new Promise((resolve, reject) => {
|
|
78
|
-
logger.end((err: Error | null) => {
|
|
79
|
-
if (err) {
|
|
80
|
-
reject(err)
|
|
81
|
-
} else {
|
|
82
|
-
resolve()
|
|
83
|
-
}
|
|
84
|
-
})
|
|
85
|
-
})
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Gets the log file path for a test run
|
|
90
|
-
* @param testRunId - The unique test run ID (runId, not id)
|
|
91
|
-
* @returns The absolute path to the log file
|
|
92
|
-
*/
|
|
93
|
-
export function getLogFilePath(testRunId: string): string {
|
|
94
|
-
return path.join(LOGS_DIR, `${testRunId}.log`)
|
|
95
|
-
}
|
|
1
|
+
import winston from 'winston'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
import { promises as fs } from 'fs'
|
|
4
|
+
|
|
5
|
+
const LOGS_DIR = path.join(process.cwd(), 'src', 'tests', 'reports', 'logs')
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Ensures the logs directory exists, creating it if necessary
|
|
9
|
+
*/
|
|
10
|
+
async function ensureLogsDirectory(): Promise<void> {
|
|
11
|
+
try {
|
|
12
|
+
await fs.access(LOGS_DIR)
|
|
13
|
+
} catch {
|
|
14
|
+
// Directory doesn't exist, create it
|
|
15
|
+
await fs.mkdir(LOGS_DIR, { recursive: true })
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Creates a Winston logger instance for a specific test run
|
|
21
|
+
* @param testRunId - The unique test run ID (runId, not id)
|
|
22
|
+
* @returns A configured Winston logger instance
|
|
23
|
+
*/
|
|
24
|
+
export async function createTestRunLogger(testRunId: string): Promise<winston.Logger> {
|
|
25
|
+
// Ensure logs directory exists
|
|
26
|
+
await ensureLogsDirectory()
|
|
27
|
+
|
|
28
|
+
// Create log file path
|
|
29
|
+
const logFilePath = path.join(LOGS_DIR, `${testRunId}.log`)
|
|
30
|
+
|
|
31
|
+
// Define log format
|
|
32
|
+
const logFormat = winston.format.combine(
|
|
33
|
+
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
34
|
+
winston.format.errors({ stack: true }),
|
|
35
|
+
winston.format.printf(({ timestamp, level, message, stack }) => {
|
|
36
|
+
if (stack) {
|
|
37
|
+
return `${timestamp} [${level.toUpperCase()}]: ${message}\n${stack}`
|
|
38
|
+
}
|
|
39
|
+
return `${timestamp} [${level.toUpperCase()}]: ${message}`
|
|
40
|
+
}),
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
// Create logger with console and file transports
|
|
44
|
+
const logger = winston.createLogger({
|
|
45
|
+
level: 'info',
|
|
46
|
+
format: logFormat,
|
|
47
|
+
transports: [
|
|
48
|
+
// Console transport (stdout)
|
|
49
|
+
new winston.transports.Console({
|
|
50
|
+
format: winston.format.combine(
|
|
51
|
+
winston.format.colorize(),
|
|
52
|
+
winston.format.printf(({ timestamp, level, message, stack }) => {
|
|
53
|
+
if (stack) {
|
|
54
|
+
return `${timestamp} [${level}]: ${message}\n${stack}`
|
|
55
|
+
}
|
|
56
|
+
return `${timestamp} [${level}]: ${message}`
|
|
57
|
+
}),
|
|
58
|
+
),
|
|
59
|
+
}),
|
|
60
|
+
// File transport
|
|
61
|
+
new winston.transports.File({
|
|
62
|
+
filename: logFilePath,
|
|
63
|
+
maxsize: 10 * 1024 * 1024, // 10MB
|
|
64
|
+
maxFiles: 5,
|
|
65
|
+
}),
|
|
66
|
+
],
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
return logger
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Closes a Winston logger instance, ensuring all logs are flushed
|
|
74
|
+
* @param logger - The logger instance to close
|
|
75
|
+
*/
|
|
76
|
+
export async function closeLogger(logger: winston.Logger): Promise<void> {
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
logger.end((err: Error | null) => {
|
|
79
|
+
if (err) {
|
|
80
|
+
reject(err)
|
|
81
|
+
} else {
|
|
82
|
+
resolve()
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Gets the log file path for a test run
|
|
90
|
+
* @param testRunId - The unique test run ID (runId, not id)
|
|
91
|
+
* @returns The absolute path to the log file
|
|
92
|
+
*/
|
|
93
|
+
export function getLogFilePath(testRunId: string): string {
|
|
94
|
+
return path.join(LOGS_DIR, `${testRunId}.log`)
|
|
95
|
+
}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { TemplateStepType } from '@prisma/client'
|
|
2
|
-
|
|
3
|
-
export const generateGherkinStep = (
|
|
4
|
-
type: TemplateStepType,
|
|
5
|
-
signature: string,
|
|
6
|
-
parameters: { value: string; order: number }[],
|
|
7
|
-
) => {
|
|
8
|
-
const signatureParts = signature.split(' ')
|
|
9
|
-
const sortedParameters = parameters.sort((a, b) => a.order - b.order)
|
|
10
|
-
|
|
11
|
-
const gherkinStep = signatureParts
|
|
12
|
-
.map(part => {
|
|
13
|
-
// Check if this part is a parameter placeholder
|
|
14
|
-
if (part.startsWith('{') && part.endsWith('}')) {
|
|
15
|
-
const parameter = sortedParameters.shift()
|
|
16
|
-
|
|
17
|
-
// If no parameter or missing value, return the placeholder to indicate incompleteness
|
|
18
|
-
if (!parameter || !parameter.value || parameter.value.trim() === '') {
|
|
19
|
-
return part
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Format the parameter value based on its type
|
|
23
|
-
switch (part) {
|
|
24
|
-
case '{string}':
|
|
25
|
-
return `"${parameter.value}"`
|
|
26
|
-
case '{int}':
|
|
27
|
-
return parameter.value
|
|
28
|
-
case '{boolean}':
|
|
29
|
-
return parameter.value
|
|
30
|
-
default:
|
|
31
|
-
return parameter.value
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return part
|
|
36
|
-
})
|
|
37
|
-
.join(' ')
|
|
38
|
-
|
|
39
|
-
// Prepend the appropriate Gherkin keyword based on type
|
|
40
|
-
const keyword = type === 'ACTION' ? 'When' : 'Then'
|
|
41
|
-
return `${keyword} ${gherkinStep}`
|
|
42
|
-
}
|
|
1
|
+
import { TemplateStepType } from '@prisma/client'
|
|
2
|
+
|
|
3
|
+
export const generateGherkinStep = (
|
|
4
|
+
type: TemplateStepType,
|
|
5
|
+
signature: string,
|
|
6
|
+
parameters: { value: string; order: number }[],
|
|
7
|
+
) => {
|
|
8
|
+
const signatureParts = signature.split(' ')
|
|
9
|
+
const sortedParameters = parameters.sort((a, b) => a.order - b.order)
|
|
10
|
+
|
|
11
|
+
const gherkinStep = signatureParts
|
|
12
|
+
.map(part => {
|
|
13
|
+
// Check if this part is a parameter placeholder
|
|
14
|
+
if (part.startsWith('{') && part.endsWith('}')) {
|
|
15
|
+
const parameter = sortedParameters.shift()
|
|
16
|
+
|
|
17
|
+
// If no parameter or missing value, return the placeholder to indicate incompleteness
|
|
18
|
+
if (!parameter || !parameter.value || parameter.value.trim() === '') {
|
|
19
|
+
return part
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Format the parameter value based on its type
|
|
23
|
+
switch (part) {
|
|
24
|
+
case '{string}':
|
|
25
|
+
return `"${parameter.value}"`
|
|
26
|
+
case '{int}':
|
|
27
|
+
return parameter.value
|
|
28
|
+
case '{boolean}':
|
|
29
|
+
return parameter.value
|
|
30
|
+
default:
|
|
31
|
+
return parameter.value
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return part
|
|
36
|
+
})
|
|
37
|
+
.join(' ')
|
|
38
|
+
|
|
39
|
+
// Prepend the appropriate Gherkin keyword based on type
|
|
40
|
+
const keyword = type === 'ACTION' ? 'When' : 'Then'
|
|
41
|
+
return `${keyword} ${gherkinStep}`
|
|
42
|
+
}
|