Skip to content

Commit 1ea727f

Browse files
authored
refactor(test): improve Vitest tests, remove test anti-patterns (#12058)
* remove useless afterEach() * simplify swizzle tests, remove anti-patterns * simplify swizzle tests, remove anti-patterns * simplify swizzle tests, remove anti-patterns * add comment * fix getHttpsConfig test antipatterns * use vi.stubEnv() instead of anti-patterns * refactor: apply lint autofix * empty --------- Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
1 parent e0926d3 commit 1ea727f

7 files changed

Lines changed: 55 additions & 99 deletions

File tree

packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -541,14 +541,14 @@ describe('blog plugin', () => {
541541
});
542542

543543
it('excludes draft blog post from production build', async () => {
544-
const originalEnv = process.env;
545544
vi.resetModules();
546-
process.env = {...originalEnv, NODE_ENV: 'production'};
545+
vi.stubEnv('NODE_ENV', 'production');
546+
547547
const siteDir = path.join(__dirname, '__fixtures__', 'website');
548548
const blogPosts = await getBlogPosts(siteDir);
549549

550550
expect(blogPosts.find((v) => v.metadata.title === 'draft')).toBeUndefined();
551-
process.env = originalEnv;
551+
vi.unstubAllEnvs();
552552
});
553553

554554
it('creates blog post without date', async () => {

packages/docusaurus/src/client/exports/__tests__/BrowserOnly.test.tsx

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,25 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77
// @vitest-environment jsdom
8-
import {afterAll, beforeEach, describe, expect, it, vi} from 'vitest';
8+
9+
import {afterAll, describe, expect, it, vi} from 'vitest';
910
import React from 'react';
1011
import {render} from '@testing-library/react';
1112
import '@testing-library/jest-dom/vitest';
1213
import BrowserOnly from '../BrowserOnly';
1314
import {Context} from '../../browserContext';
1415

1516
describe('<BrowserOnly>', () => {
16-
const originalEnv = process.env;
17-
18-
beforeEach(() => {
19-
vi.resetModules();
20-
process.env = {...originalEnv};
21-
});
22-
2317
afterAll(() => {
24-
process.env = originalEnv;
18+
vi.unstubAllEnvs();
2519
});
2620

2721
it('rejects react element children', () => {
28-
process.env.NODE_ENV = 'development';
22+
vi.stubEnv('NODE_ENV', 'development');
2923
expect(() =>
3024
render(
3125
<Context.Provider value>
3226
<BrowserOnly>
33-
{/* @ts-expect-error test */}
3427
<span>{window.location.href}</span>
3528
</BrowserOnly>
3629
</Context.Provider>,
@@ -42,11 +35,10 @@ describe('<BrowserOnly>', () => {
4235
});
4336

4437
it('rejects string children', () => {
45-
process.env.NODE_ENV = 'development';
38+
vi.stubEnv('NODE_ENV', 'development');
4639
expect(() => {
4740
render(
4841
<Context.Provider value>
49-
{/* @ts-expect-error test */}
5042
<BrowserOnly> </BrowserOnly>
5143
</Context.Provider>,
5244
);

packages/docusaurus/src/commands/swizzle/__tests__/index.test.ts

Lines changed: 26 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,7 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8-
import {
9-
afterEach,
10-
beforeEach,
11-
describe,
12-
expect,
13-
it,
14-
vi,
15-
type MockInstance,
16-
} from 'vitest';
8+
import {describe, expect, it, vi} from 'vitest';
179
import path from 'path';
1810
import fs from 'fs-extra';
1911
import tree from 'tree-node-cli';
@@ -55,38 +47,19 @@ module.exports = {
5547
);
5648
}
5749

58-
class MockExitError extends Error {
59-
constructor(public code: number) {
60-
super(`Exit with code ${code}`);
61-
this.code = code;
62-
}
63-
}
64-
65-
function createExitMock() {
66-
let mock: MockInstance<(code?: number) => never>;
67-
68-
/* eslint-disable-next-line vitest/require-top-level-describe */
69-
beforeEach(async () => {
70-
mock = vi.spyOn(process, 'exit').mockImplementation((code) => {
71-
throw new MockExitError(code as number);
72-
}) as MockInstance<(code?: number) => never>;
73-
});
74-
/* eslint-disable-next-line vitest/require-top-level-describe */
75-
afterEach(async () => {
76-
mock.mockRestore();
77-
});
50+
function createExitMock(expectedExitCode: number = 0) {
51+
const mock = vi
52+
.spyOn(process, 'exit')
53+
.mockImplementation((() => {}) as () => never);
7854

7955
return {
80-
expectExitCode: (code: number) => {
81-
expect(mock).toHaveBeenCalledWith(code);
56+
[Symbol.dispose]: () => {
57+
expect(mock).toHaveBeenCalledExactlyOnceWith(expectedExitCode);
58+
mock.mockRestore();
8259
},
8360
};
8461
}
8562

86-
const swizzleWithExit: typeof swizzle = async (...args) => {
87-
await expect(() => swizzle(...args)).rejects.toThrow(MockExitError);
88-
};
89-
9063
async function createTestSite() {
9164
const siteDir = await createTempSiteDir();
9265

@@ -117,7 +90,7 @@ async function createTestSite() {
11790
component: string;
11891
typescript?: boolean;
11992
}) {
120-
return swizzleWithExit(FixtureThemeName, component, siteDir, {
93+
return swizzle(FixtureThemeName, component, siteDir, {
12194
wrap: true,
12295
danger: true,
12396
typescript,
@@ -132,7 +105,7 @@ async function createTestSite() {
132105
component: string;
133106
typescript?: boolean;
134107
}) {
135-
return swizzleWithExit(FixtureThemeName, component, siteDir, {
108+
return swizzle(FixtureThemeName, component, siteDir, {
136109
eject: true,
137110
danger: true,
138111
typescript,
@@ -150,18 +123,17 @@ async function createTestSite() {
150123
}
151124

152125
describe('swizzle wrap', () => {
153-
const exitMock = createExitMock();
154-
155126
it(`${Components.FirstLevelComponent} JS`, async () => {
127+
using _exitMock = createExitMock();
156128
const {snapshotThemeDir, testWrap} = await createTestSite();
157129
await testWrap({
158130
component: Components.FirstLevelComponent,
159131
});
160-
exitMock.expectExitCode(0);
161132
await snapshotThemeDir();
162133
});
163134

164135
it(`${Components.FirstLevelComponent} TS`, async () => {
136+
using _exitMock = createExitMock();
165137
const {snapshotThemeDir, testWrap} = await createTestSite();
166138
await testWrap({
167139
component: Components.FirstLevelComponent,
@@ -171,76 +143,75 @@ describe('swizzle wrap', () => {
171143
});
172144

173145
it(`${Components.ComponentInFolder} JS`, async () => {
146+
using _exitMock = createExitMock();
174147
const {snapshotThemeDir, testWrap} = await createTestSite();
175148
await testWrap({
176149
component: Components.ComponentInFolder,
177150
});
178-
exitMock.expectExitCode(0);
179151
await snapshotThemeDir();
180152
});
181153

182154
it(`${Components.ComponentInFolder} TS`, async () => {
155+
using _exitMock = createExitMock();
183156
const {snapshotThemeDir, testWrap} = await createTestSite();
184157
await testWrap({
185158
component: Components.ComponentInFolder,
186159
typescript: true,
187160
});
188-
exitMock.expectExitCode(0);
189161
await snapshotThemeDir();
190162
});
191163

192164
it(`${Components.ComponentInSubFolder} JS`, async () => {
165+
using _exitMock = createExitMock();
193166
const {snapshotThemeDir, testWrap} = await createTestSite();
194167
await testWrap({
195168
component: Components.ComponentInSubFolder,
196169
});
197-
exitMock.expectExitCode(0);
198170
await snapshotThemeDir();
199171
});
200172

201173
it(`${Components.ComponentInSubFolder} TS`, async () => {
174+
using _exitMock = createExitMock();
202175
const {snapshotThemeDir, testWrap} = await createTestSite();
203176
await testWrap({
204177
component: Components.ComponentInSubFolder,
205178
typescript: true,
206179
});
207-
exitMock.expectExitCode(0);
208180
await snapshotThemeDir();
209181
});
210182

211183
it(`${Components.Sibling} JS`, async () => {
184+
using _exitMock = createExitMock();
212185
const {snapshotThemeDir, testWrap} = await createTestSite();
213186
await testWrap({
214187
component: Components.Sibling,
215188
});
216-
exitMock.expectExitCode(0);
217189
await snapshotThemeDir();
218190
});
219191

220192
it(`${Components.Sibling} TS`, async () => {
193+
using _exitMock = createExitMock();
221194
const {snapshotThemeDir, testWrap} = await createTestSite();
222195
await testWrap({
223196
component: Components.Sibling,
224197
typescript: true,
225198
});
226-
exitMock.expectExitCode(0);
227199
await snapshotThemeDir();
228200
});
229201
});
230202

231203
describe('swizzle eject', () => {
232-
const exitMock = createExitMock();
233-
234204
it(`${Components.FirstLevelComponent} JS`, async () => {
205+
using _exitMock = createExitMock();
235206
const {snapshotThemeDir, testEject} = await createTestSite();
236207
await testEject({
237208
component: Components.FirstLevelComponent,
238209
});
239-
exitMock.expectExitCode(0);
240210
await snapshotThemeDir();
241211
});
242212

243213
it(`${Components.FirstLevelComponent} TS`, async () => {
214+
using _exitMock = createExitMock();
244215
const {snapshotThemeDir, testEject} = await createTestSite();
245216
await testEject({
246217
component: Components.FirstLevelComponent,
@@ -250,59 +221,59 @@ describe('swizzle eject', () => {
250221
});
251222

252223
it(`${Components.ComponentInFolder} JS`, async () => {
224+
using _exitMock = createExitMock();
253225
const {snapshotThemeDir, testEject} = await createTestSite();
254226
await testEject({
255227
component: Components.ComponentInFolder,
256228
});
257-
exitMock.expectExitCode(0);
258229
await snapshotThemeDir();
259230
});
260231

261232
it(`${Components.ComponentInFolder} TS`, async () => {
233+
using _exitMock = createExitMock();
262234
const {snapshotThemeDir, testEject} = await createTestSite();
263235
await testEject({
264236
component: Components.ComponentInFolder,
265237
typescript: true,
266238
});
267-
exitMock.expectExitCode(0);
268239
await snapshotThemeDir();
269240
});
270241

271242
it(`${Components.ComponentInSubFolder} JS`, async () => {
243+
using _exitMock = createExitMock();
272244
const {snapshotThemeDir, testEject} = await createTestSite();
273245
await testEject({
274246
component: Components.ComponentInSubFolder,
275247
});
276-
exitMock.expectExitCode(0);
277248
await snapshotThemeDir();
278249
});
279250

280251
it(`${Components.ComponentInSubFolder} TS`, async () => {
252+
using _exitMock = createExitMock();
281253
const {snapshotThemeDir, testEject} = await createTestSite();
282254
await testEject({
283255
component: Components.ComponentInSubFolder,
284256
typescript: true,
285257
});
286-
exitMock.expectExitCode(0);
287258
await snapshotThemeDir();
288259
});
289260

290261
it(`${Components.Sibling} JS`, async () => {
262+
using _exitMock = createExitMock();
291263
const {snapshotThemeDir, testEject} = await createTestSite();
292264
await testEject({
293265
component: Components.Sibling,
294266
});
295-
exitMock.expectExitCode(0);
296267
await snapshotThemeDir();
297268
});
298269

299270
it(`${Components.Sibling} TS`, async () => {
271+
using _exitMock = createExitMock();
300272
const {snapshotThemeDir, testEject} = await createTestSite();
301273
await testEject({
302274
component: Components.Sibling,
303275
typescript: true,
304276
});
305-
exitMock.expectExitCode(0);
306277
await snapshotThemeDir();
307278
});
308279
});

packages/docusaurus/src/webpack/__tests__/base.test.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8-
import {afterEach, describe, expect, it, vi} from 'vitest';
8+
import {describe, expect, it} from 'vitest';
99
import path from 'path';
1010
import _ from 'lodash';
1111
import webpack from 'webpack';
@@ -112,10 +112,6 @@ describe('base webpack config', () => {
112112
],
113113
} as Props;
114114

115-
afterEach(() => {
116-
vi.restoreAllMocks();
117-
});
118-
119115
it('creates webpack aliases', async () => {
120116
const aliases = ((
121117
await createBaseConfig({

0 commit comments

Comments
 (0)