@futdevpro/dynamo-e2e 1.18.15 → 1.18.16
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/CHANGELOG.md +15 -0
- package/README.md +23 -0
- package/bin/dye2e.js +13 -0
- package/build/_modules/generators/_collections/cli-runner.util.d.ts.map +1 -1
- package/build/_modules/generators/_collections/cli-runner.util.js +17 -0
- package/build/_modules/generators/_collections/cli-runner.util.js.map +1 -1
- package/build/_modules/runtime/_collections/notification-detector-page-script.const.d.ts +3 -1
- package/build/_modules/runtime/_collections/notification-detector-page-script.const.d.ts.map +1 -1
- package/build/_modules/runtime/_collections/notification-detector-page-script.const.js +8 -1
- package/build/_modules/runtime/_collections/notification-detector-page-script.const.js.map +1 -1
- package/build/_modules/runtime/_collections/notification-detector.util.d.ts.map +1 -1
- package/build/_modules/runtime/_collections/notification-detector.util.js +3 -1
- package/build/_modules/runtime/_collections/notification-detector.util.js.map +1 -1
- package/build/_modules/runtime/_collections/notification-sweep.util.d.ts +65 -0
- package/build/_modules/runtime/_collections/notification-sweep.util.d.ts.map +1 -0
- package/build/_modules/runtime/_collections/notification-sweep.util.js +326 -0
- package/build/_modules/runtime/_collections/notification-sweep.util.js.map +1 -0
- package/build/_modules/runtime/_models/notification-sweep.interface.d.ts +67 -0
- package/build/_modules/runtime/_models/notification-sweep.interface.d.ts.map +1 -0
- package/build/_modules/runtime/_models/notification-sweep.interface.js +3 -0
- package/build/_modules/runtime/_models/notification-sweep.interface.js.map +1 -0
- package/build/_modules/runtime/index.d.ts +2 -0
- package/build/_modules/runtime/index.d.ts.map +1 -1
- package/build/_modules/runtime/index.js +2 -0
- package/build/_modules/runtime/index.js.map +1 -1
- package/build/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,21 @@
|
|
|
3
3
|
Minden release a `dynamo-e2e-foundation` HYPERPLAN MP-N ütemezést követi.
|
|
4
4
|
Verzióformátum: `MM.mm.p` (két-számjegyes major-minor, Dynamo-konvenció).
|
|
5
5
|
|
|
6
|
+
## [01.18.16] — 2026-09-24 — Login-flow notification sweep
|
|
7
|
+
|
|
8
|
+
- Added `DyE2E_NotificationSweep_Util` to `/runtime` and the `dye2e notification-sweep` command (BFR-QA-002): on top of
|
|
9
|
+
the notification detector it opens the login page of every target, submits it with a WRONG password (the error
|
|
10
|
+
branch, no test account needed) and returns one matrix row per project — notifications · error/warning · banners ·
|
|
11
|
+
modal dialogs · raw-technical leaks · console errors. Targets: the QA workspace's `TEST-TARGETS.md` (only
|
|
12
|
+
`https://test.` rows) or JSON.
|
|
13
|
+
- Guards in code: the probe address must be on a reserved or a declared own domain (else it throws before any page is
|
|
14
|
+
opened); the form is submitted only on a test host (else loaded, not submitted, and the row says so).
|
|
15
|
+
- Modal dialogs are recorded (text + leak flag) before they are closed: on 3 of 7 TEST sites a "not the production
|
|
16
|
+
system" notice blocked the login, and on one the dialog was itself a JS error shown to the user.
|
|
17
|
+
- Detector fixes found by the live sweep: a banner's inner elements are no longer counted as more banners (one login
|
|
18
|
+
error was counted 3×), and `HTTP 401`-style status codes and user-visible JS errors (`… is not a function`,
|
|
19
|
+
`TypeError`, `this.x.`) now count as raw technical leaks.
|
|
20
|
+
|
|
6
21
|
## [01.18.15] — 2026-09-24 — Live notification detector
|
|
7
22
|
|
|
8
23
|
- Added `DyE2E_NotificationDetector_Util` to `/runtime` (BFR-QA-001): `attach(context)` puts a `MutationObserver` into
|
package/README.md
CHANGED
|
@@ -96,4 +96,27 @@ Captures survive a full-page navigation (they are reported to Node through a Pla
|
|
|
96
96
|
is plain JavaScript, so no `__name` shim is needed under `tsx` / esbuild. `collect()` throws on a context without
|
|
97
97
|
`attach()` — an empty report would otherwise read as "no notifications".
|
|
98
98
|
|
|
99
|
+
## Login-flow notification sweep (`/runtime` + CLI)
|
|
100
|
+
|
|
101
|
+
Built on the detector: opens the login page of many projects, submits it with a WRONG password (so the ERROR branch
|
|
102
|
+
is measured without a test account) and prints one matrix row per project — notifications · error/warning · banners ·
|
|
103
|
+
modal dialogs · raw-technical leaks · console errors. Framework-level defects show up only when many projects are
|
|
104
|
+
measured the same way.
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
dye2e notification-sweep --targets TEST-TARGETS.md --json sweep.json # or a JSON [{ key, loginUrl | baseUrl }]
|
|
108
|
+
dye2e notification-sweep --targets targets.json --only a,b --fail-on-leak # exit 1 on a raw technical leak
|
|
109
|
+
```
|
|
110
|
+
```ts
|
|
111
|
+
const outcomes = await DyE2E_NotificationSweep_Util.sweep(browser, targets, { settleMs: 5000 });
|
|
112
|
+
console.log(DyE2E_NotificationSweep_Util.matrix(outcomes.map((o) => o.row)));
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Guards in code, not in docs: the probe address must be on a reserved domain (`example.com`, `*.test`, `*.invalid` …)
|
|
116
|
+
or on one you declare with `ownDomains` — anything else throws before a page is opened; the form is submitted only on
|
|
117
|
+
a test host (`test.*`, `*.test`, `localhost` …, or `allowSubmitHosts`) — anything else is loaded but NOT submitted,
|
|
118
|
+
and the row says so. `real: true` / `--real` uses `E2E_PERSISTENT_USER_EMAIL` / `_PASSWORD`; without them the row says
|
|
119
|
+
it fell back to the probe. Modal dialogs (a "not the production system" notice, an error dialog) are RECORDED —
|
|
120
|
+
text + leak flag — before they are closed; a non-modal cookie bar is left alone.
|
|
121
|
+
|
|
99
122
|
Detailed game-preset contract: [`__documentations/game-preset.md`](__documentations/game-preset.md).
|
package/bin/dye2e.js
CHANGED
|
@@ -403,6 +403,19 @@ function main() {
|
|
|
403
403
|
process.exit(0);
|
|
404
404
|
}
|
|
405
405
|
|
|
406
|
+
if (parsed.command === 'notification-sweep') {
|
|
407
|
+
// BFR-QA-002 — the logic is TypeScript (runtime module); needs @playwright/test in the consumer
|
|
408
|
+
const { DyE2E_NotificationSweep_Util } = require('../build/_modules/runtime/_collections/notification-sweep.util');
|
|
409
|
+
DyE2E_NotificationSweep_Util.runCli(parsed.flags).then(
|
|
410
|
+
(code) => process.exit(code),
|
|
411
|
+
(error) => {
|
|
412
|
+
process.stderr.write('[dye2e] notification-sweep failed: ' + (error && error.stack ? error.stack : error) + '\n');
|
|
413
|
+
process.exit(1);
|
|
414
|
+
},
|
|
415
|
+
);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
|
|
406
419
|
if (parsed.command === 'bundle-summary') {
|
|
407
420
|
const bundleP = parsed.flags.bundle;
|
|
408
421
|
if (!bundleP) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-runner.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/generators/_collections/cli-runner.util.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,qBAAa,oBAAoB;IAE/B,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAsBpF,MAAM,CAAC,QAAQ,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"cli-runner.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/generators/_collections/cli-runner.util.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,qBAAa,oBAAoB;IAE/B,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAsBpF,MAAM,CAAC,QAAQ,IAAI,MAAM;IAyGzB;;;OAGG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IA0D/C;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAC,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;KAAE,GAAG;QAC9H,YAAY,EAAE,OAAO,CAAC;QACtB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,OAAO,CAAC;QACvB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB;IA2CD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI3C;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAuB9D;;;OAGG;IACH,MAAM,CAAC,WAAW,CAChB,OAAO,EAAE,qBAAqB,GAAG,yBAAyB,GAAG,mBAAmB,EAChF,UAAU,EAAE,MAAM,GACjB,MAAM;CAaV"}
|
|
@@ -61,6 +61,23 @@ Visual QA (/vqa) commands:
|
|
|
61
61
|
generate-comparison-bundle Before/after capture sets -> comparison bundle
|
|
62
62
|
bundle-summary Print an existing bundle's summary.md
|
|
63
63
|
|
|
64
|
+
QA commands:
|
|
65
|
+
notification-sweep Login pages -> wrong-password submit -> notification / banner / leak matrix
|
|
66
|
+
|
|
67
|
+
Flags (notification-sweep):
|
|
68
|
+
--targets <path> TEST-TARGETS.md (only https://test. rows) or JSON [{ key, loginUrl | baseUrl }] (required)
|
|
69
|
+
--only <a,b> Only these target keys
|
|
70
|
+
--login-paths <k=/p,..> Per-target login path (default /landing/login)
|
|
71
|
+
--no-submit Only load the login pages
|
|
72
|
+
--real Use E2E_PERSISTENT_USER_EMAIL / _PASSWORD (else the wrong-password probe)
|
|
73
|
+
--probe-email <addr> Probe address — reserved domain or one of --own-domains ONLY
|
|
74
|
+
--own-domains <d,..> Your own e-mail domains allowed for the probe address
|
|
75
|
+
--allow-hosts <h,..> Extra hosts the form may be submitted to (default: test.*, *.test, localhost)
|
|
76
|
+
--settle-ms / --after-submit-ms <ms> Waits (default 5000 / 9000)
|
|
77
|
+
--json <out> Write rows + full reports as JSON
|
|
78
|
+
--fail-on-leak Exit 1 if any page shows a raw technical leak
|
|
79
|
+
--executable-path <exe> Chromium to launch (or DYE2E_CHROMIUM_EXECUTABLE_PATH)
|
|
80
|
+
|
|
64
81
|
Flags (preset):
|
|
65
82
|
--name <preset> Print this preset as JSON (omit to list all)
|
|
66
83
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-runner.util.js","sourceRoot":"","sources":["../../../../src/_modules/generators/_collections/cli-runner.util.ts"],"names":[],"mappings":";;;AAAA,kEAAoE;AACpE,0EAA4E;AAC5E,uEAAyE;AAKzE;;;;;GAKG;AACH,MAAa,oBAAoB;IAE/B,MAAM,CAAC,SAAS,CAAC,IAAc;QAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACxC,CAAC;QACD,MAAM,OAAO,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAW,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,IAAI,GAAuB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7C,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;oBAClB,CAAC,EAAE,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,QAAQ;QACb,OAAO
|
|
1
|
+
{"version":3,"file":"cli-runner.util.js","sourceRoot":"","sources":["../../../../src/_modules/generators/_collections/cli-runner.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,9 @@ export declare const DYE2E_NOTIFICATION_BINDING_NAME: string;
|
|
|
22
22
|
export declare const DYE2E_NOTIFICATION_DETECTOR_PAGE_SCRIPT: string;
|
|
23
23
|
/**
|
|
24
24
|
* Page-side expression: the visible error banners / inline error texts at this moment (not toasts — e.g. a login
|
|
25
|
-
* form showing a raw HTTP error). Only really visible elements, deduplicated by tag + text
|
|
25
|
+
* form showing a raw HTTP error). Only really visible elements, deduplicated by tag + text; an element INSIDE an
|
|
26
|
+
* already counted banner is part of it, not a new one (measured: a `role=alert` box with its `.error-text` and icon
|
|
27
|
+
* was counted three times). PURE JavaScript.
|
|
26
28
|
*/
|
|
27
29
|
export declare const DYE2E_VISIBLE_ERRORS_PAGE_EXPRESSION: string;
|
|
28
30
|
//# sourceMappingURL=notification-detector-page-script.const.d.ts.map
|
package/build/_modules/runtime/_collections/notification-detector-page-script.const.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-detector-page-script.const.d.ts","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-detector-page-script.const.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAyC,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,uCAAuC,EAAE,MA6GrD,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"notification-detector-page-script.const.d.ts","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-detector-page-script.const.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAyC,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,uCAAuC,EAAE,MA6GrD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,EAAE,MA2BlD,CAAC"}
|
|
@@ -134,7 +134,9 @@ exports.DYE2E_NOTIFICATION_DETECTOR_PAGE_SCRIPT = `
|
|
|
134
134
|
`;
|
|
135
135
|
/**
|
|
136
136
|
* Page-side expression: the visible error banners / inline error texts at this moment (not toasts — e.g. a login
|
|
137
|
-
* form showing a raw HTTP error). Only really visible elements, deduplicated by tag + text
|
|
137
|
+
* form showing a raw HTTP error). Only really visible elements, deduplicated by tag + text; an element INSIDE an
|
|
138
|
+
* already counted banner is part of it, not a new one (measured: a `role=alert` box with its `.error-text` and icon
|
|
139
|
+
* was counted three times). PURE JavaScript.
|
|
138
140
|
*/
|
|
139
141
|
exports.DYE2E_VISIBLE_ERRORS_PAGE_EXPRESSION = `
|
|
140
142
|
(function () {
|
|
@@ -142,6 +144,7 @@ exports.DYE2E_VISIBLE_ERRORS_PAGE_EXPRESSION = `
|
|
|
142
144
|
'.text-red-200', '.text-red-500', '.text-red-600', '.text-red-700', '[role="alert"]'];
|
|
143
145
|
var out = [];
|
|
144
146
|
var seen = {};
|
|
147
|
+
var picked = [];
|
|
145
148
|
var found = document.querySelectorAll(selectors.join(','));
|
|
146
149
|
for (var i = 0; i < found.length; i++) {
|
|
147
150
|
var el = found[i];
|
|
@@ -153,7 +156,11 @@ exports.DYE2E_VISIBLE_ERRORS_PAGE_EXPRESSION = `
|
|
|
153
156
|
style.visibility !== 'hidden' && style.display !== 'none';
|
|
154
157
|
var key = el.tagName + '|' + text;
|
|
155
158
|
if (!visible || seen[key]) { continue; }
|
|
159
|
+
var inside = false;
|
|
160
|
+
for (var j = 0; j < picked.length; j++) { if (picked[j].contains(el)) { inside = true; break; } }
|
|
161
|
+
if (inside) { continue; }
|
|
156
162
|
seen[key] = true;
|
|
163
|
+
picked.push(el);
|
|
157
164
|
out.push({ tag: el.tagName.toLowerCase(), cls: String(el.className || '').slice(0, 120), text: text.slice(0, 260) });
|
|
158
165
|
}
|
|
159
166
|
return out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-detector-page-script.const.js","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-detector-page-script.const.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,+BAA+B,GAAW,gCAAgC,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACU,QAAA,uCAAuC,GAAW;;;;;;uBAMxC,uCAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGrD,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"notification-detector-page-script.const.js","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-detector-page-script.const.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,+BAA+B,GAAW,gCAAgC,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACU,QAAA,uCAAuC,GAAW;;;;;;uBAMxC,uCAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGrD,CAAC;AAEF;;;;;GAKG;AACU,QAAA,oCAAoC,GAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-detector.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-detector.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAkB,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAGL,kCAAkC,EAGlC,4BAA4B,EAC7B,MAAM,0CAA0C,CAAC;AAqBlD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,+BAA+B;IAE1C,0EAA0E;IAC1E,MAAM,CAAC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"notification-detector.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-detector.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAkB,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAGL,kCAAkC,EAGlC,4BAA4B,EAC7B,MAAM,0CAA0C,CAAC;AAqBlD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,+BAA+B;IAE1C,0EAA0E;IAC1E,MAAM,CAAC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAM7C;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAA0D;IAClG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAC2B;IAE7D;;;;OAIG;WACU,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B3D;;;;OAIG;WACU,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,kCAAkC,CAAC;IAiC7E,8GAA8G;WACjG,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,4BAA4B,EAAE,CAAC;IAenF,iHAAiH;IACjH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhD,gEAAgE;IAChE,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,kCAAkC,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM;IA+BxF,oDAAoD;IACpD,OAAO,CAAC,MAAM,CAAC,SAAS;IAgBxB,OAAO,CAAC,MAAM,CAAC,OAAO;CAQvB"}
|
|
@@ -22,7 +22,9 @@ const notification_detector_page_script_const_1 = require("./notification-detect
|
|
|
22
22
|
class DyE2E_NotificationDetector_Util {
|
|
23
23
|
/** Texts that expose internals to the user instead of a human message. */
|
|
24
24
|
static rawTechnicalLeakPattern = new RegExp('(Http failure response|Unauthorized|Internal Server|undefined|\\[object Object\\]|/api/|-api/|' +
|
|
25
|
-
'status of \\d{3}|ERR_|Cannot (GET|POST|read)
|
|
25
|
+
'status of \\d{3}|\\bHTTP \\d{3}\\b|ERR_|Cannot (GET|POST|read)|' +
|
|
26
|
+
// JS errors shown to the user (measured on a TEST site: "…: this.rendering_CS.noServer… is not a function")
|
|
27
|
+
'is not a function|is not defined|TypeError|\\bthis\\.[A-Za-z_$][\\w$]*\\.)', 'i');
|
|
26
28
|
static attachedContexts = new WeakSet();
|
|
27
29
|
static pageStates = new WeakMap();
|
|
28
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-detector.util.js","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-detector.util.ts"],"names":[],"mappings":";;;AAUA,uGAImD;AAgBnD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,+BAA+B;IAE1C,0EAA0E;IAC1E,MAAM,CAAU,uBAAuB,GAAW,IAAI,MAAM,CAC1D,gGAAgG;QAChG
|
|
1
|
+
{"version":3,"file":"notification-detector.util.js","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-detector.util.ts"],"names":[],"mappings":";;;AAUA,uGAImD;AAgBnD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,+BAA+B;IAE1C,0EAA0E;IAC1E,MAAM,CAAU,uBAAuB,GAAW,IAAI,MAAM,CAC1D,gGAAgG;QAChG,iEAAiE;QACjE,4GAA4G;QAC5G,4EAA4E,EAC5E,GAAG,CACJ,CAAC;IAEM,MAAM,CAAU,gBAAgB,GAA4B,IAAI,OAAO,EAAkB,CAAC;IAC1F,MAAM,CAAU,UAAU,GAChC,IAAI,OAAO,EAA+C,CAAC;IAE7D;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAuB;QACzC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEnC,iFAAiF;QACjF,MAAM,OAAO,CAAC,aAAa,CACzB,yEAA+B,EAC/B,CAAC,MAAsB,EAAE,KAAmC,EAAQ,EAAE;YACpE,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;gBACzD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CACF,CAAC;QACF,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,iFAAuC,EAAE,CAAC,CAAC;QAElF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAU,EAAQ,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,iFAAuC,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,qFAAqF;YACvF,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAU;QAC7B,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,kGAAkG;gBAClG,sGAAsG;gBACtG,uDAAuD,CACxD,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAA0C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAExE,8EAA8E;QAC9E,IAAI,MAAM,GAAmC,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAiC,sCAAsC,CAAC,CAAC;QACvG,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,0EAA0E;QAC5E,CAAC;QACD,MAAM,MAAM,GACV,IAAI,GAAG,CAAuC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO;YACL,aAAa,EAAE,CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAE,CAAC,IAAI,CACxC,CAAC,CAA+B,EAAE,CAA+B,EAAU,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAC1F;YACD,aAAa,EAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YACjD,aAAa,EAAE,CAAE,GAAG,KAAK,CAAC,aAAa,CAAE;YACzC,UAAU,EAAE,CAAE,GAAG,KAAK,CAAC,UAAU,CAAE;SACpC,CAAC;IACJ,CAAC;IAED,8GAA8G;IAC9G,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAU;QACvC,IAAI,GAAG,GAAsC,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAoC,8EAAoC,CAAC,CAAC;QACrG,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAqC,EAAgC,EAAE,CAAC,CAAC;YACvF,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;SACrD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,iHAAiH;IACjH,MAAM,CAAC,kBAAkB,CAAC,IAAY;QACpC,OAAO,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,gEAAgE;IAChE,MAAM,CAAC,SAAS,CAAC,MAA0C,EAAE,QAAgB,EAAE;QAC7E,MAAM,MAAM,GAA2C,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACjH,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAA+B,EAAQ,EAAE;YACrE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,WAAW;YACnG,MAAM,CAAC,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,WAAW,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;QAC/G,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAA+B,EAAE,CAAS,EAAQ,EAAE;YAChF,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG;gBAC5G,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAW,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAA+B,EAAW,EAAE,CAC7F,CAAC,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,yBAAyB,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;QAC9G,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAA+B,EAAE,CAAS,EAAQ,EAAE;YAChF,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG;gBAC1F,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,2BAA2B,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,kBAAkB;YACvF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAA+B,EAAQ,EAAE;YAClF,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAA4B,EAAQ,EAAE;YAC3E,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,oDAAoD;IAC5C,MAAM,CAAC,SAAS,CAAC,IAAU;QACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAA0C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAuB,EAAQ,EAAE;YACnD,MAAM,IAAI,GAAW,OAAO,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC3C,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxG,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAY,EAAQ,EAAE;YAC1C,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClG,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,OAAO,CAAC,IAAU;QAC/B,IAAI,KAAK,GAAsD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,aAAa,EAAE,IAAI,GAAG,EAAwC,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;YAC9G,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;;AAnKH,0EAoKC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Browser } from '@playwright/test';
|
|
2
|
+
import { DyE2E_SweepOptions_Interface, DyE2E_SweepOutcome_Interface, DyE2E_SweepRow_Interface, DyE2E_SweepTarget_Interface } from '../_models/notification-sweep.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Login-flow notification sweep (BFR-QA-002) — on top of `DyE2E_NotificationDetector_Util` (BFR-QA-001): opens the
|
|
5
|
+
* login page of every target, submits it with a WRONG password by default (so the ERROR branch is measured without
|
|
6
|
+
* a test account), and returns one matrix row per project: notifications · error/warning · visible banners ·
|
|
7
|
+
* raw-technical leaks · console errors. Framework-level defects (e.g. the raw `Http failure … 401` banner on the
|
|
8
|
+
* login of 5+ projects) only show when many projects are measured the same way.
|
|
9
|
+
*
|
|
10
|
+
* Two guards are CODE, not advice:
|
|
11
|
+
* - the probe e-mail must be on a reserved, undeliverable domain (`example.com`, `*.example`, `*.test`, `*.invalid`,
|
|
12
|
+
* `*.localhost`, `*.local`) or on a domain you declare your own (`ownDomains`) — `core-test-email-own-or-reserved-only`;
|
|
13
|
+
* - the form is submitted only on a test host (`test.*`, `*.test`, `localhost`, `127.0.0.1` …, or `allowSubmitHosts`)
|
|
14
|
+
* — anything else is loaded but NOT submitted, and the row says so.
|
|
15
|
+
* `real: true` uses the registered test account from `E2E_PERSISTENT_USER_EMAIL` / `_PASSWORD`; without them the row
|
|
16
|
+
* says it fell back to the probe. No account is ever created.
|
|
17
|
+
*/
|
|
18
|
+
export declare class DyE2E_NotificationSweep_Util {
|
|
19
|
+
/** The default probe e-mail — a reserved, undeliverable domain. */
|
|
20
|
+
static readonly defaultProbeEmail: string;
|
|
21
|
+
/** The default probe password (deliberately wrong). */
|
|
22
|
+
static readonly defaultProbePassword: string;
|
|
23
|
+
/** Login paths that differ from the FDP default `/landing/login` (measured). */
|
|
24
|
+
static readonly defaultLoginPaths: Record<string, string>;
|
|
25
|
+
/** The e-mail / user-name field. */
|
|
26
|
+
static readonly emailSelector: string;
|
|
27
|
+
/** The submit button. */
|
|
28
|
+
static readonly submitSelector: string;
|
|
29
|
+
/** Whether an e-mail may be used as a probe: reserved domain, or one of `ownDomains` (or a subdomain of it). */
|
|
30
|
+
static isAllowedProbeEmail(email: string, ownDomains?: string[]): boolean;
|
|
31
|
+
/** Whether the form of `url` may be submitted: a test host, or one of `allowHosts`. */
|
|
32
|
+
static isSubmitAllowed(url: string, allowHosts?: string[]): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Targets from a file: JSON (`[{ key, loginUrl }]` or `[{ key, baseUrl, loginPath? }]`), or the QA workspace's
|
|
35
|
+
* `TEST-TARGETS.md` table (`| **key** | \`https://test.…\` |` — only `https://test.` rows, PROD is never a target).
|
|
36
|
+
*/
|
|
37
|
+
static readTargets(file: string, loginPaths?: Record<string, string>): DyE2E_SweepTarget_Interface[];
|
|
38
|
+
/** Sweeps the targets one by one (a fresh context each) and returns the rows with their full reports. */
|
|
39
|
+
static sweep(browser: Browser, targets: DyE2E_SweepTarget_Interface[], options?: DyE2E_SweepOptions_Interface): Promise<DyE2E_SweepOutcome_Interface[]>;
|
|
40
|
+
/** The matrix of a sweep as text. */
|
|
41
|
+
static matrix(rows: DyE2E_SweepRow_Interface[]): string;
|
|
42
|
+
/**
|
|
43
|
+
* `dye2e notification-sweep` — flags: `--targets <md|json>` (required) · `--only a,b` · `--login-paths k=/p,…` ·
|
|
44
|
+
* `--no-submit` · `--real` · `--probe-email` · `--own-domains d,…` · `--allow-hosts h,…` · `--settle-ms` ·
|
|
45
|
+
* `--after-submit-ms` · `--json <out>` · `--fail-on-leak` · `--executable-path`.
|
|
46
|
+
* @returns the process exit code (2 = no targets / bad input, 1 = `--fail-on-leak` and a leak, 0 otherwise).
|
|
47
|
+
*/
|
|
48
|
+
static runCli(flags: Record<string, string>): Promise<number>;
|
|
49
|
+
/** One target: fresh context, detector, load, (guarded) submit, collect. */
|
|
50
|
+
private static sweepOne;
|
|
51
|
+
/**
|
|
52
|
+
* Records, then closes the MODAL dialogs (cdk overlay, `aria-modal="true"`, `alertdialog`) — measured 2026-09-24:
|
|
53
|
+
* - on 3 of 7 TEST sites a "This is NOT the production system" notice covered the login (every click hit it);
|
|
54
|
+
* - on one, the modal WAS the finding: "An unexpected error occurred: this.… is not a function" on page load —
|
|
55
|
+
* so every dialog is recorded (text + raw-technical-leak flag) BEFORE it is closed, never silently swept away.
|
|
56
|
+
* A non-modal `role="dialog"` (a cookie-consent bar) does not block the page and is left alone. Escape first, then
|
|
57
|
+
* the dialog's own action button; a modal that stays open stops the loop (named in the note).
|
|
58
|
+
*/
|
|
59
|
+
private static captureModalDialogs;
|
|
60
|
+
/** Fills the login form and submits it; a missing field is a note, not a crash. */
|
|
61
|
+
private static submitLogin;
|
|
62
|
+
/** CLI flags → sweep options. */
|
|
63
|
+
private static optionsFromFlags;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=notification-sweep.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-sweep.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-sweep.util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAA2C,MAAM,kBAAkB,CAAC;AAGpF,OAAO,EAGL,4BAA4B,EAC5B,4BAA4B,EAC5B,wBAAwB,EACxB,2BAA2B,EAC5B,MAAM,yCAAyC,CAAC;AAGjD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,4BAA4B;IAEvC,mEAAmE;IACnE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAmC;IAE5E,uDAAuD;IACvD,MAAM,CAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAA6B;IAEzE,gFAAgF;IAChF,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAqC;IAE9F,oCAAoC;IACpC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CACgE;IAErG,yBAAyB;IACzB,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CACqE;IAE3G,gHAAgH;IAChH,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,OAAO;IAa7E,uFAAuF;IACvF,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,OAAO;IAcvE;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,2BAA2B,EAAE;IAqCxG,yGAAyG;WAC5F,KAAK,CAChB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,2BAA2B,EAAE,EACtC,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,4BAA4B,EAAE,CAAC;IAgB1C,qCAAqC;IACrC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,MAAM;IAgBvD;;;;;OAKG;WACU,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAgDnE,4EAA4E;mBACvD,QAAQ;IAkF7B;;;;;;;OAOG;mBACkB,mBAAmB;IAyCxC,mFAAmF;mBAC9D,WAAW;IAqBhC,iCAAiC;IACjC,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAiBhC"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.DyE2E_NotificationSweep_Util = void 0;
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
|
+
const test_1 = require("@playwright/test");
|
|
29
|
+
const notification_detector_util_1 = require("./notification-detector.util");
|
|
30
|
+
/**
|
|
31
|
+
* Login-flow notification sweep (BFR-QA-002) — on top of `DyE2E_NotificationDetector_Util` (BFR-QA-001): opens the
|
|
32
|
+
* login page of every target, submits it with a WRONG password by default (so the ERROR branch is measured without
|
|
33
|
+
* a test account), and returns one matrix row per project: notifications · error/warning · visible banners ·
|
|
34
|
+
* raw-technical leaks · console errors. Framework-level defects (e.g. the raw `Http failure … 401` banner on the
|
|
35
|
+
* login of 5+ projects) only show when many projects are measured the same way.
|
|
36
|
+
*
|
|
37
|
+
* Two guards are CODE, not advice:
|
|
38
|
+
* - the probe e-mail must be on a reserved, undeliverable domain (`example.com`, `*.example`, `*.test`, `*.invalid`,
|
|
39
|
+
* `*.localhost`, `*.local`) or on a domain you declare your own (`ownDomains`) — `core-test-email-own-or-reserved-only`;
|
|
40
|
+
* - the form is submitted only on a test host (`test.*`, `*.test`, `localhost`, `127.0.0.1` …, or `allowSubmitHosts`)
|
|
41
|
+
* — anything else is loaded but NOT submitted, and the row says so.
|
|
42
|
+
* `real: true` uses the registered test account from `E2E_PERSISTENT_USER_EMAIL` / `_PASSWORD`; without them the row
|
|
43
|
+
* says it fell back to the probe. No account is ever created.
|
|
44
|
+
*/
|
|
45
|
+
class DyE2E_NotificationSweep_Util {
|
|
46
|
+
/** The default probe e-mail — a reserved, undeliverable domain. */
|
|
47
|
+
static defaultProbeEmail = 'dye2e-sweep-probe@example.com';
|
|
48
|
+
/** The default probe password (deliberately wrong). */
|
|
49
|
+
static defaultProbePassword = 'Dye2e-Wrong-Password-1!';
|
|
50
|
+
/** Login paths that differ from the FDP default `/landing/login` (measured). */
|
|
51
|
+
static defaultLoginPaths = { 'fdp-token-service': '/login' };
|
|
52
|
+
/** The e-mail / user-name field. */
|
|
53
|
+
static emailSelector = 'input[type="email"], input[formcontrolname*="mail" i], input[name*="mail" i], input[type="text"]';
|
|
54
|
+
/** The submit button. */
|
|
55
|
+
static submitSelector = 'button[type="submit"], button:has-text("Login"), button:has-text("Log in"), button:has-text("Belépés")';
|
|
56
|
+
/** Whether an e-mail may be used as a probe: reserved domain, or one of `ownDomains` (or a subdomain of it). */
|
|
57
|
+
static isAllowedProbeEmail(email, ownDomains = []) {
|
|
58
|
+
const domain = (email.split('@')[1] ?? '').trim().toLowerCase();
|
|
59
|
+
if (!domain || !/^[a-z0-9.-]+$/.test(domain)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const reserved = ['example.com', 'example.net', 'example.org'].includes(domain)
|
|
63
|
+
|| ['.example', '.test', '.invalid', '.localhost', '.local'].some((tld) => domain.endsWith(tld));
|
|
64
|
+
return reserved || ownDomains.some((own) => domain === own.toLowerCase() || domain.endsWith('.' + own.toLowerCase()));
|
|
65
|
+
}
|
|
66
|
+
/** Whether the form of `url` may be submitted: a test host, or one of `allowHosts`. */
|
|
67
|
+
static isSubmitAllowed(url, allowHosts = []) {
|
|
68
|
+
let host;
|
|
69
|
+
try {
|
|
70
|
+
host = new URL(url).hostname.toLowerCase();
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return host.startsWith('test.') || ['localhost', '127.0.0.1', '[::1]'].includes(host)
|
|
76
|
+
|| ['.test', '.localhost'].some((tld) => host.endsWith(tld))
|
|
77
|
+
|| allowHosts.some((allowed) => host === allowed.toLowerCase());
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Targets from a file: JSON (`[{ key, loginUrl }]` or `[{ key, baseUrl, loginPath? }]`), or the QA workspace's
|
|
81
|
+
* `TEST-TARGETS.md` table (`| **key** | \`https://test.…\` |` — only `https://test.` rows, PROD is never a target).
|
|
82
|
+
*/
|
|
83
|
+
static readTargets(file, loginPaths = {}) {
|
|
84
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
85
|
+
const paths = { ...DyE2E_NotificationSweep_Util.defaultLoginPaths, ...loginPaths };
|
|
86
|
+
if (file.toLowerCase().endsWith('.json')) {
|
|
87
|
+
const parsed = JSON.parse(text);
|
|
88
|
+
if (!Array.isArray(parsed)) {
|
|
89
|
+
throw new Error(`notification-sweep: ${file} must be a JSON array of { key, loginUrl } / { key, baseUrl }`);
|
|
90
|
+
}
|
|
91
|
+
return parsed.map((entry, index) => {
|
|
92
|
+
const key = typeof entry.key === 'string' ? entry.key : '';
|
|
93
|
+
const base = typeof entry.baseUrl === 'string' ? entry.baseUrl.replace(/\/+$/, '') : '';
|
|
94
|
+
const loginUrl = typeof entry.loginUrl === 'string' ? entry.loginUrl
|
|
95
|
+
: base + (typeof entry.loginPath === 'string' ? entry.loginPath : paths[key] ?? '/landing/login');
|
|
96
|
+
if (!key || !/^https?:\/\//.test(loginUrl)) {
|
|
97
|
+
throw new Error(`notification-sweep: ${file} entry #${index} needs a "key" and a "loginUrl" or "baseUrl"`);
|
|
98
|
+
}
|
|
99
|
+
return { key: key, loginUrl: loginUrl };
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const targets = [];
|
|
103
|
+
const row = /^\|\s*\*\*([a-z0-9-]+)\*\*\s*\|\s*`(https:\/\/test\.[^`\s]+)`/gim;
|
|
104
|
+
let match = row.exec(text);
|
|
105
|
+
while (match) {
|
|
106
|
+
targets.push({ key: match[1], loginUrl: match[2].replace(/\/+$/, '') + (paths[match[1]] ?? '/landing/login') });
|
|
107
|
+
match = row.exec(text);
|
|
108
|
+
}
|
|
109
|
+
return targets;
|
|
110
|
+
}
|
|
111
|
+
/** Sweeps the targets one by one (a fresh context each) and returns the rows with their full reports. */
|
|
112
|
+
static async sweep(browser, targets, options = {}) {
|
|
113
|
+
const probeEmail = options.probeEmail ?? DyE2E_NotificationSweep_Util.defaultProbeEmail;
|
|
114
|
+
if (!DyE2E_NotificationSweep_Util.isAllowedProbeEmail(probeEmail, options.ownDomains)) {
|
|
115
|
+
throw new Error(`notification-sweep: the probe e-mail "${probeEmail}" is not on a reserved (example.com, *.test, `
|
|
116
|
+
+ '*.invalid …) or declared own domain (`ownDomains`) — a test must never write to a real, foreign address.');
|
|
117
|
+
}
|
|
118
|
+
const outcomes = [];
|
|
119
|
+
for (const target of targets) {
|
|
120
|
+
outcomes.push(await DyE2E_NotificationSweep_Util.sweepOne(browser, target, options, probeEmail));
|
|
121
|
+
}
|
|
122
|
+
return outcomes;
|
|
123
|
+
}
|
|
124
|
+
/** The matrix of a sweep as text. */
|
|
125
|
+
static matrix(rows) {
|
|
126
|
+
const lines = [
|
|
127
|
+
'=================== NOTIFICATION SWEEP ===================',
|
|
128
|
+
'project | mode | notif | err/warn | banner | dialog | leak | console | note',
|
|
129
|
+
];
|
|
130
|
+
rows.forEach((r) => {
|
|
131
|
+
lines.push(r.key.padEnd(20) + ' | ' + r.mode.padEnd(9) + ' | ' + String(r.notifications).padEnd(5) + ' | '
|
|
132
|
+
+ String(r.errorOrWarning).padEnd(8) + ' | ' + String(r.banners).padEnd(6) + ' | ' + String(r.dialogs).padEnd(6)
|
|
133
|
+
+ ' | ' + String(r.leaks).padEnd(4)
|
|
134
|
+
+ ' | ' + String(r.consoleErrors).padEnd(7) + ' | ' + r.note);
|
|
135
|
+
});
|
|
136
|
+
return lines.join('\n');
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* `dye2e notification-sweep` — flags: `--targets <md|json>` (required) · `--only a,b` · `--login-paths k=/p,…` ·
|
|
140
|
+
* `--no-submit` · `--real` · `--probe-email` · `--own-domains d,…` · `--allow-hosts h,…` · `--settle-ms` ·
|
|
141
|
+
* `--after-submit-ms` · `--json <out>` · `--fail-on-leak` · `--executable-path`.
|
|
142
|
+
* @returns the process exit code (2 = no targets / bad input, 1 = `--fail-on-leak` and a leak, 0 otherwise).
|
|
143
|
+
*/
|
|
144
|
+
static async runCli(flags) {
|
|
145
|
+
if (!flags.targets) {
|
|
146
|
+
process.stderr.write('[dye2e] error: --targets <TEST-TARGETS.md | targets.json> required\n');
|
|
147
|
+
return 2;
|
|
148
|
+
}
|
|
149
|
+
const list = (value) => (value ?? '').split(',').map((s) => s.trim()).filter(Boolean);
|
|
150
|
+
const loginPaths = {};
|
|
151
|
+
list(flags['login-paths']).forEach((pair) => {
|
|
152
|
+
const [key, loginPath] = pair.split('=');
|
|
153
|
+
loginPaths[key] = loginPath;
|
|
154
|
+
});
|
|
155
|
+
const only = list(flags.only);
|
|
156
|
+
const targets = DyE2E_NotificationSweep_Util.readTargets(flags.targets, loginPaths)
|
|
157
|
+
.filter((t) => !only.length || only.includes(t.key));
|
|
158
|
+
if (!targets.length) {
|
|
159
|
+
process.stderr.write(`[dye2e] error: no target in ${flags.targets}${only.length ? ' after --only' : ''}\n`);
|
|
160
|
+
return 2;
|
|
161
|
+
}
|
|
162
|
+
const executablePath = flags['executable-path'] || process.env.DYE2E_CHROMIUM_EXECUTABLE_PATH;
|
|
163
|
+
const browser = await test_1.chromium.launch(executablePath ? { executablePath: executablePath } : {});
|
|
164
|
+
let outcomes;
|
|
165
|
+
try {
|
|
166
|
+
outcomes = await DyE2E_NotificationSweep_Util.sweep(browser, targets, DyE2E_NotificationSweep_Util.optionsFromFlags(flags, list));
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
await browser.close();
|
|
170
|
+
}
|
|
171
|
+
outcomes.forEach((o) => {
|
|
172
|
+
process.stdout.write('\n### ' + o.row.key + ' -> ' + o.row.reachedUrl + (o.row.note ? ' [' + o.row.note + ']' : '')
|
|
173
|
+
+ '\n' + notification_detector_util_1.DyE2E_NotificationDetector_Util.summarize(o.report, o.row.key) + '\n');
|
|
174
|
+
});
|
|
175
|
+
const rows = outcomes.map((o) => o.row);
|
|
176
|
+
process.stdout.write('\n' + DyE2E_NotificationSweep_Util.matrix(rows) + '\n');
|
|
177
|
+
if (flags.json) {
|
|
178
|
+
fs.writeFileSync(flags.json, JSON.stringify({ generatedAt: new Date().toISOString(), outcomes: outcomes }, null, 2));
|
|
179
|
+
}
|
|
180
|
+
return flags['fail-on-leak'] && rows.some((r) => r.leaks > 0) ? 1 : 0;
|
|
181
|
+
}
|
|
182
|
+
/** One target: fresh context, detector, load, (guarded) submit, collect. */
|
|
183
|
+
static async sweepOne(browser, target, options, probeEmail) {
|
|
184
|
+
const context = await browser.newContext({ ignoreHTTPSErrors: true, viewport: { width: 1280, height: 900 } });
|
|
185
|
+
const notes = [];
|
|
186
|
+
const dialogs = [];
|
|
187
|
+
let mode = options.submit === false ? 'no-submit' : 'probe';
|
|
188
|
+
let submitted = false;
|
|
189
|
+
let page;
|
|
190
|
+
try {
|
|
191
|
+
if (options.prepareContext) {
|
|
192
|
+
await options.prepareContext(context);
|
|
193
|
+
}
|
|
194
|
+
await notification_detector_util_1.DyE2E_NotificationDetector_Util.attach(context);
|
|
195
|
+
page = await context.newPage();
|
|
196
|
+
await page.goto(target.loginUrl, { waitUntil: 'domcontentloaded', timeout: options.navigationTimeoutMs ?? 45_000 });
|
|
197
|
+
await page.waitForTimeout(options.settleMs ?? 5_000);
|
|
198
|
+
// a modal on load is RECORDED (it may be the finding itself), then closed so the form can be used
|
|
199
|
+
await DyE2E_NotificationSweep_Util.captureModalDialogs(page, 'load', notes, dialogs);
|
|
200
|
+
if (mode !== 'no-submit' && !DyE2E_NotificationSweep_Util.isSubmitAllowed(page.url(), options.allowSubmitHosts)) {
|
|
201
|
+
notes.push('submit-refused: ' + new URL(page.url()).hostname + ' is not a test host');
|
|
202
|
+
mode = 'no-submit';
|
|
203
|
+
}
|
|
204
|
+
if (mode !== 'no-submit') {
|
|
205
|
+
let email = probeEmail;
|
|
206
|
+
let password = options.probePassword ?? DyE2E_NotificationSweep_Util.defaultProbePassword;
|
|
207
|
+
if (options.real) {
|
|
208
|
+
if (process.env.E2E_PERSISTENT_USER_EMAIL && process.env.E2E_PERSISTENT_USER_PASSWORD) {
|
|
209
|
+
email = process.env.E2E_PERSISTENT_USER_EMAIL;
|
|
210
|
+
password = process.env.E2E_PERSISTENT_USER_PASSWORD;
|
|
211
|
+
mode = 'real';
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
notes.push('real requested, E2E_PERSISTENT_USER_EMAIL/_PASSWORD not set: wrong-password probe used');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
submitted = await DyE2E_NotificationSweep_Util.submitLogin(page, email, password, notes);
|
|
218
|
+
if (submitted) {
|
|
219
|
+
await page.waitForTimeout(options.afterSubmitMs ?? 9_000);
|
|
220
|
+
await DyE2E_NotificationSweep_Util.captureModalDialogs(page, 'after-submit', notes, dialogs);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
notes.push('flow-error: ' + (error instanceof Error ? error.message : String(error)).split('\n')[0].slice(0, 140));
|
|
226
|
+
}
|
|
227
|
+
const report = page
|
|
228
|
+
? await notification_detector_util_1.DyE2E_NotificationDetector_Util.collect(page)
|
|
229
|
+
: { notifications: [], visibleErrors: [], consoleErrors: [], pageErrors: [] };
|
|
230
|
+
const reachedUrl = page ? page.url() : target.loginUrl;
|
|
231
|
+
await context.close();
|
|
232
|
+
const leakingDialogs = dialogs.filter((d) => d.rawTechnicalLeak).length;
|
|
233
|
+
return {
|
|
234
|
+
report: report,
|
|
235
|
+
dialogs: dialogs,
|
|
236
|
+
row: {
|
|
237
|
+
key: target.key,
|
|
238
|
+
loginUrl: target.loginUrl,
|
|
239
|
+
reachedUrl: reachedUrl,
|
|
240
|
+
mode: mode,
|
|
241
|
+
submitted: submitted,
|
|
242
|
+
notifications: report.notifications.length,
|
|
243
|
+
errorOrWarning: report.notifications.filter((n) => n.type === 'error' || n.type === 'warning').length,
|
|
244
|
+
banners: report.visibleErrors.length,
|
|
245
|
+
dialogs: dialogs.length,
|
|
246
|
+
leaks: report.visibleErrors.filter((e) => e.rawTechnicalLeak).length
|
|
247
|
+
+ leakingDialogs,
|
|
248
|
+
consoleErrors: report.consoleErrors.filter((c) => c.type === 'error').length,
|
|
249
|
+
pageErrors: report.pageErrors.length,
|
|
250
|
+
note: notes.join(' · '),
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Records, then closes the MODAL dialogs (cdk overlay, `aria-modal="true"`, `alertdialog`) — measured 2026-09-24:
|
|
256
|
+
* - on 3 of 7 TEST sites a "This is NOT the production system" notice covered the login (every click hit it);
|
|
257
|
+
* - on one, the modal WAS the finding: "An unexpected error occurred: this.… is not a function" on page load —
|
|
258
|
+
* so every dialog is recorded (text + raw-technical-leak flag) BEFORE it is closed, never silently swept away.
|
|
259
|
+
* A non-modal `role="dialog"` (a cookie-consent bar) does not block the page and is left alone. Escape first, then
|
|
260
|
+
* the dialog's own action button; a modal that stays open stops the loop (named in the note).
|
|
261
|
+
*/
|
|
262
|
+
static async captureModalDialogs(page, phase, notes, dialogs) {
|
|
263
|
+
for (let round = 0; round < 3; round++) {
|
|
264
|
+
const dialog = page.locator('.cdk-overlay-container [role="dialog"]:visible, '
|
|
265
|
+
+ '.cdk-overlay-container mat-dialog-container:visible, [role="dialog"][aria-modal="true"]:visible, '
|
|
266
|
+
+ '[role="alertdialog"]:visible').first();
|
|
267
|
+
if (!await dialog.count()) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const fullText = ((await dialog.textContent()) ?? '').replace(/\s+/g, ' ').trim().slice(0, 300);
|
|
271
|
+
const text = fullText.slice(0, 70);
|
|
272
|
+
dialogs.push({
|
|
273
|
+
phase: phase,
|
|
274
|
+
text: fullText,
|
|
275
|
+
rawTechnicalLeak: notification_detector_util_1.DyE2E_NotificationDetector_Util.isRawTechnicalLeak(fullText),
|
|
276
|
+
});
|
|
277
|
+
await page.keyboard.press('Escape');
|
|
278
|
+
await page.waitForTimeout(300);
|
|
279
|
+
if (await dialog.isVisible()) {
|
|
280
|
+
const action = dialog.locator('mat-dialog-actions button, [mat-dialog-actions] button, button').last();
|
|
281
|
+
if (await action.count()) {
|
|
282
|
+
await action.click({ timeout: 3_000 }).catch(() => undefined);
|
|
283
|
+
await page.waitForTimeout(300);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const stillOpen = await dialog.isVisible();
|
|
287
|
+
notes.push(phase + ' dialog: "' + text + '"' + (stillOpen ? ' (it stayed open)' : ' (closed)'));
|
|
288
|
+
if (stillOpen) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/** Fills the login form and submits it; a missing field is a note, not a crash. */
|
|
294
|
+
static async submitLogin(page, email, password, notes) {
|
|
295
|
+
const passwordField = page.locator('input[type="password"]').first();
|
|
296
|
+
if (!await passwordField.count()) {
|
|
297
|
+
notes.push('submit-skip: no password field on the page');
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
await page.locator(DyE2E_NotificationSweep_Util.emailSelector).first().fill(email, { timeout: 8_000 });
|
|
301
|
+
await passwordField.fill(password, { timeout: 8_000 });
|
|
302
|
+
const button = page.locator(DyE2E_NotificationSweep_Util.submitSelector).first();
|
|
303
|
+
if (await button.count()) {
|
|
304
|
+
await button.click({ timeout: 8_000 });
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
await passwordField.press('Enter');
|
|
308
|
+
}
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
/** CLI flags → sweep options. */
|
|
312
|
+
static optionsFromFlags(flags, list) {
|
|
313
|
+
const number = (value) => (value && !Number.isNaN(Number(value)) ? Number(value) : undefined);
|
|
314
|
+
return {
|
|
315
|
+
submit: !flags['no-submit'],
|
|
316
|
+
real: !!flags.real,
|
|
317
|
+
probeEmail: flags['probe-email'],
|
|
318
|
+
ownDomains: list(flags['own-domains']),
|
|
319
|
+
allowSubmitHosts: list(flags['allow-hosts']),
|
|
320
|
+
settleMs: number(flags['settle-ms']),
|
|
321
|
+
afterSubmitMs: number(flags['after-submit-ms']),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
exports.DyE2E_NotificationSweep_Util = DyE2E_NotificationSweep_Util;
|
|
326
|
+
//# sourceMappingURL=notification-sweep.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-sweep.util.js","sourceRoot":"","sources":["../../../../src/_modules/runtime/_collections/notification-sweep.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { BrowserContext } from '@playwright/test';
|
|
2
|
+
import { DyE2E_NotificationReport_Interface } from './notification-report.interface';
|
|
3
|
+
/** One project of a notification sweep: a name and its login page. */
|
|
4
|
+
export interface DyE2E_SweepTarget_Interface {
|
|
5
|
+
key: string;
|
|
6
|
+
loginUrl: string;
|
|
7
|
+
}
|
|
8
|
+
/** How a target was driven. */
|
|
9
|
+
export type DyE2E_SweepMode = 'probe' | 'real' | 'no-submit';
|
|
10
|
+
/** One matrix row of a sweep (BFR-QA-002). */
|
|
11
|
+
export interface DyE2E_SweepRow_Interface {
|
|
12
|
+
key: string;
|
|
13
|
+
loginUrl: string;
|
|
14
|
+
/** Where the page ended up after the flow. */
|
|
15
|
+
reachedUrl: string;
|
|
16
|
+
mode: DyE2E_SweepMode;
|
|
17
|
+
/** The login form was really submitted. */
|
|
18
|
+
submitted: boolean;
|
|
19
|
+
notifications: number;
|
|
20
|
+
errorOrWarning: number;
|
|
21
|
+
banners: number;
|
|
22
|
+
/** Modal dialogs seen (on load or after the submit) — each recorded before it was closed. */
|
|
23
|
+
dialogs: number;
|
|
24
|
+
/** Banners AND dialogs that leak raw technical detail (`Http failure response`, `/api/`, `… is not a function`). */
|
|
25
|
+
leaks: number;
|
|
26
|
+
consoleErrors: number;
|
|
27
|
+
pageErrors: number;
|
|
28
|
+
/** Why something was skipped / refused / fell back (empty = the full flow ran). */
|
|
29
|
+
note: string;
|
|
30
|
+
}
|
|
31
|
+
/** A modal dialog the sweep met (and closed) — it may be the finding itself. */
|
|
32
|
+
export interface DyE2E_SweepDialog_Interface {
|
|
33
|
+
phase: 'load' | 'after-submit';
|
|
34
|
+
/** Whitespace-collapsed text, capped at 300 chars. */
|
|
35
|
+
text: string;
|
|
36
|
+
rawTechnicalLeak: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** A row plus the full detector report and the dialogs behind it. */
|
|
39
|
+
export interface DyE2E_SweepOutcome_Interface {
|
|
40
|
+
row: DyE2E_SweepRow_Interface;
|
|
41
|
+
report: DyE2E_NotificationReport_Interface;
|
|
42
|
+
dialogs: DyE2E_SweepDialog_Interface[];
|
|
43
|
+
}
|
|
44
|
+
/** Options of a sweep. */
|
|
45
|
+
export interface DyE2E_SweepOptions_Interface {
|
|
46
|
+
/** Submit the login form (default `true`); `false` = only load the page. */
|
|
47
|
+
submit?: boolean;
|
|
48
|
+
/** Use the registered test account from `E2E_PERSISTENT_USER_EMAIL` / `_PASSWORD` (default `false`). */
|
|
49
|
+
real?: boolean;
|
|
50
|
+
/** Probe e-mail (default `dye2e-sweep-probe@example.com`); must be on a reserved or an `ownDomains` domain. */
|
|
51
|
+
probeEmail?: string;
|
|
52
|
+
/** Probe password (default: a fixed wrong password). */
|
|
53
|
+
probePassword?: string;
|
|
54
|
+
/** Your own e-mail domains, allowed for `probeEmail` besides the reserved ones. */
|
|
55
|
+
ownDomains?: string[];
|
|
56
|
+
/** Hosts the form may be submitted to besides the test hosts (`test.*`, `*.test`, `localhost` …). */
|
|
57
|
+
allowSubmitHosts?: string[];
|
|
58
|
+
/** Wait after the page load before submitting (default 5000 ms). */
|
|
59
|
+
settleMs?: number;
|
|
60
|
+
/** Wait after the submit for the notifications (default 9000 ms). */
|
|
61
|
+
afterSubmitMs?: number;
|
|
62
|
+
/** Per-navigation timeout (default 45000 ms). */
|
|
63
|
+
navigationTimeoutMs?: number;
|
|
64
|
+
/** Called for every new context before the detector is attached (routing mocks, headers …). */
|
|
65
|
+
prepareContext?: (context: BrowserContext) => Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=notification-sweep.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-sweep.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/runtime/_models/notification-sweep.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AAErF,sEAAsE;AACtE,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAE7D,8CAA8C;AAC9C,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,eAAe,CAAC;IACtB,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,6FAA6F;IAC7F,OAAO,EAAE,MAAM,CAAC;IAChB,oHAAoH;IACpH,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gFAAgF;AAChF,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;IAC/B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,qEAAqE;AACrE,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,wBAAwB,CAAC;IAC9B,MAAM,EAAE,kCAAkC,CAAC;IAC3C,OAAO,EAAE,2BAA2B,EAAE,CAAC;CACxC;AAED,0BAA0B;AAC1B,MAAM,WAAW,4BAA4B;IAC3C,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wGAAwG;IACxG,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qGAAqG;IACrG,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+FAA+F;IAC/F,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-sweep.interface.js","sourceRoot":"","sources":["../../../../src/_modules/runtime/_models/notification-sweep.interface.ts"],"names":[],"mappings":""}
|
|
@@ -15,10 +15,12 @@
|
|
|
15
15
|
export * from './_collections/assertion-helpers.util';
|
|
16
16
|
export * from './_collections/notification-detector-page-script.const';
|
|
17
17
|
export * from './_collections/notification-detector.util';
|
|
18
|
+
export * from './_collections/notification-sweep.util';
|
|
18
19
|
export * from './_collections/unique-generator.util';
|
|
19
20
|
export * from './_collections/wait-helpers.util';
|
|
20
21
|
export * from './_models/index';
|
|
21
22
|
export * from './_models/notification-report.interface';
|
|
23
|
+
export * from './_models/notification-sweep.interface';
|
|
22
24
|
export * from './_models/test-user.interface';
|
|
23
25
|
export * from './_services/dialog-page-object';
|
|
24
26
|
export * from './_services/field-page-object';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,cAAc,uCAAuC,CAAC;AACtD,cAAc,wDAAwD,CAAC;AACvE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,yCAAyC,CAAC;AACxD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,YAAY,CAAC;AAE3B,eAAO,MAAM,qBAAqB,EAAE,MAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,cAAc,uCAAuC,CAAC;AACtD,cAAc,wDAAwD,CAAC;AACvE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,YAAY,CAAC;AAE3B,eAAO,MAAM,qBAAqB,EAAE,MAAwB,CAAC"}
|
|
@@ -32,10 +32,12 @@ exports.DYE2E_RUNTIME_VERSION = void 0;
|
|
|
32
32
|
__exportStar(require("./_collections/assertion-helpers.util"), exports);
|
|
33
33
|
__exportStar(require("./_collections/notification-detector-page-script.const"), exports);
|
|
34
34
|
__exportStar(require("./_collections/notification-detector.util"), exports);
|
|
35
|
+
__exportStar(require("./_collections/notification-sweep.util"), exports);
|
|
35
36
|
__exportStar(require("./_collections/unique-generator.util"), exports);
|
|
36
37
|
__exportStar(require("./_collections/wait-helpers.util"), exports);
|
|
37
38
|
__exportStar(require("./_models/index"), exports);
|
|
38
39
|
__exportStar(require("./_models/notification-report.interface"), exports);
|
|
40
|
+
__exportStar(require("./_models/notification-sweep.interface"), exports);
|
|
39
41
|
__exportStar(require("./_models/test-user.interface"), exports);
|
|
40
42
|
__exportStar(require("./_services/dialog-page-object"), exports);
|
|
41
43
|
__exportStar(require("./_services/field-page-object"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/runtime/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;GAaG;AACH,wEAAsD;AACtD,yFAAuE;AACvE,4EAA0D;AAC1D,uEAAqD;AACrD,mEAAiD;AACjD,kDAAgC;AAChC,0EAAwD;AACxD,gEAA8C;AAC9C,iEAA+C;AAC/C,gEAA8C;AAC9C,+DAA6C;AAC7C,iEAA+C;AAC/C,6DAA2C;AAC3C,qEAAmD;AACnD,8DAA4C;AAC5C,gEAA8C;AAC9C,mEAAiD;AACjD,6CAA2B;AAEd,QAAA,qBAAqB,GAAW,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/runtime/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;GAaG;AACH,wEAAsD;AACtD,yFAAuE;AACvE,4EAA0D;AAC1D,yEAAuD;AACvD,uEAAqD;AACrD,mEAAiD;AACjD,kDAAgC;AAChC,0EAAwD;AACxD,yEAAuD;AACvD,gEAA8C;AAC9C,iEAA+C;AAC/C,gEAA8C;AAC9C,+DAA6C;AAC7C,iEAA+C;AAC/C,6DAA2C;AAC3C,qEAAmD;AACnD,8DAA4C;AAC5C,gEAA8C;AAC9C,mEAAiD;AACjD,6CAA2B;AAEd,QAAA,qBAAqB,GAAW,eAAe,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -24,5 +24,5 @@ __exportStar(require("./_modules/cwv/index"), exports);
|
|
|
24
24
|
__exportStar(require("./_modules/vqa/index"), exports);
|
|
25
25
|
__exportStar(require("./_modules/game/index"), exports);
|
|
26
26
|
/** Package-version stamp — npm-publish-time runtime-érték. */
|
|
27
|
-
exports.DYE2E_PACKAGE_VERSION = '01.18.
|
|
27
|
+
exports.DYE2E_PACKAGE_VERSION = '01.18.16';
|
|
28
28
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/dynamo-e2e",
|
|
3
|
-
"version": "01.18.
|
|
3
|
+
"version": "01.18.16",
|
|
4
4
|
"description": "End-to-end testing engine for the Dynamo + FDP ecosystem — auto-generated form-coverage tests, viewport audit matrix, CWV diagnostics. Settings-POJO-first.",
|
|
5
5
|
"DyBu_settings": {
|
|
6
6
|
"packageType": "core-package",
|