fleet/frontend/components/forms/LoginForm/LoginForm.tests.jsx
Jacob Shandling 6b70d11bc6
UI: Login page bugs (#11520)
## Addresses #11338 

-  Validate emails on login page
- Fix jumping error state for no email provided ("Email field must be
completed")
- Fix jumping error state for password field
- Fix jumping error state for Forgot password > email field

https://www.loom.com/share/92a238fcd2614d6e8d2655d571aa2757

# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [x] Changes file added for user-visible changes in `changes/`
- [x] Added/updated tests
- [x] Manual QA for all new/changed functionality

---------

Co-authored-by: Jacob Shandling <jacob@fleetdm.com>
2023-05-09 10:12:29 -07:00

107 lines
3.4 KiB
JavaScript

import React from "react";
import { render, screen } from "@testing-library/react";
import { renderWithSetup } from "test/test-utils";
import LoginForm from "./LoginForm";
const [validEmail, invalidEmail] = ["hi@thegnar.co", "invalid-email"];
const password = "p@ssw0rd";
describe("LoginForm - component", () => {
const settings = { sso_enabled: false };
const submitSpy = jest.fn();
const baseError = "Unable to authenticate the current user";
it("renders the base error", () => {
render(
<LoginForm
serverErrors={{ base: baseError }}
handleSubmit={submitSpy}
ssoSettings={settings}
/>
);
expect(screen.getByText(baseError)).toBeInTheDocument();
});
it("should not render the base error", () => {
render(<LoginForm handleSubmit={submitSpy} ssoSettings={settings} />);
expect(screen.queryByText(baseError)).not.toBeInTheDocument();
});
it("renders 2 InputField components", () => {
render(<LoginForm handleSubmit={submitSpy} ssoSettings={settings} />);
expect(screen.getByRole("textbox", { name: "Email" })).toBeInTheDocument();
expect(screen.getByPlaceholderText("Password")).toBeInTheDocument();
});
it("rejects an empty or invalid email field without submitting", async () => {
const { user } = renderWithSetup(
<LoginForm handleSubmit={submitSpy} ssoSettings={settings} />
);
// enter a valid password
await user.type(screen.getByPlaceholderText("Password"), password);
// try to log in
await user.click(screen.getByRole("button", { name: "Login" }));
expect(
screen.getByText("Email field must be completed")
).toBeInTheDocument();
expect(submitSpy).not.toHaveBeenCalled();
// enter an invalid email
await user.type(screen.getByPlaceholderText("Email"), invalidEmail);
// try to log in again
await user.click(screen.getByRole("button", { name: "Login" }));
expect(
screen.getByText("Email must be a valid email address")
).toBeInTheDocument();
expect(submitSpy).not.toHaveBeenCalled();
});
it("rejects an empty password field without submitting", async () => {
const { user } = renderWithSetup(
<LoginForm handleSubmit={submitSpy} ssoSettings={settings} />
);
await user.type(screen.getByRole("textbox", { name: "Email" }), validEmail);
// try to log in without entering a password
await user.click(screen.getByRole("button", { name: "Login" }));
expect(
screen.getByText("Password field must be completed")
).toBeInTheDocument();
expect(submitSpy).not.toHaveBeenCalled();
});
it("does not submit the form when both fields are empty", async () => {
const { user } = renderWithSetup(
<LoginForm handleSubmit={submitSpy} ssoSettings={settings} />
);
await user.click(screen.getByRole("button", { name: "Login" }));
expect(submitSpy).not.toHaveBeenCalled();
});
it("submits the form data when valid form data is submitted", async () => {
const { user } = renderWithSetup(
<LoginForm handleSubmit={submitSpy} ssoSettings={settings} />
);
await user.type(screen.getByRole("textbox", { name: "Email" }), validEmail);
await user.type(screen.getByPlaceholderText("Password"), password);
await user.click(screen.getByRole("button", { name: "Login" }));
expect(submitSpy).toHaveBeenCalledWith({
email: validEmail,
password,
});
});
});