reactstrap
Version:
React Bootstrap components
150 lines (147 loc) • 6.8 kB
JavaScript
import React from 'react';
import { screen } from '@testing-library/react';
import { Popper } from 'react-popper';
import '@testing-library/jest-dom';
import { DropdownMenu } from '..';
import { customDropdownRender } from '../testUtils';
describe('DropdownMenu', function () {
var contextProps = {
isOpen: false,
direction: 'down',
inNavbar: false
};
beforeEach(function () {
contextProps.isOpen = false;
contextProps.direction = 'down';
contextProps.inNavbar = false;
Popper.mockClear();
});
it('should render children', function () {
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Content"), contextProps);
expect(screen.getByText(/content/i)).toBeInTheDocument();
});
it('should not have the class "show" when isOpen context is false', function () {
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Content"), contextProps);
expect(screen.getByText(/content/i)).not.toHaveClass('show');
});
it('should have the class "show" when isOpen context is true', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Content"), contextProps);
expect(screen.getByText(/content/i)).toHaveClass('show');
});
it('should render left aligned menus by default', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Ello world"), contextProps);
expect(screen.getByText(/ello world/i)).not.toHaveClass('dropdown-menu-end');
});
it('should render right aligned menus', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, {
end: true
}, "Ello world"), contextProps);
expect(screen.getByText(/ello world/i)).toHaveClass('dropdown-menu-end');
});
it('should render down when direction is unknown on the context', function () {
contextProps.isOpen = true;
contextProps.direction = 'unknown';
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Ello world"), contextProps);
expect(screen.getByText(/ello world/i)).toHaveAttribute('data-popper-placement', 'bottom-start');
});
it('should render down when direction is "down" on the context', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Ello world"), contextProps);
expect(screen.getByText(/ello world/i)).toHaveAttribute('data-popper-placement', 'bottom-start');
});
it('should render up when direction is "up" on the context', function () {
contextProps.isOpen = true;
contextProps.direction = 'up';
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Ello world"), contextProps);
expect(screen.getByText(/ello world/i)).toHaveAttribute('data-popper-placement', 'top-start');
// expect(wrapper.find(Popper).prop('placement')).toBe('top-start');
});
it('should render left when direction is "start" on the context', function () {
contextProps.isOpen = true;
contextProps.direction = 'start';
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Ello world"), contextProps);
expect(screen.getByText(/ello world/i)).toHaveAttribute('data-popper-placement', 'left-start');
// expect(wrapper.find(Popper).prop('placement')).toBe('left-start');
});
it('should render right when direction is "end" on the context', function () {
contextProps.isOpen = true;
contextProps.direction = 'end';
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Ello world"), contextProps);
expect(screen.getByText(/ello world/i)).toHaveAttribute('data-popper-placement', 'right-start');
// expect(wrapper.find(Popper).prop('placement')).toBe('right-start');
});
it('should not disable flip modifier by default', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Ello world"), contextProps);
expect(Popper.mock.calls[0][0].modifiers[0]).toMatchObject({
name: 'flip',
enabled: true
});
});
it('should disable flip modifier when flip is false', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, {
flip: false
}, "Ello world"), contextProps);
expect(Popper.mock.calls.length).toBe(1);
expect(Popper.mock.calls[0][0].modifiers[0]).toMatchObject({
name: 'flip',
enabled: false
});
});
it('should position using fixed mode', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, {
strategy: "fixed"
}, "Ello world"), contextProps);
expect(Popper.mock.calls[0][0].strategy).toBe('fixed');
});
it('should not render Popper when isOpen is false', function () {
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, {
end: true
}, "Ello world"), contextProps);
expect(Popper).not.toBeCalled();
});
it('should render custom tag', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, {
tag: "main"
}, "Yo!"), contextProps);
expect(screen.getByText(/yo/i).tagName).toBe('MAIN');
});
describe('using container', function () {
var element;
beforeEach(function () {
element = document.createElement('div');
document.body.appendChild(element);
});
afterEach(function () {
document.body.removeChild(element);
element = null;
});
it('should render inside container', function () {
contextProps.isOpen = true;
element.innerHTML = '<div id="anotherContainer"></div>';
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, {
container: "#anotherContainer"
}, "My body"), contextProps);
expect(document.getElementById('anotherContainer').innerHTML).toContain('My body');
});
});
it('should not have the class "dropdown-menu-dark" by default', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, null, "Keep it light"), contextProps);
expect(screen.getByText(/keep it light/i)).not.toHaveClass('dropdown-menu-dark');
});
it('should have the class "dropdown-menu-dark" when dark is true', function () {
contextProps.isOpen = true;
customDropdownRender( /*#__PURE__*/React.createElement(DropdownMenu, {
dark: true,
"data-testid": "dark-menu"
}, "Let's go dark"), contextProps);
expect(screen.getByTestId('dark-menu')).toHaveClass('dropdown-menu-dark');
});
});