aboutsummaryrefslogtreecommitdiff
path: root/docs/test/extending.md
blob: 16ce71155d4b33501d5cdbb6174126f1dcd4805b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
Like the runtime, `bun:test` also supports `--preload` scripts. These scripts are loaded before any tests are run. This is useful for setting up test fixtures, mocking, and configuring the test environment.

{% codetabs }

```ts#preloaded.ts
import { beforeAll, beforeEach, afterEach, afterAll } from "bun:test";

beforeAll(() => {
  console.log("beforeAll");
});

beforeEach(() => {
  console.log("beforeEach");
});

afterEach(() => {
  console.log("afterEach");
});

afterAll(() => {
  console.log("afterAll");
});
```

{% /codetabs %}

Test file:

```ts
import { expect, test } from "bun:test";

test("1 + 1", () => {
  expect(1 + 1).toEqual(2);
  console.log("1 + 1");
});
```

Run the test with `--preload`:

```sh
$ bun test --preload=preloaded.ts
```

It outputs:

```sh
beforeAll
beforeEach
1 + 1
afterEach
afterAll
```

## List of lifecycle hooks

The following lifecycle hooks are available in `--preload`:

| Hook         | Description                 |
| ------------ | --------------------------- |
| `beforeAll`  | Runs once before all tests. |
| `beforeEach` | Runs before each test.      |
| `afterEach`  | Runs after each test.       |
| `afterAll`   | Runs once after all tests.  |

## Configuration

To save yourself from having to type `--preload` every time you run tests, you can add it to your `bunfig.toml`:

```toml
[test]
preload = ["./preloaded.ts"]
```

## Loaders & Resolvers

{% note %}
Plugin support is not implemented yet. **There is a bug and this feature is not working**.
{% /note %}

`bun:test` supports the same plugin API as bun's runtime and bun's bundler. See [Plugins](docs/bundler/plugins#usage) for more information.

## Example loader

{% codetab }

```ts#loader.ts
import { plugin } from 'bun';

plugin({
  name: 'My loader',
  setup(build) {
    build.onResolve({ filter: /\.txt$/ }, (args) => {
      return {
        path: args.path,
        namespace: 'my-loader',
      };
    });

    build.onLoad({ filter: /my-loader:.txt$/  }, (args) => {
      return {
        contents: 'Hello world!',
        loader: 'text',
      };
    });
  },
});
```

{% /codetab %}

Now in your test file, you can import `.txt` files:

```ts#my-test.test.ts
import { expect, test } from "bun:test";
import text from "./hello.txt";

test("text is 'Hello world!'", () => {
  expect(text).toEqual("Hello world!");
});
```

To run the test, you need to add `loader.ts` to `preload`:

```toml
[test]
preload = ["loader.ts"]
```

Or you can pass --preload to the command line:

```sh
$ bun test --preload=loader.ts
```

TODO: `expect.extend`