UNPKG

5.05 kBJavaScriptView Raw
1import React from 'react';
2import { createEvent, fireEvent, screen } from '@testing-library/react';
3import user from '@testing-library/user-event';
4import { DropdownToggle } from '..';
5import { customDropdownRender } from '../testUtils';
6
7describe('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});