diff --git a/src/App.test.jsx b/src/App.test.jsx index 1fca331..f72a9e8 100644 --- a/src/App.test.jsx +++ b/src/App.test.jsx @@ -1,10 +1,10 @@ -import { render, screen } from "@testing-library/react" +import { render, screen, fireEvent } from "@testing-library/react" import { BookingForm } from "./components/BookingForm" import "@testing-library/jest-dom" -import { initializeTimes, updateTimes } from "./components/Main" +import { initializeTimes } from "./components/Main" +const availableTimes = ["17:00", "18:00"] test("Renders the BookingForm heading", () => { - const availableTimes = ["17:00"] render() const headingElement = screen.getByText("Choose date") expect(headingElement).toBeInTheDocument() @@ -15,7 +15,98 @@ test("Returns a correct array of times", () => { expect(initializeTimes()[0]).toMatch(/\d{2}:\d{2}/) }) -test("Returns the same value provided in the state", () => { - const times = initializeTimes() - expect(updateTimes(times, "2022-02-04")).toBe(times) +test("Guests input is required.", () => { + render() + const guestsInput = screen.getByLabelText("Number of guests") + expect(guestsInput).toHaveAttribute("required") +}) + +test("Time input is required.", () => { + render() + const timeInput = screen.getByLabelText("Choose time") + expect(timeInput).toHaveAttribute("required") +}) + +test("Occasion input is not required.", () => { + render() + const occasionInput = screen.getByLabelText("Occasion") + expect(occasionInput).not.toHaveAttribute("required") +}) + +test("Date input is required.", () => { + render() + const dateInput = screen.getByLabelText("Choose date") + expect(dateInput).toHaveAttribute("required") +}) + +test("Guests input errors correctly.", () => { + render() + + const guestsInput = screen.getByLabelText("Number of guests") + fireEvent.change(guestsInput, { target: { value: "23" } }) + const error = screen.getByText("Guests must be between 1 and 10.") + expect(error).toBeInTheDocument() +}) + +test("Guests input does not error incorrectly.", () => { + render() + + const guestsInput = screen.getByLabelText("Number of guests") + fireEvent.change(guestsInput, { target: { value: "2" } }) + const error = screen.queryByText("Guests must be between 1 and 10.") + expect(error).not.toBeInTheDocument() +}) + +test("Time input errors correctly.", () => { + render() + + const timeInput = screen.getByLabelText("Choose time") + fireEvent.change(timeInput, { target: { value: "" } }) + const error = screen.getByText("Field is required.") + expect(error).toBeInTheDocument() +}) + +test("Time input does not error incorrectly.", () => { + render() + + const timeInput = screen.getByLabelText("Choose time") + fireEvent.change(timeInput, { target: { value: "17:00" } }) + const error = screen.queryByText("Field is required.") + expect(error).not.toBeInTheDocument() +}) + +test("Date input errors correctly.", () => { + render() + + const dateInput = screen.getByLabelText("Choose date") + fireEvent.change(dateInput, { target: { value: "" } }) + const error = screen.getByText("Field is required.") + expect(error).toBeInTheDocument() +}) + +test("Date input does not error incorrectly.", () => { + render() + + const dateInput = screen.getByLabelText("Choose date") + fireEvent.change(dateInput, { target: { value: "2023-03-02" } }) + const error = screen.queryByText("Field is required.") + expect(error).not.toBeInTheDocument() +}) + +test("Occasion input errors correctly.", () => { + render() + + const occasionInput = screen.getByLabelText("Occasion") + fireEvent.change(occasionInput, { target: { value: "23" } }) + const error = screen.getByText("Invalid occasion.") + expect(error).toBeInTheDocument() +}) + +test("Occasion input does not error incorrectly.", () => { + render() + + const occasionInput = screen.getByLabelText("Occasion") + fireEvent.change(occasionInput, { target: { value: "Other" } }) + const error = screen.queryByText("Invalid occasion.") + expect(error).not.toBeInTheDocument() }) diff --git a/src/components/BookingForm.jsx b/src/components/BookingForm.jsx index c6c12d6..f5f5d9e 100644 --- a/src/components/BookingForm.jsx +++ b/src/components/BookingForm.jsx @@ -25,22 +25,22 @@ export const BookingForm = ({ const onDateChange = ({ target }) => { let error = "" - if (target.value === "") error = "Field is required" + if (target.value === "") error = "Field is required." setDateError(error) setDate(target.value) - if (!error) dispatch(target.valueAsDate) + if (!error && dispatch) dispatch(target.valueAsDate) } const onTimeChange = ({ target }) => { let error = "" - if (target.value === "") error = "Field is required" + if (target.value === "") error = "Field is required." setTimeError(error) setTime(target.value) } const onGuestChange = ({ target }) => { let error = "" - if (target.value === "") error = "Field is required" + if (target.value === "") error = "Field is required." else if (target.value < 1 || target.value > 10) error = "Guests must be between 1 and 10." setGuestsError(error) @@ -49,8 +49,7 @@ export const BookingForm = ({ const onOccasionChange = ({ target }) => { let error = "" - if (target.value === "") error = "Field is required" - else if ( + if ( target.value !== "Other" && target.value !== "Birthday" && target.value !== "Anniversary" diff --git a/src/styles/About.css b/src/styles/About.css index 9ed097c..675c1fd 100644 --- a/src/styles/About.css +++ b/src/styles/About.css @@ -4,7 +4,7 @@ align-items: center; color: black; position: relative; - height: 18rem; + min-height: 18rem; } .about h2 {