@sun-asterisk/sungen 1.0.4 → 1.0.5

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.
Files changed (85) hide show
  1. package/package.json +1 -1
  2. package/dist/config/ai-providers.yaml +0 -56
  3. package/dist/config/default.config.yaml +0 -101
  4. package/dist/config/framework.config.yaml +0 -52
  5. package/dist/config/routes.yaml +0 -31
  6. package/dist/generators/test-generator/adapters/playwright/templates/steps/active-state-assertion.hbs +0 -2
  7. package/dist/generators/test-generator/adapters/playwright/templates/steps/ai-response-assertion-selector.hbs +0 -5
  8. package/dist/generators/test-generator/adapters/playwright/templates/steps/ai-response-assertion-simple.hbs +0 -1
  9. package/dist/generators/test-generator/adapters/playwright/templates/steps/application-running.hbs +0 -1
  10. package/dist/generators/test-generator/adapters/playwright/templates/steps/check-action.hbs +0 -1
  11. package/dist/generators/test-generator/adapters/playwright/templates/steps/checkbox.hbs +0 -2
  12. package/dist/generators/test-generator/adapters/playwright/templates/steps/checked-assertion.hbs +0 -1
  13. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-action.hbs +0 -1
  14. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-auth.hbs +0 -6
  15. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-browser-state.hbs +0 -6
  16. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-database.hbs +0 -4
  17. package/dist/generators/test-generator/adapters/playwright/templates/steps/clear.hbs +0 -2
  18. package/dist/generators/test-generator/adapters/playwright/templates/steps/click-action.hbs +0 -1
  19. package/dist/generators/test-generator/adapters/playwright/templates/steps/click.hbs +0 -2
  20. package/dist/generators/test-generator/adapters/playwright/templates/steps/contain-text-assertion.hbs +0 -1
  21. package/dist/generators/test-generator/adapters/playwright/templates/steps/contains-text-assertion.hbs +0 -2
  22. package/dist/generators/test-generator/adapters/playwright/templates/steps/count-assertion.hbs +0 -1
  23. package/dist/generators/test-generator/adapters/playwright/templates/steps/count-greater-than.hbs +0 -3
  24. package/dist/generators/test-generator/adapters/playwright/templates/steps/count-less-than.hbs +0 -3
  25. package/dist/generators/test-generator/adapters/playwright/templates/steps/disabled-assertion.hbs +0 -2
  26. package/dist/generators/test-generator/adapters/playwright/templates/steps/displayed-containing-text.hbs +0 -3
  27. package/dist/generators/test-generator/adapters/playwright/templates/steps/displayed-with-text.hbs +0 -3
  28. package/dist/generators/test-generator/adapters/playwright/templates/steps/double-click-action.hbs +0 -1
  29. package/dist/generators/test-generator/adapters/playwright/templates/steps/empty-assertion-advanced.hbs +0 -3
  30. package/dist/generators/test-generator/adapters/playwright/templates/steps/empty-assertion.hbs +0 -2
  31. package/dist/generators/test-generator/adapters/playwright/templates/steps/enabled-assertion.hbs +0 -2
  32. package/dist/generators/test-generator/adapters/playwright/templates/steps/error-message-assertion.hbs +0 -3
  33. package/dist/generators/test-generator/adapters/playwright/templates/steps/fill-action.hbs +0 -1
  34. package/dist/generators/test-generator/adapters/playwright/templates/steps/fill.hbs +0 -2
  35. package/dist/generators/test-generator/adapters/playwright/templates/steps/focused-assertion.hbs +0 -1
  36. package/dist/generators/test-generator/adapters/playwright/templates/steps/generic-message-assertion.hbs +0 -3
  37. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-attribute.hbs +0 -2
  38. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-class.hbs +0 -2
  39. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-count.hbs +0 -2
  40. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-image-src.hbs +0 -3
  41. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-link.hbs +0 -3
  42. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-placeholder.hbs +0 -3
  43. package/dist/generators/test-generator/adapters/playwright/templates/steps/has-value.hbs +0 -2
  44. package/dist/generators/test-generator/adapters/playwright/templates/steps/have-text-assertion.hbs +0 -1
  45. package/dist/generators/test-generator/adapters/playwright/templates/steps/hover-action.hbs +0 -1
  46. package/dist/generators/test-generator/adapters/playwright/templates/steps/html5-validation-check.hbs +0 -4
  47. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-checked.hbs +0 -2
  48. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-editable.hbs +0 -2
  49. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-focused.hbs +0 -2
  50. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-hidden.hbs +0 -2
  51. package/dist/generators/test-generator/adapters/playwright/templates/steps/is-unchecked.hbs +0 -2
  52. package/dist/generators/test-generator/adapters/playwright/templates/steps/locator.hbs +0 -1
  53. package/dist/generators/test-generator/adapters/playwright/templates/steps/login.hbs +0 -8
  54. package/dist/generators/test-generator/adapters/playwright/templates/steps/message-assertion-body.hbs +0 -1
  55. package/dist/generators/test-generator/adapters/playwright/templates/steps/message-assertion-selector.hbs +0 -2
  56. package/dist/generators/test-generator/adapters/playwright/templates/steps/message-count-assertion.hbs +0 -3
  57. package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation.hbs +0 -1
  58. package/dist/generators/test-generator/adapters/playwright/templates/steps/not-checked-assertion.hbs +0 -1
  59. package/dist/generators/test-generator/adapters/playwright/templates/steps/not-visible-assertion.hbs +0 -1
  60. package/dist/generators/test-generator/adapters/playwright/templates/steps/not-visible.hbs +0 -2
  61. package/dist/generators/test-generator/adapters/playwright/templates/steps/notification-assertion.hbs +0 -4
  62. package/dist/generators/test-generator/adapters/playwright/templates/steps/press-action.hbs +0 -1
  63. package/dist/generators/test-generator/adapters/playwright/templates/steps/press-enter.hbs +0 -2
  64. package/dist/generators/test-generator/adapters/playwright/templates/steps/redirect-assertion.hbs +0 -3
  65. package/dist/generators/test-generator/adapters/playwright/templates/steps/route-assertion.hbs +0 -2
  66. package/dist/generators/test-generator/adapters/playwright/templates/steps/screen-navigation.hbs +0 -3
  67. package/dist/generators/test-generator/adapters/playwright/templates/steps/scroll-bottom-assertion.hbs +0 -5
  68. package/dist/generators/test-generator/adapters/playwright/templates/steps/select-action.hbs +0 -1
  69. package/dist/generators/test-generator/adapters/playwright/templates/steps/select.hbs +0 -2
  70. package/dist/generators/test-generator/adapters/playwright/templates/steps/text-matches-pattern.hbs +0 -3
  71. package/dist/generators/test-generator/adapters/playwright/templates/steps/uncheck-action.hbs +0 -1
  72. package/dist/generators/test-generator/adapters/playwright/templates/steps/user-login-todo.hbs +0 -6
  73. package/dist/generators/test-generator/adapters/playwright/templates/steps/visibility-assertion.hbs +0 -2
  74. package/dist/generators/test-generator/adapters/playwright/templates/steps/visible-assertion.hbs +0 -1
  75. package/dist/generators/test-generator/adapters/playwright/templates/steps/wait-for-element.hbs +0 -1
  76. package/dist/generators/test-generator/adapters/playwright/templates/steps/wait-timeout.hbs +0 -1
  77. package/dist/generators/test-generator/adapters/playwright/templates/steps/wait.hbs +0 -1
  78. package/dist/generators/test-generator/step-mapper-old.d.ts +0 -180
  79. package/dist/generators/test-generator/step-mapper-old.d.ts.map +0 -1
  80. package/dist/generators/test-generator/step-mapper-old.js +0 -752
  81. package/dist/generators/test-generator/step-mapper-old.js.map +0 -1
  82. package/dist/generators/test-generator/step-mapper-refactored.d.ts +0 -47
  83. package/dist/generators/test-generator/step-mapper-refactored.d.ts.map +0 -1
  84. package/dist/generators/test-generator/step-mapper-refactored.js +0 -182
  85. package/dist/generators/test-generator/step-mapper-refactored.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sun-asterisk/sungen",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "AI-Native E2E Test Generator - Generate Playwright tests from Gherkin features using AI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,56 +0,0 @@
1
- # AI Provider Configuration
2
-
3
- providers:
4
- # Claude - Best for DSL generation (cheap + fast)
5
- claude:
6
- generation:
7
- model: "claude-3-haiku-20240307"
8
- temperature: 0.2
9
- maxTokens: 2048
10
- vision:
11
- model: "claude-3-sonnet-20240229"
12
- temperature: 0.3
13
- maxTokens: 4096
14
-
15
- # OpenAI - Best for vision tasks
16
- openai:
17
- generation:
18
- model: "gpt-4o-mini"
19
- temperature: 0.2
20
- maxTokens: 2048
21
- vision:
22
- model: "gpt-4o"
23
- temperature: 0.3
24
- maxTokens: 4096
25
-
26
- # Gemini - Alternative provider
27
- gemini:
28
- generation:
29
- model: "gemini-1.5-flash"
30
- temperature: 0.2
31
- maxTokens: 2048
32
- vision:
33
- model: "gemini-1.5-pro"
34
- temperature: 0.3
35
- maxTokens: 4096
36
-
37
- # Default provider for each task type
38
- defaults:
39
- generation: "claude"
40
- vision: "openai"
41
- analysis: "claude"
42
-
43
- # Cost optimization (estimated cost per 1M tokens)
44
- costs:
45
- claude-haiku:
46
- input: 0.25
47
- output: 1.25
48
- gpt-4o-mini:
49
- input: 0.15
50
- output: 0.60
51
- gpt-4o:
52
- input: 2.50
53
- output: 10.00
54
- gemini-flash:
55
- input: 0.075
56
- output: 0.30
@@ -1,101 +0,0 @@
1
- # AI-Native E2E Test Framework - Default Configuration
2
- # This file contains default settings for the framework
3
- # Override values via CLI flags or custom config files
4
-
5
- # General settings
6
- version: "1.0.0"
7
- verbose: false
8
- force: false # Force regeneration, bypass cache
9
-
10
- # Paths
11
- paths:
12
- sourceRoot: "app"
13
- featuresDir: "qa/features"
14
- testDataDir: "qa/test-data"
15
- uiModelsDir: "qa/ui-models"
16
- selectorsDir: "qa/selectors"
17
- specsDir: "specs/generated"
18
- cacheDir: ".cache"
19
-
20
- # UI Scanner configuration
21
- scanner:
22
- framework: "react" # react, vue, angular
23
- maxDepth: 999 # Component scan depth (999 = unlimited)
24
- includePatterns:
25
- - "src/**/*.tsx"
26
- - "src/**/*.jsx"
27
- excludePatterns:
28
- - "node_modules/**"
29
- - "**/*.test.*"
30
- - "**/*.spec.*"
31
-
32
- # Selector mapping configuration
33
- selectorMapping:
34
- mode: "hybrid" # hybrid, ai-only, heuristic-only
35
- aiProvider: "anthropic" # anthropic, copilot, openai
36
- model: "claude-sonnet-4-5-20250929"
37
- maxTokens: 4000
38
- temperature: 0
39
- enableOverride: true # Support manual .override.yaml files
40
- heuristicFirst: true # Try heuristics before AI (hybrid mode)
41
- minHeuristicConfidence: 0.8 # Min confidence to use heuristic (0.0-1.0)
42
-
43
- # Gherkin annotations (for selector base generation)
44
- annotations:
45
- selectorId:
46
- pattern: "\\[([a-z0-9-]+\\.[a-z0-9-]+)\\]"
47
- description: "Element selector ID, e.g., [chat.input]"
48
-
49
- dataRef:
50
- pattern: "<([a-z0-9_\\.]+)>"
51
- description: "Test data reference, e.g., <user.email>"
52
-
53
- ignore:
54
- pattern: "# @ignore"
55
- description: "Ignore step in generation"
56
-
57
- ignoreTestCase:
58
- pattern: "# @ignore-testcase"
59
- description: "Ignore entire test case (scenario)"
60
-
61
- skipProduction:
62
- pattern: "# @skip-production"
63
- description: "Skip test in production environment"
64
-
65
- # Test generation configuration
66
- testGenerator:
67
- framework: "playwright" # playwright, appium, integration
68
- aiProvider: "anthropic" # anthropic, copilot, openai
69
- model: "claude-3-5-haiku-20241022"
70
- maxTokens: 500
71
- temperature: 0
72
- enableAIFallback: false # Enable AI for unknown patterns (--ai-mapper flag)
73
- dictionaryPath: "qa/executor/playwright/dictionary.yaml"
74
-
75
- # Cache configuration
76
- cache:
77
- enabled: true
78
- ttl: 86400 # 24 hours in seconds
79
- invalidateOnSourceChange: true
80
- invalidateOnConfigChange: true
81
-
82
- # External API configuration
83
- apis:
84
- anthropic:
85
- baseURL: "https://api.anthropic.com"
86
- apiKeyEnv: "ANTHROPIC_API_KEY"
87
- timeout: 30000 # 30 seconds
88
-
89
- openai:
90
- baseURL: "https://api.openai.com"
91
- apiKeyEnv: "OPENAI_API_KEY"
92
- timeout: 30000
93
-
94
- copilot:
95
- # Will be configured via VS Code extension
96
- enabled: false
97
-
98
- # Application configuration (for E2E tests)
99
- app:
100
- baseURL: "http://localhost:3000"
101
- timeout: 30000 # Default timeout for test actions
@@ -1,52 +0,0 @@
1
- # QA Automation Framework Configuration
2
-
3
- # AI Provider Settings
4
- ai:
5
- provider: "claude" # claude | openai | gemini
6
- model: "claude-3-haiku-20240307"
7
- temperature: 0.2
8
- maxTokens: 2048
9
-
10
- # Selector Discovery Settings
11
- selectors:
12
- autoDiscovery: false # Enable in Phase 2
13
- selfHealing: false # Enable in Phase 2
14
- confidenceThreshold: 0.8
15
- defaultTimeout: 30000 # 30 seconds
16
-
17
- # Caching Settings
18
- caching:
19
- enabled: true
20
- ttl: 86400 # 24 hours in seconds
21
- directory: ".cache/flows"
22
-
23
- # Generation Settings
24
- generation:
25
- patternMatchingFirst: true # Try pattern matching before AI
26
- parallelGeneration: false # Generate multiple features in parallel
27
- validateSelectors: true # Validate selectors exist before generation
28
-
29
- # Reporting Settings
30
- reporting:
31
- formats:
32
- - "html"
33
- - "json"
34
- - "junit"
35
- outputDir: "reports"
36
- screenshots: "only-on-failure"
37
- video: false
38
- trace: "on-first-retry"
39
-
40
- # Test Execution Settings
41
- execution:
42
- baseURL: "http://localhost:3000"
43
- headless: true
44
- timeout: 30000
45
- retries: 2
46
- workers: 1
47
- browser: "chromium"
48
-
49
- # Logging
50
- logging:
51
- level: "info" # debug | info | warn | error
52
- verbose: false
@@ -1,31 +0,0 @@
1
- # Routes Configuration
2
- # Centralized route management for all environments
3
-
4
- # Development routes
5
- development:
6
- home: "/"
7
- login: "/auth/login"
8
- register: "/auth/register"
9
- chat: "/chat"
10
-
11
- # Staging routes (if different)
12
- staging:
13
- home: "/"
14
- login: "/auth/login"
15
- register: "/auth/register"
16
- chat: "/chat"
17
-
18
- # Production routes (if different)
19
- production:
20
- home: "/"
21
- login: "/login" # Maybe different in production
22
- register: "/register"
23
- chat: "/chat"
24
-
25
- # Default environment
26
- default: "development"
27
-
28
- # Route aliases for backward compatibility
29
- aliases:
30
- "login": "auth.login"
31
- "register": "auth.register"
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toHaveAttribute('aria-selected', 'true');
@@ -1,5 +0,0 @@
1
- // Wait for AI response to appear
2
- await page.waitForTimeout(3000);
3
- const {{containerVar}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
4
- const {{messagesVar}} = await {{containerVar}}.locator('[role="article"]').all();
5
- expect({{messagesVar}}.length).toBeGreaterThan(0);
@@ -1 +0,0 @@
1
- await page.waitForTimeout(3000); // Wait for AI response
@@ -1 +0,0 @@
1
- // Application should be running (no action needed)
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await {{varName}}.{{action}}();
@@ -1 +0,0 @@
1
- await expect({{> locator}}).toBeChecked();
@@ -1,6 +0,0 @@
1
- // Clear authentication state
2
- await page.context().clearCookies();
3
- await page.evaluate(() => {
4
- localStorage.clear();
5
- sessionStorage.clear();
6
- });
@@ -1,6 +0,0 @@
1
- // Clear browser state
2
- await page.context().clearCookies();
3
- await page.evaluate(() => {
4
- localStorage.clear();
5
- sessionStorage.clear();
6
- });
@@ -1,4 +0,0 @@
1
- // TODO: Clear database
2
- // This typically requires:
3
- // 1. API call to test endpoint
4
- // 2. Or database reset script
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await {{varName}}.clear();
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await {{varName}}.click();
@@ -1 +0,0 @@
1
- await expect({{> locator}}).toContainText('{{expectedText}}');
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toContainText('{{expectedText}}');
@@ -1 +0,0 @@
1
- await expect({{> locator}}).toHaveCount({{expectedCount}});
@@ -1,3 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- const count = await {{varName}}.count();
3
- expect(count).toBeGreaterThan({{minCount}});
@@ -1,3 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- const count = await {{varName}}.count();
3
- expect(count).toBeLessThan({{maxCount}});
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeDisabled();
@@ -1,3 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeVisible();
3
- await expect({{varName}}).toContainText('{{expectedText}}');
@@ -1,3 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeVisible();
3
- await expect({{varName}}).toHaveText('{{expectedText}}');
@@ -1,3 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- const childCount = await {{varName}}.locator('> *').count();
3
- expect(childCount).toBe(0);
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeEmpty();
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeEnabled();
@@ -1,3 +0,0 @@
1
- // Check for error message
2
- const errorMsg = page.locator('[role="alert"], .error-message, .text-red-500').first();
3
- await expect(errorMsg).toBeVisible({ timeout: 3000 });
@@ -1 +0,0 @@
1
- await {{> locator}}.fill('{{fillValue}}');
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await {{varName}}.fill({{fillValue}});
@@ -1 +0,0 @@
1
- await expect({{> locator}}).toBeFocused();
@@ -1,3 +0,0 @@
1
- // Check for {{messageType}} message
2
- const message = page.locator('body, main, [role="main"]').first();
3
- await expect(message).toBeVisible({ timeout: 3000 });
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toHaveAttribute('{{attributeName}}', '{{expectedValue}}');
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toHaveClass(/{{className}}/);
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toHaveCount({{expectedCount}});
@@ -1,3 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- const src = await {{varName}}.getAttribute('src');
3
- expect(src).toContain('{{expectedSrc}}');
@@ -1,3 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- const href = await {{varName}}.getAttribute('href');
3
- expect(href).toBe('{{expectedUrl}}');
@@ -1,3 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- const placeholder = await {{varName}}.getAttribute('placeholder');
3
- expect(placeholder).toBe('{{expectedPlaceholder}}');
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toHaveValue('{{expectedValue}}');
@@ -1 +0,0 @@
1
- await expect({{> locator}}).toHaveText('{{expectedText}}');
@@ -1,4 +0,0 @@
1
- // Check that form has novalidate attribute
2
- const form = page.locator('form').first();
3
- const hasNoValidate = await form.getAttribute('novalidate');
4
- expect(hasNoValidate).not.toBeNull();
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeChecked();
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeEditable();
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeFocused();
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeHidden();
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).not.toBeChecked();
@@ -1 +0,0 @@
1
- {{#if (eq strategy 'testid')}}page.getByTestId('{{value}}'){{else if (eq strategy 'role')}}page.getByRole('{{role}}', { name: '{{escapeQuotes name}}' }){{else if (eq strategy 'placeholder')}}page.getByPlaceholder('{{escapeQuotes value}}'){{else if (eq strategy 'label')}}page.getByLabel('{{escapeQuotes value}}'){{else if (eq strategy 'text')}}page.getByText('{{escapeQuotes value}}'){{else if (eq strategy 'id')}}page.locator('{{selector}}'){{else}}page.locator('{{escapeQuotes selector}}'){{/if}}{{#if (isDefined nth)}}.nth({{nth}}){{/if}}
@@ -1,8 +0,0 @@
1
- // Login as {{userKey}}
2
- const loginUser = getUser('{{userKey}}');
3
- await page.goto('http://localhost:3000/auth/login');
4
- await pw.fill('[auth-login.email]', loginUser.email, 'auth-login');
5
- await pw.fill('[auth-login.password]', loginUser.password, 'auth-login');
6
- await pw.click('[auth-login.submit]', 'auth-login');
7
- // Wait for login to complete (redirects to home or previous page)
8
- await page.waitForLoadState('networkidle');
@@ -1 +0,0 @@
1
- await expect(page.locator('body')).toContainText('{{message}}');
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toContainText('{{message}}');
@@ -1,3 +0,0 @@
1
- const {{containerVar}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- const {{messagesVar}} = await {{containerVar}}.locator('[data-role="{{messageType}}"]').all();
3
- expect({{messagesVar}}.length).toBe({{expectedCount}});
@@ -1 +0,0 @@
1
- await page.goto('{{#if baseURL}}{{baseURL}}{{/if}}{{path}}');
@@ -1 +0,0 @@
1
- await expect({{> locator}}).not.toBeChecked();
@@ -1 +0,0 @@
1
- await expect({{> locator}}).not.toBeVisible();
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).not.toBeVisible();
@@ -1,4 +0,0 @@
1
- // Wait for notification to appear
2
- await page.waitForTimeout(500);
3
- const notification = page.locator('[role="alert"], .toast, .notification').filter({ hasText: '{{message}}' });
4
- await expect(notification).toBeVisible({ timeout: 3000 });
@@ -1 +0,0 @@
1
- await {{> locator}}.press('{{key}}');
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await {{varName}}.press('Enter');
@@ -1,3 +0,0 @@
1
- // Wait for redirect
2
- await page.waitForURL('**{{routePath}}', { timeout: 5000 });
3
- expect(page.url()).toContain('{{routePath}}');
@@ -1,2 +0,0 @@
1
- await page.waitForURL('**{{path}}', { timeout: 5000 });
2
- expect(page.url()).toContain('{{path}}');
@@ -1,3 +0,0 @@
1
- // Navigate to {{screenName}} screen
2
- await page.goto('http://localhost:3000{{routePath}}');
3
- await page.waitForLoadState('networkidle');
@@ -1,5 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- const isAtBottom = await {{varName}}.evaluate(el => {
3
- return Math.abs(el.scrollHeight - el.scrollTop - el.clientHeight) < 10;
4
- });
5
- expect(isAtBottom).toBe(true);
@@ -1 +0,0 @@
1
- await {{> locator}}.selectOption('{{selectValue}}');
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await {{varName}}.selectOption({{selectValue}});
@@ -1,3 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- const text = await {{varName}}.textContent();
3
- expect(text).toMatch(/{{pattern}}/);
@@ -1,6 +0,0 @@
1
- // TODO: Implement login for user: {{userRef}}
2
- // You may need to:
3
- // 1. Navigate to login page
4
- // 2. Fill credentials
5
- // 3. Submit login form
6
- // 4. Wait for successful login
@@ -1,2 +0,0 @@
1
- const {{varName}} = await pw.getElement('[{{selectorRef}}]', '{{screenId}}');
2
- await expect({{varName}}).toBeVisible();
@@ -1 +0,0 @@
1
- await expect({{> locator}}).toBeVisible();
@@ -1 +0,0 @@
1
- await {{> locator}}.waitFor({ state: '{{state}}' });
@@ -1 +0,0 @@
1
- await page.waitForTimeout({{duration}});
@@ -1 +0,0 @@
1
- await page.waitForTimeout({{duration}});