/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
import React from "react";
import { fireEvent, render, screen, act } from "@testing-library/react";
import { MemoryRouter } from "react-router-dom";
import UserListing from "../UserListing";
import BackendService from "../../services/BackendService";
import userEvent from "@testing-library/user-event";
jest.mock("../../hooks");
jest.mock("../../services/BackendService");
test("renders page title", () => {
render(, {
wrapper: MemoryRouter,
});
expect(screen.getByRole("heading", { name: "Manage users" })).toBeInTheDocument();
});
test("renders search box", () => {
render(, {
wrapper: MemoryRouter,
});
expect(screen.getByRole("searchbox", { name: "Search" })).toBeInTheDocument();
});
test("renders an Add user button", () => {
render(, {
wrapper: MemoryRouter,
});
expect(screen.getByRole("button", { name: "Add user(s)" })).toBeInTheDocument();
});
test("renders a table with users", () => {
render(, {
wrapper: MemoryRouter,
});
expect(screen.getByRole("table")).toBeInTheDocument();
expect(screen.getByText("johndoe@example.com")).toBeInTheDocument();
});
test("renders the dropdown menu", () => {
render(, {
wrapper: MemoryRouter,
});
expect(screen.getByText("Actions")).toBeInTheDocument();
});
test("dropdown menu expands when clicked", () => {
render(, {
wrapper: MemoryRouter,
});
userEvent.click(screen.getByText("Actions"));
expect(screen.getByText("Resend invite email")).toBeInTheDocument();
expect(screen.getByText("Remove users")).toBeInTheDocument();
});
test("dropdown menu options are disabled when approptiate", () => {
render(, {
wrapper: MemoryRouter,
});
userEvent.click(screen.getByText("Actions"));
expect(screen.getByText("Resend invite email")).toHaveAttribute("aria-disabled", "true");
expect(screen.getByText("Remove users")).toHaveAttribute("aria-disabled", "true");
});
test("remove user button deletes selected users", async () => {
render(, {
wrapper: MemoryRouter,
});
// First select user from the table
const checkbox = screen.getByRole("checkbox", { name: "johndoe" });
fireEvent.click(checkbox);
// Click remove users button
userEvent.click(screen.getByText("Actions"));
userEvent.click(screen.getByText("Remove users"));
// Wait for confirmation modal to show
await screen.findByText("Are you sure you want to remove 1 user?");
const deleteButton = screen.getByRole("button", { name: "Remove" });
await act(async () => {
fireEvent.click(deleteButton);
});
// Verify backend service gets called
expect(BackendService.removeUsers).toBeCalledWith(["johndoe"]);
});