Skip to content

Commit 77357fb

Browse files
committed
Make fireEvent awaitable
1 parent f8fec72 commit 77357fb

File tree

9 files changed

+36
-38
lines changed

9 files changed

+36
-38
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ The `render` function takes up to 3 parameters and returns an object with some h
122122

123123
### fireEvent
124124

125-
Lightweight wrapper around DOM element events and methods
125+
Lightweight wrapper around DOM element events and methods. Will call wait, so can be awaited to allow effects to propagate.
126126

127127
### wait
128128

src/index.js

+13-6
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,12 @@ function render (TestComponent, {
4343
localVue,
4444
router,
4545
store: vuexStore,
46-
propsData: { ...props
47-
},
46+
propsData: { ...props },
4847
attachToDocument: true,
4948
sync: false
5049
})
5150

52-
mountedWrappers.add(wrapper);
51+
mountedWrappers.add(wrapper)
5352

5453
return {
5554
debug: () => console.log(prettyDOM(wrapper.element)),
@@ -78,9 +77,17 @@ function cleanupAtWrapper (wrapper) {
7877
mountedWrappers.delete(wrapper)
7978
}
8079

81-
fireEvent.touch = (elem) => {
82-
fireEvent.focus(elem)
83-
fireEvent.blur(elem)
80+
Object.keys(fireEvent).forEach(fn => {
81+
fireEvent[`_${fn}`] = fireEvent[fn];
82+
fireEvent[fn] = async (...params) => {
83+
fireEvent[`_${fn}`](...params)
84+
await wait()
85+
}
86+
})
87+
88+
fireEvent.touch = async (elem) => {
89+
await fireEvent.focus(elem)
90+
await fireEvent.blur(elem)
8491
}
8592

8693
export * from 'dom-testing-library'

tests/__tests__/fetch.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import axiosMock from 'axios'
2-
import { render, fireEvent, wait } from '../../src'
2+
import { render, fireEvent } from '../../src'
33
import Fetch from './components/Fetch.vue'
44

55
test('Fetch makes an API call and displays the greeting when load-greeting is clicked', async () => {
@@ -12,9 +12,7 @@ test('Fetch makes an API call and displays the greeting when load-greeting is cl
1212
const { html, getByText } = render(Fetch, { props: { url: '/greeting' } })
1313

1414
// Act
15-
fireEvent.click(getByText('Fetch'))
16-
17-
await wait()
15+
await fireEvent.click(getByText('Fetch'))
1816

1917
expect(axiosMock.get).toHaveBeenCalledTimes(1)
2018
expect(axiosMock.get).toHaveBeenCalledWith('/greeting')

tests/__tests__/form.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ test('login form submits', async () => {
1818
// by clicking on the submit button. This is really unfortunate.
1919
// So the next best thing is to fireEvent a submit on the form itself
2020
// then ensure that there's a submit button.
21-
fireEvent.click(submitButtonNode)
21+
await fireEvent.click(submitButtonNode)
2222

2323
// Assert
2424
expect(handleSubmit).toHaveBeenCalledTimes(1)

tests/__tests__/number-display.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import NumberDisplay from './components/NumberDisplay.vue'
2-
import { render, wait } from '../../src'
2+
import { render } from '../../src'
33

44
test('calling render with the same component but different props does not remount', async () => {
55
const { queryByTestId, updateProps } = render(NumberDisplay, { props: { number: 1 } })
66
expect(queryByTestId('number-display').textContent).toBe('1')
77

8-
updateProps({ number: 2 })
9-
await wait()
8+
await updateProps({ number: 2 })
109

1110
expect(queryByTestId('number-display').textContent).toBe('2')
1211
expect(queryByTestId('instance-id').textContent).toBe('1')

tests/__tests__/stopwatch.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ test('unmounts a component', async () => {
55
jest.spyOn(console, 'error').mockImplementation(() => {})
66

77
const { unmount, isUnmounted, getByText } = render(StopWatch)
8-
fireEvent.click(getByText('Start'))
9-
10-
await wait()
8+
await fireEvent.click(getByText('Start'))
119

1210
unmount()
1311
expect(isUnmounted()).toBe(true)
@@ -24,9 +22,7 @@ test('updates component state', async () => {
2422

2523
expect(elapsedTime.textContent).toBe('0ms')
2624

27-
fireEvent.click(startButton)
28-
await wait()
29-
fireEvent.click(startButton)
25+
await fireEvent.click(startButton)
3026

3127
expect(elapsedTime.textContent).not.toBe('0ms')
3228
})

tests/__tests__/validate-plugin.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import VeeValidate from 'vee-validate'
22

3-
import { render, fireEvent, wait } from '../../src'
3+
import { render, fireEvent } from '../../src'
44
import Validate from './components/Validate'
55

66
test('can validate using plugin', async () => {
77
const { getByPlaceholderText, queryByTestId } = render(Validate, {},
88
vue => vue.use(VeeValidate, { events: 'blur' }))
99

1010
const usernameInput = getByPlaceholderText('Username...')
11-
fireEvent.touch(usernameInput)
12-
13-
await wait()
11+
await fireEvent.touch(usernameInput)
1412

1513
expect(queryByTestId('username-errors').textContent).toBe('The username field is required.')
1614
})

tests/__tests__/vue-router.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import App from './components/Router/App.vue'
22
import Home from './components/Router/Home.vue'
33
import About from './components/Router/About.vue'
44

5-
import { render, fireEvent, wait } from '../../src'
5+
import { render, fireEvent } from '../../src'
66

77
const routes = [
88
{ path: '/', component: Home },
@@ -12,10 +12,10 @@ const routes = [
1212

1313
test('full app rendering/navigating', async () => {
1414
const { queryByTestId } = render(App, { routes })
15+
1516
// normally I'd use a data-testid, but just wanted to show this is also possible
1617
expect(queryByTestId('location-display').textContent).toBe('/')
17-
fireEvent.click(queryByTestId('about-link'))
18-
await wait()
19-
// normally I'd use a data-testid, but just wanted to show this is also possible
18+
await fireEvent.click(queryByTestId('about-link'))
19+
2020
expect(queryByTestId('location-display').textContent).toBe('/about')
2121
})

tests/__tests__/vuex.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import VuexTest from './components/VuexTest'
2-
import { render, fireEvent, wait } from '../../src'
2+
import { render, fireEvent } from '../../src'
33

44
const store = {
55
state: {
@@ -16,16 +16,16 @@ const store = {
1616

1717
test('can render with vuex with defaults', async () => {
1818
const { getByTestId, getByText } = render(VuexTest, { store })
19-
fireEvent.click(getByText('+'))
20-
await wait()
19+
await fireEvent.click(getByText('+'))
20+
2121
expect(getByTestId('count-value').textContent).toBe('1')
2222
})
2323

2424
test('can render with vuex with custom initial state', async () => {
2525
store.state.count = 3
2626
const { getByTestId, getByText } = render(VuexTest, { store })
27-
fireEvent.click(getByText('-'))
28-
await wait()
27+
await fireEvent.click(getByText('-'))
28+
2929
expect(getByTestId('count-value').textContent).toBe('2')
3030
})
3131

@@ -35,11 +35,11 @@ test('can render with vuex with custom store', async () => {
3535

3636
const store = { state: { count: 1000 } }
3737
const { getByTestId, getByText } = render(VuexTest, { store })
38-
fireEvent.click(getByText('+'))
39-
await wait()
38+
39+
await fireEvent.click(getByText('+'))
4040
expect(getByTestId('count-value').textContent).toBe('1000')
41-
fireEvent.click(getByText('-'))
42-
await wait()
41+
42+
await fireEvent.click(getByText('-'))
4343
expect(getByTestId('count-value').textContent).toBe('1000')
4444

4545
expect(console.error).toHaveBeenCalled()

0 commit comments

Comments
 (0)