squally-reporter 0.11.0 → 0.13.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 +69 -26
- package/dist/index.d.ts +136 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +328 -63
- package/dist/index.js.map +1 -1
- package/package.json +50 -50
package/README.md
CHANGED
|
@@ -17,21 +17,30 @@ npm install -D squally-reporter
|
|
|
17
17
|
|
|
18
18
|
## Config
|
|
19
19
|
|
|
20
|
-
Set
|
|
20
|
+
Set one env var (e.g. as a CI secret):
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
SQUALLY_INGEST_URL=https://app.squally.dev
|
|
24
23
|
SQUALLY_INGEST_KEY=your-project-ingest-key
|
|
25
24
|
```
|
|
26
25
|
|
|
27
|
-
Find your ingest key
|
|
26
|
+
Find your ingest key in the Squally dashboard under **Settings › Project ›
|
|
27
|
+
Ingest key**.
|
|
28
|
+
|
|
29
|
+
**Since 0.12.0 the URL defaults to `https://app.squally.dev`.** Set
|
|
30
|
+
`SQUALLY_INGEST_URL` only to report to another Squally. Without a key the
|
|
31
|
+
reporter sends nothing and says so once.
|
|
28
32
|
|
|
29
33
|
**Renamed in 0.9.0.** These were `SQUALLY_API_URL` and `SQUALLY_API_KEY`. The
|
|
30
34
|
old names still work for now, with a deprecation warning in the CI log - but
|
|
31
|
-
they belong to Squally's read API now, so rename them.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
they belong to Squally's read API now, so rename them. `SQUALLY_API_URL` is
|
|
36
|
+
only used together with `SQUALLY_API_KEY`, never on its own - and when it is
|
|
37
|
+
set but not used, the reporter sends nothing rather than falling back to the
|
|
38
|
+
default URL, since the variable says you meant another target.
|
|
39
|
+
|
|
40
|
+
**A read key is never sent.** A key starting with `sqly_ro_` is a read API key,
|
|
41
|
+
for scripts and agents; reporting needs the ingest key. Since 0.12.0 the
|
|
42
|
+
reporter refuses one in any of `SQUALLY_INGEST_KEY`, `SQUALLY_API_KEY` or the
|
|
43
|
+
`apiKey` option before sending anything, and says which one to fix.
|
|
35
44
|
|
|
36
45
|
Then add the reporter to `playwright.config.ts`:
|
|
37
46
|
|
|
@@ -61,8 +70,8 @@ reporter: [
|
|
|
61
70
|
],
|
|
62
71
|
```
|
|
63
72
|
|
|
64
|
-
That's it - run your tests as usual (`npx playwright test`)
|
|
65
|
-
|
|
73
|
+
That's it - run your tests as usual (`npx playwright test`); results stream
|
|
74
|
+
to Squally while the suite runs (see *How results reach Squally* below).
|
|
66
75
|
|
|
67
76
|
## Artifact upload (screenshot, trace, browser console)
|
|
68
77
|
|
|
@@ -119,12 +128,14 @@ reporter prints. The numbers below are therefore Squally's current ones rather
|
|
|
119
128
|
than anything this package guarantees, and can change server-side without a new
|
|
120
129
|
release of it:
|
|
121
130
|
|
|
122
|
-
- **50 MB per
|
|
123
|
-
|
|
124
|
-
`console.warn` naming the file and moves on.
|
|
125
|
-
reported as usual, and the run's outcome and exit
|
|
126
|
-
dashboard that artifact is shown as skipped, with
|
|
127
|
-
silently missing.
|
|
131
|
+
- **50 MB per screenshot or trace, 4 MB per browser console**, the same on
|
|
132
|
+
every plan. A larger file is rejected before any bytes are uploaded; the
|
|
133
|
+
reporter logs a `console.warn` naming the file and its limit and moves on.
|
|
134
|
+
The test result itself is reported as usual, and the run's outcome and exit
|
|
135
|
+
code are untouched. In the dashboard that artifact is shown as skipped, with
|
|
136
|
+
the reason, rather than silently missing.
|
|
137
|
+
- **At most 250 artifacts per shard.** Squally keeps the first 250 and skips
|
|
138
|
+
the rest with the reason `limit`, which the reporter explains in one line.
|
|
128
139
|
- **A total storage cap per organization, depending on your Squally plan.**
|
|
129
140
|
Once it is reached, further uploads are rejected the same way until you free
|
|
130
141
|
up space or upgrade. Note that a fully instrumented suite now produces up to
|
|
@@ -151,15 +162,19 @@ dashboard stays close to real time even for a long suite. A batch goes out on
|
|
|
151
162
|
whichever of these comes first:
|
|
152
163
|
|
|
153
164
|
- **25 results.** Fixed, and the same whether you shard or not.
|
|
154
|
-
- **A timer
|
|
155
|
-
|
|
156
|
-
every
|
|
165
|
+
- **A timer: 2 seconds, or 0.4 seconds × the number of shards when that is
|
|
166
|
+
longer, capped at 30 seconds** (0.12.0). Up to five shards every shard
|
|
167
|
+
flushes every 2 seconds; eight shards every 3.2; sixteen every 6.4; from 75
|
|
168
|
+
shards the cap holds it at 30.
|
|
157
169
|
|
|
158
170
|
Only the timer scales. All shards of a run share one rate budget on Squally's
|
|
159
|
-
side
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
171
|
+
side (300 requests a minute per key), and the timer keeps all of them
|
|
172
|
+
together at about half of it. The 25-result threshold is left alone
|
|
173
|
+
deliberately: it bounds how long a *fast* suite waits, and stretching it would
|
|
174
|
+
delay results without bounding the burst any better.
|
|
175
|
+
|
|
176
|
+
A batch also stays under 3 MB (0.12.0): results with long error texts or many
|
|
177
|
+
steps simply go out in more, smaller requests.
|
|
163
178
|
|
|
164
179
|
There is no longer a single-request size limit that could discard a whole run -
|
|
165
180
|
a very large suite simply takes more, smaller requests. As a courtesy the
|
|
@@ -171,6 +186,23 @@ If Squally is unreachable partway through, results already sent stay in the
|
|
|
171
186
|
dashboard; only what could not be delivered is lost, and your test run's exit
|
|
172
187
|
code is never affected either way.
|
|
173
188
|
|
|
189
|
+
## Steps (0.12.0)
|
|
190
|
+
|
|
191
|
+
For an attempt that **failed, or needed a retry**, the reporter also sends the
|
|
192
|
+
steps Playwright recorded - hooks, fixtures, actions, assertions and your own
|
|
193
|
+
`test.step`s, with their durations and `file:line`. Squally shows them on the
|
|
194
|
+
attempt page, the failing step marked. An attempt that passed on its first try
|
|
195
|
+
sends none.
|
|
196
|
+
|
|
197
|
+
- **Typed values never leave your runner.** The value of a `fill`, `type` or
|
|
198
|
+
`pressSequentially` is replaced: `Fill "•••" getByLabel('Password')`. Every
|
|
199
|
+
title also goes through the same secret masking as error texts.
|
|
200
|
+
- **At most 300 steps per attempt, 200 characters per title.** A longer list
|
|
201
|
+
keeps the failing step and the steps it sits in, then the rest in order, and
|
|
202
|
+
tells Squally how many were left out.
|
|
203
|
+
- Nothing to configure: steps come from Playwright's own report, with or
|
|
204
|
+
without tracing.
|
|
205
|
+
|
|
174
206
|
**Only actual test runs appear.** A run shows up in Squally once your first
|
|
175
207
|
test starts, so commands that never run a test create nothing: `--list`,
|
|
176
208
|
a `globalSetup` or `webServer` that fails to start, a `--grep` that matches
|
|
@@ -187,6 +219,11 @@ count against the test.
|
|
|
187
219
|
|
|
188
220
|
## Cancelled runs
|
|
189
221
|
|
|
222
|
+
**Cancelled in Squally.** An admin can cancel a running run from its page in
|
|
223
|
+
Squally. That marks the run there; it does not stop your CI job. What the job
|
|
224
|
+
sends afterwards is discarded, and from 0.12.0 the reporter says so in one
|
|
225
|
+
line - "This run was cancelled in Squally" - instead of advice about job keys.
|
|
226
|
+
|
|
190
227
|
A run stopped with SIGINT - Ctrl+C, or a cancelled CI job - shows in Squally
|
|
191
228
|
as **Cancelled**: the reporter sends what finished and tells Squally the run
|
|
192
229
|
was interrupted. Your exit code stays Playwright's own (130). This needs
|
|
@@ -375,10 +412,16 @@ the shards that did not pass; that attempt waits only for those shards,
|
|
|
375
412
|
completes once they have reported, and passes or fails on the tests they ran -
|
|
376
413
|
the reused shards are neither waited for nor counted, and the run page shows
|
|
377
414
|
them as "passed in #N · not re-run". A re-run shard that never reports still
|
|
378
|
-
leaves the run incomplete after the run timeout.
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
415
|
+
leaves the run incomplete after the run timeout.
|
|
416
|
+
|
|
417
|
+
Other CI systems re-run a job under the id of the run it belongs to - a GitLab
|
|
418
|
+
job retry, an Azure Pipelines re-run, a Bitbucket re-run of failed steps, a
|
|
419
|
+
Buildkite retry, a Travis CI restart. Since 0.11.0 Squally refuses such a
|
|
420
|
+
retry at the start with `ci_run_collision`: the slot is taken by the first
|
|
421
|
+
attempt. **`SQUALLY_CI_JOB_KEY` does not help here** - the retry is the same
|
|
422
|
+
job - so a retry on these systems is not reported; the first attempt stays the
|
|
423
|
+
run. A Drone restart is a new build with a new number, and so a new run in
|
|
424
|
+
Squally, not linked to the one it repeats.
|
|
382
425
|
|
|
383
426
|
**`playwright merge-reports` is not part of this and is not recommended** for
|
|
384
427
|
getting a single run in Squally - the automatic correlation above is the
|
package/dist/index.d.ts
CHANGED
|
@@ -43,15 +43,33 @@ interface AppendResultEntry {
|
|
|
43
43
|
errors?: AppendErrorEntry[];
|
|
44
44
|
consoleOutput: string | null;
|
|
45
45
|
tags?: string[];
|
|
46
|
+
/**
|
|
47
|
+
* Playwright's steps of this attempt (0.12.0), flat, the parent by index -
|
|
48
|
+
* only for an attempt that did not pass on its first try (stepsForAttempt).
|
|
49
|
+
* Omitted otherwise, and by squally-app before 19.10.2026, which ignores
|
|
50
|
+
* fields it does not know.
|
|
51
|
+
*/
|
|
52
|
+
steps?: StepEntry[];
|
|
53
|
+
/** How many steps were left out to stay within MAX_STEPS. Omitted when none. */
|
|
54
|
+
stepsOmitted?: number;
|
|
46
55
|
browserName: string | null;
|
|
47
56
|
errorContext: string | null;
|
|
48
57
|
}
|
|
49
58
|
type ArtifactType = "screenshot" | "trace" | "console";
|
|
59
|
+
/** One step on the wire: title, category, parent index, duration, "file:line", failed. */
|
|
60
|
+
interface StepEntry {
|
|
61
|
+
t: string;
|
|
62
|
+
c: string;
|
|
63
|
+
p: number | null;
|
|
64
|
+
d: number | null;
|
|
65
|
+
l?: string;
|
|
66
|
+
e?: true;
|
|
67
|
+
}
|
|
50
68
|
declare function truncate(value: string, max: number): string;
|
|
51
69
|
declare function truncateOrNull(value: string | null, max: number): string | null;
|
|
52
70
|
/**
|
|
53
|
-
* This shard's flush interval: the base cadence stretched
|
|
54
|
-
* share the rate budget
|
|
71
|
+
* This shard's flush interval: the base cadence, stretched once enough shards
|
|
72
|
+
* share the rate budget to need it.
|
|
55
73
|
*
|
|
56
74
|
* Only the TIMER is scaled. FLUSH_THRESHOLD_RESULTS is not, and that is
|
|
57
75
|
* deliberate: it is a latency bound on a fast suite, not a rate control, and
|
|
@@ -211,15 +229,6 @@ declare function isHttpsUrl(value: string): boolean;
|
|
|
211
229
|
* a debug line: a missing link is no reason to warn on every run.
|
|
212
230
|
*/
|
|
213
231
|
declare function detectCiRunUrl(env: NodeJS.ProcessEnv): string | null;
|
|
214
|
-
/**
|
|
215
|
-
* What the reporter prints when squally-app refuses this job's begin with a
|
|
216
|
-
* 409 (0.11.0). One block per code; nothing is retried and nothing more is
|
|
217
|
-
* sent for this job - the test run itself is untouched.
|
|
218
|
-
* - ci_run_collision: another job already reports this CI run id's slot;
|
|
219
|
-
* - ci_run_mixed: the id would group an unsharded job with a sharded one,
|
|
220
|
-
* or shards of different totals;
|
|
221
|
-
* - anything else: the server's own sentence.
|
|
222
|
-
*/
|
|
223
232
|
declare function beginRefusalMessage(refusal: {
|
|
224
233
|
code: string | null;
|
|
225
234
|
message: string | null;
|
|
@@ -229,6 +238,58 @@ declare function beginRefusalMessage(refusal: {
|
|
|
229
238
|
shardIndex: number | null;
|
|
230
239
|
jobKey: string | null;
|
|
231
240
|
}): string;
|
|
241
|
+
/**
|
|
242
|
+
* A test's identity as Squally stores it: testName and filePath, sent with
|
|
243
|
+
* every result (onTestEnd) and counted at begin (countPlannedTests) - one
|
|
244
|
+
* derivation, so the two can never disagree.
|
|
245
|
+
*
|
|
246
|
+
* Truncated HERE, once, not when the payload is built: testName/filePath
|
|
247
|
+
* are Squally's test identity, and /api/artifacts/presign resolves each
|
|
248
|
+
* artifact back to a TestResult through exactly these two values plus
|
|
249
|
+
* retryCount. Cutting them in two places, or cutting them only for the
|
|
250
|
+
* ingest payload, would make every artifact of a long-named test
|
|
251
|
+
* unmatchable server-side.
|
|
252
|
+
*
|
|
253
|
+
* slice(1), NOT slice(2) - the project name has to stay in the title.
|
|
254
|
+
* See squally-app/docs/ingest-v2-spec.md section 5.1/5.2: testName is
|
|
255
|
+
* part of @@unique([projectId, testName, filePath]), and the identity
|
|
256
|
+
* key is UNCHANGED in v2 (a deliberately conservative decision - see the
|
|
257
|
+
* spec's own section 5.2). "chromium > a.spec.ts > t" and
|
|
258
|
+
* "webkit > a.spec.ts > t" stay two independent identities; merging them
|
|
259
|
+
* would make the same-commit-flip signal treat a browser-specific bug as
|
|
260
|
+
* proven flakiness across the whole suite at once.
|
|
261
|
+
*/
|
|
262
|
+
export declare function testIdentity(test: Pick<TestCase, "titlePath" | "location">): {
|
|
263
|
+
testName: string;
|
|
264
|
+
filePath: string;
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* How many tests this run (this shard, under --shard) will execute, counted
|
|
268
|
+
* the way squally-app counts a run's tests: one per testIdentity -
|
|
269
|
+
* `testName::filePath`, the key of its aggregateTestAttempts - however often
|
|
270
|
+
* that test runs. The suite Playwright hands onBegin is already the shard's
|
|
271
|
+
* subset (the shard filter runs before onBegin).
|
|
272
|
+
*
|
|
273
|
+
* - PROJECTS ARE NOT FOLDED: the project name is part of testName, so
|
|
274
|
+
* "chromium > a.spec.ts > t" and "webkit > a.spec.ts > t" are two tests
|
|
275
|
+
* here exactly as they are two tests in the app.
|
|
276
|
+
* - --repeat-each IS FOLDED: Playwright clones each test per repetition,
|
|
277
|
+
* but every clone has the same identity, and the app counts one test.
|
|
278
|
+
* - Skipped tests count: they are in the suite, and the app counts their
|
|
279
|
+
* skipped result like any other.
|
|
280
|
+
* - SETUP / DEPENDENCY PROJECTS are re-attached to every shard by
|
|
281
|
+
* Playwright, so their tests are in every shard's plan, while the app
|
|
282
|
+
* counts each of them once for the whole group. Accepted: a small
|
|
283
|
+
* overcount of the plan, which the bar shows as a remainder until the
|
|
284
|
+
* run ends.
|
|
285
|
+
*
|
|
286
|
+
* Null when the suite cannot be read: the bar then shows counts only, never
|
|
287
|
+
* a guess. Capped at the server's limit so a nonsense value cannot cost the
|
|
288
|
+
* run.
|
|
289
|
+
*/
|
|
290
|
+
export declare function countPlannedTests(suite: {
|
|
291
|
+
allTests(): Pick<TestCase, "titlePath" | "location">[];
|
|
292
|
+
}): number | null;
|
|
232
293
|
interface ProjectSuiteLike {
|
|
233
294
|
project(): {
|
|
234
295
|
name: string;
|
|
@@ -244,6 +305,54 @@ declare function resolveTestedRevision(env?: NodeJS.ProcessEnv, io?: GitContextI
|
|
|
244
305
|
declare function toPosixPath(p: string): string;
|
|
245
306
|
declare function stripAnsi(value: string): string;
|
|
246
307
|
declare function maskSecrets(value: string): string;
|
|
308
|
+
/** The step fields this reporter reads - a structural subset of Playwright's TestStep. */
|
|
309
|
+
interface StepLike {
|
|
310
|
+
title: string;
|
|
311
|
+
category: string;
|
|
312
|
+
duration: number;
|
|
313
|
+
error?: unknown;
|
|
314
|
+
location?: {
|
|
315
|
+
file: string;
|
|
316
|
+
line: number;
|
|
317
|
+
};
|
|
318
|
+
steps?: StepLike[];
|
|
319
|
+
}
|
|
320
|
+
declare function stripTypedValue(title: string): string;
|
|
321
|
+
/** Whether this attempt sends its steps: a failure, a timeout, or any retry. */
|
|
322
|
+
declare function attemptSendsSteps(result: {
|
|
323
|
+
status: string;
|
|
324
|
+
retry: number;
|
|
325
|
+
}): boolean;
|
|
326
|
+
/**
|
|
327
|
+
* The attempt's steps for the wire, at most MAX_STEPS, and how many were left
|
|
328
|
+
* out. Null when there are none.
|
|
329
|
+
*
|
|
330
|
+
* FAILED IS MARKED ON THE DEEPEST STEP ONLY: Playwright puts the error on a
|
|
331
|
+
* failing expect AND on every test.step around it, and the page should point
|
|
332
|
+
* at the one that broke, not paint its whole ancestry red.
|
|
333
|
+
*
|
|
334
|
+
* THE CUT KEEPS THE FAILING PATH (decision 4): every marked step and its
|
|
335
|
+
* ancestors first, then the rest in order until MAX_STEPS. A kept step whose
|
|
336
|
+
* parent was cut hangs from its nearest kept ancestor.
|
|
337
|
+
*/
|
|
338
|
+
declare function stepsForAttempt(steps: readonly StepLike[] | undefined, rootDir: string): {
|
|
339
|
+
steps: StepEntry[];
|
|
340
|
+
omitted: number;
|
|
341
|
+
} | null;
|
|
342
|
+
/** The result entry's step fields: none at all when there are no steps, no stepsOmitted when nothing was cut. */
|
|
343
|
+
declare function stepFields(payload: {
|
|
344
|
+
steps: StepEntry[];
|
|
345
|
+
omitted: number;
|
|
346
|
+
} | null): {
|
|
347
|
+
steps?: StepEntry[];
|
|
348
|
+
stepsOmitted?: number;
|
|
349
|
+
};
|
|
350
|
+
/**
|
|
351
|
+
* How many of the buffered results go into the next request: up to
|
|
352
|
+
* BATCH_MAX_RESULTS and BATCH_MAX_BYTES, and always at least one - a single
|
|
353
|
+
* result is bounded far below the byte limit by its own field limits.
|
|
354
|
+
*/
|
|
355
|
+
declare function takeBatch(buffer: readonly unknown[], maxResults: number, maxBytes: number): number;
|
|
247
356
|
/** One piece of free text as it goes on the wire: masked, then cut to maxChars. */
|
|
248
357
|
declare function outgoingText(value: string, maxChars: number): string;
|
|
249
358
|
/**
|
|
@@ -300,6 +409,9 @@ declare function outgoingResultText(raw: {
|
|
|
300
409
|
};
|
|
301
410
|
declare function attemptQualifiesForArtifacts(mappedStatus: AppendResultEntry["status"], retryCount: number): boolean;
|
|
302
411
|
declare function artifactKey(testName: string, filePath: string, retryCount: number, repeatIndex: number, type: ArtifactType): string;
|
|
412
|
+
/** Why the app skipped an artifact, as a sentence (0.12.0: the limit per kind, and `limit`). */
|
|
413
|
+
declare function skipReasonMessage(reason: string, type: ArtifactType): string;
|
|
414
|
+
declare function artifactLabel(type: ArtifactType): string;
|
|
303
415
|
declare function parseRetryAfterMs(headerValue: string | null, nowMs: number): number | null;
|
|
304
416
|
declare function computeBackoffMs(retryNumber: number): number;
|
|
305
417
|
declare function resolveConnection(options: SquallyReporterOptions, env: NodeJS.ProcessEnv, warned?: Set<string>): {
|
|
@@ -327,6 +439,8 @@ export default class SquallyReporter implements Reporter {
|
|
|
327
439
|
private shardTotal;
|
|
328
440
|
private projectName;
|
|
329
441
|
private runTags;
|
|
442
|
+
/** countPlannedTests at onBegin (0.13.0), null when it could not be read. */
|
|
443
|
+
private plannedTests;
|
|
330
444
|
private runConfig;
|
|
331
445
|
private buffer;
|
|
332
446
|
private artifacts;
|
|
@@ -438,6 +552,17 @@ export declare const __internal: {
|
|
|
438
552
|
flushIntervalFor: typeof flushIntervalFor;
|
|
439
553
|
attemptQualifiesForArtifacts: typeof attemptQualifiesForArtifacts;
|
|
440
554
|
artifactKey: typeof artifactKey;
|
|
555
|
+
stepsForAttempt: typeof stepsForAttempt;
|
|
556
|
+
stepFields: typeof stepFields;
|
|
557
|
+
stripTypedValue: typeof stripTypedValue;
|
|
558
|
+
attemptSendsSteps: typeof attemptSendsSteps;
|
|
559
|
+
takeBatch: typeof takeBatch;
|
|
560
|
+
skipReasonMessage: typeof skipReasonMessage;
|
|
561
|
+
artifactLabel: typeof artifactLabel;
|
|
562
|
+
MAX_STEPS: number;
|
|
563
|
+
MAX_STEP_TITLE: number;
|
|
564
|
+
BATCH_MAX_BYTES: number;
|
|
565
|
+
DEFAULT_INGEST_URL: string;
|
|
441
566
|
};
|
|
442
567
|
export {};
|
|
443
568
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACX,MAAM,2BAA2B,CAAC;AAcnC,UAAU,sBAAsB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|