import {screen} from '@testing-library/dom'
import userEvent from '@testing-library/user-event'
import '@testing-library/jest-dom'
function renderApp() {
const el = document.body.appendChild(document.createElement('div'))
el.innerHTML = `
<form id='login_form' method='post' name='login'>
<label for='username'>User Name:</label>
<input
type='text'
name='username'
id='username_input'
placeholder='Enter user name'
/>
<span id='username_required_error' style='color: red; display: none;'>
User Name Required
</span>
<span id='invalid_username_error' style='color: red; display: none;'>
Invalid User Name
</span>
<label for='password'>Password:</label>
<input
type='password'
name='password'
id='password_input'
placeholder='Enter password'
/>
<span id='invalid_password_error' style='color: red; display: none;'>
Invalid Password
</span>
<span id='password_required_error' style='color: red; display: none;'>
Password Required
</span>
<button id='submit' type='submit'>
Login
</button>
</form>
`
const submitButton = el.querySelector('#submit')
const formEl = el.querySelector('#login_form')
submitButton.addEventListener('click', () => {
const userInput = el.querySelector('#username_input')
const passwordInput = el.querySelector('#password_input')
const userName = userInput.value
const password = passwordInput.value
if (!userName) {
el.querySelector('#username_required_error').style.display = 'inline'
}
if (!password) {
el.querySelector('#password_required_error').style.display = 'inline'
}
if (userName && userName !== 'Bob') {
el.querySelector('#invalid_username_error').style.display = 'inline'
}
if (password && password !== 'theBuilder') {
el.querySelector('#invalid_password_error').style.display = 'inline'
}
})
formEl.addEventListener('submit', function (evt) {
evt.preventDefault()
window.history.back()
})
return {user: userEvent.setup()}
}
afterEach(() => (document.body.innerHTML = ``))
describe('findByText Examples', () => {
it('should show a required field warning for each empty input field', async () => {
const {user} = renderApp()
await user.click(
screen.getByRole('button', {
name: 'Login',
}),
)
expect(await screen.findByText('User Name Required')).toBeVisible()
expect(await screen.findByText('Password Required')).toBeVisible()
})
it('should show invalid field errors for each invalid input field', async () => {
const {user} = renderApp()
const userNameField = screen.getByPlaceholderText('Enter user name')
const passwordField = screen.getByPlaceholderText('Enter password')
expect(await screen.findByText('Invalid Password')).not.toBeVisible()
expect(await screen.findByText('Invalid User Name')).not.toBeVisible()
await user.type(userNameField, 'Philchard')
await user.type(passwordField, 'theCat')
expect(userNameField).toHaveValue('Philchard')
expect(passwordField).toHaveValue('theCat')
await user.click(
screen.getByRole('button', {
name: 'Login',
}),
)
expect(await screen.findByText('Invalid User Name')).toBeVisible()
expect(await screen.findByText('Invalid Password')).toBeVisible()
})
})