Skip to content

Commit e1b2e6f

Browse files
authored
test: migrate hooks tests to vitest spies (#4816)
Since we change the util too, some `compat` and `debug` tests also changed.
1 parent f19517b commit e1b2e6f

14 files changed

+261
-237
lines changed

compat/test/browser/compat.options.test.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ describe('compat options', () => {
2929
scratch = setupScratch();
3030
rerender = setupRerender();
3131

32-
vnodeSpy.resetHistory();
33-
eventSpy.resetHistory();
32+
vnodeSpy.mockClear();
33+
eventSpy.mockClear();
3434

3535
buttonRef = createRef();
3636
});
@@ -61,7 +61,7 @@ describe('compat options', () => {
6161
it('should call old options on mount', () => {
6262
render(<ClassApp />, scratch);
6363

64-
expect(vnodeSpy).to.have.been.called;
64+
expect(vnodeSpy).toHaveBeenCalled();
6565
});
6666

6767
it('should call old options on event and update', () => {
@@ -72,14 +72,14 @@ describe('compat options', () => {
7272
rerender();
7373
expect(scratch.innerHTML).to.equal('<button>1</button>');
7474

75-
expect(vnodeSpy).to.have.been.called;
76-
expect(eventSpy).to.have.been.called;
75+
expect(vnodeSpy).toHaveBeenCalled();
76+
expect(eventSpy).toHaveBeenCalled();
7777
});
7878

7979
it('should call old options on unmount', () => {
8080
render(<ClassApp />, scratch);
8181
render(null, scratch);
8282

83-
expect(vnodeSpy).to.have.been.called;
83+
expect(vnodeSpy).toHaveBeenCalled();
8484
});
8585
});

debug/test/browser/debug.options.test.js

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ describe('debug options', () => {
3232
scratch = setupScratch();
3333
rerender = setupRerender();
3434

35-
vnodeSpy.resetHistory();
36-
rootSpy.resetHistory();
37-
beforeDiffSpy.resetHistory();
38-
hookSpy.resetHistory();
39-
afterDiffSpy.resetHistory();
40-
catchErrorSpy.resetHistory();
35+
vnodeSpy.mockClear();
36+
rootSpy.mockClear();
37+
beforeDiffSpy.mockClear();
38+
hookSpy.mockClear();
39+
afterDiffSpy.mockClear();
40+
catchErrorSpy.mockClear();
4141
});
4242

4343
afterEach(() => {
@@ -60,10 +60,10 @@ describe('debug options', () => {
6060
it('should call old options on mount', () => {
6161
render(<ClassApp />, scratch);
6262

63-
expect(vnodeSpy).to.have.been.called;
64-
expect(rootSpy).to.have.been.called;
65-
expect(beforeDiffSpy).to.have.been.called;
66-
expect(afterDiffSpy).to.have.been.called;
63+
expect(vnodeSpy).toHaveBeenCalled();
64+
expect(rootSpy).toHaveBeenCalled();
65+
expect(beforeDiffSpy).toHaveBeenCalled();
66+
expect(afterDiffSpy).toHaveBeenCalled();
6767
});
6868

6969
it('should call old options on update', () => {
@@ -72,20 +72,20 @@ describe('debug options', () => {
7272
setCount(1);
7373
rerender();
7474

75-
expect(vnodeSpy).to.have.been.called;
76-
expect(rootSpy).to.have.been.called;
77-
expect(beforeDiffSpy).to.have.been.called;
78-
expect(afterDiffSpy).to.have.been.called;
75+
expect(vnodeSpy).toHaveBeenCalled();
76+
expect(rootSpy).toHaveBeenCalled();
77+
expect(beforeDiffSpy).toHaveBeenCalled();
78+
expect(afterDiffSpy).toHaveBeenCalled();
7979
});
8080

8181
it('should call old options on unmount', () => {
8282
render(<ClassApp />, scratch);
8383
render(null, scratch);
8484

85-
expect(vnodeSpy).to.have.been.called;
86-
expect(rootSpy).to.have.been.called;
87-
expect(beforeDiffSpy).to.have.been.called;
88-
expect(afterDiffSpy).to.have.been.called;
85+
expect(vnodeSpy).toHaveBeenCalled();
86+
expect(rootSpy).toHaveBeenCalled();
87+
expect(beforeDiffSpy).toHaveBeenCalled();
88+
expect(afterDiffSpy).toHaveBeenCalled();
8989
});
9090

9191
it('should call old hook options for hook components', () => {
@@ -97,7 +97,7 @@ describe('debug options', () => {
9797

9898
render(<HookApp />, scratch);
9999

100-
expect(hookSpy).to.have.been.called;
100+
expect(hookSpy).toHaveBeenCalled();
101101
});
102102

103103
it('should call old options on error', () => {
@@ -128,7 +128,7 @@ describe('debug options', () => {
128128
render(<ErrorApp />, scratch);
129129
rerender();
130130

131-
expect(catchErrorSpy).to.have.been.called;
131+
expect(catchErrorSpy).toHaveBeenCalled();
132132

133133
// we expect to throw after setTimeout to trigger a window.onerror
134134
// this is to ensure react compat (i.e. with next.js' dev overlay)

hooks/test/browser/combinations.test.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
useContext
1212
} from 'preact/hooks';
1313
import { scheduleEffectAssert } from '../_util/useEffectUtil';
14+
import { vi } from 'vitest';
1415

1516
/** @jsx createElement */
1617

@@ -74,7 +75,7 @@ describe('combinations', () => {
7475
});
7576

7677
it('can rerender asynchronously from within an effect', () => {
77-
const didRender = sinon.spy();
78+
const didRender = vi.fn();
7879

7980
function Comp() {
8081
const [counter, setCounter] = useState(0);
@@ -91,12 +92,13 @@ describe('combinations', () => {
9192

9293
return scheduleEffectAssert(() => {
9394
rerender();
94-
expect(didRender).to.have.been.calledTwice.and.calledWith(1);
95+
expect(didRender).toHaveBeenCalledTimes(2);
96+
expect(didRender).toHaveBeenCalledWith(1);
9597
});
9698
});
9799

98100
it('can rerender synchronously from within a layout effect', () => {
99-
const didRender = sinon.spy();
101+
const didRender = vi.fn();
100102

101103
function Comp() {
102104
const [counter, setCounter] = useState(0);
@@ -112,7 +114,8 @@ describe('combinations', () => {
112114
render(<Comp />, scratch);
113115
rerender();
114116

115-
expect(didRender).to.have.been.calledTwice.and.calledWith(1);
117+
expect(didRender).toHaveBeenCalledTimes(2);
118+
expect(didRender).toHaveBeenCalledWith(1);
116119
});
117120

118121
it('can access refs from within a layout effect callback', () => {
@@ -404,7 +407,7 @@ describe('combinations', () => {
404407
const tooltipId = 'tooltip';
405408
const effectLog = [];
406409

407-
let useRef2 = sinon.spy(init => {
410+
let useRef2 = vi.fn(init => {
408411
const realRef = useRef(init);
409412
const ref = useRef(init);
410413
Object.defineProperty(ref, 'current', {

hooks/test/browser/errorBoundary.test.js

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Fragment, createElement, render } from 'preact';
22
import { setupScratch, teardown } from '../../../test/_util/helpers';
33
import { useErrorBoundary, useLayoutEffect, useState } from 'preact/hooks';
44
import { setupRerender } from 'preact/test-utils';
5+
import { vi } from 'vitest';
56

67
/** @jsx createElement */
78

@@ -42,7 +43,7 @@ describe('errorBoundary', () => {
4243
});
4344

4445
it('calls the errorBoundary callback', () => {
45-
const spy = sinon.spy();
46+
const spy = vi.fn();
4647
const error = new Error('test');
4748
const Throws = () => {
4849
throw error;
@@ -56,8 +57,8 @@ describe('errorBoundary', () => {
5657
render(<App />, scratch);
5758
rerender();
5859
expect(scratch.innerHTML).to.equal('<p>Error</p>');
59-
expect(spy).to.be.calledOnce;
60-
expect(spy).to.be.calledWith(error, {});
60+
expect(spy).toHaveBeenCalledOnce();
61+
expect(spy).toHaveBeenCalledWith(error, {});
6162
});
6263

6364
it('returns error', () => {
@@ -79,8 +80,8 @@ describe('errorBoundary', () => {
7980
});
8081

8182
it('does not leave a stale closure', () => {
82-
const spy = sinon.spy(),
83-
spy2 = sinon.spy();
83+
const spy = vi.fn(),
84+
spy2 = vi.fn();
8485
let resetErr;
8586
const error = new Error('test');
8687
const Throws = () => {
@@ -96,27 +97,27 @@ describe('errorBoundary', () => {
9697
render(<App onError={spy} />, scratch);
9798
rerender();
9899
expect(scratch.innerHTML).to.equal('<p>Error</p>');
99-
expect(spy).to.be.calledOnce;
100-
expect(spy).to.be.calledWith(error);
100+
expect(spy).toHaveBeenCalledOnce();
101+
expect(spy).toHaveBeenCalledWith(error, {});
101102

102103
resetErr();
103104
render(<App onError={spy2} />, scratch);
104105
rerender();
105-
expect(spy).to.be.calledOnce;
106-
expect(spy2).to.be.calledOnce;
107-
expect(spy2).to.be.calledWith(error);
106+
expect(spy).toHaveBeenCalledOnce();
107+
expect(spy2).toHaveBeenCalledOnce();
108+
expect(spy2).toHaveBeenCalledWith(error, {});
108109
expect(scratch.innerHTML).to.equal('<p>Error</p>');
109110
});
110111

111112
it('does not invoke old effects when a cleanup callback throws an error and is handled', () => {
112113
let throwErr = false;
113-
let thrower = sinon.spy(() => {
114+
let thrower = vi.fn(() => {
114115
if (throwErr) {
115116
throw new Error('test');
116117
}
117118
});
118-
let badEffect = sinon.spy(() => thrower);
119-
let goodEffect = sinon.spy();
119+
let badEffect = vi.fn(() => thrower);
120+
let goodEffect = vi.fn();
120121

121122
function EffectThrowsError() {
122123
useLayoutEffect(badEffect);
@@ -141,16 +142,16 @@ describe('errorBoundary', () => {
141142

142143
render(<App />, scratch);
143144
expect(scratch.innerHTML).to.equal('<span>Test</span>');
144-
expect(badEffect).to.be.calledOnce;
145-
expect(goodEffect).to.be.calledOnce;
145+
expect(badEffect).toHaveBeenCalledOnce();
146+
expect(goodEffect).toHaveBeenCalledOnce();
146147

147148
throwErr = true;
148149
render(<App />, scratch);
149150
rerender();
150151
expect(scratch.innerHTML).to.equal('<p>Error</p>');
151-
expect(thrower).to.be.calledOnce;
152-
expect(badEffect).to.be.calledOnce;
153-
expect(goodEffect).to.be.calledOnce;
152+
expect(thrower).toHaveBeenCalledOnce();
153+
expect(badEffect).toHaveBeenCalledOnce();
154+
expect(goodEffect).toHaveBeenCalledOnce();
154155
});
155156

156157
it('should not duplicate in lists where an item throws and the parent catches and returns a differing type', () => {

hooks/test/browser/hooks.options.test.js

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
useContext,
2121
useErrorBoundary
2222
} from 'preact/hooks';
23+
import { vi } from 'vitest';
2324

2425
/** @jsx createElement */
2526

@@ -37,10 +38,10 @@ describe('hook options', () => {
3738
scratch = setupScratch();
3839
rerender = setupRerender();
3940

40-
afterDiffSpy.resetHistory();
41-
unmountSpy.resetHistory();
42-
beforeRenderSpy.resetHistory();
43-
hookSpy.resetHistory();
41+
afterDiffSpy.mockClear();
42+
unmountSpy.mockClear();
43+
beforeRenderSpy.mockClear();
44+
hookSpy.mockClear();
4445
});
4546

4647
afterEach(() => {
@@ -56,8 +57,8 @@ describe('hook options', () => {
5657
it('should call old options on mount', () => {
5758
render(<App />, scratch);
5859

59-
expect(beforeRenderSpy).to.have.been.called;
60-
expect(afterDiffSpy).to.have.been.called;
60+
expect(beforeRenderSpy).toHaveBeenCalled();
61+
expect(afterDiffSpy).toHaveBeenCalled();
6162
});
6263

6364
it('should call old options.diffed on update', () => {
@@ -66,15 +67,15 @@ describe('hook options', () => {
6667
increment();
6768
rerender();
6869

69-
expect(beforeRenderSpy).to.have.been.called;
70-
expect(afterDiffSpy).to.have.been.called;
70+
expect(beforeRenderSpy).toHaveBeenCalled();
71+
expect(afterDiffSpy).toHaveBeenCalled();
7172
});
7273

7374
it('should call old options on unmount', () => {
7475
render(<App />, scratch);
7576
render(null, scratch);
7677

77-
expect(unmountSpy).to.have.been.called;
78+
expect(unmountSpy).toHaveBeenCalled();
7879
});
7980

8081
it('should detect hooks', () => {
@@ -111,7 +112,7 @@ describe('hook options', () => {
111112
scratch
112113
);
113114

114-
expect(hookSpy.args.map(arg => [arg[1], arg[2]])).to.deep.equal([
115+
expect(hookSpy.mock.calls.map(arg => [arg[1], arg[2]])).to.deep.equal([
115116
[0, USE_STATE],
116117
[1, USE_REDUCER],
117118
[2, USE_EFFECT],
@@ -137,7 +138,7 @@ describe('hook options', () => {
137138
});
138139

139140
it('should skip effect hooks', () => {
140-
const spy = sinon.spy();
141+
const spy = vi.fn();
141142
function App() {
142143
useEffect(spy, []);
143144
useLayoutEffect(spy, []);
@@ -148,7 +149,7 @@ describe('hook options', () => {
148149
render(<App />, scratch);
149150
});
150151

151-
expect(spy.callCount).to.equal(0);
152+
expect(spy).not.toHaveBeenCalled();
152153
});
153154
});
154155
});

0 commit comments

Comments
 (0)