// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import React from 'react'; import {render, screen} from '@testing-library/react'; import App from '../App'; import {NotificationContext, NotificationContextProvider} from "../contexts/NotificationContext"; import {UserContext} from "../contexts/UserContext"; import {Auth} from "@aws-amplify/auth"; import {newJob} from "./mocks/handlers"; import {server} from "./mocks/server"; import {rest} from "msw"; import userEvent from '@testing-library/user-event'; jest.mock("@aws-amplify/auth"); describe('the landing page', () => { let signInMockFunction: jest.Mock; let signOutMockFunction: jest.Mock; beforeEach(() => { signInMockFunction = jest.fn(); signInMockFunction.mockReturnValue(new Promise(() => true)); Auth.federatedSignIn = signInMockFunction; signOutMockFunction = jest.fn(); signOutMockFunction.mockReturnValue(new Promise(() => true)); Auth.signOut = signOutMockFunction; }) describe('when no user is logged in', () => { it('should redirect to login via Amplify Auth.federatedSignIn', () => { // ARRANGE const userContextFalsy = null; // ACT render( ); // ASSERT const redirectMessage = screen.getByText(/Redirecting to login/i); expect(redirectMessage).toBeInTheDocument(); expect(signInMockFunction).toHaveBeenCalledTimes(1); }); }) describe('when a user is logged in', () => { const userEmail = 'John.Doe@example.com'; beforeEach(() => { const jobs = [ newJob('DELEGATED_ADMIN'), newJob('RESOURCE_BASED_POLICY') ]; server.use( rest.get('/jobs', (request, response, context) => { return response( context.status(200), context.json({Results: jobs}), ) }) ) const userContextTruthy = {attributes: {email: userEmail}} as any; const notificationContext = {notifications: [], setNotifications: jest.fn()}; // eslint-disable-next-line testing-library/no-render-in-setup render( ); }) describe('Sign Out button', () => { it('should be displayed after click on the username', async () => { // ACT await userEvent.click(screen.getByRole('button', {name: userEmail})); // ASSERT const signOutButton = await screen.findByRole('menuitem', {name: /Sign out/i}); expect(signOutButton).toBeInTheDocument(); expect(signOutMockFunction).not.toHaveBeenCalled(); }); it('should log out the user', async () => { // ARRANGE await userEvent.click(screen.getByRole('button', {name: userEmail})); const signOutButton = screen.getByRole('menuitem', {name: /Sign out/i}); // ACT await userEvent.click(signOutButton); // ASSERT expect(signOutMockFunction).toHaveBeenCalled(); }); }); describe('routing', () => { it('should display navigation links', () => { expect(screen.getByRole('link', {name: /Delegated Admin Accounts/i})).toBeInTheDocument(); expect(screen.getByRole('link', {name: /Trusted Access/i})).toBeInTheDocument(); expect(screen.getByRole('link', {name: /Resource-Based Policies/i})).toBeInTheDocument(); expect(screen.getByRole('link', {name: /Job History/i})).toBeInTheDocument(); }); it('should navigate to job history', async () => { // ARRANGE // ACT await userEvent.click(screen.getByText(/Job History/i)); // ASSERT const heading = screen.getByRole('heading', {name: `Job History (0)`}); expect(heading).toBeInTheDocument(); }); it('should navigate to Delegated Admin Accounts', async () => { // ARRANGE // ACT await userEvent.click(screen.getByText(/Delegated Admin Accounts/i)); // ASSERT const heading = screen.getByRole('heading', {name: `Delegated Admin Accounts (0)`}); expect(heading).toBeInTheDocument(); }); it('should navigate to Trusted Access', async () => { // ARRANGE // ACT await userEvent.click(screen.getByText(/Trusted Access/i)); // ASSERT const heading = screen.getByRole('heading', {name: `Trusted Access (0)`}); expect(heading).toBeInTheDocument(); }); it('should navigate to Resource-Based Policies', async () => { // ARRANGE // ACT await userEvent.click(screen.getAllByText(/Resource-Based Policies/i)[0]); // ASSERT const heading = screen.getByRole('heading', {name: `Resource-Based Policies (0)`}); expect(heading).toBeInTheDocument(); }); }) describe('when there is a notification', () => { it('should display the notification in the Flashbar', () => { // ARRANGE const userContextTruthy = {attributes: {email: 'John.Doe@example.com'}} as any; const notificationContext = { notifications: [{ header: 'Scan in progress', content: 'A scan is currently running' }], setNotifications: jest.fn() }; // ACT render( ); // ASSERT expect(screen.getByText(/Scan in progress/i)).toBeInTheDocument(); expect(screen.getByText(/A scan is currently running/i)).toBeInTheDocument(); }); }); }); });