@sun-asterisk/sungen 1.0.5 → 1.0.7
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 +173 -1
- package/dist/cli/index.js +155 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/core/validator/data-validator.d.ts +38 -0
- package/dist/core/validator/data-validator.d.ts.map +1 -0
- package/dist/core/validator/data-validator.js +212 -0
- package/dist/core/validator/data-validator.js.map +1 -0
- package/dist/core/validator/feature-validator.d.ts +27 -0
- package/dist/core/validator/feature-validator.d.ts.map +1 -0
- package/dist/core/validator/feature-validator.js +182 -0
- package/dist/core/validator/feature-validator.js.map +1 -0
- package/dist/core/validator/index.d.ts +46 -0
- package/dist/core/validator/index.d.ts.map +1 -0
- package/dist/core/validator/index.js +17 -0
- package/dist/core/validator/index.js.map +1 -0
- package/dist/core/validator/screen-validator.d.ts +35 -0
- package/dist/core/validator/screen-validator.d.ts.map +1 -0
- package/dist/core/validator/screen-validator.js +195 -0
- package/dist/core/validator/screen-validator.js.map +1 -0
- package/dist/core/validator/selector-validator.d.ts +35 -0
- package/dist/core/validator/selector-validator.d.ts.map +1 -0
- package/dist/core/validator/selector-validator.js +210 -0
- package/dist/core/validator/selector-validator.js.map +1 -0
- package/dist/generators/cli.js +1 -1
- package/dist/generators/gherkin-parser/index.d.ts +1 -0
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +3 -0
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/scaffold-generator/index.d.ts +25 -2
- package/dist/generators/scaffold-generator/index.d.ts.map +1 -1
- package/dist/generators/scaffold-generator/index.js +157 -14
- package/dist/generators/scaffold-generator/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +2 -0
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/scenario.hbs +4 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/radio-select-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -0
- package/dist/generators/test-generator/auth-setup-generator.d.ts +18 -0
- package/dist/generators/test-generator/auth-setup-generator.d.ts.map +1 -0
- package/dist/generators/test-generator/auth-setup-generator.js +82 -0
- package/dist/generators/test-generator/auth-setup-generator.js.map +1 -0
- package/dist/generators/test-generator/code-generator.d.ts +2 -0
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +130 -5
- 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 +30 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.js +25 -5
- package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -1
- package/dist/generators/test-generator/templates/auth-setup.ts.hbs +36 -0
- package/dist/input/cli-adapter.d.ts +8 -0
- package/dist/input/cli-adapter.d.ts.map +1 -1
- package/dist/input/cli-adapter.js +31 -1
- package/dist/input/cli-adapter.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +31 -22
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/tools/auth-maker.d.ts +74 -0
- package/dist/tools/auth-maker.d.ts.map +1 -0
- package/dist/tools/auth-maker.js +420 -0
- package/dist/tools/auth-maker.js.map +1 -0
- package/package.json +2 -2
- package/src/cli/index.ts +166 -4
- package/src/core/validator/data-validator.ts +202 -0
- package/src/core/validator/feature-validator.ts +176 -0
- package/src/core/validator/index.ts +57 -0
- package/src/core/validator/screen-validator.ts +209 -0
- package/src/core/validator/selector-validator.ts +208 -0
- package/src/generators/cli.ts +1 -1
- package/src/generators/gherkin-parser/index.ts +5 -0
- package/src/generators/scaffold-generator/index.ts +179 -19
- package/src/generators/test-generator/adapters/adapter-interface.ts +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/scenario.hbs +4 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/radio-select-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -0
- package/src/generators/test-generator/auth-setup-generator.ts +59 -0
- package/src/generators/test-generator/code-generator.ts +173 -6
- package/src/generators/test-generator/patterns/assertion-patterns.ts +34 -1
- package/src/generators/test-generator/patterns/form-patterns.ts +27 -8
- package/src/generators/test-generator/templates/auth-setup.ts.hbs +36 -0
- package/src/input/cli-adapter.ts +33 -1
- package/src/orchestrator/pipeline.ts +39 -24
- package/src/tools/auth-maker.ts +467 -0
package/README.md
CHANGED
|
@@ -15,7 +15,8 @@ Sungen is a **deterministic-first** E2E test automation framework that generates
|
|
|
15
15
|
- **2️⃣ Accessibility Match** - Semantic `role` + `aria-label` matching
|
|
16
16
|
- **3️⃣ AI Fallback** - Claude Sonnet as last resort (not primary solution)
|
|
17
17
|
3. **Auto-Tagging Tool** - Inject stable `data-testid` into source code proactively
|
|
18
|
-
4. **
|
|
18
|
+
4. **Authentication Support** - Built-in Playwright storage states via `@auth:{role}` tags
|
|
19
|
+
5. **Test Generation** - Create production-ready Playwright test code
|
|
19
20
|
|
|
20
21
|
**Key Achievement**: **90%+ Direct ID match rate** with minimal AI dependency!
|
|
21
22
|
|
|
@@ -104,6 +105,11 @@ your-project/
|
|
|
104
105
|
│ └── logout.yaml
|
|
105
106
|
│
|
|
106
107
|
├── specs/ # Output artifacts (sibling to qa/)
|
|
108
|
+
│ ├── .auth/ # Authentication storage states (gitignored)
|
|
109
|
+
│ │ ├── .gitignore
|
|
110
|
+
│ │ ├── admin.json
|
|
111
|
+
│ │ └── user.json
|
|
112
|
+
│ ├── auth.setup.ts # Playwright auth setup (auto-generated)
|
|
107
113
|
│ └── generated/ # Generated Playwright tests
|
|
108
114
|
│ └── auth
|
|
109
115
|
│ ├── login.spec.ts
|
|
@@ -183,6 +189,123 @@ success:
|
|
|
183
189
|
message: "Welcome back!"
|
|
184
190
|
```
|
|
185
191
|
|
|
192
|
+
### Authentication with Storage States ⭐ NEW
|
|
193
|
+
|
|
194
|
+
Sungen supports Playwright's authentication storage states via `@auth:{role}` tags, allowing you to reuse authenticated browser contexts across tests.
|
|
195
|
+
|
|
196
|
+
#### Basic Usage
|
|
197
|
+
|
|
198
|
+
**Tag your features or scenarios:**
|
|
199
|
+
|
|
200
|
+
```gherkin
|
|
201
|
+
@auth:admin
|
|
202
|
+
Feature: User Management
|
|
203
|
+
|
|
204
|
+
Scenario: Delete user
|
|
205
|
+
Given User navigate to "/users"
|
|
206
|
+
When User click [delete-button]
|
|
207
|
+
Then User see [success-message]
|
|
208
|
+
|
|
209
|
+
@auth:user
|
|
210
|
+
Feature: Profile Settings
|
|
211
|
+
|
|
212
|
+
Scenario: Update email
|
|
213
|
+
Given User navigate to "/profile"
|
|
214
|
+
When User fill [email] field with {{new_email}}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Generated Playwright code automatically includes storage state:**
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// user-management.spec.ts
|
|
221
|
+
test.use({ storageState: 'specs/.auth/admin.json' });
|
|
222
|
+
|
|
223
|
+
test('Delete user', async ({ page }) => {
|
|
224
|
+
// Already authenticated as admin!
|
|
225
|
+
await page.goto('/users');
|
|
226
|
+
// ...
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
#### Tag Inheritance
|
|
231
|
+
|
|
232
|
+
Tags can be applied at **feature level** (inherited by all scenarios) or **scenario level** (overrides feature):
|
|
233
|
+
|
|
234
|
+
```gherkin
|
|
235
|
+
@auth:admin
|
|
236
|
+
Feature: Admin Dashboard
|
|
237
|
+
|
|
238
|
+
Scenario: View analytics
|
|
239
|
+
# Inherits @auth:admin from feature
|
|
240
|
+
|
|
241
|
+
@auth:moderator
|
|
242
|
+
Scenario: Review flagged content
|
|
243
|
+
# Overrides with @auth:moderator
|
|
244
|
+
|
|
245
|
+
@no-auth
|
|
246
|
+
Scenario: View public help page
|
|
247
|
+
# Explicitly disables authentication
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Precedence:** Scenario > Feature > None
|
|
251
|
+
|
|
252
|
+
#### Setting Up Authentication
|
|
253
|
+
|
|
254
|
+
On first `sungen generate` with `@auth` tags, an `auth.setup.ts` scaffold is auto-generated:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
sungen generate --screen admin
|
|
258
|
+
|
|
259
|
+
# Output:
|
|
260
|
+
✓ Generated specs/auth.setup.ts - Update TODOs before running tests
|
|
261
|
+
✓ Created specs/.auth/ directory for storage states
|
|
262
|
+
Detected roles: admin, user, moderator
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Customize the generated setup file:**
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
// specs/auth.setup.ts
|
|
269
|
+
import { test as setup } from '@playwright/test';
|
|
270
|
+
|
|
271
|
+
const authFile = (role: string) => `specs/.auth/${role}.json`;
|
|
272
|
+
|
|
273
|
+
setup('authenticate as admin', async ({ page }) => {
|
|
274
|
+
// TODO: Navigate to your login page
|
|
275
|
+
await page.goto('/login');
|
|
276
|
+
|
|
277
|
+
// TODO: Fill in credentials for admin role
|
|
278
|
+
await page.getByLabel('Email').fill('admin@example.com');
|
|
279
|
+
await page.getByLabel('Password').fill('admin123');
|
|
280
|
+
|
|
281
|
+
// TODO: Click login button
|
|
282
|
+
await page.getByRole('button', { name: 'Sign in' }).click();
|
|
283
|
+
|
|
284
|
+
// TODO: Wait for authentication to complete
|
|
285
|
+
await page.waitForURL('/dashboard');
|
|
286
|
+
|
|
287
|
+
// Save authentication state
|
|
288
|
+
await page.context().storageState({ path: authFile('admin') });
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
// Additional setup functions for other roles...
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
#### Features
|
|
295
|
+
|
|
296
|
+
- ✅ **Feature-level tags** - All scenarios inherit authentication
|
|
297
|
+
- ✅ **Scenario-level tags** - Override feature authentication
|
|
298
|
+
- ✅ **@no-auth tag** - Explicitly disable inherited authentication
|
|
299
|
+
- ✅ **Auto-generation** - Setup scaffold created on first use
|
|
300
|
+
- ✅ **Multiple roles** - Support unlimited authentication roles
|
|
301
|
+
- ✅ **Storage reuse** - Fast tests by reusing authenticated contexts
|
|
302
|
+
|
|
303
|
+
#### Notes
|
|
304
|
+
|
|
305
|
+
- Storage state files (`specs/.auth/*.json`) are gitignored by default
|
|
306
|
+
- Setup runs before tests via Playwright's global setup
|
|
307
|
+
- New roles detected after initial setup trigger a warning with manual update instructions
|
|
308
|
+
|
|
186
309
|
### Element Selectors
|
|
187
310
|
|
|
188
311
|
Map elements in `selectors/<screen>.yaml`:
|
|
@@ -383,6 +506,55 @@ Clear all cached data
|
|
|
383
506
|
sungen cache-clear
|
|
384
507
|
```
|
|
385
508
|
|
|
509
|
+
### `sungen makeauth` ⭐ NEW
|
|
510
|
+
Generate authentication state for login sessions (supports SSO and manual login)
|
|
511
|
+
|
|
512
|
+
```bash
|
|
513
|
+
sungen makeauth <name> [options]
|
|
514
|
+
|
|
515
|
+
Options:
|
|
516
|
+
-u, --url <url> Base URL of the application (auto-detected from playwright.config.ts)
|
|
517
|
+
-p, --path <path> Login page path (default: /login)
|
|
518
|
+
-o, --output <dir> Output directory (default: specs/.auth)
|
|
519
|
+
-t, --timeout <ms> Overall timeout in milliseconds (default: 180000)
|
|
520
|
+
--nav-timeout <ms> Navigation timeout in milliseconds (default: 180000)
|
|
521
|
+
--stability-wait <ms> URL stability wait in milliseconds (default: 5000)
|
|
522
|
+
--headless Run browser in headless mode
|
|
523
|
+
--verify Verify existing auth state is still valid
|
|
524
|
+
--list List all existing auth states
|
|
525
|
+
--export Export auth state as base64 for CI
|
|
526
|
+
|
|
527
|
+
Examples:
|
|
528
|
+
sungen makeauth user # Create auth state for 'user' role
|
|
529
|
+
sungen makeauth admin --url http://localhost:3000
|
|
530
|
+
sungen makeauth admin --path /auth/signin
|
|
531
|
+
sungen makeauth admin --list # List all auth states
|
|
532
|
+
sungen makeauth admin --verify # Check if auth is still valid
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
**What it does:**
|
|
536
|
+
- Opens a browser window for manual login (including SSO providers like Google, GitHub, etc.)
|
|
537
|
+
- Saves authentication state (cookies, localStorage, sessionStorage) to `specs/.auth/<name>.json`
|
|
538
|
+
- Can be used in Playwright tests to skip login process and maintain sessions
|
|
539
|
+
- Supports multiple auth roles (admin, user, guest, etc.)
|
|
540
|
+
|
|
541
|
+
**Using auth state in tests:**
|
|
542
|
+
```typescript
|
|
543
|
+
// playwright.config.ts
|
|
544
|
+
export default defineConfig({
|
|
545
|
+
projects: [
|
|
546
|
+
{
|
|
547
|
+
name: 'authenticated',
|
|
548
|
+
use: {
|
|
549
|
+
storageState: 'specs/.auth/user.json',
|
|
550
|
+
},
|
|
551
|
+
},
|
|
552
|
+
],
|
|
553
|
+
});
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
See [docs/makeauth.md](docs/makeauth.md) for complete documentation.
|
|
557
|
+
|
|
386
558
|
### `sungen auto-tag` ⭐ NEW
|
|
387
559
|
Auto-inject stable `data-testid` attributes into source code
|
|
388
560
|
|
package/dist/cli/index.js
CHANGED
|
@@ -9,6 +9,52 @@ const cli_adapter_1 = require("../input/cli-adapter");
|
|
|
9
9
|
const config_loader_1 = require("../config/config-loader");
|
|
10
10
|
const pipeline_1 = require("../orchestrator/pipeline");
|
|
11
11
|
const cache_manager_1 = require("../orchestrator/cache-manager");
|
|
12
|
+
/**
|
|
13
|
+
* Print validation result to console
|
|
14
|
+
*/
|
|
15
|
+
function printValidationResult(result, verbose = false) {
|
|
16
|
+
for (const fileResult of result.results) {
|
|
17
|
+
if (fileResult.valid) {
|
|
18
|
+
if (verbose) {
|
|
19
|
+
console.log(`✓ ${fileResult.file}`);
|
|
20
|
+
console.log(` ✓ Gherkin syntax valid`);
|
|
21
|
+
if (fileResult.warnings.length === 0) {
|
|
22
|
+
console.log(` ✓ All checks passed`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log(`✓ ${fileResult.file}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log(`✗ ${fileResult.file}`);
|
|
31
|
+
}
|
|
32
|
+
// Print warnings
|
|
33
|
+
for (const warning of fileResult.warnings) {
|
|
34
|
+
const lineInfo = warning.line ? `:${warning.line}` : '';
|
|
35
|
+
console.log(` ⊘ ${warning.message}${lineInfo}`);
|
|
36
|
+
}
|
|
37
|
+
// Print errors
|
|
38
|
+
for (const error of fileResult.errors) {
|
|
39
|
+
const lineInfo = error.line ? `:${error.line}` : '';
|
|
40
|
+
console.log(` ✗ ${error.message}${lineInfo}`);
|
|
41
|
+
}
|
|
42
|
+
if (!fileResult.valid || (verbose && fileResult.warnings.length > 0)) {
|
|
43
|
+
console.log('');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Print summary
|
|
47
|
+
console.log('\nSummary:');
|
|
48
|
+
console.log(` Files: ${result.summary.totalFiles} total, ${result.summary.passedFiles} passed, ${result.summary.failedFiles} failed`);
|
|
49
|
+
console.log(` Errors: ${result.summary.totalErrors}`);
|
|
50
|
+
console.log(` Warnings: ${result.summary.totalWarnings}`);
|
|
51
|
+
if (result.valid) {
|
|
52
|
+
console.log('\n✅ Validation passed');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log('\n❌ Validation failed');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
12
58
|
async function main() {
|
|
13
59
|
const adapter = new cli_adapter_1.CLIAdapter();
|
|
14
60
|
const program = adapter.createProgram();
|
|
@@ -78,12 +124,20 @@ async function main() {
|
|
|
78
124
|
console.log(' This will create the test specs based on the mapped selectors and test data.');
|
|
79
125
|
}
|
|
80
126
|
else if (options.file) {
|
|
81
|
-
// Process single feature file
|
|
82
|
-
|
|
127
|
+
// Process single feature file
|
|
128
|
+
// Derive output from feature file location: features/ -> selectors/screens/
|
|
129
|
+
const deriveOutputDir = (featureFilePath) => {
|
|
130
|
+
const featureDir = path.dirname(featureFilePath);
|
|
131
|
+
if (featureDir.includes('features')) {
|
|
132
|
+
return featureDir.replace(/features\/?$/, 'selectors/screens');
|
|
133
|
+
}
|
|
134
|
+
return path.join(featureDir, '..', 'selectors', 'screens');
|
|
135
|
+
};
|
|
136
|
+
const outputDir = options.output || deriveOutputDir(options.file);
|
|
83
137
|
const forceOverwrite = cliOptions.force || false;
|
|
84
|
-
console.log(
|
|
138
|
+
console.log(`Mapping from file: ${options.file}\n`);
|
|
85
139
|
const result = generator.processFeatureFile(options.file, outputDir, forceOverwrite);
|
|
86
|
-
console.log(
|
|
140
|
+
console.log(`✓ Generated: ${result.outputPath} (${result.elementCount} elements)`);
|
|
87
141
|
}
|
|
88
142
|
else {
|
|
89
143
|
console.error('❌ Error: Please specify --screen <name> or --file <path>');
|
|
@@ -186,6 +240,103 @@ async function main() {
|
|
|
186
240
|
process.exit(1);
|
|
187
241
|
}
|
|
188
242
|
});
|
|
243
|
+
const validateCmd = adapter.addValidateCommand(program);
|
|
244
|
+
validateCmd.action(async (options) => {
|
|
245
|
+
try {
|
|
246
|
+
const { ScreenValidator } = require('../core/validator');
|
|
247
|
+
const validator = new ScreenValidator({
|
|
248
|
+
verbose: options.verbose,
|
|
249
|
+
});
|
|
250
|
+
let result;
|
|
251
|
+
if (options.screen) {
|
|
252
|
+
console.log(`Validating screen: ${options.screen}\n`);
|
|
253
|
+
result = validator.validateScreen(options.screen);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
console.log('Validating all screens...\n');
|
|
257
|
+
result = validator.validateAll();
|
|
258
|
+
}
|
|
259
|
+
// Output results
|
|
260
|
+
if (options.json) {
|
|
261
|
+
console.log(JSON.stringify(result, null, 2));
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
printValidationResult(result, options.verbose);
|
|
265
|
+
}
|
|
266
|
+
// Exit with error code if validation failed
|
|
267
|
+
if (!result.valid) {
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
console.error('❌ Validation failed:', error);
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
const makeAuthCmd = adapter.addMakeAuthCommand(program);
|
|
277
|
+
makeAuthCmd.action(async (name, options) => {
|
|
278
|
+
try {
|
|
279
|
+
const { AuthMaker } = require('../tools/auth-maker');
|
|
280
|
+
// Only pass baseURL if explicitly provided via --url
|
|
281
|
+
// Otherwise let AuthMaker detect from playwright.config.ts
|
|
282
|
+
const authMaker = new AuthMaker({
|
|
283
|
+
baseURL: options.url,
|
|
284
|
+
loginPath: options.path || '/login',
|
|
285
|
+
outputDir: options.output || 'specs/.auth',
|
|
286
|
+
timeout: options.timeout ? parseInt(options.timeout, 300) : undefined,
|
|
287
|
+
navigationTimeout: options.navTimeout ? parseInt(options.navTimeout, 300) : undefined,
|
|
288
|
+
stabilityWait: options.stabilityWait ? parseInt(options.stabilityWait, 300) : undefined,
|
|
289
|
+
});
|
|
290
|
+
// Handle --list flag
|
|
291
|
+
if (options.list) {
|
|
292
|
+
const authStates = authMaker.listAuth();
|
|
293
|
+
if (authStates.length === 0) {
|
|
294
|
+
console.log('No auth states found.');
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
console.log('Available auth states:');
|
|
298
|
+
for (const state of authStates) {
|
|
299
|
+
console.log(` - ${state}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
// Handle --verify flag
|
|
305
|
+
if (options.verify) {
|
|
306
|
+
const isValid = await authMaker.verifyAuth(name);
|
|
307
|
+
process.exit(isValid ? 0 : 1);
|
|
308
|
+
}
|
|
309
|
+
// Handle --export flag
|
|
310
|
+
if (options.export) {
|
|
311
|
+
const base64 = authMaker.exportAuth(name);
|
|
312
|
+
if (base64) {
|
|
313
|
+
console.log('');
|
|
314
|
+
console.log('Base64 Auth State (for CI):');
|
|
315
|
+
console.log('========================================');
|
|
316
|
+
console.log(base64);
|
|
317
|
+
console.log('========================================');
|
|
318
|
+
console.log('');
|
|
319
|
+
console.log('Save this to CI secret: AUTH_STATE_' + name.toUpperCase());
|
|
320
|
+
}
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
// Default: create new auth state
|
|
324
|
+
await authMaker.makeAuth({
|
|
325
|
+
name,
|
|
326
|
+
baseURL: options.url,
|
|
327
|
+
loginPath: options.path,
|
|
328
|
+
outputDir: options.output,
|
|
329
|
+
timeout: options.timeout ? parseInt(options.timeout, 10) : undefined,
|
|
330
|
+
navigationTimeout: options.navTimeout ? parseInt(options.navTimeout, 10) : undefined,
|
|
331
|
+
stabilityWait: options.stabilityWait ? parseInt(options.stabilityWait, 10) : undefined,
|
|
332
|
+
headless: options.headless,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
console.error('❌ Auth generation failed:', error);
|
|
337
|
+
process.exit(1);
|
|
338
|
+
}
|
|
339
|
+
});
|
|
189
340
|
// Parse arguments
|
|
190
341
|
await program.parseAsync(process.argv);
|
|
191
342
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data Validator
|
|
3
|
+
* Validates test-data YAML files and checks referenced data paths exist
|
|
4
|
+
*/
|
|
5
|
+
import { ValidationIssue } from './index';
|
|
6
|
+
export declare class DataValidator {
|
|
7
|
+
private screenName;
|
|
8
|
+
private baseDir;
|
|
9
|
+
private dataCache;
|
|
10
|
+
constructor(screenName: string, baseDir?: string);
|
|
11
|
+
/**
|
|
12
|
+
* Validate test-data file for a feature
|
|
13
|
+
*/
|
|
14
|
+
validateFile(featureName: string): {
|
|
15
|
+
errors: ValidationIssue[];
|
|
16
|
+
warnings: ValidationIssue[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Check if data references exist and resolve to primitives
|
|
20
|
+
*/
|
|
21
|
+
validateRefs(featureName: string, refs: Array<{
|
|
22
|
+
ref: string;
|
|
23
|
+
line: number;
|
|
24
|
+
}>, featureFile: string): ValidationIssue[];
|
|
25
|
+
/**
|
|
26
|
+
* Resolve dotted path in data object
|
|
27
|
+
*/
|
|
28
|
+
private resolvePath;
|
|
29
|
+
/**
|
|
30
|
+
* Check if value is a primitive (string, number, boolean)
|
|
31
|
+
*/
|
|
32
|
+
private isPrimitive;
|
|
33
|
+
/**
|
|
34
|
+
* Find test-data file path
|
|
35
|
+
*/
|
|
36
|
+
private findDataPath;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-validator.d.ts","sourceRoot":"","sources":["../../../src/core/validator/data-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAA+B;gBAEpC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAKhD;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;KAAE;IAuD7F;;OAEG;IACH,YAAY,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAC1C,WAAW,EAAE,MAAM,GAClB,eAAe,EAAE;IAoEpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;CAkBrB"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Data Validator
|
|
4
|
+
* Validates test-data YAML files and checks referenced data paths exist
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.DataValidator = void 0;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
47
|
+
class DataValidator {
|
|
48
|
+
constructor(screenName, baseDir) {
|
|
49
|
+
this.dataCache = new Map();
|
|
50
|
+
this.screenName = screenName;
|
|
51
|
+
this.baseDir = baseDir || process.cwd();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validate test-data file for a feature
|
|
55
|
+
*/
|
|
56
|
+
validateFile(featureName) {
|
|
57
|
+
const errors = [];
|
|
58
|
+
const warnings = [];
|
|
59
|
+
const filePath = this.findDataPath(featureName);
|
|
60
|
+
if (!filePath) {
|
|
61
|
+
// Data file is optional - only warn if there are data refs
|
|
62
|
+
return { errors, warnings };
|
|
63
|
+
}
|
|
64
|
+
// Load and parse YAML
|
|
65
|
+
let content;
|
|
66
|
+
let data;
|
|
67
|
+
try {
|
|
68
|
+
content = fs.readFileSync(filePath, 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
errors.push({
|
|
72
|
+
type: 'error',
|
|
73
|
+
code: 'INVALID_YAML_SYNTAX',
|
|
74
|
+
message: `Cannot read file: ${error.message}`,
|
|
75
|
+
file: filePath,
|
|
76
|
+
});
|
|
77
|
+
return { errors, warnings };
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
data = yaml_1.default.parse(content);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
errors.push({
|
|
84
|
+
type: 'error',
|
|
85
|
+
code: 'INVALID_YAML_SYNTAX',
|
|
86
|
+
message: `YAML parse error: ${error.message}`,
|
|
87
|
+
file: filePath,
|
|
88
|
+
});
|
|
89
|
+
return { errors, warnings };
|
|
90
|
+
}
|
|
91
|
+
if (data && typeof data !== 'object') {
|
|
92
|
+
errors.push({
|
|
93
|
+
type: 'error',
|
|
94
|
+
code: 'INVALID_YAML_SYNTAX',
|
|
95
|
+
message: 'Test data file must be a valid YAML object',
|
|
96
|
+
file: filePath,
|
|
97
|
+
});
|
|
98
|
+
return { errors, warnings };
|
|
99
|
+
}
|
|
100
|
+
// Cache for later ref validation
|
|
101
|
+
this.dataCache.set(featureName, data || {});
|
|
102
|
+
return { errors, warnings };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if data references exist and resolve to primitives
|
|
106
|
+
*/
|
|
107
|
+
validateRefs(featureName, refs, featureFile) {
|
|
108
|
+
const errors = [];
|
|
109
|
+
if (refs.length === 0) {
|
|
110
|
+
return errors;
|
|
111
|
+
}
|
|
112
|
+
// Load data if not cached
|
|
113
|
+
if (!this.dataCache.has(featureName)) {
|
|
114
|
+
const filePath = this.findDataPath(featureName);
|
|
115
|
+
if (!filePath) {
|
|
116
|
+
// Data file doesn't exist but we have refs - error
|
|
117
|
+
for (const { ref, line } of refs) {
|
|
118
|
+
errors.push({
|
|
119
|
+
type: 'error',
|
|
120
|
+
code: 'MISSING_DATA_FILE',
|
|
121
|
+
message: `Test data file not found for feature "${featureName}" (needed for {{${ref}}})`,
|
|
122
|
+
file: featureFile,
|
|
123
|
+
line,
|
|
124
|
+
element: ref,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return errors;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
131
|
+
const data = yaml_1.default.parse(content);
|
|
132
|
+
this.dataCache.set(featureName, data || {});
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Error already reported in validateFile
|
|
136
|
+
return errors;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const data = this.dataCache.get(featureName);
|
|
140
|
+
if (!data) {
|
|
141
|
+
return errors;
|
|
142
|
+
}
|
|
143
|
+
// Check each ref
|
|
144
|
+
for (const { ref, line } of refs) {
|
|
145
|
+
const result = this.resolvePath(data, ref);
|
|
146
|
+
if (!result.found) {
|
|
147
|
+
errors.push({
|
|
148
|
+
type: 'error',
|
|
149
|
+
code: 'MISSING_DATA_REF',
|
|
150
|
+
message: `Data {{${ref}}} not found in test-data/${featureName}.yaml (failed at: ${result.failedAt})`,
|
|
151
|
+
file: featureFile,
|
|
152
|
+
line,
|
|
153
|
+
element: ref,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
else if (!this.isPrimitive(result.value)) {
|
|
157
|
+
errors.push({
|
|
158
|
+
type: 'error',
|
|
159
|
+
code: 'INVALID_DATA_VALUE',
|
|
160
|
+
message: `Data {{${ref}}} must resolve to a primitive value, got: ${typeof result.value}`,
|
|
161
|
+
file: featureFile,
|
|
162
|
+
line,
|
|
163
|
+
element: ref,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return errors;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Resolve dotted path in data object
|
|
171
|
+
*/
|
|
172
|
+
resolvePath(data, ref) {
|
|
173
|
+
const parts = ref.split('.');
|
|
174
|
+
let current = data;
|
|
175
|
+
for (const key of parts) {
|
|
176
|
+
if (current && typeof current === 'object' && key in current) {
|
|
177
|
+
current = current[key];
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
return { found: false, failedAt: key };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return { found: true, value: current };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Check if value is a primitive (string, number, boolean)
|
|
187
|
+
*/
|
|
188
|
+
isPrimitive(value) {
|
|
189
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Find test-data file path
|
|
193
|
+
*/
|
|
194
|
+
findDataPath(featureName) {
|
|
195
|
+
const possiblePaths = [
|
|
196
|
+
// New structure
|
|
197
|
+
path.join(this.baseDir, 'qa', 'screens', this.screenName, 'test-data', `${featureName}.yaml`),
|
|
198
|
+
path.join(this.baseDir, 'qa', 'screens', this.screenName, 'test-data', `${featureName}.yml`),
|
|
199
|
+
// Legacy structure
|
|
200
|
+
path.join(this.baseDir, 'qa', 'test-data', `${featureName}.yaml`),
|
|
201
|
+
path.join(this.baseDir, 'qa', 'test-data', `${featureName}.yml`),
|
|
202
|
+
];
|
|
203
|
+
for (const p of possiblePaths) {
|
|
204
|
+
if (fs.existsSync(p)) {
|
|
205
|
+
return p;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.DataValidator = DataValidator;
|
|
212
|
+
//# sourceMappingURL=data-validator.js.map
|