@sudobility/testomniac_runner_service 0.1.36 → 0.1.37

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 (56) hide show
  1. package/dist/api/client.d.ts +60 -1
  2. package/dist/api/client.d.ts.map +1 -1
  3. package/dist/api/client.js +21 -2
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/crawler/link-extractor.d.ts +8 -0
  6. package/dist/crawler/link-extractor.d.ts.map +1 -0
  7. package/dist/crawler/link-extractor.js +37 -0
  8. package/dist/crawler/link-extractor.js.map +1 -0
  9. package/dist/crawler/url-normalizer.d.ts +4 -0
  10. package/dist/crawler/url-normalizer.d.ts.map +1 -0
  11. package/dist/crawler/url-normalizer.js +27 -0
  12. package/dist/crawler/url-normalizer.js.map +1 -0
  13. package/dist/expertise/accessibility-expertise.d.ts +11 -0
  14. package/dist/expertise/accessibility-expertise.d.ts.map +1 -0
  15. package/dist/expertise/accessibility-expertise.js +131 -0
  16. package/dist/expertise/accessibility-expertise.js.map +1 -0
  17. package/dist/expertise/content-expertise.d.ts +10 -0
  18. package/dist/expertise/content-expertise.d.ts.map +1 -0
  19. package/dist/expertise/content-expertise.js +102 -0
  20. package/dist/expertise/content-expertise.js.map +1 -0
  21. package/dist/expertise/index.d.ts +3 -0
  22. package/dist/expertise/index.d.ts.map +1 -1
  23. package/dist/expertise/index.js +9 -4
  24. package/dist/expertise/index.js.map +1 -1
  25. package/dist/expertise/ui-expertise.d.ts +10 -0
  26. package/dist/expertise/ui-expertise.d.ts.map +1 -0
  27. package/dist/expertise/ui-expertise.js +76 -0
  28. package/dist/expertise/ui-expertise.js.map +1 -0
  29. package/dist/orchestrator/decomposition.d.ts.map +1 -1
  30. package/dist/orchestrator/decomposition.js +300 -65
  31. package/dist/orchestrator/decomposition.js.map +1 -1
  32. package/dist/orchestrator/direct-navigation.d.ts +4 -0
  33. package/dist/orchestrator/direct-navigation.d.ts.map +1 -0
  34. package/dist/orchestrator/direct-navigation.js +47 -0
  35. package/dist/orchestrator/direct-navigation.js.map +1 -0
  36. package/dist/orchestrator/discovery.d.ts +10 -0
  37. package/dist/orchestrator/discovery.d.ts.map +1 -0
  38. package/dist/orchestrator/discovery.js +77 -0
  39. package/dist/orchestrator/discovery.js.map +1 -0
  40. package/dist/orchestrator/expertise.d.ts +5 -0
  41. package/dist/orchestrator/expertise.d.ts.map +1 -0
  42. package/dist/orchestrator/expertise.js +157 -0
  43. package/dist/orchestrator/expertise.js.map +1 -0
  44. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  45. package/dist/orchestrator/orchestrator.js +63 -37
  46. package/dist/orchestrator/orchestrator.js.map +1 -1
  47. package/dist/orchestrator/page-capture.d.ts +22 -0
  48. package/dist/orchestrator/page-capture.d.ts.map +1 -0
  49. package/dist/orchestrator/page-capture.js +102 -0
  50. package/dist/orchestrator/page-capture.js.map +1 -0
  51. package/dist/orchestrator/test-execution.d.ts.map +1 -1
  52. package/dist/orchestrator/test-execution.js +17 -32
  53. package/dist/orchestrator/test-execution.js.map +1 -1
  54. package/dist/orchestrator/types.d.ts +10 -0
  55. package/dist/orchestrator/types.d.ts.map +1 -1
  56. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expertise/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,IAAI,eAAe,EAAE;QACrB,IAAI,YAAY,EAAE;QAClB,IAAI,iBAAiB,EAAE;QACvB,IAAI,oBAAoB,EAAE;QAC1B,IAAI,aAAa,CAAC,SAAS,CAAC;QAC5B,IAAI,aAAa,CAAC,IAAI,CAAC;QACvB,IAAI,aAAa,CAAC,eAAe,CAAC;KACnC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expertise/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,IAAI,eAAe,EAAE;QACrB,IAAI,YAAY,EAAE;QAClB,IAAI,iBAAiB,EAAE;QACvB,IAAI,oBAAoB,EAAE;QAC1B,IAAI,gBAAgB,EAAE;QACtB,IAAI,WAAW,EAAE;QACjB,IAAI,sBAAsB,EAAE;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Expertise, ExpertiseContext, Outcome } from "./types";
2
+ export declare class UiExpertise implements Expertise {
3
+ name: string;
4
+ evaluate(context: ExpertiseContext): Outcome[];
5
+ private checkMainLandmark;
6
+ private checkScaffoldConsistency;
7
+ private checkActiveErrorPatterns;
8
+ private checkInteractiveDensity;
9
+ }
10
+ //# sourceMappingURL=ui-expertise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-expertise.d.ts","sourceRoot":"","sources":["../../src/expertise/ui-expertise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEpE,qBAAa,WAAY,YAAW,SAAS;IAC3C,IAAI,SAAQ;IAEZ,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,EAAE;IAW9C,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,wBAAwB;IAmBhC,OAAO,CAAC,wBAAwB;IAoBhC,OAAO,CAAC,uBAAuB;CAqBhC"}
@@ -0,0 +1,76 @@
1
+ export class UiExpertise {
2
+ name = "ui";
3
+ evaluate(context) {
4
+ const outcomes = [];
5
+ outcomes.push(this.checkMainLandmark(context.html));
6
+ outcomes.push(this.checkScaffoldConsistency(context));
7
+ outcomes.push(this.checkActiveErrorPatterns(context));
8
+ outcomes.push(this.checkInteractiveDensity(context.html));
9
+ return outcomes;
10
+ }
11
+ checkMainLandmark(html) {
12
+ const hasMain = /<main\b/i.test(html) || /\brole=["']main["']/i.test(html);
13
+ if (!hasMain) {
14
+ return {
15
+ expected: "Page should expose a main content landmark",
16
+ observed: 'No <main> element or role="main" landmark detected',
17
+ result: "warning",
18
+ };
19
+ }
20
+ return {
21
+ expected: "Page should expose a main content landmark",
22
+ observed: "Main content landmark detected",
23
+ result: "pass",
24
+ };
25
+ }
26
+ checkScaffoldConsistency(context) {
27
+ const topMenus = context.scaffolds.filter(item => item.type === "topMenu");
28
+ const footers = context.scaffolds.filter(item => item.type === "footer");
29
+ if (topMenus.length > 1 || footers.length > 1) {
30
+ return {
31
+ expected: "Shared page scaffolds should not be duplicated",
32
+ observed: `Detected ${topMenus.length} top menu(s) and ${footers.length} footer(s)`,
33
+ result: "warning",
34
+ };
35
+ }
36
+ return {
37
+ expected: "Shared page scaffolds should not be duplicated",
38
+ observed: `Detected ${topMenus.length} top menu(s) and ${footers.length} footer(s)`,
39
+ result: "pass",
40
+ };
41
+ }
42
+ checkActiveErrorPatterns(context) {
43
+ const errorPattern = context.patterns.find(pattern => pattern.type === "errorMessage" || pattern.type === "alert");
44
+ if (errorPattern && errorPattern.count > 0) {
45
+ return {
46
+ expected: "Page should not load with visible error UI",
47
+ observed: `Detected ${errorPattern.count} ${errorPattern.type} pattern(s)`,
48
+ result: "warning",
49
+ };
50
+ }
51
+ return {
52
+ expected: "Page should not load with visible error UI",
53
+ observed: "No error or alert patterns detected on initial render",
54
+ result: "pass",
55
+ };
56
+ }
57
+ checkInteractiveDensity(html) {
58
+ const controls = (html.match(/<button\b/gi) ?? []).length +
59
+ (html.match(/<a\b[^>]*href=/gi) ?? []).length +
60
+ (html.match(/<input\b/gi) ?? []).length +
61
+ (html.match(/<select\b/gi) ?? []).length;
62
+ if (controls === 0) {
63
+ return {
64
+ expected: "Page should expose at least one interactive control",
65
+ observed: "No links, buttons, inputs, or selects were detected",
66
+ result: "warning",
67
+ };
68
+ }
69
+ return {
70
+ expected: "Page should expose at least one interactive control",
71
+ observed: `Detected ${controls} interactive control(s) in the HTML`,
72
+ result: "pass",
73
+ };
74
+ }
75
+ }
76
+ //# sourceMappingURL=ui-expertise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-expertise.js","sourceRoot":"","sources":["../../src/expertise/ui-expertise.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"decomposition.d.ts","sourceRoot":"","sources":["../../src/orchestrator/decomposition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAY5D;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,wBAAwB,EAC7B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CA4LnB"}
1
+ {"version":3,"file":"decomposition.d.ts","sourceRoot":"","sources":["../../src/orchestrator/decomposition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAmP5D;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,wBAAwB,EAC7B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CAmTnB"}
@@ -1,7 +1,177 @@
1
1
  import { extractActionableItems } from "../extractors";
2
- import { detectScaffoldRegions } from "../scanner/component-detector";
2
+ import { computeDecomposedHashes } from "../browser/page-utils";
3
+ import { detectScaffoldRegions, } from "../scanner/component-detector";
4
+ import { getBody, getContentBody, getFixedBody, } from "../scanner/html-decomposer";
5
+ import { detectPatternsWithInstances } from "../scanner/pattern-detector";
6
+ import { toRelativePath } from "../crawler/url-normalizer";
3
7
  import { PlaywrightAction, ExpectationType, ExpectationSeverity, } from "../domain/types";
4
8
  const LOG = (...args) => console.warn("[decomposition]", ...args);
9
+ function inferFillValue(item) {
10
+ const inputType = (item.inputType || "").toLowerCase();
11
+ const label = `${item.accessibleName || ""} ${item.textContent || ""}`.toLowerCase();
12
+ if (inputType === "email" || label.includes("email")) {
13
+ return "testomniac@example.com";
14
+ }
15
+ if (inputType === "tel" || label.includes("phone")) {
16
+ return "4155550100";
17
+ }
18
+ if (inputType === "number") {
19
+ return "1";
20
+ }
21
+ if (inputType === "search" || label.includes("search")) {
22
+ return "test";
23
+ }
24
+ if (inputType === "url" ||
25
+ label.includes("url") ||
26
+ label.includes("website")) {
27
+ return "https://example.com";
28
+ }
29
+ if (inputType === "password") {
30
+ return "Testomniac123!";
31
+ }
32
+ return "Testomniac";
33
+ }
34
+ async function resolveSelectValue(adapter, selector) {
35
+ return adapter.evaluate((...args) => {
36
+ const targetSelector = args[0];
37
+ try {
38
+ const select = document.querySelector(targetSelector);
39
+ if (!(select instanceof HTMLSelectElement)) {
40
+ return null;
41
+ }
42
+ const options = Array.from(select.options).filter(option => !option.disabled);
43
+ const preferred = options.find(option => option.value && option.value !== select.value) ||
44
+ options.find(option => option.value) ||
45
+ options.find(option => option.textContent?.trim());
46
+ return preferred?.value || null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }, selector);
52
+ }
53
+ async function buildGeneratedTestCase(adapter, item, pageStateId) {
54
+ const actionKind = item.actionKind || "click";
55
+ const label = item.accessibleName ||
56
+ item.tagName ||
57
+ item.selector?.slice(0, 30) ||
58
+ "element";
59
+ let actionType;
60
+ let playwrightAction;
61
+ let playwrightCode;
62
+ let value;
63
+ if (actionKind === "navigate" || actionKind === "click") {
64
+ actionType = "click";
65
+ playwrightAction = PlaywrightAction.Click;
66
+ playwrightCode = `await page.click('${item.selector.replace(/'/g, "\\'")}');`;
67
+ }
68
+ else if (actionKind === "fill") {
69
+ actionType = "fill";
70
+ playwrightAction = PlaywrightAction.Fill;
71
+ value = inferFillValue(item);
72
+ playwrightCode = `await page.fill('${item.selector.replace(/'/g, "\\'")}', '${value.replace(/'/g, "\\'")}');`;
73
+ }
74
+ else if (actionKind === "select") {
75
+ actionType = "select";
76
+ playwrightAction = PlaywrightAction.SelectOption;
77
+ value = (await resolveSelectValue(adapter, item.selector)) ?? undefined;
78
+ if (!value) {
79
+ return null;
80
+ }
81
+ playwrightCode = `await page.selectOption('${item.selector.replace(/'/g, "\\'")}', '${value.replace(/'/g, "\\'")}');`;
82
+ }
83
+ else if (actionKind === "radio_select") {
84
+ actionType = "radio_select";
85
+ playwrightAction = PlaywrightAction.Click;
86
+ playwrightCode = `await page.click('${item.selector.replace(/'/g, "\\'")}');`;
87
+ }
88
+ else {
89
+ actionType = "click";
90
+ playwrightAction = PlaywrightAction.Click;
91
+ playwrightCode = `await page.click('${item.selector.replace(/'/g, "\\'")}');`;
92
+ }
93
+ const steps = [
94
+ {
95
+ action: {
96
+ actionType: playwrightAction,
97
+ pageStateId,
98
+ path: item.selector,
99
+ value,
100
+ playwrightCode,
101
+ description: `${actionType} on ${label}`,
102
+ },
103
+ expectations: [
104
+ {
105
+ expectationType: ExpectationType.NoConsoleErrors,
106
+ severity: ExpectationSeverity.ShouldPass,
107
+ description: "No console errors after interaction",
108
+ playwrightCode: "expect(consoleErrors).toHaveLength(0);",
109
+ },
110
+ ],
111
+ description: `${actionType} on ${label}`,
112
+ continueOnFailure: false,
113
+ },
114
+ ];
115
+ return {
116
+ title: `${actionType}: ${label}`,
117
+ actionType,
118
+ item,
119
+ steps,
120
+ };
121
+ }
122
+ async function classifyItemsByScaffold(adapter, items, scaffolds) {
123
+ if (items.length === 0 || scaffolds.length === 0) {
124
+ return { pageItems: items, scaffoldItems: new Map() };
125
+ }
126
+ const assignments = await adapter.evaluate((...args) => {
127
+ const selectors = args[0];
128
+ const scaffoldSelectors = args[1];
129
+ return selectors.map(selector => {
130
+ try {
131
+ const el = document.querySelector(selector);
132
+ if (!el)
133
+ return null;
134
+ for (const scaffold of scaffoldSelectors) {
135
+ try {
136
+ const scaffoldEl = document.querySelector(scaffold.selector);
137
+ if (scaffoldEl &&
138
+ (el === scaffoldEl || scaffoldEl.contains(el))) {
139
+ return scaffold.scaffoldId;
140
+ }
141
+ }
142
+ catch {
143
+ // Ignore invalid scaffold selector.
144
+ }
145
+ }
146
+ }
147
+ catch {
148
+ // Ignore invalid item selector.
149
+ }
150
+ return null;
151
+ });
152
+ }, items.map(item => item.selector), scaffolds.map(scaffold => ({
153
+ scaffoldId: scaffold.scaffoldId,
154
+ selector: scaffold.selector,
155
+ })));
156
+ const scaffoldItems = new Map();
157
+ const pageItems = [];
158
+ for (const [index, item] of items.entries()) {
159
+ const scaffoldId = assignments[index];
160
+ if (typeof scaffoldId === "number") {
161
+ const existing = scaffoldItems.get(scaffoldId) ?? [];
162
+ existing.push(item);
163
+ scaffoldItems.set(scaffoldId, existing);
164
+ }
165
+ else {
166
+ pageItems.push(item);
167
+ }
168
+ }
169
+ return { pageItems, scaffoldItems };
170
+ }
171
+ function findExistingSuiteId(suites, scaffoldId) {
172
+ const suite = suites.find(item => item.scaffoldId === scaffoldId);
173
+ return suite?.id ?? null;
174
+ }
5
175
  /**
6
176
  * Process a decomposition job: extract actionable items from the live page
7
177
  * and generate click/hover test cases. Returns created test case IDs.
@@ -18,7 +188,14 @@ export async function processDecompositionJob(job, adapter, config, api, events)
18
188
  throw new Error(`Page ${pageState.pageId} not found`);
19
189
  }
20
190
  LOG(`Page found: relativePath=${page.relativePath}`);
191
+ const targetUrl = new URL(page.relativePath, config.baseUrl).toString();
192
+ const currentUrl = await adapter.getUrl();
193
+ if (toRelativePath(currentUrl) !== toRelativePath(targetUrl)) {
194
+ LOG(`Navigating to ${targetUrl} for decomposition job ${job.id}`);
195
+ await adapter.goto(targetUrl, { waitUntil: "networkidle0" });
196
+ }
21
197
  // Extract actionable items from the live page
198
+ const currentHtml = await adapter.content();
22
199
  const items = await extractActionableItems(adapter);
23
200
  LOG(`Extracted ${items.length} actionable items:`, items.map(i => ({
24
201
  selector: i.selector?.slice(0, 60),
@@ -33,6 +210,7 @@ export async function processDecompositionJob(job, adapter, config, api, events)
33
210
  const scaffolds = await detectScaffoldRegions(adapter);
34
211
  LOG(`Detected ${scaffolds.length} scaffolds:`, scaffolds.map(s => ({ type: s.type, selector: s.selector })));
35
212
  // Persist scaffolds and link to page state
213
+ const persistedScaffolds = [];
36
214
  if (scaffolds.length > 0) {
37
215
  const scaffoldIds = [];
38
216
  for (const scaffold of scaffolds) {
@@ -44,6 +222,7 @@ export async function processDecompositionJob(job, adapter, config, api, events)
44
222
  html: scaffold.outerHtml,
45
223
  });
46
224
  scaffoldIds.push(saved.id);
225
+ persistedScaffolds.push({ ...scaffold, scaffoldId: saved.id });
47
226
  LOG(`Scaffold saved: type=${scaffold.type} id=${saved.id}`);
48
227
  }
49
228
  catch (err) {
@@ -60,6 +239,23 @@ export async function processDecompositionJob(job, adapter, config, api, events)
60
239
  }
61
240
  }
62
241
  }
242
+ const patterns = await detectPatternsWithInstances(adapter);
243
+ const bodyHtml = getBody(currentHtml);
244
+ const { contentBody } = getContentBody(bodyHtml, scaffolds);
245
+ const patternInstances = patterns.flatMap(pattern => pattern.instances);
246
+ const { fixedBody } = getFixedBody(contentBody, patternInstances);
247
+ const decomposedHashes = await computeDecomposedHashes(fixedBody, scaffolds, patterns);
248
+ const existingDecomposedState = await api.findMatchingPageStateDecomposed(page.id, decomposedHashes, config.sizeClass);
249
+ await api.updatePageStateDecomposedHashes(pageState.id, decomposedHashes);
250
+ await api.insertPageStatePatterns(pageState.id, patterns.map(pattern => ({
251
+ type: pattern.type,
252
+ selector: pattern.selector,
253
+ count: pattern.count,
254
+ })));
255
+ if (existingDecomposedState && existingDecomposedState.id !== pageState.id) {
256
+ LOG(`Skipping decomposition for pageState ${pageState.id}; matched existing decomposed state ${existingDecomposedState.id}`);
257
+ return [];
258
+ }
63
259
  // Filter to visible, enabled, interactive items
64
260
  const interactiveItems = items.filter(i => i.visible && !i.disabled && i.selector);
65
261
  LOG(`${interactiveItems.length} items after filtering (visible, enabled, has selector)`);
@@ -67,84 +263,56 @@ export async function processDecompositionJob(job, adapter, config, api, events)
67
263
  LOG("No interactive items found — skipping decomposition");
68
264
  return [];
69
265
  }
70
- // Create a test suite for this decomposition job
71
- const suite = await api.insertTestSuite(config.runnerId, {
72
- title: `Page State #${job.pageStateId}`,
73
- description: `Auto-generated test suite for page state ${job.pageStateId} on ${page.relativePath}`,
74
- startingPageStateId: job.pageStateId,
75
- startingPath: page.relativePath,
76
- sizeClass: config.sizeClass,
77
- priority: 3,
78
- suite_tags: ["auto-generated"],
79
- decompositionJobId: job.id,
80
- });
81
- LOG(`Created test suite: id=${suite.id}, title=${suite.title}`);
82
- events.onTestSuiteCreated({ suiteId: suite.id, title: suite.title });
266
+ const { pageItems, scaffoldItems } = await classifyItemsByScaffold(adapter, interactiveItems, persistedScaffolds);
267
+ LOG(`Classified ${pageItems.length} page items and ${Array.from(scaffoldItems.values()).reduce((count, value) => count + value.length, 0)} scaffold items`);
268
+ const existingSuites = await api.getTestSuitesByRunner(config.runnerId);
269
+ const existingCases = await api.getTestCasesByRunner(config.runnerId);
270
+ let pageSuiteId = null;
83
271
  // Generate one test case per actionable item (cap at 20 to avoid explosion)
84
- const maxItems = Math.min(interactiveItems.length, 20);
85
272
  const createdIds = [];
86
- for (let i = 0; i < maxItems; i++) {
87
- const item = interactiveItems[i];
88
- const actionKind = item.actionKind || "click";
89
- const label = item.accessibleName ||
90
- item.tagName ||
91
- item.selector?.slice(0, 30) ||
92
- "element";
93
- // Determine test action type
94
- let actionType;
95
- if (actionKind === "navigate" || actionKind === "click") {
96
- actionType = "click";
97
- }
98
- else if (actionKind === "fill") {
99
- actionType = "fill";
100
- }
101
- else if (actionKind === "select") {
102
- actionType = "select";
103
- }
104
- else {
105
- actionType = "click";
106
- }
107
- const steps = [
108
- {
109
- action: {
110
- actionType: PlaywrightAction.Click,
111
- pageStateId: pageState.id,
112
- path: item.selector,
113
- playwrightCode: `await page.click('${item.selector.replace(/'/g, "\\'")}');`,
114
- description: `${actionType} on ${label}`,
115
- },
116
- expectations: [
117
- {
118
- expectationType: ExpectationType.NoConsoleErrors,
119
- severity: ExpectationSeverity.ShouldPass,
120
- description: "No console errors after interaction",
121
- playwrightCode: "expect(consoleErrors).toHaveLength(0);",
122
- },
123
- ],
124
- description: `${actionType} on ${label}`,
125
- continueOnFailure: false,
126
- },
127
- ];
273
+ const pageDefinitions = (await Promise.all(pageItems
274
+ .slice(0, 20)
275
+ .map(item => buildGeneratedTestCase(adapter, item, pageState.id)))).filter((definition) => Boolean(definition));
276
+ if (pageDefinitions.length > 0) {
277
+ const pageSuite = await api.insertTestSuite(config.runnerId, {
278
+ title: `Page State #${job.pageStateId}`,
279
+ description: `Auto-generated test suite for page state ${job.pageStateId} on ${page.relativePath}`,
280
+ startingPageStateId: job.pageStateId,
281
+ startingPath: page.relativePath,
282
+ sizeClass: config.sizeClass,
283
+ priority: 3,
284
+ suite_tags: ["auto-generated", "page-interactions"],
285
+ decompositionJobId: job.id,
286
+ });
287
+ pageSuiteId = pageSuite.id;
288
+ LOG(`Created test suite: id=${pageSuite.id}, title=${pageSuite.title}`);
289
+ events.onTestSuiteCreated({
290
+ suiteId: pageSuite.id,
291
+ title: pageSuite.title,
292
+ });
293
+ }
294
+ for (const [index, definition] of pageDefinitions.entries()) {
295
+ if (!pageSuiteId)
296
+ break;
128
297
  const testCase = {
129
- title: `${actionType}: ${label}`,
298
+ title: definition.title,
130
299
  type: "interaction",
131
300
  sizeClass: config.sizeClass,
132
- suite_tags: ["auto-generated", "mouse-scanning"],
301
+ suite_tags: ["auto-generated", "mouse-scanning", "page-interactions"],
133
302
  page_id: page.id,
134
303
  priority: 3,
135
304
  startingPageStateId: pageState.id,
136
305
  startingPath: page.relativePath,
137
- steps,
306
+ steps: definition.steps,
138
307
  globalExpectations: [],
139
308
  };
140
- LOG(`Creating test case ${i + 1}/${maxItems}: "${testCase.title}" selector=${item.selector?.slice(0, 60)}`);
141
- const tc = await api.insertTestCase(config.runnerId, testCase);
309
+ LOG(`Creating page test case ${index + 1}/${pageDefinitions.length}: "${testCase.title}" selector=${definition.item.selector?.slice(0, 60)}`);
310
+ const tc = await api.insertTestCase(config.runnerId, testCase, pageSuiteId);
142
311
  createdIds.push(tc.id);
143
- // Create test actions for each step
144
- for (const [index, step] of steps.entries()) {
312
+ for (const [stepIndex, step] of definition.steps.entries()) {
145
313
  await api.createTestAction({
146
314
  testCaseId: tc.id,
147
- stepOrder: index,
315
+ stepOrder: stepIndex,
148
316
  actionType: step.action.actionType,
149
317
  pageStateId: step.action.pageStateId,
150
318
  elementIdentityId: step.action.elementIdentityId,
@@ -159,6 +327,73 @@ export async function processDecompositionJob(job, adapter, config, api, events)
159
327
  });
160
328
  }
161
329
  }
330
+ for (const scaffold of persistedScaffolds) {
331
+ const itemsForScaffold = scaffoldItems.get(scaffold.scaffoldId) ?? [];
332
+ if (itemsForScaffold.length === 0) {
333
+ continue;
334
+ }
335
+ let scaffoldSuiteId = findExistingSuiteId(existingSuites, scaffold.scaffoldId);
336
+ if (!scaffoldSuiteId) {
337
+ const suite = await api.insertTestSuite(config.runnerId, {
338
+ title: `Shared Scaffold: ${scaffold.type}`,
339
+ description: `Auto-generated shared scaffold suite for ${scaffold.type}`,
340
+ startingPageStateId: job.pageStateId,
341
+ startingPath: page.relativePath,
342
+ sizeClass: config.sizeClass,
343
+ scaffoldId: scaffold.scaffoldId,
344
+ scaffoldType: scaffold.type,
345
+ priority: 2,
346
+ suite_tags: ["auto-generated", "shared-scaffold"],
347
+ });
348
+ scaffoldSuiteId = suite.id;
349
+ existingSuites.push(suite);
350
+ LOG(`Created scaffold suite ${suite.id} for scaffold ${scaffold.scaffoldId}`);
351
+ events.onTestSuiteCreated({ suiteId: suite.id, title: suite.title });
352
+ }
353
+ const scaffoldDefinitions = (await Promise.all(itemsForScaffold
354
+ .slice(0, 20)
355
+ .map(item => buildGeneratedTestCase(adapter, item, pageState.id)))).filter((definition) => Boolean(definition));
356
+ for (const definition of scaffoldDefinitions) {
357
+ const duplicate = existingCases.find(testCase => testCase.scaffoldId === scaffold.scaffoldId &&
358
+ testCase.title === definition.title);
359
+ if (duplicate) {
360
+ continue;
361
+ }
362
+ const testCase = {
363
+ title: definition.title,
364
+ type: "interaction",
365
+ sizeClass: config.sizeClass,
366
+ suite_tags: ["auto-generated", "mouse-scanning", "shared-scaffold"],
367
+ page_id: page.id,
368
+ scaffoldId: scaffold.scaffoldId,
369
+ priority: 2,
370
+ startingPageStateId: pageState.id,
371
+ startingPath: page.relativePath,
372
+ steps: definition.steps,
373
+ globalExpectations: [],
374
+ };
375
+ const tc = await api.insertTestCase(config.runnerId, testCase, scaffoldSuiteId);
376
+ existingCases.push(tc);
377
+ createdIds.push(tc.id);
378
+ for (const [stepIndex, step] of definition.steps.entries()) {
379
+ await api.createTestAction({
380
+ testCaseId: tc.id,
381
+ stepOrder: stepIndex,
382
+ actionType: step.action.actionType,
383
+ pageStateId: step.action.pageStateId,
384
+ elementIdentityId: step.action.elementIdentityId,
385
+ containerType: step.action.containerType,
386
+ containerElementIdentityId: step.action.containerElementIdentityId,
387
+ value: step.action.value,
388
+ path: step.action.path,
389
+ playwrightCode: step.action.playwrightCode,
390
+ description: step.description,
391
+ expectations: step.expectations,
392
+ continueOnFailure: step.continueOnFailure,
393
+ });
394
+ }
395
+ }
396
+ }
162
397
  LOG(`Decomposition complete: created ${createdIds.length} test cases`);
163
398
  return createdIds;
164
399
  }
@@ -1 +1 @@
1
- {"version":3,"file":"decomposition.js","sourceRoot":"","sources":["../../src/orchestrator/decomposition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decomposition.js","sourceRoot":"","sources":["../../src/orchestrator/decomposition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ApiClient } from "../api/client";
2
+ import type { ScanConfig, ScanEventHandler } from "./types";
3
+ export declare function ensureDirectNavigationCase(api: ApiClient, config: ScanConfig, events: ScanEventHandler, relativePath: string): Promise<void>;
4
+ //# sourceMappingURL=direct-navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-navigation.d.ts","sourceRoot":"","sources":["../../src/orchestrator/direct-navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA4B5D,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,gBAAgB,EACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -0,0 +1,47 @@
1
+ import { PlaywrightAction } from "../domain/types";
2
+ const DIRECT_NAV_SUITE_TITLE = "Direct Navigations";
3
+ async function ensureDirectNavigationSuite(api, config, events) {
4
+ const suites = await api.getTestSuitesByRunner(config.runnerId);
5
+ const existing = suites.find(suite => suite.title === DIRECT_NAV_SUITE_TITLE);
6
+ if (existing) {
7
+ return existing.id;
8
+ }
9
+ const suite = await api.insertTestSuite(config.runnerId, {
10
+ title: DIRECT_NAV_SUITE_TITLE,
11
+ description: "Auto-created suite for directly navigated URLs",
12
+ startingPath: "/",
13
+ sizeClass: config.sizeClass,
14
+ priority: 1,
15
+ suite_tags: ["direct-navigation"],
16
+ });
17
+ events.onTestSuiteCreated({ suiteId: suite.id, title: suite.title });
18
+ return suite.id;
19
+ }
20
+ export async function ensureDirectNavigationCase(api, config, events, relativePath) {
21
+ const suiteId = await ensureDirectNavigationSuite(api, config, events);
22
+ const testCase = await api.insertTestCase(config.runnerId, {
23
+ title: `Navigate to ${relativePath || "/"}`,
24
+ type: "navigation",
25
+ sizeClass: config.sizeClass,
26
+ priority: 1,
27
+ suite_tags: ["direct-navigation"],
28
+ startingPath: relativePath || "/",
29
+ steps: [],
30
+ globalExpectations: [],
31
+ }, suiteId);
32
+ const existingActions = await api.getTestActionsByCase(testCase.id);
33
+ if (existingActions.length > 0) {
34
+ return;
35
+ }
36
+ await api.createTestAction({
37
+ testCaseId: testCase.id,
38
+ stepOrder: 1,
39
+ actionType: PlaywrightAction.Goto,
40
+ path: relativePath || "/",
41
+ playwrightCode: `await page.goto('${relativePath || "/"}');`,
42
+ description: `Navigate to ${relativePath || "/"}`,
43
+ expectations: [],
44
+ continueOnFailure: false,
45
+ });
46
+ }
47
+ //# sourceMappingURL=direct-navigation.js.map