@transferwise/components 46.38.0 → 46.39.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.
- package/build/index.js +22 -42
- package/build/index.js.map +1 -1
- package/build/index.mjs +22 -42
- package/build/index.mjs.map +1 -1
- package/build/types/flowNavigation/backButton/BackButton.d.ts +5 -17
- package/build/types/flowNavigation/backButton/BackButton.d.ts.map +1 -1
- package/build/types/flowNavigation/backButton/index.d.ts +2 -2
- package/build/types/flowNavigation/backButton/index.d.ts.map +1 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/info/Info.d.ts +2 -2
- package/build/types/info/Info.d.ts.map +1 -1
- package/build/types/info/index.d.ts +1 -1
- package/build/types/info/index.d.ts.map +1 -1
- package/build/types/overlayHeader/OverlayHeader.d.ts +9 -18
- package/build/types/overlayHeader/OverlayHeader.d.ts.map +1 -1
- package/build/types/overlayHeader/index.d.ts +2 -1
- package/build/types/overlayHeader/index.d.ts.map +1 -1
- package/package.json +24 -26
- package/src/accordion/Accordion.spec.js +5 -5
- package/src/accordion/AccordionItem/AccordionItem.spec.js +2 -2
- package/src/actionButton/ActionButton.spec.tsx +4 -5
- package/src/alert/Alert.spec.tsx +4 -4
- package/src/alert/Alert.story.tsx +6 -5
- package/src/button/Button.spec.js +4 -5
- package/src/card/Card.spec.tsx +4 -4
- package/src/carousel/Carousel.spec.tsx +17 -17
- package/src/checkbox/Checkbox.spec.tsx +0 -2
- package/src/checkboxButton/CheckboxButton.spec.tsx +0 -2
- package/src/checkboxOption/CheckboxOption.spec.tsx +0 -2
- package/src/chevron/Chevron.spec.tsx +0 -1
- package/src/chips/Chips.spec.tsx +0 -1
- package/src/chips/Chips.story.tsx +5 -3
- package/src/circularButton/CircularButton.spec.tsx +4 -5
- package/src/common/RadioButton/RadioButton.spec.tsx +2 -2
- package/src/common/card/Card.story.tsx +1 -0
- package/src/common/closeButton/CloseButton.spec.tsx +0 -1
- package/src/common/flowHeader/FlowHeader.spec.tsx +0 -1
- package/src/dateInput/DateInput.story.tsx +21 -16
- package/src/dateLookup/DateLookup.rtl.spec.tsx +18 -16
- package/src/dateLookup/DateLookup.testingLibrary.spec.js +47 -44
- package/src/dateLookup/DateLookup.tests.story.tsx +4 -2
- package/src/decision/Decision.spec.js +0 -2
- package/src/dimmer/Dimmer.rtl.spec.js +10 -10
- package/src/drawer/Drawer.rtl.spec.tsx +2 -2
- package/src/emphasis/Emphasis.spec.tsx +0 -1
- package/src/field/Field.spec.tsx +2 -2
- package/src/flowNavigation/FlowNavigation.spec.js +0 -2
- package/src/flowNavigation/animatedLabel/AnimatedLabel.spec.js +0 -1
- package/src/flowNavigation/backButton/BackButton.tsx +29 -0
- package/src/flowNavigation/backButton/index.ts +2 -0
- package/src/header/Header.spec.tsx +6 -6
- package/src/image/Image.spec.tsx +0 -1
- package/src/index.ts +1 -0
- package/src/info/Info.story.tsx +15 -9
- package/src/info/Info.tsx +2 -2
- package/src/info/index.ts +1 -1
- package/src/inlineAlert/InlineAlert.spec.tsx +0 -1
- package/src/inputs/SelectInput.spec.tsx +26 -47
- package/src/link/Link.spec.tsx +0 -1
- package/src/listItem/ListItem.spec.tsx +0 -1
- package/src/moneyInput/MoneyInput.rtl.spec.tsx +2 -2
- package/src/moneyInput/MoneyInput.story.tsx +1 -4
- package/src/overlayHeader/{OverlayHeader.spec.js → OverlayHeader.spec.tsx} +1 -1
- package/src/overlayHeader/{OverlayHeader.story.js → OverlayHeader.story.tsx} +10 -2
- package/src/overlayHeader/{OverlayHeader.js → OverlayHeader.tsx} +12 -19
- package/src/overlayHeader/index.ts +2 -0
- package/src/phoneNumberInput/PhoneNumberInput.story.tsx +1 -0
- package/src/popover/Popover.spec.tsx +10 -10
- package/src/progress/Progress.spec.tsx +0 -1
- package/src/progressBar/ProgressBar.spec.tsx +0 -1
- package/src/segmentedControl/SegmentedControl.spec.tsx +10 -11
- package/src/select/Select.spec.js +71 -71
- package/src/test-utils/index.js +1 -1
- package/src/test-utils/jest.setup.js +2 -0
- package/src/tooltip/Tooltip.spec.tsx +15 -16
- package/src/uploadInput/UploadInput.spec.tsx +9 -10
- package/src/uploadInput/UploadInput.story.tsx +8 -180
- package/src/uploadInput/UploadInput.tests.story.tsx +212 -0
- package/src/uploadInput/uploadButton/UploadButton.spec.tsx +4 -4
- package/src/uploadInput/uploadItem/UploadItem.spec.tsx +4 -4
- package/src/flowNavigation/backButton/BackButton.js +0 -32
- package/src/flowNavigation/backButton/BackButton.spec.js +0 -16
- package/src/flowNavigation/backButton/__snapshots__/BackButton.spec.js.snap +0 -37
- package/src/flowNavigation/backButton/index.js +0 -3
- package/src/overlayHeader/index.js +0 -1
- /package/src/overlayHeader/__snapshots__/{OverlayHeader.spec.js.snap → OverlayHeader.spec.tsx.snap} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StoryFn, Meta } from '@storybook/react';
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
|
|
4
4
|
import Chips, { ChipsProps, ChipValue } from './Chips';
|
|
@@ -10,7 +10,9 @@ const meta: Meta<typeof Chips> = {
|
|
|
10
10
|
};
|
|
11
11
|
export default meta;
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
type Story = StoryFn<ChipsProps>;
|
|
14
|
+
|
|
15
|
+
const FilterTemplate: Story = (args: ChipsProps) => {
|
|
14
16
|
const [selected, setSelected] = useState<readonly ChipValue[]>(
|
|
15
17
|
args.selected == null || Array.isArray(args.selected) ? args.selected : [args.selected],
|
|
16
18
|
);
|
|
@@ -31,7 +33,7 @@ const FilterTemplate: Story<ChipsProps> = (args: ChipsProps) => {
|
|
|
31
33
|
);
|
|
32
34
|
};
|
|
33
35
|
|
|
34
|
-
const ChoiceTemplate: Story
|
|
36
|
+
const ChoiceTemplate: Story = (args: ChipsProps) => {
|
|
35
37
|
const [selected, setSelected] = useState<ChipValue>(args.selected as ChipValue);
|
|
36
38
|
return (
|
|
37
39
|
<Chips
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import '@testing-library/jest-dom';
|
|
2
1
|
import { Plus } from '@transferwise/icons';
|
|
3
2
|
|
|
4
3
|
import { ControlType, Priority } from '../common';
|
|
@@ -54,17 +53,17 @@ describe('CircularButton', () => {
|
|
|
54
53
|
});
|
|
55
54
|
|
|
56
55
|
describe('onClick', () => {
|
|
57
|
-
it('calls onClick when clicked', () => {
|
|
56
|
+
it('calls onClick when clicked', async () => {
|
|
58
57
|
const onClick = jest.fn();
|
|
59
58
|
render(<CircularButton {...props} onClick={onClick} />);
|
|
60
|
-
userEvent.click(screen.getByRole('button'));
|
|
59
|
+
await userEvent.click(screen.getByRole('button'));
|
|
61
60
|
expect(onClick).toHaveBeenCalledTimes(1);
|
|
62
61
|
});
|
|
63
62
|
|
|
64
|
-
it('does not call onClick when clicked if disabled', () => {
|
|
63
|
+
it('does not call onClick when clicked if disabled', async () => {
|
|
65
64
|
const onClick = jest.fn();
|
|
66
65
|
render(<CircularButton {...props} disabled onClick={onClick} />);
|
|
67
|
-
userEvent.click(screen.getByRole('button'));
|
|
66
|
+
await userEvent.click(screen.getByRole('button'));
|
|
68
67
|
expect(onClick).toHaveBeenCalledTimes(0);
|
|
69
68
|
});
|
|
70
69
|
});
|
|
@@ -21,7 +21,7 @@ describe('Radio button', () => {
|
|
|
21
21
|
expect(container).toMatchSnapshot();
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
it('responds to user input', () => {
|
|
24
|
+
it('responds to user input', async () => {
|
|
25
25
|
const onChange = jest.fn();
|
|
26
26
|
render(
|
|
27
27
|
<label htmlFor="an-id">
|
|
@@ -29,7 +29,7 @@ describe('Radio button', () => {
|
|
|
29
29
|
</label>,
|
|
30
30
|
);
|
|
31
31
|
|
|
32
|
-
userEvent.click(screen.getByLabelText('A radio'));
|
|
32
|
+
await userEvent.click(screen.getByLabelText('A radio'));
|
|
33
33
|
|
|
34
34
|
expect(onChange).toHaveBeenCalledWith('a-value');
|
|
35
35
|
});
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { userEvent, within } from '@storybook/test';
|
|
3
|
-
import * as React from 'react';
|
|
4
3
|
|
|
5
4
|
import { DateInput, DateMode, Info, InlineAlert, Title, Typography } from '..';
|
|
6
5
|
import { lorem10, storyConfig } from '../test-utils';
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export default {
|
|
7
|
+
const meta = {
|
|
11
8
|
component: DateInput,
|
|
12
9
|
title: 'Forms/DateInput',
|
|
13
10
|
args: {
|
|
@@ -20,16 +17,24 @@ export default {
|
|
|
20
17
|
tags: ['autodocs'],
|
|
21
18
|
} satisfies Meta<typeof DateInput>;
|
|
22
19
|
|
|
23
|
-
|
|
20
|
+
export default meta;
|
|
24
21
|
|
|
25
|
-
|
|
22
|
+
type Story = StoryObj<typeof meta>;
|
|
26
23
|
|
|
27
|
-
Basic
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
24
|
+
export const Basic = {
|
|
25
|
+
args: {
|
|
26
|
+
onChange: () => {},
|
|
27
|
+
},
|
|
28
|
+
play: async ({ canvasElement }) => {
|
|
29
|
+
const canvas = within(canvasElement);
|
|
30
|
+
await userEvent.click(canvas.getByRole('button'));
|
|
31
|
+
},
|
|
32
|
+
} satisfies Story;
|
|
31
33
|
|
|
32
|
-
export const WithLabel
|
|
34
|
+
export const WithLabel = {
|
|
35
|
+
args: {
|
|
36
|
+
onChange: () => {},
|
|
37
|
+
},
|
|
33
38
|
render: (args) => {
|
|
34
39
|
const id1 = 'date-input-group-label-1';
|
|
35
40
|
const label = 'Date of Birth';
|
|
@@ -71,11 +76,11 @@ export const WithLabel: Story = {
|
|
|
71
76
|
</>
|
|
72
77
|
);
|
|
73
78
|
},
|
|
74
|
-
};
|
|
79
|
+
} satisfies Story;
|
|
75
80
|
|
|
76
|
-
export const BasicMobile
|
|
81
|
+
export const BasicMobile = storyConfig(Basic, { variants: ['mobile'] });
|
|
77
82
|
|
|
78
|
-
export const InputError
|
|
83
|
+
export const InputError = {
|
|
79
84
|
...Basic,
|
|
80
85
|
render: (args) => (
|
|
81
86
|
<div className="form-group has-error">
|
|
@@ -83,6 +88,6 @@ export const InputError: Story = {
|
|
|
83
88
|
<InlineAlert type="error">{lorem10}</InlineAlert>
|
|
84
89
|
</div>
|
|
85
90
|
),
|
|
86
|
-
};
|
|
91
|
+
} satisfies Story;
|
|
87
92
|
|
|
88
|
-
export const InputErrorMobile
|
|
93
|
+
export const InputErrorMobile = storyConfig(InputError, { variants: ['mobile'] });
|
|
@@ -4,6 +4,8 @@ import DateLookup, { DateLookupProps } from './DateLookup';
|
|
|
4
4
|
|
|
5
5
|
import { act } from 'react';
|
|
6
6
|
|
|
7
|
+
const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTimeAsync });
|
|
8
|
+
|
|
7
9
|
mockMatchMedia();
|
|
8
10
|
mockResizeObserver();
|
|
9
11
|
|
|
@@ -36,12 +38,12 @@ describe('DateLookup', () => {
|
|
|
36
38
|
async (text) => {
|
|
37
39
|
render(<DateLookup value={initialValue} onChange={() => {}} />);
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
await user.tab();
|
|
42
|
+
await user.keyboard(text);
|
|
41
43
|
|
|
42
44
|
expect(screen.getByRole('button', { name: /next/iu })).toBeInTheDocument();
|
|
43
45
|
|
|
44
|
-
|
|
46
|
+
await user.keyboard('{Escape}');
|
|
45
47
|
await act(async () => {
|
|
46
48
|
await jest.runOnlyPendingTimersAsync();
|
|
47
49
|
});
|
|
@@ -53,7 +55,7 @@ describe('DateLookup', () => {
|
|
|
53
55
|
const setupAndOpenWithMouse = async (props: Partial<DateLookupProps> = {}) => {
|
|
54
56
|
const view = render(<DateLookup value={initialValue} onChange={() => {}} {...props} />);
|
|
55
57
|
|
|
56
|
-
|
|
58
|
+
await user.click(screen.getByRole('button'));
|
|
57
59
|
await act(async () => {
|
|
58
60
|
await jest.runOnlyPendingTimersAsync();
|
|
59
61
|
});
|
|
@@ -68,7 +70,7 @@ describe('DateLookup', () => {
|
|
|
68
70
|
|
|
69
71
|
const dimmerElement = screen.getByRole('dialog').parentElement?.parentElement;
|
|
70
72
|
if (dimmerElement != null) {
|
|
71
|
-
|
|
73
|
+
await user.click(dimmerElement);
|
|
72
74
|
}
|
|
73
75
|
await act(async () => {
|
|
74
76
|
await jest.runOnlyPendingTimersAsync();
|
|
@@ -89,13 +91,13 @@ describe('DateLookup', () => {
|
|
|
89
91
|
|
|
90
92
|
expect(handleChange).not.toHaveBeenCalled();
|
|
91
93
|
|
|
92
|
-
|
|
94
|
+
await user.keyboard(text);
|
|
93
95
|
|
|
94
96
|
const value = new Date(initialValue);
|
|
95
97
|
value.setDate(initialValue.getDate() + step);
|
|
96
98
|
expect(handleChange).toHaveBeenCalledWith(value);
|
|
97
99
|
|
|
98
|
-
|
|
100
|
+
await user.keyboard('{Escape}');
|
|
99
101
|
await act(async () => {
|
|
100
102
|
await jest.runOnlyPendingTimersAsync();
|
|
101
103
|
});
|
|
@@ -114,20 +116,20 @@ describe('DateLookup', () => {
|
|
|
114
116
|
const handleChange = jest.fn();
|
|
115
117
|
await setupAndOpenWithMouse({ onChange: handleChange });
|
|
116
118
|
|
|
117
|
-
|
|
119
|
+
await user.click(screen.getByRole('button', { name: /year view/iu }));
|
|
118
120
|
await act(async () => {
|
|
119
121
|
await jest.runOnlyPendingTimersAsync();
|
|
120
122
|
});
|
|
121
123
|
|
|
122
124
|
expect(handleChange).not.toHaveBeenCalled();
|
|
123
125
|
|
|
124
|
-
|
|
126
|
+
await user.keyboard(text);
|
|
125
127
|
|
|
126
128
|
const value = new Date(initialValue);
|
|
127
129
|
value.setFullYear(initialValue.getFullYear() + step);
|
|
128
130
|
expect(handleChange).toHaveBeenCalledWith(value);
|
|
129
131
|
|
|
130
|
-
|
|
132
|
+
await user.keyboard('{Escape}');
|
|
131
133
|
await act(async () => {
|
|
132
134
|
await jest.runOnlyPendingTimersAsync();
|
|
133
135
|
});
|
|
@@ -146,24 +148,24 @@ describe('DateLookup', () => {
|
|
|
146
148
|
const handleChange = jest.fn();
|
|
147
149
|
await setupAndOpenWithMouse({ onChange: handleChange });
|
|
148
150
|
|
|
149
|
-
|
|
151
|
+
await user.click(screen.getByRole('button', { name: /year view/iu }));
|
|
150
152
|
await act(async () => {
|
|
151
153
|
await jest.runOnlyPendingTimersAsync();
|
|
152
154
|
});
|
|
153
|
-
|
|
155
|
+
await user.keyboard(' ');
|
|
154
156
|
await act(async () => {
|
|
155
157
|
await jest.runOnlyPendingTimersAsync();
|
|
156
158
|
});
|
|
157
159
|
|
|
158
160
|
expect(handleChange).not.toHaveBeenCalled();
|
|
159
161
|
|
|
160
|
-
|
|
162
|
+
await user.keyboard(text);
|
|
161
163
|
|
|
162
164
|
const value = new Date(initialValue);
|
|
163
165
|
value.setMonth(initialValue.getMonth() + step);
|
|
164
166
|
expect(handleChange).toHaveBeenCalledWith(value);
|
|
165
167
|
|
|
166
|
-
|
|
168
|
+
await user.keyboard('{Escape}');
|
|
167
169
|
await act(async () => {
|
|
168
170
|
await jest.runOnlyPendingTimersAsync();
|
|
169
171
|
});
|
|
@@ -178,7 +180,7 @@ describe('DateLookup', () => {
|
|
|
178
180
|
const handleChange = jest.fn();
|
|
179
181
|
await setupAndOpenWithMouse({ min, onChange: handleChange });
|
|
180
182
|
|
|
181
|
-
|
|
183
|
+
await user.keyboard('{ArrowLeft}{ArrowLeft}');
|
|
182
184
|
|
|
183
185
|
expect(handleChange).toHaveBeenCalledWith(min);
|
|
184
186
|
});
|
|
@@ -189,7 +191,7 @@ describe('DateLookup', () => {
|
|
|
189
191
|
const handleChange = jest.fn();
|
|
190
192
|
await setupAndOpenWithMouse({ max, onChange: handleChange });
|
|
191
193
|
|
|
192
|
-
|
|
194
|
+
await user.keyboard('{ArrowRight}{ArrowRight}');
|
|
193
195
|
|
|
194
196
|
expect(handleChange).toHaveBeenCalledWith(max);
|
|
195
197
|
});
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import '@testing-library/
|
|
2
|
-
import user from '@testing-library/user-event';
|
|
1
|
+
import { userEvent } from '@testing-library/user-event';
|
|
3
2
|
import { act } from 'react';
|
|
4
3
|
|
|
5
4
|
import { render, screen, mockMatchMedia } from '../test-utils';
|
|
@@ -55,103 +54,103 @@ describe('DateLookup (events)', () => {
|
|
|
55
54
|
|
|
56
55
|
it('switches to years', async () => {
|
|
57
56
|
const view = await setup();
|
|
58
|
-
openDateLookup(view);
|
|
59
|
-
clickDateButton(view);
|
|
57
|
+
await openDateLookup(view);
|
|
58
|
+
await clickDateButton(view);
|
|
60
59
|
|
|
61
60
|
expect(getActiveYearButton(view)).toHaveFocus();
|
|
62
61
|
|
|
63
|
-
closeDateLookup(view);
|
|
62
|
+
await closeDateLookup(view);
|
|
64
63
|
});
|
|
65
64
|
|
|
66
65
|
it('has aria-label for 20 years', async () => {
|
|
67
66
|
const view = await setup();
|
|
68
|
-
openDateLookup(view);
|
|
69
|
-
clickDateButton(view);
|
|
67
|
+
await openDateLookup(view);
|
|
68
|
+
await clickDateButton(view);
|
|
70
69
|
|
|
71
70
|
expect(getButtonByAriaLabel('next 20 years')).toBeInTheDocument();
|
|
72
71
|
expect(getButtonByAriaLabel('previous 20 years')).toBeInTheDocument();
|
|
73
72
|
|
|
74
|
-
closeDateLookup(view);
|
|
73
|
+
await closeDateLookup(view);
|
|
75
74
|
});
|
|
76
75
|
|
|
77
76
|
it('switches to months', async () => {
|
|
78
77
|
const view = await setup();
|
|
79
|
-
openDateLookup(view);
|
|
80
|
-
clickDateButton(view);
|
|
81
|
-
|
|
78
|
+
await openDateLookup(view);
|
|
79
|
+
await clickDateButton(view);
|
|
80
|
+
await userEvent.click(getActiveYearButton(view));
|
|
82
81
|
|
|
83
82
|
expect(getActiveMonthButton(view)).toHaveFocus();
|
|
84
83
|
|
|
85
|
-
closeDateLookup(view);
|
|
84
|
+
await closeDateLookup(view);
|
|
86
85
|
});
|
|
87
86
|
|
|
88
87
|
it('has aria label for year', async () => {
|
|
89
88
|
const view = await setup();
|
|
90
|
-
openDateLookup(view);
|
|
91
|
-
clickDateButton(view);
|
|
92
|
-
|
|
89
|
+
await openDateLookup(view);
|
|
90
|
+
await clickDateButton(view);
|
|
91
|
+
await userEvent.click(getActiveYearButton(view));
|
|
93
92
|
|
|
94
93
|
expect(getButtonByAriaLabel('next year')).toBeInTheDocument();
|
|
95
94
|
expect(getButtonByAriaLabel('previous year')).toBeInTheDocument();
|
|
96
95
|
|
|
97
|
-
closeDateLookup(view);
|
|
96
|
+
await closeDateLookup(view);
|
|
98
97
|
});
|
|
99
98
|
|
|
100
99
|
it('switches to days', async () => {
|
|
101
100
|
const view = await setup();
|
|
102
|
-
openDateLookup(view);
|
|
103
|
-
clickDateButton(view);
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
await openDateLookup(view);
|
|
102
|
+
await clickDateButton(view);
|
|
103
|
+
await userEvent.click(getActiveYearButton(view));
|
|
104
|
+
await userEvent.click(getActiveMonthButton(view));
|
|
106
105
|
|
|
107
106
|
expect(getActiveDayButton(view)).toHaveFocus();
|
|
108
107
|
|
|
109
|
-
closeDateLookup(view);
|
|
108
|
+
await closeDateLookup(view);
|
|
110
109
|
});
|
|
111
110
|
|
|
112
111
|
it('has aria label for month', async () => {
|
|
113
112
|
const view = await setup();
|
|
114
|
-
openDateLookup(view);
|
|
115
|
-
clickDateButton(view);
|
|
116
|
-
|
|
117
|
-
|
|
113
|
+
await openDateLookup(view);
|
|
114
|
+
await clickDateButton(view);
|
|
115
|
+
await userEvent.click(getActiveYearButton(view));
|
|
116
|
+
await userEvent.click(getActiveMonthButton(view));
|
|
118
117
|
|
|
119
118
|
expect(getButtonByAriaLabel('next month')).toBeInTheDocument();
|
|
120
119
|
expect(getButtonByAriaLabel('previous month')).toBeInTheDocument();
|
|
121
120
|
|
|
122
|
-
closeDateLookup(view);
|
|
121
|
+
await closeDateLookup(view);
|
|
123
122
|
});
|
|
124
123
|
|
|
125
124
|
it('updates selected date and closes', async () => {
|
|
126
125
|
const view = await setup();
|
|
127
|
-
openDateLookup(view);
|
|
126
|
+
await openDateLookup(view);
|
|
128
127
|
const d = new Date(2018, 11, 28);
|
|
129
128
|
const newDay = screen.getByText(d.getDate().toString());
|
|
130
|
-
|
|
129
|
+
await userEvent.click(newDay);
|
|
131
130
|
|
|
132
131
|
expect(handleChange).toHaveBeenCalledWith(d);
|
|
133
132
|
expect(getOpenButton(view)).toHaveFocus();
|
|
134
133
|
|
|
135
|
-
closeDateLookup(view);
|
|
134
|
+
await closeDateLookup(view);
|
|
136
135
|
});
|
|
137
136
|
|
|
138
137
|
it('has aria label on selected date', async () => {
|
|
139
138
|
const view = await setup();
|
|
140
|
-
openDateLookup(view);
|
|
139
|
+
await openDateLookup(view);
|
|
141
140
|
const d = new Date(2018, 11, 28);
|
|
142
141
|
const newDay = screen.getByText(d.getDate().toString());
|
|
143
|
-
|
|
144
|
-
openDateLookup(view);
|
|
142
|
+
await userEvent.click(newDay);
|
|
143
|
+
await openDateLookup(view);
|
|
145
144
|
expect(screen.getByRole('button', { name: /selected day/i })).toBeInTheDocument();
|
|
146
145
|
|
|
147
|
-
closeDateLookup(view);
|
|
146
|
+
await closeDateLookup(view);
|
|
148
147
|
});
|
|
149
148
|
|
|
150
149
|
it('supports custom `aria-labelledby` attribute', async () => {
|
|
151
150
|
const view = await setup();
|
|
152
151
|
expect(screen.getByLabelText('Prioritized label')).toHaveClass('input-group');
|
|
153
152
|
|
|
154
|
-
closeDateLookup(view);
|
|
153
|
+
await closeDateLookup(view);
|
|
155
154
|
});
|
|
156
155
|
});
|
|
157
156
|
|
|
@@ -183,29 +182,33 @@ describe('DateLookup (events)', () => {
|
|
|
183
182
|
|
|
184
183
|
it('when user clicks on clear the focus returns to btn', async () => {
|
|
185
184
|
const view = await setup();
|
|
186
|
-
clickClearButton(view);
|
|
185
|
+
await clickClearButton(view);
|
|
187
186
|
expect(getOpenButton(view)).toHaveFocus();
|
|
188
187
|
});
|
|
189
188
|
|
|
190
189
|
it('onChange gets called with null when reset button is clicked', async () => {
|
|
191
190
|
const view = await setup();
|
|
192
|
-
clickClearButton(view);
|
|
191
|
+
await clickClearButton(view);
|
|
193
192
|
expect(props.onChange).toHaveBeenCalledWith(null);
|
|
194
193
|
});
|
|
195
194
|
});
|
|
196
195
|
|
|
197
|
-
const openDateLookup =
|
|
198
|
-
|
|
196
|
+
const openDateLookup = async (
|
|
197
|
+
/** @type {import('@testing-library/react').RenderResult} */ view,
|
|
198
|
+
) => userEvent.click(getOpenButton(view));
|
|
199
199
|
|
|
200
|
-
const clickDateButton =
|
|
201
|
-
|
|
200
|
+
const clickDateButton = async (
|
|
201
|
+
/** @type {import('@testing-library/react').RenderResult} */ view,
|
|
202
|
+
) => userEvent.click(getDateButton(view));
|
|
202
203
|
|
|
203
204
|
// Close dateLookup and removes events attached to documents.
|
|
204
|
-
const closeDateLookup =
|
|
205
|
-
|
|
205
|
+
const closeDateLookup = async (
|
|
206
|
+
/** @type {import('@testing-library/react').RenderResult} */ view,
|
|
207
|
+
) => userEvent.click(view.container);
|
|
206
208
|
|
|
207
|
-
const clickClearButton =
|
|
208
|
-
|
|
209
|
+
const clickClearButton = async (
|
|
210
|
+
/** @type {import('@testing-library/react').RenderResult} */ view,
|
|
211
|
+
) => userEvent.click(getClearButton(view));
|
|
209
212
|
|
|
210
213
|
const getActiveYearButton = (
|
|
211
214
|
/** @type {import('@testing-library/react').RenderResult} */ view,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StoryFn } from '@storybook/react';
|
|
2
2
|
import { expect, userEvent, within } from '@storybook/test';
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
|
|
@@ -9,7 +9,9 @@ export default {
|
|
|
9
9
|
title: 'Forms/DateLookup/Tests',
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
type Story = StoryFn<typeof DateLookup>;
|
|
13
|
+
|
|
14
|
+
const Template: Story = () => {
|
|
13
15
|
const [value, setValue] = useState<Date | null>(new Date(1987, 0, 10, 12, 0, 0));
|
|
14
16
|
|
|
15
17
|
return (
|
|
@@ -25,42 +25,42 @@ describe('Dimmer', () => {
|
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
describe('closing behaviour', () => {
|
|
28
|
-
it('calls onClose if the dimmer is clicked', () => {
|
|
28
|
+
it('calls onClose if the dimmer is clicked', async () => {
|
|
29
29
|
const onClose = jest.fn();
|
|
30
30
|
render(<Dimmer {...props} onClose={onClose} />);
|
|
31
|
-
userEvent.click(screen.getByRole('presentation'));
|
|
31
|
+
await userEvent.click(screen.getByRole('presentation'));
|
|
32
32
|
expect(onClose).toHaveBeenCalledTimes(1);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
it('does not call onClose if the dimmer content is clicked', () => {
|
|
35
|
+
it('does not call onClose if the dimmer content is clicked', async () => {
|
|
36
36
|
const onClose = jest.fn();
|
|
37
37
|
render(
|
|
38
38
|
<Dimmer {...props} onClose={onClose}>
|
|
39
39
|
<Button onClick={() => {}}>McClicky</Button>
|
|
40
40
|
</Dimmer>,
|
|
41
41
|
);
|
|
42
|
-
userEvent.click(screen.getByRole('button'));
|
|
42
|
+
await userEvent.click(screen.getByRole('button'));
|
|
43
43
|
expect(onClose).toHaveBeenCalledTimes(0);
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
it('does not call onClose when clicked if disableClickToClose is true', () => {
|
|
46
|
+
it('does not call onClose when clicked if disableClickToClose is true', async () => {
|
|
47
47
|
const onClose = jest.fn();
|
|
48
48
|
render(<Dimmer {...props} disableClickToClose onClose={onClose} />);
|
|
49
|
-
userEvent.click(screen.getByRole('presentation'));
|
|
49
|
+
await userEvent.click(screen.getByRole('presentation'));
|
|
50
50
|
expect(onClose).toHaveBeenCalledTimes(0);
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
-
it('calls onClose if the escape key is pressed', () => {
|
|
53
|
+
it('calls onClose if the escape key is pressed', async () => {
|
|
54
54
|
const onClose = jest.fn();
|
|
55
55
|
render(<Dimmer {...props} onClose={onClose} />);
|
|
56
|
-
userEvent.keyboard('{
|
|
56
|
+
await userEvent.keyboard('{Escape}');
|
|
57
57
|
expect(onClose).toHaveBeenCalledTimes(1);
|
|
58
58
|
});
|
|
59
59
|
|
|
60
|
-
it('does not call onClose if the escape key is pressed when disableClickToClose is true', () => {
|
|
60
|
+
it('does not call onClose if the escape key is pressed when disableClickToClose is true', async () => {
|
|
61
61
|
const onClose = jest.fn();
|
|
62
62
|
render(<Dimmer {...props} disableClickToClose onClose={onClose} />);
|
|
63
|
-
userEvent.keyboard('{
|
|
63
|
+
await userEvent.keyboard('{Escape}');
|
|
64
64
|
expect(onClose).toHaveBeenCalledTimes(1);
|
|
65
65
|
});
|
|
66
66
|
});
|
|
@@ -48,10 +48,10 @@ describe('Drawer', () => {
|
|
|
48
48
|
expect(container).toMatchSnapshot();
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
it('calls onClose when user clicks close button', () => {
|
|
51
|
+
it('calls onClose when user clicks close button', async () => {
|
|
52
52
|
render(<Drawer {...props}>content</Drawer>);
|
|
53
53
|
expect(props.onClose).not.toHaveBeenCalled();
|
|
54
|
-
userEvent.click(getCloseButton());
|
|
54
|
+
await userEvent.click(getCloseButton());
|
|
55
55
|
expect(props.onClose).toHaveBeenCalledTimes(1);
|
|
56
56
|
});
|
|
57
57
|
|
package/src/field/Field.spec.tsx
CHANGED
|
@@ -73,7 +73,7 @@ describe('Field', () => {
|
|
|
73
73
|
button.addEventListener('click', handleClick);
|
|
74
74
|
|
|
75
75
|
const label = screen.getByText('Phone number');
|
|
76
|
-
userEvent.click(label);
|
|
76
|
+
await userEvent.click(label);
|
|
77
77
|
|
|
78
78
|
expect(handleClick).not.toHaveBeenCalled();
|
|
79
79
|
});
|
|
@@ -90,6 +90,6 @@ describe('Field', () => {
|
|
|
90
90
|
expect(screen.getByRole('textbox')).not.toHaveAttribute('id');
|
|
91
91
|
|
|
92
92
|
const label = screen.getByText('Phone number');
|
|
93
|
-
userEvent.click(label);
|
|
93
|
+
await userEvent.click(label);
|
|
94
94
|
});
|
|
95
95
|
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ArrowLeft as ArrowLeftIcon } from '@transferwise/icons';
|
|
2
|
+
import classNames from 'classnames';
|
|
3
|
+
|
|
4
|
+
import Avatar, { AvatarType } from '../../avatar';
|
|
5
|
+
|
|
6
|
+
export interface BackButtonProps {
|
|
7
|
+
'aria-label': string;
|
|
8
|
+
className?: string;
|
|
9
|
+
onClick?: React.MouseEventHandler<HTMLButtonElement>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default function BackButton({
|
|
13
|
+
className,
|
|
14
|
+
onClick,
|
|
15
|
+
'aria-label': ariaLabel,
|
|
16
|
+
}: BackButtonProps) {
|
|
17
|
+
return (
|
|
18
|
+
<Avatar type={AvatarType.ICON} size={40}>
|
|
19
|
+
<button
|
|
20
|
+
type="button"
|
|
21
|
+
aria-label={ariaLabel}
|
|
22
|
+
className={classNames('np-back-button', 'btn-unstyled', className)}
|
|
23
|
+
onClick={onClick}
|
|
24
|
+
>
|
|
25
|
+
<ArrowLeftIcon size={24} />
|
|
26
|
+
</button>
|
|
27
|
+
</Avatar>
|
|
28
|
+
);
|
|
29
|
+
}
|