Skip to content

Commit 6cf41ff

Browse files
committed
Add update method for model updates
1 parent e308b78 commit 6cf41ff

File tree

4 files changed

+59
-8
lines changed

4 files changed

+59
-8
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{
1+
{
22
"name": "@testing-library/vue",
33
"version": "1.0.2",
44
"description": "Simple and complete Vue DOM testing utilities that encourage good testing practices.",

src/vue-testing-library.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,42 @@ fireEvent.touch = async (elem) => {
103103
await fireEvent.blur(elem)
104104
}
105105

106+
fireEvent.update = async (elem, value) => {
107+
const tagName = elem.tagName
108+
const type = elem.type
109+
110+
switch (tagName) {
111+
case 'OPTION':
112+
elem.selected = value
113+
114+
const parentElement = this.element.parentElement.tagName === 'OPTGROUP'
115+
? this.element.parentElement.parentElement
116+
: this.element.parentElement
117+
118+
return fireEvent.change(parentElement)
119+
120+
case 'INPUT':
121+
if (type === 'checkbox') {
122+
elem.checked = value
123+
return fireEvent.change(elem)
124+
} else if (type === 'radio') {
125+
elem.selected = value
126+
return fireEvent.change(elem)
127+
} else {
128+
elem.value = value
129+
return fireEvent.input(elem)
130+
}
131+
132+
case 'TEXTAREA':
133+
elem.value = value
134+
return fireEvent.input(elem)
135+
136+
case 'SELECT':
137+
elem.value = value
138+
await fireEvent.change(elem)
139+
}
140+
}
141+
106142
export * from '@testing-library/dom'
107143
export {
108144
cleanup,

tests/__tests__/components/Login.vue

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@
1616
name="password"
1717
aria-labelledby="password-label"
1818
>
19+
<label id="remember-me-label">Remember Me</label>
20+
<input
21+
type="checkbox"
22+
id="remember-me"
23+
name="remember-me"
24+
aria-labelledby="remember-me-label"
25+
v-model="rememberMe"
26+
/>
1927
<button type="submit">Submit</button>
2028
</form>
2129
</div>
@@ -32,14 +40,16 @@ export default {
3240
data () {
3341
return {
3442
username: '',
35-
password: ''
43+
password: '',
44+
rememberMe: false
3645
}
3746
},
3847
methods: {
3948
submit () {
4049
this.onSubmit({
4150
username: this.username,
42-
password: this.password
51+
password: this.password,
52+
rememberMe: this.rememberMe
4353
})
4454
}
4555
}

tests/__tests__/form.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@ import { render, fireEvent } from '@testing-library/vue'
22
import Login from './components/Login'
33

44
test('login form submits', async () => {
5-
const fakeUser = { username: 'jackiechan', password: 'hiya! 🥋' }
5+
const fakeUser = { username: 'jackiechan', password: 'hiya! 🥋', rememberMe: true }
66
const handleSubmit = jest.fn()
7-
const { getByText, updateState } = render(
7+
const { getByLabelText, getByText } = render(
88
Login, { props: { onSubmit: handleSubmit } }
99
)
1010

1111
const submitButtonNode = getByText('Submit')
1212

13-
// Act - this is waiting on an issue in @vue/test-utils to allow v-model to be updated by
14-
// changes to DOM elements
15-
updateState(fakeUser)
13+
const userNameInput = getByLabelText('Username')
14+
await fireEvent.update(userNameInput, fakeUser.username)
15+
16+
const passwordInput = getByLabelText('Password')
17+
await fireEvent.update(passwordInput, fakeUser.password)
18+
19+
const rememberMeInput = getByLabelText('Remember Me')
20+
await fireEvent.update(rememberMeInput, true)
1621

1722
// NOTE: in jsdom, it's not possible to trigger a form submission
1823
// by clicking on the submit button. This is really unfortunate.

0 commit comments

Comments
 (0)