@sudobility/testomniac_runner_service 0.1.70 → 0.1.71
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/hover-follow-up.d.ts.map +1 -1
- package/dist/analyzer/page-analyzer/generators/hover-follow-up.js +19 -0
- package/dist/analyzer/page-analyzer/generators/hover-follow-up.js.map +1 -1
- package/dist/analyzer/page-analyzer/generators/navigation.d.ts +1 -1
- package/dist/analyzer/page-analyzer/generators/navigation.d.ts.map +1 -1
- package/dist/analyzer/page-analyzer/generators/navigation.js +5 -6
- package/dist/analyzer/page-analyzer/generators/navigation.js.map +1 -1
- package/dist/analyzer/page-analyzer/index.d.ts +5 -0
- package/dist/analyzer/page-analyzer/index.d.ts.map +1 -1
- package/dist/analyzer/page-analyzer/index.js +135 -16
- package/dist/analyzer/page-analyzer/index.js.map +1 -1
- package/dist/api/client.d.ts +2 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +11 -1
- package/dist/api/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/runner.d.ts.map +1 -1
- package/dist/orchestrator/runner.js +34 -11
- package/dist/orchestrator/runner.js.map +1 -1
- package/dist/orchestrator/test-interaction-executor.d.ts +1 -0
- package/dist/orchestrator/test-interaction-executor.d.ts.map +1 -1
- package/dist/orchestrator/test-interaction-executor.js +51 -4
- package/dist/orchestrator/test-interaction-executor.js.map +1 -1
- package/dist/orchestrator/types.d.ts +1 -0
- package/dist/orchestrator/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover-follow-up.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/hover-follow-up.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,GAAG,EACb,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"hover-follow-up.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/hover-follow-up.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,GAAG,EACb,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CA8Jf"}
|
|
@@ -62,6 +62,25 @@ export async function generateHoverFollowUpCases(analyzer, testInteraction, cont
|
|
|
62
62
|
});
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
|
+
// Skip follow-up generation if this page path was already generated for in
|
|
66
|
+
// this run (the analyzer instance tracks covered paths per run)
|
|
67
|
+
const currentPath = context.currentPath.trim();
|
|
68
|
+
const pageAlreadyCovered = analyzer.hasGeneratedForPath(currentPath);
|
|
69
|
+
if (pageAlreadyCovered) {
|
|
70
|
+
console.info("[PageAnalyzer][hover-follow-up] page-already-covered", {
|
|
71
|
+
testInteractionId: context.currentTestInteractionId,
|
|
72
|
+
sourceTitle: testInteraction.title,
|
|
73
|
+
currentPath,
|
|
74
|
+
currentPageStateId: context.currentPageStateId,
|
|
75
|
+
});
|
|
76
|
+
await analyzer.reconcileGeneratedSurfaceElements(context, {
|
|
77
|
+
surfaceId: context.currentTestSurfaceId,
|
|
78
|
+
surfaceTitle: "",
|
|
79
|
+
desiredKeys: [],
|
|
80
|
+
dependencyTestInteractionId: context.currentTestInteractionId,
|
|
81
|
+
});
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
65
84
|
console.info("[PageAnalyzer][hover-follow-up] generating-hover-follow-ups", {
|
|
66
85
|
testInteractionId: context.currentTestInteractionId,
|
|
67
86
|
sourceTitle: testInteraction.title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover-follow-up.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/hover-follow-up.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hover-follow-up.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/hover-follow-up.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { AnalyzerContext } from "../types";
|
|
2
|
-
export declare function generateNavigationTestInteractions(
|
|
2
|
+
export declare function generateNavigationTestInteractions(_analyzer: any, _context: AnalyzerContext): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=navigation.d.ts.map
|
|
@@ -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,
|
|
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,SAAS,EAAE,GAAG,EACd,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
export async function generateNavigationTestInteractions(
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
});
|
|
1
|
+
export async function generateNavigationTestInteractions(_analyzer, _context) {
|
|
2
|
+
// Navigation surface is managed externally (scan bootstrap + auto-created
|
|
3
|
+
// navigations from hover-click discovery). Do not reconcile — reconciling
|
|
4
|
+
// with desiredKeys: [] would retire auto-created navigation interactions
|
|
5
|
+
// before the runner can execute them.
|
|
7
6
|
}
|
|
8
7
|
//# 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,
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/navigation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,SAAc,EACd,QAAyB;IAEzB,0EAA0E;IAC1E,0EAA0E;IAC1E,yEAAyE;IACzE,sCAAsC;AACxC,CAAC"}
|
|
@@ -13,6 +13,10 @@ type AppendActionResult = {
|
|
|
13
13
|
* during discovery mode.
|
|
14
14
|
*/
|
|
15
15
|
export declare class PageAnalyzer {
|
|
16
|
+
/** Paths for which full generation has already run in this test-run. */
|
|
17
|
+
private generatedPaths;
|
|
18
|
+
/** Check whether generation already happened for a given path in this run. */
|
|
19
|
+
hasGeneratedForPath(path: string): boolean;
|
|
16
20
|
/**
|
|
17
21
|
* Generate baseline expectations for a test element.
|
|
18
22
|
* Called BEFORE expertises evaluate.
|
|
@@ -40,6 +44,7 @@ export declare class PageAnalyzer {
|
|
|
40
44
|
private buildHoverTestInteraction;
|
|
41
45
|
private buildClickTestInteraction;
|
|
42
46
|
private isHoverOnly;
|
|
47
|
+
private isHoverBased;
|
|
43
48
|
private getPrimarySelector;
|
|
44
49
|
private getItemKey;
|
|
45
50
|
withGeneratedKey(testInteraction: GeneratedTestInteraction, ...parts: Array<string | number | null | undefined>): GeneratedTestInteraction;
|
|
@@ -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,6 +1,7 @@
|
|
|
1
1
|
import { PlaywrightAction, ExpectationType, ExpectationSeverity, } from "@sudobility/testomniac_types";
|
|
2
2
|
import { buildReplaySelectorFromActionableItem, matchesActionableItemSelector, } from "../../browser/replay-selector";
|
|
3
|
-
import { computeHashes } from "../../browser/page-utils";
|
|
3
|
+
import { computeHashes, sha256, normalizeHtml } from "../../browser/page-utils";
|
|
4
|
+
import { getBody, getContentBody } from "../../scanner/html-decomposer";
|
|
4
5
|
import { createHash } from "node:crypto";
|
|
5
6
|
import { fillValuePlanner } from "../../planners/fill-value-planner";
|
|
6
7
|
import { AUTH_URL_PATTERNS, SIGNUP_URL_PATTERNS } from "../../config/constants";
|
|
@@ -23,6 +24,12 @@ function logAnalyzer(step, details) {
|
|
|
23
24
|
* during discovery mode.
|
|
24
25
|
*/
|
|
25
26
|
export class PageAnalyzer {
|
|
27
|
+
/** Paths for which full generation has already run in this test-run. */
|
|
28
|
+
generatedPaths = new Set();
|
|
29
|
+
/** Check whether generation already happened for a given path in this run. */
|
|
30
|
+
hasGeneratedForPath(path) {
|
|
31
|
+
return this.generatedPaths.has(path);
|
|
32
|
+
}
|
|
26
33
|
/**
|
|
27
34
|
* Generate baseline expectations for a test element.
|
|
28
35
|
* Called BEFORE expertises evaluate.
|
|
@@ -91,10 +98,30 @@ export class PageAnalyzer {
|
|
|
91
98
|
hasCurrentHoveredItem: Boolean(currentHoveredItem),
|
|
92
99
|
hasStableHoveredItem: Boolean(stableHoveredItem),
|
|
93
100
|
});
|
|
94
|
-
if (!stableHoveredItem
|
|
101
|
+
if (!stableHoveredItem) {
|
|
95
102
|
return { testInteraction, appended: false };
|
|
96
103
|
}
|
|
97
|
-
|
|
104
|
+
// Prefer currentHoveredItem (ActionableItem); fall back to converting
|
|
105
|
+
// the ActionableItemResponse from beginning page state.
|
|
106
|
+
const fallback = stableHoveredItem;
|
|
107
|
+
const clickItem = currentHoveredItem ?? {
|
|
108
|
+
stableKey: fallback.stableKey ?? fallback.selector ?? "",
|
|
109
|
+
selector: fallback.selector ?? "",
|
|
110
|
+
tagName: fallback.tagName ?? "",
|
|
111
|
+
role: fallback.role ?? undefined,
|
|
112
|
+
inputType: undefined,
|
|
113
|
+
actionKind: fallback.actionKind ?? "click",
|
|
114
|
+
accessibleName: fallback.accessibleName ?? undefined,
|
|
115
|
+
textContent: undefined,
|
|
116
|
+
href: undefined,
|
|
117
|
+
disabled: fallback.disabled ?? false,
|
|
118
|
+
visible: fallback.visible ?? true,
|
|
119
|
+
attributes: (typeof fallback.attributesJson === "object" &&
|
|
120
|
+
fallback.attributesJson !== null
|
|
121
|
+
? fallback.attributesJson
|
|
122
|
+
: {}),
|
|
123
|
+
};
|
|
124
|
+
const clickStep = this.buildClickTestInteraction(clickItem, context.currentPath, context.sizeClass, context.uid, testInteraction.startingPageStateId, undefined).steps?.[0] ?? null;
|
|
98
125
|
if (!clickStep) {
|
|
99
126
|
return { testInteraction, appended: false };
|
|
100
127
|
}
|
|
@@ -105,7 +132,7 @@ export class PageAnalyzer {
|
|
|
105
132
|
clickStep,
|
|
106
133
|
],
|
|
107
134
|
};
|
|
108
|
-
await context.api.ensureTestInteraction(context.runnerId, context.currentTestSurfaceId, updatedInteraction, context.testEnvironmentId);
|
|
135
|
+
await context.api.ensureTestInteraction(context.runnerId, context.currentTestSurfaceId, updatedInteraction, context.testEnvironmentId, context.currentTestInteractionId);
|
|
109
136
|
logAnalyzer("generate:hover-inline-click-appended", {
|
|
110
137
|
sourceTitle: testInteraction.title,
|
|
111
138
|
currentTestInteractionId: context.currentTestInteractionId,
|
|
@@ -163,21 +190,71 @@ export class PageAnalyzer {
|
|
|
163
190
|
await generateHoverFollowUpCases(this, testInteraction, resolvedContext);
|
|
164
191
|
return;
|
|
165
192
|
}
|
|
193
|
+
// Skip generation if we already generated tests for this path during this
|
|
194
|
+
// run. The check is scoped to the PageAnalyzer instance (one per run) so
|
|
195
|
+
// previous runs on the same runner don't block re-discovery.
|
|
196
|
+
const currentPath = resolvedContext.currentPath.trim();
|
|
197
|
+
if (this.generatedPaths.has(currentPath)) {
|
|
198
|
+
logAnalyzer("generate:page-already-covered", {
|
|
199
|
+
sourceTitle: testInteraction.title,
|
|
200
|
+
currentTestInteractionId: resolvedContext.currentTestInteractionId,
|
|
201
|
+
currentPageStateId: resolvedContext.currentPageStateId,
|
|
202
|
+
currentPath,
|
|
203
|
+
});
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
this.generatedPaths.add(currentPath);
|
|
207
|
+
// If a hover+click navigated to a new page, create a direct navigation
|
|
208
|
+
// interaction and use it as the dependency instead of the hover chain
|
|
209
|
+
let contextForFullPass = resolvedContext;
|
|
210
|
+
const normalizedStartingPath = (testInteraction.startingPath || "/").trim();
|
|
211
|
+
if (this.isHoverBased(testInteraction) &&
|
|
212
|
+
normalizedStartingPath !== currentPath) {
|
|
213
|
+
const navInteraction = this.buildNavigationTestInteraction(currentPath, resolvedContext.sizeClass, resolvedContext.uid, resolvedContext.currentPageStateId > 0
|
|
214
|
+
? resolvedContext.currentPageStateId
|
|
215
|
+
: undefined);
|
|
216
|
+
const navSurfaceId = resolvedContext.navigationSurface.id;
|
|
217
|
+
const saved = await resolvedContext.api.ensureTestInteraction(resolvedContext.runnerId, navSurfaceId, navInteraction, resolvedContext.testEnvironmentId);
|
|
218
|
+
// Also create a run for it so the runner can execute it
|
|
219
|
+
const surfaceRuns = await resolvedContext.api.getOpenTestSurfaceRuns(resolvedContext.bundleRun.id);
|
|
220
|
+
const navSurfaceRun = surfaceRuns.find(sr => sr.testSurfaceId === navSurfaceId);
|
|
221
|
+
if (navSurfaceRun) {
|
|
222
|
+
try {
|
|
223
|
+
await resolvedContext.api.createTestInteractionRun({
|
|
224
|
+
testInteractionId: saved.id,
|
|
225
|
+
testSurfaceRunId: navSurfaceRun.id,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// Run may already exist
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
logAnalyzer("generate:navigation-dependency-created", {
|
|
233
|
+
sourceTitle: testInteraction.title,
|
|
234
|
+
navigationInteractionId: saved.id,
|
|
235
|
+
navigationPath: currentPath,
|
|
236
|
+
originalDependencyId: resolvedContext.currentTestInteractionId,
|
|
237
|
+
});
|
|
238
|
+
contextForFullPass = {
|
|
239
|
+
...resolvedContext,
|
|
240
|
+
currentTestInteractionId: saved.id,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
166
243
|
logAnalyzer("generate:full-pass", {
|
|
167
244
|
sourceTitle: testInteraction.title,
|
|
168
|
-
currentTestInteractionId:
|
|
169
|
-
currentPageStateId:
|
|
245
|
+
currentTestInteractionId: contextForFullPass.currentTestInteractionId,
|
|
246
|
+
currentPageStateId: contextForFullPass.currentPageStateId,
|
|
170
247
|
});
|
|
171
|
-
await generateRenderTestInteractions(this,
|
|
172
|
-
await generateFormTestInteractions(this,
|
|
173
|
-
await generateSemanticJourneyTestInteractions(this,
|
|
174
|
-
await generateE2ETestInteractions(this,
|
|
175
|
-
await generateDialogLifecycleTestInteractions(this,
|
|
176
|
-
await generateScaffoldTestInteractions(this,
|
|
177
|
-
await generateContentTestInteractions(this,
|
|
178
|
-
await generateKeyboardAndDisclosureTestInteractions(this,
|
|
179
|
-
await generateVariantTestInteractions(this,
|
|
180
|
-
await generateNavigationTestInteractions(this,
|
|
248
|
+
await generateRenderTestInteractions(this, contextForFullPass);
|
|
249
|
+
await generateFormTestInteractions(this, contextForFullPass);
|
|
250
|
+
await generateSemanticJourneyTestInteractions(this, contextForFullPass);
|
|
251
|
+
await generateE2ETestInteractions(this, contextForFullPass);
|
|
252
|
+
await generateDialogLifecycleTestInteractions(this, contextForFullPass);
|
|
253
|
+
await generateScaffoldTestInteractions(this, contextForFullPass);
|
|
254
|
+
await generateContentTestInteractions(this, contextForFullPass);
|
|
255
|
+
await generateKeyboardAndDisclosureTestInteractions(this, contextForFullPass);
|
|
256
|
+
await generateVariantTestInteractions(this, contextForFullPass);
|
|
257
|
+
await generateNavigationTestInteractions(this, contextForFullPass);
|
|
181
258
|
}
|
|
182
259
|
async reconcileGeneratedSurfaceElements(context, params) {
|
|
183
260
|
const surface = params.surfaceId != null
|
|
@@ -375,6 +452,13 @@ export class PageAnalyzer {
|
|
|
375
452
|
return (steps.length === 1 &&
|
|
376
453
|
steps[0]?.action?.actionType === PlaywrightAction.Hover);
|
|
377
454
|
}
|
|
455
|
+
isHoverBased(testInteraction) {
|
|
456
|
+
const steps = Array.isArray(testInteraction.steps)
|
|
457
|
+
? testInteraction.steps
|
|
458
|
+
: [];
|
|
459
|
+
return (steps.length > 0 &&
|
|
460
|
+
steps[0]?.action?.actionType === PlaywrightAction.Hover);
|
|
461
|
+
}
|
|
378
462
|
getPrimarySelector(testInteraction) {
|
|
379
463
|
const steps = Array.isArray(testInteraction.steps)
|
|
380
464
|
? testInteraction.steps
|
|
@@ -467,6 +551,25 @@ export class PageAnalyzer {
|
|
|
467
551
|
await this.ensureStoredForms(existing.id, context);
|
|
468
552
|
return existing.id;
|
|
469
553
|
}
|
|
554
|
+
// Fallback: match by content minus scaffolds (e.g., cookie banner
|
|
555
|
+
// presence/absence should not create a different page state)
|
|
556
|
+
if (context.scaffolds.length > 0) {
|
|
557
|
+
const body = getBody(context.html);
|
|
558
|
+
const { contentBody } = getContentBody(body, context.scaffolds);
|
|
559
|
+
const contentBodyHash = await sha256(normalizeHtml(contentBody));
|
|
560
|
+
const existingByContent = await context.api.findMatchingPageStateByContentBody(context.pageId, contentBodyHash, context.sizeClass);
|
|
561
|
+
if (existingByContent) {
|
|
562
|
+
if (scaffoldIdsBySelector.size > 0) {
|
|
563
|
+
await context.api.linkPageStateScaffolds(existingByContent.id, Array.from(new Set(scaffoldIdsBySelector.values())));
|
|
564
|
+
}
|
|
565
|
+
context.events.onPageStateCreated({
|
|
566
|
+
pageStateId: existingByContent.id,
|
|
567
|
+
pageId: context.pageId,
|
|
568
|
+
});
|
|
569
|
+
await this.ensureStoredForms(existingByContent.id, context);
|
|
570
|
+
return existingByContent.id;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
470
573
|
const contentHash = createHash("sha256").update(context.html).digest("hex");
|
|
471
574
|
const contentElement = await context.api.findOrCreateHtmlElement(context.html, contentHash);
|
|
472
575
|
await context.api.insertActionableItems(contentElement.id, context.actionableItems);
|
|
@@ -477,6 +580,22 @@ export class PageAnalyzer {
|
|
|
477
580
|
contentText: context.html.slice(0, 5000),
|
|
478
581
|
contentHtmlElementId: contentElement.id,
|
|
479
582
|
});
|
|
583
|
+
// Store content-body hash (HTML minus scaffolds) for fallback matching
|
|
584
|
+
if (context.scaffolds.length > 0) {
|
|
585
|
+
const body = getBody(context.html);
|
|
586
|
+
const { contentBody } = getContentBody(body, context.scaffolds);
|
|
587
|
+
const contentBodyHash = await sha256(normalizeHtml(contentBody));
|
|
588
|
+
try {
|
|
589
|
+
await context.api.updatePageStateDecomposedHashes(pageState.id, {
|
|
590
|
+
fixedBodyHash: contentBodyHash,
|
|
591
|
+
scaffoldsHash: "",
|
|
592
|
+
patternsHash: "",
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
catch {
|
|
596
|
+
// Best effort — decomposed hashes are optional
|
|
597
|
+
}
|
|
598
|
+
}
|
|
480
599
|
context.events.onPageStateCreated({
|
|
481
600
|
pageStateId: pageState.id,
|
|
482
601
|
pageId: context.pageId,
|