squally-reporter 0.9.0 → 0.10.0-rc.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 +87 -13
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +600 -56
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -178,6 +178,56 @@ nothing. A run that *does* execute and legitimately contains no tests — an
|
|
|
178
178
|
empty shard, `--only-changed` with no changed test file, `--pass-with-no-tests`
|
|
179
179
|
— is still reported, as a run with zero results.
|
|
180
180
|
|
|
181
|
+
**Timeouts and interrupted tests.** A test that runs out of time is reported
|
|
182
|
+
as failed, and Squally is told that it timed out and what its timeout was -
|
|
183
|
+
including a `test.setTimeout()` or `test.slow()` from inside the test. A test
|
|
184
|
+
that Playwright cuts off because the whole run is stopping (`maxFailures`
|
|
185
|
+
reached, Ctrl+C) is reported as skipped: it did not fail, and it does not
|
|
186
|
+
count against the test.
|
|
187
|
+
|
|
188
|
+
## Which CI, branch and commit a run is reported under
|
|
189
|
+
|
|
190
|
+
Squally counts **CI runs** in its test metrics, so the reporter works out
|
|
191
|
+
which CI system it is running on from that system's own environment:
|
|
192
|
+
|
|
193
|
+
| Provider | Recognised by | Shards grouped by | Branch | Commit |
|
|
194
|
+
|---|---|---|---|---|
|
|
195
|
+
| GitHub Actions | `GITHUB_ACTIONS` | `GITHUB_RUN_ID`-`GITHUB_RUN_ATTEMPT` | `GITHUB_REF_NAME`; pull requests: `GITHUB_HEAD_REF` | `GITHUB_SHA`; pull requests: the PR's head commit |
|
|
196
|
+
| GitLab CI | `GITLAB_CI` | `CI_PIPELINE_ID` | `CI_COMMIT_BRANCH`; merge requests: `CI_MERGE_REQUEST_SOURCE_BRANCH_NAME` | `CI_COMMIT_SHA`; merged-results pipelines: `CI_MERGE_REQUEST_SOURCE_BRANCH_SHA` |
|
|
197
|
+
| CircleCI | `CIRCLECI` | `CIRCLE_WORKFLOW_ID` | `CIRCLE_BRANCH` | `CIRCLE_SHA1` |
|
|
198
|
+
| Jenkins | `BUILD_TAG` (`jenkins-…`) | `BUILD_TAG` | `CHANGE_BRANCH`, else `BRANCH_NAME`, else `GIT_BRANCH` | `GIT_COMMIT` |
|
|
199
|
+
| Azure Pipelines | `TF_BUILD` | `BUILD_BUILDID` | `BUILD_SOURCEBRANCH`; pull requests: `SYSTEM_PULLREQUEST_SOURCEBRANCH` | `BUILD_SOURCEVERSION`; pull requests: `SYSTEM_PULLREQUEST_SOURCECOMMITID` |
|
|
200
|
+
| Bitbucket Pipelines | `BITBUCKET_BUILD_NUMBER` | `BITBUCKET_BUILD_NUMBER` | `BITBUCKET_BRANCH` | `BITBUCKET_COMMIT` |
|
|
201
|
+
| Buildkite | `BUILDKITE` | `BUILDKITE_BUILD_ID` | `BUILDKITE_BRANCH` | `BUILDKITE_COMMIT` |
|
|
202
|
+
| TeamCity | `TEAMCITY_VERSION` | - (set `SQUALLY_CI_RUN_ID`) | from git | `BUILD_VCS_NUMBER` |
|
|
203
|
+
| AWS CodeBuild | `CODEBUILD_BUILD_ID` | `CODEBUILD_BUILD_ID` | `CODEBUILD_WEBHOOK_HEAD_REF` | `CODEBUILD_RESOLVED_SOURCE_VERSION` |
|
|
204
|
+
| Travis CI | `TRAVIS` | `TRAVIS_BUILD_ID` | `TRAVIS_BRANCH`; pull requests: `TRAVIS_PULL_REQUEST_BRANCH` | `TRAVIS_COMMIT`; pull requests: `TRAVIS_PULL_REQUEST_SHA` |
|
|
205
|
+
| Drone | `DRONE` | `DRONE_BUILD_NUMBER` | `DRONE_BRANCH`; pull requests: `DRONE_SOURCE_BRANCH` | `DRONE_COMMIT_SHA` |
|
|
206
|
+
| any other CI | `CI=true` or `CI=1` | - (set `SQUALLY_CI_RUN_ID`) | from git | from git |
|
|
207
|
+
|
|
208
|
+
- **`CI` counts only as `true` or `1`.** `CI=false` or `CI=0` is a local run -
|
|
209
|
+
unless one of the providers above is recognised, which always wins. A run
|
|
210
|
+
that is none of these is local, and local runs are stored but not counted
|
|
211
|
+
in Squally's test metrics.
|
|
212
|
+
- **Pull requests are reported under their own head commit and source
|
|
213
|
+
branch**, not the merge commit CI checks out - that is the commit Squally's
|
|
214
|
+
GitHub check and pull-request comment have to find. The commit message and
|
|
215
|
+
author are that commit's too - never the "Merge … into …" message of the
|
|
216
|
+
checkout.
|
|
217
|
+
- **The head commit is fetched when the checkout lacks it.** With
|
|
218
|
+
`actions/checkout`'s default `fetch-depth: 1` the head commit is not in the
|
|
219
|
+
clone, so the reporter fetches that one commit from `origin`
|
|
220
|
+
(`git fetch --depth=1 --no-tags`), waits at most 3 seconds, and reads its
|
|
221
|
+
message and author. It only does so in a shallow checkout - fetching into a
|
|
222
|
+
full clone would make it shallow for the rest of your job - and never
|
|
223
|
+
changes `HEAD` or any branch. If the fetch fails or takes longer, the
|
|
224
|
+
message and author stay empty and the reporter says so once; the run and
|
|
225
|
+
its exit code are unaffected. Alternatives: `fetch-depth: 2` on the checkout
|
|
226
|
+
step puts the head commit in the clone, so nothing is fetched, and
|
|
227
|
+
`SQUALLY_DISABLE_HEAD_COMMIT_FETCH=true` turns the fetch off.
|
|
228
|
+
- **A tag build has no branch.** A detached checkout never reports `HEAD` as a
|
|
229
|
+
branch name, and `refs/heads/` or `origin/` prefixes are removed.
|
|
230
|
+
|
|
181
231
|
## Tests marked with `test.fail()`
|
|
182
232
|
|
|
183
233
|
Playwright's `test.fail()` marks a test as *expected to fail*: it guards a bug
|
|
@@ -190,10 +240,13 @@ The reporter passes that marker on, so Squally reads such a test the same way
|
|
|
190
240
|
Playwright does:
|
|
191
241
|
|
|
192
242
|
- **Marked and still failing** - shown as passing, with an "expected failure"
|
|
193
|
-
label. It
|
|
194
|
-
|
|
243
|
+
label. It counts as a pass in the test's stability, not against its failure
|
|
244
|
+
rate, and it does not fail Squally's pull-request check.
|
|
195
245
|
- **Marked and now passing** - shown as a failure, because the marker is out of
|
|
196
246
|
date and should be removed.
|
|
247
|
+
- **Marked and timed out** - shown as a failure. Playwright does not count a
|
|
248
|
+
timeout as the expected failure either, so the marker is not passed on for
|
|
249
|
+
it.
|
|
197
250
|
|
|
198
251
|
Both ways of marking a test are recognised: the `test.fail()` modifier and a
|
|
199
252
|
`testInfo.fail()` call inside the test body. `test.skip()` and `test.fixme()`
|
|
@@ -212,12 +265,32 @@ them itself: all shards of one CI run are grouped together and shown as one
|
|
|
212
265
|
run once every shard has finished, with the flip side of that guarantee being
|
|
213
266
|
that the run only completes once every shard *has* reported.
|
|
214
267
|
|
|
215
|
-
Correlation is based on an id read from your CI provider's own environment
|
|
216
|
-
so it costs you nothing on
|
|
217
|
-
provider
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
268
|
+
Correlation is based on an id read from your CI provider's own environment
|
|
269
|
+
(the "Shards grouped by" column above), so it costs you nothing on every
|
|
270
|
+
provider in that table except TeamCity. On TeamCity, on a CI system not in the
|
|
271
|
+
table, or when you shard locally across several separate `--shard`
|
|
272
|
+
invocations, set `SQUALLY_CI_RUN_ID` to the same value for every shard of one
|
|
273
|
+
run - anything unique per CI run and shared by its shards works, e.g. a build
|
|
274
|
+
number your CI system already exposes.
|
|
275
|
+
|
|
276
|
+
**Several jobs in one CI run need their own id.** The id is shared by
|
|
277
|
+
everything in one CI run, so two jobs that are *not* shards of each other -
|
|
278
|
+
say a GitHub Actions matrix over browsers, run without `--shard` - would report
|
|
279
|
+
into the same Squally run, and the second job's results are refused once the
|
|
280
|
+
first job has finished it. The reporter then says so once and sends nothing
|
|
281
|
+
more for that job. Give each job its own id, shared only by its own shards:
|
|
282
|
+
|
|
283
|
+
```yaml
|
|
284
|
+
env:
|
|
285
|
+
SQUALLY_CI_RUN_ID: ${{ github.run_id }}-${{ github.run_attempt }}-${{ matrix.browser }}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
The same refusal, and the same message, happens when a CI system re-runs a
|
|
289
|
+
job under the id of a run that has already completed: a GitLab job retry, an
|
|
290
|
+
Azure Pipelines re-run, a Bitbucket re-run of failed steps, a Buildkite retry.
|
|
291
|
+
On GitHub Actions each re-run attempt is its own run instead - with one catch
|
|
292
|
+
for sharded runs: "Re-run failed jobs" starts an attempt that contains only the
|
|
293
|
+
re-run shards, and a run that waits for all of its shards shows as incomplete.
|
|
221
294
|
|
|
222
295
|
**`playwright merge-reports` is not part of this and is not recommended** for
|
|
223
296
|
getting a single run in Squally - the automatic correlation above is the
|
|
@@ -236,11 +309,12 @@ problem: branch, commit, commit message and author are all read on whichever
|
|
|
236
309
|
machine the reporter actually runs on - during a merge that is the merge job,
|
|
237
310
|
not the shards - and without a checkout there (and without the CI provider's
|
|
238
311
|
own commit variables) they all come out empty. A run with no branch is never
|
|
239
|
-
counted as a run on your stable branch
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
312
|
+
counted as a run on your stable branch - the branch the dashboard measures by
|
|
313
|
+
default - and no branch filter finds it, so a "merged" run could exist in the
|
|
314
|
+
dashboard while missing from everything Squally measures per branch: suite
|
|
315
|
+
stability, and each test's stability, flaky rate and failure rate on that
|
|
316
|
+
branch. The automatic correlation above reads that information from each
|
|
317
|
+
shard's own environment instead, so this problem does not arise.
|
|
244
318
|
|
|
245
319
|
</details>
|
|
246
320
|
|
package/dist/index.d.ts
CHANGED
|
@@ -26,6 +26,20 @@ interface AppendResultEntry {
|
|
|
26
26
|
*/
|
|
27
27
|
expectedFailure?: boolean;
|
|
28
28
|
durationMs: number | null;
|
|
29
|
+
/**
|
|
30
|
+
* The attempt's effective timeout in milliseconds, 0 for "no timeout" - see
|
|
31
|
+
* resolveTimeoutMs(). null when the runner does not expose a usable value.
|
|
32
|
+
* (0.10.0; squally-app strips it until it has a field for it.)
|
|
33
|
+
*/
|
|
34
|
+
timeoutMs: number | null;
|
|
35
|
+
/**
|
|
36
|
+
* Playwright reported this attempt as `timedOut`. `status` still says
|
|
37
|
+
* "failed" for it - the app accepts three statuses - and this is what tells
|
|
38
|
+
* a timeout apart from any other failure. Always sent, false included: an
|
|
39
|
+
* absent field from an older reporter must stay distinguishable from "did
|
|
40
|
+
* not time out". (0.10.0; stripped by the app until it has a field for it.)
|
|
41
|
+
*/
|
|
42
|
+
timedOut: boolean;
|
|
29
43
|
errors?: AppendErrorEntry[];
|
|
30
44
|
consoleOutput: string | null;
|
|
31
45
|
tags?: string[];
|
|
@@ -49,6 +63,75 @@ declare function truncateOrNull(value: string | null, max: number): string | nul
|
|
|
49
63
|
declare function flushIntervalFor(shardTotal: number | null): number;
|
|
50
64
|
declare function warnIfKeyWillBeSerialized(config: FullConfig, keyCameFromOptions: boolean): void;
|
|
51
65
|
declare function mapStatus(status: TestResult["status"]): AppendResultEntry["status"];
|
|
66
|
+
declare function isExpectedFailure(expectedStatus: TestCase["expectedStatus"] | undefined, status: TestResult["status"]): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* The attempt's effective timeout in ms, as Playwright applied it (0.10.0).
|
|
69
|
+
*
|
|
70
|
+
* TestCase.timeout, read at onTestEnd. MEASURED on 1.62.1 and on 1.30.0, this
|
|
71
|
+
* package's peer floor: it already includes a test.setTimeout() inside the
|
|
72
|
+
* test body (800 for a config timeout of 1500) and test.slow() (4500, three
|
|
73
|
+
* times 1500). 0 is Playwright's own "no timeout" and is sent as 0.
|
|
74
|
+
*
|
|
75
|
+
* Guarded anyway - a runner that does not hand over a whole number within what
|
|
76
|
+
* the app can store gets null, not a guess.
|
|
77
|
+
*
|
|
78
|
+
* NOT STORED YET, and sent anyway. squally-app's result schema has no field
|
|
79
|
+
* for it and strips unknown keys (its own test pins that:
|
|
80
|
+
* lib/ingest-v2-contract.test.ts). Usually the receiving side goes first here
|
|
81
|
+
* (see prepareConsoleOutput); this time the order is the other way round on
|
|
82
|
+
* purpose (26.09.2026): an absent field breaks nothing, and a reporter that
|
|
83
|
+
* already sends it lets the app's column fill from the first run after the app
|
|
84
|
+
* ships, without waiting for customers to upgrade a second time.
|
|
85
|
+
*/
|
|
86
|
+
declare function resolveTimeoutMs(test: Pick<TestCase, "timeout"> | {
|
|
87
|
+
timeout?: unknown;
|
|
88
|
+
}): number | null;
|
|
89
|
+
declare function detectCiProvider(env: NodeJS.ProcessEnv): string | null;
|
|
90
|
+
interface GitContext {
|
|
91
|
+
branch: string | null;
|
|
92
|
+
commitSha: string | null;
|
|
93
|
+
commitMessage: string | null;
|
|
94
|
+
authorName: string | null;
|
|
95
|
+
}
|
|
96
|
+
/** Everything the git context reads from (and says to) the outside world -
|
|
97
|
+
* injected so the tests need neither a repository nor a CI job. */
|
|
98
|
+
interface GitContextIo {
|
|
99
|
+
git: (command: string) => string | null;
|
|
100
|
+
readFile: (filePath: string) => string;
|
|
101
|
+
warn: (message: string) => void;
|
|
102
|
+
/** Fetches one commit from origin; resolves true only when git succeeded in time. Never rejects. */
|
|
103
|
+
fetchCommit: (sha: string, timeoutMs: number) => Promise<boolean>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* `git fetch --depth=1 --no-tags origin <sha>`, bounded by `timeoutMs` no
|
|
107
|
+
* matter what git does. Resolves true only when git exited 0 in time; never
|
|
108
|
+
* rejects.
|
|
109
|
+
*
|
|
110
|
+
* ASYNC, UNLIKE THE OTHER GIT CALLS, and for the bound. A fetch is network:
|
|
111
|
+
* execSync would freeze the runner's event loop for the whole wait, and a
|
|
112
|
+
* synchronous spawn with a timeout still waits for its stdio pipes to close -
|
|
113
|
+
* which a remote helper git started can hold open past the kill. Here nothing
|
|
114
|
+
* is piped (stdio "ignore"), the answer is the child's "exit", and a timer
|
|
115
|
+
* settles the promise at the deadline even if git never exits at all.
|
|
116
|
+
*
|
|
117
|
+
* The timer is ref'd on purpose: this promise is awaited from beginRun, which
|
|
118
|
+
* onEnd waits for - see delay() for what an unref'd wait there once cost.
|
|
119
|
+
*
|
|
120
|
+
* GIT_TERMINAL_PROMPT=0: a remote that asks for credentials fails at once
|
|
121
|
+
* instead of waiting for an answer nobody will type.
|
|
122
|
+
*/
|
|
123
|
+
declare function fetchCommitFromOrigin(sha: string, timeoutMs: number, cwd?: string): Promise<boolean>;
|
|
124
|
+
declare function normalizeBranch(raw: string | null | undefined): string | null;
|
|
125
|
+
declare function resolveGitContext(env: NodeJS.ProcessEnv, io?: GitContextIo): GitContext;
|
|
126
|
+
/**
|
|
127
|
+
* The run's git context, fetching a pull request's head commit when the
|
|
128
|
+
* checkout does not have it (0.10.0).
|
|
129
|
+
*
|
|
130
|
+
* Only a head commit is ever fetched: the one case where the reported commit
|
|
131
|
+
* is deliberately not the checked-out one, so the checkout cannot be expected
|
|
132
|
+
* to hold it - at actions/checkout's default depth of 1 it does not.
|
|
133
|
+
*/
|
|
134
|
+
declare function resolveGitContextForRun(env: NodeJS.ProcessEnv, io?: GitContextIo): Promise<GitContext>;
|
|
52
135
|
declare function detectCiRunId(env: NodeJS.ProcessEnv, generateFallback: () => string): string;
|
|
53
136
|
interface ProjectSuiteLike {
|
|
54
137
|
project(): {
|
|
@@ -149,6 +232,7 @@ export default class SquallyReporter implements Reporter {
|
|
|
149
232
|
*/
|
|
150
233
|
private resultsProduced;
|
|
151
234
|
private sendingDisabled;
|
|
235
|
+
private warnedAlreadyComplete;
|
|
152
236
|
private flushTimerHandle;
|
|
153
237
|
private inFlightFlushes;
|
|
154
238
|
private runStarted;
|
|
@@ -194,6 +278,13 @@ export declare const __internal: {
|
|
|
194
278
|
resolveTestedRevision: typeof resolveTestedRevision;
|
|
195
279
|
toPosixPath: typeof toPosixPath;
|
|
196
280
|
detectCiRunId: typeof detectCiRunId;
|
|
281
|
+
detectCiProvider: typeof detectCiProvider;
|
|
282
|
+
resolveGitContext: typeof resolveGitContext;
|
|
283
|
+
resolveGitContextForRun: typeof resolveGitContextForRun;
|
|
284
|
+
fetchCommitFromOrigin: typeof fetchCommitFromOrigin;
|
|
285
|
+
normalizeBranch: typeof normalizeBranch;
|
|
286
|
+
isExpectedFailure: typeof isExpectedFailure;
|
|
287
|
+
resolveTimeoutMs: typeof resolveTimeoutMs;
|
|
197
288
|
resolveProjectName: typeof resolveProjectName;
|
|
198
289
|
maskSecrets: typeof maskSecrets;
|
|
199
290
|
prepareConsoleOutput: typeof prepareConsoleOutput;
|
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;IAI9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyCD,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAyCD,KAAK,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|