From f6f8f644edae0a27723b9cf6af28d675b0f090e1 Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Thu, 27 Jun 2024 15:30:28 +0200 Subject: [PATCH 01/18] move ts expect error above style prop, fix ts error --- src/lib/components/tabsv2/StyledTabs.ts | 2 +- src/lib/components/tabsv2/Tabsv2.component.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/tabsv2/StyledTabs.ts b/src/lib/components/tabsv2/StyledTabs.ts index 4cfc72b422..e7ce0a6cf4 100644 --- a/src/lib/components/tabsv2/StyledTabs.ts +++ b/src/lib/components/tabsv2/StyledTabs.ts @@ -58,7 +58,7 @@ export const TabItem = styled.div<{ `; export const TabsContainer = styled.div<{ tabLineColor?: string; - separatorColor: string; + separatorColor?: string; }>` height: 100%; width: 100%; diff --git a/src/lib/components/tabsv2/Tabsv2.component.tsx b/src/lib/components/tabsv2/Tabsv2.component.tsx index cf7c99f6c4..f40967aec6 100644 --- a/src/lib/components/tabsv2/Tabsv2.component.tsx +++ b/src/lib/components/tabsv2/Tabsv2.component.tsx @@ -185,8 +185,8 @@ function Tabs({ }); return ( - {/*@ts-expect-error containerType is not yet a valid prop for react */} Date: Thu, 27 Jun 2024 11:10:50 +0200 Subject: [PATCH 02/18] remove -moz-transform (obsolete since FF 36), update for new spacing --- .../components/toggle/Toggle.component.tsx | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/lib/components/toggle/Toggle.component.tsx b/src/lib/components/toggle/Toggle.component.tsx index 5d04aabd80..eafc21364e 100644 --- a/src/lib/components/toggle/Toggle.component.tsx +++ b/src/lib/components/toggle/Toggle.component.tsx @@ -1,12 +1,11 @@ import { ChangeEvent, InputHTMLAttributes, useRef } from 'react'; import styled, { css } from 'styled-components'; -import { spacing } from '../../style/theme'; import { LABEL_PREFIX, useFieldContext } from '../form/Form.component'; -import { Stack } from '../../spacing'; +import { Stack, spacing } from '../../spacing'; import { Text } from '../text/Text.component'; -type Props = InputHTMLAttributes & { +export type Props = InputHTMLAttributes & { toggle: boolean; onChange: (e: ChangeEvent) => void; label?: string; @@ -20,8 +19,7 @@ const ToggleContainer = styled.span<{ disabled?: boolean }>` `; const Switch = styled.label<{ disabled?: boolean }>` position: relative; - width: ${spacing.sp24}; - height: ${spacing.sp14}; + width: ${spacing.r24}; align-self: center; ${(props) => { return css` @@ -39,23 +37,22 @@ const Slider = styled.div<{ toggle?: boolean }>` width: 100%; height: 1rem; background-color: ${(props) => props.theme.backgroundLevel1}; - border: ${spacing.sp1} solid + border: ${spacing.r1} solid ${(props) => props.theme[props.toggle ? 'selectedActive' : 'infoPrimary']}; - border-radius: ${spacing.sp8}; + border-radius: ${spacing.r8}; transition: 0.4s; - -moz-transform: rotate(0.02deg); + &:before { border-radius: 100%; position: absolute; content: ''; - height: ${spacing.sp10}; - width: ${spacing.sp10}; + height: ${spacing.r10}; + width: ${spacing.r10}; left: 3px; top: 3.5px; background-color: ${(props) => props.theme[props.toggle ? 'textSecondary' : 'textPrimary']}; transition: 0.4s; - -moz-transform: rotate(0.02deg); } `; const ToggleInput = styled.input` @@ -63,7 +60,7 @@ const ToggleInput = styled.input` background-color: ${(props) => props.theme.selectedActive}; } &:checked + ${Slider}:before { - transform: translateX(${spacing.sp10}); + transform: translateX(${spacing.r10}); } display: none; `; From b0294365fe02ecc7d687d80fc6da736150b4ce9e Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Thu, 27 Jun 2024 11:11:20 +0200 Subject: [PATCH 03/18] type toggle stories --- stories/toggle.stories.tsx | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/stories/toggle.stories.tsx b/stories/toggle.stories.tsx index 90bfd24aae..4e6341e831 100644 --- a/stories/toggle.stories.tsx +++ b/stories/toggle.stories.tsx @@ -1,22 +1,26 @@ import React, { useState } from 'react'; -import { Toggle } from '../src/lib/components/toggle/Toggle.component'; -import { Wrapper } from './common'; +import { Props, Toggle } from '../src/lib/components/toggle/Toggle.component'; import { useArgs } from '@storybook/preview-api'; -export default { +import { Meta, StoryObj } from '@storybook/react'; + +type Story = StoryObj; +const meta: Meta = { title: 'Components/Inputs/Toggle', component: Toggle, args: { name: 'toggle', }, }; -export const Playground = { +export default meta; + +export const Playground: Story = { render: (args) => { - const [{ toggle }, updateArgs] = useArgs(); + const [{ toggle }, updateArgs] = useArgs<{ toggle: boolean }>(); return ( updateArgs({ toggle: !toggle })} {...args} + onChange={() => updateArgs({ toggle: !toggle })} + toggle={toggle} /> ); }, @@ -24,18 +28,18 @@ export const Playground = { label: 'Playground', }, }; -export const LabelledToggle = { +export const LabelledToggle: Story = { render: (args) => { const [toggle, setToggle] = useState(false); return ( - setToggle(!toggle)} {...args} /> + setToggle(!toggle)} /> ); }, args: { label: 'Airplane mode', }, }; -export const DisabledToggle = { +export const DisabledToggle: Story = { ...Playground, args: { label: 'Disabled Toggle', From 90e4fdc1935b90e7a2055af7a6489915f5ad7971 Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Thu, 27 Jun 2024 11:20:17 +0200 Subject: [PATCH 04/18] init guideline --- stories/Toggle/toggle.guideline.mdx | 20 ++++++++++++++++++++ stories/{ => Toggle}/toggle.stories.tsx | 5 ++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 stories/Toggle/toggle.guideline.mdx rename stories/{ => Toggle}/toggle.stories.tsx (92%) diff --git a/stories/Toggle/toggle.guideline.mdx b/stories/Toggle/toggle.guideline.mdx new file mode 100644 index 0000000000..d0095f8855 --- /dev/null +++ b/stories/Toggle/toggle.guideline.mdx @@ -0,0 +1,20 @@ +import { + Meta, + Story, + Canvas, + Primary, + Controls, + Unstyled, + Source, +} from '@storybook/blocks'; + +import * as Stories from './toggle.stories'; + + + + + + + + + diff --git a/stories/toggle.stories.tsx b/stories/Toggle/toggle.stories.tsx similarity index 92% rename from stories/toggle.stories.tsx rename to stories/Toggle/toggle.stories.tsx index 4e6341e831..b0890384f9 100644 --- a/stories/toggle.stories.tsx +++ b/stories/Toggle/toggle.stories.tsx @@ -1,5 +1,8 @@ import React, { useState } from 'react'; -import { Props, Toggle } from '../src/lib/components/toggle/Toggle.component'; +import { + Props, + Toggle, +} from '../../src/lib/components/toggle/Toggle.component'; import { useArgs } from '@storybook/preview-api'; import { Meta, StoryObj } from '@storybook/react'; From 9ae7d3fffd9cb76bdcf4aaa7916ac09341483632 Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Thu, 27 Jun 2024 11:56:39 +0200 Subject: [PATCH 05/18] init test for Toggle --- src/lib/components/toggle/Toggle.test.tsx | 64 +++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/lib/components/toggle/Toggle.test.tsx diff --git a/src/lib/components/toggle/Toggle.test.tsx b/src/lib/components/toggle/Toggle.test.tsx new file mode 100644 index 0000000000..327e5f5228 --- /dev/null +++ b/src/lib/components/toggle/Toggle.test.tsx @@ -0,0 +1,64 @@ +/** + * - Test the Toggle component + * - Should render the Toggle component + * - Should render the Toggle component with a label + * - Should toggle the switch on click + * - Should toggle the switch when pressing the space key or enter key + * - Should not toggle the switch when disabled + * - Should not toggle the switch when disabled and pressing the space key or enter key + * + * + * + */ +import { render, screen, fireEvent } from '@testing-library/react'; +import React from 'react'; +import { Toggle } from './Toggle.component'; + +describe('Toggle', () => { + let toggle = false; + const handleClick = () => { + toggle = !toggle; + }; + beforeEach(() => { + toggle = false; + }); + it('should render the Toggle component with label', () => { + render( {}} toggle label="Test">); + const toggle = screen.getByRole('checkbox'); + expect(toggle).toBeInTheDocument(); + const label = screen.getByText('Test'); + expect(label).toBeInTheDocument(); + }); + + it('should toggle the switch on click on checkbox or label', () => { + render( + , + ); + const checkbox = screen.getByRole('checkbox'); + fireEvent.click(checkbox); + expect(toggle).toBe(true); + const label = screen.getByText('Test'); + fireEvent.click(label); + expect(toggle).toBe(false); + }); + + it('should toggle the switch when pressing the space key or enter key', () => { + render( + , + ); + const checkbox = screen.getByRole('checkbox'); + fireEvent.keyDown(checkbox, { key: 'Enter', code: 'Enter', charCode: 13 }); + expect(toggle).toBe(true); + fireEvent.keyDown(checkbox, { key: ' ', code: 'Space', charCode: 32 }); + expect(toggle).toBe(false); + }); + + it('should not toggle the switch when disabled', () => { + render( {}} toggle disabled label="Test">); + const checkbox = screen.getByRole('checkbox'); + fireEvent.click(checkbox); + expect(toggle).toBe(false); + fireEvent.keyDown(checkbox, { key: 'Enter', code: 'Enter', charCode: 13 }); + expect(toggle).toBe(false); + }); +}); From 9d2293bd7e8d19886e8d91b77ff2d65d0413e361 Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Thu, 27 Jun 2024 16:37:05 +0200 Subject: [PATCH 06/18] remove disableToggle prop from searchInput --- src/lib/components/searchinput/SearchInput.component.tsx | 2 -- stories/searchinput.stories.tsx | 6 +----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/lib/components/searchinput/SearchInput.component.tsx b/src/lib/components/searchinput/SearchInput.component.tsx index 82568071bb..036f79e290 100644 --- a/src/lib/components/searchinput/SearchInput.component.tsx +++ b/src/lib/components/searchinput/SearchInput.component.tsx @@ -10,7 +10,6 @@ export type Props = { value: string; onChange: (e: ChangeEvent) => void; onReset?: () => void; - disableToggle: boolean; disabled?: boolean; id?: string; size?: InputSize; @@ -57,7 +56,6 @@ const ClearButton = styled.div` const SearchInput = forwardRef( ( { - disableToggle, placeholder, value, onChange, diff --git a/stories/searchinput.stories.tsx b/stories/searchinput.stories.tsx index bb0a0e3527..82dd375b07 100644 --- a/stories/searchinput.stories.tsx +++ b/stories/searchinput.stories.tsx @@ -21,7 +21,7 @@ export const Default = { placeholder="Search server..." onChange={action('on input change')} onReset={action('on input reset')} - disableToggle={false} + autoComplete="off" /> Disabled @@ -36,7 +36,6 @@ export const Default = { placeholder="Search server..." onChange={action('on input change')} onReset={action('on input reset')} - disableToggle={true} /> Search Input filled @@ -49,7 +48,6 @@ export const Default = { value="carlito" onChange={action('on input change')} onReset={action('on input reset')} - disableToggle={false} data-cy="carlito_searchinput" /> @@ -64,7 +62,6 @@ export const Default = { placeholder="Search and Filter…" onChange={action('on input change')} onReset={action('on input reset')} - disableToggle={true} /> Disable the default toggle undefined onReset action @@ -77,7 +74,6 @@ export const Default = { value="" placeholder="Search and Filter…" onChange={action('on input change')} - disableToggle={true} /> From 1342e7d8eae68d33aa3faaf4f8d4e3b16cc79e67 Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Thu, 27 Jun 2024 16:37:28 +0200 Subject: [PATCH 07/18] init Search Input test --- .../searchinput/SearchInput.test.tsx | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/lib/components/searchinput/SearchInput.test.tsx diff --git a/src/lib/components/searchinput/SearchInput.test.tsx b/src/lib/components/searchinput/SearchInput.test.tsx new file mode 100644 index 0000000000..6366feb7f0 --- /dev/null +++ b/src/lib/components/searchinput/SearchInput.test.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import { SearchInput, Props } from './SearchInput.component'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import userEvent from '@testing-library/user-event'; + +const queryClient = new QueryClient(); + +const SearchInputRender = (props: Props) => { + return ( + + + + ); +}; + +describe('SearchInput', () => { + const selectors = { + searchInput: () => screen.getByRole('searchbox'), + //? queryBy is used to avoid the error when the element is not found + clearButton: () => screen.queryByRole('button'), + }; + it('should render the SearchInput component', () => { + render( {}} />); + + const searchInput = selectors.searchInput(); + expect(searchInput).toBeInTheDocument(); + }); + + it('should render the SearchInput component with placeholder', () => { + render( + {}} placeholder="Search" />, + ); + + const searchInput = screen.queryByPlaceholderText('Example: Search'); + expect(searchInput).toBeInTheDocument(); + }); + + it('should render the SearchInput component with disabled prop', () => { + render( {}} disabled />); + + const searchInput = selectors.searchInput(); + expect(searchInput).toBeInTheDocument(); + expect(searchInput).toBeDisabled(); + }); + + it('should change value instantly but call the onChange function with a 300ms delay after the end of typing', async () => { + const onChange = jest.fn(); + render(); + const searchInput = selectors.searchInput(); + userEvent.type(searchInput, 'test'); + expect(searchInput).toHaveValue('test'); + expect(onChange).not.toHaveBeenCalled(); + await waitFor( + () => { + expect(onChange).toHaveBeenCalled(); + }, + { timeout: 350 }, + ); + }); + + it('should have a clear button when the input is not empty', () => { + render( {}} />); + + // clear button should not be rendered as value is empty + let clearButton = selectors.clearButton(); + expect(clearButton).not.toBeInTheDocument(); + + const searchInput = selectors.searchInput(); + userEvent.type(searchInput, 'test'); + + // clear button should now be rendered + clearButton = selectors.clearButton(); + expect(clearButton).toBeInTheDocument(); + }); + + it('should call the onReset function when the clear button is clicked and clear the input value', async () => { + const onReset = jest.fn(); + render( + {}} onReset={onReset} />, + ); + const searchInput = selectors.searchInput(); + const clearButton = selectors.clearButton(); + expect(clearButton).toBeInTheDocument(); + clearButton && userEvent.click(clearButton); + expect(onReset).toHaveBeenCalled(); + expect(searchInput).toHaveValue(''); + }); + + // ? Should we test the autocomplete prop? (It is a browser feature so should be no) + // ? Should the clear button be hidden/disabled when the input is disabled? + // ? And should the text be greyed out? +}); From 12f63103f5ba0aa7d901a2162aca5de7e48c1a7f Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Thu, 27 Jun 2024 17:15:13 +0200 Subject: [PATCH 08/18] init guideline for search input --- stories/SearchInput/searchinput.guideline.mdx | 20 +++++++++++++ .../{ => SearchInput}/searchinput.stories.tsx | 28 +++++++++---------- 2 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 stories/SearchInput/searchinput.guideline.mdx rename stories/{ => SearchInput}/searchinput.stories.tsx (81%) diff --git a/stories/SearchInput/searchinput.guideline.mdx b/stories/SearchInput/searchinput.guideline.mdx new file mode 100644 index 0000000000..c10b1ee419 --- /dev/null +++ b/stories/SearchInput/searchinput.guideline.mdx @@ -0,0 +1,20 @@ +import { + Meta, + Story, + Canvas, + Primary, + Controls, + Unstyled, + Source, +} from '@storybook/blocks'; +import { SearchInput } from '../../src/lib/components/searchinput/SearchInput.component'; + +import * as Stories from './searchinput.stories'; + + + +# Search Input + + + + diff --git a/stories/searchinput.stories.tsx b/stories/SearchInput/searchinput.stories.tsx similarity index 81% rename from stories/searchinput.stories.tsx rename to stories/SearchInput/searchinput.stories.tsx index 82dd375b07..78b156b14e 100644 --- a/stories/searchinput.stories.tsx +++ b/stories/SearchInput/searchinput.stories.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { action } from '@storybook/addon-actions'; -import { SearchInput } from '../src/lib/components/searchinput/SearchInput.component'; -import { Wrapper, Title } from './common'; +import { SearchInput } from '../../src/lib/components/searchinput/SearchInput.component'; +import { Wrapper, Title } from '../common'; export default { title: 'Components/Inputs/SearchInput', component: SearchInput, @@ -84,19 +84,17 @@ export const Debounce = { render: (args) => { const [value, setValue] = useState(''); return ( - - { - setValue(e.target.value); - action('debounce')(`${e.target} changed`); - }} - {...args} - /> - + { + setValue(e.target.value); + action('debounce')(`${e.target} changed`); + }} + {...args} + /> ); }, }; From 627a10486f01a224b0a2f5e6393a870ec86398ff Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Mon, 1 Jul 2024 15:08:26 +0200 Subject: [PATCH 09/18] improve toggle tests --- src/lib/components/toggle/Toggle.test.tsx | 86 ++++++++++------------- 1 file changed, 39 insertions(+), 47 deletions(-) diff --git a/src/lib/components/toggle/Toggle.test.tsx b/src/lib/components/toggle/Toggle.test.tsx index 327e5f5228..24abe47464 100644 --- a/src/lib/components/toggle/Toggle.test.tsx +++ b/src/lib/components/toggle/Toggle.test.tsx @@ -1,64 +1,56 @@ -/** - * - Test the Toggle component - * - Should render the Toggle component - * - Should render the Toggle component with a label - * - Should toggle the switch on click - * - Should toggle the switch when pressing the space key or enter key - * - Should not toggle the switch when disabled - * - Should not toggle the switch when disabled and pressing the space key or enter key - * - * - * - */ -import { render, screen, fireEvent } from '@testing-library/react'; -import React from 'react'; -import { Toggle } from './Toggle.component'; +import { render, screen } from '@testing-library/react'; +import React, { useState } from 'react'; +import { Props, Toggle } from './Toggle.component'; +import userEvent from '@testing-library/user-event'; describe('Toggle', () => { - let toggle = false; - const handleClick = () => { - toggle = !toggle; + const selectors = { + toggle: () => screen.getByRole('checkbox'), + label: (text: string | RegExp) => screen.getByText(text), }; - beforeEach(() => { - toggle = false; - }); + const RenderToggle = (props: Omit) => { + const [toggle, setToggle] = useState(false); + const handleClick = () => { + setToggle(!toggle); + }; + return ; + }; + it('should render the Toggle component with label', () => { - render( {}} toggle label="Test">); - const toggle = screen.getByRole('checkbox'); + render(); + const toggle = selectors.toggle(); expect(toggle).toBeInTheDocument(); - const label = screen.getByText('Test'); + const label = selectors.label(/Test/); expect(label).toBeInTheDocument(); }); it('should toggle the switch on click on checkbox or label', () => { - render( - , - ); - const checkbox = screen.getByRole('checkbox'); - fireEvent.click(checkbox); - expect(toggle).toBe(true); - const label = screen.getByText('Test'); - fireEvent.click(label); - expect(toggle).toBe(false); + render(); + const toggle = selectors.toggle(); + userEvent.click(toggle); + expect(toggle).toBeChecked(); + const label = selectors.label('Test'); + userEvent.click(label); + expect(toggle).not.toBeChecked(); }); it('should toggle the switch when pressing the space key or enter key', () => { - render( - , - ); - const checkbox = screen.getByRole('checkbox'); - fireEvent.keyDown(checkbox, { key: 'Enter', code: 'Enter', charCode: 13 }); - expect(toggle).toBe(true); - fireEvent.keyDown(checkbox, { key: ' ', code: 'Space', charCode: 32 }); - expect(toggle).toBe(false); + render(); + const toggle = selectors.toggle(); + userEvent.tab(); + userEvent.keyboard('{space}'); + expect(toggle).toBeChecked(); + userEvent.keyboard('{enter}'); + expect(toggle).not.toBeChecked(); }); it('should not toggle the switch when disabled', () => { - render( {}} toggle disabled label="Test">); - const checkbox = screen.getByRole('checkbox'); - fireEvent.click(checkbox); - expect(toggle).toBe(false); - fireEvent.keyDown(checkbox, { key: 'Enter', code: 'Enter', charCode: 13 }); - expect(toggle).toBe(false); + render(); + const toggle = selectors.toggle(); + // toBeDisabled is not working for some reason + userEvent.tab(); + expect(toggle).not.toHaveFocus(); + userEvent.click(toggle); + expect(toggle).not.toBeChecked(); }); }); From 5a0cf0a19d975084e5b0d87a59a330a682ea9c46 Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Wed, 3 Jul 2024 10:49:24 +0200 Subject: [PATCH 10/18] add useArgs in WithDefaultvalue story --- stories/Select/selectv2.stories.tsx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/stories/Select/selectv2.stories.tsx b/stories/Select/selectv2.stories.tsx index 7d69d69e9d..186175416f 100644 --- a/stories/Select/selectv2.stories.tsx +++ b/stories/Select/selectv2.stories.tsx @@ -5,6 +5,7 @@ import { Modal } from '../../src/lib/components/modal/Modal.component'; import { Select } from '../../src/lib/components/selectv2/Selectv2.component'; import { Wrapper } from '../common'; import { Meta, StoryObj } from '@storybook/react'; +import { useArgs } from '@storybook/preview-api'; type SelectStory = StoryObj; const meta: Meta = { @@ -167,3 +168,27 @@ export const NotEnoughPlaceAtTheBottom: SelectStory = { children: optionsWithSearchBar, }, }; + +export const WithDefaultValue: SelectStory = { + render: (args) => { + const [{ value }, updateArgs] = useArgs(); + return ( +
+ + +

Selected value

+

{value}

+
+ ); + }, + args: { + value: undefined, + placeholder: 'Select an option', + children: defaultOptions, + defaultValue: defaultOptions[0].props.value, + }, +}; From 3e38ba16792361d231bf13ce28d70f16f5707421 Mon Sep 17 00:00:00 2001 From: Jean-Marc Millet Date: Wed, 3 Jul 2024 10:50:47 +0200 Subject: [PATCH 11/18] change Select test, remove test for each type of variant as "rounded" is deprecated --- src/lib/components/selectv2/selectv2.test.tsx | 366 ++++++++---------- 1 file changed, 166 insertions(+), 200 deletions(-) diff --git a/src/lib/components/selectv2/selectv2.test.tsx b/src/lib/components/selectv2/selectv2.test.tsx index dc4262c3d6..ff81d9ee5a 100644 --- a/src/lib/components/selectv2/selectv2.test.tsx +++ b/src/lib/components/selectv2/selectv2.test.tsx @@ -1,13 +1,7 @@ -import { - screen, - render as testingRender, - within, -} from '@testing-library/react'; +import { screen, render as testingRender } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React, { useState } from 'react'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { debug } from 'jest-preview'; -import { Icon } from '../icon/Icon.component'; import { Option, Select } from '../selectv2/Selectv2.component'; const render = (args) => { @@ -27,22 +21,38 @@ const generateOptionsData = (n: number) => const generateOptions = (n: number) => { return generateOptionsData(n).map((o, i) => ( - )); }; - +const users = [ + { + label: 'User 1', + value: '1', + }, + { + label: 'User 2', + value: '2', + }, +]; + +const basicOptions = () => { + return users.map((user, index) => ( + + )); +}; const SelectWrapper = (props) => { - const [value, setValue] = useState(null); + const [value, setValue] = useState(null); return ( ); }; -const variants = ['default', 'rounded']; const optionsWithScrollSearchBar = generateOptions(10); // more than 8 options should display searchbar + scrollbar const simpleOptions = generateOptions(4); // less than 5 options should not displays any scroll/search bar @@ -64,218 +74,174 @@ const SelectReset = (props) => { }; describe('SelectV2', () => { - const toBeClose = (container) => { - expect(container.getElementsByClassName('sc-select__option').length).toBe( - 0, - ); - }; - - const toBeOpenWith = (container, optionsLength: number) => { - expect(container.getElementsByClassName('sc-select__option').length).toBe( - optionsLength, - ); - }; - - const toggleSelect = (container) => { - userEvent.click(container.querySelector('.sc-select__control')); + const selectors = { + option: (name: string | RegExp) => screen.getByRole('option', { name }), + options: () => screen.queryAllByRole('option'), + select: (withSearch?: boolean, name?: string) => { + if (withSearch) { + return screen.getByRole('combobox', { name }); + } + return screen.getByRole('listbox', { name }); + }, + input: () => screen.getByRole('textbox'), + noOptions: () => screen.getByText(/No options/i), }; - test.each(variants)( - 'should open select on click/Enter/ArrowDown', - (variant) => { - const { container } = render( - {simpleOptions}, - ); - // should open on click - toBeClose(container); - toggleSelect(container); // open - - toBeOpenWith(container, simpleOptions.length); - toggleSelect(container); // close - - userEvent.tab(); // remove focus + it('should throw error if )); }; -const users = [ - { - label: 'User 1', - value: '1', - }, - { - label: 'User 2', - value: '2', - }, -]; - -const basicOptions = () => { - return users.map((user, index) => ( - - )); -}; +const optionsWithScrollSearchBar = generateOptions(10); // more than 8 options should display searchbar + scrollbar + +const simpleOptions = generateOptions(4); // less than 5 options should not displays any scroll/search bar + const SelectWrapper = (props) => { const [value, setValue] = useState(null); return ( ); }; -const optionsWithScrollSearchBar = generateOptions(10); // more than 8 options should display searchbar + scrollbar - -const simpleOptions = generateOptions(4); // less than 5 options should not displays any scroll/search bar - const SelectReset = (props) => { const [value, setValue] = useState('default'); @@ -85,6 +67,7 @@ describe('SelectV2', () => { }, input: () => screen.getByRole('textbox'), noOptions: () => screen.getByText(/No options/i), + highlightedText: () => screen.getByRole('mark'), }; it('should throw error if