// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import '@testing-library/jest-dom/extend-expect';
import {
cleanup,
fireEvent,
render,
waitFor,
within,
} from '@testing-library/react';
import React from 'react';
import NotificationGroup from '../../../../src/components/ui/NotificationGroup';
import {
ActionType,
NotificationProvider,
Severity,
useNotificationDispatch,
} from '../../../../src/providers/NotificationProvider';
import lightTheme from '../../../../src/theme/light';
import { renderWithTheme } from '../../../test-helpers';
const StorybookTestButton = ({ label, payload }: any) => {
const dispatch = useNotificationDispatch();
const addNotification = (e: any) => {
dispatch({
type: ActionType.ADD,
payload: payload,
});
};
return ;
};
const getNotificationGroupTree = () => {
const payloadForInfoNotification: any = {
severity: Severity.INFO,
message: 'Info notification',
};
const payloadForErrorNotification: any = {
severity: Severity.ERROR,
message: 'Error notification',
};
const payloadForAutoclosingInfoNotification: any = {
severity: Severity.INFO,
message: 'Autoclosing INFO notification',
autoClose: true,
};
return (
);
};
describe('NotificationGroup', () => {
afterAll(cleanup);
describe('Without NotificationProvider', () => {
test('Renders a NotificationGroup', () => {
const { getByTestId } = renderWithTheme(
lightTheme,
);
const notifGroupEl = getByTestId('notification-group');
expect(notifGroupEl).toBeInTheDocument();
});
test('NotificationGroup should show no notifications by default', () => {
const { getByTestId } = renderWithTheme(
lightTheme,
);
const notifGroupEl = getByTestId('notification-group');
expect(notifGroupEl).toContainHTML('');
});
});
describe('With NotificationProvider', () => {
test('NotificationGroup should show a notification on a button click', () => {
const tree = getNotificationGroupTree();
const { getByText, getAllByTestId } = renderWithTheme(lightTheme, tree);
const addInfoNotificationButtonEl = getByText(
'Add simple INFO notification'
);
fireEvent.click(addInfoNotificationButtonEl);
const notifications = getAllByTestId('notification');
expect(notifications).toHaveLength(1);
});
test('NotificationGroup should show a info notification when info notification is added', () => {
const tree = getNotificationGroupTree();
const { getByText, getAllByTestId } = renderWithTheme(lightTheme, tree);
const addInfoNotificationButtonEl = getByText(
'Add simple INFO notification'
);
fireEvent.click(addInfoNotificationButtonEl);
const notifications = getAllByTestId('notification');
const infoNotificationEl = notifications[0];
expect(infoNotificationEl).toBeInTheDocument();
});
test('NotificationGroup should show a info notification output message when message is provided', () => {
const tree = getNotificationGroupTree();
const { getByText, getAllByTestId } = renderWithTheme(lightTheme, tree);
const addInfoNotificationButtonEl = getByText(
'Add simple INFO notification'
);
fireEvent.click(addInfoNotificationButtonEl);
const notifications = getAllByTestId('notification');
const infoNotificationEl = notifications[0];
expect(infoNotificationEl).toContainElement(
getByText('Info notification')
);
});
test("NotificationGroup should remove a notification if clicked on that notification's close button", () => {
const tree = getNotificationGroupTree();
const { getByText, getAllByTestId } = renderWithTheme(lightTheme, tree);
const addInfoNotificationButtonEl = getByText(
'Add simple INFO notification'
);
const addErrorNotificationButtonEl = getByText(
'Add simple ERROR notification'
);
fireEvent.click(addInfoNotificationButtonEl);
fireEvent.click(addErrorNotificationButtonEl);
let notifications = getAllByTestId('notification');
const infoNotificationEl = notifications[0];
const closeButton = within(infoNotificationEl).getByTestId('button');
fireEvent.click(closeButton);
notifications = getAllByTestId('notification');
expect(infoNotificationEl).not.toBeInTheDocument();
});
test('NotificationGroup should remove notification when notification autoClose is passed', async () => {
// Have kept two assertions to check before and after the waitFor function call
const tree = getNotificationGroupTree();
const { getByText, queryAllByTestId } = renderWithTheme(lightTheme, tree);
const addAutoclosingInfoNotificationButtonEl = getByText(
'Add autoclosing INFO notification'
);
fireEvent.click(addAutoclosingInfoNotificationButtonEl);
let notifications = queryAllByTestId('notification');
expect(notifications).toHaveLength(1);
const autoClosingNotificationEl = notifications[0];
expect(autoClosingNotificationEl).toContainElement(
getByText('Autoclosing INFO notification')
);
jest.setTimeout(10000);
await waitFor(
() => {
notifications = queryAllByTestId('notification');
expect(notifications).toHaveLength(0);
},
{ timeout: 10000 }
);
jest.clearAllTimers();
});
});
});