Skip to content

Commit eac6da9

Browse files
authored
test(Button): test for Button added (#164)
1 parent 6626494 commit eac6da9

File tree

4 files changed

+134
-4
lines changed

4 files changed

+134
-4
lines changed

src/components/Button/Button.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {Platform, Button as CommonButton, Icon, StoreBadge} from '@gravity-ui/ui
33

44
import {block, setUrlTld} from '../../utils';
55
import {ButtonProps as ButtonParams, DefaultEventNames} from '../../models';
6-
import {OldButtonSize, OldButtonTheme, toCommonSize, toCommonView} from './utils';
6+
import {OldButtonSize, OldButtonTheme, toCommonSize, toCommonView, ICON_QA} from './utils';
77
import {LocaleContext} from '../../context/localeContext/localeContext';
88
import {useMetrika} from '../../hooks/useMetrika';
99
import {useAnalytics} from '../../hooks';
@@ -15,6 +15,7 @@ export interface ButtonProps extends Omit<ButtonParams, 'url'> {
1515
className?: string;
1616
url?: string;
1717
onClick?: () => void;
18+
qa?: string;
1819
}
1920

2021
const b = block('button-block');
@@ -70,7 +71,7 @@ const Button = (props: ButtonProps) => {
7071
let image = img && <img className={b('image')} src={buttonImg.url} alt={buttonImg.alt} />;
7172

7273
if (theme === 'github') {
73-
icon = <Icon className={b('icon')} data={Github} size={24} />;
74+
icon = <Icon className={b('icon')} data={Github} size={24} qa={ICON_QA} />;
7475
image = undefined;
7576
}
7677

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import React from 'react';
2+
import {render, screen} from '@testing-library/react';
3+
import userEvent from '@testing-library/user-event';
4+
import {ButtonSize} from '@gravity-ui/uikit';
5+
6+
import {ButtonImagePosition, ButtonTheme} from '../../../models';
7+
import {ICON_QA} from '../utils';
8+
9+
import Button from '../Button';
10+
11+
const qaId = 'button-component';
12+
13+
const buttonProps = {
14+
text: 'Button Text',
15+
url: 'https://github.com/gravity-ui/',
16+
target: '_blank',
17+
img: {
18+
url: 'https://storage.yandexcloud.net/cloud-www-assets/constructor/storybook/images/icon_1_light.svg',
19+
position: 'left' as ButtonImagePosition,
20+
alt: 'alt-text',
21+
},
22+
};
23+
24+
const buttonViews: ButtonTheme[] = [
25+
'normal',
26+
'action',
27+
'outlined',
28+
'outlined-info',
29+
'outlined-danger',
30+
'raised',
31+
'flat',
32+
'flat-info',
33+
'flat-danger',
34+
'flat-secondary',
35+
'normal-contrast',
36+
'outlined-contrast',
37+
'flat-contrast',
38+
'github',
39+
'scale',
40+
'monochrome',
41+
];
42+
43+
describe('Button', () => {
44+
test('render button by default', async () => {
45+
render(<Button text={buttonProps.text} />);
46+
const button = screen.getByRole('button');
47+
48+
expect(button).toBeInTheDocument();
49+
expect(button).toBeVisible();
50+
expect(button).not.toBeDisabled();
51+
});
52+
53+
test('should render <a /> tag', async () => {
54+
render(
55+
<Button text={buttonProps.text} url={buttonProps.url} target={buttonProps.target} />,
56+
);
57+
const button = screen.getByRole('link');
58+
59+
expect(button).toBeVisible();
60+
expect(button).toHaveAttribute('href', buttonProps.url);
61+
expect(button).toHaveAttribute('target', buttonProps.target);
62+
});
63+
64+
test('call onClick', async () => {
65+
const user = userEvent.setup();
66+
const handleOnClick = jest.fn();
67+
render(<Button text={buttonProps.text} onClick={handleOnClick} />);
68+
69+
const button = screen.getByRole('button');
70+
71+
await user.click(button);
72+
expect(handleOnClick).toHaveBeenCalledTimes(1);
73+
});
74+
75+
test.each(new Array<ButtonSize>('s', 'm', 'l', 'xl'))('render with given "%s" size', (size) => {
76+
render(<Button text={buttonProps.text} size={size} qa={qaId} />);
77+
const button = screen.getByTestId(qaId);
78+
79+
expect(button).toHaveClass(`pc-button-block_size_${size}`);
80+
});
81+
82+
test.each(new Array<ButtonTheme>(...buttonViews))('render with given "%s" view', (theme) => {
83+
render(<Button text={buttonProps.text} theme={theme} qa={qaId} />);
84+
const button = screen.getByTestId(qaId);
85+
86+
expect(button).toHaveClass(`pc-button-block_theme_${theme}`);
87+
});
88+
89+
test('add className', () => {
90+
const className = 'my-class';
91+
92+
render(<Button text={buttonProps.text} className={className} qa={qaId} />);
93+
const button = screen.getByTestId(qaId);
94+
95+
expect(button).toHaveClass(className);
96+
});
97+
98+
test('should render icon', () => {
99+
render(<Button text={buttonProps.text} img={buttonProps.img} />);
100+
101+
const button = screen.getByRole('button');
102+
const iconComponent = screen.getByRole('img');
103+
104+
expect(iconComponent).toBeVisible();
105+
expect(button).toContainElement(iconComponent);
106+
});
107+
108+
test('should render github icon', () => {
109+
render(<Button text={buttonProps.text} img={buttonProps.img} theme="github" />);
110+
111+
const button = screen.getByRole('button');
112+
const iconComponent = screen.getByTestId(ICON_QA);
113+
114+
expect(iconComponent).toBeVisible();
115+
expect(button).toContainElement(iconComponent);
116+
});
117+
});

src/components/Button/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import {ButtonSize, ButtonView} from '@gravity-ui/uikit';
22

3+
export const ICON_QA = 'button-icon';
4+
35
export type OldButtonTheme =
46
| 'normal'
57
| 'action'

src/models/constructor-items/common.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,21 +168,31 @@ export interface FileLinkProps extends ClassNameProps {
168168
}
169169

170170
// buttons
171+
export type ButtonTheme =
172+
| ButtonView
173+
| 'github'
174+
| 'app-store'
175+
| 'google-play'
176+
| 'scale'
177+
| 'monochrome';
178+
171179
export interface ButtonProps extends AnalyticsEventsBase {
172180
text: string;
173181
url: string;
174182
primary?: boolean;
175183
size?: ButtonSize;
176-
theme?: ButtonView | 'github' | 'app-store' | 'google-play' | 'scale' | 'monochrome';
184+
theme?: ButtonTheme;
177185
img?: ButtonImageProps | string;
178186
metrikaGoals?: MetrikaGoal;
179187
pixelEvents?: ButtonPixel;
180188
target?: string;
181189
}
182190

191+
export type ButtonImagePosition = 'left' | 'right';
192+
183193
export interface ButtonImageProps {
184194
url: string;
185-
position?: 'left' | 'right';
195+
position?: ButtonImagePosition;
186196
alt?: string;
187197
}
188198

0 commit comments

Comments
 (0)