@transferwise/components 46.87.2 → 46.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/build/avatarLayout/AvatarLayout.js +9 -2
  2. package/build/avatarLayout/AvatarLayout.js.map +1 -1
  3. package/build/avatarLayout/AvatarLayout.mjs +9 -2
  4. package/build/avatarLayout/AvatarLayout.mjs.map +1 -1
  5. package/build/button/Button.js +92 -79
  6. package/build/button/Button.js.map +1 -1
  7. package/build/button/Button.mjs +93 -80
  8. package/build/button/Button.mjs.map +1 -1
  9. package/build/button/Button.resolver.js +74 -0
  10. package/build/button/Button.resolver.js.map +1 -0
  11. package/build/button/Button.resolver.mjs +72 -0
  12. package/build/button/Button.resolver.mjs.map +1 -0
  13. package/build/button/LegacyButton.js +114 -0
  14. package/build/button/LegacyButton.js.map +1 -0
  15. package/build/button/LegacyButton.mjs +112 -0
  16. package/build/button/LegacyButton.mjs.map +1 -0
  17. package/build/circularButton/CircularButton.js.map +1 -1
  18. package/build/circularButton/CircularButton.mjs.map +1 -1
  19. package/build/criticalBanner/CriticalCommsBanner.js +2 -2
  20. package/build/criticalBanner/CriticalCommsBanner.js.map +1 -1
  21. package/build/criticalBanner/CriticalCommsBanner.mjs +1 -1
  22. package/build/header/Header.js +2 -2
  23. package/build/header/Header.js.map +1 -1
  24. package/build/header/Header.mjs +1 -1
  25. package/build/index.js +2 -2
  26. package/build/index.mjs +1 -1
  27. package/build/link/Link.js +8 -3
  28. package/build/link/Link.js.map +1 -1
  29. package/build/link/Link.mjs +8 -3
  30. package/build/link/Link.mjs.map +1 -1
  31. package/build/main.css +247 -0
  32. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js +2 -4
  33. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -1
  34. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +2 -4
  35. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -1
  36. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +3 -5
  37. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -1
  38. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +3 -5
  39. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs.map +1 -1
  40. package/build/select/Select.js +2 -2
  41. package/build/select/Select.js.map +1 -1
  42. package/build/select/Select.mjs +1 -1
  43. package/build/styles/avatarLayout/AvatarLayout.css +11 -0
  44. package/build/styles/button/Button.css +228 -15
  45. package/build/styles/button/Button.vars.css +46 -0
  46. package/build/styles/button/LegacyButton.css +23 -0
  47. package/build/styles/main.css +247 -0
  48. package/build/types/avatarLayout/AvatarLayout.d.ts.map +1 -1
  49. package/build/types/button/Button.d.ts +2 -23
  50. package/build/types/button/Button.d.ts.map +1 -1
  51. package/build/types/button/Button.resolver.d.ts +35 -0
  52. package/build/types/button/Button.resolver.d.ts.map +1 -0
  53. package/build/types/button/Button.types.d.ts +70 -0
  54. package/build/types/button/Button.types.d.ts.map +1 -0
  55. package/build/types/button/LegacyButton.d.ts +44 -0
  56. package/build/types/button/LegacyButton.d.ts.map +1 -0
  57. package/build/types/button/index.d.ts +2 -2
  58. package/build/types/button/index.d.ts.map +1 -1
  59. package/build/types/circularButton/CircularButton.d.ts.map +1 -1
  60. package/build/types/link/Link.d.ts +2 -2
  61. package/build/types/link/Link.d.ts.map +1 -1
  62. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.d.ts.map +1 -1
  63. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts +6 -2
  64. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts.map +1 -1
  65. package/build/types/primitives/PrimitiveButton/src/PrimitiveButton.d.ts.map +1 -1
  66. package/build/types/test-utils/story-config.d.ts +1 -1
  67. package/build/types/test-utils/story-config.d.ts.map +1 -1
  68. package/build/upload/steps/completeStep/completeStep.js +2 -2
  69. package/build/upload/steps/completeStep/completeStep.js.map +1 -1
  70. package/build/upload/steps/completeStep/completeStep.mjs +1 -1
  71. package/build/upload/steps/processingStep/processingStep.js +2 -2
  72. package/build/upload/steps/processingStep/processingStep.js.map +1 -1
  73. package/build/upload/steps/processingStep/processingStep.mjs +1 -1
  74. package/build/uploadInput/UploadInput.js +3 -3
  75. package/build/uploadInput/UploadInput.js.map +1 -1
  76. package/build/uploadInput/UploadInput.mjs +1 -1
  77. package/package.json +3 -3
  78. package/src/alert/Alert.tests.story.tsx +1 -1
  79. package/src/avatar/Avatar.story.tsx +1 -1
  80. package/src/avatarLayout/AvatarLayout.css +11 -0
  81. package/src/avatarLayout/AvatarLayout.less +18 -1
  82. package/src/avatarLayout/AvatarLayout.tsx +10 -2
  83. package/src/avatarWrapper/AvatarWrapper.story.tsx +1 -1
  84. package/src/badge/Badge.story.tsx +1 -1
  85. package/src/button/Button.accessibility.docs.mdx +103 -0
  86. package/src/button/Button.css +228 -15
  87. package/src/button/Button.less +242 -14
  88. package/src/button/Button.resolver.tsx +73 -0
  89. package/src/button/Button.spec.tsx +329 -213
  90. package/src/button/Button.story.tsx +782 -134
  91. package/src/button/Button.tests.story.tsx +27 -0
  92. package/src/button/Button.tsx +103 -132
  93. package/src/button/Button.types.ts +92 -0
  94. package/src/button/Button.vars.css +46 -0
  95. package/src/button/Button.vars.less +59 -0
  96. package/src/button/LegacyButton.css +23 -0
  97. package/src/button/LegacyButton.less +24 -0
  98. package/src/button/LegacyButton.spec.tsx +147 -0
  99. package/src/button/LegacyButton.story.tsx +228 -0
  100. package/src/button/LegacyButton.tsx +177 -0
  101. package/src/button/index.ts +2 -3
  102. package/src/card/Card.story.tsx +6 -1
  103. package/src/circularButton/CircularButton.tsx +1 -0
  104. package/src/field/Field.story.tsx +1 -1
  105. package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +1 -2
  106. package/src/inputs/SelectInput.story.tsx +1 -1
  107. package/src/label/Label.story.tsx +1 -1
  108. package/src/link/Link.tsx +15 -6
  109. package/src/main.css +247 -0
  110. package/src/main.less +1 -0
  111. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.tsx +2 -8
  112. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.ts +7 -2
  113. package/src/primitives/PrimitiveAnchor/test/PrimitiveAnchor.spec.tsx +1 -3
  114. package/src/primitives/PrimitiveButton/src/PrimitiveButton.tsx +4 -12
  115. package/src/primitives/PrimitiveButton/test/PrimitiveButton.spec.tsx +16 -13
  116. package/src/select/Select.story.tsx +4 -1
  117. package/src/test-utils/Parameters.d.ts +9 -1
  118. package/src/test-utils/story-config.ts +10 -1
  119. package/src/button/__snapshots__/Button.spec.tsx.snap +0 -309
@@ -1,246 +1,362 @@
1
- import { createRef } from 'react';
1
+ import { Freeze } from '@transferwise/icons';
2
+ import { mockMatchMedia, render, screen } from '../test-utils';
3
+ import Button, { ButtonProps } from './Button.resolver';
4
+ import { CommonProps } from './Button.types';
2
5
 
3
- import { ControlType, Type, Priority, Size } from '../common';
4
- import { render, screen, userEvent } from '../test-utils';
5
-
6
- import Button from '.';
7
- import messages from '../i18n/commonMessages/Button.messages';
8
- import { ButtonReferenceType } from './Button';
9
-
10
- const { ACCENT, POSITIVE, NEGATIVE } = ControlType;
11
- const { PAY, LINK, DANGER } = Type;
12
- const { PRIMARY, SECONDARY, TERTIARY } = Priority;
13
- const { SMALL, MEDIUM, LARGE } = Size;
6
+ mockMatchMedia();
14
7
 
15
8
  describe('Button', () => {
16
- // eslint-disable-next-line no-console
17
- const originalWarn = console.warn;
18
- let mockedWarn: typeof originalWarn;
19
-
20
- const props = {
21
- onClick: jest.fn(),
22
- onFocus: jest.fn(),
23
- onBlur: jest.fn(),
24
- children: 'Send money',
9
+ const legacyProps: ButtonProps = {
10
+ as: 'button',
11
+ priority: 'primary',
12
+ size: 'md',
13
+ type: 'accent',
25
14
  };
26
15
 
27
- beforeAll(() => {
28
- mockedWarn = jest.fn().mockImplementation((args) => {
29
- if (typeof args !== 'string' || !args.startsWith('Button has deprecated the')) {
30
- originalWarn(args);
31
- }
32
- });
33
- // eslint-disable-next-line no-console
34
- console.warn = mockedWarn;
35
- });
16
+ const newProps: ButtonProps = {
17
+ as: 'button',
18
+ v2: true,
19
+ priority: 'primary',
20
+ size: 'md',
21
+ };
36
22
 
37
- beforeEach(jest.clearAllMocks);
23
+ const testId = 'new-button';
38
24
 
39
- afterAll(() => {
40
- // eslint-disable-next-line no-console
41
- console.warn = originalWarn;
25
+ it('renders LegacyButton when v2 is false', () => {
26
+ render(<Button {...legacyProps}>Legacy Button</Button>);
27
+ const button = screen.getByText('Legacy Button');
28
+ expect(button).toBeInTheDocument();
29
+ expect(button).toHaveClass('btn btn-md np-btn np-btn-md btn-accent btn-priority-1');
42
30
  });
43
31
 
44
- describe('by default', () => {
45
- it('renders the text', () => {
46
- render(<Button {...props} />);
47
- expect(screen.getByText(props.children)).toBeInTheDocument();
48
- });
49
-
50
- it('set `ref` to be true on Button', () => {
51
- const reference = createRef<ButtonReferenceType>();
52
-
53
- expect(reference.current).toBeFalsy();
54
- render(<Button ref={reference}>Click me!</Button>);
55
- expect(reference.current).toBeTruthy();
56
- });
57
-
58
- it('is not disabled', () => {
59
- render(<Button {...props} />);
60
- expect(screen.getByRole('button')).toBeEnabled();
61
- });
62
-
63
- it('renders a medium button of type accent and priority primary', () => {
64
- expect(render(<Button {...props} />).container).toMatchSnapshot();
65
- });
66
-
67
- it('renders an anchor tag with button styles of type accent and priority primary', () => {
68
- expect(render(<Button {...props} as="a" href="#" />).container).toMatchSnapshot();
69
- });
32
+ it('renders the new Button when v2 is true', () => {
33
+ render(
34
+ <Button data-testid={testId} {...newProps}>
35
+ New Button
36
+ </Button>,
37
+ );
38
+ const button = screen.getByTestId('new-button');
39
+ expect(button).toBeInTheDocument();
40
+ expect(button).toHaveClass('wds-Button wds-Button--medium wds-Button--primary');
70
41
  });
71
42
 
72
- describe('button attributes', () => {
73
- it('sets the htmlType if set', () => {
74
- render(<Button {...props} htmlType="submit" />);
75
- expect(screen.getByRole('button')).toHaveAttribute('type', 'submit');
76
- });
77
-
78
- it('passes through custom classes if set', () => {
79
- render(<Button {...props} className="donkeysarethebest" />);
80
- expect(screen.getByRole('button')).toHaveClass('donkeysarethebest');
81
- });
82
-
83
- it('passes through aria-label if set', () => {
84
- render(<Button {...props} aria-label="unique label" />);
85
- const loadingButton = screen.getByLabelText('unique label');
86
- expect(loadingButton).toBeInTheDocument();
87
- });
88
- });
89
-
90
- describe('onClick', () => {
91
- it('calls onClick when clicked', async () => {
92
- render(<Button {...props} />);
93
- await userEvent.click(screen.getByRole('button'));
94
- expect(props.onClick).toHaveBeenCalledTimes(1);
95
- });
96
-
97
- it('does not call onClick when clicked if disabled', async () => {
98
- render(<Button {...props} disabled />);
99
- await userEvent.click(screen.getByRole('button'));
100
- expect(props.onClick).toHaveBeenCalledTimes(0);
101
- });
102
-
103
- it('does not call onClick when clicked if loading', async () => {
104
- render(<Button {...props} loading />);
105
- await userEvent.click(screen.getByRole('button'));
106
- expect(props.onClick).toHaveBeenCalledTimes(0);
107
- });
108
- });
43
+ describe('render as HTML anchor', () => {
44
+ const href = 'https://example.com';
45
+ const name = 'Button as link';
46
+
47
+ describe('v2', () => {
48
+ describe('rendered HTMLS element', () => {
49
+ it('should render as button by default', () => {
50
+ render(<Button v2>{name}</Button>);
51
+ expect(screen.getByRole('button', { name })).toBeInTheDocument();
52
+ });
53
+
54
+ it('should render as link if href is provided', () => {
55
+ render(
56
+ <Button v2 href={href}>
57
+ {name}
58
+ </Button>,
59
+ );
60
+ expect(screen.getByRole('link', { name })).toHaveAttribute('href', href);
61
+ });
62
+
63
+ it('should render a HTML anchor if `as="a"` is provided', () => {
64
+ render(
65
+ <Button v2 as="a">
66
+ {name}
67
+ </Button>,
68
+ );
69
+ expect(screen.getByText(name).closest('a')).toBeInTheDocument();
70
+ });
71
+
72
+ it('should render as a button if `href` is set together with `as="button"`', () => {
73
+ render(
74
+ <Button v2 href={href} as="button">
75
+ {name}
76
+ </Button>,
77
+ );
78
+ expect(screen.getByRole('button', { name })).toBeInTheDocument();
79
+ });
80
+ });
109
81
 
110
- describe('onFocus and onBlur', () => {
111
- it('calls both handlers by default', async () => {
112
- render(<Button {...props} />);
113
- await userEvent.tab();
114
- expect(props.onFocus).toHaveBeenCalledTimes(1);
115
- await userEvent.tab();
116
- expect(props.onFocus).toHaveBeenCalledTimes(1);
117
- });
82
+ describe('HTML attributes', () => {
83
+ it('should not set `type` if rendered as HTML anchor', () => {
84
+ render(
85
+ <Button v2 type="submit" href="wise.com">
86
+ {name}
87
+ </Button>,
88
+ );
89
+ expect(screen.getByRole('link')).not.toHaveAttribute('type');
90
+ });
91
+
92
+ it('should not set `href` or `target` if rendered as HTML button', () => {
93
+ render(
94
+ <Button v2 as="button" href="wise.com" target="_blank">
95
+ {name}
96
+ </Button>,
97
+ );
98
+ const button = screen.getByRole('button');
99
+ expect(button).not.toHaveAttribute('href');
100
+ expect(button).not.toHaveAttribute('target');
101
+ });
102
+ });
118
103
 
119
- it('does not call either handler if disabled', async () => {
120
- render(<Button {...props} disabled />);
121
- await userEvent.tab();
122
- expect(props.onFocus).not.toHaveBeenCalled();
123
- await userEvent.tab();
124
- expect(props.onFocus).not.toHaveBeenCalled();
125
- });
104
+ describe('disabled mode', () => {
105
+ describe('button', () => {
106
+ it('should not be disabled by default', () => {
107
+ render(<Button v2>{name}</Button>);
108
+ const button = screen.getByRole('button');
109
+ expect(button).toBeEnabled();
110
+ expect(button).not.toHaveAttribute('aria-disabled');
111
+ });
112
+
113
+ it('should respect disabled mode and set it only via the `disabled` attribute', () => {
114
+ render(
115
+ <Button v2 disabled>
116
+ {name}
117
+ </Button>,
118
+ );
119
+ const button = screen.getByRole('button');
120
+ expect(button).toBeDisabled();
121
+ expect(button).not.toHaveAttribute('aria-disabled');
122
+ });
123
+ });
124
+
125
+ describe('anchor', () => {
126
+ it('should not be disabled by default', () => {
127
+ render(
128
+ <Button v2 href="wise.com">
129
+ {name}
130
+ </Button>,
131
+ );
132
+ const button = screen.getByRole('link');
133
+ expect(button).toBeEnabled();
134
+ expect(button).not.toHaveAttribute('aria-disabled');
135
+ });
136
+
137
+ it('should respect disabled mode', () => {
138
+ render(
139
+ <Button v2 href="wise.com" disabled>
140
+ {name}
141
+ </Button>,
142
+ );
143
+ const button = screen.getByRole('link');
144
+ expect(button).toHaveAttribute('aria-disabled');
145
+ expect(button).toBeEnabled();
146
+ expect(button).not.toHaveAttribute('href');
147
+ });
148
+ });
149
+ });
126
150
 
127
- it('calls both handlers if loading', async () => {
128
- render(<Button {...props} loading />);
129
- await userEvent.tab();
130
- expect(props.onFocus).toHaveBeenCalledTimes(1);
131
- await userEvent.tab();
132
- expect(props.onFocus).toHaveBeenCalledTimes(1);
151
+ describe('loading mode', () => {
152
+ describe('button', () => {
153
+ it('should not be loading by default', () => {
154
+ render(<Button v2>{name}</Button>);
155
+ const button = screen.getByRole('button');
156
+ expect(button).toBeEnabled();
157
+ expect(button).not.toHaveAttribute('aria-busy');
158
+ });
159
+
160
+ it('should respect loading mode', () => {
161
+ render(
162
+ <Button v2 loading>
163
+ {name}
164
+ </Button>,
165
+ );
166
+ const button = screen.getByRole('button');
167
+ expect(button).toHaveAttribute('aria-busy');
168
+ // the `disabled` attribute is not set to keep the button
169
+ // focusable but aria attribute is defined to make it
170
+ // announced properly by the assistive tech
171
+ expect(button).toBeEnabled();
172
+ expect(button).toHaveAttribute('aria-disabled');
173
+ });
174
+ });
175
+
176
+ describe('anchor', () => {
177
+ it('should not be loading by default', () => {
178
+ render(
179
+ <Button v2 href="wise.com">
180
+ {name}
181
+ </Button>,
182
+ );
183
+ const button = screen.getByRole('link');
184
+ expect(button).toBeEnabled();
185
+ expect(button).not.toHaveAttribute('aria-busy');
186
+ expect(button).not.toHaveAttribute('aria-disabled');
187
+ });
188
+
189
+ it('should respect loading mode', () => {
190
+ render(
191
+ <Button v2 loading href="wise.com">
192
+ {name}
193
+ </Button>,
194
+ );
195
+ const button = screen.getByRole('link');
196
+ expect(button).toHaveAttribute('aria-busy');
197
+ // the `disabled` attribute is not set to keep the button
198
+ // focusable but aria attribute is defined to make it
199
+ // announced properly by the assistive tech
200
+ expect(button).toBeEnabled();
201
+ expect(button).toHaveAttribute('aria-disabled');
202
+ expect(button).not.toHaveAttribute('href');
203
+ });
204
+ });
205
+ });
133
206
  });
134
207
  });
135
208
 
136
- describe('sizes', () => {
137
- it('renders small buttons', () => {
138
- expect(render(<Button {...props} size={SMALL} />).container).toMatchSnapshot();
139
- });
140
-
141
- it('renders medium buttons', () => {
142
- expect(render(<Button {...props} size={MEDIUM} />).container).toMatchSnapshot();
143
- });
144
-
145
- it('renders large buttons', () => {
146
- expect(render(<Button {...props} size={LARGE} />).container).toMatchSnapshot();
147
- });
209
+ it('does not set type when type is in LegacyButtonType', () => {
210
+ const legacyTypeProps: ButtonProps = {
211
+ ...newProps,
212
+ // @ts-expect-error here we intentionally set wrong value to test `type` attr in DOM
213
+ type: 'accent',
214
+ };
215
+ render(
216
+ <Button data-testid={testId} {...legacyTypeProps}>
217
+ Button Type
218
+ </Button>,
219
+ );
220
+ const button = screen.getByTestId('new-button');
221
+ expect(button).toBeInTheDocument();
222
+ expect(button).not.toHaveAttribute('type');
148
223
  });
149
224
 
150
- describe('types', () => {
151
- it('renders accent buttons', () => {
152
- expect(render(<Button {...props} type={ACCENT} />).container).toMatchSnapshot();
153
- });
154
-
155
- it('renders positive buttons', () => {
156
- expect(render(<Button {...props} type={POSITIVE} />).container).toMatchSnapshot();
157
- });
158
-
159
- it('renders negative buttons', () => {
160
- expect(render(<Button {...props} type={NEGATIVE} />).container).toMatchSnapshot();
161
- });
225
+ it('sets type when type is not in LegacyButtonType', () => {
226
+ const buttonTypeProps: ButtonProps = {
227
+ ...newProps,
228
+ type: 'submit',
229
+ };
230
+ render(
231
+ <Button data-testid={testId} {...buttonTypeProps}>
232
+ Submit Button
233
+ </Button>,
234
+ );
235
+ const button = screen.getByTestId('new-button');
236
+ expect(button).toBeInTheDocument();
237
+ expect(button).toHaveAttribute('type', 'submit');
162
238
  });
163
239
 
164
- describe('priorities', () => {
165
- it('renders primary buttons', () => {
166
- [ACCENT, POSITIVE, NEGATIVE].forEach((type) =>
167
- expect(
168
- render(<Button {...props} priority={PRIMARY} type={type} />).container,
169
- ).toMatchSnapshot(),
170
- );
171
- });
172
-
173
- it('renders secondary buttons', () => {
174
- [ACCENT, POSITIVE, NEGATIVE].forEach((type) =>
175
- expect(
176
- render(<Button {...props} priority={SECONDARY} type={type} />).container,
177
- ).toMatchSnapshot(),
240
+ describe('addons', () => {
241
+ const avatarProp: CommonProps['addonStart'] = {
242
+ type: 'avatar',
243
+ value: [{ asset: <Freeze /> }],
244
+ };
245
+ const iconProp: CommonProps['addonStart'] = { type: 'icon', value: <Freeze /> };
246
+
247
+ const renderAllPriorities = (props: CommonProps) =>
248
+ render(
249
+ <>
250
+ <Button {...props} priority="primary">
251
+ primary
252
+ </Button>
253
+ <Button {...props} priority="secondary">
254
+ secondary
255
+ </Button>
256
+ <Button {...props} priority="secondary-neutral">
257
+ secondary-neutral
258
+ </Button>
259
+ <Button {...props} priority="tertiary">
260
+ tertiary
261
+ </Button>
262
+ </>,
178
263
  );
179
- });
180
-
181
- it('renders tertiary buttons', () => {
182
- expect(
183
- render(<Button {...props} priority={TERTIARY} type={ACCENT} />).container,
184
- ).toMatchSnapshot();
185
- });
186
264
 
187
- it('defaults tertiary buttons to secondary for positive buttons', () => {
188
- [POSITIVE, NEGATIVE].forEach((type) =>
189
- expect(
190
- render(<Button {...props} priority={TERTIARY} type={type} />).container,
191
- ).toMatchSnapshot(),
192
- );
193
- });
194
- });
195
-
196
- describe('other states', () => {
197
- it('renders as loading if `loading` is true', () => {
198
- render(<Button {...props} loading />);
199
- const button = screen.queryByRole('button', {
200
- name: messages.loadingAriaLabel.defaultMessage,
265
+ describe('addonsStart', () => {
266
+ describe('large', () => {
267
+ it('should not support avatars', () => {
268
+ renderAllPriorities({
269
+ v2: true,
270
+ size: 'lg',
271
+ addonStart: avatarProp,
272
+ });
273
+ expect(screen.queryAllByTestId('freeze-icon')).toHaveLength(0);
274
+ });
275
+
276
+ it('should not support icons', () => {
277
+ renderAllPriorities({
278
+ v2: true,
279
+ size: 'lg',
280
+ addonStart: iconProp,
281
+ });
282
+ expect(screen.queryAllByTestId('freeze-icon')).toHaveLength(0);
283
+ });
201
284
  });
202
- expect(button).toBeInTheDocument();
203
- expect(button).toBeEnabled();
204
- expect(button).toHaveClass('btn-loading');
205
- expect(button).toHaveAttribute('aria-disabled', 'true');
206
- expect(button).toHaveAttribute('aria-busy', 'true');
207
- expect(button).toHaveAttribute('aria-live', 'polite');
208
- expect(screen.getByTestId('ButtonProgressIndicator')).toBeInTheDocument();
209
- });
210
-
211
- it('disables the button', () => {
212
- render(<Button {...props} disabled />);
213
- const button = screen.queryByRole('button');
214
- expect(button).toBeDisabled();
215
- expect(button).toHaveClass('disabled');
216
- expect(button).toHaveAttribute('aria-disabled', 'false');
217
- expect(button).toHaveAttribute('aria-busy', 'false');
218
- expect(button).toHaveAttribute('aria-live', 'off');
219
- });
220
285
 
221
- it('renders as block if block is true', () => {
222
- expect(render(<Button {...props} block />).container).toMatchSnapshot();
223
- });
224
- });
286
+ describe('medium', () => {
287
+ it('should support avatar', () => {
288
+ renderAllPriorities({
289
+ v2: true,
290
+ size: 'md',
291
+ addonStart: avatarProp,
292
+ });
293
+ expect(screen.getAllByTestId('freeze-icon')).toHaveLength(4);
294
+ });
295
+
296
+ it('should support icon', () => {
297
+ renderAllPriorities({
298
+ v2: true,
299
+ size: 'md',
300
+ addonStart: iconProp,
301
+ });
302
+ expect(screen.getAllByTestId('freeze-icon')).toHaveLength(4);
303
+ });
304
+ });
225
305
 
226
- describe('deprecated types', () => {
227
- it('renders primary as accent buttons and logs a warning', () => {
228
- expect(render(<Button {...props} type={PRIMARY} />).container).toMatchSnapshot();
229
- expect(mockedWarn).toHaveBeenCalledTimes(1);
306
+ describe('small', () => {
307
+ it('should not support avatar', () => {
308
+ renderAllPriorities({
309
+ v2: true,
310
+ size: 'sm',
311
+ addonStart: avatarProp,
312
+ });
313
+ expect(screen.queryAllByTestId('freeze-icon')).toHaveLength(0);
314
+ });
315
+
316
+ it('should support icon', () => {
317
+ renderAllPriorities({
318
+ v2: true,
319
+ size: 'sm',
320
+ addonStart: iconProp,
321
+ });
322
+ expect(screen.getAllByTestId('freeze-icon')).toHaveLength(4);
323
+ });
324
+ });
230
325
  });
231
326
 
232
- it('renders pay as positive buttons and logs a warning', () => {
233
- expect(render(<Button {...props} type={PAY} />).container).toMatchSnapshot();
234
- expect(mockedWarn).toHaveBeenCalledTimes(1);
235
- });
327
+ describe('addonEnd', () => {
328
+ describe('large', () => {
329
+ it('should support icon', () => {
330
+ renderAllPriorities({
331
+ v2: true,
332
+ size: 'lg',
333
+ addonEnd: iconProp,
334
+ });
335
+ expect(screen.queryAllByTestId('freeze-icon')).toHaveLength(0);
336
+ });
337
+ });
236
338
 
237
- it('renders danger as negative buttons with priority secondary and logs a warning', () => {
238
- expect(render(<Button {...props} type={DANGER} />).container).toMatchSnapshot();
239
- expect(mockedWarn).toHaveBeenCalledTimes(1);
240
- });
339
+ describe('medium', () => {
340
+ it('should support icon', () => {
341
+ renderAllPriorities({
342
+ v2: true,
343
+ size: 'sm',
344
+ addonEnd: iconProp,
345
+ });
346
+ expect(screen.getAllByTestId('freeze-icon')).toHaveLength(4);
347
+ });
348
+ });
241
349
 
242
- it('renders link as accent buttons with priority tertiary and logs a warning', () => {
243
- expect(render(<Button {...props} type={LINK} />).container).toMatchSnapshot();
350
+ describe('small', () => {
351
+ it('should support icon', () => {
352
+ renderAllPriorities({
353
+ v2: true,
354
+ size: 'md',
355
+ addonEnd: iconProp,
356
+ });
357
+ expect(screen.getAllByTestId('freeze-icon')).toHaveLength(4);
358
+ });
359
+ });
244
360
  });
245
361
  });
246
362
  });