diff --git a/src/domains/DomainSelector.tsx b/src/domains/DomainSelector.tsx index 06a00ba7..0c8671b4 100644 --- a/src/domains/DomainSelector.tsx +++ b/src/domains/DomainSelector.tsx @@ -40,6 +40,7 @@ export const DomainSelector = ({ listDomains, value, domainsList, onChange }: Do outline type="button" className="domains-dropdown__back-btn" + aria-label="Back to domains list" onClick={pipe(unselectDomain, hideInput)} > diff --git a/test/domains/DomainSelector.test.tsx b/test/domains/DomainSelector.test.tsx index e3de5195..3787f55f 100644 --- a/test/domains/DomainSelector.test.tsx +++ b/test/domains/DomainSelector.test.tsx @@ -1,13 +1,10 @@ -import { shallow, ShallowWrapper } from 'enzyme'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { Mock } from 'ts-mockery'; -import { DropdownItem, InputGroup } from 'reactstrap'; import { DomainSelector } from '../../src/domains/DomainSelector'; import { DomainsList } from '../../src/domains/reducers/domainsList'; import { ShlinkDomain } from '../../src/api/types'; -import { DropdownBtn } from '../../src/utils/DropdownBtn'; describe('', () => { - let wrapper: ShallowWrapper; const domainsList = Mock.of({ domains: [ Mock.of({ domain: 'default.com', isDefault: true }), @@ -15,51 +12,59 @@ describe('', () => { Mock.of({ domain: 'bar.com' }), ], }); - const createWrapper = (value = '') => { - wrapper = shallow( - , - ); - - return wrapper; - }; + const setUp = (value = '') => render( + , + ); afterEach(jest.clearAllMocks); - afterEach(() => wrapper.unmount()); it.each([ ['', 'Domain', 'domains-dropdown__toggle-btn'], ['my-domain.com', 'Domain: my-domain.com', 'domains-dropdown__toggle-btn--active'], - ])('shows dropdown by default', (value, expectedText, expectedClassName) => { - const wrapper = createWrapper(value); - const input = wrapper.find(InputGroup); - const dropdown = wrapper.find(DropdownBtn); + ])('shows dropdown by default', async (value, expectedText, expectedClassName) => { + setUp(value); - expect(input).toHaveLength(0); - expect(dropdown).toHaveLength(1); - expect(dropdown.find(DropdownItem)).toHaveLength(5); - expect(dropdown.prop('text')).toEqual(expectedText); - expect(dropdown.prop('className')).toEqual(expectedClassName); + const btn = screen.getByRole('button', { name: expectedText }); + + expect(screen.queryByPlaceholderText('Domain')).not.toBeInTheDocument(); + expect(btn).toHaveAttribute( + 'class', + `dropdown-btn__toggle btn-block ${expectedClassName} dropdown-toggle btn btn-primary`, + ); + fireEvent.click(btn); + + await waitFor(() => expect(screen.getByRole('menu')).toBeInTheDocument()); + expect(screen.getAllByRole('menuitem')).toHaveLength(4); }); - it('allows toggling between dropdown and input', () => { - const wrapper = createWrapper(); + it('allows toggling between dropdown and input', async () => { + setUp(); - wrapper.find(DropdownItem).last().simulate('click'); - expect(wrapper.find(InputGroup)).toHaveLength(1); - expect(wrapper.find(DropdownBtn)).toHaveLength(0); + expect(screen.queryByPlaceholderText('Domain')).not.toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Domain' })).toBeInTheDocument(); - wrapper.find('.domains-dropdown__back-btn').simulate('click'); - expect(wrapper.find(InputGroup)).toHaveLength(0); - expect(wrapper.find(DropdownBtn)).toHaveLength(1); + fireEvent.click(screen.getByRole('button', { name: 'Domain' })); + fireEvent.click(await screen.findByText('New domain')); + + expect(screen.getByPlaceholderText('Domain')).toBeInTheDocument(); + expect(screen.queryByRole('button', { name: 'Domain' })).not.toBeInTheDocument(); + + fireEvent.click(screen.getByRole('button', { name: 'Back to domains list' })); + + expect(screen.queryByPlaceholderText('Domain')).not.toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Domain' })).toBeInTheDocument(); }); it.each([ - [0, 'default.comdefault'], + [0, 'default.comdefault'], [1, 'foo.com'], [2, 'bar.com'], - ])('shows expected content on every item', (index, expectedContent) => { - const item = createWrapper().find(DropdownItem).at(index); + ])('shows expected content on every item', async (index, expectedContent) => { + setUp(); - expect(item.html()).toContain(expectedContent); + fireEvent.click(screen.getByRole('button', { name: 'Domain' })); + const items = await screen.findAllByRole('menuitem'); + + expect(items[index]).toHaveTextContent(expectedContent); }); });