@sun-asterisk/sungen 2.6.4 → 2.6.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.
- package/dist/cli/index.js +1 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.js +26 -3
- package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/index.ts +1 -1
- package/src/generators/test-generator/patterns/navigation-patterns.ts +28 -3
package/dist/cli/index.js
CHANGED
|
@@ -20,7 +20,7 @@ async function main() {
|
|
|
20
20
|
program
|
|
21
21
|
.name('sungen')
|
|
22
22
|
.description('Deterministic E2E Test Compiler — Gherkin + Selectors → Playwright')
|
|
23
|
-
.version('2.6.
|
|
23
|
+
.version('2.6.5');
|
|
24
24
|
// Global options
|
|
25
25
|
program
|
|
26
26
|
.option('-v, --verbose', 'Enable verbose logging');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-patterns.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"navigation-patterns.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,EAoI3C,CAAC"}
|
|
@@ -11,18 +11,33 @@ exports.navigationPatterns = [
|
|
|
11
11
|
matcher: (step) => (step.text.includes('open') || step.text.includes('opens') || step.text.includes('is on') || step.text.includes('navigate to')) &&
|
|
12
12
|
step.elementType === 'page',
|
|
13
13
|
resolver: (step, context) => {
|
|
14
|
-
|
|
14
|
+
const isThen = context.effectiveKeyword === 'Then';
|
|
15
|
+
// Cross-screen page refs (e.g. Then User is on [dashboard] page) won't be in the
|
|
16
|
+
// current screen's selectors. Fall back to /<ref>/ for assertion paths instead of
|
|
17
|
+
// the current featurePath, which would silently make the assertion always pass.
|
|
18
|
+
const pathFallback = isThen && step.selectorRef
|
|
19
|
+
? `/${step.selectorRef}/`
|
|
20
|
+
: (context.featurePath || '/');
|
|
21
|
+
let path = pathFallback;
|
|
15
22
|
if (step.selectorRef) {
|
|
16
23
|
try {
|
|
17
24
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef, context.featureName, step.elementType, step.nth);
|
|
18
|
-
path = resolved.value ||
|
|
25
|
+
path = resolved.value || pathFallback;
|
|
19
26
|
}
|
|
20
27
|
catch (error) {
|
|
21
|
-
path =
|
|
28
|
+
path = pathFallback;
|
|
22
29
|
}
|
|
23
30
|
}
|
|
24
31
|
const finalPath = (0, path_inference_1.resolvePathVariables)(path, context.scenarioSteps || []);
|
|
25
32
|
const isAbsoluteUrl = /^https?:\/\//.test(finalPath);
|
|
33
|
+
// Then User is on [X] page — assert URL, don't navigate.
|
|
34
|
+
if (isThen) {
|
|
35
|
+
return {
|
|
36
|
+
templateName: 'route-assertion',
|
|
37
|
+
data: { path: finalPath },
|
|
38
|
+
comment: step.selectorRef ? `Assert on ${step.selectorRef} page` : `Assert page route`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
26
41
|
return {
|
|
27
42
|
templateName: 'navigation',
|
|
28
43
|
data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: finalPath },
|
|
@@ -62,6 +77,7 @@ exports.navigationPatterns = [
|
|
|
62
77
|
!!(step.selectorRef || step.dataRef),
|
|
63
78
|
resolver: (step, context) => {
|
|
64
79
|
const route = step.selectorRef || step.dataRef;
|
|
80
|
+
const isThen = context.effectiveKeyword === 'Then';
|
|
65
81
|
const inferredPath = (0, path_inference_1.inferPath)(context.featurePath, {
|
|
66
82
|
featureName: context.featureName,
|
|
67
83
|
screenName: context.screenName,
|
|
@@ -70,6 +86,13 @@ exports.navigationPatterns = [
|
|
|
70
86
|
const pathCode = (0, path_inference_1.getPathCode)(resolvedPath);
|
|
71
87
|
const cleanPath = pathCode.replace(/^['`]|['`]$/g, '');
|
|
72
88
|
const isAbsoluteUrl = /^https?:\/\//.test(cleanPath);
|
|
89
|
+
if (isThen) {
|
|
90
|
+
return {
|
|
91
|
+
templateName: 'route-assertion',
|
|
92
|
+
data: { path: cleanPath },
|
|
93
|
+
comment: `Assert on ${route}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
73
96
|
return {
|
|
74
97
|
templateName: 'navigation',
|
|
75
98
|
data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: cleanPath },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":";;;AAEA,4DAAuF;AAEvF;;GAEG;AACU,QAAA,kBAAkB,GAAkB;IAC/C;QACE,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE,CAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC/H,IAAI,CAAC,WAAW,KAAK,MAAM;QAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1B,IAAI,IAAI,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"navigation-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/navigation-patterns.ts"],"names":[],"mappings":";;;AAEA,4DAAuF;AAEvF;;GAEG;AACU,QAAA,kBAAkB,GAAkB;IAC/C;QACE,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE,CAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC/H,IAAI,CAAC,WAAW,KAAK,MAAM;QAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,KAAK,MAAM,CAAC;YACnD,iFAAiF;YACjF,kFAAkF;YAClF,gFAAgF;YAChF,MAAM,YAAY,GAAG,MAAM,IAAI,IAAI,CAAC,WAAW;gBAC7C,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG;gBACzB,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;YACjC,IAAI,IAAI,GAAG,YAAY,CAAC;YAExB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,eAAe,CACvD,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAClE,CAAC;oBACF,IAAI,GAAG,QAAQ,CAAC,KAAK,IAAI,YAAY,CAAC;gBACxC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,GAAG,YAAY,CAAC;gBACtB,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,IAAA,qCAAoB,EAAC,IAAI,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YAC1E,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAErD,yDAAyD;YACzD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO;oBACL,YAAY,EAAE,iBAAiB;oBAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBACzB,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,WAAW,OAAO,CAAC,CAAC,CAAC,mBAAmB;iBACvF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,YAAY,EAAE,YAAY;gBAC1B,IAAI,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC/E,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,WAAW,OAAO,CAAC,CAAC,CAAC,kBAAkB;aACjF,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,EAAE;KACb;IACD;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE,CAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,WAAW,KAAK,MAAM;QAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAEnD,MAAM,YAAY,GAAG,IAAA,0BAAS,EAAC,OAAO,CAAC,WAAW,EAAE;gBAClD,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,IAAA,qCAAoB,EAAC,YAAY,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YACrF,MAAM,QAAQ,GAAG,IAAA,4BAAW,EAAC,YAAY,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAErD,OAAO;gBACL,YAAY,EAAE,YAAY;gBAC1B,IAAI,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC/E,OAAO,EAAE,QAAQ,QAAQ,EAAE;aAC5B,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,EAAE;KACb;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE,CAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACxG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC;QACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,KAAK,MAAM,CAAC;YAEnD,MAAM,YAAY,GAAG,IAAA,0BAAS,EAAC,OAAO,CAAC,WAAW,EAAE;gBAClD,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,IAAA,qCAAoB,EAAC,YAAY,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YACrF,MAAM,QAAQ,GAAG,IAAA,4BAAW,EAAC,YAAY,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAErD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO;oBACL,YAAY,EAAE,iBAAiB;oBAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBACzB,OAAO,EAAE,aAAa,KAAK,EAAE;iBAC9B,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,YAAY,EAAE,YAAY;gBAC1B,IAAI,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC/E,OAAO,EAAE,eAAe,KAAK,EAAE;aAChC,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,EAAE;KACb;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE,CAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC;QACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC;YAE/C,MAAM,YAAY,GAAG,IAAA,0BAAS,EAAC,OAAO,CAAC,WAAW,EAAE;gBAClD,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,IAAA,qCAAoB,EAAC,YAAY,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YACrF,MAAM,QAAQ,GAAG,IAAA,4BAAW,EAAC,YAAY,CAAC,CAAC;YAE3C,OAAO;gBACL,YAAY,EAAE,iBAAiB;gBAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE;gBACpD,OAAO,EAAE,2BAA2B,KAAK,EAAE;aAC5C,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,EAAE;KACb;CACF,CAAC"}
|
package/package.json
CHANGED
package/src/cli/index.ts
CHANGED
|
@@ -12,22 +12,38 @@ export const navigationPatterns: StepPattern[] = [
|
|
|
12
12
|
(step.text.includes('open') || step.text.includes('opens') || step.text.includes('is on') || step.text.includes('navigate to')) &&
|
|
13
13
|
step.elementType === 'page',
|
|
14
14
|
resolver: (step, context) => {
|
|
15
|
-
|
|
15
|
+
const isThen = context.effectiveKeyword === 'Then';
|
|
16
|
+
// Cross-screen page refs (e.g. Then User is on [dashboard] page) won't be in the
|
|
17
|
+
// current screen's selectors. Fall back to /<ref>/ for assertion paths instead of
|
|
18
|
+
// the current featurePath, which would silently make the assertion always pass.
|
|
19
|
+
const pathFallback = isThen && step.selectorRef
|
|
20
|
+
? `/${step.selectorRef}/`
|
|
21
|
+
: (context.featurePath || '/');
|
|
22
|
+
let path = pathFallback;
|
|
16
23
|
|
|
17
24
|
if (step.selectorRef) {
|
|
18
25
|
try {
|
|
19
26
|
const resolved = context.selectorResolver.resolveSelector(
|
|
20
27
|
step.selectorRef, context.featureName, step.elementType, step.nth
|
|
21
28
|
);
|
|
22
|
-
path = resolved.value ||
|
|
29
|
+
path = resolved.value || pathFallback;
|
|
23
30
|
} catch (error) {
|
|
24
|
-
path =
|
|
31
|
+
path = pathFallback;
|
|
25
32
|
}
|
|
26
33
|
}
|
|
27
34
|
|
|
28
35
|
const finalPath = resolvePathVariables(path, context.scenarioSteps || []);
|
|
29
36
|
const isAbsoluteUrl = /^https?:\/\//.test(finalPath);
|
|
30
37
|
|
|
38
|
+
// Then User is on [X] page — assert URL, don't navigate.
|
|
39
|
+
if (isThen) {
|
|
40
|
+
return {
|
|
41
|
+
templateName: 'route-assertion',
|
|
42
|
+
data: { path: finalPath },
|
|
43
|
+
comment: step.selectorRef ? `Assert on ${step.selectorRef} page` : `Assert page route`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
31
47
|
return {
|
|
32
48
|
templateName: 'navigation',
|
|
33
49
|
data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: finalPath },
|
|
@@ -71,6 +87,7 @@ export const navigationPatterns: StepPattern[] = [
|
|
|
71
87
|
!!(step.selectorRef || step.dataRef),
|
|
72
88
|
resolver: (step, context) => {
|
|
73
89
|
const route = step.selectorRef || step.dataRef;
|
|
90
|
+
const isThen = context.effectiveKeyword === 'Then';
|
|
74
91
|
|
|
75
92
|
const inferredPath = inferPath(context.featurePath, {
|
|
76
93
|
featureName: context.featureName,
|
|
@@ -81,6 +98,14 @@ export const navigationPatterns: StepPattern[] = [
|
|
|
81
98
|
const cleanPath = pathCode.replace(/^['`]|['`]$/g, '');
|
|
82
99
|
const isAbsoluteUrl = /^https?:\/\//.test(cleanPath);
|
|
83
100
|
|
|
101
|
+
if (isThen) {
|
|
102
|
+
return {
|
|
103
|
+
templateName: 'route-assertion',
|
|
104
|
+
data: { path: cleanPath },
|
|
105
|
+
comment: `Assert on ${route}`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
84
109
|
return {
|
|
85
110
|
templateName: 'navigation',
|
|
86
111
|
data: { baseURL: isAbsoluteUrl ? undefined : context.baseURL, path: cleanPath },
|