@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.
Files changed (29) hide show
  1. package/dist/analyzer/page-analyzer/generators/hover-follow-up.d.ts.map +1 -1
  2. package/dist/analyzer/page-analyzer/generators/hover-follow-up.js +19 -0
  3. package/dist/analyzer/page-analyzer/generators/hover-follow-up.js.map +1 -1
  4. package/dist/analyzer/page-analyzer/generators/navigation.d.ts +1 -1
  5. package/dist/analyzer/page-analyzer/generators/navigation.d.ts.map +1 -1
  6. package/dist/analyzer/page-analyzer/generators/navigation.js +5 -6
  7. package/dist/analyzer/page-analyzer/generators/navigation.js.map +1 -1
  8. package/dist/analyzer/page-analyzer/index.d.ts +5 -0
  9. package/dist/analyzer/page-analyzer/index.d.ts.map +1 -1
  10. package/dist/analyzer/page-analyzer/index.js +135 -16
  11. package/dist/analyzer/page-analyzer/index.js.map +1 -1
  12. package/dist/api/client.d.ts +2 -1
  13. package/dist/api/client.d.ts.map +1 -1
  14. package/dist/api/client.js +11 -1
  15. package/dist/api/client.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/orchestrator/runner.d.ts.map +1 -1
  21. package/dist/orchestrator/runner.js +34 -11
  22. package/dist/orchestrator/runner.js.map +1 -1
  23. package/dist/orchestrator/test-interaction-executor.d.ts +1 -0
  24. package/dist/orchestrator/test-interaction-executor.d.ts.map +1 -1
  25. package/dist/orchestrator/test-interaction-executor.js +51 -4
  26. package/dist/orchestrator/test-interaction-executor.js.map +1 -1
  27. package/dist/orchestrator/types.d.ts +1 -0
  28. package/dist/orchestrator/types.d.ts.map +1 -1
  29. 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,CA0If"}
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(analyzer: any, context: AnalyzerContext): Promise<void>;
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,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAMf"}
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(analyzer, context) {
2
- await analyzer.reconcileGeneratedSurfaceElements(context, {
3
- surfaceId: context.navigationSurface.id,
4
- surfaceTitle: context.navigationSurface.title,
5
- desiredKeys: [],
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,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
+ {"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":"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"}
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 || !currentHoveredItem || revealedItems.length > 0) {
101
+ if (!stableHoveredItem) {
95
102
  return { testInteraction, appended: false };
96
103
  }
97
- const clickStep = this.buildClickTestInteraction(currentHoveredItem, context.currentPath, context.sizeClass, context.uid, testInteraction.startingPageStateId, undefined).steps?.[0] ?? null;
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: resolvedContext.currentTestInteractionId,
169
- currentPageStateId: resolvedContext.currentPageStateId,
245
+ currentTestInteractionId: contextForFullPass.currentTestInteractionId,
246
+ currentPageStateId: contextForFullPass.currentPageStateId,
170
247
  });
171
- await generateRenderTestInteractions(this, resolvedContext);
172
- await generateFormTestInteractions(this, resolvedContext);
173
- await generateSemanticJourneyTestInteractions(this, resolvedContext);
174
- await generateE2ETestInteractions(this, resolvedContext);
175
- await generateDialogLifecycleTestInteractions(this, resolvedContext);
176
- await generateScaffoldTestInteractions(this, resolvedContext);
177
- await generateContentTestInteractions(this, resolvedContext);
178
- await generateKeyboardAndDisclosureTestInteractions(this, resolvedContext);
179
- await generateVariantTestInteractions(this, resolvedContext);
180
- await generateNavigationTestInteractions(this, resolvedContext);
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,