@opice/harness 0.7.0 → 0.8.0
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/README.md +4 -0
- package/dist/dsn.d.ts +8 -6
- package/dist/dsn.d.ts.map +1 -1
- package/dist/dsn.js +4 -3
- package/dist/dsn.js.map +1 -1
- package/dist/reporter.d.ts +14 -2
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +77 -14
- package/dist/reporter.js.map +1 -1
- package/dist/scenario.d.ts.map +1 -1
- package/dist/scenario.js +11 -1
- package/dist/scenario.js.map +1 -1
- package/package.json +1 -1
- package/src/dsn.ts +12 -9
- package/src/reporter.ts +94 -16
- package/src/scenario.ts +13 -1
package/README.md
CHANGED
|
@@ -149,4 +149,8 @@ export const setup: BrowserSetup = async (context) => {
|
|
|
149
149
|
`never`. Outside CI, reporting is opt-in so iterating with bare `bun test` doesn't stream
|
|
150
150
|
half-finished runs onto the shared dashboard. CI-detected runs are tagged `ci`, opted-in
|
|
151
151
|
local runs `local`.
|
|
152
|
+
- `OPICE_REPORT_STRICT` — `1`/`true` to **fail the run** if reporting to the platform fails
|
|
153
|
+
(default best-effort: a reporting failure is logged loudly but never reddens the test). Use
|
|
154
|
+
it to catch a misconfigured token / unreachable endpoint that would otherwise leave CI green
|
|
155
|
+
while nothing reaches the dashboard. `opice test --fail-on-report-error` sets this for you.
|
|
152
156
|
```
|
package/dist/dsn.d.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* An opice DSN packs everything a project needs to report into one string:
|
|
3
3
|
*
|
|
4
|
-
* OPICE_DSN=https://<
|
|
4
|
+
* OPICE_DSN=https://<clientId>:<clientSecret>@<host>/<slug>
|
|
5
5
|
*
|
|
6
|
-
* The
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* The DSN is a Cloudflare Access SERVICE TOKEN: the client id + secret ride in the
|
|
7
|
+
* userinfo (sent as the `CF-Access-Client-Id` / `CF-Access-Client-Secret` headers),
|
|
8
|
+
* the host is the platform endpoint, and the first path segment is the project slug.
|
|
9
|
+
* It's the single value the dashboard hands you to drop into `.env`; the individual
|
|
10
|
+
* `OPICE_*` vars still win when set, so a DSN is purely a convenience fallback.
|
|
10
11
|
*/
|
|
11
12
|
export interface OpiceDsn {
|
|
12
|
-
|
|
13
|
+
clientId: string;
|
|
14
|
+
clientSecret: string;
|
|
13
15
|
endpoint: string;
|
|
14
16
|
project: string;
|
|
15
17
|
}
|
package/dist/dsn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dsn.d.ts","sourceRoot":"","sources":["../src/dsn.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dsn.d.ts","sourceRoot":"","sources":["../src/dsn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,QAAQ;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,CAa7E"}
|
package/dist/dsn.js
CHANGED
|
@@ -8,10 +8,11 @@ export function parseOpiceDsn(raw) {
|
|
|
8
8
|
catch {
|
|
9
9
|
return null;
|
|
10
10
|
}
|
|
11
|
-
const
|
|
11
|
+
const clientId = decodeURIComponent(url.username);
|
|
12
|
+
const clientSecret = decodeURIComponent(url.password);
|
|
12
13
|
const project = url.pathname.replace(/^\/+/, '').split('/')[0] ?? '';
|
|
13
|
-
if (!
|
|
14
|
+
if (!clientId || !clientSecret || !project)
|
|
14
15
|
return null;
|
|
15
|
-
return {
|
|
16
|
+
return { clientId, clientSecret, endpoint: `${url.protocol}//${url.host}`, project };
|
|
16
17
|
}
|
|
17
18
|
//# sourceMappingURL=dsn.js.map
|
package/dist/dsn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dsn.js","sourceRoot":"","sources":["../src/dsn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dsn.js","sourceRoot":"","sources":["../src/dsn.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,aAAa,CAAC,GAA8B;IAC3D,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,IAAI,GAAQ,CAAA;IACZ,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACjD,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACpE,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACvD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAA;AACrF,CAAC"}
|
package/dist/reporter.d.ts
CHANGED
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
export interface ReporterConfig {
|
|
17
17
|
endpoint: string;
|
|
18
18
|
projectId: string;
|
|
19
|
-
|
|
19
|
+
/** Service-token credentials (the OPICE_DSN userinfo / OPICE_CLIENT_ID+SECRET). */
|
|
20
|
+
clientId: string;
|
|
21
|
+
clientSecret: string;
|
|
20
22
|
branch?: string;
|
|
21
23
|
commit?: string;
|
|
22
24
|
/** 'ci' for runs from automation, 'local' for opted-in dev runs. */
|
|
@@ -28,6 +30,8 @@ export interface ReporterConfig {
|
|
|
28
30
|
*/
|
|
29
31
|
tier?: string;
|
|
30
32
|
}
|
|
33
|
+
/** Whether strict reporting is active (see {@link strictReporting}). */
|
|
34
|
+
export declare function isStrictReporting(): boolean;
|
|
31
35
|
export interface StepEvent {
|
|
32
36
|
scenarioId: string;
|
|
33
37
|
/**
|
|
@@ -106,13 +110,21 @@ export interface Reporter {
|
|
|
106
110
|
recordStep(event: StepEvent): Promise<void>;
|
|
107
111
|
finishScenario(input: ScenarioFinish): Promise<void>;
|
|
108
112
|
flush(): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* True if any report to the platform failed (network error or non-2xx). Used
|
|
115
|
+
* by the harness to fail the run under strict reporting — see
|
|
116
|
+
* {@link isStrictReporting}. Always false for the no-op reporter.
|
|
117
|
+
*/
|
|
118
|
+
hadFailures(): boolean;
|
|
109
119
|
}
|
|
110
120
|
export declare const HANDOFF_DIR: string;
|
|
111
121
|
export interface RunHandoff {
|
|
112
122
|
endpoint: string;
|
|
113
123
|
/** Project slug — the CLI builds /api/v1/<project>/runs/<id>/finish from it. */
|
|
114
124
|
project: string;
|
|
115
|
-
|
|
125
|
+
/** Service-token credentials so the CLI can POST /finish with the CF-Access-Client-* headers. */
|
|
126
|
+
clientId: string;
|
|
127
|
+
clientSecret: string;
|
|
116
128
|
runId: string;
|
|
117
129
|
}
|
|
118
130
|
export declare function getReporter(): Reporter;
|
package/dist/reporter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
|
package/dist/reporter.js
CHANGED
|
@@ -23,6 +23,22 @@ import { resolveSelectedTier } from './tier.js';
|
|
|
23
23
|
const REQUEST_TIMEOUT_MS = 10_000;
|
|
24
24
|
/** Total cap on `flush()` waiting for pending step uploads (afterAll-bounded). */
|
|
25
25
|
const FLUSH_BUDGET_MS = 15_000;
|
|
26
|
+
/**
|
|
27
|
+
* Strict reporting policy, resolved once from the env in {@link configureFromEnv}.
|
|
28
|
+
*
|
|
29
|
+
* Reporting is best-effort by design — a flaky uplink or a dashboard outage must
|
|
30
|
+
* never redden an otherwise-green test run. But that decoupling hides a real
|
|
31
|
+
* failure mode: a misconfigured token or an unreachable endpoint means the run
|
|
32
|
+
* is silently NOT recorded, while CI stays green. Strict mode (opt in via
|
|
33
|
+
* `OPICE_REPORT_STRICT` / `opice test --fail-on-report-error`) makes that loud —
|
|
34
|
+
* any reporting failure fails the run (the harness throws from a scenario's
|
|
35
|
+
* `afterAll`; the CLI escalates a failed `POST /finish` to a non-zero exit).
|
|
36
|
+
*/
|
|
37
|
+
let strictReporting = false;
|
|
38
|
+
/** Whether strict reporting is active (see {@link strictReporting}). */
|
|
39
|
+
export function isStrictReporting() {
|
|
40
|
+
return strictReporting;
|
|
41
|
+
}
|
|
26
42
|
class NoopReporter {
|
|
27
43
|
async startScenario(input) {
|
|
28
44
|
return `noop-${input.name}-${Date.now()}`;
|
|
@@ -31,6 +47,9 @@ class NoopReporter {
|
|
|
31
47
|
async recordStep(_event) { }
|
|
32
48
|
async finishScenario(_input) { }
|
|
33
49
|
async flush() { }
|
|
50
|
+
hadFailures() {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
34
53
|
}
|
|
35
54
|
export const HANDOFF_DIR = path.join(tmpdir(), 'opice-handoffs');
|
|
36
55
|
function handoffPath(pid = process.pid) {
|
|
@@ -41,9 +60,14 @@ class HttpReporter {
|
|
|
41
60
|
runIdPromise = null;
|
|
42
61
|
pending = new Set();
|
|
43
62
|
warnedUnreachable = false;
|
|
63
|
+
/** Count of failed reports (network error or non-2xx). Drives strict mode. */
|
|
64
|
+
failures = 0;
|
|
44
65
|
constructor(config) {
|
|
45
66
|
this.config = config;
|
|
46
67
|
}
|
|
68
|
+
hadFailures() {
|
|
69
|
+
return this.failures > 0;
|
|
70
|
+
}
|
|
47
71
|
async ensureRun() {
|
|
48
72
|
if (!this.runIdPromise) {
|
|
49
73
|
this.runIdPromise = this.startRun();
|
|
@@ -65,7 +89,8 @@ class HttpReporter {
|
|
|
65
89
|
const handoff = {
|
|
66
90
|
endpoint: this.config.endpoint,
|
|
67
91
|
project: this.config.projectId,
|
|
68
|
-
|
|
92
|
+
clientId: this.config.clientId,
|
|
93
|
+
clientSecret: this.config.clientSecret,
|
|
69
94
|
runId,
|
|
70
95
|
};
|
|
71
96
|
writeFileSync(handoffPath(), JSON.stringify(handoff), 'utf-8');
|
|
@@ -171,7 +196,9 @@ class HttpReporter {
|
|
|
171
196
|
response = await fetch(this.config.endpoint + path, {
|
|
172
197
|
method,
|
|
173
198
|
headers: {
|
|
174
|
-
|
|
199
|
+
// Cloudflare Access service-token pair — validated at the edge, never the origin.
|
|
200
|
+
'cf-access-client-id': this.config.clientId,
|
|
201
|
+
'cf-access-client-secret': this.config.clientSecret,
|
|
175
202
|
'content-type': 'application/json',
|
|
176
203
|
},
|
|
177
204
|
body: body == null ? undefined : JSON.stringify(body),
|
|
@@ -184,25 +211,33 @@ class HttpReporter {
|
|
|
184
211
|
// DOM and routes fetch through a same-origin policy). Callers swallow
|
|
185
212
|
// reporter errors so the test still runs, so this is the one place the
|
|
186
213
|
// failure is visible — make it loud and actionable.
|
|
187
|
-
this.
|
|
214
|
+
this.noteFailure(`${method} ${path}`, err instanceof Error ? err.message : String(err));
|
|
188
215
|
throw err;
|
|
189
216
|
}
|
|
190
217
|
if (!response.ok) {
|
|
191
218
|
const detail = `${response.status} ${await response.text()}`.trim();
|
|
192
|
-
this.
|
|
219
|
+
this.noteFailure(`${method} ${path}`, detail);
|
|
193
220
|
throw new Error(`opice reporter ${method} ${path} failed: ${detail}`);
|
|
194
221
|
}
|
|
195
222
|
return (await response.json());
|
|
196
223
|
}
|
|
197
224
|
/**
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
225
|
+
* Record a reporting failure and surface it. Callers swallow reporter errors
|
|
226
|
+
* so the test still runs (reporting is best-effort), which makes this the one
|
|
227
|
+
* place a failure is visible — so every failure is logged to stderr (a
|
|
228
|
+
* configured reporter that can't reach the platform means the run is silently
|
|
229
|
+
* NOT recorded, the most confusing failure mode in onboarding: the test
|
|
230
|
+
* passes but nothing shows on the dashboard). The first failure prints the
|
|
231
|
+
* full hint with the usual culprits; the rest a concise one-liner so a
|
|
232
|
+
* recurring failure is visible without flooding the log. Counts toward
|
|
233
|
+
* {@link hadFailures}, which strict mode fails the run on.
|
|
202
234
|
*/
|
|
203
|
-
|
|
204
|
-
|
|
235
|
+
noteFailure(call, detail) {
|
|
236
|
+
this.failures++;
|
|
237
|
+
if (this.warnedUnreachable) {
|
|
238
|
+
console.error(`[opice] reporter error (${call}): ${detail} — this report was NOT recorded.`);
|
|
205
239
|
return;
|
|
240
|
+
}
|
|
206
241
|
this.warnedUnreachable = true;
|
|
207
242
|
console.error(`[opice] reporter could not reach the platform (${call}: ${detail}). `
|
|
208
243
|
+ `This run will NOT be recorded on the dashboard.\n`
|
|
@@ -210,7 +245,8 @@ class HttpReporter {
|
|
|
210
245
|
+ `[opice] - the test runner's global setup installs a DOM (happy-dom/jsdom) or mocks\n`
|
|
211
246
|
+ `[opice] fetch, so the cross-origin POST is blocked (look for "Cross-Origin Request\n`
|
|
212
247
|
+ `[opice] Blocked" / an OPTIONS … 401). Scope that setup so it skips the e2e dir.\n`
|
|
213
|
-
+ `[opice] - a missing / expired OPICE_DSN api key (401), or an unreachable endpoint
|
|
248
|
+
+ `[opice] - a missing / expired OPICE_DSN api key (401), or an unreachable endpoint.\n`
|
|
249
|
+
+ `[opice] (set OPICE_REPORT_STRICT=1 / opice test --fail-on-report-error to fail the run on this.)`);
|
|
214
250
|
}
|
|
215
251
|
}
|
|
216
252
|
let active = new NoopReporter();
|
|
@@ -220,13 +256,37 @@ export function getReporter() {
|
|
|
220
256
|
export function setReporter(reporter) {
|
|
221
257
|
active = reporter;
|
|
222
258
|
}
|
|
259
|
+
function isTruthy(value) {
|
|
260
|
+
if (!value)
|
|
261
|
+
return false;
|
|
262
|
+
const v = value.toLowerCase();
|
|
263
|
+
return v === '1' || v === 'true' || v === 'yes' || v === 'on';
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Strict reporting is requested but the reporter is a no-op — it can never fail,
|
|
267
|
+
* so strict mode has nothing to enforce. Warn rather than silently ignoring it:
|
|
268
|
+
* the user asked for "fail if reporting fails" and is instead getting no
|
|
269
|
+
* reporting at all, which strict can't catch.
|
|
270
|
+
*/
|
|
271
|
+
function warnStrictNoop(why) {
|
|
272
|
+
console.error(`[opice] OPICE_REPORT_STRICT is set but ${why} — strict reporting has no effect `
|
|
273
|
+
+ `(there is nothing to report, so nothing can fail).`);
|
|
274
|
+
}
|
|
223
275
|
export function configureFromEnv(env = process.env) {
|
|
276
|
+
// Strict reporting: fail the run if any report to the platform fails. Opt-in
|
|
277
|
+
// (default best-effort is locked design), resolved once here for the whole
|
|
278
|
+
// process. The CLI's `--fail-on-report-error` sets OPICE_REPORT_STRICT in the
|
|
279
|
+
// child env, so a bare `bun test` honours it too.
|
|
280
|
+
strictReporting = isTruthy(env['OPICE_REPORT_STRICT']);
|
|
224
281
|
// Individual vars win; OPICE_DSN fills any gaps (see dsn.ts).
|
|
225
282
|
const dsn = parseOpiceDsn(env['OPICE_DSN']);
|
|
226
283
|
const endpoint = env['OPICE_ENDPOINT'] ?? dsn?.endpoint;
|
|
227
284
|
const projectId = env['OPICE_PROJECT'] ?? dsn?.project;
|
|
228
|
-
const
|
|
229
|
-
|
|
285
|
+
const clientId = env['OPICE_CLIENT_ID'] ?? dsn?.clientId;
|
|
286
|
+
const clientSecret = env['OPICE_CLIENT_SECRET'] ?? dsn?.clientSecret;
|
|
287
|
+
if (!endpoint || !projectId || !clientId || !clientSecret) {
|
|
288
|
+
if (strictReporting)
|
|
289
|
+
warnStrictNoop('reporter credentials are not configured (no OPICE_DSN / OPICE_* vars)');
|
|
230
290
|
return new NoopReporter();
|
|
231
291
|
}
|
|
232
292
|
// Reporting is opt-in outside CI. A local `bun test` while authoring would
|
|
@@ -238,12 +298,15 @@ export function configureFromEnv(env = process.env) {
|
|
|
238
298
|
const mode = (env['OPICE_REPORT'] ?? 'auto').toLowerCase();
|
|
239
299
|
const shouldReport = mode === 'never' ? false : mode === 'always' ? true : isCI;
|
|
240
300
|
if (!shouldReport) {
|
|
301
|
+
if (strictReporting)
|
|
302
|
+
warnStrictNoop(`reporting is disabled here (OPICE_REPORT=${mode}, CI=${isCI})`);
|
|
241
303
|
return new NoopReporter();
|
|
242
304
|
}
|
|
243
305
|
const reporter = new HttpReporter({
|
|
244
306
|
endpoint,
|
|
245
307
|
projectId,
|
|
246
|
-
|
|
308
|
+
clientId,
|
|
309
|
+
clientSecret,
|
|
247
310
|
branch: env['OPICE_BRANCH'] ?? env['GITHUB_REF_NAME'],
|
|
248
311
|
commit: env['OPICE_COMMIT'] ?? env['GITHUB_SHA'],
|
|
249
312
|
source: isCI ? 'ci' : 'local',
|
package/dist/reporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAE/C,+EAA+E;AAC/E,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACjC,kFAAkF;AAClF,MAAM,eAAe,GAAG,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAE/C,+EAA+E;AAC/E,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACjC,kFAAkF;AAClF,MAAM,eAAe,GAAG,MAAM,CAAA;AAoB9B;;;;;;;;;;GAUG;AACH,IAAI,eAAe,GAAG,KAAK,CAAA;AAE3B,wEAAwE;AACxE,MAAM,UAAU,iBAAiB;IAChC,OAAO,eAAe,CAAA;AACvB,CAAC;AA4FD,MAAM,YAAY;IACjB,KAAK,CAAC,aAAa,CAAC,KAAoB;QACvC,OAAO,QAAQ,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IAC1C,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,MAAoB,IAAkB,CAAC;IAC1D,KAAK,CAAC,UAAU,CAAC,MAAiB,IAAkB,CAAC;IACrD,KAAK,CAAC,cAAc,CAAC,MAAsB,IAAkB,CAAC;IAC9D,KAAK,CAAC,KAAK,KAAmB,CAAC;IAC/B,WAAW;QACV,OAAO,KAAK,CAAA;IACb,CAAC;CACD;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAA;AAEhE,SAAS,WAAW,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,CAAA;AAC7C,CAAC;AAYD,MAAM,YAAY;IAOY;IANrB,YAAY,GAA2B,IAAI,CAAA;IAClC,OAAO,GAA0B,IAAI,GAAG,EAAE,CAAA;IACnD,iBAAiB,GAAG,KAAK,CAAA;IACjC,8EAA8E;IACtE,QAAQ,GAAG,CAAC,CAAA;IAEpB,YAA6B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAEvD,WAAW;QACV,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;IACzB,CAAC;IAEO,KAAK,CAAC,SAAS;QACtB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QACpC,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IACzB,CAAC;IAEO,KAAK,CAAC,QAAQ;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE;YAClF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;SACtB,CAAC,CAAA;QACF,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAW,CAAA;QACzC,iEAAiE;QACjE,yDAAyD;QACzD,IAAI,CAAC;YACJ,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC3C,MAAM,OAAO,GAAe;gBAC3B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAC9B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACtC,KAAK;aACL,CAAA;YACD,aAAa,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAA;QAC/D,CAAC;QAAC,MAAM,CAAC;YACR,cAAc;QACf,CAAC;QACD,OAAO,KAAK,CAAA;IACb,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAoB;QACvC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,SAAS,KAAK,YAAY,EAAE;YACrG,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;SAChB,CAAC,CAAA;QACF,OAAO,QAAQ,CAAC,YAAY,CAAW,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAmB;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;QACpC,sEAAsE;QACtE,kDAAkD;QAClD,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,SAAS,KAAK,YAAY,EAAE;YACpF,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,KAAK,CAAC,MAAM;SACpB,CAAC,CAAA;IACH,CAAC;IAED,UAAU,CAAC,KAAgB;QAC1B,uEAAuE;QACvE,oEAAoE;QACpE,+CAA+C;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnB,OAAO,OAAO,CAAA;IACf,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,KAAgB;QAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc;YACtC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC;YACnD,CAAC,CAAC,SAAS,CAAA;QACZ,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,SAAS,KAAK,cAAc,KAAK,CAAC,UAAU,QAAQ,EAAE;YAC9G,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU;SACV,CAAC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAqB;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;QACpC,gEAAgE;QAChE,6BAA6B;QAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,SAAS,KAAK,cAAc,KAAK,CAAC,UAAU,EAAE,EAAE;YACzG,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACV,uEAAuE;QACvE,2EAA2E;QAC3E,oEAAoE;QACpE,2EAA2E;QAC3E,sEAAsE;QACtE,kCAAkC;QAClC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAA;QACnF,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;QACnE,4DAA4D;IAC7D,CAAC;IAEO,KAAK,CAAC,OAAyB;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACzB,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IACpD,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC1C,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YACnC,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC9B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAA;QACjB,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,IAAY,EAAE,IAAc;QAC/D,IAAI,QAAkB,CAAA;QACtB,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,EAAE;gBACnD,MAAM;gBACN,OAAO,EAAE;oBACR,kFAAkF;oBAClF,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAC3C,yBAAyB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;oBACnD,cAAc,EAAE,kBAAkB;iBAClC;gBACD,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBACrD,gEAAgE;gBAChE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC;aAC/C,CAAC,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,sEAAsE;YACtE,sEAAsE;YACtE,uEAAuE;YACvE,oDAAoD;YACpD,IAAI,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;YACvF,MAAM,GAAG,CAAA;QACV,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;YACnE,IAAI,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;YAC7C,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,IAAI,IAAI,YAAY,MAAM,EAAE,CAAC,CAAA;QACtE,CAAC;QACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAA;IAC1D,CAAC;IAED;;;;;;;;;;OAUG;IACK,WAAW,CAAC,IAAY,EAAE,MAAc;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,2BAA2B,IAAI,MAAM,MAAM,kCAAkC,CAAC,CAAA;YAC5F,OAAM;QACP,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;QAC7B,OAAO,CAAC,KAAK,CACZ,kDAAkD,IAAI,KAAK,MAAM,KAAK;cACpE,mDAAmD;cACnD,0BAA0B;cAC1B,wFAAwF;cACxF,0FAA0F;cAC1F,uFAAuF;cACvF,wFAAwF;cACxF,kGAAkG,CACpG,CAAA;IACF,CAAC;CACD;AAED,IAAI,MAAM,GAAa,IAAI,YAAY,EAAE,CAAA;AAEzC,MAAM,UAAU,WAAW;IAC1B,OAAO,MAAM,CAAA;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC7C,MAAM,GAAG,QAAQ,CAAA;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAyB;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IAC7B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAA;AAC9D,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,GAAW;IAClC,OAAO,CAAC,KAAK,CACZ,0CAA0C,GAAG,oCAAoC;UAC/E,oDAAoD,CACtD,CAAA;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACpE,6EAA6E;IAC7E,2EAA2E;IAC3E,8EAA8E;IAC9E,kDAAkD;IAClD,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAA;IACtD,8DAA8D;IAC9D,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE,QAAQ,CAAA;IACvD,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,GAAG,EAAE,OAAO,CAAA;IACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,iBAAiB,CAAC,IAAI,GAAG,EAAE,QAAQ,CAAA;IACxD,MAAM,YAAY,GAAG,GAAG,CAAC,qBAAqB,CAAC,IAAI,GAAG,EAAE,YAAY,CAAA;IACpE,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3D,IAAI,eAAe;YAAE,cAAc,CAAC,uEAAuE,CAAC,CAAA;QAC5G,OAAO,IAAI,YAAY,EAAE,CAAA;IAC1B,CAAC;IACD,2EAA2E;IAC3E,4EAA4E;IAC5E,yEAAyE;IACzE,0EAA0E;IAC1E,0BAA0B;IAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;IAC1D,MAAM,YAAY,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAC/E,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,IAAI,eAAe;YAAE,cAAc,CAAC,4CAA4C,IAAI,QAAQ,IAAI,GAAG,CAAC,CAAA;QACpG,OAAO,IAAI,YAAY,EAAE,CAAA;IAC1B,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC;QACjC,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC;QACrD,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC;QAChD,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;QAC7B,0EAA0E;QAC1E,gEAAgE;QAChE,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9D,CAAC,CAAA;IACF,WAAW,CAAC,QAAQ,CAAC,CAAA;IACrB,OAAO,QAAQ,CAAA;AAChB,CAAC;AAED,gCAAgC;AAChC,gBAAgB,EAAE,CAAA"}
|
package/dist/scenario.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../src/scenario.ts"],"names":[],"mappings":"AAMA,OAAO,EAAmD,KAAK,IAAI,EAAc,MAAM,WAAW,CAAA;AAgBlG;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,eAAe;IAC/B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAA;IACZ,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,IAAI,CAAA;IACX;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,QAAS,CAAA;AA0EpD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../src/scenario.ts"],"names":[],"mappings":"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"}
|
package/dist/scenario.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createRequire } from 'node:module';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { closePage, getContext, launchPage } from './context.js';
|
|
4
4
|
import { screenshot } from './element.js';
|
|
5
|
-
import { getReporter } from './reporter.js';
|
|
5
|
+
import { getReporter, isStrictReporting } from './reporter.js';
|
|
6
6
|
import { loadUserSetup } from './setup.js';
|
|
7
7
|
import { isTierSkipped, normalizeTier, parseSelectedTier, TIER_ORDER } from './tier.js';
|
|
8
8
|
/**
|
|
@@ -229,6 +229,16 @@ export function browserTest(meta, fn) {
|
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
currentScenarioId = null;
|
|
232
|
+
// Strict reporting: a swallowed report failure (here or in any earlier
|
|
233
|
+
// hook/step) must turn the run red. afterAll always runs (beforeAll
|
|
234
|
+
// catches its own report failures), so throwing here is enough to make
|
|
235
|
+
// bun exit non-zero even when every assertion passed. The detail was
|
|
236
|
+
// already logged at the point of failure (reporter.noteFailure).
|
|
237
|
+
if (isStrictReporting() && reporter.hadFailures()) {
|
|
238
|
+
throw new Error(`[opice] reporting to the platform failed and strict reporting is on `
|
|
239
|
+
+ `(OPICE_REPORT_STRICT / opice test --fail-on-report-error) — failing the run. `
|
|
240
|
+
+ `See the [opice] reporter error(s) above for the cause.`);
|
|
241
|
+
}
|
|
232
242
|
}, 30_000);
|
|
233
243
|
if (isBody) {
|
|
234
244
|
const body = fn;
|
package/dist/scenario.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario.js","sourceRoot":"","sources":["../src/scenario.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scenario.js","sourceRoot":"","sources":["../src/scenario.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/dsn.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* An opice DSN packs everything a project needs to report into one string:
|
|
3
3
|
*
|
|
4
|
-
* OPICE_DSN=https://<
|
|
4
|
+
* OPICE_DSN=https://<clientId>:<clientSecret>@<host>/<slug>
|
|
5
5
|
*
|
|
6
|
-
* The
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* The DSN is a Cloudflare Access SERVICE TOKEN: the client id + secret ride in the
|
|
7
|
+
* userinfo (sent as the `CF-Access-Client-Id` / `CF-Access-Client-Secret` headers),
|
|
8
|
+
* the host is the platform endpoint, and the first path segment is the project slug.
|
|
9
|
+
* It's the single value the dashboard hands you to drop into `.env`; the individual
|
|
10
|
+
* `OPICE_*` vars still win when set, so a DSN is purely a convenience fallback.
|
|
10
11
|
*/
|
|
11
12
|
export interface OpiceDsn {
|
|
12
|
-
|
|
13
|
+
clientId: string
|
|
14
|
+
clientSecret: string
|
|
13
15
|
endpoint: string
|
|
14
16
|
project: string
|
|
15
17
|
}
|
|
@@ -22,8 +24,9 @@ export function parseOpiceDsn(raw: string | undefined | null): OpiceDsn | null {
|
|
|
22
24
|
} catch {
|
|
23
25
|
return null
|
|
24
26
|
}
|
|
25
|
-
const
|
|
27
|
+
const clientId = decodeURIComponent(url.username)
|
|
28
|
+
const clientSecret = decodeURIComponent(url.password)
|
|
26
29
|
const project = url.pathname.replace(/^\/+/, '').split('/')[0] ?? ''
|
|
27
|
-
if (!
|
|
28
|
-
return {
|
|
30
|
+
if (!clientId || !clientSecret || !project) return null
|
|
31
|
+
return { clientId, clientSecret, endpoint: `${url.protocol}//${url.host}`, project }
|
|
29
32
|
}
|
package/src/reporter.ts
CHANGED
|
@@ -29,7 +29,9 @@ const FLUSH_BUDGET_MS = 15_000
|
|
|
29
29
|
export interface ReporterConfig {
|
|
30
30
|
endpoint: string
|
|
31
31
|
projectId: string
|
|
32
|
-
|
|
32
|
+
/** Service-token credentials (the OPICE_DSN userinfo / OPICE_CLIENT_ID+SECRET). */
|
|
33
|
+
clientId: string
|
|
34
|
+
clientSecret: string
|
|
33
35
|
branch?: string
|
|
34
36
|
commit?: string
|
|
35
37
|
/** 'ci' for runs from automation, 'local' for opted-in dev runs. */
|
|
@@ -42,6 +44,24 @@ export interface ReporterConfig {
|
|
|
42
44
|
tier?: string
|
|
43
45
|
}
|
|
44
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Strict reporting policy, resolved once from the env in {@link configureFromEnv}.
|
|
49
|
+
*
|
|
50
|
+
* Reporting is best-effort by design — a flaky uplink or a dashboard outage must
|
|
51
|
+
* never redden an otherwise-green test run. But that decoupling hides a real
|
|
52
|
+
* failure mode: a misconfigured token or an unreachable endpoint means the run
|
|
53
|
+
* is silently NOT recorded, while CI stays green. Strict mode (opt in via
|
|
54
|
+
* `OPICE_REPORT_STRICT` / `opice test --fail-on-report-error`) makes that loud —
|
|
55
|
+
* any reporting failure fails the run (the harness throws from a scenario's
|
|
56
|
+
* `afterAll`; the CLI escalates a failed `POST /finish` to a non-zero exit).
|
|
57
|
+
*/
|
|
58
|
+
let strictReporting = false
|
|
59
|
+
|
|
60
|
+
/** Whether strict reporting is active (see {@link strictReporting}). */
|
|
61
|
+
export function isStrictReporting(): boolean {
|
|
62
|
+
return strictReporting
|
|
63
|
+
}
|
|
64
|
+
|
|
45
65
|
export interface StepEvent {
|
|
46
66
|
scenarioId: string
|
|
47
67
|
/**
|
|
@@ -124,6 +144,12 @@ export interface Reporter {
|
|
|
124
144
|
recordStep(event: StepEvent): Promise<void>
|
|
125
145
|
finishScenario(input: ScenarioFinish): Promise<void>
|
|
126
146
|
flush(): Promise<void>
|
|
147
|
+
/**
|
|
148
|
+
* True if any report to the platform failed (network error or non-2xx). Used
|
|
149
|
+
* by the harness to fail the run under strict reporting — see
|
|
150
|
+
* {@link isStrictReporting}. Always false for the no-op reporter.
|
|
151
|
+
*/
|
|
152
|
+
hadFailures(): boolean
|
|
127
153
|
}
|
|
128
154
|
|
|
129
155
|
class NoopReporter implements Reporter {
|
|
@@ -134,6 +160,9 @@ class NoopReporter implements Reporter {
|
|
|
134
160
|
async recordStep(_event: StepEvent): Promise<void> {}
|
|
135
161
|
async finishScenario(_input: ScenarioFinish): Promise<void> {}
|
|
136
162
|
async flush(): Promise<void> {}
|
|
163
|
+
hadFailures(): boolean {
|
|
164
|
+
return false
|
|
165
|
+
}
|
|
137
166
|
}
|
|
138
167
|
|
|
139
168
|
export const HANDOFF_DIR = path.join(tmpdir(), 'opice-handoffs')
|
|
@@ -146,7 +175,9 @@ export interface RunHandoff {
|
|
|
146
175
|
endpoint: string
|
|
147
176
|
/** Project slug — the CLI builds /api/v1/<project>/runs/<id>/finish from it. */
|
|
148
177
|
project: string
|
|
149
|
-
|
|
178
|
+
/** Service-token credentials so the CLI can POST /finish with the CF-Access-Client-* headers. */
|
|
179
|
+
clientId: string
|
|
180
|
+
clientSecret: string
|
|
150
181
|
runId: string
|
|
151
182
|
}
|
|
152
183
|
|
|
@@ -154,9 +185,15 @@ class HttpReporter implements Reporter {
|
|
|
154
185
|
private runIdPromise: Promise<string> | null = null
|
|
155
186
|
private readonly pending: Set<Promise<unknown>> = new Set()
|
|
156
187
|
private warnedUnreachable = false
|
|
188
|
+
/** Count of failed reports (network error or non-2xx). Drives strict mode. */
|
|
189
|
+
private failures = 0
|
|
157
190
|
|
|
158
191
|
constructor(private readonly config: ReporterConfig) {}
|
|
159
192
|
|
|
193
|
+
hadFailures(): boolean {
|
|
194
|
+
return this.failures > 0
|
|
195
|
+
}
|
|
196
|
+
|
|
160
197
|
private async ensureRun(): Promise<string> {
|
|
161
198
|
if (!this.runIdPromise) {
|
|
162
199
|
this.runIdPromise = this.startRun()
|
|
@@ -179,7 +216,8 @@ class HttpReporter implements Reporter {
|
|
|
179
216
|
const handoff: RunHandoff = {
|
|
180
217
|
endpoint: this.config.endpoint,
|
|
181
218
|
project: this.config.projectId,
|
|
182
|
-
|
|
219
|
+
clientId: this.config.clientId,
|
|
220
|
+
clientSecret: this.config.clientSecret,
|
|
183
221
|
runId,
|
|
184
222
|
}
|
|
185
223
|
writeFileSync(handoffPath(), JSON.stringify(handoff), 'utf-8')
|
|
@@ -292,7 +330,9 @@ class HttpReporter implements Reporter {
|
|
|
292
330
|
response = await fetch(this.config.endpoint + path, {
|
|
293
331
|
method,
|
|
294
332
|
headers: {
|
|
295
|
-
|
|
333
|
+
// Cloudflare Access service-token pair — validated at the edge, never the origin.
|
|
334
|
+
'cf-access-client-id': this.config.clientId,
|
|
335
|
+
'cf-access-client-secret': this.config.clientSecret,
|
|
296
336
|
'content-type': 'application/json',
|
|
297
337
|
},
|
|
298
338
|
body: body == null ? undefined : JSON.stringify(body),
|
|
@@ -304,25 +344,34 @@ class HttpReporter implements Reporter {
|
|
|
304
344
|
// DOM and routes fetch through a same-origin policy). Callers swallow
|
|
305
345
|
// reporter errors so the test still runs, so this is the one place the
|
|
306
346
|
// failure is visible — make it loud and actionable.
|
|
307
|
-
this.
|
|
347
|
+
this.noteFailure(`${method} ${path}`, err instanceof Error ? err.message : String(err))
|
|
308
348
|
throw err
|
|
309
349
|
}
|
|
310
350
|
if (!response.ok) {
|
|
311
351
|
const detail = `${response.status} ${await response.text()}`.trim()
|
|
312
|
-
this.
|
|
352
|
+
this.noteFailure(`${method} ${path}`, detail)
|
|
313
353
|
throw new Error(`opice reporter ${method} ${path} failed: ${detail}`)
|
|
314
354
|
}
|
|
315
355
|
return (await response.json()) as Record<string, unknown>
|
|
316
356
|
}
|
|
317
357
|
|
|
318
358
|
/**
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
359
|
+
* Record a reporting failure and surface it. Callers swallow reporter errors
|
|
360
|
+
* so the test still runs (reporting is best-effort), which makes this the one
|
|
361
|
+
* place a failure is visible — so every failure is logged to stderr (a
|
|
362
|
+
* configured reporter that can't reach the platform means the run is silently
|
|
363
|
+
* NOT recorded, the most confusing failure mode in onboarding: the test
|
|
364
|
+
* passes but nothing shows on the dashboard). The first failure prints the
|
|
365
|
+
* full hint with the usual culprits; the rest a concise one-liner so a
|
|
366
|
+
* recurring failure is visible without flooding the log. Counts toward
|
|
367
|
+
* {@link hadFailures}, which strict mode fails the run on.
|
|
323
368
|
*/
|
|
324
|
-
private
|
|
325
|
-
|
|
369
|
+
private noteFailure(call: string, detail: string): void {
|
|
370
|
+
this.failures++
|
|
371
|
+
if (this.warnedUnreachable) {
|
|
372
|
+
console.error(`[opice] reporter error (${call}): ${detail} — this report was NOT recorded.`)
|
|
373
|
+
return
|
|
374
|
+
}
|
|
326
375
|
this.warnedUnreachable = true
|
|
327
376
|
console.error(
|
|
328
377
|
`[opice] reporter could not reach the platform (${call}: ${detail}). `
|
|
@@ -331,7 +380,8 @@ class HttpReporter implements Reporter {
|
|
|
331
380
|
+ `[opice] - the test runner's global setup installs a DOM (happy-dom/jsdom) or mocks\n`
|
|
332
381
|
+ `[opice] fetch, so the cross-origin POST is blocked (look for "Cross-Origin Request\n`
|
|
333
382
|
+ `[opice] Blocked" / an OPTIONS … 401). Scope that setup so it skips the e2e dir.\n`
|
|
334
|
-
+ `[opice] - a missing / expired OPICE_DSN api key (401), or an unreachable endpoint
|
|
383
|
+
+ `[opice] - a missing / expired OPICE_DSN api key (401), or an unreachable endpoint.\n`
|
|
384
|
+
+ `[opice] (set OPICE_REPORT_STRICT=1 / opice test --fail-on-report-error to fail the run on this.)`,
|
|
335
385
|
)
|
|
336
386
|
}
|
|
337
387
|
}
|
|
@@ -346,13 +396,39 @@ export function setReporter(reporter: Reporter): void {
|
|
|
346
396
|
active = reporter
|
|
347
397
|
}
|
|
348
398
|
|
|
399
|
+
function isTruthy(value: string | undefined): boolean {
|
|
400
|
+
if (!value) return false
|
|
401
|
+
const v = value.toLowerCase()
|
|
402
|
+
return v === '1' || v === 'true' || v === 'yes' || v === 'on'
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Strict reporting is requested but the reporter is a no-op — it can never fail,
|
|
407
|
+
* so strict mode has nothing to enforce. Warn rather than silently ignoring it:
|
|
408
|
+
* the user asked for "fail if reporting fails" and is instead getting no
|
|
409
|
+
* reporting at all, which strict can't catch.
|
|
410
|
+
*/
|
|
411
|
+
function warnStrictNoop(why: string): void {
|
|
412
|
+
console.error(
|
|
413
|
+
`[opice] OPICE_REPORT_STRICT is set but ${why} — strict reporting has no effect `
|
|
414
|
+
+ `(there is nothing to report, so nothing can fail).`,
|
|
415
|
+
)
|
|
416
|
+
}
|
|
417
|
+
|
|
349
418
|
export function configureFromEnv(env: NodeJS.ProcessEnv = process.env): Reporter {
|
|
419
|
+
// Strict reporting: fail the run if any report to the platform fails. Opt-in
|
|
420
|
+
// (default best-effort is locked design), resolved once here for the whole
|
|
421
|
+
// process. The CLI's `--fail-on-report-error` sets OPICE_REPORT_STRICT in the
|
|
422
|
+
// child env, so a bare `bun test` honours it too.
|
|
423
|
+
strictReporting = isTruthy(env['OPICE_REPORT_STRICT'])
|
|
350
424
|
// Individual vars win; OPICE_DSN fills any gaps (see dsn.ts).
|
|
351
425
|
const dsn = parseOpiceDsn(env['OPICE_DSN'])
|
|
352
426
|
const endpoint = env['OPICE_ENDPOINT'] ?? dsn?.endpoint
|
|
353
427
|
const projectId = env['OPICE_PROJECT'] ?? dsn?.project
|
|
354
|
-
const
|
|
355
|
-
|
|
428
|
+
const clientId = env['OPICE_CLIENT_ID'] ?? dsn?.clientId
|
|
429
|
+
const clientSecret = env['OPICE_CLIENT_SECRET'] ?? dsn?.clientSecret
|
|
430
|
+
if (!endpoint || !projectId || !clientId || !clientSecret) {
|
|
431
|
+
if (strictReporting) warnStrictNoop('reporter credentials are not configured (no OPICE_DSN / OPICE_* vars)')
|
|
356
432
|
return new NoopReporter()
|
|
357
433
|
}
|
|
358
434
|
// Reporting is opt-in outside CI. A local `bun test` while authoring would
|
|
@@ -364,12 +440,14 @@ export function configureFromEnv(env: NodeJS.ProcessEnv = process.env): Reporter
|
|
|
364
440
|
const mode = (env['OPICE_REPORT'] ?? 'auto').toLowerCase()
|
|
365
441
|
const shouldReport = mode === 'never' ? false : mode === 'always' ? true : isCI
|
|
366
442
|
if (!shouldReport) {
|
|
443
|
+
if (strictReporting) warnStrictNoop(`reporting is disabled here (OPICE_REPORT=${mode}, CI=${isCI})`)
|
|
367
444
|
return new NoopReporter()
|
|
368
445
|
}
|
|
369
446
|
const reporter = new HttpReporter({
|
|
370
447
|
endpoint,
|
|
371
448
|
projectId,
|
|
372
|
-
|
|
449
|
+
clientId,
|
|
450
|
+
clientSecret,
|
|
373
451
|
branch: env['OPICE_BRANCH'] ?? env['GITHUB_REF_NAME'],
|
|
374
452
|
commit: env['OPICE_COMMIT'] ?? env['GITHUB_SHA'],
|
|
375
453
|
source: isCI ? 'ci' : 'local',
|
package/src/scenario.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { createRequire } from 'node:module'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { closePage, getContext, launchPage } from './context.js'
|
|
4
4
|
import { screenshot } from './element.js'
|
|
5
|
-
import { getReporter, type Reporter } from './reporter.js'
|
|
5
|
+
import { getReporter, isStrictReporting, type Reporter } from './reporter.js'
|
|
6
6
|
import { loadUserSetup } from './setup.js'
|
|
7
7
|
import { isTierSkipped, normalizeTier, parseSelectedTier, type Tier, TIER_ORDER } from './tier.js'
|
|
8
8
|
|
|
@@ -306,6 +306,18 @@ export function browserTest(meta: BrowserTestMeta, fn: () => void | Promise<void
|
|
|
306
306
|
}
|
|
307
307
|
}
|
|
308
308
|
currentScenarioId = null
|
|
309
|
+
// Strict reporting: a swallowed report failure (here or in any earlier
|
|
310
|
+
// hook/step) must turn the run red. afterAll always runs (beforeAll
|
|
311
|
+
// catches its own report failures), so throwing here is enough to make
|
|
312
|
+
// bun exit non-zero even when every assertion passed. The detail was
|
|
313
|
+
// already logged at the point of failure (reporter.noteFailure).
|
|
314
|
+
if (isStrictReporting() && reporter.hadFailures()) {
|
|
315
|
+
throw new Error(
|
|
316
|
+
`[opice] reporting to the platform failed and strict reporting is on `
|
|
317
|
+
+ `(OPICE_REPORT_STRICT / opice test --fail-on-report-error) — failing the run. `
|
|
318
|
+
+ `See the [opice] reporter error(s) above for the cause.`,
|
|
319
|
+
)
|
|
320
|
+
}
|
|
309
321
|
}, 30_000)
|
|
310
322
|
|
|
311
323
|
if (isBody) {
|