create-appraisejs 0.3.1-alpha.0 → 0.3.1-alpha.1
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 +17 -17
- package/dist/cli.e2e.test.d.ts +2 -2
- package/dist/cli.e2e.test.js +74 -72
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/config.test.d.ts +2 -2
- package/dist/config.test.js +64 -64
- package/dist/copy-template.test.d.ts +2 -2
- package/dist/copy-template.test.js +70 -70
- package/dist/download-repo.test.d.ts +2 -2
- package/dist/download-repo.test.js +15 -13
- package/dist/install.test.d.ts +2 -2
- package/dist/install.test.js +115 -114
- package/dist/prepare-template-utils.d.ts.map +1 -1
- package/dist/prepare-template-utils.js.map +1 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +2 -2
- package/dist/prompts.js.map +1 -1
- package/dist/prompts.test.d.ts +2 -2
- package/dist/prompts.test.js +54 -54
- package/dist/sync-templates-utils.d.ts.map +1 -1
- package/dist/sync-templates-utils.js +1 -5
- package/dist/sync-templates-utils.js.map +1 -1
- package/package.json +1 -1
- package/templates/blank/.editorconfig +11 -0
- package/templates/blank/.gitattributes +21 -0
- package/templates/blank/.gitconfig.appraise +14 -0
- package/templates/blank/.prettierrc +13 -0
- package/templates/blank/.vscode/settings.json +2 -0
- package/templates/blank/README.md +12 -12
- package/templates/blank/components.json +24 -24
- package/templates/blank/cucumber.mjs +16 -16
- package/templates/blank/e2e/README.md +56 -0
- package/templates/blank/e2e/apply-migrations.mjs +76 -0
- package/templates/blank/e2e/appraise-smoke.spec.ts +78 -0
- package/templates/blank/e2e/authoring.spec.ts +53 -0
- package/templates/blank/e2e/crud-configuration.spec.ts +138 -0
- package/templates/blank/e2e/crud-tests.spec.ts +76 -0
- package/templates/blank/e2e/helpers/forms.ts +186 -0
- package/templates/blank/e2e/helpers/navigation.ts +27 -0
- package/templates/blank/e2e/helpers/table.ts +45 -0
- package/templates/blank/e2e/helpers/test-data.ts +549 -0
- package/templates/blank/e2e/helpers/ui.ts +41 -0
- package/templates/blank/e2e/navigation.spec.ts +101 -0
- package/templates/blank/e2e/runs-and-reports.spec.ts +82 -0
- package/templates/blank/e2e/settings-sync.spec.ts +39 -0
- package/templates/blank/e2e/start-server.mjs +61 -0
- package/templates/blank/eslint.config.mjs +4 -4
- package/templates/blank/gitignore +0 -3
- package/templates/blank/next-env.d.ts +1 -1
- package/templates/blank/package-lock.json +58 -102
- package/templates/blank/package.json +10 -9
- package/templates/blank/packages/cucumber-runtime/package.json +13 -13
- package/templates/blank/packages/cucumber-runtime/src/cache.util.ts +93 -93
- package/templates/blank/packages/cucumber-runtime/src/cli.ts +77 -68
- package/templates/blank/packages/cucumber-runtime/src/environment.util.ts +21 -21
- package/templates/blank/packages/cucumber-runtime/src/executor.ts +32 -32
- package/templates/blank/packages/cucumber-runtime/src/index.ts +17 -17
- package/templates/blank/packages/cucumber-runtime/src/locator.util.ts +234 -234
- package/templates/blank/packages/cucumber-runtime/src/parameter-types.ts +7 -7
- package/templates/blank/packages/cucumber-runtime/src/random-data.util.ts +35 -35
- package/templates/blank/packages/cucumber-runtime/src/types.ts +13 -13
- package/templates/blank/packages/cucumber-runtime/src/world.ts +44 -44
- package/templates/blank/packages/cucumber-runtime/tsconfig.json +11 -11
- package/templates/blank/packages/locator-picker-companion/dist/cli.js +1 -1
- package/templates/blank/packages/locator-picker-companion/dist/index.d.ts +3 -3
- package/templates/blank/packages/locator-picker-companion/dist/index.js +3 -3
- package/templates/blank/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
- package/templates/blank/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
- package/templates/blank/packages/locator-picker-companion/dist/selector-generator.js +233 -229
- package/templates/blank/packages/locator-picker-companion/src/cli.ts +1 -7
- package/templates/blank/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
- package/templates/blank/packages/locator-picker-companion/src/launcher.ts +1 -3
- package/templates/blank/packages/locator-picker-companion/src/session-file.ts +4 -15
- package/templates/blank/packages/locator-picker-companion/src/types.ts +1 -8
- package/templates/blank/playwright.config.ts +46 -0
- package/templates/blank/postcss.config.mjs +8 -8
- package/templates/blank/prisma/dev.db +0 -0
- package/templates/blank/scripts/configure-git-line-endings.mjs +91 -0
- package/templates/blank/scripts/install-template-step.ts +5 -1
- package/templates/blank/scripts/lib/step-matcher.test.ts +3 -3
- package/templates/blank/scripts/lib/step-matcher.ts +5 -1
- package/templates/blank/scripts/lib/template-step-installer.test.ts +4 -2
- package/templates/blank/scripts/lib/template-step-installer.ts +16 -4
- package/templates/blank/scripts/lib/template-step-registry.test.ts +1 -1
- package/templates/blank/scripts/lib/template-step-registry.ts +4 -1
- package/templates/blank/scripts/run-fallow-commit.mjs +4 -6
- package/templates/blank/scripts/sync-all.ts +7 -6
- package/templates/blank/scripts/sync-appraise-base-template.ts +84 -77
- package/templates/blank/scripts/sync-environments.ts +47 -44
- package/templates/blank/scripts/sync-locator-groups.ts +67 -76
- package/templates/blank/scripts/sync-locators.ts +50 -53
- package/templates/blank/scripts/sync-modules.ts +42 -42
- package/templates/blank/scripts/sync-tags.ts +51 -51
- package/templates/blank/scripts/sync-template-step-groups.ts +34 -32
- package/templates/blank/scripts/sync-template-steps.ts +97 -97
- package/templates/blank/scripts/sync-test-cases.ts +65 -74
- package/templates/blank/scripts/sync-test-suites.ts +85 -80
- package/templates/blank/src/actions/server-action-boundary.test.ts +1 -7
- package/templates/blank/src/actions/settings/sync-actions.ts +3 -1
- package/templates/blank/src/actions/tags/tag-actions.ts +1 -7
- package/templates/blank/src/actions/template-test-case/template-test-case-actions.ts +3 -1
- package/templates/blank/src/app/(base)/environments/create/page.tsx +28 -28
- package/templates/blank/src/app/(base)/environments/environment-form.tsx +3 -2
- package/templates/blank/src/app/(base)/environments/environment-helpers.ts +4 -1
- package/templates/blank/src/app/(base)/layout.tsx +10 -10
- package/templates/blank/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
- package/templates/blank/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
- package/templates/blank/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
- package/templates/blank/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
- package/templates/blank/src/app/(base)/locator-groups/page.tsx +9 -19
- package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
- package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
- package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
- package/templates/blank/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
- package/templates/blank/src/app/(base)/locators/locator-file-sync.ts +1 -5
- package/templates/blank/src/app/(base)/locators/locator-helpers.ts +2 -12
- package/templates/blank/src/app/(base)/locators/locator-table-columns.tsx +59 -60
- package/templates/blank/src/app/(base)/modules/module-form.tsx +3 -1
- package/templates/blank/src/app/(base)/reports/overview-chart.tsx +49 -49
- package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
- package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
- package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
- package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
- package/templates/blank/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
- package/templates/blank/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
- package/templates/blank/src/app/(base)/tags/tag-form.test.tsx +2 -10
- package/templates/blank/src/app/(base)/tags/tag-form.tsx +5 -3
- package/templates/blank/src/app/(base)/tags/tag-table-columns.tsx +63 -63
- package/templates/blank/src/app/(base)/tags/tag-table.tsx +29 -29
- package/templates/blank/src/app/(base)/template-step-groups/create/page.tsx +28 -28
- package/templates/blank/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
- package/templates/blank/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
- package/templates/blank/src/app/(base)/template-steps/paramChip.tsx +6 -10
- package/templates/blank/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
- package/templates/blank/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
- package/templates/blank/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
- package/templates/blank/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
- package/templates/blank/src/app/(base)/template-steps/template-step-types.ts +1 -5
- package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
- package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
- package/templates/blank/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
- package/templates/blank/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
- package/templates/blank/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
- package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
- package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
- package/templates/blank/src/app/(base)/test-cases/create/page.tsx +1 -5
- package/templates/blank/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
- package/templates/blank/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
- package/templates/blank/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
- package/templates/blank/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
- package/templates/blank/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
- package/templates/blank/src/app/(base)/test-cases/test-case-form.tsx +63 -78
- package/templates/blank/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
- package/templates/blank/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
- package/templates/blank/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
- package/templates/blank/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
- package/templates/blank/src/app/api/test-runs/[runId]/download/route.ts +1 -4
- package/templates/blank/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
- package/templates/blank/src/assets/icons/empty-tube.tsx +23 -23
- package/templates/blank/src/assets/icons/tube-plus.tsx +29 -29
- package/templates/blank/src/components/data-visualization/info-card.tsx +56 -70
- package/templates/blank/src/components/data-visualization/info-grid.tsx +22 -22
- package/templates/blank/src/components/diagram/add-node-prompt-node.tsx +1 -1
- package/templates/blank/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
- package/templates/blank/src/components/diagram/dynamic-parameters.test.tsx +4 -1
- package/templates/blank/src/components/diagram/dynamic-parameters.tsx +0 -1
- package/templates/blank/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
- package/templates/blank/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
- package/templates/blank/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
- package/templates/blank/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
- package/templates/blank/src/components/diagram/flow-diagram-node-search.tsx +65 -65
- package/templates/blank/src/components/diagram/flow-diagram-toolbar.tsx +1 -3
- package/templates/blank/src/components/diagram/flow-diagram-view.tsx +1 -7
- package/templates/blank/src/components/diagram/flow-node-data-helpers.ts +1 -1
- package/templates/blank/src/components/diagram/node-form-fields-content.tsx +9 -2
- package/templates/blank/src/components/diagram/node-form-helpers.test.ts +3 -1
- package/templates/blank/src/components/diagram/node-form-helpers.ts +1 -4
- package/templates/blank/src/components/diagram/node-form-template-step-selection.ts +1 -4
- package/templates/blank/src/components/diagram/node-form.test.tsx +25 -0
- package/templates/blank/src/components/diagram/node-form.tsx +2 -12
- package/templates/blank/src/components/diagram/options-header-node.test.tsx +4 -1
- package/templates/blank/src/components/diagram/options-header-node.tsx +140 -130
- package/templates/blank/src/components/diagram/use-flow-diagram.ts +1 -2
- package/templates/blank/src/components/form/error-message.tsx +7 -7
- package/templates/blank/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
- package/templates/blank/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
- package/templates/blank/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
- package/templates/blank/src/components/navigation/entity-search-command.tsx +3 -9
- package/templates/blank/src/components/navigation/nav-link.tsx +60 -60
- package/templates/blank/src/components/test-case/test-case-form-helpers.test.ts +1 -5
- package/templates/blank/src/components/test-case/test-case-form-helpers.ts +1 -5
- package/templates/blank/src/components/test-case/test-case-picker-helpers.ts +8 -7
- package/templates/blank/src/components/test-case/test-case-picker.tsx +2 -6
- package/templates/blank/src/components/test-run/log-viewer.test.tsx +25 -0
- package/templates/blank/src/components/test-run/log-viewer.tsx +2 -2
- package/templates/blank/src/components/test-run/test-run-details-guards.ts +10 -1
- package/templates/blank/src/components/test-run/test-run-details.test.tsx +9 -19
- package/templates/blank/src/components/test-run/use-log-viewer.ts +2 -8
- package/templates/blank/src/components/test-run/use-test-run-header.ts +1 -4
- package/templates/blank/src/components/test-suite/test-suite-picker.tsx +1 -1
- package/templates/blank/src/components/theme/theme-provider.tsx +7 -1
- package/templates/blank/src/components/typography/page-header-subtitle.tsx +7 -7
- package/templates/blank/src/components/typography/page-header.tsx +7 -7
- package/templates/blank/src/components/ui/chart.tsx +2 -8
- package/templates/blank/src/components/ui/command.tsx +2 -5
- package/templates/blank/src/components/ui/data-table-column-header.tsx +3 -3
- package/templates/blank/src/components/ui/data-table.test.tsx +1 -8
- package/templates/blank/src/components/ui/dialog.tsx +1 -4
- package/templates/blank/src/components/ui/select.tsx +2 -2
- package/templates/blank/src/components/ui/separator.tsx +5 -1
- package/templates/blank/src/components/ui/skeleton.tsx +7 -7
- package/templates/blank/src/components/ui/table.tsx +1 -1
- package/templates/blank/src/components/ui/toaster.tsx +26 -26
- package/templates/blank/src/components/ui/tooltip.tsx +1 -1
- package/templates/blank/src/constants/form-opts/locator-group-form-opts.ts +1 -1
- package/templates/blank/src/lib/locator-group-file-utils.ts +5 -1
- package/templates/blank/src/lib/locator-picker/session-manager.ts +1 -2
- package/templates/blank/src/lib/metrics/metric-calculator.test.ts +105 -6
- package/templates/blank/src/lib/metrics/metric-calculator.ts +39 -40
- package/templates/blank/src/lib/sync/sync-executor.ts +1 -4
- package/templates/blank/src/lib/sync/sync-pending-counts.test.ts +201 -7
- package/templates/blank/src/lib/sync/sync-pending-counts.ts +81 -13
- package/templates/blank/src/lib/template-automation-paths.ts +1 -1
- package/templates/blank/src/lib/template-sync-utils.d.ts +14 -7
- package/templates/blank/src/lib/test-case-utils.ts +6 -6
- package/templates/blank/src/lib/test-run/log-formatter.ts +82 -83
- package/templates/blank/src/lib/test-run/report-parser.ts +352 -352
- package/templates/blank/src/lib/transformers/gherkin-converter.ts +42 -42
- package/templates/blank/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
- package/templates/blank/src/lib/utils/node-param-validation.ts +81 -81
- package/templates/blank/src/lib/utils/template-step-file-generator.ts +5 -3
- package/templates/blank/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
- package/templates/blank/src/services/dashboard/dashboard-service.test.ts +28 -1
- package/templates/blank/src/services/dashboard/dashboard-service.ts +2 -0
- package/templates/blank/src/services/locator/locator-service.test.ts +1 -3
- package/templates/blank/src/services/locator/locator-service.ts +3 -1
- package/templates/blank/src/services/locator/locator-sync-utils.test.ts +1 -4
- package/templates/blank/src/services/module/module-service.ts +1 -4
- package/templates/blank/src/services/report/report-service.test.ts +70 -6
- package/templates/blank/src/services/report/report-service.ts +52 -9
- package/templates/blank/src/services/shared/errors.ts +2 -4
- package/templates/blank/src/services/template-step/template-step-service.ts +3 -1
- package/templates/blank/src/services/template-step-group/template-step-group-service.ts +3 -1
- package/templates/blank/src/services/test-case/test-case-service.ts +0 -5
- package/templates/blank/src/services/test-run/test-run-service.test.ts +3 -6
- package/templates/blank/src/services/test-run/test-run-service.ts +12 -7
- package/templates/blank/src/services/test-suite/test-suite-service.test.ts +1 -5
- package/templates/blank/src/services/test-suite/test-suite-service.ts +2 -4
- package/templates/blank/src/types/form/actionHandler.ts +1 -5
- package/templates/blank/tsconfig.json +8 -8
- package/templates/default/packages/locator-picker-companion/dist/cli.d.ts +1 -1
- package/templates/default/packages/locator-picker-companion/dist/cli.js +313 -279
- package/templates/default/packages/locator-picker-companion/dist/index.d.ts +3 -3
- package/templates/default/packages/locator-picker-companion/dist/index.js +3 -3
- package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.d.ts +1 -1
- package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.js +526 -481
- package/templates/default/packages/locator-picker-companion/dist/launcher.d.ts +13 -10
- package/templates/default/packages/locator-picker-companion/dist/launcher.js +47 -48
- package/templates/default/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
- package/templates/default/packages/locator-picker-companion/dist/selector-generator.js +233 -229
- package/templates/default/packages/locator-picker-companion/dist/session-file.d.ts +30 -22
- package/templates/default/packages/locator-picker-companion/dist/session-file.js +116 -104
- package/templates/default/packages/locator-picker-companion/dist/types.d.ts +25 -25
- package/templates/default/packages/locator-picker-companion/dist/types.js +1 -1
- package/templates/starter/.editorconfig +11 -0
- package/templates/starter/.gitattributes +21 -0
- package/templates/starter/.gitconfig.appraise +14 -0
- package/templates/starter/.prettierrc +13 -0
- package/templates/starter/.vscode/settings.json +2 -0
- package/templates/starter/README.md +12 -12
- package/templates/starter/automation/steps/actions/click.step.ts +56 -58
- package/templates/starter/automation/steps/actions/hover.step.ts +25 -27
- package/templates/starter/automation/steps/actions/input.step.ts +85 -108
- package/templates/starter/automation/steps/actions/navigation.step.ts +67 -70
- package/templates/starter/automation/steps/actions/random_data.step.ts +149 -143
- package/templates/starter/automation/steps/actions/store.step.ts +69 -1
- package/templates/starter/automation/steps/actions/wait.step.ts +84 -1
- package/templates/starter/automation/steps/validations/active_state_assertion.step.ts +28 -30
- package/templates/starter/automation/steps/validations/navigation_assertion.step.ts +20 -22
- package/templates/starter/automation/steps/validations/text_assertion.step.ts +67 -107
- package/templates/starter/automation/steps/validations/visibility_assertion.step.ts +24 -26
- package/templates/starter/components.json +24 -24
- package/templates/starter/cucumber.mjs +16 -16
- package/templates/starter/e2e/README.md +56 -0
- package/templates/starter/e2e/apply-migrations.mjs +76 -0
- package/templates/starter/e2e/appraise-smoke.spec.ts +78 -0
- package/templates/starter/e2e/authoring.spec.ts +53 -0
- package/templates/starter/e2e/crud-configuration.spec.ts +138 -0
- package/templates/starter/e2e/crud-tests.spec.ts +76 -0
- package/templates/starter/e2e/helpers/forms.ts +186 -0
- package/templates/starter/e2e/helpers/navigation.ts +27 -0
- package/templates/starter/e2e/helpers/table.ts +45 -0
- package/templates/starter/e2e/helpers/test-data.ts +549 -0
- package/templates/starter/e2e/helpers/ui.ts +41 -0
- package/templates/starter/e2e/navigation.spec.ts +101 -0
- package/templates/starter/e2e/runs-and-reports.spec.ts +82 -0
- package/templates/starter/e2e/settings-sync.spec.ts +39 -0
- package/templates/starter/e2e/start-server.mjs +61 -0
- package/templates/starter/eslint.config.mjs +4 -4
- package/templates/starter/gitignore +0 -3
- package/templates/starter/next-env.d.ts +1 -1
- package/templates/starter/package-lock.json +58 -102
- package/templates/starter/package.json +10 -9
- package/templates/starter/packages/cucumber-runtime/package.json +13 -13
- package/templates/starter/packages/cucumber-runtime/src/cache.util.ts +93 -93
- package/templates/starter/packages/cucumber-runtime/src/cli.ts +77 -68
- package/templates/starter/packages/cucumber-runtime/src/environment.util.ts +21 -21
- package/templates/starter/packages/cucumber-runtime/src/executor.ts +32 -32
- package/templates/starter/packages/cucumber-runtime/src/index.ts +17 -17
- package/templates/starter/packages/cucumber-runtime/src/locator.util.ts +234 -234
- package/templates/starter/packages/cucumber-runtime/src/parameter-types.ts +7 -7
- package/templates/starter/packages/cucumber-runtime/src/random-data.util.ts +35 -35
- package/templates/starter/packages/cucumber-runtime/src/types.ts +13 -13
- package/templates/starter/packages/cucumber-runtime/src/world.ts +44 -44
- package/templates/starter/packages/cucumber-runtime/tsconfig.json +11 -11
- package/templates/starter/packages/locator-picker-companion/dist/cli.js +1 -1
- package/templates/starter/packages/locator-picker-companion/dist/index.d.ts +3 -3
- package/templates/starter/packages/locator-picker-companion/dist/index.js +3 -3
- package/templates/starter/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
- package/templates/starter/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
- package/templates/starter/packages/locator-picker-companion/dist/selector-generator.js +233 -229
- package/templates/starter/packages/locator-picker-companion/src/cli.ts +1 -7
- package/templates/starter/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
- package/templates/starter/packages/locator-picker-companion/src/launcher.ts +1 -3
- package/templates/starter/packages/locator-picker-companion/src/session-file.ts +4 -15
- package/templates/starter/packages/locator-picker-companion/src/types.ts +1 -8
- package/templates/starter/playwright.config.ts +46 -0
- package/templates/starter/postcss.config.mjs +8 -8
- package/templates/starter/prisma/dev.db +0 -0
- package/templates/starter/scripts/configure-git-line-endings.mjs +91 -0
- package/templates/starter/scripts/install-template-step.ts +5 -1
- package/templates/starter/scripts/lib/step-matcher.test.ts +3 -3
- package/templates/starter/scripts/lib/step-matcher.ts +5 -1
- package/templates/starter/scripts/lib/template-step-installer.test.ts +4 -2
- package/templates/starter/scripts/lib/template-step-installer.ts +16 -4
- package/templates/starter/scripts/lib/template-step-registry.test.ts +1 -1
- package/templates/starter/scripts/lib/template-step-registry.ts +4 -1
- package/templates/starter/scripts/run-fallow-commit.mjs +4 -6
- package/templates/starter/scripts/sync-all.ts +7 -6
- package/templates/starter/scripts/sync-appraise-base-template.ts +84 -77
- package/templates/starter/scripts/sync-environments.ts +47 -44
- package/templates/starter/scripts/sync-locator-groups.ts +67 -76
- package/templates/starter/scripts/sync-locators.ts +50 -53
- package/templates/starter/scripts/sync-modules.ts +42 -42
- package/templates/starter/scripts/sync-tags.ts +51 -51
- package/templates/starter/scripts/sync-template-step-groups.ts +34 -32
- package/templates/starter/scripts/sync-template-steps.ts +97 -97
- package/templates/starter/scripts/sync-test-cases.ts +65 -74
- package/templates/starter/scripts/sync-test-suites.ts +85 -80
- package/templates/starter/src/actions/server-action-boundary.test.ts +1 -7
- package/templates/starter/src/actions/settings/sync-actions.ts +3 -1
- package/templates/starter/src/actions/tags/tag-actions.ts +1 -7
- package/templates/starter/src/actions/template-test-case/template-test-case-actions.ts +3 -1
- package/templates/starter/src/app/(base)/environments/create/page.tsx +28 -28
- package/templates/starter/src/app/(base)/environments/environment-form.tsx +3 -2
- package/templates/starter/src/app/(base)/environments/environment-helpers.ts +4 -1
- package/templates/starter/src/app/(base)/layout.tsx +10 -10
- package/templates/starter/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
- package/templates/starter/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
- package/templates/starter/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
- package/templates/starter/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
- package/templates/starter/src/app/(base)/locator-groups/page.tsx +9 -19
- package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
- package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
- package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
- package/templates/starter/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
- package/templates/starter/src/app/(base)/locators/locator-file-sync.ts +1 -5
- package/templates/starter/src/app/(base)/locators/locator-helpers.ts +2 -12
- package/templates/starter/src/app/(base)/locators/locator-table-columns.tsx +59 -60
- package/templates/starter/src/app/(base)/modules/module-form.tsx +3 -1
- package/templates/starter/src/app/(base)/reports/overview-chart.tsx +49 -49
- package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
- package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
- package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
- package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
- package/templates/starter/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
- package/templates/starter/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
- package/templates/starter/src/app/(base)/tags/tag-form.test.tsx +2 -10
- package/templates/starter/src/app/(base)/tags/tag-form.tsx +5 -3
- package/templates/starter/src/app/(base)/tags/tag-table-columns.tsx +63 -63
- package/templates/starter/src/app/(base)/tags/tag-table.tsx +29 -29
- package/templates/starter/src/app/(base)/template-step-groups/create/page.tsx +28 -28
- package/templates/starter/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
- package/templates/starter/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
- package/templates/starter/src/app/(base)/template-steps/paramChip.tsx +6 -10
- package/templates/starter/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
- package/templates/starter/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
- package/templates/starter/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
- package/templates/starter/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
- package/templates/starter/src/app/(base)/template-steps/template-step-types.ts +1 -5
- package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
- package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
- package/templates/starter/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
- package/templates/starter/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
- package/templates/starter/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
- package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
- package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
- package/templates/starter/src/app/(base)/test-cases/create/page.tsx +1 -5
- package/templates/starter/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
- package/templates/starter/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
- package/templates/starter/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
- package/templates/starter/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
- package/templates/starter/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
- package/templates/starter/src/app/(base)/test-cases/test-case-form.tsx +63 -78
- package/templates/starter/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
- package/templates/starter/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
- package/templates/starter/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
- package/templates/starter/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
- package/templates/starter/src/app/api/test-runs/[runId]/download/route.ts +1 -4
- package/templates/starter/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
- package/templates/starter/src/assets/icons/empty-tube.tsx +23 -23
- package/templates/starter/src/assets/icons/tube-plus.tsx +29 -29
- package/templates/starter/src/components/data-visualization/info-card.tsx +56 -70
- package/templates/starter/src/components/data-visualization/info-grid.tsx +22 -22
- package/templates/starter/src/components/diagram/add-node-prompt-node.tsx +1 -1
- package/templates/starter/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
- package/templates/starter/src/components/diagram/dynamic-parameters.test.tsx +4 -1
- package/templates/starter/src/components/diagram/dynamic-parameters.tsx +0 -1
- package/templates/starter/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
- package/templates/starter/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
- package/templates/starter/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
- package/templates/starter/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
- package/templates/starter/src/components/diagram/flow-diagram-node-search.tsx +65 -65
- package/templates/starter/src/components/diagram/flow-diagram-toolbar.tsx +1 -3
- package/templates/starter/src/components/diagram/flow-diagram-view.tsx +1 -7
- package/templates/starter/src/components/diagram/flow-node-data-helpers.ts +1 -1
- package/templates/starter/src/components/diagram/node-form-fields-content.tsx +9 -2
- package/templates/starter/src/components/diagram/node-form-helpers.test.ts +3 -1
- package/templates/starter/src/components/diagram/node-form-helpers.ts +1 -4
- package/templates/starter/src/components/diagram/node-form-template-step-selection.ts +1 -4
- package/templates/starter/src/components/diagram/node-form.test.tsx +25 -0
- package/templates/starter/src/components/diagram/node-form.tsx +2 -12
- package/templates/starter/src/components/diagram/options-header-node.test.tsx +4 -1
- package/templates/starter/src/components/diagram/options-header-node.tsx +140 -130
- package/templates/starter/src/components/diagram/use-flow-diagram.ts +1 -2
- package/templates/starter/src/components/form/error-message.tsx +7 -7
- package/templates/starter/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
- package/templates/starter/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
- package/templates/starter/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
- package/templates/starter/src/components/navigation/entity-search-command.tsx +3 -9
- package/templates/starter/src/components/navigation/nav-link.tsx +60 -60
- package/templates/starter/src/components/test-case/test-case-form-helpers.test.ts +1 -5
- package/templates/starter/src/components/test-case/test-case-form-helpers.ts +1 -5
- package/templates/starter/src/components/test-case/test-case-picker-helpers.ts +8 -7
- package/templates/starter/src/components/test-case/test-case-picker.tsx +2 -6
- package/templates/starter/src/components/test-run/log-viewer.test.tsx +25 -0
- package/templates/starter/src/components/test-run/log-viewer.tsx +2 -2
- package/templates/starter/src/components/test-run/test-run-details-guards.ts +10 -1
- package/templates/starter/src/components/test-run/test-run-details.test.tsx +9 -19
- package/templates/starter/src/components/test-run/use-log-viewer.ts +2 -8
- package/templates/starter/src/components/test-run/use-test-run-header.ts +1 -4
- package/templates/starter/src/components/test-suite/test-suite-picker.tsx +1 -1
- package/templates/starter/src/components/theme/theme-provider.tsx +7 -1
- package/templates/starter/src/components/typography/page-header-subtitle.tsx +7 -7
- package/templates/starter/src/components/typography/page-header.tsx +7 -7
- package/templates/starter/src/components/ui/chart.tsx +2 -8
- package/templates/starter/src/components/ui/command.tsx +2 -5
- package/templates/starter/src/components/ui/data-table-column-header.tsx +3 -3
- package/templates/starter/src/components/ui/data-table.test.tsx +1 -8
- package/templates/starter/src/components/ui/dialog.tsx +1 -4
- package/templates/starter/src/components/ui/select.tsx +2 -2
- package/templates/starter/src/components/ui/separator.tsx +5 -1
- package/templates/starter/src/components/ui/skeleton.tsx +7 -7
- package/templates/starter/src/components/ui/table.tsx +1 -1
- package/templates/starter/src/components/ui/toaster.tsx +26 -26
- package/templates/starter/src/components/ui/tooltip.tsx +1 -1
- package/templates/starter/src/constants/form-opts/locator-group-form-opts.ts +1 -1
- package/templates/starter/src/lib/locator-group-file-utils.ts +5 -1
- package/templates/starter/src/lib/locator-picker/session-manager.ts +1 -2
- package/templates/starter/src/lib/metrics/metric-calculator.test.ts +105 -6
- package/templates/starter/src/lib/metrics/metric-calculator.ts +39 -40
- package/templates/starter/src/lib/sync/sync-executor.ts +1 -4
- package/templates/starter/src/lib/sync/sync-pending-counts.test.ts +201 -7
- package/templates/starter/src/lib/sync/sync-pending-counts.ts +81 -13
- package/templates/starter/src/lib/template-automation-paths.ts +1 -1
- package/templates/starter/src/lib/template-sync-utils.d.ts +14 -7
- package/templates/starter/src/lib/test-case-utils.ts +6 -6
- package/templates/starter/src/lib/test-run/log-formatter.ts +82 -83
- package/templates/starter/src/lib/test-run/report-parser.ts +352 -352
- package/templates/starter/src/lib/transformers/gherkin-converter.ts +42 -42
- package/templates/starter/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
- package/templates/starter/src/lib/utils/node-param-validation.ts +81 -81
- package/templates/starter/src/lib/utils/template-step-file-generator.ts +5 -3
- package/templates/starter/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
- package/templates/starter/src/services/dashboard/dashboard-service.test.ts +28 -1
- package/templates/starter/src/services/dashboard/dashboard-service.ts +2 -0
- package/templates/starter/src/services/locator/locator-service.test.ts +1 -3
- package/templates/starter/src/services/locator/locator-service.ts +3 -1
- package/templates/starter/src/services/locator/locator-sync-utils.test.ts +1 -4
- package/templates/starter/src/services/module/module-service.ts +1 -4
- package/templates/starter/src/services/report/report-service.test.ts +70 -6
- package/templates/starter/src/services/report/report-service.ts +52 -9
- package/templates/starter/src/services/shared/errors.ts +2 -4
- package/templates/starter/src/services/template-step/template-step-service.ts +3 -1
- package/templates/starter/src/services/template-step-group/template-step-group-service.ts +3 -1
- package/templates/starter/src/services/test-case/test-case-service.ts +0 -5
- package/templates/starter/src/services/test-run/test-run-service.test.ts +3 -6
- package/templates/starter/src/services/test-run/test-run-service.ts +12 -7
- package/templates/starter/src/services/test-suite/test-suite-service.test.ts +1 -5
- package/templates/starter/src/services/test-suite/test-suite-service.ts +2 -4
- package/templates/starter/src/types/form/actionHandler.ts +1 -5
- package/templates/starter/tsconfig.json +8 -8
|
@@ -1,108 +1,68 @@
|
|
|
1
1
|
import { When, Then, CustomWorld, expect, SelectorName, resolveLocator, getEnvironment, generateRandomData, RandomDataType } from '../../../packages/cucumber-runtime/src/index.js'
|
|
2
|
-
/**
|
|
3
|
-
* @name text assertion
|
|
4
|
-
* @description Template steps for asserting text inside elements
|
|
5
|
-
* @type VALIDATION
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* @
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
expect(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (!selector) throw new Error(`Selector ${elementName} not found`);
|
|
70
|
-
const elementTextContent = await this.page
|
|
71
|
-
.locator(selector)
|
|
72
|
-
.textContent();
|
|
73
|
-
if (!elementTextContent)
|
|
74
|
-
throw new Error(
|
|
75
|
-
`Element ${elementName} does not have any text content`
|
|
76
|
-
);
|
|
77
|
-
if (shouldEqual) {
|
|
78
|
-
expect(
|
|
79
|
-
elementTextContent,
|
|
80
|
-
`Expected ${elementName} to equal "${elementText}"`
|
|
81
|
-
).to.equal(elementText);
|
|
82
|
-
} else {
|
|
83
|
-
expect(
|
|
84
|
-
elementTextContent,
|
|
85
|
-
`Expected ${elementName} NOT to equal "${elementText}"`
|
|
86
|
-
).to.not.equal(elementText);
|
|
87
|
-
}
|
|
88
|
-
} catch (error) {
|
|
89
|
-
throw new Error(
|
|
90
|
-
`Failed to validate the equality of the text of the element ${elementName}: ${error}`
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* @name assert element contains stored variable text
|
|
98
|
-
* @description Template step to validate whether an element text contains the text inside a stored variable
|
|
99
|
-
* @icon VALIDATION
|
|
100
|
-
*/
|
|
101
|
-
Then(
|
|
102
|
-
'the element {string} should contain the text inside the stored variable {string}',
|
|
103
|
-
async function (
|
|
104
|
-
this: CustomWorld,
|
|
105
|
-
_elementName: SelectorName,
|
|
106
|
-
_variableName: string
|
|
107
|
-
) {}
|
|
108
|
-
);
|
|
2
|
+
/**
|
|
3
|
+
* @name text assertion
|
|
4
|
+
* @description Template steps for asserting text inside elements
|
|
5
|
+
* @type VALIDATION
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @name assert element contains stored variable text
|
|
10
|
+
* @description Template step to validate whether an element text contains the text inside a stored variable
|
|
11
|
+
* @icon VALIDATION
|
|
12
|
+
*/
|
|
13
|
+
Then(
|
|
14
|
+
'the element {string} should contain the text inside the stored variable {string}',
|
|
15
|
+
async function (this: CustomWorld, _elementName: SelectorName, _variableName: string) {},
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @name assert element contains text
|
|
20
|
+
* @description Template step for validating whether an element contains a certain text or not
|
|
21
|
+
* @icon VALIDATION
|
|
22
|
+
*/
|
|
23
|
+
Then(
|
|
24
|
+
'the element {string} should {boolean} contain the text {string}',
|
|
25
|
+
async function (this: CustomWorld, elementName: SelectorName, shouldContain: boolean, elementText: string) {
|
|
26
|
+
try {
|
|
27
|
+
const selector = await resolveLocator(this.page, elementName)
|
|
28
|
+
if (!selector) throw new Error(`Selector ${elementName} not found`)
|
|
29
|
+
const elementTextContent = await this.page.locator(selector).textContent()
|
|
30
|
+
|
|
31
|
+
if (!elementTextContent) throw new Error(`Element ${elementName} does not have any text content`)
|
|
32
|
+
|
|
33
|
+
if (shouldContain) {
|
|
34
|
+
expect(elementTextContent, `Expected ${elementName} to contain "${elementText}"`).to.contain(elementText)
|
|
35
|
+
} else {
|
|
36
|
+
expect(elementTextContent, `Expected ${elementName} NOT to contain "${elementText}"`).to.not.contain(
|
|
37
|
+
elementText,
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
} catch (error) {
|
|
41
|
+
throw new Error(`Failed to validate the containment of the text of the element ${elementName}: ${error}`)
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @name assert element equals text
|
|
48
|
+
* @description Template step for validating whether an element text equals a provided text or not
|
|
49
|
+
* @icon VALIDATION
|
|
50
|
+
*/
|
|
51
|
+
Then(
|
|
52
|
+
'the element {string} should {boolean} equal the text {string}',
|
|
53
|
+
async function (this: CustomWorld, elementName: SelectorName, shouldEqual: boolean, elementText: string) {
|
|
54
|
+
try {
|
|
55
|
+
const selector = await resolveLocator(this.page, elementName)
|
|
56
|
+
if (!selector) throw new Error(`Selector ${elementName} not found`)
|
|
57
|
+
const elementTextContent = await this.page.locator(selector).textContent()
|
|
58
|
+
if (!elementTextContent) throw new Error(`Element ${elementName} does not have any text content`)
|
|
59
|
+
if (shouldEqual) {
|
|
60
|
+
expect(elementTextContent, `Expected ${elementName} to equal "${elementText}"`).to.equal(elementText)
|
|
61
|
+
} else {
|
|
62
|
+
expect(elementTextContent, `Expected ${elementName} NOT to equal "${elementText}"`).to.not.equal(elementText)
|
|
63
|
+
}
|
|
64
|
+
} catch (error) {
|
|
65
|
+
throw new Error(`Failed to validate the equality of the text of the element ${elementName}: ${error}`)
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
)
|
|
@@ -1,27 +1,25 @@
|
|
|
1
1
|
import { When, Then, CustomWorld, expect, SelectorName, resolveLocator, getEnvironment, generateRandomData, RandomDataType } from '../../../packages/cucumber-runtime/src/index.js'
|
|
2
|
-
/**
|
|
3
|
-
* @name visibility assertion
|
|
4
|
-
* @description Template steps that handles the assertion of element visibility states
|
|
5
|
-
* @type VALIDATION
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* @
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
-
)
|
|
2
|
+
/**
|
|
3
|
+
* @name visibility assertion
|
|
4
|
+
* @description Template steps that handles the assertion of element visibility states
|
|
5
|
+
* @type VALIDATION
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @name assert element visible
|
|
10
|
+
* @description Template step for validating whether an element should be visible or not
|
|
11
|
+
* @icon VALIDATION
|
|
12
|
+
*/
|
|
13
|
+
Then(
|
|
14
|
+
'the visibility status of the {string} element should be {boolean}',
|
|
15
|
+
async function (this: CustomWorld, elementName: SelectorName, isVisible: boolean) {
|
|
16
|
+
try {
|
|
17
|
+
const selector = await resolveLocator(this.page, elementName)
|
|
18
|
+
if (!selector) throw new Error(`Selector ${elementName} not found`)
|
|
19
|
+
const elementVisibilityStatus = await this.page.locator(selector).isVisible({ timeout: 10000 })
|
|
20
|
+
expect(elementVisibilityStatus).to.equal(isVisible)
|
|
21
|
+
} catch (error) {
|
|
22
|
+
throw new Error(`Failed to validate the visibility of the element ${elementName}: ${error}`)
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
)
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
-
"style": "new-york",
|
|
4
|
-
"rsc": true,
|
|
5
|
-
"tsx": true,
|
|
6
|
-
"tailwind": {
|
|
7
|
-
"config": "tailwind.config.ts",
|
|
8
|
-
"css": "src/app/globals.css",
|
|
9
|
-
"baseColor": "slate",
|
|
10
|
-
"cssVariables": true,
|
|
11
|
-
"prefix": ""
|
|
12
|
-
},
|
|
13
|
-
"iconLibrary": "lucide",
|
|
14
|
-
"aliases": {
|
|
15
|
-
"components": "@/components",
|
|
16
|
-
"utils": "@/lib/utils",
|
|
17
|
-
"ui": "@/components/ui",
|
|
18
|
-
"lib": "@/lib",
|
|
19
|
-
"hooks": "@/hooks"
|
|
20
|
-
},
|
|
21
|
-
"registries": {
|
|
22
|
-
"@kokonutui": "https://kokonutui.com/r/{name}.json"
|
|
23
|
-
}
|
|
24
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "new-york",
|
|
4
|
+
"rsc": true,
|
|
5
|
+
"tsx": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "tailwind.config.ts",
|
|
8
|
+
"css": "src/app/globals.css",
|
|
9
|
+
"baseColor": "slate",
|
|
10
|
+
"cssVariables": true,
|
|
11
|
+
"prefix": ""
|
|
12
|
+
},
|
|
13
|
+
"iconLibrary": "lucide",
|
|
14
|
+
"aliases": {
|
|
15
|
+
"components": "@/components",
|
|
16
|
+
"utils": "@/lib/utils",
|
|
17
|
+
"ui": "@/components/ui",
|
|
18
|
+
"lib": "@/lib",
|
|
19
|
+
"hooks": "@/hooks"
|
|
20
|
+
},
|
|
21
|
+
"registries": {
|
|
22
|
+
"@kokonutui": "https://kokonutui.com/r/{name}.json"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
// eslint-disable-next-line import/no-anonymous-default-export
|
|
2
|
-
export default {
|
|
3
|
-
paths: ['automation/features/**/*.feature'],
|
|
4
|
-
import: [
|
|
5
|
-
'packages/cucumber-runtime/src/parameter-types.ts',
|
|
6
|
-
'automation/steps/**/*.ts',
|
|
7
|
-
'packages/cucumber-runtime/src/hooks.ts',
|
|
8
|
-
'packages/cucumber-runtime/src/world.ts',
|
|
9
|
-
],
|
|
10
|
-
loader: ['ts-node/esm'],
|
|
11
|
-
format: [
|
|
12
|
-
'pretty',
|
|
13
|
-
process.env.REPORT_FORMAT ?? `json:${process.env.REPORT_PATH ?? 'automation/reports/cucumber.json'}`,
|
|
14
|
-
],
|
|
15
|
-
publishQuiet: true,
|
|
16
|
-
}
|
|
1
|
+
// eslint-disable-next-line import/no-anonymous-default-export
|
|
2
|
+
export default {
|
|
3
|
+
paths: ['automation/features/**/*.feature'],
|
|
4
|
+
import: [
|
|
5
|
+
'packages/cucumber-runtime/src/parameter-types.ts',
|
|
6
|
+
'automation/steps/**/*.ts',
|
|
7
|
+
'packages/cucumber-runtime/src/hooks.ts',
|
|
8
|
+
'packages/cucumber-runtime/src/world.ts',
|
|
9
|
+
],
|
|
10
|
+
loader: ['ts-node/esm'],
|
|
11
|
+
format: [
|
|
12
|
+
'pretty',
|
|
13
|
+
process.env.REPORT_FORMAT ?? `json:${process.env.REPORT_PATH ?? 'automation/reports/cucumber.json'}`,
|
|
14
|
+
],
|
|
15
|
+
publishQuiet: true,
|
|
16
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# AppraiseJS E2E tests
|
|
2
|
+
|
|
3
|
+
Playwright UI tests run against a local Next.js server with an isolated SQLite database. Data is reset and seeded before each test via Prisma helpers in `e2e/helpers/test-data.ts`.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
- `npm run validate:e2e` — full suite (used in CI)
|
|
8
|
+
- `npm run validate:e2e:smoke` — smoke gate only (`@smoke` tag)
|
|
9
|
+
- `E2E_GREP=@crud npx playwright test` — run a tagged subset locally
|
|
10
|
+
|
|
11
|
+
## CI and parallelism
|
|
12
|
+
|
|
13
|
+
GitHub Actions runs `npm run validate:e2e` after `npm run build` with `DATABASE_URL=file:./e2e.db`
|
|
14
|
+
and `CI=true`. The Playwright web server starts via `e2e/start-server.mjs`, which recreates the
|
|
15
|
+
E2E database and applies migrations before serving the production build.
|
|
16
|
+
|
|
17
|
+
Keep `workers: 1` and `fullyParallel: false` in `playwright.config.ts` until each worker gets an
|
|
18
|
+
isolated database. Spec files reset and seed the same SQLite file in `beforeEach`, so parallel
|
|
19
|
+
workers cause unique-constraint and foreign-key failures in CI and locally.
|
|
20
|
+
|
|
21
|
+
## Layout
|
|
22
|
+
|
|
23
|
+
| File | Purpose |
|
|
24
|
+
| --- | --- |
|
|
25
|
+
| `appraise-smoke.spec.ts` | Fast regression gate |
|
|
26
|
+
| `navigation.spec.ts` | Route matrix and dashboard attention links |
|
|
27
|
+
| `crud-configuration.spec.ts` | Configuration entity CRUD |
|
|
28
|
+
| `crud-tests.spec.ts` | Suites, cases, template-based create |
|
|
29
|
+
| `authoring.spec.ts` | Inline dialogs, flow panel, authoring |
|
|
30
|
+
| `runs-and-reports.spec.ts` | Seeded runs, reports, create form (no execution) |
|
|
31
|
+
| `settings-sync.spec.ts` | Per-script sync buttons |
|
|
32
|
+
|
|
33
|
+
Helpers live under `e2e/helpers/` (`ui`, `navigation`, `table`, `forms`, `test-data`).
|
|
34
|
+
|
|
35
|
+
## Seed model
|
|
36
|
+
|
|
37
|
+
`seedCoreData()` provisions modules, environments, tags, locators, template steps, a test case and suite, a completed run with report, and dashboard metric variants (failed, queued, running runs; attention metrics for drawer links).
|
|
38
|
+
|
|
39
|
+
Seeded IDs are exported as `seededIds` for deep-link tests.
|
|
40
|
+
|
|
41
|
+
## Scope boundaries
|
|
42
|
+
|
|
43
|
+
**In scope:** UI flows with deterministic Prisma seed data.
|
|
44
|
+
|
|
45
|
+
**Out of scope (covered elsewhere):**
|
|
46
|
+
|
|
47
|
+
- Live `cucumber-js` execution and report JSON ingestion during E2E
|
|
48
|
+
- Locator picker companion / external browser extension flows
|
|
49
|
+
- Bidirectional feature sync CLI unless exposed in Settings UI
|
|
50
|
+
|
|
51
|
+
## Debugging
|
|
52
|
+
|
|
53
|
+
- Traces: `trace: 'on-first-retry'` in `playwright.config.ts`
|
|
54
|
+
- Videos/screenshots retained on failure
|
|
55
|
+
- Run a single file: `npx playwright test e2e/navigation.spec.ts`
|
|
56
|
+
- UI mode: `npx playwright test --ui`
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto'
|
|
2
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs'
|
|
3
|
+
import { isAbsolute, join, resolve } from 'node:path'
|
|
4
|
+
import { DatabaseSync } from 'node:sqlite'
|
|
5
|
+
|
|
6
|
+
function sqlitePathFromDatabaseUrl(value) {
|
|
7
|
+
if (!value?.startsWith('file:')) {
|
|
8
|
+
throw new Error(`E2E SQLite setup expects a file: DATABASE_URL, received ${value || '<empty>'}`)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const sqlitePath = value.replace(/^file:/, '')
|
|
12
|
+
return isAbsolute(sqlitePath) ? sqlitePath : resolve(process.cwd(), 'prisma', sqlitePath)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const databaseUrl = process.env.DATABASE_URL ?? 'file:./e2e.db'
|
|
16
|
+
const databasePath = sqlitePathFromDatabaseUrl(databaseUrl)
|
|
17
|
+
const migrationsDir = resolve(process.cwd(), 'prisma', 'migrations')
|
|
18
|
+
const db = new DatabaseSync(databasePath)
|
|
19
|
+
|
|
20
|
+
db.exec(`
|
|
21
|
+
CREATE TABLE IF NOT EXISTS "_prisma_migrations" (
|
|
22
|
+
"id" TEXT PRIMARY KEY NOT NULL,
|
|
23
|
+
"checksum" TEXT NOT NULL,
|
|
24
|
+
"finished_at" DATETIME,
|
|
25
|
+
"migration_name" TEXT NOT NULL,
|
|
26
|
+
"logs" TEXT,
|
|
27
|
+
"rolled_back_at" DATETIME,
|
|
28
|
+
"started_at" DATETIME NOT NULL DEFAULT current_timestamp,
|
|
29
|
+
"applied_steps_count" INTEGER UNSIGNED NOT NULL DEFAULT 0
|
|
30
|
+
);
|
|
31
|
+
`)
|
|
32
|
+
|
|
33
|
+
const appliedRows = db.prepare('SELECT migration_name FROM "_prisma_migrations"').all()
|
|
34
|
+
const appliedMigrations = new Set(appliedRows.map(row => row.migration_name))
|
|
35
|
+
const insertMigration = db.prepare(`
|
|
36
|
+
INSERT INTO "_prisma_migrations" (
|
|
37
|
+
id,
|
|
38
|
+
checksum,
|
|
39
|
+
finished_at,
|
|
40
|
+
migration_name,
|
|
41
|
+
logs,
|
|
42
|
+
rolled_back_at,
|
|
43
|
+
applied_steps_count
|
|
44
|
+
) VALUES (?, ?, current_timestamp, ?, NULL, NULL, 1)
|
|
45
|
+
`)
|
|
46
|
+
|
|
47
|
+
const migrationNames = readdirSync(migrationsDir, { withFileTypes: true })
|
|
48
|
+
.filter(entry => entry.isDirectory())
|
|
49
|
+
.map(entry => entry.name)
|
|
50
|
+
.sort()
|
|
51
|
+
|
|
52
|
+
for (const migrationName of migrationNames) {
|
|
53
|
+
if (appliedMigrations.has(migrationName)) {
|
|
54
|
+
continue
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const migrationPath = join(migrationsDir, migrationName, 'migration.sql')
|
|
58
|
+
if (!existsSync(migrationPath)) {
|
|
59
|
+
continue
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const sql = readFileSync(migrationPath, 'utf8')
|
|
63
|
+
const checksum = createHash('sha256').update(sql).digest('hex')
|
|
64
|
+
|
|
65
|
+
db.exec('BEGIN')
|
|
66
|
+
try {
|
|
67
|
+
db.exec(sql)
|
|
68
|
+
insertMigration.run(randomUUID(), checksum, migrationName)
|
|
69
|
+
db.exec('COMMIT')
|
|
70
|
+
} catch (error) {
|
|
71
|
+
db.exec('ROLLBACK')
|
|
72
|
+
throw error
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
db.close()
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
disconnectPrisma,
|
|
5
|
+
findModuleByName,
|
|
6
|
+
generateSeededFeature,
|
|
7
|
+
readGeneratedFeature,
|
|
8
|
+
resetE2eData,
|
|
9
|
+
seedCoreData,
|
|
10
|
+
seededIds,
|
|
11
|
+
} from './helpers/test-data'
|
|
12
|
+
import { createModule, expectPageHeading } from './helpers/ui'
|
|
13
|
+
|
|
14
|
+
test.describe('Smoke @smoke', () => {
|
|
15
|
+
test.beforeEach(async () => {
|
|
16
|
+
await resetE2eData()
|
|
17
|
+
await seedCoreData()
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
test.afterAll(async () => {
|
|
21
|
+
await disconnectPrisma()
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test('dashboard renders seeded entity metrics', async ({ page }) => {
|
|
25
|
+
await page.goto('/')
|
|
26
|
+
await expectPageHeading(page, 'Dashboard')
|
|
27
|
+
await expect(page.getByText('Test Cases')).toBeVisible()
|
|
28
|
+
await expect(page.getByText('Test Suites')).toBeVisible()
|
|
29
|
+
await expect(page.getByText('Template Steps')).toBeVisible()
|
|
30
|
+
await expect(page.getByText('Attention Needed')).toBeVisible()
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
test('module CRUD path creates edits and deletes a module', async ({ page }) => {
|
|
34
|
+
const moduleName = 'E2E Smoke Module'
|
|
35
|
+
const editedModuleName = 'E2E Smoke Module Edited'
|
|
36
|
+
|
|
37
|
+
await createModule(page, moduleName)
|
|
38
|
+
const createdModule = await findModuleByName(moduleName)
|
|
39
|
+
expect(createdModule).not.toBeNull()
|
|
40
|
+
|
|
41
|
+
await page.goto(`/modules/modify/${createdModule?.id}`)
|
|
42
|
+
await page.getByLabel('Name').fill(editedModuleName)
|
|
43
|
+
await page.getByRole('button', { name: /^Save$/ }).click()
|
|
44
|
+
await expect(page).toHaveURL(/\/modules$/)
|
|
45
|
+
await expect(page.getByText(editedModuleName, { exact: true }).first()).toBeVisible()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
test('seeded completed run opens report summary', async ({ page }) => {
|
|
49
|
+
await page.goto(`/test-runs/${seededIds.testRun}`)
|
|
50
|
+
await expectPageHeading(page, 'Test Run Details')
|
|
51
|
+
await expect(page.getByText('E2E Completed Run')).toBeVisible()
|
|
52
|
+
|
|
53
|
+
await page.getByRole('link', { name: /View Report/ }).click()
|
|
54
|
+
await expectPageHeading(page, /Test Run Report:/)
|
|
55
|
+
await expect(page.getByText('E2E seeded login works')).toBeVisible()
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
test('settings sync all completes without a fatal error', async ({ page }) => {
|
|
59
|
+
test.setTimeout(120_000)
|
|
60
|
+
|
|
61
|
+
await page.goto('/settings')
|
|
62
|
+
await expectPageHeading(page, 'Settings')
|
|
63
|
+
await page.getByRole('button', { name: 'Sync All' }).click()
|
|
64
|
+
await expect(page.getByText(/Sync completed|Sync failed/).first()).toBeVisible({ timeout: 90_000 })
|
|
65
|
+
await expect(page.getByText(/fatal|uncaught/i)).toHaveCount(0)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
test('feature generation writes suite-backed feature output', async () => {
|
|
69
|
+
const featurePath = await generateSeededFeature()
|
|
70
|
+
const featureContent = readGeneratedFeature()
|
|
71
|
+
|
|
72
|
+
expect(featurePath.replaceAll('\\', '/')).toContain('automation/features/E2E Auth/e2e-auth-suite.feature')
|
|
73
|
+
expect(featureContent).toContain('Feature: Seeded suite for E2E feature generation')
|
|
74
|
+
expect(featureContent).toContain('@e2e-smoke')
|
|
75
|
+
expect(featureContent).toContain('Scenario: [E2E seeded login works] Seeded login smoke case')
|
|
76
|
+
expect(featureContent).toContain('Given I open the seeded page')
|
|
77
|
+
})
|
|
78
|
+
})
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { disconnectPrisma, resetE2eData, seedCoreData, seededIds } from './helpers/test-data'
|
|
4
|
+
import { createTestCaseWithSeededStep } from './helpers/forms'
|
|
5
|
+
import { expectPageHeading } from './helpers/ui'
|
|
6
|
+
|
|
7
|
+
test.describe('Test authoring @authoring', () => {
|
|
8
|
+
test.beforeEach(async () => {
|
|
9
|
+
await resetE2eData()
|
|
10
|
+
await seedCoreData()
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
test.afterAll(async () => {
|
|
14
|
+
await disconnectPrisma()
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
test('inline tag and test suite dialogs add selectable records', async ({ page }) => {
|
|
18
|
+
await page.goto('/test-cases/create')
|
|
19
|
+
await expectPageHeading(page, 'Create New Test Case')
|
|
20
|
+
await page.getByRole('textbox', { name: 'Title' }).fill('E2E Inline Dialog Case')
|
|
21
|
+
|
|
22
|
+
await page.getByRole('button', { name: 'Create filter tag' }).click()
|
|
23
|
+
await page.getByRole('textbox', { name: 'Name', exact: true }).fill('E2E Inline Tag')
|
|
24
|
+
await page.getByRole('textbox', { name: 'Tag Expression', exact: true }).fill('@e2e-inline')
|
|
25
|
+
await page.getByRole('button', { name: /^Save$/ }).click()
|
|
26
|
+
await expect(page.getByRole('button', { name: 'E2E Inline Tag' })).toBeVisible()
|
|
27
|
+
|
|
28
|
+
await page.getByRole('button', { name: 'Create test suite' }).click()
|
|
29
|
+
await page.getByLabel('Name').fill('E2E Inline Suite')
|
|
30
|
+
await page.getByLabel('Module').click()
|
|
31
|
+
await page.getByRole('option', { name: 'E2E Auth' }).click()
|
|
32
|
+
await page.getByRole('button', { name: /^Save$/ }).click()
|
|
33
|
+
await expect(page.getByRole('button', { name: 'E2E Inline Suite' })).toBeVisible()
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('flow panel mounts on modify page and scenario preview shows seeded steps', async ({ page }) => {
|
|
37
|
+
await page.goto(`/test-cases/modify/${seededIds.testCase}`)
|
|
38
|
+
await expectPageHeading(page, 'Modify Test Case')
|
|
39
|
+
await page.getByRole('button', { name: /Continue/ }).click()
|
|
40
|
+
await expect(page.getByText('Test Case Flow', { exact: true }).first()).toBeVisible()
|
|
41
|
+
await expect(page.getByRole('button', { name: 'Search nodes' })).toBeVisible()
|
|
42
|
+
|
|
43
|
+
await page.getByRole('button', { name: 'Show test scenario preview' }).click()
|
|
44
|
+
await expect(page.getByText('Test Scenario(Preview)')).toBeVisible()
|
|
45
|
+
await expect(page.getByText('Given I open the seeded page')).toBeVisible()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
test('full create flow adds a template-backed step before saving', async ({ page }) => {
|
|
49
|
+
await createTestCaseWithSeededStep(page, 'E2E Authored Case')
|
|
50
|
+
await page.goto('/test-cases')
|
|
51
|
+
await expect(page.getByText('E2E Authored Case', { exact: true }).first()).toBeVisible()
|
|
52
|
+
})
|
|
53
|
+
})
|