1 | import React from 'react';
|
2 | import { createEvent, fireEvent, screen } from '@testing-library/react';
|
3 | import user from '@testing-library/user-event';
|
4 | import { DropdownToggle } from '..';
|
5 | import { customDropdownRender } from '../testUtils';
|
6 |
|
7 | describe('DropdownToggle', () => {
|
8 | const contextProps = {
|
9 | isOpen: false,
|
10 | direction: 'down',
|
11 | inNavbar: false,
|
12 | toggle: jest.fn(),
|
13 | };
|
14 |
|
15 | beforeEach(() => {
|
16 | contextProps.isOpen = false;
|
17 | contextProps.direction = 'down';
|
18 | contextProps.inNavbar = false;
|
19 | contextProps.toggle.mockClear();
|
20 | });
|
21 |
|
22 | it('should wrap text', () => {
|
23 | customDropdownRender(
|
24 | <DropdownToggle>Ello world</DropdownToggle>,
|
25 | contextProps,
|
26 | );
|
27 |
|
28 | expect(screen.getByText(/ello world/i)).toBeInTheDocument();
|
29 | });
|
30 |
|
31 | it('should add default visually-hidden content', () => {
|
32 | customDropdownRender(<DropdownToggle />, contextProps);
|
33 |
|
34 | expect(screen.getByText(/toggle dropdown/i)).toHaveClass('visually-hidden');
|
35 | });
|
36 |
|
37 | it('should add default visually-hidden content', () => {
|
38 | customDropdownRender(
|
39 | <DropdownToggle aria-label="Dropup Toggle" />,
|
40 | contextProps,
|
41 | );
|
42 |
|
43 | expect(screen.getByText(/dropup toggle/i)).toHaveClass('visually-hidden');
|
44 | });
|
45 |
|
46 | it('should render elements', () => {
|
47 | customDropdownRender(
|
48 | <DropdownToggle>Click Me</DropdownToggle>,
|
49 | contextProps,
|
50 | );
|
51 |
|
52 | expect(screen.getByText(/click me/i).tagName).toBe('BUTTON');
|
53 | });
|
54 |
|
55 | it('should render a caret', () => {
|
56 | customDropdownRender(
|
57 | <DropdownToggle caret>Ello world</DropdownToggle>,
|
58 | contextProps,
|
59 | );
|
60 |
|
61 | expect(screen.getByText(/ello world/i)).toHaveClass('dropdown-toggle');
|
62 | });
|
63 |
|
64 | describe('color', () => {
|
65 | it('should render the dropdown as a BUTTON element with default color secondary', () => {
|
66 | customDropdownRender(<DropdownToggle data-testid="rick" />, contextProps);
|
67 | expect(screen.getByTestId(/rick/i)).toHaveClass('btn-secondary');
|
68 | });
|
69 |
|
70 | it('should render the dropdown as a BUTTON element with explicit color success', () => {
|
71 | customDropdownRender(
|
72 | <DropdownToggle color="success" data-testid="morty" />,
|
73 | contextProps,
|
74 | );
|
75 |
|
76 | expect(screen.getByTestId(/morty/i)).toHaveClass('btn-success');
|
77 | });
|
78 |
|
79 | it('should render the dropdown as an A element with no color attribute', () => {
|
80 | customDropdownRender(
|
81 | <DropdownToggle tag="a" data-testid="pickle-rick" />,
|
82 | contextProps,
|
83 | );
|
84 |
|
85 | expect(screen.getByTestId(/pickle-rick/i).tagName).toBe('A');
|
86 | expect(screen.getByTestId(/pickle-rick/i)).not.toHaveAttribute('color');
|
87 | });
|
88 |
|
89 | it('should render the dropdown as a DIV element with no color attribute', () => {
|
90 | customDropdownRender(
|
91 | <DropdownToggle tag="div" color="success" data-testid="tiny-rick" />,
|
92 | contextProps,
|
93 | );
|
94 |
|
95 | expect(screen.getByTestId(/tiny-rick/i).tagName).toBe('DIV');
|
96 | expect(screen.getByTestId(/tiny-rick/i)).not.toHaveAttribute('color');
|
97 | });
|
98 | });
|
99 |
|
100 | it('should render a split', () => {
|
101 | customDropdownRender(
|
102 | <DropdownToggle split>Ello world</DropdownToggle>,
|
103 | contextProps,
|
104 | );
|
105 |
|
106 | expect(screen.getByText(/ello world/i)).toHaveClass(
|
107 | 'dropdown-toggle-split',
|
108 | );
|
109 | });
|
110 |
|
111 | describe('onClick', () => {
|
112 | it('should call props.onClick if it exists', () => {
|
113 | const onClick = jest.fn();
|
114 | customDropdownRender(
|
115 | <DropdownToggle onClick={onClick}>Ello world</DropdownToggle>,
|
116 | contextProps,
|
117 | );
|
118 |
|
119 | user.click(screen.getByText(/ello world/i));
|
120 |
|
121 | expect(onClick).toHaveBeenCalledTimes(1);
|
122 | });
|
123 |
|
124 | it('should call context.toggle when present ', () => {
|
125 | contextProps.toggle = jest.fn();
|
126 | const { container } = customDropdownRender(
|
127 | <DropdownToggle>Ello world</DropdownToggle>,
|
128 | contextProps,
|
129 | );
|
130 |
|
131 | user.click(screen.getByText(/ello world/i));
|
132 |
|
133 | expect(contextProps.toggle).toHaveBeenCalledTimes(1);
|
134 | });
|
135 | });
|
136 |
|
137 | describe('disabled', () => {
|
138 | it('should not call onClick when disabled', () => {
|
139 | const onClick = jest.fn();
|
140 | customDropdownRender(
|
141 | <DropdownToggle disabled onClick={onClick}>
|
142 | Ello world
|
143 | </DropdownToggle>,
|
144 | contextProps,
|
145 | );
|
146 |
|
147 | user.click(screen.getByText(/ello world/i));
|
148 |
|
149 | expect(onClick).not.toBeCalled();
|
150 | });
|
151 | });
|
152 |
|
153 | describe('nav', () => {
|
154 | it('should add .nav-link class', () => {
|
155 | customDropdownRender(
|
156 | <DropdownToggle nav>Ello world</DropdownToggle>,
|
157 | contextProps,
|
158 | );
|
159 |
|
160 | expect(screen.getByText(/ello world/i)).toHaveClass('nav-link');
|
161 | expect(screen.getByText(/ello world/i).tagName).toBe('A');
|
162 | });
|
163 |
|
164 | it('should preventDefault', () => {
|
165 | customDropdownRender(
|
166 | <DropdownToggle nav>Ello world</DropdownToggle>,
|
167 | contextProps,
|
168 | );
|
169 |
|
170 | const node = screen.getByText(/ello world/i);
|
171 | const click = createEvent.click(node);
|
172 | fireEvent(node, click);
|
173 |
|
174 | expect(click.defaultPrevented).toBeTruthy();
|
175 | });
|
176 | });
|
177 | });
|