@sun-asterisk/sungen 1.0.24 → 2.0.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 +198 -74
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +5 -3
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +110 -35
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +5 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/dist/generators/test-generator/code-generator.d.ts +0 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +10 -47
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +2 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +4 -1
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +17 -5
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js +47 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js +36 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js +25 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.js +192 -0
- package/dist/generators/test-generator/patterns/table-patterns.js.map +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts +5 -3
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +38 -27
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +4 -1
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/types.d.ts +7 -24
- package/dist/generators/test-generator/types.d.ts.map +1 -1
- package/dist/generators/test-generator/types.js +2 -101
- package/dist/generators/test-generator/types.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +14 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +37 -11
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +12 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +72 -160
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts +1 -32
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +55 -216
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-rules.md +189 -0
- package/dist/orchestrator/templates/gitignore +16 -0
- package/dist/orchestrator/templates/playwright.config.d.ts +10 -0
- package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -0
- package/dist/orchestrator/templates/playwright.config.js +77 -0
- package/dist/orchestrator/templates/playwright.config.js.map +1 -0
- package/dist/orchestrator/templates/playwright.config.ts +80 -0
- package/dist/orchestrator/templates/readme.md +197 -0
- package/dist/utils/selector-types.d.ts +1 -1
- package/dist/utils/selector-types.d.ts.map +1 -1
- package/dist/utils/selector-types.js +3 -0
- package/dist/utils/selector-types.js.map +1 -1
- package/docs/gherkin standards/gherkin-core-standard.md +377 -0
- package/docs/gherkin standards/gherkin-core-standard.vi.md +303 -0
- package/docs/gherkin-dictionary.md +1071 -0
- package/docs/makeauth.md +225 -0
- package/package.json +4 -3
- package/src/cli/commands/add.ts +5 -3
- package/src/cli/commands/generate.ts +90 -38
- package/src/cli/index.ts +5 -16
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/src/generators/test-generator/code-generator.ts +11 -59
- package/src/generators/test-generator/patterns/assertion-patterns.ts +2 -0
- package/src/generators/test-generator/patterns/index.ts +12 -3
- package/src/generators/test-generator/patterns/interaction-patterns.ts +1 -1
- package/src/generators/test-generator/patterns/keyboard-patterns.ts +51 -0
- package/src/generators/test-generator/patterns/scope-patterns.ts +40 -0
- package/src/generators/test-generator/patterns/scroll-patterns.ts +27 -0
- package/src/generators/test-generator/patterns/table-patterns.ts +232 -0
- package/src/generators/test-generator/step-mapper.ts +42 -27
- package/src/generators/test-generator/template-engine.ts +3 -1
- package/src/generators/test-generator/types.ts +7 -112
- package/src/generators/test-generator/utils/selector-resolver.ts +70 -25
- package/src/orchestrator/project-initializer.ts +75 -160
- package/src/orchestrator/screen-manager.ts +61 -233
- package/src/orchestrator/templates/ai-rules.md +189 -0
- package/src/orchestrator/templates/gitignore +16 -0
- package/src/orchestrator/templates/playwright.config.ts +80 -0
- package/src/orchestrator/templates/readme.md +197 -0
- package/src/utils/selector-types.ts +3 -0
- package/dist/cli/commands/cache-clear.d.ts +0 -3
- package/dist/cli/commands/cache-clear.d.ts.map +0 -1
- package/dist/cli/commands/cache-clear.js +0 -24
- package/dist/cli/commands/cache-clear.js.map +0 -1
- package/dist/cli/commands/full.d.ts +0 -3
- package/dist/cli/commands/full.d.ts.map +0 -1
- package/dist/cli/commands/full.js +0 -37
- package/dist/cli/commands/full.js.map +0 -1
- package/dist/cli/commands/live-scan.d.ts +0 -3
- package/dist/cli/commands/live-scan.d.ts.map +0 -1
- package/dist/cli/commands/live-scan.js +0 -78
- package/dist/cli/commands/live-scan.js.map +0 -1
- package/dist/cli/commands/map.d.ts +0 -3
- package/dist/cli/commands/map.d.ts.map +0 -1
- package/dist/cli/commands/map.js +0 -93
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -3
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -43
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/utils.d.ts +0 -6
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js +0 -101
- package/dist/cli/utils.js.map +0 -1
- package/dist/config/config-loader.d.ts +0 -51
- package/dist/config/config-loader.d.ts.map +0 -1
- package/dist/config/config-loader.js +0 -216
- package/dist/config/config-loader.js.map +0 -1
- package/dist/config/config-schema.d.ts +0 -121
- package/dist/config/config-schema.d.ts.map +0 -1
- package/dist/config/config-schema.js +0 -7
- package/dist/config/config-schema.js.map +0 -1
- package/dist/core/live-scanner/config-reader.d.ts +0 -10
- package/dist/core/live-scanner/config-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/config-reader.js +0 -87
- package/dist/core/live-scanner/config-reader.js.map +0 -1
- package/dist/core/live-scanner/element-finder.d.ts +0 -20
- package/dist/core/live-scanner/element-finder.d.ts.map +0 -1
- package/dist/core/live-scanner/element-finder.js +0 -481
- package/dist/core/live-scanner/element-finder.js.map +0 -1
- package/dist/core/live-scanner/index.d.ts +0 -8
- package/dist/core/live-scanner/index.d.ts.map +0 -1
- package/dist/core/live-scanner/index.js +0 -33
- package/dist/core/live-scanner/index.js.map +0 -1
- package/dist/core/live-scanner/matrix-reader.d.ts +0 -17
- package/dist/core/live-scanner/matrix-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-reader.js +0 -60
- package/dist/core/live-scanner/matrix-reader.js.map +0 -1
- package/dist/core/live-scanner/matrix-writer.d.ts +0 -7
- package/dist/core/live-scanner/matrix-writer.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-writer.js +0 -103
- package/dist/core/live-scanner/matrix-writer.js.map +0 -1
- package/dist/core/live-scanner/role-fallback.d.ts +0 -15
- package/dist/core/live-scanner/role-fallback.d.ts.map +0 -1
- package/dist/core/live-scanner/role-fallback.js +0 -46
- package/dist/core/live-scanner/role-fallback.js.map +0 -1
- package/dist/core/live-scanner/scanner.d.ts +0 -22
- package/dist/core/live-scanner/scanner.d.ts.map +0 -1
- package/dist/core/live-scanner/scanner.js +0 -303
- package/dist/core/live-scanner/scanner.js.map +0 -1
- package/dist/core/live-scanner/step-replayer.d.ts +0 -26
- package/dist/core/live-scanner/step-replayer.d.ts.map +0 -1
- package/dist/core/live-scanner/step-replayer.js +0 -473
- package/dist/core/live-scanner/step-replayer.js.map +0 -1
- package/dist/core/live-scanner/types.d.ts +0 -52
- package/dist/core/live-scanner/types.d.ts.map +0 -1
- package/dist/core/live-scanner/types.js +0 -14
- package/dist/core/live-scanner/types.js.map +0 -1
- package/dist/core/selector-base/annotation-handler.d.ts +0 -45
- package/dist/core/selector-base/annotation-handler.d.ts.map +0 -1
- package/dist/core/selector-base/annotation-handler.js +0 -102
- package/dist/core/selector-base/annotation-handler.js.map +0 -1
- package/dist/core/selector-base/base-generator.d.ts +0 -49
- package/dist/core/selector-base/base-generator.d.ts.map +0 -1
- package/dist/core/selector-base/base-generator.js +0 -214
- package/dist/core/selector-base/base-generator.js.map +0 -1
- package/dist/core/selector-base/gherkin-parser.d.ts +0 -24
- package/dist/core/selector-base/gherkin-parser.d.ts.map +0 -1
- package/dist/core/selector-base/gherkin-parser.js +0 -42
- package/dist/core/selector-base/gherkin-parser.js.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.d.ts +0 -74
- package/dist/core/selector-mapper/priority-mapper.d.ts.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.js +0 -477
- package/dist/core/selector-mapper/priority-mapper.js.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +0 -91
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.js +0 -175
- package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +0 -1
- package/dist/core/ui-scanner/react-scanner.d.ts +0 -32
- package/dist/core/ui-scanner/react-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/react-scanner.js +0 -163
- package/dist/core/ui-scanner/react-scanner.js.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.d.ts +0 -94
- package/dist/core/ui-scanner/scanner-interface.d.ts.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.js +0 -33
- package/dist/core/ui-scanner/scanner-interface.js.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.d.ts +0 -81
- package/dist/core/ui-scanner/strict-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.js +0 -511
- package/dist/core/ui-scanner/strict-scanner.js.map +0 -1
- package/dist/core/validator/data-validator.d.ts +0 -38
- package/dist/core/validator/data-validator.d.ts.map +0 -1
- package/dist/core/validator/data-validator.js +0 -212
- package/dist/core/validator/data-validator.js.map +0 -1
- package/dist/core/validator/feature-validator.d.ts +0 -27
- package/dist/core/validator/feature-validator.d.ts.map +0 -1
- package/dist/core/validator/feature-validator.js +0 -182
- package/dist/core/validator/feature-validator.js.map +0 -1
- package/dist/core/validator/index.d.ts +0 -46
- package/dist/core/validator/index.d.ts.map +0 -1
- package/dist/core/validator/index.js +0 -17
- package/dist/core/validator/index.js.map +0 -1
- package/dist/core/validator/screen-validator.d.ts +0 -35
- package/dist/core/validator/screen-validator.d.ts.map +0 -1
- package/dist/core/validator/screen-validator.js +0 -195
- package/dist/core/validator/screen-validator.js.map +0 -1
- package/dist/core/validator/selector-validator.d.ts +0 -36
- package/dist/core/validator/selector-validator.d.ts.map +0 -1
- package/dist/core/validator/selector-validator.js +0 -210
- package/dist/core/validator/selector-validator.js.map +0 -1
- package/dist/external/ai-provider.d.ts +0 -60
- package/dist/external/ai-provider.d.ts.map +0 -1
- package/dist/external/ai-provider.js +0 -30
- package/dist/external/ai-provider.js.map +0 -1
- package/dist/external/anthropic-provider.d.ts +0 -29
- package/dist/external/anthropic-provider.d.ts.map +0 -1
- package/dist/external/anthropic-provider.js +0 -85
- package/dist/external/anthropic-provider.js.map +0 -1
- package/dist/generators/cache/cache-manager.d.ts +0 -66
- package/dist/generators/cache/cache-manager.d.ts.map +0 -1
- package/dist/generators/cache/cache-manager.js +0 -286
- package/dist/generators/cache/cache-manager.js.map +0 -1
- package/dist/generators/dsl-writer/index.d.ts +0 -33
- package/dist/generators/dsl-writer/index.d.ts.map +0 -1
- package/dist/generators/dsl-writer/index.js +0 -226
- package/dist/generators/dsl-writer/index.js.map +0 -1
- package/dist/generators/scaffold-generator/index.d.ts +0 -162
- package/dist/generators/scaffold-generator/index.d.ts.map +0 -1
- package/dist/generators/scaffold-generator/index.js +0 -877
- package/dist/generators/scaffold-generator/index.js.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.d.ts +0 -56
- package/dist/generators/selector-mapper/ai-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.js +0 -457
- package/dist/generators/selector-mapper/ai-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts +0 -67
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.js +0 -349
- package/dist/generators/selector-mapper/hybrid-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/index.d.ts +0 -8
- package/dist/generators/selector-mapper/index.d.ts.map +0 -1
- package/dist/generators/selector-mapper/index.js +0 -12
- package/dist/generators/selector-mapper/index.js.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts +0 -125
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.js +0 -391
- package/dist/generators/selector-mapper/intelligent-mapper.js.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.d.ts +0 -27
- package/dist/generators/test-generator/ai-step-mapper.d.ts.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.js +0 -204
- package/dist/generators/test-generator/ai-step-mapper.js.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.d.ts +0 -18
- package/dist/generators/test-generator/auth-setup-generator.d.ts.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.js +0 -82
- package/dist/generators/test-generator/auth-setup-generator.js.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.js +0 -98
- package/dist/generators/test-generator/patterns/legacy-patterns.js.map +0 -1
- package/dist/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/dist/generators/ui-model-builder/deep-scanner.d.ts +0 -121
- package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/deep-scanner.js +0 -1113
- package/dist/generators/ui-model-builder/deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +0 -110
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +0 -608
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.d.ts +0 -107
- package/dist/generators/ui-model-builder/react-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.js +0 -797
- package/dist/generators/ui-model-builder/react-scanner.js.map +0 -1
- package/dist/orchestrator/cache-manager.d.ts +0 -15
- package/dist/orchestrator/cache-manager.d.ts.map +0 -1
- package/dist/orchestrator/cache-manager.js +0 -62
- package/dist/orchestrator/cache-manager.js.map +0 -1
- package/dist/orchestrator/pipeline.d.ts +0 -56
- package/dist/orchestrator/pipeline.d.ts.map +0 -1
- package/dist/orchestrator/pipeline.js +0 -298
- package/dist/orchestrator/pipeline.js.map +0 -1
- package/dist/orchestrator/reporter.d.ts +0 -15
- package/dist/orchestrator/reporter.d.ts.map +0 -1
- package/dist/orchestrator/reporter.js +0 -30
- package/dist/orchestrator/reporter.js.map +0 -1
- package/src/cli/commands/cache-clear.ts +0 -22
- package/src/cli/commands/full.ts +0 -35
- package/src/cli/commands/live-scan.ts +0 -82
- package/src/cli/commands/map.ts +0 -97
- package/src/cli/commands/validate.ts +0 -43
- package/src/cli/utils.ts +0 -106
- package/src/config/ai-providers.yaml +0 -56
- package/src/config/config-loader.ts +0 -248
- package/src/config/config-schema.ts +0 -148
- package/src/config/default.config.yaml +0 -107
- package/src/config/framework.config.yaml +0 -52
- package/src/config/routes.yaml +0 -31
- package/src/core/live-scanner/config-reader.ts +0 -57
- package/src/core/live-scanner/element-finder.ts +0 -534
- package/src/core/live-scanner/index.ts +0 -7
- package/src/core/live-scanner/matrix-reader.ts +0 -65
- package/src/core/live-scanner/matrix-writer.ts +0 -77
- package/src/core/live-scanner/role-fallback.ts +0 -44
- package/src/core/live-scanner/scanner.ts +0 -321
- package/src/core/live-scanner/step-replayer.ts +0 -503
- package/src/core/live-scanner/types.ts +0 -58
- package/src/core/selector-base/annotation-handler.ts +0 -127
- package/src/core/selector-base/base-generator.ts +0 -234
- package/src/core/selector-base/gherkin-parser.ts +0 -57
- package/src/core/selector-mapper/priority-mapper.ts +0 -607
- package/src/core/ui-scanner/heuristics/base-heuristic.ts +0 -216
- package/src/core/ui-scanner/react-scanner.ts +0 -156
- package/src/core/ui-scanner/scanner-interface.ts +0 -133
- package/src/core/ui-scanner/strict-scanner.ts +0 -629
- package/src/core/validator/data-validator.ts +0 -202
- package/src/core/validator/feature-validator.ts +0 -176
- package/src/core/validator/index.ts +0 -57
- package/src/core/validator/screen-validator.ts +0 -209
- package/src/core/validator/selector-validator.ts +0 -209
- package/src/external/ai-provider.ts +0 -90
- package/src/external/anthropic-provider.ts +0 -114
- package/src/generators/README.md +0 -410
- package/src/generators/cache/cache-manager.ts +0 -322
- package/src/generators/dsl-writer/index.ts +0 -253
- package/src/generators/scaffold-generator/index.ts +0 -1029
- package/src/generators/selector-mapper/ai-mapper.ts +0 -528
- package/src/generators/selector-mapper/hybrid-mapper.ts +0 -427
- package/src/generators/selector-mapper/index.ts +0 -10
- package/src/generators/selector-mapper/intelligent-mapper.ts +0 -530
- package/src/generators/test-generator/ai-step-mapper.ts +0 -224
- package/src/generators/test-generator/auth-setup-generator.ts +0 -59
- package/src/generators/test-generator/patterns/legacy-patterns.ts +0 -104
- package/src/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/src/generators/ui-model-builder/deep-scanner.ts +0 -1244
- package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +0 -731
- package/src/generators/ui-model-builder/react-scanner.ts +0 -959
- package/src/orchestrator/cache-manager.ts +0 -32
- package/src/orchestrator/pipeline.ts +0 -354
- package/src/orchestrator/reporter.ts +0 -36
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI-Based Step Mapper
|
|
3
|
-
* Fallback for dictionary when Gherkin patterns are ambiguous or unknown
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
7
|
-
import { ParsedStep } from '../gherkin-parser';
|
|
8
|
-
import { MappedStep } from './step-mapper';
|
|
9
|
-
|
|
10
|
-
export class AIStepMapper {
|
|
11
|
-
private client: Anthropic;
|
|
12
|
-
private verbose: boolean;
|
|
13
|
-
|
|
14
|
-
constructor(verbose: boolean = false) {
|
|
15
|
-
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
16
|
-
if (!apiKey) {
|
|
17
|
-
throw new Error('ANTHROPIC_API_KEY environment variable is required for AI step mapping');
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
this.client = new Anthropic({ apiKey });
|
|
21
|
-
this.verbose = verbose;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Map a Gherkin step to Playwright code using AI
|
|
26
|
-
* Provides rich context to help AI understand the intent
|
|
27
|
-
*/
|
|
28
|
-
async mapStep(step: ParsedStep): Promise<MappedStep> {
|
|
29
|
-
if (this.verbose) {
|
|
30
|
-
console.log(` [AI] Mapping step: "${step.text}"`);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const prompt = this.buildPrompt(step);
|
|
34
|
-
|
|
35
|
-
try {
|
|
36
|
-
const message = await this.client.messages.create({
|
|
37
|
-
model: 'claude-3-5-haiku-20241022', // Fast & cheap for code generation
|
|
38
|
-
max_tokens: 500,
|
|
39
|
-
temperature: 0, // Deterministic for code generation
|
|
40
|
-
messages: [{
|
|
41
|
-
role: 'user',
|
|
42
|
-
content: prompt
|
|
43
|
-
}]
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
const content = message.content[0];
|
|
47
|
-
if (content.type !== 'text') {
|
|
48
|
-
throw new Error('Unexpected response type from AI');
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const code = this.extractCode(content.text);
|
|
52
|
-
|
|
53
|
-
if (this.verbose) {
|
|
54
|
-
console.log(` [AI] Generated code (${code.split('\n').length} lines)`);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return {
|
|
58
|
-
code,
|
|
59
|
-
comment: `AI-generated from: ${step.text}`
|
|
60
|
-
};
|
|
61
|
-
} catch (error) {
|
|
62
|
-
console.error(`[AI] Failed to map step: ${error}`);
|
|
63
|
-
|
|
64
|
-
// Fallback to TODO comment
|
|
65
|
-
return {
|
|
66
|
-
code: `// TODO: AI mapping failed - implement manually: ${step.text}`,
|
|
67
|
-
comment: `AI mapping error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Build context-rich prompt for AI
|
|
74
|
-
* Includes examples, patterns, and clear instructions
|
|
75
|
-
*/
|
|
76
|
-
private buildPrompt(step: ParsedStep): string {
|
|
77
|
-
const { keyword, text, selectorRef, dataRef, value } = step;
|
|
78
|
-
|
|
79
|
-
return `You are an expert Playwright test code generator.
|
|
80
|
-
|
|
81
|
-
**Task**: Convert this Gherkin step into Playwright TypeScript code.
|
|
82
|
-
|
|
83
|
-
**Gherkin Step**:
|
|
84
|
-
${keyword} ${text}
|
|
85
|
-
|
|
86
|
-
**Parsed Information**:
|
|
87
|
-
- Element ID: ${selectorRef || 'N/A'}
|
|
88
|
-
- Data Reference: ${dataRef || 'N/A'}
|
|
89
|
-
- Value: ${value || 'N/A'}
|
|
90
|
-
|
|
91
|
-
**Context**:
|
|
92
|
-
- We use a custom selector helper: \`pw.fill(elementId, value, screenId)\`
|
|
93
|
-
- Element IDs are in format: [screen.element-name]
|
|
94
|
-
- Screen ID is extracted from element ID (e.g., "chat" from "[chat.input]")
|
|
95
|
-
- For assertions, use: \`await pw.getElement(elementId, screenId)\` then \`expect(element)...\`
|
|
96
|
-
|
|
97
|
-
**Common Patterns & Examples**:
|
|
98
|
-
|
|
99
|
-
1. **Fill/Input Actions**:
|
|
100
|
-
- "user fills/inputs/enters [element] with value"
|
|
101
|
-
- "user types value in/into [element]"
|
|
102
|
-
→ \`await pw.fill('[element]', 'value', 'screen');\`
|
|
103
|
-
|
|
104
|
-
2. **Click Actions**:
|
|
105
|
-
- "user clicks/taps/presses [element]"
|
|
106
|
-
- "user clicks on [element]"
|
|
107
|
-
→ \`await pw.click('[element]', 'screen');\`
|
|
108
|
-
|
|
109
|
-
3. **Keyboard Actions**:
|
|
110
|
-
- "user presses Enter in [element]"
|
|
111
|
-
- "user hits Tab key in [element]"
|
|
112
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n await el.press('Enter');\`
|
|
113
|
-
|
|
114
|
-
4. **Visibility Assertions**:
|
|
115
|
-
- "user should see [element]"
|
|
116
|
-
- "[element] is/should be visible"
|
|
117
|
-
- "[element] appears/shows"
|
|
118
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n await expect(el).toBeVisible();\`
|
|
119
|
-
|
|
120
|
-
5. **State Assertions**:
|
|
121
|
-
- "[element] should be disabled/enabled"
|
|
122
|
-
- "[element] is checked/unchecked"
|
|
123
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n await expect(el).toBeDisabled();\`
|
|
124
|
-
|
|
125
|
-
6. **Text Content Assertions**:
|
|
126
|
-
- "[element] should contain text \\"value\\""
|
|
127
|
-
- "[element] has/displays text \\"value\\""
|
|
128
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n await expect(el).toContainText('value');\`
|
|
129
|
-
|
|
130
|
-
7. **Collection State**:
|
|
131
|
-
- "[element] should be empty"
|
|
132
|
-
- "[element] has no items"
|
|
133
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n const items = await el.locator('> *').all();\n expect(items.length).toBe(0);\`
|
|
134
|
-
|
|
135
|
-
8. **Scroll State**:
|
|
136
|
-
- "[element] should be scrolled to bottom"
|
|
137
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n const scrollHeight = await el.evaluate(el => el.scrollHeight);\n const scrollTop = await el.evaluate(el => el.scrollTop);\n const clientHeight = await el.evaluate(el => el.clientHeight);\n expect(scrollTop + clientHeight).toBeGreaterThanOrEqual(scrollHeight - 10);\`
|
|
138
|
-
|
|
139
|
-
**Important Rules**:
|
|
140
|
-
1. Extract screen ID from element ID: "[chat.input]" → screen="chat"
|
|
141
|
-
2. Use proper TypeScript syntax with await
|
|
142
|
-
3. Use descriptive variable names (element, el, container, etc.)
|
|
143
|
-
4. Add helpful comments for complex assertions
|
|
144
|
-
5. NEVER use page.evaluate() unless absolutely necessary
|
|
145
|
-
6. NEVER generate partial or incomplete statements
|
|
146
|
-
7. Each step should generate COMPLETE, SELF-CONTAINED code
|
|
147
|
-
8. If you can't map the step, return a comment: // TODO: Implement step
|
|
148
|
-
|
|
149
|
-
**Output Format**:
|
|
150
|
-
Return ONLY complete Playwright TypeScript statements, no explanations, no markdown blocks.
|
|
151
|
-
Each statement must be syntactically complete and can be inserted directly into a test function.
|
|
152
|
-
|
|
153
|
-
**Example Output**:
|
|
154
|
-
const chat_input_123 = await pw.getElement('[chat.input]', 'chat');
|
|
155
|
-
await expect(chat_input_123).toBeVisible();
|
|
156
|
-
|
|
157
|
-
Now generate code for the given step.`;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Extract clean code from AI response
|
|
162
|
-
* Remove markdown code blocks, explanations, etc.
|
|
163
|
-
*/
|
|
164
|
-
private extractCode(response: string): string {
|
|
165
|
-
let code = response.trim();
|
|
166
|
-
|
|
167
|
-
// Remove markdown code blocks
|
|
168
|
-
code = code.replace(/```(?:typescript|ts|javascript|js)?\n?/g, '');
|
|
169
|
-
code = code.replace(/```\n?/g, '');
|
|
170
|
-
|
|
171
|
-
// Remove leading/trailing whitespace
|
|
172
|
-
code = code.trim();
|
|
173
|
-
|
|
174
|
-
// If response contains explanations, try to extract only code
|
|
175
|
-
const lines = code.split('\n');
|
|
176
|
-
const codeLines = lines.filter(line => {
|
|
177
|
-
const trimmed = line.trim();
|
|
178
|
-
|
|
179
|
-
// Skip lines that are clearly explanations (start with text, not code)
|
|
180
|
-
// But keep all valid TypeScript/JavaScript syntax
|
|
181
|
-
if (trimmed === '') return true; // Keep empty lines
|
|
182
|
-
if (trimmed.startsWith('//')) return true; // Keep comments
|
|
183
|
-
|
|
184
|
-
// Exclude lines that look like natural language explanations
|
|
185
|
-
// (start with capital letter and contain spaces, no semicolons/operators)
|
|
186
|
-
if (/^[A-Z][a-z]+ [\w\s]+$/.test(trimmed) && !trimmed.includes(';')) {
|
|
187
|
-
return false; // This looks like an explanation
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Keep lines that contain code-like patterns
|
|
191
|
-
const codePatterns = [
|
|
192
|
-
'await ', 'const ', 'let ', 'var ', 'return ', 'expect(', 'if ', 'else',
|
|
193
|
-
'for ', 'while ', 'function ', '=>', 'pw.', 'page.',
|
|
194
|
-
')', '}', '];', '});', '})', 'import ', 'export ',
|
|
195
|
-
'.', '(', '[', '=', '+', '-', '*', '/', '%', '&&', '||'
|
|
196
|
-
];
|
|
197
|
-
|
|
198
|
-
return codePatterns.some(pattern => trimmed.includes(pattern));
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
// If we filtered too much, return original
|
|
202
|
-
if (codeLines.length === 0) {
|
|
203
|
-
return code;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
let finalCode = codeLines.join('\n');
|
|
207
|
-
|
|
208
|
-
// Safety check: Remove incomplete page.evaluate statements
|
|
209
|
-
// If we find "page.evaluate(" without proper closing, remove it
|
|
210
|
-
const evaluatePattern = /await\s+page\.evaluate\(\(\)\s*=>\s*\{\s*$/gm;
|
|
211
|
-
if (evaluatePattern.test(finalCode)) {
|
|
212
|
-
// Has unclosed page.evaluate at end - this is incomplete, return TODO
|
|
213
|
-
return '// TODO: Implement step (AI generated incomplete code)';
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// Safety check: If code ends with an opening brace/paren, it's incomplete
|
|
217
|
-
const endsIncomplete = /[\({]\s*$/.test(finalCode);
|
|
218
|
-
if (endsIncomplete) {
|
|
219
|
-
return '// TODO: Implement step (AI generated incomplete code)';
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
return finalCode;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
import * as Handlebars from 'handlebars';
|
|
4
|
-
|
|
5
|
-
export interface AuthSetupGeneratorOptions {
|
|
6
|
-
roles: string[];
|
|
7
|
-
outputDir: string; // Base specs directory
|
|
8
|
-
verbose?: boolean;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export class AuthSetupGenerator {
|
|
12
|
-
/**
|
|
13
|
-
* Generate auth.setup.ts if it doesn't exist
|
|
14
|
-
* Creates:
|
|
15
|
-
* - specs/auth.setup.ts (from template)
|
|
16
|
-
* - specs/.auth/ directory
|
|
17
|
-
* - specs/.auth/.gitignore
|
|
18
|
-
*/
|
|
19
|
-
async generateIfNeeded(options: AuthSetupGeneratorOptions): Promise<boolean> {
|
|
20
|
-
const setupFile = path.join(options.outputDir, 'auth.setup.ts');
|
|
21
|
-
|
|
22
|
-
// Don't overwrite existing setup
|
|
23
|
-
if (fs.existsSync(setupFile)) {
|
|
24
|
-
if (options.verbose) {
|
|
25
|
-
console.log('ℹ Auth setup already exists, skipping generation');
|
|
26
|
-
}
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Create .auth directory
|
|
31
|
-
const authDir = path.join(options.outputDir, '.auth');
|
|
32
|
-
fs.mkdirSync(authDir, { recursive: true });
|
|
33
|
-
|
|
34
|
-
// Generate .gitignore (storage states are runtime artifacts)
|
|
35
|
-
const gitignore = path.join(authDir, '.gitignore');
|
|
36
|
-
fs.writeFileSync(gitignore, '*.json\n', 'utf-8');
|
|
37
|
-
|
|
38
|
-
// Generate setup file from template
|
|
39
|
-
const template = this.loadTemplate();
|
|
40
|
-
const content = this.renderTemplate(template, { roles: options.roles });
|
|
41
|
-
fs.writeFileSync(setupFile, content, 'utf-8');
|
|
42
|
-
|
|
43
|
-
console.log('✓ Generated specs/auth.setup.ts - Update TODOs before running tests');
|
|
44
|
-
console.log(`✓ Created specs/.auth/ directory for storage states`);
|
|
45
|
-
console.log(` Detected roles: ${options.roles.join(', ')}`);
|
|
46
|
-
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
private loadTemplate(): string {
|
|
51
|
-
const templatePath = path.join(__dirname, 'templates', 'auth-setup.ts.hbs');
|
|
52
|
-
return fs.readFileSync(templatePath, 'utf-8');
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
private renderTemplate(template: string, data: { roles: string[] }): string {
|
|
56
|
-
const compiled = Handlebars.compile(template);
|
|
57
|
-
return compiled(data);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
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
|
-
];
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { test as setup, expect } from '@playwright/test';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Authentication Setup
|
|
5
|
-
*
|
|
6
|
-
* This file creates authenticated browser contexts for your tests.
|
|
7
|
-
* Update the TODOs with your application's actual login flow.
|
|
8
|
-
*
|
|
9
|
-
* Generated roles: {{#each roles}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
const authFile = (role: string) => `specs/.auth/${role}.json`;
|
|
13
|
-
|
|
14
|
-
{{#each roles}}
|
|
15
|
-
setup('authenticate as {{this}}', async ({ page }) => {
|
|
16
|
-
// TODO: Navigate to your login page
|
|
17
|
-
await page.goto('/login');
|
|
18
|
-
|
|
19
|
-
// TODO: Fill in credentials for {{this}} role
|
|
20
|
-
// Update these selectors to match your application
|
|
21
|
-
await page.getByLabel('Email').fill('{{this}}@example.com');
|
|
22
|
-
await page.getByLabel('Password').fill('{{this}}123');
|
|
23
|
-
|
|
24
|
-
// TODO: Click login button
|
|
25
|
-
await page.getByRole('button', { name: 'Sign in' }).click();
|
|
26
|
-
|
|
27
|
-
// TODO: Wait for authentication to complete
|
|
28
|
-
// Update this to match your post-login URL or element
|
|
29
|
-
await page.waitForURL('/dashboard');
|
|
30
|
-
|
|
31
|
-
// Save authentication state
|
|
32
|
-
await page.context().storageState({ path: authFile('{{this}}') });
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
{{/each}}
|
|
36
|
-
// TODO: Add more roles as needed by adding @auth:{role} tags to your features
|