1 | import React from 'react';
|
2 | import user from '@testing-library/user-event';
|
3 | import { render, screen } from '@testing-library/react';
|
4 | import { DropdownItem } from '..';
|
5 | import {
|
6 | testForChildrenInComponent,
|
7 | testForDefaultTag,
|
8 | customDropdownRender,
|
9 | } from '../testUtils';
|
10 |
|
11 | describe('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 | });
|