1 | import React from 'react';
|
2 | import { render, screen } from '@testing-library/react';
|
3 | import user from '@testing-library/user-event';
|
4 | import { Button } from '..';
|
5 | import {
|
6 | testForChildrenInComponent,
|
7 | testForDefaultClass,
|
8 | testForDefaultTag,
|
9 | } from '../testUtils';
|
10 |
|
11 | describe('Button', () => {
|
12 | it('should render children', () => {
|
13 | testForChildrenInComponent(Button);
|
14 | });
|
15 |
|
16 | it('should render custom element', () => {
|
17 | function Link(props) {
|
18 | return (
|
19 | <a href="/home" {...props}>
|
20 | {props.children}
|
21 | </a>
|
22 | );
|
23 | }
|
24 | render(<Button tag={Link}>Home</Button>);
|
25 | expect(screen.getByText(/home/i).tagName.toLowerCase()).toBe('a');
|
26 | });
|
27 |
|
28 | it('should render a button by default', () => {
|
29 | testForDefaultTag(Button, 'button');
|
30 | });
|
31 |
|
32 | it('should render an anchor element if href exists', () => {
|
33 | render(<Button href="/home">Home</Button>);
|
34 | expect(screen.getByText(/home/i).tagName.toLowerCase()).toBe('a');
|
35 | });
|
36 |
|
37 | it('should render type as undefined by default when tag is "button"', () => {
|
38 | render(<Button>Home</Button>);
|
39 | expect(screen.getByText(/home/i)).not.toHaveAttribute('type');
|
40 | });
|
41 |
|
42 | it('should render type as "button" by default when tag is "button" and onClick is provided', () => {
|
43 | render(<Button onClick={() => {}}>Home</Button>);
|
44 | expect(screen.getByText(/home/i)).toHaveAttribute('type', 'button');
|
45 | });
|
46 |
|
47 | it('should render type as user defined when defined by the user', () => {
|
48 | const TYPE = 'submit';
|
49 | render(<Button type={TYPE}>Home</Button>);
|
50 | expect(screen.getByText(/home/i)).toHaveAttribute('type', TYPE);
|
51 | });
|
52 |
|
53 | it('should not render type by default when the type is not defined and the tag is not "button"', () => {
|
54 | render(<Button tag="a">Home</Button>);
|
55 | expect(screen.getByText(/home/i)).not.toHaveAttribute('type');
|
56 | });
|
57 |
|
58 | it('should not render type by default when the type is not defined and the href is defined', () => {
|
59 | render(<Button href="#">Home</Button>);
|
60 | expect(screen.getByText(/home/i)).not.toHaveAttribute('type');
|
61 | });
|
62 |
|
63 | it('should render buttons with default color', () => {
|
64 | testForDefaultClass(Button, 'btn-secondary');
|
65 | });
|
66 |
|
67 | it('should render buttons with other colors', () => {
|
68 | render(<Button color="danger">Home</Button>);
|
69 | expect(screen.getByText(/home/i)).toHaveClass('btn-danger');
|
70 | });
|
71 |
|
72 | it('should render buttons with outline variant', () => {
|
73 | render(<Button outline>Home</Button>);
|
74 | expect(screen.getByText(/home/i)).toHaveClass('btn-outline-secondary');
|
75 | });
|
76 |
|
77 | it('should render buttons with outline variant with different colors', () => {
|
78 | render(
|
79 | <Button outline color="info">
|
80 | Home
|
81 | </Button>,
|
82 | );
|
83 | expect(screen.getByText(/home/i)).toHaveClass('btn-outline-info');
|
84 | });
|
85 |
|
86 | it('should render buttons at different sizes', () => {
|
87 | render(
|
88 | <>
|
89 | <Button size="sm">Small Button</Button>
|
90 | <Button size="lg">Large Button</Button>
|
91 | </>,
|
92 | );
|
93 |
|
94 | expect(screen.getByText(/small/i)).toHaveClass('btn-sm');
|
95 | expect(screen.getByText(/large/i)).toHaveClass('btn-lg');
|
96 | });
|
97 |
|
98 | it('should render block level buttons', () => {
|
99 | render(<Button block>Block Level Button</Button>);
|
100 | expect(screen.getByText(/block/i)).toHaveClass('d-block w-100');
|
101 | });
|
102 |
|
103 | it('should render close icon with custom child and props', () => {
|
104 | const testChild = 'close this thing';
|
105 | render(<Button close>{testChild}</Button>);
|
106 | expect(screen.getByText(testChild)).toHaveClass('btn-close');
|
107 | });
|
108 |
|
109 | describe('onClick', () => {
|
110 | it('calls props.onClick if it exists', () => {
|
111 | const onClick = jest.fn();
|
112 | render(<Button onClick={onClick}>Testing Click</Button>);
|
113 | user.click(screen.getByText(/testing click/i));
|
114 | expect(onClick).toHaveBeenCalled();
|
115 | });
|
116 |
|
117 | it('is not called when disabled', () => {
|
118 | const onClick = jest.fn();
|
119 | render(
|
120 | <Button onClick={onClick} disabled>
|
121 | Testing Click
|
122 | </Button>,
|
123 | );
|
124 |
|
125 | user.click(screen.getByText(/testing click/i));
|
126 | expect(onClick).not.toHaveBeenCalled();
|
127 | });
|
128 | });
|
129 | });
|