UNPKG

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