create-appraisejs 0.1.7 → 0.1.8
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 +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/copy-template.d.ts.map +1 -1
- package/dist/copy-template.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,99 +1,99 @@
|
|
|
1
|
-
import { After, AfterAll, AfterStep, Before, BeforeAll, setDefaultTimeout } from '@cucumber/cucumber'
|
|
2
|
-
import { CustomWorld } from '../config/executor/world.js'
|
|
3
|
-
import { BrowserName } from '@/types/executor/browser.type'
|
|
4
|
-
import { config } from 'dotenv'
|
|
5
|
-
import { chromium, ChromiumBrowser, firefox, FirefoxBrowser, webkit, WebKitBrowser } from 'playwright'
|
|
6
|
-
|
|
7
|
-
// Load environment variables
|
|
8
|
-
config()
|
|
9
|
-
|
|
10
|
-
// Initialize browser
|
|
11
|
-
let browser: ChromiumBrowser | FirefoxBrowser | WebKitBrowser
|
|
12
|
-
|
|
13
|
-
// Track scenario status
|
|
14
|
-
let currentScenarioStatus: string = 'unknown'
|
|
15
|
-
|
|
16
|
-
BeforeAll(async function () {
|
|
17
|
-
setDefaultTimeout(60000)
|
|
18
|
-
const browserName = (process.env.BROWSER as BrowserName) || 'chromium'
|
|
19
|
-
switch (browserName) {
|
|
20
|
-
case 'chromium':
|
|
21
|
-
browser = await chromium.launch({
|
|
22
|
-
headless: process.env.HEADLESS === 'true',
|
|
23
|
-
})
|
|
24
|
-
break
|
|
25
|
-
case 'firefox':
|
|
26
|
-
browser = await firefox.launch({
|
|
27
|
-
headless: process.env.HEADLESS === 'true',
|
|
28
|
-
})
|
|
29
|
-
break
|
|
30
|
-
case 'webkit':
|
|
31
|
-
browser = await webkit.launch({
|
|
32
|
-
headless: process.env.HEADLESS === 'true',
|
|
33
|
-
})
|
|
34
|
-
break
|
|
35
|
-
default:
|
|
36
|
-
throw new Error(`Invalid browser name: ${browserName}`)
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
Before(async function (this: CustomWorld) {
|
|
41
|
-
this.clearVars()
|
|
42
|
-
this.context = await browser.newContext()
|
|
43
|
-
await this.context.tracing.start({
|
|
44
|
-
screenshots: true,
|
|
45
|
-
snapshots: true,
|
|
46
|
-
sources: true,
|
|
47
|
-
})
|
|
48
|
-
this.page = await this.context.newPage()
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
AfterStep(async function (this: CustomWorld, result) {
|
|
52
|
-
// Track the worst status encountered (failed > skipped > passed)
|
|
53
|
-
const status = result.result?.status
|
|
54
|
-
if (status === 'FAILED') {
|
|
55
|
-
currentScenarioStatus = 'failed'
|
|
56
|
-
} else if (status === 'SKIPPED' && currentScenarioStatus !== 'failed') {
|
|
57
|
-
currentScenarioStatus = 'skipped'
|
|
58
|
-
} else if (status === 'PASSED' && currentScenarioStatus === 'unknown') {
|
|
59
|
-
currentScenarioStatus = 'passed'
|
|
60
|
-
}
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
After(async function (this: CustomWorld, scenario) {
|
|
64
|
-
// Emit scenario end event as JSON to stdout
|
|
65
|
-
// ProcessManager will parse this and re-emit it as an event
|
|
66
|
-
let tracePath: string | undefined
|
|
67
|
-
if (scenario.result?.status === 'FAILED') {
|
|
68
|
-
tracePath = `${process.cwd()}/src/tests/reports/traces/${crypto.randomUUID()}.zip`
|
|
69
|
-
await this.context.tracing.stop({
|
|
70
|
-
path: tracePath,
|
|
71
|
-
})
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const eventData = {
|
|
75
|
-
event: 'scenario::end',
|
|
76
|
-
data: {
|
|
77
|
-
scenarioName: scenario.pickle.name,
|
|
78
|
-
status: currentScenarioStatus,
|
|
79
|
-
tracePath: tracePath,
|
|
80
|
-
},
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Write to stdout in a parseable JSON format
|
|
84
|
-
// Use process.stdout.write to ensure it's captured by TaskSpawner
|
|
85
|
-
const eventJson = JSON.stringify(eventData)
|
|
86
|
-
console.log(eventJson)
|
|
87
|
-
// Also write directly to stdout to ensure it's captured
|
|
88
|
-
process.stdout.write(eventJson + '\n')
|
|
89
|
-
|
|
90
|
-
// Reset status for next scenario
|
|
91
|
-
currentScenarioStatus = 'unknown'
|
|
92
|
-
|
|
93
|
-
await this.page.close()
|
|
94
|
-
await this.context.close()
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
AfterAll(async function () {
|
|
98
|
-
await browser.close()
|
|
99
|
-
})
|
|
1
|
+
import { After, AfterAll, AfterStep, Before, BeforeAll, setDefaultTimeout } from '@cucumber/cucumber'
|
|
2
|
+
import { CustomWorld } from '../config/executor/world.js'
|
|
3
|
+
import { BrowserName } from '@/types/executor/browser.type'
|
|
4
|
+
import { config } from 'dotenv'
|
|
5
|
+
import { chromium, ChromiumBrowser, firefox, FirefoxBrowser, webkit, WebKitBrowser } from 'playwright'
|
|
6
|
+
|
|
7
|
+
// Load environment variables
|
|
8
|
+
config()
|
|
9
|
+
|
|
10
|
+
// Initialize browser
|
|
11
|
+
let browser: ChromiumBrowser | FirefoxBrowser | WebKitBrowser
|
|
12
|
+
|
|
13
|
+
// Track scenario status
|
|
14
|
+
let currentScenarioStatus: string = 'unknown'
|
|
15
|
+
|
|
16
|
+
BeforeAll(async function () {
|
|
17
|
+
setDefaultTimeout(60000)
|
|
18
|
+
const browserName = (process.env.BROWSER as BrowserName) || 'chromium'
|
|
19
|
+
switch (browserName) {
|
|
20
|
+
case 'chromium':
|
|
21
|
+
browser = await chromium.launch({
|
|
22
|
+
headless: process.env.HEADLESS === 'true',
|
|
23
|
+
})
|
|
24
|
+
break
|
|
25
|
+
case 'firefox':
|
|
26
|
+
browser = await firefox.launch({
|
|
27
|
+
headless: process.env.HEADLESS === 'true',
|
|
28
|
+
})
|
|
29
|
+
break
|
|
30
|
+
case 'webkit':
|
|
31
|
+
browser = await webkit.launch({
|
|
32
|
+
headless: process.env.HEADLESS === 'true',
|
|
33
|
+
})
|
|
34
|
+
break
|
|
35
|
+
default:
|
|
36
|
+
throw new Error(`Invalid browser name: ${browserName}`)
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
Before(async function (this: CustomWorld) {
|
|
41
|
+
this.clearVars()
|
|
42
|
+
this.context = await browser.newContext()
|
|
43
|
+
await this.context.tracing.start({
|
|
44
|
+
screenshots: true,
|
|
45
|
+
snapshots: true,
|
|
46
|
+
sources: true,
|
|
47
|
+
})
|
|
48
|
+
this.page = await this.context.newPage()
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
AfterStep(async function (this: CustomWorld, result) {
|
|
52
|
+
// Track the worst status encountered (failed > skipped > passed)
|
|
53
|
+
const status = result.result?.status
|
|
54
|
+
if (status === 'FAILED') {
|
|
55
|
+
currentScenarioStatus = 'failed'
|
|
56
|
+
} else if (status === 'SKIPPED' && currentScenarioStatus !== 'failed') {
|
|
57
|
+
currentScenarioStatus = 'skipped'
|
|
58
|
+
} else if (status === 'PASSED' && currentScenarioStatus === 'unknown') {
|
|
59
|
+
currentScenarioStatus = 'passed'
|
|
60
|
+
}
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
After(async function (this: CustomWorld, scenario) {
|
|
64
|
+
// Emit scenario end event as JSON to stdout
|
|
65
|
+
// ProcessManager will parse this and re-emit it as an event
|
|
66
|
+
let tracePath: string | undefined
|
|
67
|
+
if (scenario.result?.status === 'FAILED') {
|
|
68
|
+
tracePath = `${process.cwd()}/src/tests/reports/traces/${crypto.randomUUID()}.zip`
|
|
69
|
+
await this.context.tracing.stop({
|
|
70
|
+
path: tracePath,
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const eventData = {
|
|
75
|
+
event: 'scenario::end',
|
|
76
|
+
data: {
|
|
77
|
+
scenarioName: scenario.pickle.name,
|
|
78
|
+
status: currentScenarioStatus,
|
|
79
|
+
tracePath: tracePath,
|
|
80
|
+
},
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Write to stdout in a parseable JSON format
|
|
84
|
+
// Use process.stdout.write to ensure it's captured by TaskSpawner
|
|
85
|
+
const eventJson = JSON.stringify(eventData)
|
|
86
|
+
console.log(eventJson)
|
|
87
|
+
// Also write directly to stdout to ensure it's captured
|
|
88
|
+
process.stdout.write(eventJson + '\n')
|
|
89
|
+
|
|
90
|
+
// Reset status for next scenario
|
|
91
|
+
currentScenarioStatus = 'unknown'
|
|
92
|
+
|
|
93
|
+
await this.page.close()
|
|
94
|
+
await this.context.close()
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
AfterAll(async function () {
|
|
98
|
+
await browser.close()
|
|
99
|
+
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[]
|
|
1
|
+
[]
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @name click
|
|
3
|
-
* @description Template step for handling element click
|
|
4
|
-
* @type ACTION
|
|
5
|
-
*/
|
|
6
|
-
import { When } from '@cucumber/cucumber'
|
|
7
|
-
import { CustomWorld } from '../../config/executor/world.js'
|
|
8
|
-
import { SelectorName } from '@/types/locator/locator.type'
|
|
9
|
-
import { resolveLocator } from '../../utils/locator.util.js'
|
|
10
|
-
|
|
11
|
-
// This file is generated automatically. Add template steps to this group to generate content.
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @name click
|
|
15
|
-
* @description Template step for clicking on an element
|
|
16
|
-
* @icon MOUSE
|
|
17
|
-
*/
|
|
18
|
-
When('the user clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
|
|
19
|
-
const selector = await resolveLocator(this.page, elementName)
|
|
20
|
-
if (!selector) {
|
|
21
|
-
throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
|
|
22
|
-
}
|
|
23
|
-
try {
|
|
24
|
-
await this.page.locator(selector).click()
|
|
25
|
-
} catch (error) {
|
|
26
|
-
throw new Error(`Failed to click on the ${elementName} element: ${error}`)
|
|
27
|
-
}
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* @name double click
|
|
32
|
-
* @description Template step for double clicking on an element
|
|
33
|
-
* @icon MOUSE
|
|
34
|
-
*/
|
|
35
|
-
When('the user double clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
|
|
36
|
-
const selector = await resolveLocator(this.page, elementName)
|
|
37
|
-
if (!selector) {
|
|
38
|
-
throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
await this.page.locator(selector).dblclick()
|
|
42
|
-
} catch (error) {
|
|
43
|
-
throw new Error(`Failed to double click on the ${elementName} element: ${error}`)
|
|
44
|
-
}
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* @name right click
|
|
49
|
-
* @description Template step for right clicking on an element
|
|
50
|
-
* @icon MOUSE
|
|
51
|
-
*/
|
|
52
|
-
When('the user right clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
|
|
53
|
-
const selector = await resolveLocator(this.page, elementName)
|
|
54
|
-
if (!selector) {
|
|
55
|
-
throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
|
|
56
|
-
}
|
|
57
|
-
try {
|
|
58
|
-
await this.page.locator(selector).click({ button: 'right' })
|
|
59
|
-
} catch (error) {
|
|
60
|
-
throw new Error(`Failed to right click on the ${elementName} element: ${error}`)
|
|
61
|
-
}
|
|
62
|
-
})
|
|
1
|
+
/**
|
|
2
|
+
* @name click
|
|
3
|
+
* @description Template step for handling element click
|
|
4
|
+
* @type ACTION
|
|
5
|
+
*/
|
|
6
|
+
import { When } from '@cucumber/cucumber'
|
|
7
|
+
import { CustomWorld } from '../../config/executor/world.js'
|
|
8
|
+
import { SelectorName } from '@/types/locator/locator.type'
|
|
9
|
+
import { resolveLocator } from '../../utils/locator.util.js'
|
|
10
|
+
|
|
11
|
+
// This file is generated automatically. Add template steps to this group to generate content.
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @name click
|
|
15
|
+
* @description Template step for clicking on an element
|
|
16
|
+
* @icon MOUSE
|
|
17
|
+
*/
|
|
18
|
+
When('the user clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
|
|
19
|
+
const selector = await resolveLocator(this.page, elementName)
|
|
20
|
+
if (!selector) {
|
|
21
|
+
throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
await this.page.locator(selector).click()
|
|
25
|
+
} catch (error) {
|
|
26
|
+
throw new Error(`Failed to click on the ${elementName} element: ${error}`)
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @name double click
|
|
32
|
+
* @description Template step for double clicking on an element
|
|
33
|
+
* @icon MOUSE
|
|
34
|
+
*/
|
|
35
|
+
When('the user double clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
|
|
36
|
+
const selector = await resolveLocator(this.page, elementName)
|
|
37
|
+
if (!selector) {
|
|
38
|
+
throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
await this.page.locator(selector).dblclick()
|
|
42
|
+
} catch (error) {
|
|
43
|
+
throw new Error(`Failed to double click on the ${elementName} element: ${error}`)
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @name right click
|
|
49
|
+
* @description Template step for right clicking on an element
|
|
50
|
+
* @icon MOUSE
|
|
51
|
+
*/
|
|
52
|
+
When('the user right clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
|
|
53
|
+
const selector = await resolveLocator(this.page, elementName)
|
|
54
|
+
if (!selector) {
|
|
55
|
+
throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
await this.page.locator(selector).click({ button: 'right' })
|
|
59
|
+
} catch (error) {
|
|
60
|
+
throw new Error(`Failed to right click on the ${elementName} element: ${error}`)
|
|
61
|
+
}
|
|
62
|
+
})
|
|
@@ -1,72 +1,73 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @name navigation
|
|
3
|
-
* @description Template steps that deals with browser navigation
|
|
4
|
-
* @type ACTION
|
|
5
|
-
*/
|
|
6
|
-
import { When } from '@cucumber/cucumber'
|
|
7
|
-
import { CustomWorld } from '../../config/executor/world.js'
|
|
8
|
-
import { getEnvironment } from '../../utils/environment.util.js'
|
|
9
|
-
|
|
10
|
-
// This file is generated automatically. Add template steps to this group to generate content.
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* @name navigate to url
|
|
14
|
-
* @description Navigate to the specified URL
|
|
15
|
-
* @icon NAVIGATION
|
|
16
|
-
*/
|
|
17
|
-
When('the user navigates to the {string} url', async function (this: CustomWorld, url: string) {
|
|
18
|
-
try {
|
|
19
|
-
await this.page.goto(url, { waitUntil: 'domcontentloaded' })
|
|
20
|
-
} catch (error) {
|
|
21
|
-
throw new Error(`Failed to navigate to the ${url} url: ${error}`)
|
|
22
|
-
}
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @name navigate to environment base url
|
|
27
|
-
* @description Navigate to the base url of
|
|
28
|
-
* @icon NAVIGATION
|
|
29
|
-
*/
|
|
30
|
-
When(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
* @
|
|
50
|
-
* @
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
await this.page.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* @
|
|
64
|
-
* @
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @name navigation
|
|
3
|
+
* @description Template steps that deals with browser navigation
|
|
4
|
+
* @type ACTION
|
|
5
|
+
*/
|
|
6
|
+
import { When } from '@cucumber/cucumber'
|
|
7
|
+
import { CustomWorld } from '../../config/executor/world.js'
|
|
8
|
+
import { getEnvironment } from '../../utils/environment.util.js'
|
|
9
|
+
|
|
10
|
+
// This file is generated automatically. Add template steps to this group to generate content.
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @name navigate to url
|
|
14
|
+
* @description Navigate to the specified URL
|
|
15
|
+
* @icon NAVIGATION
|
|
16
|
+
*/
|
|
17
|
+
When('the user navigates to the {string} url', async function (this: CustomWorld, url: string) {
|
|
18
|
+
try {
|
|
19
|
+
await this.page.goto(url, { waitUntil: 'domcontentloaded' })
|
|
20
|
+
} catch (error) {
|
|
21
|
+
throw new Error(`Failed to navigate to the ${url} url: ${error}`)
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @name navigate to environment base url
|
|
27
|
+
* @description Navigate to the base url of the selected environment
|
|
28
|
+
* @icon NAVIGATION
|
|
29
|
+
*/
|
|
30
|
+
When('the user navigates to the base url of the selected environment', async function (this: CustomWorld) {
|
|
31
|
+
try {
|
|
32
|
+
const environment = process.env.ENVIRONMENT as string
|
|
33
|
+
if (!environment) {
|
|
34
|
+
throw new Error('Environment is not set')
|
|
35
|
+
}
|
|
36
|
+
const environmentConfig = getEnvironment(environment)
|
|
37
|
+
if (!environmentConfig) {
|
|
38
|
+
throw new Error(`Environment ${environment} not found`)
|
|
39
|
+
}
|
|
40
|
+
await this.page.goto(environmentConfig.baseUrl, {
|
|
41
|
+
waitUntil: 'domcontentloaded',
|
|
42
|
+
})
|
|
43
|
+
} catch (error) {
|
|
44
|
+
throw new Error(`Failed to navigate to the base url of the selected environment: ${error}`)
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @name reload
|
|
50
|
+
* @description Template step for reloading the current page
|
|
51
|
+
* @icon NAVIGATION
|
|
52
|
+
*/
|
|
53
|
+
When('the user reloads the page', async function (this: CustomWorld) {
|
|
54
|
+
try {
|
|
55
|
+
await this.page.reload()
|
|
56
|
+
await this.page.waitForLoadState('domcontentloaded')
|
|
57
|
+
} catch (error) {
|
|
58
|
+
throw new Error(`Failed to reload the page: ${error}`)
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @name go back
|
|
64
|
+
* @description Template step for going back to the previous page
|
|
65
|
+
* @icon NAVIGATION
|
|
66
|
+
*/
|
|
67
|
+
When('the user goes back to the previous page', async function (this: CustomWorld) {
|
|
68
|
+
try {
|
|
69
|
+
await this.page.goBack({ waitUntil: 'domcontentloaded' })
|
|
70
|
+
} catch (error) {
|
|
71
|
+
throw new Error(`Failed to go back to the previous page: ${error}`)
|
|
72
|
+
}
|
|
73
|
+
})
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @name active state assertion
|
|
3
|
-
* @description Template steps for handling the validation of the active state of an element
|
|
4
|
-
* @type VALIDATION
|
|
5
|
-
*/
|
|
6
|
-
import { Then } from '@cucumber/cucumber'
|
|
7
|
-
import { CustomWorld, expect } from '../../config/executor/world.js'
|
|
8
|
-
import { SelectorName } from '@/types/locator/locator.type'
|
|
9
|
-
import { resolveLocator } from '../../utils/locator.util.js'
|
|
10
|
-
|
|
11
|
-
// This file is generated automatically. Add template steps to this group to generate content.
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @name assert element active
|
|
15
|
-
* @description Template step for validating whether an element is active or not
|
|
16
|
-
* @icon VALIDATION
|
|
17
|
-
*/
|
|
18
|
-
Then(
|
|
19
|
-
'the element {string} should have active status {boolean} ',
|
|
20
|
-
async function (this: CustomWorld, elementName: SelectorName, isActive: boolean) {
|
|
21
|
-
try {
|
|
22
|
-
const selector = await resolveLocator(this.page, elementName)
|
|
23
|
-
if (!selector) throw new Error(`Selector ${elementName} not found`)
|
|
24
|
-
const elementActiveStatus = await this.page.locator(selector).isEnabled({ timeout: 10000 })
|
|
25
|
-
if (isActive) {
|
|
26
|
-
void expect(elementActiveStatus, `Expected ${elementName} to be active`).to.be.true
|
|
27
|
-
} else {
|
|
28
|
-
void expect(elementActiveStatus, `Expected ${elementName} NOT to be active`).to.be.false
|
|
29
|
-
}
|
|
30
|
-
} catch (error) {
|
|
31
|
-
throw new Error(`Failed to validate the active status of the element ${elementName}: ${error}`)
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
)
|
|
1
|
+
/**
|
|
2
|
+
* @name active state assertion
|
|
3
|
+
* @description Template steps for handling the validation of the active state of an element
|
|
4
|
+
* @type VALIDATION
|
|
5
|
+
*/
|
|
6
|
+
import { Then } from '@cucumber/cucumber'
|
|
7
|
+
import { CustomWorld, expect } from '../../config/executor/world.js'
|
|
8
|
+
import { SelectorName } from '@/types/locator/locator.type'
|
|
9
|
+
import { resolveLocator } from '../../utils/locator.util.js'
|
|
10
|
+
|
|
11
|
+
// This file is generated automatically. Add template steps to this group to generate content.
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @name assert element active
|
|
15
|
+
* @description Template step for validating whether an element is active or not
|
|
16
|
+
* @icon VALIDATION
|
|
17
|
+
*/
|
|
18
|
+
Then(
|
|
19
|
+
'the element {string} should have active status {boolean} ',
|
|
20
|
+
async function (this: CustomWorld, elementName: SelectorName, isActive: boolean) {
|
|
21
|
+
try {
|
|
22
|
+
const selector = await resolveLocator(this.page, elementName)
|
|
23
|
+
if (!selector) throw new Error(`Selector ${elementName} not found`)
|
|
24
|
+
const elementActiveStatus = await this.page.locator(selector).isEnabled({ timeout: 10000 })
|
|
25
|
+
if (isActive) {
|
|
26
|
+
void expect(elementActiveStatus, `Expected ${elementName} to be active`).to.be.true
|
|
27
|
+
} else {
|
|
28
|
+
void expect(elementActiveStatus, `Expected ${elementName} NOT to be active`).to.be.false
|
|
29
|
+
}
|
|
30
|
+
} catch (error) {
|
|
31
|
+
throw new Error(`Failed to validate the active status of the element ${elementName}: ${error}`)
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
)
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @name navigation assertion
|
|
3
|
-
* @description Template steps that handles navigation validations
|
|
4
|
-
* @type VALIDATION
|
|
5
|
-
*/
|
|
6
|
-
import { Then } from '@cucumber/cucumber'
|
|
7
|
-
import { CustomWorld, expect } from '../../config/executor/world.js'
|
|
8
|
-
|
|
9
|
-
// This file is generated automatically. Add template steps to this group to generate content.
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* @name assert url route equals
|
|
13
|
-
* @description Template step for validating whether a url route equals the provided value or not
|
|
14
|
-
* @icon VALIDATION
|
|
15
|
-
*/
|
|
16
|
-
Then('the url route should be equal to {string}', async function (this: CustomWorld, route: string) {
|
|
17
|
-
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @name navigation assertion
|
|
3
|
+
* @description Template steps that handles navigation validations
|
|
4
|
+
* @type VALIDATION
|
|
5
|
+
*/
|
|
6
|
+
import { Then } from '@cucumber/cucumber'
|
|
7
|
+
import { CustomWorld, expect } from '../../config/executor/world.js'
|
|
8
|
+
|
|
9
|
+
// This file is generated automatically. Add template steps to this group to generate content.
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @name assert url route equals
|
|
13
|
+
* @description Template step for validating whether a url route equals the provided value or not
|
|
14
|
+
* @icon VALIDATION
|
|
15
|
+
*/
|
|
16
|
+
Then('the url route should be equal to {string}', async function (this: CustomWorld, route: string) {
|
|
17
|
+
try {
|
|
18
|
+
await this.page.waitForLoadState('networkidle')
|
|
19
|
+
const currentRoute = new URL(this.page.url()).pathname
|
|
20
|
+
expect(currentRoute, `Expected the current route to be "${route}"`).to.equal(route.toLowerCase())
|
|
21
|
+
} catch (error) {
|
|
22
|
+
throw new Error(`Failed to validate the equality of the current route to the route "${route}": ${error}`)
|
|
23
|
+
}
|
|
24
|
+
})
|