Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions packages/mui-joy/src/List/List.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,15 @@ describe('Joy <List />', () => {
});

describe('Menu - integration', () => {
const element = document.createElement('div');
element.setAttribute('aria-controls', 'test');
let element: HTMLDivElement;
beforeAll(() => {
element = document.createElement('div');
element.setAttribute('aria-controls', 'test');
document.body.appendChild(element);
});
afterAll(() => {
document.body.removeChild(element);
});

it('should have role="group" inside Menu', () => {
render(
Expand Down
35 changes: 24 additions & 11 deletions packages/mui-joy/src/Menu/Menu.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,34 @@ import MenuItem from '@mui/joy/MenuItem';
import MenuButton from '@mui/joy/MenuButton';
import describeConformance from '../../test/describeConformance';

let defaultAnchorEl: HTMLDivElement | null = null;

const testContext: DropdownContextValue = {
dispatch: () => {},
popupId: 'menu-popup',
registerPopup: () => {},
registerTrigger: () => {},
state: { open: true, changeReason: null },
triggerElement: document.createElement('div'),
get triggerElement() {
return defaultAnchorEl;
},
};

describe('Joy <Menu />', () => {
const { render } = createRenderer({ clock: 'fake' });

beforeAll(() => {
defaultAnchorEl = document.createElement('div');
defaultAnchorEl.setAttribute('aria-controls', 'test');
document.body.appendChild(defaultAnchorEl);
});
afterAll(() => {
if (defaultAnchorEl !== null) {
document.body.removeChild(defaultAnchorEl);
defaultAnchorEl = null;
}
});

describeConformance(<Menu />, () => ({
classes,
inheritComponent: PopperUnstyled, // `Unstyled` suffix must exist for parser to recognise that this component inherits Base UI component
Expand All @@ -45,11 +61,8 @@ describe('Joy <Menu />', () => {
],
}));

const anchorEl = document.createElement('div');
anchorEl.setAttribute('aria-controls', 'test');

it('should render with `ul` by default', () => {
render(<Menu anchorEl={anchorEl} open data-testid="popover" />);
render(<Menu anchorEl={defaultAnchorEl} open data-testid="popover" />);
expect(screen.getByTestId('popover')).to.have.tagName('ul');
});

Expand Down Expand Up @@ -77,7 +90,7 @@ describe('Joy <Menu />', () => {

it('renders its children only when open', () => {
const { setProps } = render(
<Menu anchorEl={anchorEl} open={false}>
<Menu anchorEl={defaultAnchorEl} open={false}>
<div data-testid="children" />
</Menu>,
);
Expand All @@ -90,14 +103,14 @@ describe('Joy <Menu />', () => {
});

it('should have role="menu"', () => {
render(<Menu anchorEl={anchorEl} open data-testid="popover" />);
render(<Menu anchorEl={defaultAnchorEl} open data-testid="popover" />);

expect(screen.getByTestId('popover')).to.have.attribute('role', 'menu');
});

it('ignores invalid children', () => {
render(
<Menu anchorEl={anchorEl} open>
<Menu anchorEl={defaultAnchorEl} open>
{null}
<span role="menuitem">hello</span>
{/* testing conditional rendering */}
Expand All @@ -113,19 +126,19 @@ describe('Joy <Menu />', () => {

describe('classnames', () => {
it('size prop', () => {
render(<Menu anchorEl={anchorEl} data-testid="menu" open size="sm" />);
render(<Menu anchorEl={defaultAnchorEl} data-testid="menu" open size="sm" />);

expect(screen.getByTestId('menu')).to.have.class(classes.sizeSm);
});

it('variant prop', () => {
render(<Menu anchorEl={anchorEl} data-testid="menu" open variant="soft" />);
render(<Menu anchorEl={defaultAnchorEl} data-testid="menu" open variant="soft" />);

expect(screen.getByTestId('menu')).to.have.class(classes.variantSoft);
});

it('color prop', () => {
render(<Menu anchorEl={anchorEl} data-testid="menu" open color="primary" />);
render(<Menu anchorEl={defaultAnchorEl} data-testid="menu" open color="primary" />);

expect(screen.getByTestId('menu')).to.have.class(classes.colorPrimary);
});
Expand Down
16 changes: 14 additions & 2 deletions packages/mui-joy/src/utils/useSlot.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,18 @@ import useSlot from './useSlot';
describe('useSlot', () => {
const { render } = createRenderer();

let defaultAnchorElm: HTMLDivElement | null = null;
beforeAll(() => {
defaultAnchorElm = document.createElement('div');
document.body.appendChild(defaultAnchorElm);
});
afterAll(() => {
if (defaultAnchorElm !== null) {
document.body.removeChild(defaultAnchorElm);
defaultAnchorElm = null;
}
});

describe('single slot', () => {
const ItemRoot = styled('button')({});
const Item = React.forwardRef<
Expand Down Expand Up @@ -155,7 +167,7 @@ describe('useSlot', () => {
ownerState: {},
additionalProps: {
open: true, // !!force the popper to always visible for testing
anchorEl: () => document.createElement('div'),
anchorEl: () => defaultAnchorElm!,
},
internalForwardedProps: {
slots: { root: ItemRoot },
Expand Down Expand Up @@ -229,7 +241,7 @@ describe('useSlot', () => {
additionalProps: {
open: true, // !!force the popper to always visible for testing
role: 'menu',
anchorEl: () => document.createElement('div'),
anchorEl: () => defaultAnchorElm!,
},
internalForwardedProps: {
slots: { root: ItemListbox },
Expand Down
10 changes: 10 additions & 0 deletions packages/mui-material/src/GridLegacy/GridLegacy.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ import describeConformance from '../../test/describeConformance';
describe('Material UI <GridLegacy />', () => {
const { render } = createRenderer();

beforeEach(() => {
const orig = console.warn;
vi.spyOn(console, 'warn').mockImplementation((msg, ...rest) => {
if (/MUI: The GridLegacy component is deprecated./.test(msg)) {
return;
}
orig.apply(console, [msg, ...rest]);
});
});

describeConformance(<GridLegacy />, () => ({
classes,
inheritComponent: 'div',
Expand Down
64 changes: 32 additions & 32 deletions packages/mui-material/src/Menu/Menu.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,17 @@ const CustomTransition = React.forwardRef(function CustomTransition(
describe('<Menu />', () => {
const { render } = createRenderer({ clock: 'fake' });

describeConformance(<Menu anchorEl={() => document.createElement('div')} open />, () => ({
let defaultAnchorEl;
beforeAll(() => {
defaultAnchorEl = document.createElement('div');
document.body.appendChild(defaultAnchorEl);
});
afterAll(() => {
document.body.removeChild(defaultAnchorEl);
defaultAnchorEl = null;
});

describeConformance(<Menu anchorEl={() => defaultAnchorEl} open />, () => ({
classes,
inheritComponent: Popover,
render,
Expand Down Expand Up @@ -73,7 +83,7 @@ describe('<Menu />', () => {
const handleEntering = spy();
render(
<Menu
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
open
TransitionProps={{
onEnter: handleEnter,
Expand Down Expand Up @@ -103,7 +113,7 @@ describe('<Menu />', () => {
onExit: handleExit,
onExiting: handleExiting,
}}
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
open
/>,
);
Expand All @@ -121,13 +131,7 @@ describe('<Menu />', () => {
});

it('should pass `classes.paper` to the Paper', () => {
render(
<Menu
anchorEl={document.createElement('div')}
open
PaperProps={{ 'data-testid': 'paper' }}
/>,
);
render(<Menu anchorEl={defaultAnchorEl} open PaperProps={{ 'data-testid': 'paper' }} />);

expect(screen.getByTestId('paper')).to.have.class(classes.paper);
});
Expand All @@ -136,7 +140,7 @@ describe('<Menu />', () => {
it('should be able to change the Popover style', () => {
render(
<Menu
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
open
PaperProps={{ 'data-testid': 'paper' }}
PopoverClasses={{ paper: 'bar' }}
Expand All @@ -149,7 +153,7 @@ describe('<Menu />', () => {
it('should be able to change the Popover root element style when Menu classes prop is also provided', () => {
render(
<Menu
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
open
data-testid="popover"
classes={{ paper: 'bar' }}
Expand All @@ -167,7 +171,7 @@ describe('<Menu />', () => {

render(
<Menu
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
open
PaperProps={{
'data-testid': 'paper',
Expand All @@ -184,7 +188,7 @@ describe('<Menu />', () => {

it('should pass onClose prop to Popover', () => {
const handleClose = spy();
render(<Menu anchorEl={document.createElement('div')} open onClose={handleClose} />);
render(<Menu anchorEl={defaultAnchorEl} open onClose={handleClose} />);

fireEvent.keyDown(screen.getByRole('menu'), { key: 'Escape' });

Expand All @@ -193,7 +197,7 @@ describe('<Menu />', () => {

it('renders its children only when open', () => {
const { setProps } = render(
<Menu anchorEl={document.createElement('div')} open={false}>
<Menu anchorEl={defaultAnchorEl} open={false}>
<div data-testid="children" />
</Menu>,
);
Expand All @@ -207,7 +211,7 @@ describe('<Menu />', () => {

describe('list node', () => {
it('should render a menu inside the Popover', () => {
render(<Menu anchorEl={document.createElement('div')} open data-testid="popover" />);
render(<Menu anchorEl={defaultAnchorEl} open data-testid="popover" />);

expect(screen.getByTestId('popover').querySelector('[role="menu"]')).not.to.equal(null);
});
Expand All @@ -223,7 +227,7 @@ describe('<Menu />', () => {
);
}
render(
<Menu anchorEl={document.createElement('div')} open>
<Menu anchorEl={defaultAnchorEl} open>
<MenuItem>one</MenuItem>
</Menu>,
);
Expand All @@ -233,7 +237,7 @@ describe('<Menu />', () => {

it('should not focus list if autoFocus=false', () => {
render(
<Menu anchorEl={document.createElement('div')} autoFocus={false} open>
<Menu anchorEl={defaultAnchorEl} autoFocus={false} open>
<div tabIndex={-1} />
</Menu>,
);
Expand All @@ -245,7 +249,7 @@ describe('<Menu />', () => {
const onEnteringSpy = spy();
render(
<Menu
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
open
slotProps={{ transition: { onEntering: onEnteringSpy } }}
/>,
Expand All @@ -258,7 +262,7 @@ describe('<Menu />', () => {
const onEnteringSpy = spy();
render(
<Menu
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
disableAutoFocusItem
open
slotProps={{ transition: { onEntering: onEnteringSpy } }}
Expand All @@ -273,11 +277,7 @@ describe('<Menu />', () => {
it('should call TransitionProps.onEntering', () => {
const onEnteringSpy = spy();
render(
<Menu
anchorEl={document.createElement('div')}
open
TransitionProps={{ onEntering: onEnteringSpy }}
/>,
<Menu anchorEl={defaultAnchorEl} open TransitionProps={{ onEntering: onEnteringSpy }} />,
);

expect(onEnteringSpy.callCount).to.equal(1);
Expand All @@ -287,7 +287,7 @@ describe('<Menu />', () => {
const onEnteringSpy = spy();
render(
<Menu
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
disableAutoFocusItem
open
TransitionProps={{ onEntering: onEnteringSpy }}
Expand Down Expand Up @@ -317,7 +317,7 @@ describe('<Menu />', () => {
}
const onCloseSpy = spy();
render(
<Menu anchorEl={document.createElement('div')} open onClose={onCloseSpy}>
<Menu anchorEl={defaultAnchorEl} open onClose={onCloseSpy}>
<MenuItem>hello</MenuItem>
</Menu>,
);
Expand All @@ -330,7 +330,7 @@ describe('<Menu />', () => {

it('ignores invalid children', () => {
render(
<Menu anchorEl={document.createElement('div')} open>
<Menu anchorEl={defaultAnchorEl} open>
{null}
<span role="menuitem">hello</span>
{/* testing conditional rendering */}
Expand All @@ -348,7 +348,7 @@ describe('<Menu />', () => {
it('warns a Fragment is passed as a child', () => {
expect(() => {
render(
<Menu anchorEl={document.createElement('div')} open={false}>
<Menu anchorEl={defaultAnchorEl} open={false}>
{/* eslint-disable-next-line react/jsx-no-useless-fragment */}
<React.Fragment />
</Menu>,
Expand Down Expand Up @@ -380,7 +380,7 @@ describe('<Menu />', () => {
render(
<ThemeProvider theme={theme}>
<Menu
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
open
PaperProps={{
'data-testid': 'paper',
Expand Down Expand Up @@ -413,7 +413,7 @@ describe('<Menu />', () => {
render(
<ThemeProvider theme={theme}>
<Menu
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
open
PaperProps={{
'data-testid': 'paper',
Expand All @@ -439,7 +439,7 @@ describe('<Menu />', () => {
<Menu
slots={{ root: 'span' }}
slotProps={{ paper: { 'data-testid': 'paper' } }}
anchorEl={document.createElement('div')}
anchorEl={defaultAnchorEl}
open
>
<div />
Expand Down
Loading
Loading