Skip to content

Commit fd09ebf

Browse files
committed
refact: jest -> vitest
1 parent 6cadca2 commit fd09ebf

File tree

8 files changed

+289
-1942
lines changed

8 files changed

+289
-1942
lines changed

Diff for: .circleci/config.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
- attach_workspace:
3535
at: ~/rxjs-hooks
3636
- run: yarn lint
37-
- run: yarn test
37+
- run: yarn coverage
3838
- run:
3939
name: report-coverage
4040
command: npx codecov

Diff for: jest.config.js

-14
This file was deleted.

Diff for: package.json

+8-13
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"build:esm": "rm -rf dist/esm && tsc -p src/tsconfig.json --module es2015 --target es5 --outDir dist/esm",
1414
"build:cjs": "rm -rf dist/cjs && tsc -p src/tsconfig.json --module commonjs --target es5 --outDir dist/cjs",
1515
"start": "vite",
16-
"test": "NODE_ENV=test jest --no-cache --ci",
16+
"test": "vitest run",
17+
"coverage": "vitest run --coverage",
1718
"lint": "yarn lint:eslint && yarn lint:tsc",
1819
"lint:eslint": "eslint . --ext .ts,.tsx --fix --max-warnings 0",
1920
"lint:tsc": "tsc -p ./tsconfig.json --noEmit",
@@ -24,36 +25,30 @@
2425
"url": "[email protected]:LeetCode-OpenSource/rxjs-hooks.git"
2526
},
2627
"devDependencies": {
27-
"@types/jest": "^27.0.1",
28-
"@types/lodash": "^4.14.149",
2928
"@types/react": "^18.0.12",
3029
"@types/react-dom": "^18.0.0",
3130
"@types/react-test-renderer": "^18.0.0",
32-
"@types/sinon": "^10.0.0",
33-
"@types/sinon-chai": "^3.2.3",
3431
"@types/use-sync-external-store": "^0.0.3",
3532
"@typescript-eslint/eslint-plugin": "^4.19.0",
3633
"@typescript-eslint/parser": "^4.19.0",
3734
"@vitejs/plugin-react": "^2.0.0",
35+
"@vitest/coverage-c8": "^0.22.1",
3836
"browser-resolve": "^2.0.0",
39-
"codecov": "^3.6.1",
37+
"codecov": "^3.8.2",
4038
"eslint": "^7.22.0",
4139
"eslint-config-prettier": "^8.1.0",
4240
"eslint-plugin-react": "^7.23.1",
43-
"happypack": "^5.0.1",
4441
"husky": "^8.0.1",
45-
"jest": "^27.0.4",
4642
"lint-staged": "^13.0.0",
4743
"prettier": "^2.0.1",
48-
"react": "18.1.0",
49-
"react-dom": "18.1.0",
44+
"react": "^18.1.0",
45+
"react-dom": "^18.1.0",
5046
"react-test-renderer": "18.1.0",
5147
"rxjs": "^7.0.0",
52-
"sinon": "^14.0.0",
5348
"standard": "^17.0.0",
54-
"ts-jest": "^27.0.2",
5549
"typescript": "^4.2.0",
56-
"vite": "^3.0.0"
50+
"vite": "^3.0.0",
51+
"vitest": "^0.22.1"
5752
},
5853
"dependencies": {
5954
"tslib": "^2.1.0",

Diff for: src/__test__/use-event-callback.spec.tsx

+18-18
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react'
22
import { Observable, of, Observer } from 'rxjs'
33
import { map, delay, withLatestFrom, combineLatestWith } from 'rxjs/operators'
44
import { create, act } from 'react-test-renderer'
5-
import * as Sinon from 'sinon'
5+
import { describe, it, expect, vi } from 'vitest'
66

77
import { find } from './find'
88
import { useEventCallback } from '../use-event-callback'
@@ -43,7 +43,7 @@ describe('useEventCallback specs', () => {
4343
})
4444

4545
it('should trigger handle async callback', () => {
46-
const timer = Sinon.useFakeTimers()
46+
const timer = vi.useFakeTimers()
4747
const timeToDelay = 200
4848
const value = 1
4949
const Fixture = createFixture((event$: Observable<any>) =>
@@ -57,14 +57,14 @@ describe('useEventCallback specs', () => {
5757
act(() => testRenderer.update(fixtureNode))
5858
const button = find(testRenderer.root, 'button')
5959
button.props.onClick()
60-
timer.tick(timeToDelay)
60+
timer.advanceTimersByTime(timeToDelay)
6161
act(() => testRenderer.update(fixtureNode))
6262
expect(find(testRenderer.root, 'h1').children).toEqual([`${value}`])
63-
timer.restore()
63+
timer.useRealTimers()
6464
})
6565

6666
it('should handle the initial value', () => {
67-
const timer = Sinon.useFakeTimers()
67+
const timer = vi.useFakeTimers()
6868
const initialValue = 1000
6969
const value = 1
7070
const timeToDelay = 200
@@ -82,14 +82,14 @@ describe('useEventCallback specs', () => {
8282
act(() => testRenderer.update(fixtureNode))
8383
const button = find(testRenderer.root, 'button')
8484
button.props.onClick()
85-
timer.tick(timeToDelay)
85+
timer.advanceTimersByTime(timeToDelay)
8686
act(() => testRenderer.update(fixtureNode))
8787
expect(find(testRenderer.root, 'h1').children).toEqual([`${value}`])
88-
timer.restore()
88+
timer.useRealTimers()
8989
})
9090

9191
it('should handle the state changed', () => {
92-
const timer = Sinon.useFakeTimers()
92+
const timer = vi.useFakeTimers()
9393
const initialValue = 1000
9494
const value = 1
9595
const timeToDelay = 200
@@ -117,18 +117,18 @@ describe('useEventCallback specs', () => {
117117
act(() => testRenderer.update(fixtureNode))
118118
const button = find(testRenderer.root, 'button')
119119
button.props.onClick()
120-
timer.tick(timeToDelay)
120+
timer.advanceTimersByTime(timeToDelay)
121121
act(() => testRenderer.update(fixtureNode))
122122
expect(find(testRenderer.root, 'h1').children).toEqual([`${initialValue + value}`])
123123
button.props.onClick()
124-
timer.tick(timeToDelay)
124+
timer.advanceTimersByTime(timeToDelay)
125125
act(() => testRenderer.update(fixtureNode))
126126
expect(find(testRenderer.root, 'h1').children).toEqual([`${initialValue + value * 2}`])
127-
timer.restore()
127+
timer.useRealTimers()
128128
})
129129

130130
it('should handle the inputs changed', () => {
131-
const timer = Sinon.useFakeTimers()
131+
const timer = vi.useFakeTimers()
132132
const initialValue = 1000
133133
const value = 1
134134
const timeToDelay = 200
@@ -160,20 +160,20 @@ describe('useEventCallback specs', () => {
160160
act(() => testRenderer.update(fixtureNode))
161161
const button = find(testRenderer.root, 'button')
162162
button.props.onClick()
163-
timer.tick(timeToDelay)
163+
timer.advanceTimersByTime(timeToDelay)
164164
act(() => testRenderer.update(fixtureNode))
165165
expect(find(testRenderer.root, 'h1').children).toEqual([`${value + 1}`])
166166
act(() => testRenderer.update(<Fixture count={4} />))
167167
button.props.onClick()
168-
timer.tick(timeToDelay)
168+
timer.advanceTimersByTime(timeToDelay)
169169
act(() => testRenderer.update(<Fixture count={4} />))
170-
timer.tick(timeToDelay)
170+
timer.advanceTimersByTime(timeToDelay)
171171
expect(find(testRenderer.root, 'h1').children).toEqual([`${value + 4}`])
172-
timer.restore()
172+
timer.useRealTimers()
173173
})
174174

175175
it('should call teardown logic after unmount', () => {
176-
const spy = Sinon.spy()
176+
const spy = vi.fn()
177177
const Fixture = createFixture(
178178
() =>
179179
new Observable((observer: Observer<number>) => {
@@ -192,6 +192,6 @@ describe('useEventCallback specs', () => {
192192
act(() => {
193193
testRenderer.unmount()
194194
})
195-
expect(spy.callCount).toBe(1)
195+
expect(spy).toHaveBeenCalledOnce()
196196
})
197197
})

Diff for: src/__test__/use-observable.spec.tsx

+20-21
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
import React from 'react'
22
import { create, act } from 'react-test-renderer'
3-
import * as Sinon from 'sinon'
43
import { of, Observable, Observer, Subject } from 'rxjs'
54

65
import { find } from './find'
76
import { useObservable } from '../use-observable'
87
import { tap, withLatestFrom, map } from 'rxjs/operators'
8+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
99

1010
describe('useObservable specs', () => {
11-
let fakeTimer: Sinon.SinonFakeTimers
1211

1312
beforeEach(() => {
14-
fakeTimer = Sinon.useFakeTimers()
13+
vi.useFakeTimers()
1514
})
1615

1716
afterEach(() => {
18-
fakeTimer.restore()
17+
vi.useRealTimers()
1918
})
2019

2120
it('should get value from sync Observable', () => {
@@ -50,7 +49,7 @@ describe('useObservable specs', () => {
5049
})
5150

5251
it('should call teardown logic after unmount', () => {
53-
const spy = Sinon.spy()
52+
const spy = vi.fn()
5453
function Fixture() {
5554
const value = useObservable(
5655
() =>
@@ -70,15 +69,15 @@ describe('useObservable specs', () => {
7069
const fixtureNode = <Fixture />
7170

7271
const testRenderer = create(fixtureNode)
73-
expect(spy.callCount).toBe(0)
72+
expect(spy).toHaveBeenCalledTimes(0)
7473
act(() => {
7574
testRenderer.unmount()
7675
})
77-
expect(spy.callCount).toBe(1)
76+
expect(spy).toHaveBeenCalledOnce()
7877
})
7978

8079
it('should emit changed states in observableFactory', () => {
81-
const spy = Sinon.spy()
80+
const spy = vi.fn()
8281
const initialValue = 1000
8382
const source$ = new Subject<number>()
8483
function Fixture() {
@@ -102,24 +101,24 @@ describe('useObservable specs', () => {
102101
}
103102

104103
const testRenderer = create(<Fixture />)
105-
expect(spy.callCount).toBe(0)
104+
expect(spy).toHaveBeenCalledTimes(0)
106105
expect(find(testRenderer.root, 'h1').children).toEqual([])
107106
act(() => testRenderer.update(<Fixture />))
108107
source$.next(initialValue)
109-
expect(spy.callCount).toBe(1)
110-
expect(spy.args[0]).toEqual([initialValue])
108+
expect(spy).toHaveBeenCalledOnce()
109+
expect(spy).toHaveBeenCalledWith(initialValue)
111110
expect(find(testRenderer.root, 'h1').children).toEqual([`${initialValue}`])
112111

113112
act(() => testRenderer.update(<Fixture />))
114113
const secondValue = 2000
115114
source$.next(secondValue)
116-
expect(spy.callCount).toBe(2)
117-
expect(spy.args[1]).toEqual([initialValue + secondValue])
115+
expect(spy).toHaveBeenCalledTimes(2)
116+
expect(spy).toHaveBeenCalledWith(initialValue + secondValue)
118117
expect(find(testRenderer.root, 'h1').children).toEqual([`${initialValue + secondValue}`])
119118
})
120119

121120
it('should emit changed props in observableFactory', () => {
122-
const spy = Sinon.spy()
121+
const spy = vi.fn()
123122
const timeToDelay = 200
124123
function Fixture(props: { foo: number; bar: string; baz: any }) {
125124
const value = useObservable(
@@ -144,25 +143,25 @@ describe('useObservable specs', () => {
144143
}
145144

146145
const testRenderer = create(<Fixture {...props} />)
147-
expect(spy.callCount).toBe(0)
146+
expect(spy).toHaveBeenCalledTimes(0)
148147
expect(find(testRenderer.root, 'h1').children).toEqual([])
149148
expect(find(testRenderer.root, 'div').children).toEqual([])
150149
const newProps = { ...props, bar: 'new bar' }
151150
act(() => testRenderer.update(<Fixture {...newProps} />))
152151
// wait useEffect fired
153152
// https://reactjs.org/docs/hooks-reference.html#timing-of-effects
154-
fakeTimer.tick(timeToDelay)
155-
expect(spy.callCount).toBe(1)
156-
expect(spy.args[0]).toEqual([[newProps.foo, newProps.baz]])
153+
vi.advanceTimersByTime(timeToDelay)
154+
expect(spy).toHaveBeenCalledOnce()
155+
expect(spy).toHaveBeenCalledWith([newProps.foo, newProps.baz])
157156
expect(find(testRenderer.root, 'h1').children).toEqual([`${newProps.foo}`])
158157
expect(find(testRenderer.root, 'div').children).toEqual([`${newProps.baz.foo}`])
159158

160159
const renewProps = { ...props, foo: 1000 }
161160
act(() => testRenderer.update(<Fixture {...renewProps} />))
162-
fakeTimer.tick(timeToDelay)
161+
vi.advanceTimersByTime(timeToDelay)
163162

164-
expect(spy.callCount).toBe(2)
165-
expect(spy.args[1]).toEqual([[renewProps.foo, renewProps.baz]])
163+
expect(spy).toHaveBeenCalledTimes(2)
164+
expect(spy).toHaveBeenCalledWith([renewProps.foo, renewProps.baz])
166165
expect(find(testRenderer.root, 'h1').children).toEqual([`${renewProps.foo}`])
167166
expect(find(testRenderer.root, 'div').children).toEqual([`${renewProps.baz.foo}`])
168167
})

Diff for: tools/test-setup.js

-3
This file was deleted.

Diff for: vite.config.ts

+5
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,9 @@ import react from '@vitejs/plugin-react'
33

44
export default defineConfig({
55
plugins: [react()],
6+
test: {
7+
coverage: {
8+
reporter: ['text', 'json', 'html', 'lcov', 'clover'],
9+
},
10+
},
611
})

0 commit comments

Comments
 (0)