Testing library update to 14.4.3 (#2741)

* Update RTL to v14.4.3

* fixed test cases QueryForm.spec.tsx, SchemaVersion.spec.tsx

Co-authored-by: Oleg Shur <workshur@gmail.com>
Co-authored-by: davitbejanyan <dbejanyan@provectus.com>
This commit is contained in:
David 2022-10-26 23:15:25 +04:00 committed by GitHub
parent e67d940981
commit b43ba68405
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
55 changed files with 612 additions and 626 deletions

View file

@ -82,7 +82,7 @@
"@openapitools/openapi-generator-cli": "^2.5.1",
"@testing-library/dom": "^8.11.1",
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/user-event": "^13.5.0",
"@testing-library/user-event": "^14.4.3",
"@types/eventsource": "^1.1.8",
"@types/jest": "^29.0.1",
"@types/lodash": "^4.14.172",

View file

@ -19,7 +19,7 @@ specifiers:
'@testing-library/dom': ^8.11.1
'@testing-library/jest-dom': ^5.16.4
'@testing-library/react': ^13.2.0
'@testing-library/user-event': ^13.5.0
'@testing-library/user-event': ^14.4.3
'@types/eventsource': ^1.1.8
'@types/jest': ^29.0.1
'@types/lodash': ^4.14.172
@ -144,7 +144,7 @@ devDependencies:
'@openapitools/openapi-generator-cli': 2.5.1
'@testing-library/dom': 8.13.0
'@testing-library/jest-dom': 5.16.4
'@testing-library/user-event': 13.5.0_tlwynutqiyp5mns3woioasuxnq
'@testing-library/user-event': 14.4.3_tlwynutqiyp5mns3woioasuxnq
'@types/eventsource': 1.1.8
'@types/jest': 29.0.1
'@types/lodash': 4.14.177
@ -3337,13 +3337,12 @@ packages:
react-dom: 18.1.0_react@18.1.0
dev: false
/@testing-library/user-event/13.5.0_tlwynutqiyp5mns3woioasuxnq:
resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==}
engines: {node: '>=10', npm: '>=6'}
/@testing-library/user-event/14.4.3_tlwynutqiyp5mns3woioasuxnq:
resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==}
engines: {node: '>=12', npm: '>=6'}
peerDependencies:
'@testing-library/dom': '>=7.21.4'
dependencies:
'@babel/runtime': 7.17.9
'@testing-library/dom': 8.13.0
dev: true

View file

@ -2,7 +2,6 @@ import React from 'react';
import { render, WithRoute } from 'lib/testHelpers';
import { screen } from '@testing-library/dom';
import { clusterBrokerPath } from 'lib/paths';
import { act } from '@testing-library/react';
import { brokerLogDirsPayload } from 'lib/fixtures/brokers';
import { useBrokerLogDirs } from 'lib/hooks/api/brokers';
import { BrokerLogdirs } from 'generated-sources';
@ -20,8 +19,7 @@ describe('BrokerLogdir Component', () => {
(useBrokerLogDirs as jest.Mock).mockImplementation(() => ({
data: payload,
}));
await act(() => {
render(
await render(
<WithRoute path={clusterBrokerPath()}>
<BrokerLogdir />
</WithRoute>,
@ -29,7 +27,6 @@ describe('BrokerLogdir Component', () => {
initialEntries: [clusterBrokerPath(clusterName, brokerId)],
}
);
});
};
it('shows warning when server returns undefined logDirs response', async () => {

View file

@ -6,7 +6,6 @@ import { useBrokerConfig } from 'lib/hooks/api/brokers';
import { brokerConfigPayload } from 'lib/fixtures/brokers';
import Configs from 'components/Brokers/Broker/Configs/Configs';
import userEvent from '@testing-library/user-event';
import { act } from '@testing-library/react';
const clusterName = 'Cluster_Name';
const brokerId = 'Broker_Id';
@ -42,9 +41,7 @@ describe('Configs', () => {
});
it('updates textbox value', async () => {
await act(() => {
userEvent.click(screen.getAllByLabelText('editAction')[0]);
});
await userEvent.click(screen.getAllByLabelText('editAction')[0]);
const textbox = screen.getByLabelText('inputValue');
expect(textbox).toBeInTheDocument();
@ -59,9 +56,9 @@ describe('Configs', () => {
screen.getByRole('button', { name: 'cancelAction' })
).toBeInTheDocument();
await act(() => {
userEvent.click(screen.getByRole('button', { name: 'confirmAction' }));
});
await userEvent.click(
screen.getByRole('button', { name: 'confirmAction' })
);
expect(
screen.getByText('Are you sure you want to change the value?')

View file

@ -2,7 +2,6 @@ import React from 'react';
import { render, WithRoute } from 'lib/testHelpers';
import { screen, waitFor } from '@testing-library/dom';
import { clusterBrokerPath, clusterBrokersPath } from 'lib/paths';
import { act } from '@testing-library/react';
import BrokersList from 'components/Brokers/BrokersList/BrokersList';
import userEvent from '@testing-library/user-event';
import { useBrokers } from 'lib/hooks/api/brokers';
@ -57,9 +56,8 @@ describe('BrokersList Component', () => {
});
it('opens broker when row clicked', async () => {
renderComponent();
await act(() => {
userEvent.click(screen.getByRole('cell', { name: '0' }));
});
await userEvent.click(screen.getByRole('cell', { name: '0' }));
await waitFor(() =>
expect(mockedUsedNavigate).toBeCalledWith(
clusterBrokerPath(clusterName, '0')

View file

@ -13,7 +13,6 @@ import {
clusterSchemasPath,
clusterTopicsPath,
} from 'lib/paths';
import { act } from 'react-dom/test-utils';
import { useClusters } from 'lib/hooks/api/clusters';
import { onlineClusterPayload } from 'lib/fixtures/clusters';
@ -54,14 +53,12 @@ describe('Cluster', () => {
(useClusters as jest.Mock).mockImplementation(() => ({
data: payload,
}));
await act(() => {
render(
await render(
<WithRoute path={`${clusterPath()}/*`}>
<ClusterComponent />
</WithRoute>,
{ initialEntries: [pathname] }
);
});
};
it('renders Brokers', async () => {

View file

@ -33,10 +33,10 @@ const expectActionButtonsExists = () => {
expect(screen.getByText('Restart Failed Tasks')).toBeInTheDocument();
expect(screen.getByText('Delete')).toBeInTheDocument();
};
const afterClickDropDownButton = () => {
const afterClickDropDownButton = async () => {
const dropDownButton = screen.getAllByRole('button');
expect(dropDownButton.length).toEqual(1);
userEvent.click(dropDownButton[0]);
await userEvent.click(dropDownButton[0]);
};
describe('Actions', () => {
afterEach(() => {
@ -61,48 +61,48 @@ describe('Actions', () => {
{ initialEntries: [path] }
);
it('renders buttons when paused', () => {
it('renders buttons when paused', async () => {
(useConnector as jest.Mock).mockImplementation(() => ({
data: set({ ...connector }, 'status.state', ConnectorState.PAUSED),
}));
renderComponent();
afterClickDropDownButton();
await afterClickDropDownButton();
expect(screen.getAllByRole('menuitem').length).toEqual(5);
expect(screen.getByText('Resume')).toBeInTheDocument();
expect(screen.queryByText('Pause')).not.toBeInTheDocument();
expectActionButtonsExists();
});
it('renders buttons when failed', () => {
it('renders buttons when failed', async () => {
(useConnector as jest.Mock).mockImplementation(() => ({
data: set({ ...connector }, 'status.state', ConnectorState.FAILED),
}));
renderComponent();
afterClickDropDownButton();
await afterClickDropDownButton();
expect(screen.getAllByRole('menuitem').length).toEqual(4);
expect(screen.queryByText('Resume')).not.toBeInTheDocument();
expect(screen.queryByText('Pause')).not.toBeInTheDocument();
expectActionButtonsExists();
});
it('renders buttons when unassigned', () => {
it('renders buttons when unassigned', async () => {
(useConnector as jest.Mock).mockImplementation(() => ({
data: set({ ...connector }, 'status.state', ConnectorState.UNASSIGNED),
}));
renderComponent();
afterClickDropDownButton();
await afterClickDropDownButton();
expect(screen.getAllByRole('menuitem').length).toEqual(4);
expect(screen.queryByText('Resume')).not.toBeInTheDocument();
expect(screen.queryByText('Pause')).not.toBeInTheDocument();
expectActionButtonsExists();
});
it('renders buttons when running connector action', () => {
it('renders buttons when running connector action', async () => {
(useConnector as jest.Mock).mockImplementation(() => ({
data: set({ ...connector }, 'status.state', ConnectorState.RUNNING),
}));
renderComponent();
afterClickDropDownButton();
await afterClickDropDownButton();
expect(screen.getAllByRole('menuitem').length).toEqual(5);
expect(screen.queryByText('Resume')).not.toBeInTheDocument();
expect(screen.getByText('Pause')).toBeInTheDocument();
@ -118,34 +118,34 @@ describe('Actions', () => {
it('opens confirmation modal when delete button clicked', async () => {
renderComponent();
afterClickDropDownButton();
await waitFor(() =>
await afterClickDropDownButton();
await waitFor(async () =>
userEvent.click(screen.getByRole('menuitem', { name: 'Delete' }))
);
expect(screen.getByRole('dialog')).toBeInTheDocument();
});
it('calls restartConnector when restart button clicked', () => {
it('calls restartConnector when restart button clicked', async () => {
const restartConnector = jest.fn();
(useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
mutateAsync: restartConnector,
}));
renderComponent();
afterClickDropDownButton();
userEvent.click(
await afterClickDropDownButton();
await userEvent.click(
screen.getByRole('menuitem', { name: 'Restart Connector' })
);
expect(restartConnector).toHaveBeenCalledWith(ConnectorAction.RESTART);
});
it('calls restartAllTasks', () => {
it('calls restartAllTasks', async () => {
const restartAllTasks = jest.fn();
(useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
mutateAsync: restartAllTasks,
}));
renderComponent();
afterClickDropDownButton();
userEvent.click(
await afterClickDropDownButton();
await userEvent.click(
screen.getByRole('menuitem', { name: 'Restart All Tasks' })
);
expect(restartAllTasks).toHaveBeenCalledWith(
@ -153,14 +153,14 @@ describe('Actions', () => {
);
});
it('calls restartFailedTasks', () => {
it('calls restartFailedTasks', async () => {
const restartFailedTasks = jest.fn();
(useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
mutateAsync: restartFailedTasks,
}));
renderComponent();
afterClickDropDownButton();
userEvent.click(
await afterClickDropDownButton();
await userEvent.click(
screen.getByRole('menuitem', { name: 'Restart Failed Tasks' })
);
expect(restartFailedTasks).toHaveBeenCalledWith(
@ -168,18 +168,18 @@ describe('Actions', () => {
);
});
it('calls pauseConnector when pause button clicked', () => {
it('calls pauseConnector when pause button clicked', async () => {
const pauseConnector = jest.fn();
(useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
mutateAsync: pauseConnector,
}));
renderComponent();
afterClickDropDownButton();
userEvent.click(screen.getByRole('menuitem', { name: 'Pause' }));
await afterClickDropDownButton();
await userEvent.click(screen.getByRole('menuitem', { name: 'Pause' }));
expect(pauseConnector).toHaveBeenCalledWith(ConnectorAction.PAUSE);
});
it('calls resumeConnector when resume button clicked', () => {
it('calls resumeConnector when resume button clicked', async () => {
const resumeConnector = jest.fn();
(useConnector as jest.Mock).mockImplementation(() => ({
data: set({ ...connector }, 'status.state', ConnectorState.PAUSED),
@ -188,8 +188,8 @@ describe('Actions', () => {
mutateAsync: resumeConnector,
}));
renderComponent();
afterClickDropDownButton();
userEvent.click(screen.getByRole('menuitem', { name: 'Resume' }));
await afterClickDropDownButton();
await userEvent.click(screen.getByRole('menuitem', { name: 'Resume' }));
expect(resumeConnector).toHaveBeenCalledWith(ConnectorAction.RESUME);
});
});

View file

@ -57,7 +57,7 @@ describe('Tasks', () => {
).toBeInTheDocument();
});
it('renders truncates long trace and expands', () => {
it('renders truncates long trace and expands', async () => {
renderComponent(tasks);
const trace = tasks[2]?.status?.trace || '';
@ -72,7 +72,7 @@ describe('Tasks', () => {
// Full trace is not visible
expect(expandedDetails).not.toBeInTheDocument();
userEvent.click(thirdRow);
await userEvent.click(thirdRow);
expect(
screen.getByRole('row', {
@ -82,7 +82,7 @@ describe('Tasks', () => {
});
describe('Action button', () => {
const expectDropdownExists = () => {
const expectDropdownExists = async () => {
const firstTaskRow = screen.getByRole('row', {
name: '1 kafka-connect0:8083 RUNNING',
});
@ -91,13 +91,13 @@ describe('Tasks', () => {
name: 'Dropdown Toggle',
});
expect(extBtn).toBeEnabled();
userEvent.click(extBtn);
await userEvent.click(extBtn);
expect(screen.getByRole('menu')).toBeInTheDocument();
};
it('renders action button', () => {
it('renders action button', async () => {
renderComponent(tasks);
expectDropdownExists();
await expectDropdownExists();
expect(
screen.getAllByRole('button', { name: 'Dropdown Toggle' }).length
).toEqual(tasks.length);
@ -108,11 +108,11 @@ describe('Tasks', () => {
it('works as expected', async () => {
renderComponent(tasks);
expectDropdownExists();
await expectDropdownExists();
const actionBtn = screen.getAllByRole('menuitem');
expect(actionBtn[0]).toHaveTextContent('Restart task');
userEvent.click(actionBtn[0]);
await userEvent.click(actionBtn[0]);
expect(
screen.getByText('Are you sure you want to restart the task?')
).toBeInTheDocument();

View file

@ -5,7 +5,7 @@ import ClusterContext, {
initialValue,
} from 'components/contexts/ClusterContext';
import List from 'components/Connect/List/List';
import { act, screen, waitFor } from '@testing-library/react';
import { screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { render, WithRoute } from 'lib/testHelpers';
import { clusterConnectConnectorPath, clusterConnectorsPath } from 'lib/paths';
@ -52,13 +52,11 @@ describe('Connectors List', () => {
it('opens broker when row clicked', async () => {
renderComponent();
await act(() => {
userEvent.click(
await userEvent.click(
screen.getByRole('row', {
name: 'hdfs-source-connector first SOURCE FileStreamSource a b c RUNNING 2 of 2',
})
);
});
await waitFor(() =>
expect(mockedUsedNavigate).toBeCalledWith(
clusterConnectConnectorPath(
@ -105,7 +103,7 @@ describe('Connectors List', () => {
const submitButton = screen.getAllByRole('button', {
name: 'Confirm',
})[0];
await act(() => userEvent.click(submitButton));
await userEvent.click(submitButton);
expect(mockDelete).toHaveBeenCalledWith();
});

View file

@ -31,16 +31,14 @@ jest.mock('lib/hooks/api/kafkaConnect', () => ({
describe('New', () => {
const clusterName = 'my-cluster';
const simulateFormSubmit = async () => {
await act(() => {
userEvent.type(
await userEvent.type(
screen.getByPlaceholderText('Connector Name'),
'my-connector'
);
userEvent.type(
await userEvent.type(
screen.getByPlaceholderText('json'),
'{"class":"MyClass"}'.replace(/[{[]/g, '$&$&')
);
});
expect(screen.getByPlaceholderText('json')).toHaveValue(
'{"class":"MyClass"}'

View file

@ -33,25 +33,24 @@ const resetConsumerGroupOffsetsMockCalled = () =>
).toBeTruthy();
const selectresetTypeAndPartitions = async (resetType: string) => {
userEvent.click(screen.getByLabelText('Reset Type'));
userEvent.click(screen.getByText(resetType));
userEvent.click(screen.getByText('Select...'));
await waitFor(() => {
userEvent.click(screen.getByText('Partition #0'));
});
await userEvent.click(screen.getByLabelText('Reset Type'));
await userEvent.click(screen.getByText(resetType));
await userEvent.click(screen.getByText('Select...'));
await userEvent.click(screen.getByText('Partition #0'));
};
const resetConsumerGroupOffsetsWith = async (
resetType: string,
offset: null | number = null
) => {
userEvent.click(screen.getByLabelText('Reset Type'));
await userEvent.click(screen.getByLabelText('Reset Type'));
const options = screen.getAllByText(resetType);
userEvent.click(options.length > 1 ? options[1] : options[0]);
userEvent.click(screen.getByText('Select...'));
await waitFor(() => {
userEvent.click(screen.getByText('Partition #0'));
});
await userEvent.click(options.length > 1 ? options[1] : options[0]);
await userEvent.click(screen.getByText('Select...'));
await userEvent.click(screen.getByText('Partition #0'));
fetchMock.postOnce(
`/api/clusters/${clusterName}/consumer-groups/${groupId}/offsets`,
200,
@ -64,7 +63,7 @@ const resetConsumerGroupOffsetsWith = async (
},
}
);
userEvent.click(screen.getByText('Submit'));
await userEvent.click(screen.getByText('Submit'));
await waitFor(() => resetConsumerGroupOffsetsMockCalled());
};
@ -116,14 +115,14 @@ describe('ResetOffsets', () => {
},
}
);
await waitFor(() => {
userEvent.click(screen.getAllByLabelText('Partition #0')[1]);
});
await waitFor(() => {
userEvent.keyboard('10');
});
userEvent.click(screen.getByText('Submit'));
await waitFor(() => resetConsumerGroupOffsetsMockCalled());
await userEvent.click(screen.getAllByLabelText('Partition #0')[1]);
await userEvent.keyboard('10');
await userEvent.click(screen.getByText('Submit'));
await resetConsumerGroupOffsetsMockCalled();
});
it('calls resetConsumerGroupOffsets with TIMESTAMP', async () => {
await selectresetTypeAndPartitions('TIMESTAMP');
@ -139,7 +138,7 @@ describe('ResetOffsets', () => {
},
}
);
userEvent.click(screen.getByText('Submit'));
await userEvent.click(screen.getByText('Submit'));
await waitFor(() =>
expect(
screen.getByText("This field shouldn't be empty!")

View file

@ -13,7 +13,6 @@ import {
waitForElementToBeRemoved,
} from '@testing-library/dom';
import userEvent from '@testing-library/user-event';
import { act } from '@testing-library/react';
const clusterName = 'cluster1';
const { groupId } = consumerGroupPayload;
@ -71,7 +70,7 @@ describe('Details component', () => {
});
it('handles [Reset offset] click', async () => {
userEvent.click(screen.getByText('Reset offset'));
await userEvent.click(screen.getByText('Reset offset'));
expect(mockNavigate).toHaveBeenLastCalledWith(
clusterConsumerGroupResetRelativePath
);
@ -86,19 +85,19 @@ describe('Details component', () => {
it('shows confirmation modal on consumer group delete', async () => {
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
userEvent.click(screen.getByText('Delete consumer group'));
await userEvent.click(screen.getByText('Delete consumer group'));
await waitFor(() =>
expect(screen.queryByRole('dialog')).toBeInTheDocument()
);
userEvent.click(screen.getByText('Cancel'));
await userEvent.click(screen.getByText('Cancel'));
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
});
it('handles [Delete consumer group] click', async () => {
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
await act(() => {
userEvent.click(screen.getByText('Delete consumer group'));
});
await userEvent.click(screen.getByText('Delete consumer group'));
expect(screen.queryByRole('dialog')).toBeInTheDocument();
const deleteConsumerGroupMock = fetchMock.deleteOnce(
`/api/clusters/${clusterName}/consumer-groups/${groupId}`,

View file

@ -39,8 +39,8 @@ describe('ListItem', () => {
expect(screen.getByRole('row')).toBeInTheDocument();
});
it('should renders list item with topic content open', () => {
userEvent.click(screen.getAllByRole('cell')[0].children[0]);
it('should renders list item with topic content open', async () => {
await userEvent.click(screen.getAllByRole('cell')[0].children[0]);
expect(screen.getByText('Consumer ID')).toBeInTheDocument();
});
});

View file

@ -48,10 +48,10 @@ describe('List', () => {
expect(screen.getByText('groupId2')).toBeInTheDocument();
});
it('handles onRowClick', () => {
it('handles onRowClick', async () => {
const row = screen.getByRole('row', { name: 'groupId1 0 1 1' });
expect(row).toBeInTheDocument();
userEvent.click(row);
await userEvent.click(row);
expect(mockedUsedNavigate).toHaveBeenCalledWith(
clusterConsumerGroupDetailsPath(':clusterName', 'groupId1')
);

View file

@ -1,5 +1,5 @@
import React from 'react';
import { act, screen } from '@testing-library/react';
import { screen } from '@testing-library/react';
import ClustersWidget from 'components/Dashboard/ClustersWidget/ClustersWidget';
import userEvent from '@testing-library/user-event';
import { render } from 'lib/testHelpers';
@ -16,18 +16,16 @@ describe('ClustersWidget', () => {
data: clustersPayload,
isSuccess: true,
}));
await act(() => {
render(<ClustersWidget />);
});
await render(<ClustersWidget />);
});
it('renders clusterWidget list', () => {
expect(screen.getAllByRole('row').length).toBe(3);
});
it('hides online cluster widgets', () => {
it('hides online cluster widgets', async () => {
expect(screen.getAllByRole('row').length).toBe(3);
userEvent.click(screen.getByRole('checkbox'));
await userEvent.click(screen.getByRole('checkbox'));
expect(screen.getAllByRole('row').length).toBe(2);
});

View file

@ -7,7 +7,6 @@ import KsqlDbItem, {
} from 'components/KsqlDb/List/KsqlDbItem/KsqlDbItem';
import { screen } from '@testing-library/dom';
import { fetchKsqlDbTablesPayload } from 'redux/reducers/ksqlDb/__test__/fixtures';
import { act } from '@testing-library/react';
describe('KsqlDbItem', () => {
const tablesPathname = clusterKsqlDbTablesPath();
@ -27,37 +26,34 @@ describe('KsqlDbItem', () => {
);
};
it('renders progressbar when fetching tables and streams', async () => {
await act(() => renderComponent({ fetching: true }));
it('renders progressbar when fetching tables and streams', () => {
renderComponent({ fetching: true });
expect(screen.getByRole('progressbar')).toBeInTheDocument();
});
it('show no text if no data found', async () => {
await act(() => renderComponent({}));
it('show no text if no data found', () => {
renderComponent({});
expect(screen.getByText('No tables or streams found')).toBeInTheDocument();
});
it('renders with tables', async () => {
await act(() =>
it('renders with tables', () => {
renderComponent({
rows: {
tables: fetchKsqlDbTablesPayload.tables,
streams: [],
},
})
);
});
expect(screen.getByRole('table').querySelectorAll('td')).toHaveLength(10);
});
it('renders with streams', async () => {
await act(() =>
it('renders with streams', () => {
renderComponent({
type: KsqlDbItemType.Streams,
rows: {
tables: [],
streams: fetchKsqlDbTablesPayload.streams,
},
})
);
});
expect(screen.getByRole('table').querySelectorAll('td')).toHaveLength(10);
});
});

View file

@ -3,7 +3,6 @@ import React from 'react';
import QueryForm, { Props } from 'components/KsqlDb/Query/QueryForm/QueryForm';
import { screen, waitFor, within } from '@testing-library/dom';
import userEvent from '@testing-library/user-event';
import { act } from '@testing-library/react';
const renderComponent = (props: Props) => render(<QueryForm {...props} />);
@ -57,10 +56,9 @@ describe('QueryForm', () => {
submitHandler: submitFn,
});
await act(() =>
userEvent.click(screen.getByRole('button', { name: 'Execute' }))
);
waitFor(() => {
await userEvent.click(screen.getByRole('button', { name: 'Execute' }));
await waitFor(() => {
expect(screen.getByText('ksql is a required field')).toBeInTheDocument();
expect(submitFn).not.toBeCalled();
});
@ -76,12 +74,16 @@ describe('QueryForm', () => {
submitHandler: submitFn,
});
await act(() => {
userEvent.paste(screen.getAllByRole('textbox')[0], 'show tables;');
userEvent.paste(screen.getByRole('textbox', { name: 'key' }), 'test');
userEvent.paste(screen.getByRole('textbox', { name: 'value' }), 'test');
userEvent.click(screen.getByRole('button', { name: 'Execute' }));
});
const textbox = screen.getAllByRole('textbox');
textbox[0].focus();
await userEvent.paste('show tables;');
const key = screen.getByRole('textbox', { name: 'key' });
key.focus();
await userEvent.paste('test');
const value = screen.getByRole('textbox', { name: 'value' });
value.focus();
await userEvent.paste('test');
await userEvent.click(screen.getByRole('button', { name: 'Execute' }));
expect(
screen.queryByText('ksql is a required field')
@ -106,8 +108,8 @@ describe('QueryForm', () => {
expect(screen.getByRole('button', { name: 'Clear results' })).toBeEnabled();
await act(() =>
userEvent.click(screen.getByRole('button', { name: 'Clear results' }))
await userEvent.click(
screen.getByRole('button', { name: 'Clear results' })
);
expect(clearFn).toBeCalled();
@ -125,39 +127,12 @@ describe('QueryForm', () => {
expect(screen.getByRole('button', { name: 'Stop query' })).toBeEnabled();
await act(() =>
userEvent.click(screen.getByRole('button', { name: 'Stop query' }))
);
await userEvent.click(screen.getByRole('button', { name: 'Stop query' }));
expect(cancelFn).toBeCalled();
});
it('submits form with ctrl+enter on KSQL editor', async () => {
const submitFn = jest.fn();
renderComponent({
fetching: false,
hasResults: false,
handleClearResults: jest.fn(),
handleSSECancel: jest.fn(),
submitHandler: submitFn,
});
await act(() => {
userEvent.paste(
within(screen.getByLabelText('KSQL')).getByRole('textbox'),
'show tables;'
);
userEvent.type(
within(screen.getByLabelText('KSQL')).getByRole('textbox'),
'{ctrl}{enter}'
);
});
expect(submitFn.mock.calls.length).toBe(1);
});
it('adds new property', async () => {
it('add new property', async () => {
renderComponent({
fetching: false,
hasResults: false,
@ -168,11 +143,9 @@ describe('QueryForm', () => {
const textbox = screen.getByLabelText('key');
await userEvent.type(textbox, 'prop_name');
await act(() => {
userEvent.click(
await userEvent.click(
screen.getByRole('button', { name: 'Add Stream Property' })
);
});
expect(screen.getAllByRole('textbox', { name: 'key' }).length).toEqual(2);
});
@ -185,11 +158,9 @@ describe('QueryForm', () => {
submitHandler: jest.fn(),
});
await act(() => {
userEvent.click(
await userEvent.click(
screen.getByRole('button', { name: 'Add Stream Property' })
);
});
expect(screen.getAllByRole('textbox', { name: 'key' }).length).toEqual(1);
});
@ -201,16 +172,18 @@ describe('QueryForm', () => {
handleSSECancel: jest.fn(),
submitHandler: jest.fn(),
});
await act(() => {
userEvent.paste(screen.getByRole('textbox', { name: 'key' }), 'test');
userEvent.click(
const textBoxes = screen.getAllByRole('textbox', { name: 'key' });
textBoxes[0].focus();
await userEvent.paste('test');
await userEvent.click(
screen.getByRole('button', { name: 'Add Stream Property' })
);
});
await act(() => {
userEvent.click(screen.getAllByLabelText('deleteProperty')[0]);
});
expect(screen.getAllByRole('textbox', { name: 'key' }).length).toEqual(1);
await userEvent.click(screen.getAllByLabelText('deleteProperty')[0]);
await screen.getByRole('button', { name: 'Add Stream Property' });
await userEvent.click(screen.getAllByLabelText('deleteProperty')[0]);
expect(textBoxes.length).toEqual(1);
});
});

View file

@ -6,7 +6,6 @@ import Query, {
import { screen } from '@testing-library/dom';
import fetchMock from 'fetch-mock';
import { clusterKsqlDbQueryPath } from 'lib/paths';
import { act } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
const clusterName = 'testLocal';
@ -41,10 +40,10 @@ describe('Query', () => {
});
const inputs = screen.getAllByRole('textbox');
const textAreaElement = inputs[0] as HTMLTextAreaElement;
await act(() => {
userEvent.paste(textAreaElement, 'show tables;');
userEvent.click(screen.getByRole('button', { name: 'Execute' }));
});
textAreaElement.focus();
await userEvent.paste('show tables;');
await userEvent.click(screen.getByRole('button', { name: 'Execute' }));
expect(mock.calls().length).toBe(1);
});
@ -59,18 +58,20 @@ describe('Query', () => {
Object.defineProperty(window, 'EventSource', {
value: EventSourceMock,
});
await act(() => {
const inputs = screen.getAllByRole('textbox');
const textAreaElement = inputs[0] as HTMLTextAreaElement;
userEvent.paste(textAreaElement, 'show tables;');
});
await act(() => {
userEvent.paste(screen.getByLabelText('key'), 'key');
userEvent.paste(screen.getByLabelText('value'), 'value');
});
await act(() => {
userEvent.click(screen.getByRole('button', { name: 'Execute' }));
});
textAreaElement.focus();
await userEvent.paste('show tables;');
const key = screen.getByLabelText('key');
key.focus();
await userEvent.paste('key');
const value = screen.getByLabelText('value');
value.focus();
await userEvent.paste('value');
await userEvent.click(screen.getByRole('button', { name: 'Execute' }));
expect(mock.calls().length).toBe(1);
});

View file

@ -19,19 +19,19 @@ describe('ClusterMenu', () => {
const getKafkaConnect = () => screen.getByTitle('Kafka Connect');
const getCluster = () => screen.getByText(onlineClusterPayload.name);
it('renders cluster menu with default set of features', () => {
it('renders cluster menu with default set of features', async () => {
render(setupComponent(onlineClusterPayload));
expect(getCluster()).toBeInTheDocument();
expect(getMenuItems().length).toEqual(1);
userEvent.click(getMenuItem());
await userEvent.click(getMenuItem());
expect(getMenuItems().length).toEqual(4);
expect(getBrokers()).toBeInTheDocument();
expect(getTopics()).toBeInTheDocument();
expect(getConsumers()).toBeInTheDocument();
});
it('renders cluster menu with correct set of features', () => {
it('renders cluster menu with correct set of features', async () => {
render(
setupComponent({
...onlineClusterPayload,
@ -43,7 +43,7 @@ describe('ClusterMenu', () => {
})
);
expect(getMenuItems().length).toEqual(1);
userEvent.click(getMenuItem());
await userEvent.click(getMenuItem());
expect(getMenuItems().length).toEqual(7);
expect(getBrokers()).toBeInTheDocument();
@ -64,7 +64,7 @@ describe('ClusterMenu', () => {
expect(getTopics()).toBeInTheDocument();
expect(getConsumers()).toBeInTheDocument();
});
it('makes Kafka Connect link active', () => {
it('makes Kafka Connect link active', async () => {
render(
setupComponent({
...onlineClusterPayload,
@ -73,7 +73,7 @@ describe('ClusterMenu', () => {
{ initialEntries: [clusterConnectorsPath(onlineClusterPayload.name)] }
);
expect(getMenuItems().length).toEqual(1);
userEvent.click(getMenuItem());
await userEvent.click(getMenuItem());
expect(getMenuItems().length).toEqual(5);
const kafkaConnect = getKafkaConnect();

View file

@ -2,7 +2,6 @@ import React from 'react';
import Nav from 'components/Nav/Nav';
import { screen } from '@testing-library/react';
import { render } from 'lib/testHelpers';
import { act } from 'react-dom/test-utils';
import { Cluster } from 'generated-sources';
import { useClusters } from 'lib/hooks/api/clusters';
import {
@ -15,28 +14,26 @@ jest.mock('lib/hooks/api/clusters', () => ({
}));
describe('Nav', () => {
const renderComponent = async (payload: Cluster[] = []) => {
const renderComponent = (payload: Cluster[] = []) => {
(useClusters as jest.Mock).mockImplementation(() => ({
data: payload,
isSuccess: true,
}));
await act(() => {
render(<Nav />);
});
};
const getDashboard = () => screen.getByText('Dashboard');
const getMenuItemsCount = () => screen.getAllByRole('menuitem').length;
it('renders loader', async () => {
await renderComponent();
it('renders loader', () => {
renderComponent();
expect(getMenuItemsCount()).toEqual(1);
expect(getDashboard()).toBeInTheDocument();
});
it('renders ClusterMenu', async () => {
await renderComponent([onlineClusterPayload, offlineClusterPayload]);
it('renders ClusterMenu', () => {
renderComponent([onlineClusterPayload, offlineClusterPayload]);
expect(screen.getAllByRole('menu').length).toEqual(3);
expect(getMenuItemsCount()).toEqual(3);
expect(getDashboard()).toBeInTheDocument();

View file

@ -56,9 +56,7 @@ describe('Details', () => {
schemasAPIVersionsUrl,
404
);
await act(() => {
renderComponent();
});
await renderComponent();
await waitFor(() => {
expect(schemasAPILatestMock.called()).toBeTruthy();

View file

@ -19,7 +19,7 @@ const renderComponent = () => {
};
describe('SchemaVersion', () => {
it('renders versions', () => {
it('renders versions', async () => {
renderComponent();
});
});

View file

@ -45,9 +45,7 @@ describe('Edit', () => {
describe('fetch failed', () => {
it('renders page loader', async () => {
const schemasAPILatestMock = fetchMock.getOnce(schemasAPILatestUrl, 404);
await act(() => {
renderComponent();
});
await renderComponent();
await waitFor(() => expect(schemasAPILatestMock.called()).toBeTruthy());
expect(screen.getByRole('progressbar')).toBeInTheDocument();
expect(screen.queryByText(schemaVersion.subject)).not.toBeInTheDocument();

View file

@ -9,11 +9,11 @@ import fetchMock from 'fetch-mock';
const clusterName = 'testClusterName';
const selectForwardOption = () => {
const selectForwardOption = async () => {
const dropdownElement = screen.getByRole('listbox');
// clicks to open dropdown
userEvent.click(within(dropdownElement).getByRole('option'));
userEvent.click(
await userEvent.click(within(dropdownElement).getByRole('option'));
await userEvent.click(
screen.getByText(CompatibilityLevelCompatibilityEnum.FORWARD)
);
};
@ -59,19 +59,19 @@ describe('GlobalSchemaSelector', () => {
it('shows popup when select value is changed', async () => {
expectOptionIsSelected(CompatibilityLevelCompatibilityEnum.FULL);
selectForwardOption();
await selectForwardOption();
expect(screen.getByText('Confirm the action')).toBeInTheDocument();
});
it('resets select value when cancel is clicked', () => {
selectForwardOption();
userEvent.click(screen.getByText('Cancel'));
it('resets select value when cancel is clicked', async () => {
await selectForwardOption();
await userEvent.click(screen.getByText('Cancel'));
expect(screen.queryByText('Confirm the action')).not.toBeInTheDocument();
expectOptionIsSelected(CompatibilityLevelCompatibilityEnum.FULL);
});
it('sets new schema when confirm is clicked', async () => {
selectForwardOption();
await selectForwardOption();
const putNewCompatibilityMock = fetchMock.putOnce(
`api/clusters/${clusterName}/schemas/compatibility`,
200,

View file

@ -109,14 +109,14 @@ describe('List', () => {
expect(screen.getByText(schemaVersion1.subject)).toBeInTheDocument();
expect(screen.getByText(schemaVersion2.subject)).toBeInTheDocument();
});
it('handles onRowClick', () => {
it('handles onRowClick', async () => {
const { id, schemaType, subject, version, compatibilityLevel } =
schemaVersion2;
const row = screen.getByRole('row', {
name: `${subject} ${id} ${schemaType} ${version} ${compatibilityLevel}`,
});
expect(row).toBeInTheDocument();
userEvent.click(row);
await userEvent.click(row);
expect(mockedUsedNavigate).toHaveBeenCalledWith(
clusterSchemaPath(clusterName, subject)
);

View file

@ -10,8 +10,8 @@ const subjectValue = 'subject';
const schemaValue = 'schema';
describe('New Component', () => {
beforeEach(() => {
render(
beforeEach(async () => {
await render(
<WithRoute path={clusterSchemaNewPath()}>
<New />
</WithRoute>,
@ -33,14 +33,14 @@ describe('New Component', () => {
const schema = screen.getAllByRole('textbox')[1];
const schemaTypeSelect = screen.getByRole('listbox');
await act(() => {
userEvent.type(subject, subjectValue);
await act(async () => {
await userEvent.type(subject, subjectValue);
});
await act(() => {
userEvent.type(schema, schemaValue);
await act(async () => {
await userEvent.type(schema, schemaValue);
});
await act(() => {
userEvent.selectOptions(schemaTypeSelect, ['AVRO']);
await act(async () => {
await userEvent.selectOptions(schemaTypeSelect, ['AVRO']);
});
const submitBtn = screen.getByRole('button', { name: /Submit/i });

View file

@ -33,14 +33,14 @@ describe('ListPage Component', () => {
renderComponent();
});
it('handles switch of Internal Topics visibility', () => {
it('handles switch of Internal Topics visibility', async () => {
const switchInput = screen.getByLabelText('Show Internal Topics');
expect(switchInput).toBeInTheDocument();
expect(global.localStorage.getItem('hideInternalTopics')).toBeNull();
userEvent.click(switchInput);
await userEvent.click(switchInput);
expect(global.localStorage.getItem('hideInternalTopics')).toBeTruthy();
userEvent.click(switchInput);
await userEvent.click(switchInput);
expect(global.localStorage.getItem('hideInternalTopics')).toBeNull();
});

View file

@ -131,8 +131,8 @@ describe('TopicTable Components', () => {
expect(screen.getAllByRole('checkbox')[2]).toBeEnabled();
});
describe('when only one topic is selected', () => {
beforeEach(() => {
userEvent.click(screen.getAllByRole('checkbox')[1]);
beforeEach(async () => {
await userEvent.click(screen.getAllByRole('checkbox')[1]);
});
it('renders batch actions bar', () => {
expect(getButtonByName('Delete selected topics')).toBeEnabled();
@ -143,9 +143,9 @@ describe('TopicTable Components', () => {
});
});
describe('when more then one topics are selected', () => {
beforeEach(() => {
userEvent.click(screen.getAllByRole('checkbox')[1]);
userEvent.click(screen.getAllByRole('checkbox')[2]);
beforeEach(async () => {
await userEvent.click(screen.getAllByRole('checkbox')[1]);
await userEvent.click(screen.getAllByRole('checkbox')[2]);
});
it('renders batch actions bar', () => {
expect(getButtonByName('Delete selected topics')).toBeEnabled();
@ -190,12 +190,12 @@ describe('TopicTable Components', () => {
});
});
describe('Action buttons', () => {
const expectDropdownExists = () => {
const expectDropdownExists = async () => {
const btn = screen.getByRole('button', {
name: 'Dropdown Toggle',
});
expect(btn).toBeEnabled();
userEvent.click(btn);
await userEvent.click(btn);
expect(screen.getByRole('menu')).toBeInTheDocument();
};
it('renders disable action buttons for read-only cluster', () => {
@ -204,7 +204,7 @@ describe('TopicTable Components', () => {
expect(btns[0]).toBeDisabled();
expect(btns[1]).toBeDisabled();
});
it('renders action buttons', () => {
it('renders action buttons', async () => {
renderComponent({ topics: topicsPayload, pageCount: 1 });
expect(
screen.getAllByRole('button', { name: 'Dropdown Toggle' }).length
@ -228,7 +228,7 @@ describe('TopicTable Components', () => {
name: 'Dropdown Toggle',
});
expect(extBtn).toBeEnabled();
userEvent.click(extBtn);
await userEvent.click(extBtn);
expect(screen.getByRole('menu')).toBeInTheDocument();
});
describe('and clear messages action', () => {
@ -241,7 +241,7 @@ describe('TopicTable Components', () => {
},
],
});
expectDropdownExists();
await expectDropdownExists();
const actionBtn = screen.getAllByRole('menuitem');
expect(actionBtn[0]).toHaveTextContent('Clear Messages');
expect(actionBtn[0]).not.toHaveAttribute('aria-disabled');
@ -255,7 +255,7 @@ describe('TopicTable Components', () => {
},
],
});
expectDropdownExists();
await expectDropdownExists();
const actionBtn = screen.getAllByRole('menuitem');
expect(actionBtn[0]).toHaveTextContent('Clear Messages');
expect(actionBtn[0]).toHaveAttribute('aria-disabled');
@ -269,8 +269,8 @@ describe('TopicTable Components', () => {
},
],
});
expectDropdownExists();
userEvent.click(screen.getByText('Clear Messages'));
await expectDropdownExists();
await userEvent.click(screen.getByText('Clear Messages'));
expect(
screen.getByText('Are you sure want to clear topic messages?')
).toBeInTheDocument();
@ -284,22 +284,22 @@ describe('TopicTable Components', () => {
describe('and remove topic action', () => {
it('is visible only when topic deletion allowed for cluster', async () => {
renderComponent({ topics: [topicsPayload[1]] });
expectDropdownExists();
await expectDropdownExists();
const actionBtn = screen.getAllByRole('menuitem');
expect(actionBtn[2]).toHaveTextContent('Remove Topic');
expect(actionBtn[2]).not.toHaveAttribute('aria-disabled');
});
it('is disabled when topic deletion is not allowed for cluster', async () => {
renderComponent({ topics: [topicsPayload[1]] }, false, false);
expectDropdownExists();
await expectDropdownExists();
const actionBtn = screen.getAllByRole('menuitem');
expect(actionBtn[2]).toHaveTextContent('Remove Topic');
expect(actionBtn[2]).toHaveAttribute('aria-disabled');
});
it('works as expected', async () => {
renderComponent({ topics: [topicsPayload[1]] });
expectDropdownExists();
userEvent.click(screen.getByText('Remove Topic'));
await expectDropdownExists();
await userEvent.click(screen.getByText('Remove Topic'));
expect(screen.getByText('Confirm the action')).toBeInTheDocument();
await waitFor(() =>
userEvent.click(screen.getByRole('button', { name: 'Confirm' }))
@ -310,8 +310,8 @@ describe('TopicTable Components', () => {
describe('and recreate topic action', () => {
it('works as expected', async () => {
renderComponent({ topics: [topicsPayload[1]] });
expectDropdownExists();
userEvent.click(screen.getByText('Recreate Topic'));
await expectDropdownExists();
await userEvent.click(screen.getByText('Recreate Topic'));
expect(screen.getByText('Confirm the action')).toBeInTheDocument();
await waitFor(() =>
userEvent.click(screen.getByRole('button', { name: 'Confirm' }))

View file

@ -60,11 +60,14 @@ describe('New', () => {
it('validates form', async () => {
await act(() => renderComponent(clusterTopicNewPath(clusterName)));
await waitFor(() => {
userEvent.type(screen.getByPlaceholderText('Topic Name'), topicName);
await waitFor(async () => {
await userEvent.type(
screen.getByPlaceholderText('Topic Name'),
topicName
);
});
await waitFor(() => {
userEvent.clear(screen.getByPlaceholderText('Topic Name'));
await waitFor(async () => {
await userEvent.clear(screen.getByPlaceholderText('Topic Name'));
});
await waitFor(() => {
expect(screen.getByText('name is a required field')).toBeInTheDocument();
@ -87,11 +90,14 @@ describe('New', () => {
it('submits valid form', async () => {
await act(() => renderComponent(clusterTopicNewPath(clusterName)));
await act(() => {
userEvent.type(screen.getByPlaceholderText('Topic Name'), topicName);
await act(async () => {
await userEvent.type(
screen.getByPlaceholderText('Topic Name'),
topicName
);
});
await act(() => {
userEvent.click(screen.getByText('Create topic'));
await act(async () => {
await userEvent.click(screen.getByText('Create topic'));
});
await waitFor(() => expect(createTopicMock).toHaveBeenCalledTimes(1));
await waitFor(() =>

View file

@ -34,8 +34,8 @@ const renderComponent = (props?: Partial<DangerZoneProps>) =>
{ initialEntries: [clusterTopicPath(clusterName, topicName)] }
);
const clickOnDialogSubmitButton = () => {
userEvent.click(
const clickOnDialogSubmitButton = async () => {
await userEvent.click(
within(screen.getByRole('dialog')).getByRole('button', {
name: 'Confirm',
})
@ -45,7 +45,7 @@ const clickOnDialogSubmitButton = () => {
const checkDialogThenPressCancel = async () => {
const dialog = screen.getByRole('dialog');
expect(screen.getByRole('dialog')).toBeInTheDocument();
userEvent.click(within(dialog).getByRole('button', { name: 'Cancel' }));
await userEvent.click(within(dialog).getByRole('button', { name: 'Cancel' }));
await waitFor(() =>
expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
);
@ -91,11 +91,13 @@ describe('DangerZone', () => {
const numberOfPartitionsEditForm = screen.getByRole('form', {
name: 'Edit number of partitions',
});
userEvent.type(
await userEvent.type(
within(numberOfPartitionsEditForm).getByRole('spinbutton'),
'4'
);
userEvent.click(within(numberOfPartitionsEditForm).getByRole('button'));
await userEvent.click(
within(numberOfPartitionsEditForm).getByRole('button')
);
await waitFor(() => expect(screen.getByRole('dialog')).toBeInTheDocument());
await waitFor(() => clickOnDialogSubmitButton());
expect(mockIncreaseTopicPartitionsCount).toHaveBeenCalledTimes(1);
@ -119,11 +121,13 @@ describe('DangerZone', () => {
within(replicationFactorEditForm).getByRole('button', { name: 'Submit' })
).toBeInTheDocument();
userEvent.type(
await userEvent.type(
within(replicationFactorEditForm).getByRole('spinbutton'),
'4'
);
userEvent.click(within(replicationFactorEditForm).getByRole('button'));
await userEvent.click(
within(replicationFactorEditForm).getByRole('button')
);
await waitFor(() => expect(screen.getByRole('dialog')).toBeInTheDocument());
await waitFor(() => clickOnDialogSubmitButton());
@ -139,19 +143,19 @@ describe('DangerZone', () => {
const partitionInputSubmitBtn = screen.getAllByText(/submit/i)[0];
const value = (defaultPartitions - 4).toString();
expect(partitionInputSubmitBtn).toBeDisabled();
await act(() => {
userEvent.clear(partitionInput);
userEvent.type(partitionInput, value);
await act(async () => {
await userEvent.clear(partitionInput);
await userEvent.type(partitionInput, value);
});
expect(partitionInput).toHaveValue(+value);
expect(partitionInputSubmitBtn).toBeEnabled();
await act(() => {
userEvent.click(partitionInputSubmitBtn);
await act(async () => {
await userEvent.click(partitionInputSubmitBtn);
});
expect(
screen.getByText(/You can only increase the number of partitions!/i)
).toBeInTheDocument();
userEvent.clear(partitionInput);
await userEvent.clear(partitionInput);
await waitFor(() =>
expect(screen.getByText(/are required/i)).toBeInTheDocument()
);
@ -166,11 +170,11 @@ describe('DangerZone', () => {
await waitFor(() => userEvent.clear(replicatorFactorInput));
expect(replicatorFactorInputSubmitBtn).toBeEnabled();
userEvent.click(replicatorFactorInputSubmitBtn);
await userEvent.click(replicatorFactorInputSubmitBtn);
await waitFor(() =>
expect(screen.getByText(/are required/i)).toBeInTheDocument()
);
userEvent.type(replicatorFactorInput, '1');
await userEvent.type(replicatorFactorInput, '1');
await waitFor(() =>
expect(screen.queryByText(/are required/i)).not.toBeInTheDocument()
);
@ -182,9 +186,9 @@ describe('DangerZone', () => {
const partitionInput = screen.getByPlaceholderText('Number of partitions');
const partitionInputSubmitBtn = screen.getAllByText(/submit/i)[0];
await act(() => {
userEvent.type(partitionInput, '5');
userEvent.click(partitionInputSubmitBtn);
await act(async () => {
await userEvent.type(partitionInput, '5');
await userEvent.click(partitionInputSubmitBtn);
});
await checkDialogThenPressCancel();
@ -196,9 +200,9 @@ describe('DangerZone', () => {
screen.getByPlaceholderText('Replication Factor');
const replicatorFactorInputSubmitBtn = screen.getAllByText(/submit/i)[1];
await act(() => {
userEvent.type(replicatorFactorInput, '5');
userEvent.click(replicatorFactorInputSubmitBtn);
await act(async () => {
await userEvent.type(replicatorFactorInput, '5');
await userEvent.click(replicatorFactorInputSubmitBtn);
});
await checkDialogThenPressCancel();

View file

@ -15,9 +15,10 @@ describe('AddEditFilterContainer component', () => {
code: 'mockCode',
};
const renderComponent = (
const renderComponent = async (
props: Partial<AddEditFilterContainerProps> = {}
) => {
await act(() => {
render(
<AddEditFilterContainer
cancelBtnHandler={jest.fn()}
@ -25,6 +26,7 @@ describe('AddEditFilterContainer component', () => {
{...props}
/>
);
});
};
describe('default Component Parameters', () => {
@ -43,35 +45,32 @@ describe('AddEditFilterContainer component', () => {
const inputs = screen.getAllByRole('textbox');
const textAreaElement = inputs[0] as HTMLTextAreaElement;
await act(() =>
userEvent.paste(textAreaElement, 'Hello World With TextArea')
);
textAreaElement.focus();
await userEvent.paste('Hello World With TextArea');
const inputNameElement = inputs[1];
await act(() => userEvent.type(inputNameElement, 'Hello World!'));
const inputNameElement = inputs[1] as HTMLTextAreaElement;
await userEvent.type(inputNameElement, 'Hello World!');
expect(submitButtonElem).toBeEnabled();
await act(() => userEvent.clear(inputNameElement));
await userEvent.clear(inputNameElement);
await userEvent.tab();
expect(submitButtonElem).toBeDisabled();
});
it('should view the error message after typing and clearing the input', async () => {
const inputs = screen.getAllByRole('textbox');
const user = userEvent.setup();
const textAreaElement = inputs[0] as HTMLTextAreaElement;
await act(() =>
userEvent.paste(textAreaElement, 'Hello World With TextArea')
);
const inputNameElement = inputs[1];
await act(() => {
userEvent.type(inputNameElement, 'Hello World!');
userEvent.clear(inputNameElement);
userEvent.clear(textAreaElement);
});
await user.type(textAreaElement, 'Hello World With TextArea');
await user.type(inputNameElement, 'Hello World!');
await user.clear(inputNameElement);
await user.keyboard('{Control>}[KeyA]{/Control}{backspace}');
await user.tab();
expect(screen.getByText(/required field/i)).toBeInTheDocument();
});
@ -79,11 +78,12 @@ describe('AddEditFilterContainer component', () => {
describe('Custom setup for the component', () => {
it('should render the input with default data if they are passed', async () => {
await act(() => {
renderComponent({
inputDisplayNameDefaultValue: mockData.name,
inputCodeDefaultValue: mockData.code,
});
});
const inputs = screen.getAllByRole('textbox');
const textAreaElement = inputs[0] as HTMLTextAreaElement;
const inputNameElement = inputs[1];
@ -93,44 +93,43 @@ describe('AddEditFilterContainer component', () => {
it('should test whether the cancel callback is being called', async () => {
const cancelCallback = jest.fn();
await act(() =>
renderComponent({
cancelBtnHandler: cancelCallback,
});
})
);
const cancelBtnElement = screen.getByText(/cancel/i);
await act(() => userEvent.click(cancelBtnElement));
await userEvent.click(cancelBtnElement);
expect(cancelCallback).toBeCalled();
});
it('should test whether the submit Callback is being called', async () => {
const submitCallback = jest.fn();
renderComponent({
submitCallback,
});
await act(() => renderComponent({ submitCallback }));
const inputs = screen.getAllByRole('textbox');
const textAreaElement = inputs[0] as HTMLTextAreaElement;
userEvent.paste(textAreaElement, 'Hello World With TextArea');
textAreaElement.focus();
await userEvent.paste('Hello World With TextArea');
const inputNameElement = inputs[1];
await act(() => userEvent.type(inputNameElement, 'Hello World!'));
await userEvent.type(inputNameElement, 'Hello World!');
const submitBtnElement = screen.getByText(defaultSubmitBtn);
expect(submitBtnElement).toBeEnabled();
await act(() => userEvent.click(submitBtnElement));
await userEvent.click(submitBtnElement);
expect(submitCallback).toBeCalled();
});
it('should display the checkbox if the props is passed and initially check state', async () => {
renderComponent({ isAdd: true });
await act(() => renderComponent({ isAdd: true }));
const checkbox = screen.getByRole('checkbox');
expect(checkbox).toBeInTheDocument();
expect(checkbox).not.toBeChecked();
await act(() => userEvent.click(checkbox));
await userEvent.click(checkbox);
expect(checkbox).toBeChecked();
});

View file

@ -4,7 +4,7 @@ import AddFilter, {
} from 'components/Topics/Topic/Messages/Filters/AddFilter';
import { render } from 'lib/testHelpers';
import { MessageFilters } from 'components/Topics/Topic/Messages/Filters/Filters';
import { act, screen } from '@testing-library/react';
import { act, fireEvent, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
const filters: MessageFilters[] = [
@ -32,14 +32,12 @@ const renderComponent = (props: Partial<FilterModalProps> = {}) =>
describe('AddFilter component', () => {
describe('', () => {
beforeEach(async () => {
await act(() => {
beforeEach(() => {
renderComponent();
});
});
it('should test click on Saved Filters redirects to Saved components', () => {
userEvent.click(screen.getByRole('savedFilterText'));
it('should test click on Saved Filters redirects to Saved components', async () => {
await userEvent.click(screen.getByRole('savedFilterText'));
expect(screen.getByText('Saved Filters')).toBeInTheDocument();
expect(screen.getByRole('savedFilterText')).toBeInTheDocument();
});
@ -48,8 +46,8 @@ describe('AddFilter component', () => {
expect(screen.getByRole('button', { name: 'info' })).toBeInTheDocument();
});
it('renders InfoModal', () => {
userEvent.click(screen.getByRole('button', { name: 'info' }));
it('renders InfoModal', async () => {
await userEvent.click(screen.getByRole('button', { name: 'info' }));
expect(screen.getByRole('button', { name: 'Ok' })).toBeInTheDocument();
expect(
screen.getByRole('list', { name: 'info-list' })
@ -57,7 +55,7 @@ describe('AddFilter component', () => {
});
it('should test click on return to custom filter redirects to Saved Filters', async () => {
userEvent.click(screen.getByRole('savedFilterText'));
await userEvent.click(screen.getByRole('savedFilterText'));
expect(screen.queryByText('Saved filters')).not.toBeInTheDocument();
expect(screen.getByRole('savedFilterText')).toBeInTheDocument();
@ -66,10 +64,8 @@ describe('AddFilter component', () => {
describe('Add new filter', () => {
beforeEach(async () => {
await act(() => {
renderComponent();
});
});
it('adding new filter', async () => {
const codeValue = 'filter code';
@ -83,9 +79,10 @@ describe('AddFilter component', () => {
expect(addFilterBtn).toBeDisabled();
expect(screen.getByPlaceholderText('Enter Name')).toBeInTheDocument();
await act(() => {
userEvent.paste(codeTextBox, codeValue);
userEvent.type(nameTextBox, nameValue);
await act(async () => {
codeTextBox.focus();
await userEvent.paste(codeValue);
await userEvent.type(nameTextBox, nameValue);
});
expect(addFilterBtn).toBeEnabled();
@ -101,7 +98,10 @@ describe('AddFilter component', () => {
const addFilterBtn = screen.getByRole('button', { name: /Add filter/i });
expect(addFilterBtn).toBeDisabled();
expect(screen.getByPlaceholderText('Enter Name')).toBeInTheDocument();
await act(() => userEvent.paste(codeTextBox, code));
await act(async () => {
codeTextBox.focus();
await userEvent.paste(code);
});
expect(addFilterBtn).toBeEnabled();
expect(codeTextBox).toHaveValue(`${code}\n\n`);
});
@ -110,10 +110,10 @@ describe('AddFilter component', () => {
await act(() => {
renderComponent({ isSavedFiltersOpen: true });
});
userEvent.click(screen.getByText('Saved Filters'));
await userEvent.click(screen.getByText('Saved Filters'));
const index = 0;
const editButton = screen.getAllByText('Edit')[index];
userEvent.click(editButton);
await userEvent.click(editButton);
const { code, name } = filters[index];
expect(editFilterMock).toHaveBeenCalledTimes(1);
expect(editFilterMock).toHaveBeenCalledWith({
@ -133,14 +133,12 @@ describe('AddFilter component', () => {
const nameValue = 'filter name';
beforeEach(async () => {
await act(() => {
renderComponent({
await renderComponent({
addFilter: addFilterMock,
activeFilterHandler: activeFilterHandlerMock,
toggleIsOpen: toggleModelMock,
});
});
});
afterEach(() => {
addFilterMock.mockClear();
@ -150,12 +148,14 @@ describe('AddFilter component', () => {
describe('OnSubmit conditions with codeValue and nameValue in fields', () => {
beforeEach(async () => {
await act(() => {
userEvent.paste(
screen.getAllByRole('textbox')[0] as HTMLTextAreaElement,
codeValue
);
userEvent.type(screen.getAllByRole('textbox')[1], nameValue);
const textAreaElement = screen.getAllByRole(
'textbox'
)[0] as HTMLTextAreaElement;
const input = screen.getAllByRole('textbox')[1];
await act(async () => {
textAreaElement.focus();
await userEvent.paste(codeValue);
await userEvent.type(input, nameValue);
});
});
@ -166,16 +166,18 @@ describe('AddFilter component', () => {
});
expect(addFilterBtn).toBeEnabled();
await act(() => userEvent.click(addFilterBtn));
await act(async () => {
await userEvent.click(addFilterBtn);
});
expect(activeFilterHandlerMock).toHaveBeenCalled();
expect(addFilterMock).not.toHaveBeenCalled();
});
it('OnSubmit condition with checkbox on functionality', async () => {
await act(() => {
userEvent.click(screen.getByRole('checkbox'));
userEvent.click(screen.getAllByRole('button')[2]);
await act(async () => {
await userEvent.click(screen.getByRole('checkbox'));
await userEvent.click(screen.getAllByRole('button')[2]);
});
expect(activeFilterHandlerMock).not.toHaveBeenCalled();
@ -193,11 +195,15 @@ describe('AddFilter component', () => {
name: /Add filter/i,
});
await act(() => userEvent.clear(nameTextBox));
await act(async () => {
await userEvent.clear(nameTextBox);
});
expect(nameTextBox).toHaveValue('');
await act(() => userEvent.click(addFilterBtn));
await act(async () => {
await userEvent.click(addFilterBtn);
});
expect(activeFilterHandlerMock).toHaveBeenCalledTimes(1);
expect(activeFilterHandlerMock).toHaveBeenCalledWith(
@ -211,17 +217,25 @@ describe('AddFilter component', () => {
// get reset-ed
expect(codeTextBox).toHaveValue(``);
expect(toggleModelMock).toHaveBeenCalled();
await act(() => userEvent.paste(codeTextBox, codeValue));
codeTextBox.focus();
await act(async () => {
await userEvent.paste(codeValue);
});
expect(codeTextBox).toHaveValue(`${codeValue}\n\n`);
await act(() => userEvent.click(checkbox));
await act(async () => {
await userEvent.click(checkbox);
});
expect(addFilterBtn).toBeDisabled();
await act(() => userEvent.type(nameTextBox, nameValue));
await act(async () => {
await userEvent.type(nameTextBox, nameValue);
});
expect(nameTextBox).toHaveValue(nameValue);
expect(addFilterBtn).toBeEnabled();
await act(() => userEvent.click(addFilterBtn));
await act(async () => {
await userEvent.click(addFilterBtn);
});
expect(activeFilterHandlerMock).toHaveBeenCalledTimes(1);
expect(addFilterMock).toHaveBeenCalledWith({
@ -238,16 +252,23 @@ describe('AddFilter component', () => {
)[0] as HTMLTextAreaElement;
const nameTextBox = screen.getAllByRole('textbox')[1];
const addFilterBtn = screen.getByRole('button', { name: /Add filter/i });
await act(() => {
userEvent.clear(nameTextBox);
userEvent.clear(codeTextBox);
userEvent.paste(codeTextBox, longCodeValue);
act(() => {
// await userEvent.clear(nameTextBox);
// codeTextBox.focus();
// await userEvent.clear(codeTextBox);
fireEvent.input(nameTextBox, {
inputType: '',
});
fireEvent.input(codeTextBox, {
inputType: '',
});
});
codeTextBox.focus();
await userEvent.paste(longCodeValue);
expect(nameTextBox).toHaveValue('');
expect(codeTextBox).toHaveValue(`${longCodeValue}\n\n`);
await act(() => userEvent.click(addFilterBtn));
await userEvent.click(addFilterBtn);
const filterName = `${longCodeValue.slice(0, 16)}...`;

View file

@ -35,7 +35,7 @@ describe('EditFilter component', () => {
await act(() => {
renderComponent({ toggleEditModal });
});
userEvent.click(screen.getByRole('button', { name: /Cancel/i }));
await userEvent.click(screen.getByRole('button', { name: /Cancel/i }));
expect(toggleEditModal).toHaveBeenCalledTimes(1);
});
@ -43,16 +43,16 @@ describe('EditFilter component', () => {
const toggleEditModal = jest.fn();
const editSavedFilter = jest.fn();
await act(() => {
renderComponent({ toggleEditModal, editSavedFilter });
});
await renderComponent({ toggleEditModal, editSavedFilter });
const inputs = screen.getAllByRole('textbox');
const textAreaElement = inputs[0] as HTMLTextAreaElement;
const inputNameElement = inputs[1];
await act(() => {
userEvent.paste(textAreaElement, 'edited code');
userEvent.type(inputNameElement, 'edited name');
await act(async () => {
textAreaElement.focus();
await userEvent.paste('edited code');
textAreaElement.focus();
await userEvent.type(inputNameElement, 'edited name');
fireEvent.submit(screen.getByRole('form'));
});
expect(toggleEditModal).toHaveBeenCalledTimes(1);

View file

@ -32,9 +32,9 @@ describe('FilterModal component', () => {
screen.getByRole('heading', { name: /add filter/i, level: 3 })
).toBeInTheDocument();
});
it('renders component with edit filter modal', () => {
userEvent.click(screen.getByRole('savedFilterText'));
userEvent.click(screen.getByText('Edit'));
it('renders component with edit filter modal', async () => {
await userEvent.click(screen.getByRole('savedFilterText'));
await userEvent.click(screen.getByText('Edit'));
expect(
screen.getByRole('heading', { name: /edit saved filter/i, level: 3 })
).toBeInTheDocument();

View file

@ -92,17 +92,17 @@ describe('Filters component', () => {
});
});
it('search input', () => {
it('search input', async () => {
const searchInput = screen.getByPlaceholderText('Search');
expect(searchInput).toHaveValue('');
userEvent.type(searchInput, inputValue);
await userEvent.type(searchInput, inputValue);
expect(searchInput).toHaveValue(inputValue);
});
it('offset input', () => {
it('offset input', async () => {
const offsetInput = screen.getByPlaceholderText('Offset');
expect(offsetInput).toHaveValue('');
userEvent.type(offsetInput, inputValue);
await userEvent.type(offsetInput, inputValue);
expect(offsetInput).toHaveValue(inputValue);
});
@ -110,10 +110,12 @@ describe('Filters component', () => {
const seekTypeSelect = screen.getAllByRole('listbox');
const option = screen.getAllByRole('option');
await act(() => userEvent.click(seekTypeSelect[0]));
await act(async () => {
await userEvent.click(seekTypeSelect[0]);
});
await act(() => {
userEvent.selectOptions(seekTypeSelect[0], ['Timestamp']);
await act(async () => {
await userEvent.selectOptions(seekTypeSelect[0], ['Timestamp']);
});
expect(option[0]).toHaveTextContent('Timestamp');
@ -142,26 +144,28 @@ describe('Filters component', () => {
options = screen.getAllByRole('option');
});
it('seekType select', () => {
it('seekType select', async () => {
expect(options[0]).toHaveTextContent('Offset');
userEvent.click(seekTypeSelects[0]);
userEvent.selectOptions(seekTypeSelects[0], [mockTypeOptionSelectLabel]);
await userEvent.click(seekTypeSelects[0]);
await userEvent.selectOptions(seekTypeSelects[0], [
mockTypeOptionSelectLabel,
]);
expect(options[0]).toHaveTextContent(mockTypeOptionSelectLabel);
expect(screen.getByText('Submit')).toBeInTheDocument();
});
it('seekDirection select', () => {
userEvent.click(seekTypeSelects[3]);
userEvent.selectOptions(seekTypeSelects[3], [
it('seekDirection select', async () => {
await userEvent.click(seekTypeSelects[3]);
await userEvent.selectOptions(seekTypeSelects[3], [
mockDirectionOptionSelectLabel,
]);
expect(options[3]).toHaveTextContent(mockDirectionOptionSelectLabel);
});
});
it('stop loading when live mode is active', () => {
it('stop loading when live mode is active', async () => {
renderComponent();
userEvent.click(screen.getByText('Stop loading'));
await userEvent.click(screen.getByText('Stop loading'));
const option = screen.getAllByRole('option');
expect(option[3]).toHaveTextContent('Oldest First');
expect(screen.getByText('Submit')).toBeInTheDocument();
@ -169,13 +173,13 @@ describe('Filters component', () => {
it('renders addFilter modal', async () => {
renderComponent();
await act(() =>
userEvent.click(
await act(async () => {
await userEvent.click(
screen.getByRole('button', {
name: /add filters/i,
})
)
);
});
expect(screen.getByTestId('messageFilterModal')).toBeInTheDocument();
});
@ -183,13 +187,13 @@ describe('Filters component', () => {
beforeEach(async () => {
renderComponent();
await act(() =>
userEvent.click(
await act(async () => {
await userEvent.click(
screen.getByRole('button', {
name: /add filters/i,
})
)
);
});
const filterName = 'filter name';
const filterCode = 'filter code';
@ -201,22 +205,23 @@ describe('Filters component', () => {
const textAreaElement = textBoxElements[0] as HTMLTextAreaElement;
const inputNameElement = textBoxElements[1];
await act(() => {
userEvent.paste(textAreaElement, filterName);
userEvent.type(inputNameElement, filterCode);
await act(async () => {
textAreaElement.focus();
await userEvent.paste(filterName);
await userEvent.type(inputNameElement, filterCode);
});
expect(textAreaElement.value).toEqual(`${filterName}\n\n`);
expect(inputNameElement).toHaveValue(filterCode);
await act(() =>
userEvent.click(
await act(async () => {
await userEvent.click(
within(messageFilterModal).getByRole('button', {
name: /add filter/i,
})
)
);
});
});
it('shows saved smart filter', () => {
expect(screen.getByTestId('activeSmartFilter')).toBeInTheDocument();
@ -225,7 +230,9 @@ describe('Filters component', () => {
it('delete the active smart Filter', async () => {
const smartFilterElement = screen.getByTestId('activeSmartFilter');
const deleteIcon = within(smartFilterElement).getByText('mock-CloseIcon');
await act(() => userEvent.click(deleteIcon));
await act(async () => {
await userEvent.click(deleteIcon);
});
const anotherSmartFilterElement =
screen.queryByTestId('activeSmartFilter');

View file

@ -5,10 +5,10 @@ import React from 'react';
import InfoModal from 'components/Topics/Topic/Messages/Filters/InfoModal';
describe('InfoModal component', () => {
it('closes InfoModal', () => {
it('closes InfoModal', async () => {
const toggleInfoModal = jest.fn();
render(<InfoModal toggleIsOpen={toggleInfoModal} />);
userEvent.click(screen.getByRole('button', { name: 'Ok' }));
await userEvent.click(screen.getByRole('button', { name: 'Ok' }));
expect(toggleInfoModal).toHaveBeenCalledTimes(1);
});
});

View file

@ -3,12 +3,7 @@ import SavedFilters, {
Props,
} from 'components/Topics/Topic/Messages/Filters/SavedFilters';
import { MessageFilters } from 'components/Topics/Topic/Messages/Filters/Filters';
import {
screen,
waitFor,
waitForElementToBeRemoved,
within,
} from '@testing-library/react';
import { screen, waitFor, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { render } from 'lib/testHelpers';
@ -35,17 +30,17 @@ describe('SavedFilter Component', () => {
const getSavedFilters = () => screen.getAllByRole('savedFilter');
it('should check the Cancel button click', () => {
it('should check the Cancel button click', async () => {
const cancelMock = jest.fn();
setUpComponent({ closeModal: cancelMock });
userEvent.click(screen.getByText(/cancel/i));
await userEvent.click(screen.getByText(/cancel/i));
expect(cancelMock).toHaveBeenCalled();
});
it('should check on go back button click', () => {
it('should check on go back button click', async () => {
const onGoBackMock = jest.fn();
setUpComponent({ onGoBack: onGoBackMock });
userEvent.click(screen.getByText(/back to create filters/i));
await userEvent.click(screen.getByText(/back to create filters/i));
expect(onGoBackMock).toHaveBeenCalled();
});
@ -84,26 +79,26 @@ describe('SavedFilter Component', () => {
expect(screen.getByText(mockFilters[1].name)).toBeInTheDocument();
});
it('should check the Filter edit Button works', () => {
it('should check the Filter edit Button works', async () => {
const savedFilters = getSavedFilters();
userEvent.hover(savedFilters[0]);
userEvent.click(within(savedFilters[0]).getByText(/edit/i));
await userEvent.hover(savedFilters[0]);
await userEvent.click(within(savedFilters[0]).getByText(/edit/i));
expect(onEditMock).toHaveBeenCalled();
userEvent.hover(savedFilters[1]);
userEvent.click(within(savedFilters[1]).getByText(/edit/i));
await userEvent.hover(savedFilters[1]);
await userEvent.click(within(savedFilters[1]).getByText(/edit/i));
expect(onEditMock).toHaveBeenCalledTimes(2);
});
it('should check the select filter', () => {
it('should check the select filter', async () => {
const selectFilterButton = screen.getByText(/Select filter/i);
userEvent.click(selectFilterButton);
await userEvent.click(selectFilterButton);
expect(activeFilterMock).not.toHaveBeenCalled();
const savedFilterElement = getSavedFilters();
userEvent.click(savedFilterElement[0]);
userEvent.click(selectFilterButton);
await userEvent.click(savedFilterElement[0]);
await userEvent.click(selectFilterButton);
expect(activeFilterMock).toHaveBeenCalled();
expect(cancelMock).toHaveBeenCalled();
@ -121,12 +116,12 @@ describe('SavedFilter Component', () => {
deleteMock.mockClear();
});
it('Open Confirmation for the deletion modal', () => {
it('Open Confirmation for the deletion modal', async () => {
setUpComponent({ deleteFilter: deleteMock });
const savedFilters = getSavedFilters();
const deleteIcons = screen.getAllByText('mock-DeleteIcon');
userEvent.hover(savedFilters[0]);
userEvent.click(deleteIcons[0]);
await userEvent.hover(savedFilters[0]);
await userEvent.click(deleteIcons[0]);
const modelDialog = screen.getByRole('dialog');
expect(modelDialog).toBeInTheDocument();
expect(
@ -139,8 +134,8 @@ describe('SavedFilter Component', () => {
const savedFilters = getSavedFilters();
const deleteIcons = screen.getAllByText('mock-DeleteIcon');
userEvent.hover(savedFilters[0]);
userEvent.click(deleteIcons[0]);
await userEvent.hover(savedFilters[0]);
await userEvent.click(deleteIcons[0]);
const modelDialog = screen.getByRole('dialog');
expect(modelDialog).toBeInTheDocument();
@ -156,14 +151,13 @@ describe('SavedFilter Component', () => {
const savedFilters = getSavedFilters();
const deleteIcons = screen.getAllByText('mock-DeleteIcon');
userEvent.hover(savedFilters[0]);
userEvent.click(deleteIcons[0]);
await userEvent.hover(savedFilters[0]);
await userEvent.click(deleteIcons[0]);
await waitFor(() =>
userEvent.click(screen.getByRole('button', { name: 'Confirm' }))
);
expect(screen.queryByRole('dialog')).toBeInTheDocument();
await userEvent.click(screen.getByRole('button', { name: 'Confirm' }));
expect(deleteMock).toHaveBeenCalledTimes(1);
await waitForElementToBeRemoved(() => screen.queryByRole('dialog'));
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
});
});
});

View file

@ -50,9 +50,9 @@ describe('MessageContent screen', () => {
});
describe('when switched to display the key', () => {
it('makes key tab active', () => {
it('makes key tab active', async () => {
const keyTab = screen.getAllByText('Key');
userEvent.click(keyTab[0]);
await userEvent.click(keyTab[0]);
expect(keyTab[0]).toHaveStyleRule(
'background-color',
theme.secondaryTab.backgroundColor.active
@ -61,8 +61,8 @@ describe('MessageContent screen', () => {
});
describe('when switched to display the headers', () => {
it('makes headers tab active', () => {
userEvent.click(screen.getByText('Headers'));
it('makes Headers tab active', async () => {
await userEvent.click(screen.getByText('Headers'));
expect(screen.getByText('Headers')).toHaveStyleRule(
'background-color',
theme.secondaryTab.backgroundColor.active
@ -71,9 +71,9 @@ describe('MessageContent screen', () => {
});
describe('when switched to display the value', () => {
it('makes value tab active', () => {
it('makes value tab active', async () => {
const contentTab = screen.getAllByText('Value');
userEvent.click(contentTab[0]);
await userEvent.click(contentTab[0]);
expect(contentTab[0]).toHaveStyleRule(
'background-color',
theme.secondaryTab.backgroundColor.active

View file

@ -66,24 +66,24 @@ describe('Message component', () => {
).not.toBeInTheDocument();
});
it('should check the dropdown being visible during hover', () => {
it('should check the dropdown being visible during hover', async () => {
renderComponent();
const text = 'Save as a file';
const trElement = screen.getByRole('row');
expect(screen.queryByText(text)).not.toBeInTheDocument();
userEvent.hover(trElement);
await userEvent.hover(trElement);
expect(screen.getByText(text)).toBeInTheDocument();
userEvent.unhover(trElement);
await userEvent.unhover(trElement);
expect(screen.queryByText(text)).not.toBeInTheDocument();
});
it('should check open Message Content functionality', () => {
it('should check open Message Content functionality', async () => {
renderComponent();
const messageToggleIcon = screen.getByRole('button', { hidden: true });
expect(screen.queryByText(messageContentText)).not.toBeInTheDocument();
userEvent.click(messageToggleIcon);
await userEvent.click(messageToggleIcon);
expect(screen.getByText(messageContentText)).toBeInTheDocument();
});
});

View file

@ -57,24 +57,24 @@ describe('Messages', () => {
);
const labelValue1 = SeekDirectionOptions[1].label;
userEvent.click(seekDirectionSelect);
userEvent.selectOptions(seekDirectionSelect, [labelValue1]);
await userEvent.click(seekDirectionSelect);
await userEvent.selectOptions(seekDirectionSelect, [labelValue1]);
expect(seekDirectionOption).toHaveTextContent(labelValue1);
const labelValue0 = SeekDirectionOptions[0].label;
userEvent.click(seekDirectionSelect);
userEvent.selectOptions(seekDirectionSelect, [labelValue0]);
await userEvent.click(seekDirectionSelect);
await userEvent.selectOptions(seekDirectionSelect, [labelValue0]);
expect(seekDirectionOption).toHaveTextContent(labelValue0);
const liveOptionConf = SeekDirectionOptions[2];
const labelValue2 = liveOptionConf.label;
userEvent.click(seekDirectionSelect);
await userEvent.click(seekDirectionSelect);
const liveModeLi = screen.getByRole(
(role, element) =>
role === 'option' &&
element?.getAttribute('value') === liveOptionConf.value
);
userEvent.selectOptions(seekDirectionSelect, [liveModeLi]);
await userEvent.selectOptions(seekDirectionSelect, [liveModeLi]);
expect(seekDirectionOption).toHaveTextContent(labelValue2);
await waitFor(() => {

View file

@ -109,14 +109,14 @@ describe('Overview', () => {
});
describe('when Clear Messages is clicked', () => {
it('should when Clear Messages is clicked', () => {
it('should when Clear Messages is clicked', async () => {
renderComponent({
...externalTopicPayload,
cleanUpPolicy: CleanUpPolicy.DELETE,
});
const clearMessagesButton = screen.getByText('Clear Messages');
userEvent.click(clearMessagesButton);
await userEvent.click(clearMessagesButton);
expect(uwrapMock).toHaveBeenCalledTimes(1);
});
});

View file

@ -1,6 +1,6 @@
import React from 'react';
import SendMessage from 'components/Topics/Topic/SendMessage/SendMessage';
import { act, screen, waitFor } from '@testing-library/react';
import { screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { render, WithRoute } from 'lib/testHelpers';
import { clusterTopicPath } from 'lib/paths';
@ -47,32 +47,26 @@ const mockOnSubmit = jest.fn();
const renderComponent = async () => {
const path = clusterTopicPath(clusterName, topicName);
await act(() => {
render(
await render(
<WithRoute path={clusterTopicPath()}>
<SendMessage onSubmit={mockOnSubmit} />
</WithRoute>,
{ initialEntries: [path] }
);
});
};
const renderAndSubmitData = async (error: string[] = []) => {
await renderComponent();
await act(() => {
userEvent.click(screen.getAllByRole('listbox')[0]);
});
await act(() => {
userEvent.click(screen.getAllByRole('option')[1]);
});
await userEvent.click(screen.getAllByRole('listbox')[0]);
await userEvent.click(screen.getAllByRole('option')[1]);
(validateBySchema as Mock).mockImplementation(() => error);
const submitButton = screen.getByRole('button', {
name: 'Produce Message',
});
await waitFor(() => expect(submitButton).toBeEnabled());
await act(() => {
userEvent.click(submitButton);
});
await userEvent.click(submitButton);
};
describe('SendMessage', () => {

View file

@ -50,10 +50,10 @@ describe('Metrics', () => {
renderComponent();
});
it('renders Stop Analysis button', () => {
it('renders Stop Analysis button', async () => {
const btn = screen.getByRole('button', { name: 'Stop Analysis' });
expect(btn).toBeInTheDocument();
userEvent.click(btn);
await userEvent.click(btn);
expect(cancelMock).toHaveBeenCalled();
});
@ -95,9 +95,9 @@ describe('Metrics', () => {
expect(btns.length).toEqual(2);
expect(screen.queryByText('Partition stats')).not.toBeInTheDocument();
userEvent.click(btns[0]);
await userEvent.click(btns[0]);
expect(screen.getAllByText('Partition stats').length).toEqual(1);
userEvent.click(btns[1]);
await userEvent.click(btns[1]);
expect(screen.getAllByText('Partition stats').length).toEqual(2);
});
});

View file

@ -1,5 +1,5 @@
import React from 'react';
import { act, screen, waitFor } from '@testing-library/react';
import { screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import ClusterContext from 'components/contexts/ClusterContext';
import Details from 'components/Topics/Topic/Topic';
@ -110,17 +110,17 @@ describe('Details', () => {
});
describe('when remove topic modal is open', () => {
beforeEach(() => {
beforeEach(async () => {
renderComponent();
const openModalButton = screen.getAllByText('Remove Topic')[0];
userEvent.click(openModalButton);
await userEvent.click(openModalButton);
});
it('calls deleteTopic on confirm', async () => {
const submitButton = screen.getAllByRole('button', {
name: 'Confirm',
})[0];
await act(() => userEvent.click(submitButton));
await userEvent.click(submitButton);
expect(mockDelete).toHaveBeenCalledWith(topic.name);
});
it('closes the modal when cancel button is clicked', async () => {
@ -134,7 +134,7 @@ describe('Details', () => {
beforeEach(async () => {
await renderComponent();
const confirmButton = screen.getAllByText('Clear messages')[0];
await act(() => userEvent.click(confirmButton));
await userEvent.click(confirmButton);
});
it('it calls clearTopicMessages on confirm', async () => {
@ -154,10 +154,10 @@ describe('Details', () => {
});
describe('when edit settings is clicked', () => {
it('redirects to the edit page', () => {
it('redirects to the edit page', async () => {
renderComponent();
const button = screen.getAllByText('Edit settings')[0];
userEvent.click(button);
await userEvent.click(button);
expect(mockNavigate).toHaveBeenCalledWith(clusterTopicEditRelativePath);
});
});
@ -169,24 +169,24 @@ describe('Details', () => {
const submitDeleteButton = screen.getByRole('button', {
name: 'Confirm',
});
await act(() => userEvent.click(submitDeleteButton));
await userEvent.click(submitDeleteButton);
expect(mockNavigate).toHaveBeenCalledWith('../..');
});
it('shows a confirmation popup on deleting topic messages', () => {
it('shows a confirmation popup on deleting topic messages', async () => {
renderComponent();
const clearMessagesButton = screen.getAllByText(/Clear messages/i)[0];
userEvent.click(clearMessagesButton);
await userEvent.click(clearMessagesButton);
expect(
screen.getByText(/Are you sure want to clear topic messages?/i)
).toBeInTheDocument();
});
it('shows a confirmation popup on recreating topic', () => {
it('shows a confirmation popup on recreating topic', async () => {
renderComponent();
const recreateTopicButton = screen.getByText(/Recreate topic/i);
userEvent.click(recreateTopicButton);
await userEvent.click(recreateTopicButton);
expect(
screen.getByText(/Are you sure want to recreate topic?/i)
).toBeInTheDocument();
@ -195,19 +195,19 @@ describe('Details', () => {
it('is calling recreation function after click on Submit button', async () => {
renderComponent();
const recreateTopicButton = screen.getByText(/Recreate topic/i);
userEvent.click(recreateTopicButton);
await userEvent.click(recreateTopicButton);
const confirmBtn = screen.getByRole('button', { name: /Confirm/i });
await waitFor(() => userEvent.click(confirmBtn));
expect(mockRecreate).toBeCalledTimes(1);
});
it('closes popup confirmation window after click on Cancel button', () => {
it('closes popup confirmation window after click on Cancel button', async () => {
renderComponent();
const recreateTopicButton = screen.getByText(/Recreate topic/i);
userEvent.click(recreateTopicButton);
await userEvent.click(recreateTopicButton);
const cancelBtn = screen.getByRole('button', { name: /cancel/i });
userEvent.click(cancelBtn);
await userEvent.click(cancelBtn);
expect(
screen.queryByText(/Are you sure want to recreate topic?/i)
).not.toBeInTheDocument();

View file

@ -57,7 +57,7 @@ describe('CustomParamsField', () => {
});
describe('core functionality works', () => {
it('click on button triggers remove', () => {
it('click on button triggers remove', async () => {
setupComponent({
field,
isDisabled,
@ -66,11 +66,11 @@ describe('CustomParamsField', () => {
existingFields,
setExistingFields,
});
userEvent.click(screen.getByRole('button'));
await userEvent.click(screen.getByRole('button'));
expect(remove).toHaveBeenCalledTimes(1);
});
it('pressing space on button triggers remove', () => {
it('pressing space on button triggers remove', async () => {
setupComponent({
field,
isDisabled,
@ -79,7 +79,7 @@ describe('CustomParamsField', () => {
existingFields,
setExistingFields,
});
userEvent.type(screen.getByRole('button'), SPACE_KEY);
await userEvent.type(screen.getByRole('button'), SPACE_KEY);
// userEvent.type triggers remove two times as at first it clicks on element and then presses space
expect(remove).toHaveBeenCalledTimes(2);
});

View file

@ -11,10 +11,10 @@ import { TOPIC_CUSTOM_PARAMS } from 'lib/constants';
import { defaultValues } from './fixtures';
const selectOption = async (listbox: HTMLElement, option: string) => {
await act(() => {
userEvent.click(listbox);
await act(async () => {
await userEvent.click(listbox);
});
userEvent.click(screen.getByText(option));
await userEvent.click(screen.getByText(option));
};
const expectOptionIsSelected = (listbox: HTMLElement, option: string) => {
@ -28,7 +28,9 @@ const expectOptionAvailability = async (
option: string,
disabled: boolean
) => {
await act(() => userEvent.click(listbox));
await act(async () => {
await userEvent.click(listbox);
});
const selectedOptions = within(listbox).getAllByText(option).reverse();
// its either two or one nodes, we only need last one
const selectedOption = selectedOptions[0];
@ -43,7 +45,9 @@ const expectOptionAvailability = async (
'cursor',
disabled ? 'not-allowed' : 'pointer'
);
await act(() => userEvent.click(listbox));
await act(async () => {
await userEvent.click(listbox);
});
};
const renderComponent = (props: CustomParamsProps, defaults = {}) => {
@ -85,7 +89,9 @@ describe('CustomParams', () => {
beforeEach(async () => {
renderComponent({ isSubmitting: false });
button = screen.getByRole('button');
await act(() => userEvent.click(button));
await act(async () => {
await userEvent.click(button);
});
});
it('button click creates custom param fieldset', async () => {
@ -120,8 +126,12 @@ describe('CustomParams', () => {
});
it('multiple button clicks create multiple fieldsets', async () => {
await act(() => userEvent.click(button));
await act(() => userEvent.click(button));
await act(async () => {
await userEvent.click(button);
});
await act(async () => {
await userEvent.click(button);
});
const listboxes = screen.getAllByRole('listbox');
expect(listboxes.length).toBe(3);
@ -131,7 +141,9 @@ describe('CustomParams', () => {
});
it("can't select already selected option", async () => {
await act(() => userEvent.click(button));
await act(async () => {
await userEvent.click(button);
});
const listboxes = screen.getAllByRole('listbox');
@ -144,8 +156,12 @@ describe('CustomParams', () => {
});
it('when fieldset with selected custom property type is deleted disabled options update correctly', async () => {
await act(() => userEvent.click(button));
await act(() => userEvent.click(button));
await act(async () => {
await userEvent.click(button);
});
await act(async () => {
await userEvent.click(button);
});
const listboxes = screen.getAllByRole('listbox');
@ -172,7 +188,9 @@ describe('CustomParams', () => {
const deleteSecondFieldsetButton = screen.getByTitle(
'Delete customParam field 1'
);
await act(() => userEvent.click(deleteSecondFieldsetButton));
await act(async () => {
await userEvent.click(deleteSecondFieldsetButton);
});
expect(secondListbox).not.toBeInTheDocument();
await expectOptionAvailability(

View file

@ -46,9 +46,9 @@ describe('TimeToRetainBtn', () => {
);
expect(buttonElement).toHaveStyle(`border:none`);
});
it('should test the non active state with click becoming active', () => {
it('should test the non active state with click becoming active', async () => {
const buttonElement = screen.getByRole('button');
userEvent.click(buttonElement);
await userEvent.click(buttonElement);
expect(buttonElement).toHaveStyle(
`background-color:${theme.button.secondary.invertedColors.normal}`
);

View file

@ -67,14 +67,17 @@ describe('TopicForm', () => {
onSubmit: onSubmit.mockImplementation((e) => e.preventDefault()),
});
await act(() => {
userEvent.type(screen.getByPlaceholderText('Topic Name'), 'topicName');
await act(async () => {
await userEvent.type(
screen.getByPlaceholderText('Topic Name'),
'topicName'
);
});
await act(() => {
fireEvent.submit(screen.getByLabelText('topic form'));
});
userEvent.click(screen.getByRole('button', { name: 'Create topic' }));
await userEvent.click(screen.getByRole('button', { name: 'Create topic' }));
expect(onSubmit).toBeCalledTimes(1);
});
});

View file

@ -42,7 +42,7 @@ describe('App', () => {
).toBeInTheDocument();
});
it('handle burger click correctly', () => {
it('handle burger click correctly', async () => {
const burger = within(screen.getByLabelText('Page Header')).getByRole(
'button',
burgerButtonOptions
@ -52,7 +52,7 @@ describe('App', () => {
expect(overlay).toBeInTheDocument();
expect(overlay).toHaveStyleRule('visibility: hidden');
expect(burger).toHaveStyleRule('display: none');
userEvent.click(burger);
await userEvent.click(burger);
expect(overlay).toHaveStyleRule('visibility: visible');
});

View file

@ -26,9 +26,9 @@ describe('Alert', () => {
expect(screen.getByRole('contentinfo')).toHaveTextContent(message);
expect(getButton()).toBeInTheDocument();
});
it('handles dismiss callback', () => {
it('handles dismiss callback', async () => {
setupComponent();
userEvent.click(getButton());
await userEvent.click(getButton());
expect(dismiss).toHaveBeenCalled();
});
});

View file

@ -25,17 +25,17 @@ describe('Custom Input', () => {
describe('number', () => {
const getInput = () => screen.getByRole('spinbutton');
it('allows user to type only numbers', () => {
it('allows user to type only numbers', async () => {
render(setupWrapper({ type: 'number' }));
const input = getInput();
userEvent.type(input, 'abc131');
await userEvent.type(input, 'abc131');
expect(input).toHaveValue(131);
});
it('allows negative values', () => {
it('allows negative values', async () => {
render(setupWrapper({ type: 'number' }));
const input = getInput();
userEvent.type(input, '-2');
await userEvent.type(input, '-2');
expect(input).toHaveValue(-2);
});
});

View file

@ -11,7 +11,6 @@ import { screen, waitFor } from '@testing-library/dom';
import { ColumnDef, Row } from '@tanstack/react-table';
import userEvent from '@testing-library/user-event';
import { formatTimestamp } from 'lib/dateTimeHelpers';
import { act } from '@testing-library/react';
import { ConnectorState, ConsumerGroupState } from 'generated-sources';
const mockedUsedNavigate = jest.fn();
@ -155,15 +154,15 @@ describe('Table', () => {
});
describe('ExpanderCell', () => {
it('renders button', () => {
it('renders button', async () => {
renderComponent({ getRowCanExpand: () => true });
const btns = screen.getAllByRole('button', { name: 'Expand row' });
expect(btns.length).toEqual(data.length);
expect(screen.queryByText('I am expanded row')).not.toBeInTheDocument();
userEvent.click(btns[2]);
await userEvent.click(btns[2]);
expect(screen.getByText('I am expanded row')).toBeInTheDocument();
userEvent.click(btns[0]);
await userEvent.click(btns[0]);
expect(screen.getAllByText('I am expanded row').length).toEqual(2);
});
@ -213,20 +212,20 @@ describe('Table', () => {
expect(lastBtn).toBeInTheDocument();
expect(lastBtn).toBeEnabled();
userEvent.click(nextBtn);
await userEvent.click(nextBtn);
expect(screen.getByText('ipsum')).toBeInTheDocument();
expect(prevBtn).toBeEnabled();
expect(firstBtn).toBeEnabled();
userEvent.click(lastBtn);
await userEvent.click(lastBtn);
expect(screen.getByText('sit')).toBeInTheDocument();
expect(lastBtn).toBeDisabled();
expect(nextBtn).toBeDisabled();
userEvent.click(prevBtn);
await userEvent.click(prevBtn);
expect(screen.getByText('dolor')).toBeInTheDocument();
userEvent.click(firstBtn);
await userEvent.click(firstBtn);
expect(screen.getByText('lorem')).toBeInTheDocument();
});
@ -243,22 +242,22 @@ describe('Table', () => {
expect(goToPage).toBeInTheDocument();
expect(goToPage).toHaveValue(1);
});
it('updates page on Go To page change', () => {
it('updates page on Go To page change', async () => {
const goToPage = getGoToPageInput();
userEvent.clear(goToPage);
userEvent.type(goToPage, '2');
await userEvent.clear(goToPage);
await userEvent.type(goToPage, '2');
expect(goToPage).toHaveValue(2);
expect(screen.getByText('ipsum')).toBeInTheDocument();
});
it('does not update page on Go To page change if page is out of range', () => {
it('does not update page on Go To page change if page is out of range', async () => {
const goToPage = getGoToPageInput();
userEvent.type(goToPage, '5');
await userEvent.type(goToPage, '5');
expect(goToPage).toHaveValue(15);
expect(screen.getByText('No rows found')).toBeInTheDocument();
});
it('does not update page on Go To page change if page is not a number', () => {
it('does not update page on Go To page change if page is not a number', async () => {
const goToPage = getGoToPageInput();
userEvent.type(goToPage, 'abc');
await userEvent.type(goToPage, 'abc');
expect(goToPage).toHaveValue(1);
});
});
@ -266,12 +265,10 @@ describe('Table', () => {
describe('Sorting', () => {
it('sort rows', async () => {
await act(() =>
renderComponent({
await renderComponent({
path: '/?sortBy=text&&sortDirection=desc',
enableSorting: true,
})
);
});
expect(screen.getAllByRole('row').length).toEqual(data.length + 1);
const th = screen.getByRole('columnheader', { name: 'Text' });
expect(th).toBeInTheDocument();
@ -319,42 +316,42 @@ describe('Table', () => {
expect(checkboxes[4]).toBeDisabled();
});
it('renders action bar', () => {
it('renders action bar', async () => {
expect(screen.getAllByRole('row').length).toEqual(data.length + 1);
expect(screen.queryByText('I am Action Bar')).not.toBeInTheDocument();
const checkboxes = screen.getAllByRole('checkbox');
expect(checkboxes.length).toEqual(data.length + 1);
userEvent.click(checkboxes[2]);
await userEvent.click(checkboxes[2]);
expect(screen.getByText('I am Action Bar')).toBeInTheDocument();
});
});
describe('Clickable Row', () => {
const onRowClick = jest.fn();
it('handles onRowClick', () => {
it('handles onRowClick', async () => {
renderComponent({ onRowClick });
const rows = screen.getAllByRole('row');
expect(rows.length).toEqual(data.length + 1);
userEvent.click(rows[1]);
await userEvent.click(rows[1]);
expect(onRowClick).toHaveBeenCalledTimes(1);
});
it('does nothing unless onRowClick is provided', () => {
it('does nothing unless onRowClick is provided', async () => {
renderComponent();
const rows = screen.getAllByRole('row');
expect(rows.length).toEqual(data.length + 1);
userEvent.click(rows[1]);
await userEvent.click(rows[1]);
});
it('does not handle onRowClick if enableRowSelection', () => {
it('does not handle onRowClick if enableRowSelection', async () => {
renderComponent({ onRowClick, enableRowSelection: true });
const rows = screen.getAllByRole('row');
expect(rows.length).toEqual(data.length + 1);
userEvent.click(rows[1]);
await userEvent.click(rows[1]);
expect(onRowClick).not.toHaveBeenCalled();
});
it('does not handle onRowClick if expandable rows', () => {
it('does not handle onRowClick if expandable rows', async () => {
renderComponent({ onRowClick, getRowCanExpand: () => true });
const rows = screen.getAllByRole('row');
expect(rows.length).toEqual(data.length + 1);
userEvent.click(rows[1]);
await userEvent.click(rows[1]);
expect(onRowClick).not.toHaveBeenCalled();
});
});

View file

@ -24,11 +24,11 @@ describe('Search', () => {
setSearchParamsMock,
]);
});
it('calls handleSearch on input', () => {
it('calls handleSearch on input', async () => {
render(<Search placeholder={placeholder} />);
const input = screen.getByPlaceholderText(placeholder);
userEvent.click(input);
userEvent.keyboard('value');
await userEvent.click(input);
await userEvent.keyboard('value');
expect(setSearchParamsMock).toHaveBeenCalledTimes(5);
});

View file

@ -36,29 +36,29 @@ describe('Custom Select', () => {
expect(getListbox()).toBeInTheDocument();
});
it('show select options when select is being clicked', () => {
it('show select options when select is being clicked', async () => {
expect(getOption()).toBeInTheDocument();
userEvent.click(getListbox());
await userEvent.click(getListbox());
expect(screen.getAllByRole('option')).toHaveLength(3);
});
it('checking select option change', () => {
it('checking select option change', async () => {
const optionLabel = 'test-label1';
userEvent.click(getListbox());
userEvent.selectOptions(getListbox(), [optionLabel]);
await userEvent.click(getListbox());
await userEvent.selectOptions(getListbox(), [optionLabel]);
expect(getOption()).toHaveTextContent(optionLabel);
});
it('trying to select disabled option does not trigger change', () => {
it('trying to select disabled option does not trigger change', async () => {
const normalOptionLabel = 'test-label1';
const disabledOptionLabel = 'test-label2';
userEvent.click(getListbox());
userEvent.selectOptions(getListbox(), [normalOptionLabel]);
userEvent.click(getListbox());
userEvent.selectOptions(getListbox(), [disabledOptionLabel]);
await userEvent.click(getListbox());
await userEvent.selectOptions(getListbox(), [normalOptionLabel]);
await userEvent.click(getListbox());
await userEvent.selectOptions(getListbox(), [disabledOptionLabel]);
expect(getOption()).toHaveTextContent(normalOptionLabel);
});

View file

@ -61,7 +61,7 @@ describe('TableHeaderCell', () => {
expect(title).toHaveStyle(`color: ${theme.table.th.color.active};`);
expect(title).toHaveStyle('cursor: pointer;');
});
it('renders click on title triggers handler', () => {
it('renders click on title triggers handler', async () => {
setupComponent({
title: testTitle,
orderBy: TopicColumnsToSort.NAME,
@ -69,11 +69,11 @@ describe('TableHeaderCell', () => {
handleOrderBy,
});
const title = within(getColumnHeader()).getByRole('button');
userEvent.click(title);
await userEvent.click(title);
expect(handleOrderBy.mock.calls.length).toBe(1);
});
it('renders space on title triggers handler', () => {
it('renders space on title triggers handler', async () => {
setupComponent({
title: testTitle,
orderBy: TopicColumnsToSort.NAME,
@ -81,30 +81,30 @@ describe('TableHeaderCell', () => {
handleOrderBy,
});
const title = within(getColumnHeader()).getByRole('button');
userEvent.type(title, SPACE_KEY);
await userEvent.type(title, SPACE_KEY);
// userEvent.type clicks and only then presses space
expect(handleOrderBy.mock.calls.length).toBe(2);
});
it('click on preview triggers handler', () => {
it('click on preview triggers handler', async () => {
setupComponent({
title: testTitle,
previewText: testPreviewText,
onPreview,
});
const preview = within(getColumnHeader()).getByRole('button');
userEvent.click(preview);
await userEvent.click(preview);
expect(onPreview.mock.calls.length).toBe(1);
});
it('click on preview triggers handler', () => {
it('click on preview triggers handler', async () => {
setupComponent({
title: testTitle,
previewText: testPreviewText,
onPreview,
});
const preview = within(getColumnHeader()).getByRole('button');
userEvent.type(preview, SPACE_KEY);
await userEvent.type(preview, SPACE_KEY);
expect(onPreview.mock.calls.length).toBe(2);
});