@sun-asterisk/sungen 1.0.20 → 1.0.22
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/dist/cli/commands/add.d.ts +3 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +27 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/cache-clear.d.ts +3 -0
- package/dist/cli/commands/cache-clear.d.ts.map +1 -0
- package/dist/cli/commands/cache-clear.js +24 -0
- package/dist/cli/commands/cache-clear.js.map +1 -0
- package/dist/cli/commands/full.d.ts +3 -0
- package/dist/cli/commands/full.d.ts.map +1 -0
- package/dist/cli/commands/full.js +37 -0
- package/dist/cli/commands/full.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +3 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +53 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +20 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/live-scan.d.ts +3 -0
- package/dist/cli/commands/live-scan.d.ts.map +1 -0
- package/dist/cli/commands/{live-scan-command.js → live-scan.js} +8 -15
- package/dist/cli/commands/live-scan.js.map +1 -0
- package/dist/cli/commands/makeauth.d.ts +3 -0
- package/dist/cli/commands/makeauth.d.ts.map +1 -0
- package/dist/cli/commands/makeauth.js +76 -0
- package/dist/cli/commands/makeauth.js.map +1 -0
- package/dist/cli/commands/map.d.ts +3 -0
- package/dist/cli/commands/map.d.ts.map +1 -0
- package/dist/cli/commands/map.js +93 -0
- package/dist/cli/commands/map.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +43 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.js +29 -442
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/types.d.ts +9 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +7 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/utils.d.ts +6 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +101 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/core/live-scanner/element-finder.d.ts.map +1 -1
- package/dist/core/live-scanner/element-finder.js +138 -22
- package/dist/core/live-scanner/element-finder.js.map +1 -1
- package/dist/core/live-scanner/matrix-reader.d.ts.map +1 -1
- package/dist/core/live-scanner/matrix-reader.js +2 -40
- package/dist/core/live-scanner/matrix-reader.js.map +1 -1
- package/dist/core/live-scanner/matrix-writer.d.ts.map +1 -1
- package/dist/core/live-scanner/matrix-writer.js +14 -4
- package/dist/core/live-scanner/matrix-writer.js.map +1 -1
- package/dist/core/live-scanner/step-replayer.d.ts.map +1 -1
- package/dist/core/live-scanner/step-replayer.js +7 -0
- package/dist/core/live-scanner/step-replayer.js.map +1 -1
- package/dist/core/validator/selector-validator.d.ts.map +1 -1
- package/dist/core/validator/selector-validator.js +2 -1
- package/dist/core/validator/selector-validator.js.map +1 -1
- package/dist/generators/scaffold-generator/index.d.ts +2 -1
- package/dist/generators/scaffold-generator/index.d.ts.map +1 -1
- package/dist/generators/scaffold-generator/index.js +21 -1
- package/dist/generators/scaffold-generator/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +95 -58
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.d.ts +0 -2
- package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.js +34 -47
- package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +3 -1
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +20 -3
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +0 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +44 -85
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/legacy-patterns.js +98 -0
- package/dist/generators/test-generator/patterns/legacy-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +0 -2
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.js +14 -42
- package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts +0 -1
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/setup-patterns.js +23 -35
- package/dist/generators/test-generator/patterns/setup-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/types.d.ts +18 -3
- package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.d.ts +0 -15
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +4 -106
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/{executor/test-generator.d.ts → generators/test-generator/types.d.ts} +4 -25
- package/dist/generators/test-generator/types.d.ts.map +1 -0
- package/dist/generators/test-generator/types.js +106 -0
- package/dist/generators/test-generator/types.js.map +1 -0
- package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.js +8 -17
- package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +10 -18
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/cache-manager.d.ts +1 -23
- package/dist/orchestrator/cache-manager.d.ts.map +1 -1
- package/dist/orchestrator/cache-manager.js +1 -87
- package/dist/orchestrator/cache-manager.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +11 -28
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +52 -371
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/reporter.d.ts +1 -1
- package/dist/orchestrator/reporter.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +1 -1
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/utils/feature-finder.d.ts +9 -0
- package/dist/utils/feature-finder.d.ts.map +1 -0
- package/dist/utils/feature-finder.js +67 -0
- package/dist/utils/feature-finder.js.map +1 -0
- package/dist/utils/screen-paths.d.ts +10 -0
- package/dist/utils/screen-paths.d.ts.map +1 -0
- package/dist/utils/screen-paths.js +73 -0
- package/dist/utils/screen-paths.js.map +1 -0
- package/dist/utils/selector-loader.d.ts +6 -0
- package/dist/utils/selector-loader.d.ts.map +1 -0
- package/dist/utils/selector-loader.js +20 -0
- package/dist/utils/selector-loader.js.map +1 -0
- package/dist/utils/selector-types.d.ts +7 -0
- package/dist/utils/selector-types.d.ts.map +1 -0
- package/dist/utils/selector-types.js +19 -0
- package/dist/utils/selector-types.js.map +1 -0
- package/dist/utils/test-data-loader.d.ts +6 -0
- package/dist/utils/test-data-loader.d.ts.map +1 -0
- package/dist/utils/test-data-loader.js +20 -0
- package/dist/utils/test-data-loader.js.map +1 -0
- package/dist/utils/yaml-io.d.ts +14 -0
- package/dist/utils/yaml-io.d.ts.map +1 -0
- package/dist/utils/yaml-io.js +72 -0
- package/dist/utils/yaml-io.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/commands/add.ts +25 -0
- package/src/cli/commands/cache-clear.ts +22 -0
- package/src/cli/commands/full.ts +35 -0
- package/src/cli/commands/generate.ts +55 -0
- package/src/cli/commands/init.ts +17 -0
- package/src/cli/commands/{live-scan-command.ts → live-scan.ts} +8 -17
- package/src/cli/commands/makeauth.ts +77 -0
- package/src/cli/commands/map.ts +97 -0
- package/src/cli/commands/validate.ts +43 -0
- package/src/cli/index.ts +32 -473
- package/src/cli/types.ts +9 -0
- package/src/cli/utils.ts +106 -0
- package/src/core/live-scanner/element-finder.ts +142 -21
- package/src/core/live-scanner/matrix-reader.ts +2 -8
- package/src/core/live-scanner/matrix-writer.ts +14 -4
- package/src/core/live-scanner/step-replayer.ts +7 -0
- package/src/core/validator/selector-validator.ts +3 -2
- package/src/generators/scaffold-generator/index.ts +23 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
- package/src/generators/test-generator/patterns/assertion-patterns.ts +102 -62
- package/src/generators/test-generator/patterns/form-patterns.ts +38 -60
- package/src/generators/test-generator/patterns/index.ts +22 -4
- package/src/generators/test-generator/patterns/interaction-patterns.ts +47 -107
- package/src/generators/test-generator/patterns/legacy-patterns.ts +104 -0
- package/src/generators/test-generator/patterns/navigation-patterns.ts +27 -69
- package/src/generators/test-generator/patterns/setup-patterns.ts +23 -41
- package/src/generators/test-generator/patterns/types.ts +26 -9
- package/src/generators/test-generator/step-mapper.ts +4 -124
- package/src/generators/test-generator/types.ts +131 -0
- package/src/generators/test-generator/utils/data-resolver.ts +8 -13
- package/src/generators/test-generator/utils/selector-resolver.ts +15 -17
- package/src/orchestrator/cache-manager.ts +1 -107
- package/src/orchestrator/pipeline.ts +58 -433
- package/src/orchestrator/reporter.ts +1 -1
- package/src/orchestrator/screen-manager.ts +1 -1
- package/src/utils/feature-finder.ts +33 -0
- package/src/utils/screen-paths.ts +37 -0
- package/src/utils/selector-loader.ts +23 -0
- package/src/utils/selector-types.ts +17 -0
- package/src/utils/test-data-loader.ts +23 -0
- package/src/utils/yaml-io.ts +33 -0
- package/dist/cli/commands/auto-tag-command.d.ts +0 -8
- package/dist/cli/commands/auto-tag-command.d.ts.map +0 -1
- package/dist/cli/commands/auto-tag-command.js +0 -104
- package/dist/cli/commands/auto-tag-command.js.map +0 -1
- package/dist/cli/commands/live-scan-command.d.ts +0 -9
- package/dist/cli/commands/live-scan-command.d.ts.map +0 -1
- package/dist/cli/commands/live-scan-command.js.map +0 -1
- package/dist/executor/playwright/playwright-generator.d.ts +0 -33
- package/dist/executor/playwright/playwright-generator.d.ts.map +0 -1
- package/dist/executor/playwright/playwright-generator.js +0 -136
- package/dist/executor/playwright/playwright-generator.js.map +0 -1
- package/dist/executor/test-generator.d.ts.map +0 -1
- package/dist/executor/test-generator.js +0 -30
- package/dist/executor/test-generator.js.map +0 -1
- package/dist/generators/cli.d.ts +0 -7
- package/dist/generators/cli.d.ts.map +0 -1
- package/dist/generators/cli.js +0 -570
- package/dist/generators/cli.js.map +0 -1
- package/dist/input/cli-adapter.d.ts +0 -75
- package/dist/input/cli-adapter.d.ts.map +0 -1
- package/dist/input/cli-adapter.js +0 -218
- package/dist/input/cli-adapter.js.map +0 -1
- package/dist/input/config-adapter.d.ts +0 -25
- package/dist/input/config-adapter.d.ts.map +0 -1
- package/dist/input/config-adapter.js +0 -70
- package/dist/input/config-adapter.js.map +0 -1
- package/dist/input/input-adapter.d.ts +0 -28
- package/dist/input/input-adapter.d.ts.map +0 -1
- package/dist/input/input-adapter.js +0 -17
- package/dist/input/input-adapter.js.map +0 -1
- package/dist/input/vscode-adapter.d.ts +0 -62
- package/dist/input/vscode-adapter.d.ts.map +0 -1
- package/dist/input/vscode-adapter.js +0 -64
- package/dist/input/vscode-adapter.js.map +0 -1
- package/dist/tools/auto-tagger.d.ts +0 -107
- package/dist/tools/auto-tagger.d.ts.map +0 -1
- package/dist/tools/auto-tagger.js +0 -502
- package/dist/tools/auto-tagger.js.map +0 -1
- package/src/cli/commands/auto-tag-command.ts +0 -80
- package/src/executor/playwright/playwright-generator.ts +0 -125
- package/src/executor/test-generator.ts +0 -90
- package/src/generators/cli.ts +0 -640
- package/src/input/cli-adapter.ts +0 -233
- package/src/input/config-adapter.ts +0 -71
- package/src/input/input-adapter.ts +0 -32
- package/src/input/vscode-adapter.ts +0 -90
- package/src/tools/auto-tagger.ts +0 -572
|
@@ -14,7 +14,6 @@ function extractWaitState(text: string): string {
|
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Map a plain element keyword (no brackets) to a Playwright ARIA role.
|
|
17
|
-
* e.g. "dialog" → "dialog", "modal" → "dialog", "alert" → "alertdialog"
|
|
18
17
|
*/
|
|
19
18
|
function elementKeywordToRole(text: string): string | null {
|
|
20
19
|
const match = text.match(/\bwait(?:s)?\s+for\s+(dialog|modal|alert|alertdialog|tooltip|menu|listbox|combobox|grid|table|status|banner|navigation|main|region)\b/i);
|
|
@@ -29,32 +28,21 @@ function elementKeywordToRole(text: string): string | null {
|
|
|
29
28
|
|
|
30
29
|
/**
|
|
31
30
|
* Interaction patterns: click, hover, press, wait
|
|
32
|
-
* Uses template engine for framework-agnostic code generation
|
|
33
31
|
*/
|
|
34
32
|
export const interactionPatterns: StepPattern[] = [
|
|
35
|
-
// Unknown element with variable pattern (selector value is empty, identified by filter)
|
|
36
|
-
// Matches: "When User click [target order] row with {{order_name}}"
|
|
37
|
-
// Generates: await page.getByText('').filter({ hasText: /.*value of order_name$/ }).click();
|
|
38
33
|
{
|
|
39
34
|
name: 'unknown-element-action',
|
|
40
35
|
matcher: (step: ParsedStep) => {
|
|
41
|
-
// Check if selectorRef starts with "target " (target element indicator)
|
|
42
36
|
const isTargetElement = step.selectorRef && /^target\s/i.test(step.selectorRef);
|
|
43
|
-
// Must have both selector and variable, and "with" clause
|
|
44
|
-
// But EXCLUDE assertion verbs (see, sees) - those should use assertion patterns
|
|
45
37
|
const isInteractionAction = !step.text.includes('see') && !step.text.includes('sees');
|
|
46
38
|
return isTargetElement && !!step.dataRef && step.text.includes('with') && isInteractionAction;
|
|
47
39
|
},
|
|
48
|
-
|
|
49
|
-
// Resolve selector value from YAML (e.g., target.order)
|
|
40
|
+
resolver: (step, context) => {
|
|
50
41
|
let selectorValue = '';
|
|
51
42
|
let nth = 0;
|
|
52
43
|
try {
|
|
53
44
|
const resolved = context.selectorResolver.resolveSelector(
|
|
54
|
-
step.selectorRef!,
|
|
55
|
-
context.featureName,
|
|
56
|
-
step.elementType,
|
|
57
|
-
step.nth
|
|
45
|
+
step.selectorRef!, context.featureName, step.elementType, step.nth
|
|
58
46
|
);
|
|
59
47
|
selectorValue = resolved.value || '';
|
|
60
48
|
nth = resolved.nth || 0;
|
|
@@ -63,7 +51,6 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
63
51
|
nth = 0;
|
|
64
52
|
}
|
|
65
53
|
|
|
66
|
-
// Resolve data variable value
|
|
67
54
|
let dataValue: string;
|
|
68
55
|
try {
|
|
69
56
|
dataValue = context.dataResolver.resolveData(step.dataRef!, context.featureName);
|
|
@@ -71,27 +58,17 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
71
58
|
dataValue = `\${${step.dataRef}}`;
|
|
72
59
|
}
|
|
73
60
|
|
|
74
|
-
// Determine the action method (click, hover, etc.)
|
|
75
61
|
let actionMethod = 'click';
|
|
76
|
-
if (step.text.includes('hover'))
|
|
77
|
-
|
|
78
|
-
} else if (step.text.includes('double')) {
|
|
79
|
-
actionMethod = 'dblclick';
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const code = context.templateEngine.renderStep('unknown-element-action', {
|
|
83
|
-
selectorValue,
|
|
84
|
-
dataValue,
|
|
85
|
-
action: actionMethod,
|
|
86
|
-
nth,
|
|
87
|
-
});
|
|
62
|
+
if (step.text.includes('hover')) actionMethod = 'hover';
|
|
63
|
+
else if (step.text.includes('double')) actionMethod = 'dblclick';
|
|
88
64
|
|
|
89
65
|
return {
|
|
90
|
-
|
|
66
|
+
templateName: 'unknown-element-action',
|
|
67
|
+
data: { selectorValue, dataValue, action: actionMethod, nth },
|
|
91
68
|
comment: `${actionMethod.charAt(0).toUpperCase() + actionMethod.slice(1)} ${step.selectorRef} with ${step.dataRef}`,
|
|
92
69
|
};
|
|
93
70
|
},
|
|
94
|
-
priority: 15,
|
|
71
|
+
priority: 15,
|
|
95
72
|
},
|
|
96
73
|
{
|
|
97
74
|
name: 'click-element-with-text',
|
|
@@ -100,7 +77,7 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
100
77
|
&& !!step.selectorRef
|
|
101
78
|
&& !!(step.dataRef || step.value)
|
|
102
79
|
&& step.text.includes('with'),
|
|
103
|
-
|
|
80
|
+
resolver: (step, context) => {
|
|
104
81
|
const resolved = context.selectorResolver.resolveSelector(
|
|
105
82
|
step.selectorRef!, undefined, step.elementType, step.nth
|
|
106
83
|
);
|
|
@@ -116,16 +93,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
116
93
|
}
|
|
117
94
|
}
|
|
118
95
|
|
|
119
|
-
// When using .filter({ hasText }), name is redundant — data value identifies the element
|
|
120
96
|
const { name: _name, ...resolvedWithoutName } = resolved;
|
|
121
97
|
|
|
122
|
-
const code = context.templateEngine.renderStep('click-element-with-text', {
|
|
123
|
-
...resolvedWithoutName,
|
|
124
|
-
dataValue,
|
|
125
|
-
});
|
|
126
|
-
|
|
127
98
|
return {
|
|
128
|
-
|
|
99
|
+
templateName: 'click-element-with-text',
|
|
100
|
+
data: { ...resolvedWithoutName, dataValue },
|
|
129
101
|
comment: `Click ${step.selectorRef} with text ${step.dataRef || step.value}`,
|
|
130
102
|
};
|
|
131
103
|
},
|
|
@@ -135,13 +107,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
135
107
|
name: 'click-element',
|
|
136
108
|
matcher: (step: ParsedStep) =>
|
|
137
109
|
(step.text.includes('clicks') || step.text.includes('click')) && !!step.selectorRef,
|
|
138
|
-
|
|
110
|
+
resolver: (step, context) => {
|
|
139
111
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
140
|
-
|
|
141
|
-
const code = context.templateEngine.renderStep('click-action', { ...resolved, selectorRef: step.selectorRef });
|
|
142
|
-
|
|
143
112
|
return {
|
|
144
|
-
|
|
113
|
+
templateName: 'click-action',
|
|
114
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
145
115
|
comment: `Click ${step.selectorRef}`,
|
|
146
116
|
};
|
|
147
117
|
},
|
|
@@ -152,13 +122,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
152
122
|
matcher: (step: ParsedStep) =>
|
|
153
123
|
(step.text.includes('double click') || step.text.includes('double-click') ||
|
|
154
124
|
(step.text.includes('double') && step.text.includes('clicks'))) && !!step.selectorRef,
|
|
155
|
-
|
|
125
|
+
resolver: (step, context) => {
|
|
156
126
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
157
|
-
|
|
158
|
-
const code = context.templateEngine.renderStep('double-click-action', { ...resolved, selectorRef: step.selectorRef });
|
|
159
|
-
|
|
160
127
|
return {
|
|
161
|
-
|
|
128
|
+
templateName: 'double-click-action',
|
|
129
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
162
130
|
comment: `Double click ${step.selectorRef}`,
|
|
163
131
|
};
|
|
164
132
|
},
|
|
@@ -168,13 +136,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
168
136
|
name: 'hover-element',
|
|
169
137
|
matcher: (step: ParsedStep) =>
|
|
170
138
|
step.text.includes('hovers') && !!step.selectorRef,
|
|
171
|
-
|
|
139
|
+
resolver: (step, context) => {
|
|
172
140
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
173
|
-
|
|
174
|
-
const code = context.templateEngine.renderStep('hover-action', { ...resolved, selectorRef: step.selectorRef });
|
|
175
|
-
|
|
176
141
|
return {
|
|
177
|
-
|
|
142
|
+
templateName: 'hover-action',
|
|
143
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
178
144
|
comment: `Hover ${step.selectorRef}`,
|
|
179
145
|
};
|
|
180
146
|
},
|
|
@@ -184,16 +150,11 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
184
150
|
name: 'press-enter',
|
|
185
151
|
matcher: (step: ParsedStep) =>
|
|
186
152
|
step.text.includes('presses') && step.text.includes('Enter') && !!step.selectorRef,
|
|
187
|
-
|
|
153
|
+
resolver: (step, context) => {
|
|
188
154
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
189
|
-
|
|
190
|
-
const code = context.templateEngine.renderStep('press-action', {
|
|
191
|
-
...resolved,
|
|
192
|
-
key: 'Enter',
|
|
193
|
-
});
|
|
194
|
-
|
|
195
155
|
return {
|
|
196
|
-
|
|
156
|
+
templateName: 'press-action',
|
|
157
|
+
data: { ...resolved, key: 'Enter' },
|
|
197
158
|
comment: `Press Enter in ${step.selectorRef}`,
|
|
198
159
|
};
|
|
199
160
|
},
|
|
@@ -203,8 +164,7 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
203
164
|
name: 'click-by-data-text',
|
|
204
165
|
matcher: (step: ParsedStep) =>
|
|
205
166
|
(step.text.includes('clicks') || step.text.includes('click')) && !step.selectorRef && !!step.dataRef,
|
|
206
|
-
|
|
207
|
-
// Resolve data reference to actual value
|
|
167
|
+
resolver: (step, context) => {
|
|
208
168
|
let value: string;
|
|
209
169
|
try {
|
|
210
170
|
value = context.dataResolver.resolveData(step.dataRef!, context.featureName);
|
|
@@ -212,43 +172,36 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
212
172
|
value = `\${${step.dataRef}}`;
|
|
213
173
|
}
|
|
214
174
|
|
|
215
|
-
const code = context.templateEngine.renderStep('click-action', {
|
|
216
|
-
strategy: 'text',
|
|
217
|
-
value,
|
|
218
|
-
nth: 0,
|
|
219
|
-
});
|
|
220
|
-
|
|
221
175
|
return {
|
|
222
|
-
|
|
176
|
+
templateName: 'click-action',
|
|
177
|
+
data: { strategy: 'text', value, nth: 0 },
|
|
223
178
|
comment: `Click ${step.dataRef}`,
|
|
224
179
|
};
|
|
225
180
|
},
|
|
226
|
-
priority: 5,
|
|
181
|
+
priority: 5,
|
|
227
182
|
},
|
|
228
183
|
{
|
|
229
184
|
name: 'wait-for-time',
|
|
230
185
|
matcher: (step: ParsedStep) =>
|
|
231
186
|
(step.text.includes('wait for') || step.text.includes('waits for')) && /\d+/.test(step.text),
|
|
232
|
-
|
|
187
|
+
resolver: (step, context) => {
|
|
233
188
|
const match = step.text.match(/(\d+)\s*(seconds?|ms|milliseconds?)/);
|
|
234
189
|
let duration = 1000;
|
|
235
|
-
|
|
190
|
+
|
|
236
191
|
if (match) {
|
|
237
192
|
const num = parseInt(match[1]);
|
|
238
193
|
const unit = match[2].toLowerCase();
|
|
239
194
|
duration = unit.startsWith('s') ? num * 1000 : num;
|
|
240
195
|
}
|
|
241
|
-
|
|
242
|
-
const code = context.templateEngine.renderStep('wait-timeout', { duration });
|
|
243
|
-
|
|
196
|
+
|
|
244
197
|
return {
|
|
245
|
-
|
|
198
|
+
templateName: 'wait-timeout',
|
|
199
|
+
data: { duration },
|
|
246
200
|
comment: `Wait for ${duration}ms`,
|
|
247
201
|
};
|
|
248
202
|
},
|
|
249
203
|
priority: 7,
|
|
250
204
|
},
|
|
251
|
-
// "wait for dialog with {{kudo.title}} hidden" - role keyword inline, no selector brackets, with data filter
|
|
252
205
|
{
|
|
253
206
|
name: 'wait-for-role-with-text',
|
|
254
207
|
matcher: (step: ParsedStep) =>
|
|
@@ -256,7 +209,7 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
256
209
|
!step.selectorRef &&
|
|
257
210
|
!!step.dataRef &&
|
|
258
211
|
!!elementKeywordToRole(step.text),
|
|
259
|
-
|
|
212
|
+
resolver: (step, context) => {
|
|
260
213
|
const role = elementKeywordToRole(step.text)!;
|
|
261
214
|
|
|
262
215
|
let dataValue: string;
|
|
@@ -268,15 +221,14 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
268
221
|
|
|
269
222
|
const state = extractWaitState(step.text);
|
|
270
223
|
|
|
271
|
-
// Render inline — no locator partial needed, role is known directly
|
|
272
224
|
return {
|
|
273
|
-
|
|
225
|
+
templateName: 'wait-for-role-with-data',
|
|
226
|
+
data: { role, dataValue, state },
|
|
274
227
|
comment: `Wait for ${role} with ${step.dataRef} to be ${state}`,
|
|
275
228
|
};
|
|
276
229
|
},
|
|
277
230
|
priority: 11,
|
|
278
231
|
},
|
|
279
|
-
// "wait for dialog hidden" - role keyword inline, no selector brackets, no data filter
|
|
280
232
|
{
|
|
281
233
|
name: 'wait-for-role',
|
|
282
234
|
matcher: (step: ParsedStep) =>
|
|
@@ -284,32 +236,32 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
284
236
|
!step.selectorRef &&
|
|
285
237
|
!step.dataRef &&
|
|
286
238
|
!!elementKeywordToRole(step.text),
|
|
287
|
-
|
|
239
|
+
resolver: (step, context) => {
|
|
288
240
|
const role = elementKeywordToRole(step.text)!;
|
|
289
241
|
const state = extractWaitState(step.text);
|
|
290
242
|
|
|
291
243
|
return {
|
|
292
|
-
|
|
244
|
+
templateName: 'wait-for-role',
|
|
245
|
+
data: { role, state },
|
|
293
246
|
comment: `Wait for ${role} to be ${state}`,
|
|
294
247
|
};
|
|
295
248
|
},
|
|
296
249
|
priority: 11,
|
|
297
250
|
},
|
|
298
|
-
// NEW: Wait for page pattern
|
|
299
251
|
{
|
|
300
252
|
name: 'wait-for-page',
|
|
301
253
|
matcher: (step: ParsedStep) =>
|
|
302
254
|
(step.text.includes('wait for') || step.text.includes('waits for')) && step.elementType === 'page',
|
|
303
|
-
|
|
255
|
+
resolver: (step, context) => {
|
|
304
256
|
const path = step.featurePath || '/';
|
|
305
257
|
const pathRegex = path.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
|
|
306
|
-
const code = context.templateEngine.renderStep('wait-for-page', { pathRegex });
|
|
307
258
|
return {
|
|
308
|
-
|
|
259
|
+
templateName: 'wait-for-page',
|
|
260
|
+
data: { pathRegex },
|
|
309
261
|
comment: `Wait for page`,
|
|
310
262
|
};
|
|
311
263
|
},
|
|
312
|
-
priority: 9,
|
|
264
|
+
priority: 9,
|
|
313
265
|
},
|
|
314
266
|
{
|
|
315
267
|
name: 'wait-for-element-with-text',
|
|
@@ -317,7 +269,7 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
317
269
|
(step.text.includes('wait for') || step.text.includes('waits for')) &&
|
|
318
270
|
!!step.selectorRef &&
|
|
319
271
|
!!step.dataRef,
|
|
320
|
-
|
|
272
|
+
resolver: (step, context) => {
|
|
321
273
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
322
274
|
|
|
323
275
|
let dataValue: string;
|
|
@@ -329,15 +281,9 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
329
281
|
|
|
330
282
|
const state = extractWaitState(step.text);
|
|
331
283
|
|
|
332
|
-
const code = context.templateEngine.renderStep('wait-for-element-with-text', {
|
|
333
|
-
...resolved,
|
|
334
|
-
selectorRef: step.selectorRef,
|
|
335
|
-
dataValue,
|
|
336
|
-
state,
|
|
337
|
-
});
|
|
338
|
-
|
|
339
284
|
return {
|
|
340
|
-
|
|
285
|
+
templateName: 'wait-for-element-with-text',
|
|
286
|
+
data: { ...resolved, selectorRef: step.selectorRef, dataValue, state },
|
|
341
287
|
comment: `Wait for ${step.selectorRef} with ${step.dataRef} to be ${state}`,
|
|
342
288
|
};
|
|
343
289
|
},
|
|
@@ -347,22 +293,16 @@ export const interactionPatterns: StepPattern[] = [
|
|
|
347
293
|
name: 'wait-for-element',
|
|
348
294
|
matcher: (step: ParsedStep) =>
|
|
349
295
|
(step.text.includes('wait for') || step.text.includes('waits for')) && !!step.selectorRef,
|
|
350
|
-
|
|
296
|
+
resolver: (step, context) => {
|
|
351
297
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
352
298
|
const state = extractWaitState(step.text);
|
|
353
299
|
|
|
354
|
-
const code = context.templateEngine.renderStep('wait-for-element', {
|
|
355
|
-
...resolved,
|
|
356
|
-
selectorRef: step.selectorRef,
|
|
357
|
-
state,
|
|
358
|
-
});
|
|
359
|
-
|
|
360
300
|
return {
|
|
361
|
-
|
|
301
|
+
templateName: 'wait-for-element',
|
|
302
|
+
data: { ...resolved, selectorRef: step.selectorRef, state },
|
|
362
303
|
comment: `Wait for ${step.selectorRef} to be ${state}`,
|
|
363
304
|
};
|
|
364
305
|
},
|
|
365
306
|
priority: 8,
|
|
366
307
|
},
|
|
367
308
|
];
|
|
368
|
-
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { ParsedStep } from '../../gherkin-parser';
|
|
2
|
+
import { StepPattern } from './types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Helper to extract screen ID from selector reference.
|
|
6
|
+
*/
|
|
7
|
+
function extractScreenId(selectorRef: string): string {
|
|
8
|
+
const match = selectorRef.match(/\[([\w-]+)\./);
|
|
9
|
+
return match ? match[1] : 'unknown';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Legacy patterns migrated from step-mapper.ts tryLegacyPatterns().
|
|
14
|
+
* These use templates that already exist (login, error-message-assertion, etc.)
|
|
15
|
+
*/
|
|
16
|
+
export const legacyPatterns: StepPattern[] = [
|
|
17
|
+
{
|
|
18
|
+
name: 'legacy-login',
|
|
19
|
+
matcher: (step: ParsedStep) =>
|
|
20
|
+
step.text.includes('user is logged in as') && !!step.dataRef,
|
|
21
|
+
resolver: (step, context) => {
|
|
22
|
+
const varName = step.dataRef!.replace(/[^a-zA-Z0-9]/g, '_') + '_' + context.stepCounter;
|
|
23
|
+
return {
|
|
24
|
+
templateName: 'login',
|
|
25
|
+
data: { varName, dataRef: step.dataRef },
|
|
26
|
+
comment: `Login as ${step.dataRef}`,
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
priority: 9,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'legacy-error-message',
|
|
33
|
+
matcher: (step: ParsedStep) =>
|
|
34
|
+
step.text.includes('error message') && step.text.includes('should'),
|
|
35
|
+
resolver: (step, context) => ({
|
|
36
|
+
templateName: 'error-message-assertion',
|
|
37
|
+
data: {},
|
|
38
|
+
comment: 'Assert error message is displayed',
|
|
39
|
+
}),
|
|
40
|
+
priority: 6,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'legacy-generic-message',
|
|
44
|
+
matcher: (step: ParsedStep) =>
|
|
45
|
+
step.text.includes('message') && step.text.includes('should be displayed'),
|
|
46
|
+
resolver: (step, context) => {
|
|
47
|
+
const messageType = step.text.includes('welcome') ? 'welcome' :
|
|
48
|
+
step.text.includes('success') ? 'success' : 'message';
|
|
49
|
+
return {
|
|
50
|
+
templateName: 'generic-message-assertion',
|
|
51
|
+
data: { messageType },
|
|
52
|
+
comment: `Assert ${messageType} message is displayed`,
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
priority: 6,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'legacy-message-with-value',
|
|
59
|
+
matcher: (step: ParsedStep) =>
|
|
60
|
+
step.text.includes('should see message') && !!step.value,
|
|
61
|
+
resolver: (step, context) => {
|
|
62
|
+
const varName = (step.selectorRef || 'message').replace(/[^a-zA-Z0-9]/g, '_') + '_' + context.stepCounter;
|
|
63
|
+
return {
|
|
64
|
+
templateName: 'message-assertion-body',
|
|
65
|
+
data: { varName, value: step.value, selectorRef: step.selectorRef },
|
|
66
|
+
comment: `Assert message: ${step.value}`,
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
priority: 6,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'legacy-ai-response',
|
|
73
|
+
matcher: (step: ParsedStep) =>
|
|
74
|
+
step.text.includes('user should see') && step.text.includes('AI response') && !!step.selectorRef,
|
|
75
|
+
resolver: (step, context) => {
|
|
76
|
+
const screenId = extractScreenId(step.selectorRef!);
|
|
77
|
+
const varName = step.selectorRef!.replace(/[^a-zA-Z0-9]/g, '_') + '_' + context.stepCounter;
|
|
78
|
+
return {
|
|
79
|
+
templateName: 'ai-response-assertion-selector',
|
|
80
|
+
data: { varName, selectorRef: step.selectorRef, screenId },
|
|
81
|
+
comment: `Assert AI response in ${step.selectorRef}`,
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
priority: 6,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'legacy-message-count',
|
|
88
|
+
matcher: (step: ParsedStep) =>
|
|
89
|
+
(step.text.includes('messages in') || (step.text.includes('should contain') && step.text.includes('messages'))) &&
|
|
90
|
+
!!step.selectorRef,
|
|
91
|
+
resolver: (step, context) => {
|
|
92
|
+
const match = step.text.match(/(\d+)\s+messages?/);
|
|
93
|
+
const expectedCount = match ? parseInt(match[1]) : 1;
|
|
94
|
+
const screenId = extractScreenId(step.selectorRef!);
|
|
95
|
+
const varName = step.selectorRef!.replace(/[^a-zA-Z0-9]/g, '_') + '_' + context.stepCounter;
|
|
96
|
+
return {
|
|
97
|
+
templateName: 'message-count-assertion',
|
|
98
|
+
data: { varName, selectorRef: step.selectorRef, screenId, expectedCount },
|
|
99
|
+
comment: `Assert ${expectedCount} messages in ${step.selectorRef}`,
|
|
100
|
+
};
|
|
101
|
+
},
|
|
102
|
+
priority: 6,
|
|
103
|
+
},
|
|
104
|
+
];
|
|
@@ -4,82 +4,58 @@ import { inferPath, resolvePathVariables, getPathCode } from '../utils/path-infe
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Navigation patterns: goto, navigate, open page
|
|
7
|
-
* Uses baseURL from config (optional) + path from feature metadata
|
|
8
|
-
* Templates handle URL construction
|
|
9
7
|
*/
|
|
10
8
|
export const navigationPatterns: StepPattern[] = [
|
|
11
|
-
// Open page type pattern (open [home] page) - resolve selector value or use feature path
|
|
12
9
|
{
|
|
13
10
|
name: 'open-page-type',
|
|
14
11
|
matcher: (step: ParsedStep) =>
|
|
15
12
|
(step.text.includes('open') || step.text.includes('opens') || step.text.includes('is on')) &&
|
|
16
13
|
step.elementType === 'page',
|
|
17
|
-
|
|
14
|
+
resolver: (step, context) => {
|
|
18
15
|
let path = context.featurePath || '/';
|
|
19
|
-
|
|
20
|
-
// If selector is present, extract path from selector's value attribute
|
|
16
|
+
|
|
21
17
|
if (step.selectorRef) {
|
|
22
18
|
try {
|
|
23
19
|
const resolved = context.selectorResolver.resolveSelector(
|
|
24
|
-
step.selectorRef,
|
|
25
|
-
context.featureName,
|
|
26
|
-
step.elementType,
|
|
27
|
-
step.nth
|
|
20
|
+
step.selectorRef, context.featureName, step.elementType, step.nth
|
|
28
21
|
);
|
|
29
|
-
// Use selector's value as the path for navigation
|
|
30
22
|
path = resolved.value || path;
|
|
31
23
|
} catch (error) {
|
|
32
|
-
// Fallback to feature path if selector not found
|
|
33
24
|
path = context.featurePath || '/';
|
|
34
25
|
}
|
|
35
26
|
}
|
|
36
|
-
|
|
37
|
-
// Resolve path variables if present
|
|
27
|
+
|
|
38
28
|
const finalPath = resolvePathVariables(path, context.scenarioSteps || []);
|
|
39
|
-
|
|
40
|
-
const code = context.templateEngine.renderStep('navigation', {
|
|
41
|
-
baseURL: context.baseURL,
|
|
42
|
-
path: finalPath,
|
|
43
|
-
});
|
|
44
|
-
|
|
29
|
+
|
|
45
30
|
return {
|
|
46
|
-
|
|
31
|
+
templateName: 'navigation',
|
|
32
|
+
data: { baseURL: context.baseURL, path: finalPath },
|
|
47
33
|
comment: step.selectorRef ? `Open ${step.selectorRef} page` : `Navigate to page`,
|
|
48
34
|
};
|
|
49
35
|
},
|
|
50
|
-
priority: 16,
|
|
36
|
+
priority: 16,
|
|
51
37
|
},
|
|
52
38
|
{
|
|
53
39
|
name: 'open-page',
|
|
54
40
|
matcher: (step: ParsedStep) =>
|
|
55
41
|
(step.text.includes('open') || step.text.includes('opens')) &&
|
|
56
42
|
step.text.includes('page') &&
|
|
57
|
-
step.elementType !== 'page',
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const pageMatch = step.text.match(/open[s]?\s+\[([^\]]+)\]/i) ||
|
|
43
|
+
step.elementType !== 'page',
|
|
44
|
+
resolver: (step, context) => {
|
|
45
|
+
const pageMatch = step.text.match(/open[s]?\s+\[([^\]]+)\]/i) ||
|
|
61
46
|
step.text.match(/open[s]?\s+"([^"]+)"/i);
|
|
62
47
|
const pageName = pageMatch ? pageMatch[1] : 'page';
|
|
63
|
-
|
|
64
|
-
// Infer path with smart defaults
|
|
48
|
+
|
|
65
49
|
const inferredPath = inferPath(context.featurePath, {
|
|
66
50
|
featureName: context.featureName,
|
|
67
51
|
screenName: context.screenName,
|
|
68
52
|
});
|
|
69
|
-
|
|
70
|
-
// Resolve path variables if present (e.g., /user/:id)
|
|
71
53
|
const resolvedPath = resolvePathVariables(inferredPath, context.scenarioSteps || []);
|
|
72
|
-
|
|
73
|
-
// Get path code (template literal or string)
|
|
74
54
|
const pathCode = getPathCode(resolvedPath);
|
|
75
|
-
|
|
76
|
-
const code = context.templateEngine.renderStep('navigation', {
|
|
77
|
-
baseURL: context.baseURL, // null or URL from config
|
|
78
|
-
path: pathCode.replace(/^['`]|['`]$/g, ''), // Remove quotes for template
|
|
79
|
-
});
|
|
80
|
-
|
|
55
|
+
|
|
81
56
|
return {
|
|
82
|
-
|
|
57
|
+
templateName: 'navigation',
|
|
58
|
+
data: { baseURL: context.baseURL, path: pathCode.replace(/^['`]|['`]$/g, '') },
|
|
83
59
|
comment: `Open ${pageName}`,
|
|
84
60
|
};
|
|
85
61
|
},
|
|
@@ -87,31 +63,22 @@ export const navigationPatterns: StepPattern[] = [
|
|
|
87
63
|
},
|
|
88
64
|
{
|
|
89
65
|
name: 'navigate-to-route',
|
|
90
|
-
matcher: (step: ParsedStep) =>
|
|
91
|
-
(step.text.includes('navigates to') || step.text.includes('is on')) &&
|
|
66
|
+
matcher: (step: ParsedStep) =>
|
|
67
|
+
(step.text.includes('navigates to') || step.text.includes('is on')) &&
|
|
92
68
|
!!(step.selectorRef || step.dataRef),
|
|
93
|
-
|
|
69
|
+
resolver: (step, context) => {
|
|
94
70
|
const route = step.selectorRef || step.dataRef;
|
|
95
|
-
|
|
96
|
-
// Infer path with smart defaults
|
|
71
|
+
|
|
97
72
|
const inferredPath = inferPath(context.featurePath, {
|
|
98
73
|
featureName: context.featureName,
|
|
99
74
|
screenName: context.screenName,
|
|
100
75
|
});
|
|
101
|
-
|
|
102
|
-
// Resolve path variables if present
|
|
103
76
|
const resolvedPath = resolvePathVariables(inferredPath, context.scenarioSteps || []);
|
|
104
|
-
|
|
105
|
-
// Get path code
|
|
106
77
|
const pathCode = getPathCode(resolvedPath);
|
|
107
|
-
|
|
108
|
-
const code = context.templateEngine.renderStep('navigation', {
|
|
109
|
-
baseURL: context.baseURL, // null or URL from config
|
|
110
|
-
path: pathCode.replace(/^['`]|['`]$/g, ''),
|
|
111
|
-
});
|
|
112
|
-
|
|
78
|
+
|
|
113
79
|
return {
|
|
114
|
-
|
|
80
|
+
templateName: 'navigation',
|
|
81
|
+
data: { baseURL: context.baseURL, path: pathCode.replace(/^['`]|['`]$/g, '') },
|
|
115
82
|
comment: `Navigate to ${route}`,
|
|
116
83
|
};
|
|
117
84
|
},
|
|
@@ -122,31 +89,22 @@ export const navigationPatterns: StepPattern[] = [
|
|
|
122
89
|
matcher: (step: ParsedStep) =>
|
|
123
90
|
(step.text.includes('should see route') || step.text.includes('should remain on')) &&
|
|
124
91
|
!!(step.selectorRef || step.dataRef),
|
|
125
|
-
|
|
92
|
+
resolver: (step, context) => {
|
|
126
93
|
const route = step.selectorRef || step.dataRef;
|
|
127
|
-
|
|
128
|
-
// Infer path with smart defaults
|
|
94
|
+
|
|
129
95
|
const inferredPath = inferPath(context.featurePath, {
|
|
130
96
|
featureName: context.featureName,
|
|
131
97
|
screenName: context.screenName,
|
|
132
98
|
});
|
|
133
|
-
|
|
134
|
-
// Resolve path variables if present
|
|
135
99
|
const resolvedPath = resolvePathVariables(inferredPath, context.scenarioSteps || []);
|
|
136
|
-
|
|
137
|
-
// Get path code
|
|
138
100
|
const pathCode = getPathCode(resolvedPath);
|
|
139
|
-
|
|
140
|
-
const code = context.templateEngine.renderStep('route-assertion', {
|
|
141
|
-
path: pathCode.replace(/^['`]|['`]$/g, ''),
|
|
142
|
-
});
|
|
143
|
-
|
|
101
|
+
|
|
144
102
|
return {
|
|
145
|
-
|
|
103
|
+
templateName: 'route-assertion',
|
|
104
|
+
data: { path: pathCode.replace(/^['`]|['`]$/g, '') },
|
|
146
105
|
comment: `Assert current route is ${route}`,
|
|
147
106
|
};
|
|
148
107
|
},
|
|
149
108
|
priority: 10,
|
|
150
109
|
},
|
|
151
110
|
];
|
|
152
|
-
|