@sudobility/testomniac_runner_service 0.1.74 → 0.1.75
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/login.d.ts +15 -0
- package/dist/analyzer/page-analyzer/generators/login.d.ts.map +1 -0
- package/dist/analyzer/page-analyzer/generators/login.js +209 -0
- package/dist/analyzer/page-analyzer/generators/login.js.map +1 -0
- package/dist/analyzer/page-analyzer/index.d.ts.map +1 -1
- package/dist/analyzer/page-analyzer/index.js +16 -0
- package/dist/analyzer/page-analyzer/index.js.map +1 -1
- package/dist/analyzer/page-analyzer/types.d.ts +5 -0
- package/dist/analyzer/page-analyzer/types.d.ts.map +1 -1
- package/dist/api/client.d.ts +11 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +6 -0
- package/dist/api/client.js.map +1 -1
- package/dist/crawler/link-extractor.d.ts +1 -1
- package/dist/crawler/link-extractor.d.ts.map +1 -1
- package/dist/crawler/link-extractor.js +4 -1
- package/dist/crawler/link-extractor.js.map +1 -1
- package/dist/crawler/scope-checker.d.ts +6 -0
- package/dist/crawler/scope-checker.d.ts.map +1 -0
- package/dist/crawler/scope-checker.js +14 -0
- package/dist/crawler/scope-checker.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/login-manager.d.ts +62 -0
- package/dist/orchestrator/login-manager.d.ts.map +1 -0
- package/dist/orchestrator/login-manager.js +241 -0
- package/dist/orchestrator/login-manager.js.map +1 -0
- package/dist/orchestrator/runner.d.ts.map +1 -1
- package/dist/orchestrator/runner.js +49 -1
- package/dist/orchestrator/runner.js.map +1 -1
- package/dist/orchestrator/sso-handler.d.ts +29 -0
- package/dist/orchestrator/sso-handler.d.ts.map +1 -0
- package/dist/orchestrator/sso-handler.js +223 -0
- package/dist/orchestrator/sso-handler.js.map +1 -0
- package/dist/orchestrator/test-interaction-executor.d.ts +1 -1
- package/dist/orchestrator/test-interaction-executor.d.ts.map +1 -1
- package/dist/orchestrator/test-interaction-executor.js +35 -1
- package/dist/orchestrator/test-interaction-executor.js.map +1 -1
- package/dist/orchestrator/types.d.ts +5 -0
- package/dist/orchestrator/types.d.ts.map +1 -1
- package/dist/scanner/login-detector.d.ts +25 -0
- package/dist/scanner/login-detector.d.ts.map +1 -0
- package/dist/scanner/login-detector.js +232 -0
- package/dist/scanner/login-detector.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AnalyzerContext } from "../types";
|
|
2
|
+
import type { LoginDetectionResult } from "../../../scanner/login-detector";
|
|
3
|
+
import type { LoginConfig } from "../../../orchestrator/login-manager";
|
|
4
|
+
/**
|
|
5
|
+
* Generate login-specific test interactions when a login page is detected.
|
|
6
|
+
*
|
|
7
|
+
* Creates a `Login: {path}` surface with:
|
|
8
|
+
* 1. Invalid email format test
|
|
9
|
+
* 2. Empty password test
|
|
10
|
+
* 3. Wrong password test
|
|
11
|
+
* 4. Correct email/password login test
|
|
12
|
+
* 5. SSO button click tests (per detected provider)
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateLoginTestInteractions(analyzer: any, context: AnalyzerContext, loginDetection: LoginDetectionResult, loginConfig?: LoginConfig): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEvE;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,EACxB,cAAc,EAAE,oBAAoB,EACpC,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CAiPf"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate login-specific test interactions when a login page is detected.
|
|
3
|
+
*
|
|
4
|
+
* Creates a `Login: {path}` surface with:
|
|
5
|
+
* 1. Invalid email format test
|
|
6
|
+
* 2. Empty password test
|
|
7
|
+
* 3. Wrong password test
|
|
8
|
+
* 4. Correct email/password login test
|
|
9
|
+
* 5. SSO button click tests (per detected provider)
|
|
10
|
+
*/
|
|
11
|
+
export async function generateLoginTestInteractions(analyzer, context, loginDetection, loginConfig) {
|
|
12
|
+
if (!loginDetection.isLoginPage)
|
|
13
|
+
return;
|
|
14
|
+
const surfaceTitle = `Login: ${context.currentPath}`;
|
|
15
|
+
const { api, runnerId, testEnvironmentId, sizeClass, uid, bundleRun } = context;
|
|
16
|
+
const surface = await api.ensureTestSurface(runnerId, {
|
|
17
|
+
title: surfaceTitle,
|
|
18
|
+
description: `Login flow tests for ${context.currentPath}`,
|
|
19
|
+
startingPageStateId: context.currentPageStateId,
|
|
20
|
+
startingPath: context.currentPath,
|
|
21
|
+
sizeClass,
|
|
22
|
+
priority: 0, // High priority — login tests should run early
|
|
23
|
+
surface_tags: ["login", "auth"],
|
|
24
|
+
uid,
|
|
25
|
+
}, testEnvironmentId);
|
|
26
|
+
context.events.onTestSurfaceCreated({
|
|
27
|
+
surfaceId: surface.id,
|
|
28
|
+
title: surface.title,
|
|
29
|
+
});
|
|
30
|
+
await api.ensureBundleSurfaceLink(bundleRun.testSurfaceBundleId, surface.id);
|
|
31
|
+
const surfaceRun = await analyzer.ensureSurfaceRun(api, surface.id, bundleRun.id);
|
|
32
|
+
const desiredKeys = [];
|
|
33
|
+
let previousInteractionId;
|
|
34
|
+
// -------------------------------------------------------------------------
|
|
35
|
+
// Email/password form tests
|
|
36
|
+
// -------------------------------------------------------------------------
|
|
37
|
+
if (loginDetection.loginForm && loginConfig?.password) {
|
|
38
|
+
const form = loginDetection.loginForm;
|
|
39
|
+
const emailField = form.fields.find(f => f.type === "email" ||
|
|
40
|
+
f.name?.toLowerCase().includes("email") ||
|
|
41
|
+
f.name?.toLowerCase().includes("user"));
|
|
42
|
+
const passwordField = form.fields.find(f => f.type === "password");
|
|
43
|
+
// Test 1: Invalid email format
|
|
44
|
+
if (emailField?.selector) {
|
|
45
|
+
const key = `login-invalid-email:${context.currentPath}`;
|
|
46
|
+
desiredKeys.push(key);
|
|
47
|
+
const interaction = await analyzer.ensureTestInteraction(api, {
|
|
48
|
+
runnerId,
|
|
49
|
+
testSurfaceId: surface.id,
|
|
50
|
+
title: `Login: invalid email format`,
|
|
51
|
+
testType: "form",
|
|
52
|
+
sizeClass,
|
|
53
|
+
startingPath: context.currentPath,
|
|
54
|
+
startingPageStateId: context.currentPageStateId,
|
|
55
|
+
uid,
|
|
56
|
+
generatedKey: key,
|
|
57
|
+
dependencyTestInteractionId: undefined,
|
|
58
|
+
surfaceTags: ["login", "negative"],
|
|
59
|
+
steps: [
|
|
60
|
+
{
|
|
61
|
+
action: "type",
|
|
62
|
+
selector: emailField.selector,
|
|
63
|
+
value: "not-an-email",
|
|
64
|
+
},
|
|
65
|
+
...(passwordField?.selector
|
|
66
|
+
? [
|
|
67
|
+
{
|
|
68
|
+
action: "type",
|
|
69
|
+
selector: passwordField.selector,
|
|
70
|
+
value: "anypassword123",
|
|
71
|
+
},
|
|
72
|
+
]
|
|
73
|
+
: []),
|
|
74
|
+
{ action: "pressKey", key: "Enter" },
|
|
75
|
+
],
|
|
76
|
+
globalExpectations: [
|
|
77
|
+
{
|
|
78
|
+
type: "error_visible",
|
|
79
|
+
description: "An error message should be displayed for invalid email format",
|
|
80
|
+
severity: "warning",
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
});
|
|
84
|
+
await analyzer.ensureInteractionRun(api, interaction.id, surfaceRun.id, bundleRun.id);
|
|
85
|
+
previousInteractionId = interaction.id;
|
|
86
|
+
}
|
|
87
|
+
// Test 2: Wrong password
|
|
88
|
+
if (emailField?.selector && passwordField?.selector && loginConfig.email) {
|
|
89
|
+
const key = `login-wrong-password:${context.currentPath}`;
|
|
90
|
+
desiredKeys.push(key);
|
|
91
|
+
const interaction = await analyzer.ensureTestInteraction(api, {
|
|
92
|
+
runnerId,
|
|
93
|
+
testSurfaceId: surface.id,
|
|
94
|
+
title: `Login: wrong password`,
|
|
95
|
+
testType: "form",
|
|
96
|
+
sizeClass,
|
|
97
|
+
startingPath: context.currentPath,
|
|
98
|
+
startingPageStateId: context.currentPageStateId,
|
|
99
|
+
uid,
|
|
100
|
+
generatedKey: key,
|
|
101
|
+
dependencyTestInteractionId: previousInteractionId,
|
|
102
|
+
surfaceTags: ["login", "negative"],
|
|
103
|
+
steps: [
|
|
104
|
+
{
|
|
105
|
+
action: "type",
|
|
106
|
+
selector: emailField.selector,
|
|
107
|
+
value: loginConfig.email,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
action: "type",
|
|
111
|
+
selector: passwordField.selector,
|
|
112
|
+
value: "incorrect_password_" + Date.now(),
|
|
113
|
+
},
|
|
114
|
+
{ action: "pressKey", key: "Enter" },
|
|
115
|
+
],
|
|
116
|
+
globalExpectations: [
|
|
117
|
+
{
|
|
118
|
+
type: "error_visible",
|
|
119
|
+
description: "An authentication error message should be displayed for incorrect credentials",
|
|
120
|
+
severity: "warning",
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
});
|
|
124
|
+
await analyzer.ensureInteractionRun(api, interaction.id, surfaceRun.id, bundleRun.id);
|
|
125
|
+
previousInteractionId = interaction.id;
|
|
126
|
+
}
|
|
127
|
+
// Test 3: Correct login (depends on the negative tests completing first)
|
|
128
|
+
if (emailField?.selector && passwordField?.selector && loginConfig.email) {
|
|
129
|
+
const key = `login-correct:${context.currentPath}`;
|
|
130
|
+
desiredKeys.push(key);
|
|
131
|
+
const interaction = await analyzer.ensureTestInteraction(api, {
|
|
132
|
+
runnerId,
|
|
133
|
+
testSurfaceId: surface.id,
|
|
134
|
+
title: `Login: correct credentials`,
|
|
135
|
+
testType: "form",
|
|
136
|
+
sizeClass,
|
|
137
|
+
startingPath: context.currentPath,
|
|
138
|
+
startingPageStateId: context.currentPageStateId,
|
|
139
|
+
uid,
|
|
140
|
+
generatedKey: key,
|
|
141
|
+
dependencyTestInteractionId: previousInteractionId,
|
|
142
|
+
surfaceTags: ["login", "positive"],
|
|
143
|
+
steps: [
|
|
144
|
+
{
|
|
145
|
+
action: "type",
|
|
146
|
+
selector: emailField.selector,
|
|
147
|
+
value: loginConfig.email,
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
action: "type",
|
|
151
|
+
selector: passwordField.selector,
|
|
152
|
+
value: loginConfig.password,
|
|
153
|
+
},
|
|
154
|
+
{ action: "pressKey", key: "Enter" },
|
|
155
|
+
],
|
|
156
|
+
globalExpectations: [
|
|
157
|
+
{
|
|
158
|
+
type: "navigation_away",
|
|
159
|
+
description: "Should navigate away from login page after successful authentication",
|
|
160
|
+
severity: "error",
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
});
|
|
164
|
+
await analyzer.ensureInteractionRun(api, interaction.id, surfaceRun.id, bundleRun.id);
|
|
165
|
+
previousInteractionId = interaction.id;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// -------------------------------------------------------------------------
|
|
169
|
+
// SSO button tests
|
|
170
|
+
// -------------------------------------------------------------------------
|
|
171
|
+
for (const ssoButton of loginDetection.ssoButtons) {
|
|
172
|
+
const key = `login-sso-${ssoButton.provider}:${context.currentPath}`;
|
|
173
|
+
desiredKeys.push(key);
|
|
174
|
+
const interaction = await analyzer.ensureTestInteraction(api, {
|
|
175
|
+
runnerId,
|
|
176
|
+
testSurfaceId: surface.id,
|
|
177
|
+
title: `Login: ${ssoButton.provider} SSO`,
|
|
178
|
+
testType: "interaction",
|
|
179
|
+
sizeClass,
|
|
180
|
+
startingPath: context.currentPath,
|
|
181
|
+
startingPageStateId: context.currentPageStateId,
|
|
182
|
+
uid,
|
|
183
|
+
generatedKey: key,
|
|
184
|
+
dependencyTestInteractionId: undefined,
|
|
185
|
+
surfaceTags: ["login", "sso", ssoButton.provider],
|
|
186
|
+
steps: [
|
|
187
|
+
{
|
|
188
|
+
action: "click",
|
|
189
|
+
selector: ssoButton.selector,
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
globalExpectations: [
|
|
193
|
+
{
|
|
194
|
+
type: "navigation_away",
|
|
195
|
+
description: `Should navigate to ${ssoButton.provider} SSO provider page`,
|
|
196
|
+
severity: "warning",
|
|
197
|
+
},
|
|
198
|
+
],
|
|
199
|
+
});
|
|
200
|
+
await analyzer.ensureInteractionRun(api, interaction.id, surfaceRun.id, bundleRun.id);
|
|
201
|
+
}
|
|
202
|
+
// Reconcile: mark any previously generated login interactions that are
|
|
203
|
+
// no longer desired as inactive
|
|
204
|
+
await analyzer.reconcileGeneratedSurfaceElements(context, {
|
|
205
|
+
surfaceTitle,
|
|
206
|
+
desiredKeys,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/login.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;AAiBtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzer/page-analyzer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ import { generateDialogLifecycleTestInteractions } from "./generators/dialogs";
|
|
|
16
16
|
import { generateKeyboardAndDisclosureTestInteractions } from "./generators/keyboard-disclosure";
|
|
17
17
|
import { generateVariantTestInteractions } from "./generators/variants";
|
|
18
18
|
import { generateContentTestInteractions } from "./generators/content";
|
|
19
|
+
import { generateLoginTestInteractions } from "./generators/login";
|
|
19
20
|
function logAnalyzer(step, details) {
|
|
20
21
|
console.info("[PageAnalyzer]", step, details ?? {});
|
|
21
22
|
}
|
|
@@ -165,6 +166,16 @@ export class PageAnalyzer {
|
|
|
165
166
|
formsCount: context.forms.length,
|
|
166
167
|
scaffoldsCount: context.scaffolds.length,
|
|
167
168
|
});
|
|
169
|
+
// Skip generation if the current path is outside the scan scope boundary
|
|
170
|
+
if (context.scanScopePath &&
|
|
171
|
+
!context.currentPath.startsWith(context.scanScopePath)) {
|
|
172
|
+
logAnalyzer("generate:out-of-scope", {
|
|
173
|
+
sourceTitle: testInteraction.title,
|
|
174
|
+
currentPath: context.currentPath,
|
|
175
|
+
scanScopePath: context.scanScopePath,
|
|
176
|
+
});
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
168
179
|
const normalizedContext = this.normalizeContext(context);
|
|
169
180
|
const currentPageStateId = await this.ensureTargetPageState(normalizedContext);
|
|
170
181
|
const resolvedContext = {
|
|
@@ -247,6 +258,11 @@ export class PageAnalyzer {
|
|
|
247
258
|
});
|
|
248
259
|
await generateRenderTestInteractions(this, contextForFullPass);
|
|
249
260
|
await generateFormTestInteractions(this, contextForFullPass);
|
|
261
|
+
// Login test generation: detect login forms in context and generate
|
|
262
|
+
// login-specific tests if the page appears to be a login page
|
|
263
|
+
if (contextForFullPass.loginDetection?.isLoginPage) {
|
|
264
|
+
await generateLoginTestInteractions(this, contextForFullPass, contextForFullPass.loginDetection, contextForFullPass.loginConfig);
|
|
265
|
+
}
|
|
250
266
|
await generateSemanticJourneyTestInteractions(this, contextForFullPass);
|
|
251
267
|
await generateE2ETestInteractions(this, contextForFullPass);
|
|
252
268
|
await generateDialogLifecycleTestInteractions(this, contextForFullPass);
|