Skip to content

Commit 6aa4d01

Browse files
committed
03/01: finish newsletter form test
1 parent ea52fe9 commit 6aa4d01

File tree

3 files changed

+43
-28
lines changed

3 files changed

+43
-28
lines changed

exercises/03.best-practices/01.solution.accessibility-selectors/README.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ A **form** should work nicely:
99
- `.getByRole('heading')` for the form section heading on the page.
1010
- `.getByLabelText()` for inputs.
1111
- `.getByRole('button')` (again) for the submit button, but this time the button's text is broken by a visual element (an icon).
12+
- `.getByText()` for the submit success message to showcase selecting generic text on the page.
1213

1314
Best practices:
1415

exercises/03.best-practices/01.solution.accessibility-selectors/src/newsletter-form.browser.test.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ test('submits the newsletter form', async () => {
1515
const emailInput = page.getByLabelText('Your email')
1616
await userEvent.fill(emailInput, '[email protected]')
1717

18-
/**
19-
* @note Vitest doesn't support the `normalize` options
20-
* you'd normally use to sanitize an element with a broken text.
21-
*/
2218
const submitButton = page.getByRole('button', {
23-
name: 'Join the newsletter',
19+
/**
20+
* @todo @fixme Find a way to showcase node text sanitization in Vitest.
21+
*/
22+
name: 'Join the 📨 newsletter',
2423
})
2524
await userEvent.click(submitButton)
2625

27-
/** @todo Assert */
26+
await expect
27+
.element(page.getByText('Thank you for joining the newsletter!'))
28+
.toBeVisible()
2829
})
Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,43 @@
1+
import { useState, type FormEventHandler } from 'react'
2+
13
export function NewsletterForm() {
4+
const [isSubmitted, setSubmitted] = useState(false)
5+
6+
const handleSubmit: FormEventHandler = (event) => {
7+
event.preventDefault()
8+
setSubmitted(true)
9+
}
10+
211
return (
312
<section className="w-96 rounded-lg border bg-white p-10">
413
<h2 className="mb-6 border-b pb-2.5 text-2xl font-bold">Newsletter</h2>
5-
<form className="flex flex-col gap-5">
6-
<div>
7-
<label htmlFor="email" className="mb-1 block">
8-
Your email
9-
</label>
10-
<input
11-
id="email"
12-
name="email"
13-
type="email"
14-
className="w-full rounded-md border px-2 py-1 focus:ring-4"
15-
placeholder="[email protected]"
16-
autoComplete="off"
17-
required
18-
/>
19-
</div>
14+
{isSubmitted ? (
15+
<p>Thank you for joining the newsletter!</p>
16+
) : (
17+
<form onSubmit={handleSubmit} className="flex flex-col gap-5">
18+
<div>
19+
<label htmlFor="email" className="mb-1 block">
20+
Your email
21+
</label>
22+
<input
23+
id="email"
24+
name="email"
25+
type="email"
26+
className="w-full rounded-md border px-2 py-1 focus:ring-4"
27+
placeholder="[email protected]"
28+
autoComplete="off"
29+
required
30+
/>
31+
</div>
2032

21-
<button
22-
type="submit"
23-
className="rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-500 focus:ring-4"
24-
>
25-
Join the 📨 newsletter
26-
</button>
27-
</form>
33+
<button
34+
type="submit"
35+
className="rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-500 focus:ring-4"
36+
>
37+
Join the 📨 newsletter
38+
</button>
39+
</form>
40+
)}
2841
</section>
2942
)
3043
}

0 commit comments

Comments
 (0)