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);
});
});