import React from 'react';
import { render, screen } from '@testing-library/react';
import { axe } from 'jest-axe';
import { Icon } from '@leafygreen-ui/icon';
import XIcon from '@leafygreen-ui/icon/dist/X';
import FormFooter from './FormFooter';
import { FormFooterProps } from './FormFooter.types';
import { getLgIds } from './utils';
const testIds = getLgIds();
const testMenuItems = [
Option 1,
Option 2,
];
const renderFooter = (props: Partial = {}) => {
return render(
,
);
};
describe('packages/form-footer', () => {
describe('a11y', () => {
test('does not have basic accessibility issues', async () => {
const { container } = renderFooter();
const results = await axe(container);
expect(results).toHaveNoViolations();
});
});
describe('backButtonProps', () => {
test('renders as Button instance with custom text if backButtonProps is defined', () => {
const backButtonText = 'Back';
renderFooter({
backButtonProps: {
children: backButtonText,
},
});
const backButton = screen.getByTestId(testIds.backButton);
expect(backButton).toBeVisible();
expect(backButton).toHaveTextContent(backButtonText);
});
test('renders as SplitButton instance if menuItems is defined', () => {
renderFooter({
backButtonProps: {
label: 'Back',
menuItems: testMenuItems,
},
});
const backSplitButton = screen.getByTestId(testIds.backSplitButton);
expect(backSplitButton).toBeVisible();
});
test('does not render if backButtonProps is undefined', () => {
renderFooter();
const backButton = screen.queryByTestId(testIds.backButton);
expect(backButton).not.toBeInTheDocument();
});
describe('left glyph', () => {
test('does not render if backButtonProps is defined and backButtonProps.leftGlyph is undefined', () => {
renderFooter({
backButtonProps: {
children: 'Back',
leftGlyph: undefined,
},
});
const backButtonIcon = screen.queryByTestId(testIds.backButtonIcon);
expect(backButtonIcon).toBeNull();
});
test('renders custom leftGlyph if backButtonProps is defined and backButtonProps.leftGlyph is defined', () => {
const leftGlyphTestId = 'custom-icon-id';
renderFooter({
backButtonProps: {
children: 'Back',
leftGlyph: ,
},
});
const backButtonIcon = screen.getByTestId(leftGlyphTestId);
expect(backButtonIcon).toBeVisible();
});
});
});
describe('cancelButtonProps', () => {
test('renders as Button instance with custom text if cancelButtonProps is defined', () => {
const cancelButtonText = 'Cancel';
renderFooter({
cancelButtonProps: {
children: cancelButtonText,
},
});
const cancelButton = screen.getByTestId(testIds.cancelButton);
expect(cancelButton).toBeVisible();
expect(cancelButton).toHaveTextContent(cancelButtonText);
});
test('renders as SplitButton instance if menuItems is defined', () => {
renderFooter({
cancelButtonProps: {
label: 'Cancel',
menuItems: testMenuItems,
},
});
const cancelButton = screen.getByTestId(testIds.cancelSplitButton);
expect(cancelButton).toBeVisible();
});
test('does not render if cancelButtonProps is not defined', () => {
renderFooter();
const cancelButton = screen.queryByTestId(testIds.cancelButton);
expect(cancelButton).toBeNull();
});
describe('left glyph', () => {
test('does not render if cancelButtonProps is defined and cancelButtonProps.leftGlyph is undefined', () => {
renderFooter({
cancelButtonProps: {
children: 'Cancel',
leftGlyph: undefined,
},
});
const cancelButton = screen.getByTestId(testIds.cancelButton);
expect(cancelButton.querySelector('svg')).toBeNull();
});
test('renders custom leftGlyph if cancelButtonProps is defined and cancelButtonProps.leftGlyph is defined', () => {
const leftGlyphTestId = 'custom-icon-id';
renderFooter({
cancelButtonProps: {
children: 'Cancel',
leftGlyph: ,
},
});
const cancelButtonIcon = screen.getByTestId(leftGlyphTestId);
expect(cancelButtonIcon).toBeVisible();
});
});
});
describe('primaryButtonProps', () => {
test('renders as Button instance with custom text if menuItems is undefined', () => {
const primaryButtonText = 'Primary';
renderFooter({
primaryButtonProps: {
children: primaryButtonText,
},
});
const primaryButton = screen.getByTestId(testIds.primaryButton);
expect(primaryButton).toBeVisible();
expect(primaryButton).toHaveTextContent(primaryButtonText);
});
test('renders as SplitButton instance if menuItems is defined', () => {
renderFooter({
primaryButtonProps: {
label: 'Test button',
menuItems: testMenuItems,
},
});
const primarySplitButton = screen.getByTestId(testIds.primarySplitButton);
expect(primarySplitButton).toBeVisible();
});
});
test('renders error message', () => {
renderFooter({
errorMessage: 'Error',
});
const errorMessage = screen.getByText('Error');
expect(errorMessage).toBeVisible();
});
// eslint-disable-next-line jest/no-disabled-tests
test.skip('types behave as expected', () => {
<>
{/* @ts-expect-error - Missing children */}
{/* @ts-expect-error - Confirm is not a variant */}
,
}}
/>
{} }}
errorMessage="that's not very leafy of you"
contentClassName="contentClassname"
className="classname"
darkMode
/>
>;
});
});