Skip to content

Commit cf0459d

Browse files
committed
add tests for matchers
1 parent f54ab74 commit cf0459d

File tree

5 files changed

+98
-11
lines changed

5 files changed

+98
-11
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// eslint-disable-next-line no-control-regex
2+
const consoleColors = /\x1b\[\d+m/g
3+
4+
export function getExpectErrorMessage(
5+
expectPromise: Promise<unknown>,
6+
): Promise<string> {
7+
return expectPromise.then(
8+
() => {
9+
throw new Error('Expected promise to fail, but did not.')
10+
},
11+
e => {
12+
const error = e as Error
13+
return error.message.replace(consoleColors, '')
14+
},
15+
)
16+
}

src/jest/__tests__/renderStreamMatchers.test.tsx

+68
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
toRenderExactlyTimes,
99
toRerender,
1010
} from '../renderStreamMatchers.js'
11+
import {getExpectErrorMessage} from '../../__testHelpers__/getCleanedErrorMessage.js'
1112

1213
expect.extend({
1314
toRerender,
@@ -56,6 +57,39 @@ describe('toRerender', () => {
5657

5758
await expect(takeRender).not.toRerender()
5859
})
60+
61+
test("errors when it rerenders, but shouldn't", async () => {
62+
const {takeRender, render} = createRenderStream({})
63+
64+
render(<RerenderingComponent />)
65+
await expect(takeRender).toRerender()
66+
await takeRender()
67+
68+
testEvents.emit('rerender')
69+
const error = await getExpectErrorMessage(
70+
expect(takeRender).not.toRerender(),
71+
)
72+
expect(error).toMatchInlineSnapshot(`
73+
expect(received).not.toRerender(expected)
74+
75+
Expected component to not rerender, but it did.
76+
`)
77+
})
78+
79+
test("errors when it should rerender, but doesn't", async () => {
80+
const {takeRender, render} = createRenderStream({})
81+
82+
render(<RerenderingComponent />)
83+
await expect(takeRender).toRerender()
84+
await takeRender()
85+
86+
const error = await getExpectErrorMessage(expect(takeRender).toRerender())
87+
expect(error).toMatchInlineSnapshot(`
88+
expect(received).toRerender(expected)
89+
90+
Expected component to rerender, but it did not.
91+
`)
92+
})
5993
})
6094

6195
describe('toRenderExactlyTimes', () => {
@@ -67,4 +101,38 @@ describe('toRenderExactlyTimes', () => {
67101

68102
await expect(takeRender).toRenderExactlyTimes(2)
69103
})
104+
105+
test('errors when the count of rerenders is wrong', async () => {
106+
const {takeRender, render} = createRenderStream({})
107+
108+
render(<RerenderingComponent />)
109+
testEvents.emit('rerender')
110+
111+
const error = await getExpectErrorMessage(
112+
expect(takeRender).toRenderExactlyTimes(3),
113+
)
114+
expect(error).toMatchInlineSnapshot(`
115+
expect(received).toRenderExactlyTimes(expected)
116+
117+
Expected component to render exactly 3 times.
118+
It rendered 2 times.
119+
`)
120+
})
121+
122+
test('errors when the count of rerenders is right (inverted)', async () => {
123+
const {takeRender, render} = createRenderStream({})
124+
125+
render(<RerenderingComponent />)
126+
testEvents.emit('rerender')
127+
128+
const error = await getExpectErrorMessage(
129+
expect(takeRender).not.toRenderExactlyTimes(2),
130+
)
131+
expect(error).toMatchInlineSnapshot(`
132+
expect(received).not.toRenderExactlyTimes(expected)
133+
134+
Expected component to not render exactly 2 times.
135+
It rendered 2 times.
136+
`)
137+
})
70138
})

src/jest/renderStreamMatchers.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ export const toRerender: MatcherFunction<[options?: NextRenderOptions]> =
2828
const _stream = actual as RenderStream<any> | Assertable
2929
const stream =
3030
assertableSymbol in _stream ? _stream[assertableSymbol] : _stream
31-
const hint = this.utils.matcherHint('toRerender')
31+
const hint = this.utils.matcherHint('toRerender', undefined, undefined, {
32+
isNot: this.isNot,
33+
})
3234
let pass = true
3335
try {
3436
await stream.peekRender({timeout: 100, ...options})
@@ -66,7 +68,12 @@ export const toRenderExactlyTimes: MatcherFunction<
6668
const stream =
6769
assertableSymbol in _stream ? _stream[assertableSymbol] : _stream
6870
const options = {timeout: 100, ...optionsPerRender}
69-
const hint = this.utils.matcherHint('toRenderExactlyTimes')
71+
const hint = this.utils.matcherHint(
72+
'toRenderExactlyTimes',
73+
undefined,
74+
undefined,
75+
{isNot: this.isNot},
76+
)
7077
let pass = true
7178
try {
7279
if (stream.totalRenderCount() > times) {
@@ -102,8 +109,8 @@ export const toRenderExactlyTimes: MatcherFunction<
102109
return (
103110
`${
104111
hint
105-
} Expected component to${pass ? ' not' : ''} render exactly ${times}.` +
106-
` It rendered ${stream.totalRenderCount()} times.`
112+
}\n\nExpected component to${pass ? ' not' : ''} render exactly ${times} times.` +
113+
`\nIt rendered ${stream.totalRenderCount()} times.`
107114
)
108115
},
109116
}

src/renderStream/__tests__/createRenderStream.test.tsx

+3-7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {createRenderStream} from '@testing-library/react-render-stream'
44
import {userEvent} from '@testing-library/user-event'
55
import * as React from 'react'
66
import {ErrorBoundary} from 'react-error-boundary'
7+
import {getExpectErrorMessage} from '../../__testHelpers__/getCleanedErrorMessage.js'
78

89
function CounterForm({
910
value,
@@ -230,14 +231,9 @@ describe('onRender', () => {
230231
await userEvent.click(incrementButton)
231232
await userEvent.click(incrementButton)
232233
await takeRender()
233-
const error = await takeRender()
234-
.then(() => undefined as never)
235-
.catch(e => e as Error)
234+
const error = await getExpectErrorMessage(takeRender())
236235

237-
// eslint-disable-next-line no-control-regex
238-
const consoleColors = /\x1b\[\d+m/g
239-
240-
expect(error.message.replace(consoleColors, '')).toMatchInlineSnapshot(`
236+
expect(error).toMatchInlineSnapshot(`
241237
expect(received).toBe(expected) // Object.is equality
242238
243239
Expected: 1

0 commit comments

Comments
 (0)