// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import React from 'react';
import {render, screen, waitFor, waitForElementToBeRemoved, within} from '@testing-library/react';
import {NotificationContext, NotificationContextProvider} from "../contexts/NotificationContext";
import {JobHistoryPage} from '../components/jobs/JobHistoryPage';
import {server} from "./mocks/server";
import {rest} from "msw";
import {newJob} from "./mocks/handlers";
describe('the JobHistoryPage', () => {
it('renders an empty table', async () => {
// ARRANGE
// ACT
render(
);
// ASSERT
expect(await screen.findByRole('heading', {name: (/Job History/i)})).toBeInTheDocument();
});
it('renders table with 2 jobs', async () => {
// ARRANGE
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}),
)
})
)
// ACT
render(
);
// ASSERT
expect(await screen.findByRole('heading', {name: (/Job History/i)})).toBeInTheDocument();
await screen.findByText(/Loading resources/i)
await waitForElementToBeRemoved(() => screen.queryByText(/Loading resources/i))
const table = screen.getByRole('table');
const rows = await within(table).findAllByRole('row');
expect(rows).toHaveLength(jobs.length + 1)
expect(await within(table).findByText(/DELEGATED_ADMIN/i)).toBeInTheDocument();
expect(await within(table).findByText(/RESOURCE_BASED_POLICY/i)).toBeInTheDocument();
});
it('renders an error', async () => {
// ARRANGE
server.use(
rest.get('/jobs', (request, response, context) => {
return response(
context.status(400),
context.json({Error: "Error", Message: "Ooops. Something went wrong."})
)
}),
);
let setNotificationsMockFn = jest.fn();
// ACT
render(
);
// ASSERT
expect(await screen.findByRole('heading', {name: (/Job History/i)})).toBeInTheDocument();
await waitFor(() => {
expect(setNotificationsMockFn).toHaveBeenLastCalledWith([{
header: 'Error',
content: `Ooops. Something went wrong.`,
type: 'error',
dismissible: true,
onDismiss: expect.any(Function)
}])
})
});
});