import React from 'react';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { Dropdown } from '../Dropdown';
import { DropdownPosition, DropdownDirection } from '../dropdownConstants';
import { InternalDropdownItem } from '../InternalDropdownItem';
import { DropdownSeparator } from '../DropdownSeparator';
import { DropdownToggle } from '../DropdownToggle';
import { KebabToggle } from '../KebabToggle';
const dropdownItems = [
Link,
Action
,
Disabled Link
,
Disabled Action
,
,
Separated Link,
Separated Action
];
describe('Dropdown', () => {
test('regular', () => {
const { asFragment } = render(
Dropdown} />
);
expect(asFragment()).toMatchSnapshot();
});
test('right aligned', () => {
const { asFragment } = render(
Dropdown}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('alignment breakpoints', () => {
const { asFragment } = render(
Dropdown}
isOpen
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('dropup', () => {
const { asFragment } = render(
Dropdown}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('dropup + right aligned', () => {
const { asFragment } = render(
Dropdown}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('expanded', () => {
const { asFragment } = render(
Dropdown}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('primary', () => {
const { asFragment } = render(
Dropdown
}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('basic', () => {
const { asFragment } = render(
Dropdown}>
BASIC
);
expect(asFragment()).toMatchSnapshot();
});
test('Renders in strict mode', () => {
const consoleError = jest.spyOn(console, 'error');
const { asFragment } = render(
Dropdown}
/>
);
expect(consoleError).not.toHaveBeenCalled();
expect(asFragment()).toMatchSnapshot();
});
});
describe('KebabToggle', () => {
test('regular', () => {
const { asFragment } = render(
}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('right aligned', () => {
const { asFragment } = render(
}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('dropup', () => {
const { asFragment } = render(
}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('dropup + right aligned', () => {
const { asFragment } = render(
}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('expanded', () => {
const { asFragment } = render(
}
/>
);
expect(asFragment()).toMatchSnapshot();
});
test('plain', () => {
const { asFragment } = render(
} />
);
expect(asFragment()).toMatchSnapshot();
});
test('basic', () => {
const { asFragment } = render(
}>
BASIC
);
expect(asFragment()).toMatchSnapshot();
});
});
describe('API', () => {
test('click on item', async () => {
const mockToggle = jest.fn();
const mockSelect = jest.fn();
const user = userEvent.setup();
render(
Dropdown}
/>
);
await user.click(screen.getByText('Link')); // "Link" is the text of the first item
expect(mockToggle.mock.calls).toHaveLength(0);
expect(mockSelect.mock.calls).toHaveLength(1);
});
test('dropdownItems and children console error ', () => {
const myMock = jest.fn();
global.console = { error: myMock } as any;
render(
Dropdown}
>
Children items
);
expect(myMock).toHaveBeenCalledWith(
'Children and dropdownItems props have been provided. Only the dropdownItems prop items will be rendered'
);
});
test('dropdownItems only, no console error ', () => {
const myMock = jest.fn();
global.console = { error: myMock } as any;
render(
Dropdown}
/>
);
expect(myMock).not.toHaveBeenCalled();
});
test('children only, no console ', () => {
const myMock = jest.fn();
global.console = { error: myMock } as any;
render(
Dropdown}>
Children items
);
expect(myMock).not.toHaveBeenCalled();
});
});