@sudobility/testomniac_runner_service 0.1.66 → 0.1.68
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/analyzer/page-analyzer/generators/content.d.ts.map +1 -1
- package/dist/analyzer/page-analyzer/generators/content.js +4 -2
- package/dist/analyzer/page-analyzer/generators/content.js.map +1 -1
- package/dist/analyzer/page-analyzer/generators/navigation.d.ts.map +1 -1
- package/dist/analyzer/page-analyzer/generators/navigation.js +3 -30
- package/dist/analyzer/page-analyzer/generators/navigation.js.map +1 -1
- package/dist/analyzer/page-analyzer/generators/scaffolds.d.ts.map +1 -1
- package/dist/analyzer/page-analyzer/generators/scaffolds.js +5 -2
- package/dist/analyzer/page-analyzer/generators/scaffolds.js.map +1 -1
- package/dist/analyzer/page-analyzer/index.d.ts.map +1 -1
- package/dist/analyzer/page-analyzer/index.js +94 -20
- package/dist/analyzer/page-analyzer/index.js.map +1 -1
- package/dist/api/client.d.ts +1 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +2 -2
- package/dist/api/client.js.map +1 -1
- package/dist/browser/replay-selector.d.ts +23 -0
- package/dist/browser/replay-selector.d.ts.map +1 -0
- package/dist/browser/replay-selector.js +150 -0
- package/dist/browser/replay-selector.js.map +1 -0
- package/dist/expertise/tester/control-state.d.ts.map +1 -1
- package/dist/expertise/tester/control-state.js +2 -1
- package/dist/expertise/tester/control-state.js.map +1 -1
- package/dist/orchestrator/runner.d.ts +2 -0
- package/dist/orchestrator/runner.d.ts.map +1 -1
- package/dist/orchestrator/runner.js +170 -32
- package/dist/orchestrator/runner.js.map +1 -1
- package/dist/orchestrator/test-interaction-executor.d.ts.map +1 -1
- package/dist/orchestrator/test-interaction-executor.js +148 -4
- package/dist/orchestrator/test-interaction-executor.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,+BAA+B,CACnD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,+BAA+B,CACnD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAmFf"}
|
|
@@ -6,6 +6,7 @@ export async function generateContentTestInteractions(analyzer, context) {
|
|
|
6
6
|
await analyzer.reconcileGeneratedSurfaceElements(context, {
|
|
7
7
|
surfaceTitle,
|
|
8
8
|
desiredKeys: [],
|
|
9
|
+
dependencyTestInteractionId: context.currentTestInteractionId,
|
|
9
10
|
});
|
|
10
11
|
return;
|
|
11
12
|
}
|
|
@@ -28,8 +29,8 @@ export async function generateContentTestInteractions(analyzer, context) {
|
|
|
28
29
|
const desiredKeys = [];
|
|
29
30
|
for (const item of contentItems) {
|
|
30
31
|
const testInteraction = analyzer.shouldUseDirectControlInteraction(item)
|
|
31
|
-
? analyzer.buildControlInteractionTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId)
|
|
32
|
-
: analyzer.buildHoverTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId);
|
|
32
|
+
? analyzer.buildControlInteractionTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId, context.currentTestInteractionId)
|
|
33
|
+
: analyzer.buildHoverTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId, context.currentTestInteractionId);
|
|
33
34
|
desiredKeys.push(analyzer.getGeneratedKey(testInteraction));
|
|
34
35
|
const tc = await api.ensureTestInteraction(runnerId, surface.id, testInteraction, testEnvironmentId);
|
|
35
36
|
await api.createTestInteractionRun({
|
|
@@ -41,6 +42,7 @@ export async function generateContentTestInteractions(analyzer, context) {
|
|
|
41
42
|
surfaceId: surface.id,
|
|
42
43
|
surfaceTitle,
|
|
43
44
|
desiredKeys,
|
|
45
|
+
dependencyTestInteractionId: context.currentTestInteractionId,
|
|
44
46
|
});
|
|
45
47
|
}
|
|
46
48
|
//# sourceMappingURL=content.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/content.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,QAAa,EACb,OAAwB;IAExB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GACnE,OAAO,CAAC;IAEV,MAAM,YAAY,GAAG,QAAQ,CAAC,yBAAyB,CACrD,OAAO,CAAC,eAAe,CAAC,MAAM,CAC5B,CAAC,IAAS,EAAE,EAAE,CACZ,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAC/D,CACF,CAAC;IACF,MAAM,YAAY,GAAG,SAAS,OAAO,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,CAAC,iCAAiC,CAAC,OAAO,EAAE;YACxD,YAAY;YACZ,WAAW,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/content.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,QAAa,EACb,OAAwB;IAExB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GACnE,OAAO,CAAC;IAEV,MAAM,YAAY,GAAG,QAAQ,CAAC,yBAAyB,CACrD,OAAO,CAAC,eAAe,CAAC,MAAM,CAC5B,CAAC,IAAS,EAAE,EAAE,CACZ,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAC/D,CACF,CAAC;IACF,MAAM,YAAY,GAAG,SAAS,OAAO,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,CAAC,iCAAiC,CAAC,OAAO,EAAE;YACxD,YAAY;YACZ,WAAW,EAAE,EAAE;YACf,2BAA2B,EAAE,OAAO,CAAC,wBAAwB;SAC9D,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,iBAAiB,CACzC,QAAQ,EACR;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,6BAA6B,OAAO,CAAC,WAAW,EAAE;QAC/D,mBAAmB,EAAE,OAAO,CAAC,kBAAkB;QAC/C,YAAY,EAAE,OAAO,CAAC,WAAW;QACjC,SAAS;QACT,QAAQ,EAAE,CAAC;QACX,YAAY,EAAE,CAAC,cAAc,CAAC;QAC9B,GAAG;KACJ,EACD,iBAAiB,CAClB,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC;QAClC,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,uBAAuB,CAAC,SAAS,CAAC,mBAAmB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAChD,GAAG,EACH,OAAO,CAAC,EAAE,EACV,SAAS,CAAC,EAAE,CACb,CAAC;IAEF,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,QAAQ,CAAC,iCAAiC,CAAC,IAAI,CAAC;YACtE,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAC7C,IAAI,EACJ,OAAO,CAAC,WAAW,EACnB,SAAS,EACT,GAAG,EACH,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,wBAAwB,CACjC;YACH,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAChC,IAAI,EACJ,OAAO,CAAC,WAAW,EACnB,SAAS,EACT,GAAG,EACH,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,wBAAwB,CACjC,CAAC;QACN,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,qBAAqB,CACxC,QAAQ,EACR,OAAO,CAAC,EAAE,EACV,eAAe,EACf,iBAAiB,CAClB,CAAC;QACF,MAAM,GAAG,CAAC,wBAAwB,CAAC;YACjC,iBAAiB,EAAE,EAAE,CAAC,EAAE;YACxB,gBAAgB,EAAE,UAAU,CAAC,EAAE;SAChC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,CAAC,iCAAiC,CAAC,OAAO,EAAE;QACxD,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,YAAY;QACZ,WAAW;QACX,2BAA2B,EAAE,OAAO,CAAC,wBAAwB;KAC9D,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,kCAAkC,CACtD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,kCAAkC,CACtD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -1,35 +1,8 @@
|
|
|
1
1
|
export async function generateNavigationTestInteractions(analyzer, context) {
|
|
2
|
-
if (context.pageRequiresLogin) {
|
|
3
|
-
await analyzer.reconcileGeneratedSurfaceElements(context, {
|
|
4
|
-
surfaceId: context.navigationSurface.id,
|
|
5
|
-
surfaceTitle: context.navigationSurface.title,
|
|
6
|
-
desiredKeys: [],
|
|
7
|
-
});
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
const { api, runnerId, testEnvironmentId, sizeClass, uid, navigationSurface, bundleRun, } = context;
|
|
11
|
-
const links = analyzer.selectRepresentativeItems(context.actionableItems.filter((item) => item.actionKind === "navigate" && item.href && item.visible));
|
|
12
|
-
await api.ensureBundleSurfaceLink(bundleRun.testSurfaceBundleId, navigationSurface.id);
|
|
13
|
-
const surfaceRun = await analyzer.ensureSurfaceRun(api, navigationSurface.id, bundleRun.id);
|
|
14
|
-
const desiredKeys = [];
|
|
15
|
-
for (const link of links) {
|
|
16
|
-
if (!link.href)
|
|
17
|
-
continue;
|
|
18
|
-
const path = analyzer.extractRelativePath(link.href);
|
|
19
|
-
if (!path)
|
|
20
|
-
continue;
|
|
21
|
-
const testInteraction = analyzer.buildNavigationTestInteraction(path, sizeClass, uid, context.currentPageStateId);
|
|
22
|
-
desiredKeys.push(analyzer.getGeneratedKey(testInteraction));
|
|
23
|
-
const tc = await api.ensureTestInteraction(runnerId, navigationSurface.id, testInteraction, testEnvironmentId);
|
|
24
|
-
await api.createTestInteractionRun({
|
|
25
|
-
testInteractionId: tc.id,
|
|
26
|
-
testSurfaceRunId: surfaceRun.id,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
2
|
await analyzer.reconcileGeneratedSurfaceElements(context, {
|
|
30
|
-
surfaceId: navigationSurface.id,
|
|
31
|
-
surfaceTitle: navigationSurface.title,
|
|
32
|
-
desiredKeys,
|
|
3
|
+
surfaceId: context.navigationSurface.id,
|
|
4
|
+
surfaceTitle: context.navigationSurface.title,
|
|
5
|
+
desiredKeys: [],
|
|
33
6
|
});
|
|
34
7
|
}
|
|
35
8
|
//# sourceMappingURL=navigation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/navigation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,QAAa,EACb,OAAwB;IAExB,
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/navigation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,QAAa,EACb,OAAwB;IAExB,MAAM,QAAQ,CAAC,iCAAiC,CAAC,OAAO,EAAE;QACxD,SAAS,EAAE,OAAO,CAAC,iBAAiB,CAAC,EAAE;QACvC,YAAY,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK;QAC7C,WAAW,EAAE,EAAE;KAChB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffolds.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/scaffolds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"scaffolds.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/scaffolds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CA6Gf"}
|
|
@@ -29,8 +29,8 @@ export async function generateScaffoldTestInteractions(analyzer, context) {
|
|
|
29
29
|
const desiredKeys = [];
|
|
30
30
|
for (const item of scaffoldItems) {
|
|
31
31
|
const testInteraction = analyzer.shouldUseDirectControlInteraction(item)
|
|
32
|
-
? analyzer.buildControlInteractionTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId)
|
|
33
|
-
: analyzer.buildHoverTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId);
|
|
32
|
+
? analyzer.buildControlInteractionTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId, context.currentTestInteractionId)
|
|
33
|
+
: analyzer.buildHoverTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId, context.currentTestInteractionId);
|
|
34
34
|
desiredKeys.push(analyzer.getGeneratedKey(testInteraction));
|
|
35
35
|
const tc = await api.ensureTestInteraction(runnerId, surface.id, testInteraction, testEnvironmentId);
|
|
36
36
|
await api.createTestInteractionRun({
|
|
@@ -43,6 +43,7 @@ export async function generateScaffoldTestInteractions(analyzer, context) {
|
|
|
43
43
|
surfaceId: surface.id,
|
|
44
44
|
surfaceTitle,
|
|
45
45
|
desiredKeys,
|
|
46
|
+
dependencyTestInteractionId: context.currentTestInteractionId,
|
|
46
47
|
});
|
|
47
48
|
}
|
|
48
49
|
const existingSurfaces = await api.getTestSurfacesByRunner(runnerId);
|
|
@@ -52,6 +53,7 @@ export async function generateScaffoldTestInteractions(analyzer, context) {
|
|
|
52
53
|
surfaceId: surface.id,
|
|
53
54
|
surfaceTitle: surface.title,
|
|
54
55
|
desiredKeys: [],
|
|
56
|
+
dependencyTestInteractionId: context.currentTestInteractionId,
|
|
55
57
|
});
|
|
56
58
|
}
|
|
57
59
|
}
|
|
@@ -61,6 +63,7 @@ export async function generateScaffoldTestInteractions(analyzer, context) {
|
|
|
61
63
|
await analyzer.reconcileGeneratedSurfaceElements(context, {
|
|
62
64
|
surfaceTitle,
|
|
63
65
|
desiredKeys,
|
|
66
|
+
dependencyTestInteractionId: context.currentTestInteractionId,
|
|
64
67
|
});
|
|
65
68
|
}
|
|
66
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffolds.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/scaffolds.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,QAAa,EACb,OAAwB;IAExB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GACnE,OAAO,CAAC;IACV,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;IACjD,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEzD,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,aAAa,GAAG,QAAQ,CAAC,yBAAyB,CACtD,QAAQ,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,CACpD,CAAC;QAEF,MAAM,YAAY,GAAG,aAAa,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,oBAAoB,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,iBAAiB,CACzC,QAAQ,EACR;YACE,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,aAAa,QAAQ,CAAC,IAAI,WAAW;YAClD,mBAAmB,EAAE,OAAO,CAAC,kBAAkB;YAC/C,YAAY,EAAE,OAAO,CAAC,WAAW;YACjC,SAAS;YACT,QAAQ,EAAE,CAAC;YACX,YAAY,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC;YACzC,GAAG;SACJ,EACD,iBAAiB,CAClB,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAClC,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,uBAAuB,CAC/B,SAAS,CAAC,mBAAmB,EAC7B,OAAO,CAAC,EAAE,CACX,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAChD,GAAG,EACH,OAAO,CAAC,EAAE,EACV,SAAS,CAAC,EAAE,CACb,CAAC;QAEF,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,eAAe,GAAG,QAAQ,CAAC,iCAAiC,CAAC,IAAI,CAAC;gBACtE,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAC7C,IAAI,EACJ,OAAO,CAAC,WAAW,EACnB,SAAS,EACT,GAAG,EACH,OAAO,CAAC,kBAAkB,
|
|
1
|
+
{"version":3,"file":"scaffolds.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/scaffolds.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzer/page-analyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAQZ,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzer/page-analyzer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PlaywrightAction, ExpectationType, ExpectationSeverity, } from "@sudobility/testomniac_types";
|
|
2
|
+
import { buildReplaySelectorFromActionableItem } from "../../browser/replay-selector";
|
|
2
3
|
import { computeHashes } from "../../browser/page-utils";
|
|
3
4
|
import { createHash } from "node:crypto";
|
|
4
5
|
import { fillValuePlanner } from "../../planners/fill-value-planner";
|
|
@@ -14,6 +15,9 @@ import { generateDialogLifecycleTestInteractions } from "./generators/dialogs";
|
|
|
14
15
|
import { generateKeyboardAndDisclosureTestInteractions } from "./generators/keyboard-disclosure";
|
|
15
16
|
import { generateVariantTestInteractions } from "./generators/variants";
|
|
16
17
|
import { generateContentTestInteractions } from "./generators/content";
|
|
18
|
+
function logAnalyzer(step, details) {
|
|
19
|
+
console.info("[PageAnalyzer]", step, details ?? {});
|
|
20
|
+
}
|
|
17
21
|
/**
|
|
18
22
|
* PageAnalyzer generates expectations and discovers new test elements
|
|
19
23
|
* during discovery mode.
|
|
@@ -59,16 +63,51 @@ export class PageAnalyzer {
|
|
|
59
63
|
* Called AFTER expertises evaluate and the target page state is established.
|
|
60
64
|
*/
|
|
61
65
|
async generateTestInteractions(testInteraction, context) {
|
|
66
|
+
logAnalyzer("generate:start", {
|
|
67
|
+
sourceTitle: testInteraction.title,
|
|
68
|
+
sourceType: testInteraction.type,
|
|
69
|
+
sourcePriority: testInteraction.priority,
|
|
70
|
+
sourceSurfaceTags: testInteraction.surface_tags,
|
|
71
|
+
currentTestInteractionId: context.currentTestInteractionId,
|
|
72
|
+
currentTestSurfaceId: context.currentTestSurfaceId,
|
|
73
|
+
currentSurfaceRunId: context.currentSurfaceRunId ?? null,
|
|
74
|
+
beginningPageStateId: context.beginningPageStateId,
|
|
75
|
+
currentPageStateId: context.currentPageStateId,
|
|
76
|
+
currentPath: context.currentPath,
|
|
77
|
+
actionableItemsCount: context.actionableItems.length,
|
|
78
|
+
formsCount: context.forms.length,
|
|
79
|
+
scaffoldsCount: context.scaffolds.length,
|
|
80
|
+
});
|
|
62
81
|
const normalizedContext = this.normalizeContext(context);
|
|
63
82
|
const currentPageStateId = await this.ensureTargetPageState(normalizedContext);
|
|
64
83
|
const resolvedContext = {
|
|
65
84
|
...normalizedContext,
|
|
66
85
|
currentPageStateId,
|
|
67
86
|
};
|
|
87
|
+
logAnalyzer("generate:resolved-context", {
|
|
88
|
+
sourceTitle: testInteraction.title,
|
|
89
|
+
sourceType: testInteraction.type,
|
|
90
|
+
currentTestInteractionId: resolvedContext.currentTestInteractionId,
|
|
91
|
+
currentTestSurfaceId: resolvedContext.currentTestSurfaceId,
|
|
92
|
+
currentSurfaceRunId: resolvedContext.currentSurfaceRunId ?? null,
|
|
93
|
+
beginningPageStateId: resolvedContext.beginningPageStateId,
|
|
94
|
+
currentPageStateId: resolvedContext.currentPageStateId,
|
|
95
|
+
currentPath: resolvedContext.currentPath,
|
|
96
|
+
});
|
|
68
97
|
if (this.isHoverOnly(testInteraction)) {
|
|
98
|
+
logAnalyzer("generate:hover-only", {
|
|
99
|
+
sourceTitle: testInteraction.title,
|
|
100
|
+
currentTestInteractionId: resolvedContext.currentTestInteractionId,
|
|
101
|
+
currentPageStateId: resolvedContext.currentPageStateId,
|
|
102
|
+
});
|
|
69
103
|
await generateHoverFollowUpCases(this, testInteraction, resolvedContext);
|
|
70
104
|
return;
|
|
71
105
|
}
|
|
106
|
+
logAnalyzer("generate:full-pass", {
|
|
107
|
+
sourceTitle: testInteraction.title,
|
|
108
|
+
currentTestInteractionId: resolvedContext.currentTestInteractionId,
|
|
109
|
+
currentPageStateId: resolvedContext.currentPageStateId,
|
|
110
|
+
});
|
|
72
111
|
await generateRenderTestInteractions(this, resolvedContext);
|
|
73
112
|
await generateFormTestInteractions(this, resolvedContext);
|
|
74
113
|
await generateSemanticJourneyTestInteractions(this, resolvedContext);
|
|
@@ -84,8 +123,15 @@ export class PageAnalyzer {
|
|
|
84
123
|
const surface = params.surfaceId != null
|
|
85
124
|
? { id: params.surfaceId, title: params.surfaceTitle }
|
|
86
125
|
: await this.findExistingSurfaceByTitle(context, params.surfaceTitle);
|
|
87
|
-
if (!surface)
|
|
126
|
+
if (!surface) {
|
|
127
|
+
logAnalyzer("reconcile:surface-missing", {
|
|
128
|
+
requestedSurfaceId: params.surfaceId ?? null,
|
|
129
|
+
requestedSurfaceTitle: params.surfaceTitle,
|
|
130
|
+
dependencyTestInteractionId: params.dependencyTestInteractionId ?? null,
|
|
131
|
+
desiredKeysCount: params.desiredKeys.length,
|
|
132
|
+
});
|
|
88
133
|
return;
|
|
134
|
+
}
|
|
89
135
|
const existing = await context.api.getTestInteractionsByTestSurface(surface.id, true);
|
|
90
136
|
const desiredKeys = new Set(params.desiredKeys.map(key => key.trim()).filter(Boolean));
|
|
91
137
|
const obsoleteIds = existing
|
|
@@ -104,9 +150,22 @@ export class PageAnalyzer {
|
|
|
104
150
|
return !existingKey || !desiredKeys.has(existingKey);
|
|
105
151
|
})
|
|
106
152
|
.map(testInteraction => testInteraction.id);
|
|
153
|
+
logAnalyzer("reconcile:evaluated", {
|
|
154
|
+
surfaceId: surface.id,
|
|
155
|
+
surfaceTitle: surface.title,
|
|
156
|
+
dependencyTestInteractionId: params.dependencyTestInteractionId ?? null,
|
|
157
|
+
desiredKeysCount: desiredKeys.size,
|
|
158
|
+
existingCount: existing.length,
|
|
159
|
+
obsoleteIds,
|
|
160
|
+
});
|
|
107
161
|
if (obsoleteIds.length === 0)
|
|
108
162
|
return;
|
|
109
163
|
await context.api.retireTestInteractions(obsoleteIds);
|
|
164
|
+
logAnalyzer("reconcile:retired", {
|
|
165
|
+
surfaceId: surface.id,
|
|
166
|
+
surfaceTitle: surface.title,
|
|
167
|
+
obsoleteIds,
|
|
168
|
+
});
|
|
110
169
|
}
|
|
111
170
|
async findExistingSurfaceByTitle(context, title) {
|
|
112
171
|
const surfaces = await context.api.getTestSurfacesByRunner(context.runnerId);
|
|
@@ -125,12 +184,23 @@ export class PageAnalyzer {
|
|
|
125
184
|
const openSurfaceRuns = await api.getOpenTestSurfaceRuns(bundleRunId);
|
|
126
185
|
const existing = openSurfaceRuns.find(surfaceRun => surfaceRun.testSurfaceId === testSurfaceId);
|
|
127
186
|
if (existing) {
|
|
187
|
+
logAnalyzer("surface-run:reused", {
|
|
188
|
+
bundleRunId,
|
|
189
|
+
testSurfaceId,
|
|
190
|
+
surfaceRunId: existing.id,
|
|
191
|
+
});
|
|
128
192
|
return existing;
|
|
129
193
|
}
|
|
130
|
-
|
|
194
|
+
const created = await api.createTestSurfaceRun({
|
|
131
195
|
testSurfaceId,
|
|
132
196
|
testSurfaceBundleRunId: bundleRunId,
|
|
133
197
|
});
|
|
198
|
+
logAnalyzer("surface-run:created", {
|
|
199
|
+
bundleRunId,
|
|
200
|
+
testSurfaceId,
|
|
201
|
+
surfaceRunId: created.id,
|
|
202
|
+
});
|
|
203
|
+
return created;
|
|
134
204
|
}
|
|
135
205
|
isMouseActionable(item) {
|
|
136
206
|
return (item.visible &&
|
|
@@ -180,12 +250,13 @@ export class PageAnalyzer {
|
|
|
180
250
|
}
|
|
181
251
|
buildHoverTestInteraction(item, startingPath, sizeClass, uid, startingPageStateId, dependencyTestInteractionId) {
|
|
182
252
|
const label = this.describeActionableItem(item);
|
|
253
|
+
const replaySelector = buildReplaySelectorFromActionableItem(item);
|
|
183
254
|
return {
|
|
184
255
|
title: `Hover over ${label}`,
|
|
185
256
|
type: "interaction",
|
|
186
257
|
sizeClass,
|
|
187
258
|
surface_tags: ["interaction", "hover"],
|
|
188
|
-
priority:
|
|
259
|
+
priority: 1,
|
|
189
260
|
dependencyTestInteractionId,
|
|
190
261
|
startingPageStateId,
|
|
191
262
|
startingPath,
|
|
@@ -193,8 +264,8 @@ export class PageAnalyzer {
|
|
|
193
264
|
{
|
|
194
265
|
action: {
|
|
195
266
|
actionType: PlaywrightAction.Hover,
|
|
196
|
-
path:
|
|
197
|
-
playwrightCode: `await page.hover('${
|
|
267
|
+
path: replaySelector,
|
|
268
|
+
playwrightCode: `await page.hover('${replaySelector}')`,
|
|
198
269
|
description: `Hover over ${label}`,
|
|
199
270
|
},
|
|
200
271
|
expectations: [],
|
|
@@ -209,6 +280,7 @@ export class PageAnalyzer {
|
|
|
209
280
|
}
|
|
210
281
|
buildClickTestInteraction(item, startingPath, sizeClass, uid, startingPageStateId, dependencyTestInteractionId) {
|
|
211
282
|
const label = this.describeActionableItem(item);
|
|
283
|
+
const replaySelector = buildReplaySelectorFromActionableItem(item);
|
|
212
284
|
return {
|
|
213
285
|
title: `Click ${label}`,
|
|
214
286
|
type: "interaction",
|
|
@@ -222,8 +294,8 @@ export class PageAnalyzer {
|
|
|
222
294
|
{
|
|
223
295
|
action: {
|
|
224
296
|
actionType: PlaywrightAction.Click,
|
|
225
|
-
path:
|
|
226
|
-
playwrightCode: `await page.click('${
|
|
297
|
+
path: replaySelector,
|
|
298
|
+
playwrightCode: `await page.click('${replaySelector}')`,
|
|
227
299
|
description: `Click ${label}`,
|
|
228
300
|
},
|
|
229
301
|
expectations: [],
|
|
@@ -1776,8 +1848,9 @@ export class PageAnalyzer {
|
|
|
1776
1848
|
inputType === "radio" ||
|
|
1777
1849
|
inputType === "checkbox");
|
|
1778
1850
|
}
|
|
1779
|
-
buildControlInteractionTestInteraction(item, startingPath, sizeClass, uid, startingPageStateId) {
|
|
1851
|
+
buildControlInteractionTestInteraction(item, startingPath, sizeClass, uid, startingPageStateId, dependencyTestInteractionId) {
|
|
1780
1852
|
const label = this.describeActionableItem(item);
|
|
1853
|
+
const replaySelector = buildReplaySelectorFromActionableItem(item);
|
|
1781
1854
|
const role = (item.role ?? "").toLowerCase();
|
|
1782
1855
|
const inputType = (item.inputType ?? "").toLowerCase();
|
|
1783
1856
|
const isTab = role === "tab";
|
|
@@ -1797,38 +1870,38 @@ export class PageAnalyzer {
|
|
|
1797
1870
|
const isImmutable = this.looksVisuallyDisabledButEnabled(item);
|
|
1798
1871
|
let actionType = PlaywrightAction.Click;
|
|
1799
1872
|
let actionValue;
|
|
1800
|
-
let playwrightCode = `await page.click('${
|
|
1873
|
+
let playwrightCode = `await page.click('${replaySelector}')`;
|
|
1801
1874
|
let description = `${isTab ? "Select" : "Activate"} ${label}`;
|
|
1802
1875
|
if (isFillControl) {
|
|
1803
1876
|
actionType = PlaywrightAction.Type;
|
|
1804
1877
|
actionValue = plannedValue;
|
|
1805
|
-
playwrightCode = `await page.locator('${
|
|
1878
|
+
playwrightCode = `await page.locator('${replaySelector}').type('${this.escapeSingleQuotes(plannedValue ?? "")}')`;
|
|
1806
1879
|
description = `Type into ${label}`;
|
|
1807
1880
|
}
|
|
1808
1881
|
else if (isSelectControl) {
|
|
1809
1882
|
actionType = PlaywrightAction.SelectOption;
|
|
1810
1883
|
actionValue = plannedValue;
|
|
1811
|
-
playwrightCode = `await page.locator('${
|
|
1884
|
+
playwrightCode = `await page.locator('${replaySelector}').selectOption('${this.escapeSingleQuotes(plannedValue ?? "")}')`;
|
|
1812
1885
|
description = `Select ${label}`;
|
|
1813
1886
|
}
|
|
1814
1887
|
else if (isRadioControl) {
|
|
1815
1888
|
actionType = PlaywrightAction.Click;
|
|
1816
|
-
playwrightCode = `await page.click('${
|
|
1889
|
+
playwrightCode = `await page.click('${replaySelector}')`;
|
|
1817
1890
|
description = `Select ${label}`;
|
|
1818
1891
|
}
|
|
1819
1892
|
const expectations = isImmutable
|
|
1820
|
-
? this.buildImmutableControlExpectations(item, label)
|
|
1893
|
+
? this.buildImmutableControlExpectations(item, label, replaySelector)
|
|
1821
1894
|
: expectsInputValue
|
|
1822
1895
|
? [
|
|
1823
1896
|
this.makeExpectation(ExpectationType.InputValue, `${description} should update the control value`, {
|
|
1824
|
-
targetPath:
|
|
1897
|
+
targetPath: replaySelector,
|
|
1825
1898
|
expectedValue: plannedValue,
|
|
1826
1899
|
}),
|
|
1827
1900
|
]
|
|
1828
1901
|
: expectsChecked
|
|
1829
1902
|
? [
|
|
1830
1903
|
this.makeExpectation(ExpectationType.ElementChecked, `${label} should react to user input`, {
|
|
1831
|
-
targetPath:
|
|
1904
|
+
targetPath: replaySelector,
|
|
1832
1905
|
}),
|
|
1833
1906
|
]
|
|
1834
1907
|
: [];
|
|
@@ -1842,13 +1915,14 @@ export class PageAnalyzer {
|
|
|
1842
1915
|
role || inputType || item.actionKind || "control",
|
|
1843
1916
|
],
|
|
1844
1917
|
priority: 3,
|
|
1918
|
+
dependencyTestInteractionId,
|
|
1845
1919
|
startingPageStateId,
|
|
1846
1920
|
startingPath,
|
|
1847
1921
|
steps: [
|
|
1848
1922
|
{
|
|
1849
1923
|
action: {
|
|
1850
1924
|
actionType,
|
|
1851
|
-
path:
|
|
1925
|
+
path: replaySelector,
|
|
1852
1926
|
value: actionValue,
|
|
1853
1927
|
playwrightCode,
|
|
1854
1928
|
description,
|
|
@@ -1862,16 +1936,16 @@ export class PageAnalyzer {
|
|
|
1862
1936
|
? `${label} should remain non-interactive despite appearing disabled`
|
|
1863
1937
|
: `${label} should react without runtime errors`),
|
|
1864
1938
|
uid,
|
|
1865
|
-
generatedKey: this.buildGeneratedKey("control", startingPageStateId, isImmutable ? "immutable" : "enabled", role || inputType || item.actionKind || "control", item.stableKey ?? item.selector ?? label),
|
|
1939
|
+
generatedKey: this.buildGeneratedKey("control", startingPageStateId, dependencyTestInteractionId, isImmutable ? "immutable" : "enabled", role || inputType || item.actionKind || "control", item.stableKey ?? item.selector ?? label),
|
|
1866
1940
|
};
|
|
1867
1941
|
}
|
|
1868
|
-
buildImmutableControlExpectations(item, label) {
|
|
1942
|
+
buildImmutableControlExpectations(item, label, replaySelector) {
|
|
1869
1943
|
const role = (item.role ?? "").toLowerCase();
|
|
1870
1944
|
const inputType = (item.inputType ?? "").toLowerCase();
|
|
1871
1945
|
if (item.actionKind === "fill" || item.actionKind === "select") {
|
|
1872
1946
|
return [
|
|
1873
1947
|
this.makeExpectation(ExpectationType.InputValue, `${label} should not respond to user input while it appears disabled`, {
|
|
1874
|
-
targetPath:
|
|
1948
|
+
targetPath: replaySelector,
|
|
1875
1949
|
expectNoChange: true,
|
|
1876
1950
|
}),
|
|
1877
1951
|
];
|
|
@@ -1885,7 +1959,7 @@ export class PageAnalyzer {
|
|
|
1885
1959
|
item.actionKind === "radio_select") {
|
|
1886
1960
|
return [
|
|
1887
1961
|
this.makeExpectation(ExpectationType.ElementChecked, `${label} should not change state while it appears disabled`, {
|
|
1888
|
-
targetPath:
|
|
1962
|
+
targetPath: replaySelector,
|
|
1889
1963
|
expectNoChange: true,
|
|
1890
1964
|
}),
|
|
1891
1965
|
];
|