UNPKG

4.47 kBJavaScriptView Raw
1import React from 'react';
2import user from '@testing-library/user-event';
3import { render, screen } from '@testing-library/react';
4import { DropdownItem } from '..';
5import {
6 testForChildrenInComponent,
7 testForDefaultTag,
8 customDropdownRender,
9} from '../testUtils';
10
11describe('DropdownItem', () => {
12 it('should render a single child', () => {
13 testForChildrenInComponent(DropdownItem);
14 });
15
16 it('should render type as "button" by default', () => {
17 testForDefaultTag(DropdownItem, 'button');
18 });
19
20 it('should not render type when tag is "button" and toggle is false', () => {
21 render(<DropdownItem toggle={false}>Home</DropdownItem>);
22 expect(screen.getByText('Home')).not.toHaveAttribute('type');
23 });
24
25 it('should render type as user defined when defined by the user', () => {
26 render(<DropdownItem type="submit">Home</DropdownItem>);
27 expect(screen.getByText('Home')).toHaveAttribute('type', 'submit');
28 });
29
30 it('should not render type by default when the type is not defined and the tag is not "button"', () => {
31 render(<DropdownItem tag="a">Home</DropdownItem>);
32 expect(screen.getByText('Home')).not.toHaveAttribute('type');
33 });
34
35 it('should render custom element', () => {
36 function Link(props) {
37 return (
38 <a href="/home" {...props}>
39 {props.children}
40 </a>
41 );
42 }
43 render(<DropdownItem tag={Link}>Home</DropdownItem>);
44 expect(screen.getByText('Home')).toHaveAttribute('href', '/home');
45 expect(screen.getByText('Home').tagName.toLowerCase()).toMatch('a');
46 });
47
48 it('should render dropdown item text', () => {
49 render(<DropdownItem text>text</DropdownItem>);
50 expect(screen.getByText('text')).toHaveClass('dropdown-item-text');
51 expect(screen.getByText('text').tagName.toLowerCase()).toMatch('span');
52 });
53
54 describe('header', () => {
55 it('should render h6 tag heading', () => {
56 render(<DropdownItem header>Heading</DropdownItem>);
57 expect(screen.getByText('Heading')).toHaveClass('dropdown-header');
58 expect(screen.getByText('Heading').tagName.toLowerCase()).toMatch('h6');
59 });
60 });
61
62 describe('active', () => {
63 it('should render an active class', () => {
64 render(<DropdownItem active data-testid="divider" />);
65 expect(screen.getByTestId('divider')).toHaveClass('active');
66 });
67 });
68
69 describe('divider', () => {
70 it('should render a divider element', () => {
71 render(<DropdownItem divider data-testid="divider" />);
72 expect(screen.getByTestId('divider')).toHaveClass('dropdown-divider');
73 });
74 });
75
76 describe('link (with href)', () => {
77 it('should render an anchor tag', () => {
78 render(<DropdownItem href="#">GO!</DropdownItem>);
79 expect(screen.getByText('GO!')).toHaveClass('dropdown-item');
80 expect(screen.getByText('GO!').tagName.toLowerCase()).toMatch('a');
81 });
82 });
83
84 describe('onClick', () => {
85 it('should not be called when disabled', () => {
86 const onClick = jest.fn();
87 render(
88 <DropdownItem disabled onClick={onClick}>
89 Item
90 </DropdownItem>,
91 );
92 user.click(screen.getByText('Item'));
93 expect(onClick).not.toHaveBeenCalled();
94 });
95
96 it('should not be called when divider is set', () => {
97 const onClick = jest.fn();
98 render(
99 <DropdownItem divider onClick={onClick}>
100 Item
101 </DropdownItem>,
102 );
103 user.click(screen.getByText('Item'));
104 expect(onClick).not.toHaveBeenCalled();
105 });
106
107 it('should not be called when header item', () => {
108 const onClick = jest.fn();
109 render(
110 <DropdownItem header onClick={onClick}>
111 Item
112 </DropdownItem>,
113 );
114 user.click(screen.getByText('Item'));
115 expect(onClick).not.toHaveBeenCalled();
116 });
117
118 it('should be called when not disabled, heading, or divider', () => {
119 const onClick = jest.fn();
120 customDropdownRender(
121 <DropdownItem onClick={onClick}>Item</DropdownItem>,
122 {
123 toggle: () => {},
124 },
125 );
126 user.click(screen.getByText(/item/i));
127 expect(onClick).toBeCalled();
128 });
129
130 it('should call toggle', () => {
131 const toggle = jest.fn();
132 customDropdownRender(
133 <DropdownItem onClick={() => {}}>Item</DropdownItem>,
134 {
135 toggle,
136 },
137 );
138 user.click(screen.getByText(/item/i));
139 expect(toggle).toHaveBeenCalled();
140 });
141 });
142});