hapijs / hapijs/lab

Supply AbortController signal to tests

Open
#1,024 1 comment 0 reactions 0 assignees View on GitHub
feature
Dominant language
JavaScript
Stars
736
Forks
177
PR merge metrics
No merged PRs in 30d

Description

#### Support plan

* *is this issue currently blocking your project?* (yes/no): no
* *is this issue affecting a production system?* (yes/no): no

#### Context

* *node version*: 14+
* *module version*: 24.3.2
* *environment* (e.g. node, browser, native): node 14+
* *used with* (e.g. hapi application, another framework, standalone, ...):
* *any other relevant information*:

#### What problem are you trying to solve?

Simpler cleanup of failed (or time outed) tests.

#### Do you have a new or modified API suggestion to solve the problem?

Add an `AbortController` `signal` property to the `flags` parameter. This way a test can pass it on, eg.:

```js
it('performs a fetch', async ({ signal }) => {

const req = http.request('http://example.org', { signal });
const [res] = await Events.onceee(req, 'response'); // Crashes since `onceee` does not exist.

expect(res.statusCode).to.equal(200);
});
```

Without the `signal`, the code crashes before any event emitters are added, which obviously causes the test to fail. However, the request continues processing. If it errors at any point, it will cause a process `uncaughtException`, which will cause whatever subsequent test that is running to fail.

With the `signal`, which lab should trigger at the same time as calling `onCleanup`, it will be guaranteed to cause a process `uncaughtException`, but this time it should be an immediate `AbortError` which can be ignored, causing no further harm. This is on top of the obvious effect of aborting the no longer relevant request.

Note: This feature overlaps with the existing `onCleanup` flag. Any code using non-async `onCleanup`, can assign the logic as an event listener:

```js
it('does something', async ({ signal }) => {

signal.addEventListener('abort', () => {

/* onCleanup logic goes here */
});

// or even simpler

signal.onabort = () => {

/* onCleanup logic goes here */
};
});
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.