Skip to content

Commit a7f256e

Browse files
committed
Update with review form example
1 parent 98e5b1e commit a7f256e

File tree

3 files changed

+130
-101
lines changed

3 files changed

+130
-101
lines changed

tests/__tests__/components/Form.vue

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<template>
2+
<div>
3+
<h1>Movie Review</h1>
4+
<form @submit.prevent="submit">
5+
<label for="movie-input">Title of the movie</label>
6+
<input
7+
id="movie-input"
8+
v-model="title"
9+
name="title"
10+
>
11+
12+
<label id="review-textarea">Your review</label>
13+
<textarea
14+
v-model="review"
15+
name="review-textarea"
16+
placeholder="Write an awesome review"
17+
aria-labelledby="review-textarea"
18+
/>
19+
20+
<label>
21+
<input
22+
v-model="rating"
23+
type="radio"
24+
value="3"
25+
>
26+
Wonderful
27+
</label>
28+
<label>
29+
<input
30+
v-model="rating"
31+
type="radio"
32+
value="2"
33+
>
34+
Average
35+
</label>
36+
<label>
37+
<input
38+
v-model="rating"
39+
type="radio"
40+
value="1"
41+
>
42+
Awful
43+
</label>
44+
45+
<label for="genre-select">Movie genre</label>
46+
<select
47+
id="genre-select"
48+
v-model="genre"
49+
>
50+
<option>Comedy</option>
51+
<option>Action</option>
52+
<option>Romance</option>
53+
<option>None of the above</option>
54+
</select>
55+
56+
<label id="recommend-label">Would you recommend this movie?</label>
57+
<input
58+
id="recommend"
59+
v-model="recommend"
60+
type="checkbox"
61+
name="recommend"
62+
data-testid="recommend-checkbox"
63+
>
64+
65+
<button
66+
:disabled="submitDisabled"
67+
type="submit"
68+
>
69+
Submit
70+
</button>
71+
</form>
72+
</div>
73+
</template>
74+
75+
<script>
76+
export default {
77+
data () {
78+
return {
79+
title: '',
80+
review: '',
81+
rating: '1',
82+
genre: 'Comedy',
83+
recommend: false
84+
}
85+
},
86+
computed: {
87+
submitDisabled () {
88+
return !this.title || !this.review
89+
}
90+
},
91+
methods: {
92+
submit () {
93+
if (this.submitDisabled) return
94+
95+
this.$emit('submit', {
96+
title: this.title,
97+
review: this.review,
98+
rating: this.rating,
99+
genre: this.genre,
100+
recommend: this.recommend
101+
})
102+
}
103+
}
104+
}
105+
</script>

tests/__tests__/components/Signup.vue

Lines changed: 0 additions & 80 deletions
This file was deleted.
Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { render, fireEvent } from '@testing-library/vue'
22
import 'jest-dom/extend-expect'
3-
import Signup from './components/Signup'
4-
5-
test('signup form submits', async () => {
6-
const fakeUser = {
7-
username: 'jackiechan',
8-
about: 'Lorem ipsum dolor sit amet',
9-
selected: 'None of the above',
10-
rememberMe: true
3+
import Form from './components/Form'
4+
5+
test('Review form submits', async () => {
6+
const fakeReview = {
7+
title: 'An Awesome Movie',
8+
review: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
9+
rating: '3',
10+
genre: 'Action',
11+
recommend: true
1112
}
1213

1314
const {
@@ -17,31 +18,34 @@ test('signup form submits', async () => {
1718
getByDisplayValue,
1819
getByPlaceholderText,
1920
emitted
20-
} = render(Signup)
21+
} = render(Form)
2122

2223
const submitButton = getByText('Submit')
2324

24-
// Initially the form should be disabled
25+
// Initially the submit button should be disabled
2526
expect(submitButton).toBeDisabled()
2627

27-
// We are gonna showcase several ways of targetting DOM elements.
28+
// In this test we showcase several ways of targetting DOM elements.
2829
// However, `getByLabelText` should be your top preference when handling
2930
// form elements.
30-
//
3131
// Read 'What queries should I use?' for additional context:
3232
// https://testing-library.com/docs/guide-which-query
33-
const userNameInput = getByLabelText(/username/i)
34-
await fireEvent.update(userNameInput, fakeUser.username)
3533

36-
const aboutMeTextarea = getByPlaceholderText('I was born in...')
37-
await fireEvent.update(aboutMeTextarea, fakeUser.about)
34+
const titleInput = getByLabelText(/title of the movie/i)
35+
await fireEvent.update(titleInput, fakeReview.title)
3836

39-
const rememberMeInput = getByTestId('remember-input')
40-
await fireEvent.update(rememberMeInput, fakeUser.rememberMe)
37+
const reviewTextarea = getByPlaceholderText('Write an awesome review')
38+
await fireEvent.update(reviewTextarea, fakeReview.review)
39+
40+
const ratingSelect = getByLabelText('Wonderful')
41+
await fireEvent.update(ratingSelect, fakeReview.rating)
4142

4243
// Get the Select element by using the initially displayed value.
43-
const preferenceSelect = getByDisplayValue('Dogs')
44-
await fireEvent.update(preferenceSelect, fakeUser.selected)
44+
const genreSelect = getByDisplayValue('Comedy')
45+
await fireEvent.update(genreSelect, fakeReview.genre)
46+
47+
const recommendInput = getByTestId('recommend-checkbox')
48+
await fireEvent.update(recommendInput, fakeReview.recommend)
4549

4650
// NOTE: in jsdom, it's not possible to trigger a form submission
4751
// by clicking on the submit button. This is really unfortunate.
@@ -54,5 +58,5 @@ test('signup form submits', async () => {
5458

5559
// Assert event has been emitted.
5660
expect(emitted().submit).toHaveLength(1)
57-
expect(emitted().submit[0]).toEqual([ fakeUser ])
61+
expect(emitted().submit[0]).toEqual([ fakeReview ])
5862
})

0 commit comments

Comments
 (0)