import { createRef, useEffect, useState } from 'react';
import '@testing-library/jest-dom';
import { render, screen } from '@testing-library/react';
import { Panel } from '../Panel';
import { PanelMain } from '../PanelMain';
import { PanelMainBody } from '../PanelMainBody';
import userEvent from '@testing-library/user-event';
import styles from '@patternfly/react-styles/css/components/Panel/panel';
test('Renders without children', () => {
render(
);
expect(screen.getByTestId('panel').firstChild).toBeVisible();
});
test('Renders children', () => {
render(Test);
expect(screen.getByText('Test')).toBeVisible();
});
test(`Renders with the class ${styles.panel}`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.panel);
});
test(`Renders with only the class ${styles.panel} by default`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.panel, { exact: true });
});
test('Renders with custom class name when className prop is passed', () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass('test-class');
});
test(`Renders with class name ${styles.modifiers.raised} when variant is raised`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.modifiers.raised);
});
test(`Renders with class name ${styles.modifiers.bordered} when variant is bordered`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.modifiers.bordered);
});
test(`Renders with class name ${styles.modifiers.secondary} when variant is secondary`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.modifiers.secondary);
});
test(`Renders with class name ${styles.modifiers.scrollable} when isScrollable is true`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.modifiers.scrollable);
});
test(`Renders with class name ${styles.modifiers.scrollableAutoHeight} when isAutoHeight is true`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.modifiers.scrollableAutoHeight);
});
test(`Does not add ${styles.modifiers.scrollableAutoHeight} when isAutoHeight is false or undefined`, () => {
const { rerender } = render(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.scrollableAutoHeight);
rerender(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.scrollableAutoHeight);
});
test(`Renders with class name ${styles.modifiers.noBorder} when hasNoBorder is true`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.modifiers.noBorder);
});
test(`Does not add ${styles.modifiers.noBorder} when hasNoBorder is false or undefined`, () => {
const { rerender } = render(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.noBorder);
rerender(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.noBorder);
});
test(`Renders with class name ${styles.modifiers.fullHeight} when isFullHeight is true`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.modifiers.fullHeight);
});
test(`Does not add ${styles.modifiers.fullHeight} when isFullHeight is false or undefined`, () => {
const { rerender } = render(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.fullHeight);
rerender(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.fullHeight);
});
test(`Renders with class name ${styles.modifiers.glass} when isGlass is true`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.modifiers.glass);
});
test(`Does not add ${styles.modifiers.glass} when isGlass is false or undefined`, () => {
const { rerender } = render(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.glass);
rerender(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.glass);
});
test(`Renders with class name ${styles.modifiers.pill} when isPill is true`, () => {
render(Test);
expect(screen.getByText('Test')).toHaveClass(styles.modifiers.pill);
});
test(`Does not add ${styles.modifiers.pill} when isPill is false or undefined`, () => {
const { rerender } = render(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.pill);
rerender(Test);
expect(screen.getByText('Test')).not.toHaveClass(styles.modifiers.pill);
});
test('Renders with ref', async () => {
const user = userEvent.setup();
const panelRef: React.RefObject = createRef();
const BasicPanel = () => {
const [lastClickWasInPanel, setLastClickWasInPanel] = useState(false);
const handleClick = (event) => {
if (panelRef.current && panelRef.current.contains(event.target)) {
setLastClickWasInPanel(true);
} else {
setLastClickWasInPanel(false);
}
};
useEffect(() => {
document.addEventListener('click', handleClick);
}, []);
return (
Main content
Last click was in panel: {lastClickWasInPanel ? 'true' : 'false'}
);
};
render();
await user.click(document.body);
expect(screen.getByText('Last click was in panel: false')).toBeVisible();
await user.click(screen.getByText('Main content'));
expect(screen.getByText('Last click was in panel: true')).toBeVisible();
});
test('Renders with the inherited element props spread to the component', () => {
render(Test);
expect(screen.getByText('Test')).toHaveAccessibleName('this is a simple panel');
});
test('Matches the snapshot', () => {
const { asFragment } = render(Test);
expect(asFragment()).toMatchSnapshot();
});
test('Matches the snapshot with hasNoBorder', () => {
const { asFragment } = render(
Test
);
expect(asFragment()).toMatchSnapshot();
});
test('Matches the snapshot with isFullHeight', () => {
const { asFragment } = render(
Test
);
expect(asFragment()).toMatchSnapshot();
});
test('Matches the snapshot with isGlass', () => {
const { asFragment } = render(
Test
);
expect(asFragment()).toMatchSnapshot();
});
test('Matches the snapshot with isAutoHeight', () => {
const { asFragment } = render(
Test
);
expect(asFragment()).toMatchSnapshot();
});
test('Matches the snapshot with isPill', () => {
const { asFragment } = render(
Test
);
expect(asFragment()).toMatchSnapshot();
});