Skip to content

Commit

Permalink
[Cases] Reset selected cases when refreshing (#121867)
Browse files Browse the repository at this point in the history
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
  • Loading branch information
cnasikas and kibanamachine authored Dec 22, 2021
1 parent 90e9310 commit 89cdb47
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 7 deletions.
5 changes: 5 additions & 0 deletions x-pack/plugins/cases/public/common/test_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,8 @@ export async function waitForComponentToPaint<P = {}>(wrapper: ReactWrapper<P>,
wrapper.update();
});
}

export const waitForComponentToUpdate = async () =>
act(async () => {
return Promise.resolve();
});
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
import React from 'react';
import { mount } from 'enzyme';
import moment from 'moment-timezone';
import { act, waitFor } from '@testing-library/react';
import { act, render, waitFor, screen } from '@testing-library/react';
import { renderHook } from '@testing-library/react-hooks';
import userEvent from '@testing-library/user-event';

import '../../common/mock/match_media';
import { TestProviders } from '../../common/mock';
Expand All @@ -36,6 +37,7 @@ import { CasesColumns, GetCasesColumn, useCasesColumns } from './columns';
import { triggersActionsUiMock } from '../../../../triggers_actions_ui/public/mocks';
import { registerConnectorsToMockActionRegistry } from '../../common/mock/register_connectors';
import { createStartServicesMock } from '../../common/lib/kibana/kibana_react.mock';
import { waitForComponentToUpdate } from '../../common/test_utils';

jest.mock('../../containers/use_bulk_update_case');
jest.mock('../../containers/use_delete_cases');
Expand Down Expand Up @@ -777,4 +779,73 @@ describe('AllCasesListGeneric', () => {

expect(doRefresh).toHaveBeenCalled();
});

it('should deselect cases when refreshing', async () => {
useGetCasesMock.mockReturnValue({
...defaultGetCases,
selectedCases: [],
});

render(
<TestProviders>
<AllCasesList />
</TestProviders>
);

userEvent.click(screen.getByTestId('checkboxSelectAll'));
const checkboxes = await screen.findAllByRole('checkbox');

for (const checkbox of checkboxes) {
expect(checkbox).toBeChecked();
}

userEvent.click(screen.getByText('Refresh'));
for (const checkbox of checkboxes) {
expect(checkbox).not.toBeChecked();
}

waitForComponentToUpdate();
});

it('should deselect cases when changing filters', async () => {
useGetCasesMock.mockReturnValue({
...defaultGetCases,
selectedCases: [],
});

const { rerender } = render(
<TestProviders>
<AllCasesList />
</TestProviders>
);

/** Something really weird is going on and we have to rerender
* to get the correct html output. Not sure why.
*
* If you run the test alone the rerender is not needed.
* If you run the test along with the above test
* then you need the rerender
*/
rerender(
<TestProviders>
<AllCasesList />
</TestProviders>
);

userEvent.click(screen.getByTestId('checkboxSelectAll'));
const checkboxes = await screen.findAllByRole('checkbox');

for (const checkbox of checkboxes) {
expect(checkbox).toBeChecked();
}

userEvent.click(screen.getByTestId('case-status-filter'));
userEvent.click(screen.getByTestId('case-status-filter-closed'));

for (const checkbox of checkboxes) {
expect(checkbox).not.toBeChecked();
}

waitForComponentToUpdate();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -97,23 +97,30 @@ export const AllCasesList = React.memo<AllCasesListProps>(

const filterRefetch = useRef<() => void>();
const tableRef = useRef<EuiBasicTable>();
const [isLoading, handleIsLoading] = useState<boolean>(false);

const setFilterRefetch = useCallback(
(refetchFilter: () => void) => {
filterRefetch.current = refetchFilter;
},
[filterRefetch]
);
const [isLoading, handleIsLoading] = useState<boolean>(false);

const deselectCases = useCallback(() => {
setSelectedCases([]);
tableRef.current?.setSelection([]);
}, [setSelectedCases]);

const refreshCases = useCallback(
(dataRefresh = true) => {
deselectCases();
if (dataRefresh) refetchCases();
if (doRefresh) doRefresh();
setSelectedCases([]);
if (filterRefetch.current != null) {
filterRefetch.current();
}
},
[doRefresh, filterRefetch, refetchCases, setSelectedCases]
[deselectCases, doRefresh, refetchCases]
);

const tableOnChangeCallback = useCallback(
Expand Down Expand Up @@ -152,12 +159,11 @@ export const AllCasesList = React.memo<AllCasesListProps>(
setQueryParams({ sortField: SortFieldCase.createdAt });
}

setSelectedCases([]);
tableRef.current?.setSelection([]);
deselectCases();
setFilters(newFilterOptions);
refreshCases(false);
},
[setSelectedCases, setFilters, refreshCases, setQueryParams]
[deselectCases, setFilters, refreshCases, setQueryParams]
);

const showActions = userCanCrud && !isSelectorView;
Expand Down

0 comments on commit 89cdb47

Please sign in to comment.