// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import '@testing-library/jest-dom';
import { fireEvent } from '@testing-library/dom';
import React from 'react';
import ModalButton from '../../../../src/components/ui/Modal/ModalButton';
import ModalButtonGroup from '../../../../src/components/ui/Modal/ModalButtonGroup';
import ModalContext from '../../../../src/components/ui/Modal/ModalContext';
import lightTheme from '../../../../src/theme/light';
import { renderWithTheme } from '../../../test-helpers';
describe('ModalButtonGroup', () => {
const primaryButtonLbl = 'test-primary';
const secondaryButtonLbl = 'test-secondary';
const onClose = jest.fn();
const labelID = 'test-label';
const testContext = { onClose, labelID, dismissible: true };
it('renders a group with a primary Button', () => {
const component = (
]}
/>
);
const { getByTestId, getByLabelText } = renderWithTheme(
lightTheme,
component
);
const el = getByTestId('modal-button-group');
expect(el).toBeInTheDocument();
expect(getByLabelText(primaryButtonLbl)).toBeInTheDocument();
});
it('renders a group with a primary Button & secondary Button', () => {
const component = (
]}
secondaryButtons={[]}
/>
);
const { getByTestId, getByLabelText } = renderWithTheme(
lightTheme,
component
);
const el = getByTestId('modal-button-group');
expect(el).toBeInTheDocument();
expect(getByLabelText(primaryButtonLbl)).toBeInTheDocument();
expect(getByLabelText(secondaryButtonLbl)).toBeInTheDocument();
});
it('renders a group with single primary Button & empty secondary Button', () => {
const component = (
}
secondaryButtons={[]}
/>
);
const { getByTestId, getByLabelText, queryAllByLabelText } =
renderWithTheme(lightTheme, component);
const el = getByTestId('modal-button-group');
expect(el).toBeInTheDocument();
expect(getByLabelText('close')).toBeInTheDocument();
expect.not.arrayContaining(queryAllByLabelText(secondaryButtonLbl));
});
it('passes the onClose function to the close button', () => {
const component = (
]}
/>
);
const { getByTestId, getByLabelText } = renderWithTheme(
lightTheme,
component
);
const modalButton = getByTestId('button');
fireEvent.click(modalButton);
expect(component.props.value.onClose).toHaveBeenCalled();
expect(getByLabelText('close')).toBeInTheDocument();
});
it('passes the onClose function to the close button with custom onClick()', () => {
const component = (
,
]}
/>
);
const { getByTestId, getByLabelText } = renderWithTheme(
lightTheme,
component
);
const modalButton = getByTestId('button');
fireEvent.click(modalButton);
expect(component.props.value.onClose).toHaveBeenCalled();
expect(getByLabelText('close')).toBeInTheDocument();
});
it('does not inject the onClose function into the ModalButton click handler when "dismissible" is false', () => {
const onClose = jest.fn();
const labelID = 'test-label';
const context = { onClose, labelID, dismissible: false };
const component = (
]}
/>
);
const { getByTestId } = renderWithTheme(lightTheme, component);
const modalButton = getByTestId('button');
fireEvent.click(modalButton);
expect(component.props.value.onClose).not.toHaveBeenCalled();
});
});