@sun-asterisk/sungen 2.0.0 → 2.0.2
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/index.js +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +2 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +2 -2
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +10 -0
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/step-mapper.d.ts +4 -0
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +8 -0
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +4 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +11 -410
- package/dist/orchestrator/project-initializer.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/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 +3 -2
- package/src/cli/index.ts +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +2 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +2 -2
- package/src/generators/test-generator/code-generator.ts +11 -0
- package/src/generators/test-generator/step-mapper.ts +9 -0
- package/src/orchestrator/project-initializer.ts +12 -410
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-initializer.js","sourceRoot":"","sources":["../../src/orchestrator/project-initializer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"project-initializer.js","sourceRoot":"","sources":["../../src/orchestrator/project-initializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Sungen AI Rules
|
|
2
|
+
|
|
3
|
+
You generate 3 files for sungen — a Gherkin compiler that produces Playwright tests.
|
|
4
|
+
**You do NOT write Playwright code.** You only write `.feature`, `selectors.yaml`, and `test-data.yaml`.
|
|
5
|
+
|
|
6
|
+
## Complete Example
|
|
7
|
+
|
|
8
|
+
Given a login page, here are the 3 files you generate:
|
|
9
|
+
|
|
10
|
+
**qa/screens/login/features/login.feature**
|
|
11
|
+
```gherkin
|
|
12
|
+
@auth:admin
|
|
13
|
+
Feature: Login Screen
|
|
14
|
+
|
|
15
|
+
Scenario: Successful login
|
|
16
|
+
Given User is on [login] page
|
|
17
|
+
When User fill [Email] field with {{email}}
|
|
18
|
+
And User fill [Password] field with {{password}}
|
|
19
|
+
And User click [Submit] button
|
|
20
|
+
Then User see [Welcome] heading with {{welcome_text}}
|
|
21
|
+
And User see [Dashboard] link is visible
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**qa/screens/login/selectors/login.yaml**
|
|
25
|
+
```yaml
|
|
26
|
+
login:
|
|
27
|
+
type: 'page'
|
|
28
|
+
value: '/login'
|
|
29
|
+
|
|
30
|
+
email:
|
|
31
|
+
type: 'placeholder'
|
|
32
|
+
value: 'Enter your email'
|
|
33
|
+
|
|
34
|
+
password:
|
|
35
|
+
type: 'placeholder'
|
|
36
|
+
value: 'Enter your password'
|
|
37
|
+
|
|
38
|
+
submit:
|
|
39
|
+
type: 'role'
|
|
40
|
+
value: 'button'
|
|
41
|
+
name: 'Submit'
|
|
42
|
+
|
|
43
|
+
welcome:
|
|
44
|
+
type: 'role'
|
|
45
|
+
value: 'heading'
|
|
46
|
+
name: 'Welcome'
|
|
47
|
+
|
|
48
|
+
dashboard:
|
|
49
|
+
type: 'role'
|
|
50
|
+
value: 'link'
|
|
51
|
+
name: 'Dashboard'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**qa/screens/login/test-data/login.yaml**
|
|
55
|
+
```yaml
|
|
56
|
+
email: 'admin@example.com'
|
|
57
|
+
password: 'password123'
|
|
58
|
+
welcome_text: 'Welcome back'
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Key Rules
|
|
62
|
+
|
|
63
|
+
### YAML key format (CRITICAL)
|
|
64
|
+
|
|
65
|
+
YAML keys = Gherkin `[Reference]` converted to: **lowercase, spaces→dots, no special chars**.
|
|
66
|
+
|
|
67
|
+
| Gherkin | YAML Key |
|
|
68
|
+
|---|---|
|
|
69
|
+
| `[Submit]` | `submit:` |
|
|
70
|
+
| `[Search Content]` | `search.content:` |
|
|
71
|
+
| `[Kudos Detail Modal]` | `kudos.detail.modal:` |
|
|
72
|
+
| `[Page 2]` | `page.2:` |
|
|
73
|
+
|
|
74
|
+
**NEVER use spaces in YAML keys.**
|
|
75
|
+
|
|
76
|
+
### Gherkin patterns (all 17)
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
User click [Target] button # click
|
|
80
|
+
User fill [Target] field with {{value}} # fill
|
|
81
|
+
User check [Target] checkbox # check/uncheck
|
|
82
|
+
User select [Target] dropdown with {{value}} # select
|
|
83
|
+
User upload [Target] file with {{filename}} # upload
|
|
84
|
+
User double click [Target] element # double click
|
|
85
|
+
User hover [Target] icon # hover
|
|
86
|
+
User clear [Target] field # clear
|
|
87
|
+
User press Escape key # global key
|
|
88
|
+
User press Enter on [Target] field # key on element
|
|
89
|
+
User is on [target] page # navigate (Given)
|
|
90
|
+
User see [target] page # URL assertion (Then)
|
|
91
|
+
User wait for 3 seconds # wait timeout
|
|
92
|
+
User wait for [Target] dialog is hidden # wait state
|
|
93
|
+
User scroll to [Target] section # scroll
|
|
94
|
+
User switch to [Target] frame # iframe
|
|
95
|
+
User see [Target] heading with {{value}} # visible assertion
|
|
96
|
+
User see [Target] button is disabled # state assertion
|
|
97
|
+
User see [Target] text contains {{partial}} # text contains
|
|
98
|
+
User see [Table] table has row with {{filter}} # table row
|
|
99
|
+
User see [Table] table row with {{f}} has [Col] with {{v}} # table cell
|
|
100
|
+
User click [Edit] in [Table] table row with {{name}} # action in row
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
States: `hidden`, `visible`, `disabled`, `enabled`, `checked`, `unchecked`, `focused`, `empty`
|
|
104
|
+
|
|
105
|
+
### Selector types
|
|
106
|
+
|
|
107
|
+
| type | value | name | when to use |
|
|
108
|
+
|---|---|---|---|
|
|
109
|
+
| `role` | `button`, `heading`, `link`, etc. | accessible name | **preferred** for interactive elements |
|
|
110
|
+
| `testid` | `data-testid` value | — | when `data-testid` exists |
|
|
111
|
+
| `placeholder` | placeholder text | — | input fields |
|
|
112
|
+
| `label` | label text | — | labeled inputs |
|
|
113
|
+
| `text` | — | — | static text content |
|
|
114
|
+
| `locator` | CSS selector | — | **last resort** |
|
|
115
|
+
| `page` | relative URL path | — | navigation targets |
|
|
116
|
+
| `upload` | — | — | file upload inputs |
|
|
117
|
+
| `frame` | iframe selector | — | iframe targets |
|
|
118
|
+
|
|
119
|
+
Priority: `testid` > `role+name` > `placeholder` > `label` > `text` > `locator`
|
|
120
|
+
|
|
121
|
+
### Tags
|
|
122
|
+
|
|
123
|
+
| Tag | Effect |
|
|
124
|
+
|---|---|
|
|
125
|
+
| `@auth:role` | Adds `test.use({ storageState: 'specs/.auth/role.json' })` |
|
|
126
|
+
| `@steps:name` | Define reusable step group |
|
|
127
|
+
| `@extend:name` | Inherit steps from another scenario |
|
|
128
|
+
| `@manual` | Skip in generation |
|
|
129
|
+
|
|
130
|
+
### Selector options
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
element.key:
|
|
134
|
+
type: 'role'
|
|
135
|
+
value: 'button'
|
|
136
|
+
name: 'Submit' # accessible name
|
|
137
|
+
nth: 0 # element index (0=first)
|
|
138
|
+
exact: true # exact name match (avoid substring collisions)
|
|
139
|
+
scope: 'navigation' # parent landmark scope
|
|
140
|
+
match: 'exact' # exact text match for getByText
|
|
141
|
+
variant: 'native' # dropdown: 'native' (<select>) or 'custom' (div-based)
|
|
142
|
+
frame: '#iframe-id' # iframe scope
|
|
143
|
+
contenteditable: true # rich text editor
|
|
144
|
+
columns: # table columns
|
|
145
|
+
name: { index: 0, header: 'Name' }
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Navigation and baseURL
|
|
149
|
+
|
|
150
|
+
Page selectors use **relative paths only**. Playwright prepends `baseURL` from `playwright.config.ts`.
|
|
151
|
+
|
|
152
|
+
```yaml
|
|
153
|
+
login:
|
|
154
|
+
type: 'page'
|
|
155
|
+
value: '/login' # NOT https://example.com/login
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Auth
|
|
159
|
+
|
|
160
|
+
- `@auth:admin` on Feature or Scenario → compiler adds `test.use({ storageState: 'specs/.auth/admin.json' })`
|
|
161
|
+
- Auth JSON created by: `sungen makeauth admin` (opens browser for manual login)
|
|
162
|
+
- **Login pages**: no `@auth` tag needed
|
|
163
|
+
- **Authenticated pages**: always add `@auth:role`
|
|
164
|
+
|
|
165
|
+
## Using Playwright MCP to explore pages
|
|
166
|
+
|
|
167
|
+
When exploring a page to generate test files:
|
|
168
|
+
1. Read `playwright.config.ts` for `baseURL`
|
|
169
|
+
2. Use `browser_navigate` to open `baseURL + /path`
|
|
170
|
+
3. Use `browser_snapshot` to see all elements
|
|
171
|
+
4. Generate the 3 files from the snapshot
|
|
172
|
+
|
|
173
|
+
**NEVER use `browser_run_code`.** It fails with `require is not defined`.
|
|
174
|
+
Only use: `browser_navigate`, `browser_snapshot`, `browser_click`, `browser_fill_form`, `browser_evaluate`.
|
|
175
|
+
|
|
176
|
+
To browse authenticated pages via MCP:
|
|
177
|
+
1. Read `specs/.auth/role.json` with your file read tool
|
|
178
|
+
2. `browser_navigate` to the page
|
|
179
|
+
3. `browser_evaluate` to inject localStorage and cookies from the JSON
|
|
180
|
+
4. `browser_navigate` again to reload with auth
|
|
181
|
+
|
|
182
|
+
## Commands
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
sungen add --screen <name> --path <url-path> # Create screen
|
|
186
|
+
sungen generate --screen <name> # Compile to .spec.ts
|
|
187
|
+
sungen generate --all # Compile all
|
|
188
|
+
sungen makeauth <role> # Capture auth state
|
|
189
|
+
```
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read environment variables from file.
|
|
3
|
+
* https://github.com/motdotla/dotenv
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* See https://playwright.dev/docs/test-configuration.
|
|
7
|
+
*/
|
|
8
|
+
declare const _default: import("@playwright/test").PlaywrightTestConfig<{}, {}>;
|
|
9
|
+
export default _default;
|
|
10
|
+
//# sourceMappingURL=playwright.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.config.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/templates/playwright.config.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAKH;;GAEG;;AACH,wBAkEG"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const test_1 = require("@playwright/test");
|
|
4
|
+
/**
|
|
5
|
+
* Read environment variables from file.
|
|
6
|
+
* https://github.com/motdotla/dotenv
|
|
7
|
+
*/
|
|
8
|
+
// import dotenv from 'dotenv';
|
|
9
|
+
// import path from 'path';
|
|
10
|
+
// dotenv.config({ path: path.resolve(__dirname, '.env') });
|
|
11
|
+
/**
|
|
12
|
+
* See https://playwright.dev/docs/test-configuration.
|
|
13
|
+
*/
|
|
14
|
+
exports.default = (0, test_1.defineConfig)({
|
|
15
|
+
testDir: './specs/generated',
|
|
16
|
+
/* Run tests in files in parallel */
|
|
17
|
+
fullyParallel: true,
|
|
18
|
+
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
|
19
|
+
forbidOnly: !!process.env.CI,
|
|
20
|
+
/* Retry on CI only */
|
|
21
|
+
retries: process.env.CI ? 2 : 0,
|
|
22
|
+
/* Opt out of parallel tests on CI. */
|
|
23
|
+
workers: process.env.CI ? 1 : undefined,
|
|
24
|
+
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
|
25
|
+
reporter: 'html',
|
|
26
|
+
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
|
27
|
+
use: {
|
|
28
|
+
/* Base URL to use in actions like `await page.goto('')`. */
|
|
29
|
+
baseURL: 'https://example.com',
|
|
30
|
+
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
|
31
|
+
trace: 'on-first-retry',
|
|
32
|
+
},
|
|
33
|
+
/* Configure projects for major browsers */
|
|
34
|
+
projects: [
|
|
35
|
+
{
|
|
36
|
+
name: 'chromium',
|
|
37
|
+
use: { ...test_1.devices['Desktop Chrome'] },
|
|
38
|
+
},
|
|
39
|
+
/*
|
|
40
|
+
// {
|
|
41
|
+
// name: 'firefox',
|
|
42
|
+
// use: { ...devices['Desktop Firefox'] },
|
|
43
|
+
// },
|
|
44
|
+
|
|
45
|
+
// {
|
|
46
|
+
// name: 'webkit',
|
|
47
|
+
// use: { ...devices['Desktop Safari'] },
|
|
48
|
+
// },
|
|
49
|
+
|
|
50
|
+
/* Test against mobile viewports.
|
|
51
|
+
// {
|
|
52
|
+
// name: 'Mobile Chrome',
|
|
53
|
+
// use: { ...devices['Pixel 5'] },
|
|
54
|
+
// },
|
|
55
|
+
// {
|
|
56
|
+
// name: 'Mobile Safari',
|
|
57
|
+
// use: { ...devices['iPhone 12'] },
|
|
58
|
+
// },
|
|
59
|
+
|
|
60
|
+
/* Test against branded browsers. */
|
|
61
|
+
// {
|
|
62
|
+
// name: 'Microsoft Edge',
|
|
63
|
+
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
|
|
64
|
+
// },
|
|
65
|
+
// {
|
|
66
|
+
// name: 'Google Chrome',
|
|
67
|
+
// use: { ...devices['Desktop Chrome'], channel: 'chrome' },
|
|
68
|
+
// },
|
|
69
|
+
],
|
|
70
|
+
/* Run your local dev server before starting the tests */
|
|
71
|
+
// webServer: {
|
|
72
|
+
// command: 'npm run start',
|
|
73
|
+
// url: 'http://localhost:3000',
|
|
74
|
+
// reuseExistingServer: !process.env.CI,
|
|
75
|
+
// },
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=playwright.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.config.js","sourceRoot":"","sources":["../../../src/orchestrator/templates/playwright.config.ts"],"names":[],"mappings":";;AAAA,2CAAyD;AAEzD;;;GAGG;AACH,+BAA+B;AAC/B,2BAA2B;AAC3B,4DAA4D;AAE5D;;GAEG;AACH,kBAAe,IAAA,mBAAY,EAAC;IAC1B,OAAO,EAAE,mBAAmB;IAC5B,oCAAoC;IACpC,aAAa,EAAE,IAAI;IACnB,iFAAiF;IACjF,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;IAC5B,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IACvC,qEAAqE;IACrE,QAAQ,EAAE,MAAM;IAChB,wGAAwG;IACxG,GAAG,EAAE;QACH,4DAA4D;QAC5D,OAAO,EAAE,qBAAqB;QAE9B,+FAA+F;QAC/F,KAAK,EAAE,gBAAgB;KACxB;IAED,2CAA2C;IAC3C,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,EAAE,GAAG,cAAO,CAAC,gBAAgB,CAAC,EAAE;SACtC;QAED;;;;;;;;;;;;;;;;;;;;;4CAqBoC;QACpC,IAAI;QACJ,4BAA4B;QAC5B,4DAA4D;QAC5D,KAAK;QACL,IAAI;QACJ,2BAA2B;QAC3B,8DAA8D;QAC9D,KAAK;KACN;IAED,yDAAyD;IACzD,eAAe;IACf,8BAA8B;IAC9B,kCAAkC;IAClC,0CAA0C;IAC1C,KAAK;CACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Read environment variables from file.
|
|
5
|
+
* https://github.com/motdotla/dotenv
|
|
6
|
+
*/
|
|
7
|
+
// import dotenv from 'dotenv';
|
|
8
|
+
// import path from 'path';
|
|
9
|
+
// dotenv.config({ path: path.resolve(__dirname, '.env') });
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* See https://playwright.dev/docs/test-configuration.
|
|
13
|
+
*/
|
|
14
|
+
export default defineConfig({
|
|
15
|
+
testDir: './specs/generated',
|
|
16
|
+
/* Run tests in files in parallel */
|
|
17
|
+
fullyParallel: true,
|
|
18
|
+
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
|
19
|
+
forbidOnly: !!process.env.CI,
|
|
20
|
+
/* Retry on CI only */
|
|
21
|
+
retries: process.env.CI ? 2 : 0,
|
|
22
|
+
/* Opt out of parallel tests on CI. */
|
|
23
|
+
workers: process.env.CI ? 1 : undefined,
|
|
24
|
+
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
|
25
|
+
reporter: 'html',
|
|
26
|
+
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
|
27
|
+
use: {
|
|
28
|
+
/* Base URL to use in actions like `await page.goto('')`. */
|
|
29
|
+
baseURL: 'https://example.com',
|
|
30
|
+
|
|
31
|
+
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
|
32
|
+
trace: 'on-first-retry',
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
/* Configure projects for major browsers */
|
|
36
|
+
projects: [
|
|
37
|
+
{
|
|
38
|
+
name: 'chromium',
|
|
39
|
+
use: { ...devices['Desktop Chrome'] },
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
// {
|
|
44
|
+
// name: 'firefox',
|
|
45
|
+
// use: { ...devices['Desktop Firefox'] },
|
|
46
|
+
// },
|
|
47
|
+
|
|
48
|
+
// {
|
|
49
|
+
// name: 'webkit',
|
|
50
|
+
// use: { ...devices['Desktop Safari'] },
|
|
51
|
+
// },
|
|
52
|
+
|
|
53
|
+
/* Test against mobile viewports.
|
|
54
|
+
// {
|
|
55
|
+
// name: 'Mobile Chrome',
|
|
56
|
+
// use: { ...devices['Pixel 5'] },
|
|
57
|
+
// },
|
|
58
|
+
// {
|
|
59
|
+
// name: 'Mobile Safari',
|
|
60
|
+
// use: { ...devices['iPhone 12'] },
|
|
61
|
+
// },
|
|
62
|
+
|
|
63
|
+
/* Test against branded browsers. */
|
|
64
|
+
// {
|
|
65
|
+
// name: 'Microsoft Edge',
|
|
66
|
+
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
|
|
67
|
+
// },
|
|
68
|
+
// {
|
|
69
|
+
// name: 'Google Chrome',
|
|
70
|
+
// use: { ...devices['Desktop Chrome'], channel: 'chrome' },
|
|
71
|
+
// },
|
|
72
|
+
],
|
|
73
|
+
|
|
74
|
+
/* Run your local dev server before starting the tests */
|
|
75
|
+
// webServer: {
|
|
76
|
+
// command: 'npm run start',
|
|
77
|
+
// url: 'http://localhost:3000',
|
|
78
|
+
// reuseExistingServer: !process.env.CI,
|
|
79
|
+
// },
|
|
80
|
+
});
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Sungen Test Automation
|
|
2
|
+
|
|
3
|
+
This project uses [Sungen v2](https://github.com/sun-asterisk/sungen) — a deterministic E2E test compiler.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
AI (Copilot/Claude + MCP Playwright) → visits URL → generates files
|
|
9
|
+
sungen generate → compiles Gherkin + selectors + data → Playwright .spec.ts
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Directory Structure
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
├── qa/screens/<name>/
|
|
16
|
+
│ ├── features/ # .feature files (Gherkin)
|
|
17
|
+
│ ├── selectors/ # Element locator YAML mappings
|
|
18
|
+
│ └── test-data/ # Test data YAML values
|
|
19
|
+
├── specs/
|
|
20
|
+
│ ├── generated/ # Auto-generated Playwright tests
|
|
21
|
+
│ └── .auth/ # Auth storage states
|
|
22
|
+
├── docs/
|
|
23
|
+
│ └── gherkin-dictionary.md # Full grammar & compiler rules
|
|
24
|
+
├── .github/
|
|
25
|
+
│ └── copilot-instructions.md # AI rules for GitHub Copilot
|
|
26
|
+
└── CLAUDE.md # AI rules for Claude Code
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Workflow
|
|
30
|
+
|
|
31
|
+
### 1. Add a screen
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
sungen add --screen login --path /login
|
|
35
|
+
# Add more features to an existing screen:
|
|
36
|
+
sungen add --screen login --feature forgot-password
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 2. Set up auth (if needed)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
sungen makeauth admin
|
|
43
|
+
# Opens browser → login manually → saves specs/.auth/admin.json
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 3. Generate Gherkin + selectors with AI
|
|
47
|
+
|
|
48
|
+
Use your AI assistant (GitHub Copilot or Claude Code) to:
|
|
49
|
+
1. Navigate to the page URL via MCP Playwright
|
|
50
|
+
2. Take an accessibility snapshot
|
|
51
|
+
3. Generate `.feature` + `selectors.yaml` + `test-data.yaml`
|
|
52
|
+
|
|
53
|
+
The AI rules in `.github/copilot-instructions.md` and `CLAUDE.md` teach the AI
|
|
54
|
+
how to write correct Gherkin syntax and selector YAML for sungen.
|
|
55
|
+
|
|
56
|
+
### 4. Compile to Playwright tests
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
sungen generate --screen login
|
|
60
|
+
# or for all screens:
|
|
61
|
+
sungen generate --all
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 5. Run tests
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npx playwright test
|
|
68
|
+
npx playwright test --ui # interactive mode
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 6. Fix failures (AI Verify loop)
|
|
72
|
+
|
|
73
|
+
When tests fail, use AI to read the error → fix `selectors.yaml` → recompile → re-run.
|
|
74
|
+
|
|
75
|
+
| Error | Fix in selectors.yaml |
|
|
76
|
+
|---|---|
|
|
77
|
+
| strict mode: resolved to N elements | Add `exact: true` or `scope` or `nth` |
|
|
78
|
+
| element(s) not found | Fix `name`, `type`, or `value` |
|
|
79
|
+
| getByText matched too many | Add `match: 'exact'` or `nth` |
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Gherkin Guide
|
|
84
|
+
|
|
85
|
+
### Syntax
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
User <action> [<Target>] <type> with {{<Value>}}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- `[Target]` → selector reference → lookup in `selectors/*.yaml`
|
|
92
|
+
- `{{Value}}` → test data reference → lookup in `test-data/*.yaml`
|
|
93
|
+
- `<type>` → element type: button, link, field, heading, text, etc.
|
|
94
|
+
|
|
95
|
+
### Pattern Shapes (17 total)
|
|
96
|
+
|
|
97
|
+
#### Actions
|
|
98
|
+
|
|
99
|
+
| Pattern | Example |
|
|
100
|
+
|---|---|
|
|
101
|
+
| Simple click | `User click [Submit] button` |
|
|
102
|
+
| Click with data | `User click [Teammate] button with {{name}}` |
|
|
103
|
+
| Fill field | `User fill [Email] field with {{email}}` |
|
|
104
|
+
| Check/Uncheck | `User check [Remember me] checkbox` |
|
|
105
|
+
| Select dropdown | `User select [Country] dropdown with {{country}}` |
|
|
106
|
+
| Upload file | `User upload [Avatar] file with {{path}}` |
|
|
107
|
+
| Double click | `User double click [Cell] element` |
|
|
108
|
+
| Hover | `User hover [Info] icon` |
|
|
109
|
+
| Clear | `User clear [Search] field` |
|
|
110
|
+
|
|
111
|
+
#### Keyboard
|
|
112
|
+
|
|
113
|
+
| Pattern | Example |
|
|
114
|
+
|---|---|
|
|
115
|
+
| Global key | `User press Escape key` |
|
|
116
|
+
| Key on element | `User press Enter on [Search] field` |
|
|
117
|
+
|
|
118
|
+
#### Navigation
|
|
119
|
+
|
|
120
|
+
| Pattern | Example |
|
|
121
|
+
|---|---|
|
|
122
|
+
| Open page | `User is on [login] page` |
|
|
123
|
+
| See page (URL) | `User see [dashboard] page` |
|
|
124
|
+
|
|
125
|
+
#### Wait
|
|
126
|
+
|
|
127
|
+
| Pattern | Example |
|
|
128
|
+
|---|---|
|
|
129
|
+
| Wait timeout | `User wait for 3 seconds` |
|
|
130
|
+
| Wait element | `User wait for [Modal] dialog` |
|
|
131
|
+
| Wait hidden | `User wait for [Loading] spinner is hidden` |
|
|
132
|
+
| Wait with data | `User wait for [Dialog] dialog with {{title}}` |
|
|
133
|
+
|
|
134
|
+
#### Assertions
|
|
135
|
+
|
|
136
|
+
| Pattern | Example |
|
|
137
|
+
|---|---|
|
|
138
|
+
| See element | `User see [Welcome] heading` |
|
|
139
|
+
| See with value | `User see [Title] heading with {{title}}` |
|
|
140
|
+
| State check | `User see [Submit] button is disabled` |
|
|
141
|
+
| State + data | `User see [Panel] dialog with {{title}} is hidden` |
|
|
142
|
+
| Text contains | `User see [Message] text contains {{partial}}` |
|
|
143
|
+
|
|
144
|
+
States: `hidden`, `visible`, `disabled`, `enabled`, `checked`, `unchecked`, `focused`, `empty`
|
|
145
|
+
|
|
146
|
+
#### Table
|
|
147
|
+
|
|
148
|
+
| Pattern | Example |
|
|
149
|
+
|---|---|
|
|
150
|
+
| Row exists | `User see [Users] table has row with {{name}}` |
|
|
151
|
+
| No row | `User see [Users] table has no row with {{name}}` |
|
|
152
|
+
| Row count | `User see [Users] table has {{count}} rows` |
|
|
153
|
+
| Column exists | `User see [Users] table has [Email] column` |
|
|
154
|
+
| Cell by filter | `User see [Users] table row with {{name}} has [Status] with {{status}}` |
|
|
155
|
+
| Cell by index | `User see [Users] table row 1 [Name] cell with {{name}}` |
|
|
156
|
+
| Action in row | `User click [Edit] in [Users] table row with {{name}}` |
|
|
157
|
+
| Empty table | `User see [Users] table is empty` |
|
|
158
|
+
|
|
159
|
+
#### Scope
|
|
160
|
+
|
|
161
|
+
| Pattern | Example |
|
|
162
|
+
|---|---|
|
|
163
|
+
| Scroll | `User scroll to [Footer] section` |
|
|
164
|
+
| Frame enter | `User switch to [Payment] frame` |
|
|
165
|
+
| Frame exit | `User switch to [main] frame` |
|
|
166
|
+
|
|
167
|
+
### Tags
|
|
168
|
+
|
|
169
|
+
| Tag | Purpose |
|
|
170
|
+
|---|---|
|
|
171
|
+
| `@auth:role` | Use Playwright storage state for auth |
|
|
172
|
+
| `@steps:name` | Define reusable step group |
|
|
173
|
+
| `@extend:name` | Inherit steps from another scenario |
|
|
174
|
+
| `@manual` | Skip scenario in generation |
|
|
175
|
+
|
|
176
|
+
### Selector YAML
|
|
177
|
+
|
|
178
|
+
```yaml
|
|
179
|
+
submit.button:
|
|
180
|
+
type: 'role' # testid, role, text, label, placeholder, locator, page
|
|
181
|
+
value: 'button' # role name, testid value, CSS selector, etc.
|
|
182
|
+
name: 'Submit' # accessible name
|
|
183
|
+
nth: 0 # element index (0=first, 1=.nth(0), 2=.nth(1))
|
|
184
|
+
exact: true # exact name match (avoid "Submit" matching "Submit Form")
|
|
185
|
+
scope: 'desktop navigation' # scope to parent landmark
|
|
186
|
+
match: 'exact' # exact text match for getByText
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Locator priority: `data-testid` > `role+name` > `label` > `text` > `CSS`
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Documentation
|
|
194
|
+
|
|
195
|
+
- [Gherkin Dictionary](docs/gherkin-dictionary.md) — full grammar, all 17 patterns, compiler rules
|
|
196
|
+
- [Sungen GitHub](https://github.com/sun-asterisk/sungen)
|
|
197
|
+
- [Playwright Documentation](https://playwright.dev)
|