Skip to content

Commit

Permalink
remove dispatchUpdateCaseProperty from getCases hook
Browse files Browse the repository at this point in the history
  • Loading branch information
Esteban Beltran committed Jun 3, 2022
1 parent 9280332 commit 9cd7cb6
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 154 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import { useGetCasesMetrics } from '../../containers/use_get_cases_metrics';
import { useGetActionLicense } from '../../containers/use_get_action_license';
import { useGetConnectors } from '../../containers/configure/use_connectors';
import { useGetTags } from '../../containers/use_get_tags';
import { useUpdateCase } from '../../containers/use_update_case';

jest.mock('../../containers/use_create_attachments');
jest.mock('../../containers/use_bulk_update_case');
Expand All @@ -53,6 +54,7 @@ jest.mock('../../common/navigation/hooks');
jest.mock('../app/use_available_owners', () => ({
useAvailableCasesOwners: () => ['securitySolution', 'observability'],
}));
jest.mock('../../containers/use_update_case');

const useDeleteCasesMock = useDeleteCases as jest.Mock;
const useGetCasesMock = useGetCases as jest.Mock;
Expand All @@ -65,6 +67,7 @@ const useGetReportersMock = useGetReporters as jest.Mock;
const useKibanaMock = useKibana as jest.MockedFunction<typeof useKibana>;
const useGetConnectorsMock = useGetConnectors as jest.Mock;
const useCreateAttachmentsMock = useCreateAttachments as jest.Mock;
const useUpdateCaseMock = useUpdateCase as jest.Mock;

const mockTriggersActionsUiService = triggersActionsUiMock.createStart();

Expand All @@ -80,7 +83,6 @@ const mockKibana = () => {
describe('AllCasesListGeneric', () => {
const dispatchResetIsDeleted = jest.fn();
const dispatchResetIsUpdated = jest.fn();
const dispatchUpdateCaseProperty = jest.fn();
const handleOnDeleteConfirm = jest.fn();
const handleToggleModal = jest.fn();
const refetchCases = jest.fn();
Expand All @@ -90,6 +92,8 @@ describe('AllCasesListGeneric', () => {
const updateBulkStatus = jest.fn();
const fetchCasesStatus = jest.fn();
const onRowClick = jest.fn();
const updateCaseProperty = jest.fn();

const emptyTag = getEmptyTagValue().props.children;
useCreateAttachmentsMock.mockReturnValue({
status: { isLoading: false },
Expand All @@ -98,7 +102,6 @@ describe('AllCasesListGeneric', () => {

const defaultGetCases = {
...useGetCasesMockState,
dispatchUpdateCaseProperty,
refetchCases,
setFilters,
setQueryParams,
Expand Down Expand Up @@ -146,7 +149,6 @@ describe('AllCasesListGeneric', () => {
href: jest.fn(),
onClick: jest.fn(),
},
dispatchUpdateCaseProperty: jest.fn,
filterStatus: CaseStatuses.open,
handleIsLoading: jest.fn(),
isLoadingCases: [],
Expand Down Expand Up @@ -177,6 +179,7 @@ describe('AllCasesListGeneric', () => {
fetchReporters: jest.fn(),
});
useGetConnectorsMock.mockImplementation(() => ({ data: connectorsMock, isLoading: false }));
useUpdateCaseMock.mockReturnValue({ updateCaseProperty });
mockKibana();
moment.tz.setDefault('UTC');
});
Expand Down Expand Up @@ -361,14 +364,12 @@ describe('AllCasesListGeneric', () => {

await waitFor(() => {
const firstCase = useGetCasesMockState.data.cases[0];
expect(dispatchUpdateCaseProperty.mock.calls[0][0]).toEqual(
expect.objectContaining({
caseId: firstCase.id,
updateKey: 'status',
updateValue: CaseStatuses.closed,
version: firstCase.version,
})
);
expect(updateCaseProperty).toHaveBeenCalledWith({
caseData: firstCase,
updateKey: 'status',
updateValue: CaseStatuses.closed,
onSuccess: expect.anything(),
});
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ export const AllCasesList = React.memo<AllCasesListProps>(

const {
data,
dispatchUpdateCaseProperty,
filterOptions,
loading,
queryParams,
Expand Down Expand Up @@ -167,7 +166,6 @@ export const AllCasesList = React.memo<AllCasesListProps>(
const showActions = userCanCrud && !isSelectorView;

const columns = useCasesColumns({
dispatchUpdateCaseProperty,
filterStatus: filterOptions.status,
handleIsLoading,
isLoadingCases: loading,
Expand Down
23 changes: 12 additions & 11 deletions x-pack/plugins/cases/public/components/all_cases/columns.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import {
import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services';
import styled from 'styled-components';

import { Case, DeleteCase } from '../../../common/ui/types';
import { Case, DeleteCase, UpdateByKey } from '../../../common/ui/types';
import { CaseStatuses, ActionConnector, CaseSeverity } from '../../../common/api';
import { OWNER_INFO } from '../../../common/constants';
import { getEmptyTagValue } from '../empty_value';
Expand All @@ -33,7 +33,6 @@ import { CaseDetailsLink } from '../links';
import * as i18n from './translations';
import { ALERTS } from '../../common/translations';
import { getActions } from './actions';
import { UpdateCase } from '../../containers/use_get_cases';
import { useDeleteCases } from '../../containers/use_delete_cases';
import { ConfirmDeleteCaseModal } from '../confirm_delete_case';
import { useApplicationCapabilities, useKibana } from '../../common/lib/kibana';
Expand All @@ -43,6 +42,7 @@ import { getConnectorIcon } from '../utils';
import type { CasesOwners } from '../../client/helpers/can_use_cases';
import { useCasesFeatures } from '../cases_context/use_cases_features';
import { severities } from '../severity/config';
import { useUpdateCase } from '../../containers/use_update_case';

export type CasesColumns =
| EuiTableActionsColumnType<Case>
Expand All @@ -57,7 +57,6 @@ const renderStringField = (field: string, dataTestSubj: string) =>
field != null ? <span data-test-subj={dataTestSubj}>{field}</span> : getEmptyTagValue();

export interface GetCasesColumn {
dispatchUpdateCaseProperty: (u: UpdateCase) => void;
filterStatus: string;
handleIsLoading: (a: boolean) => void;
isLoadingCases: string[];
Expand All @@ -70,7 +69,6 @@ export interface GetCasesColumn {
showSolutionColumn?: boolean;
}
export const useCasesColumns = ({
dispatchUpdateCaseProperty,
filterStatus,
handleIsLoading,
isLoadingCases,
Expand Down Expand Up @@ -98,6 +96,8 @@ export const useCasesColumns = ({
title: '',
});

const { updateCaseProperty } = useUpdateCase();

const toggleDeleteModal = useCallback(
(deleteCase: Case) => {
handleToggleModal();
Expand All @@ -107,15 +107,17 @@ export const useCasesColumns = ({
);

const handleDispatchUpdate = useCallback(
(args: Omit<UpdateCase, 'refetchCasesStatus'>) => {
dispatchUpdateCaseProperty({
...args,
refetchCasesStatus: () => {
({ updateKey, updateValue, caseData }: UpdateByKey) => {
updateCaseProperty({
updateKey,
updateValue,
caseData,
onSuccess: () => {
if (refreshCases != null) refreshCases();
},
});
},
[dispatchUpdateCaseProperty, refreshCases]
[refreshCases, updateCaseProperty]
);

const actions = useMemo(
Expand Down Expand Up @@ -324,8 +326,7 @@ export const useCasesColumns = ({
handleDispatchUpdate({
updateKey: 'status',
updateValue: status,
caseId: theCase.id,
version: theCase.version,
caseData: theCase,
})
}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ const useGetCasesStatusMock = useGetCasesStatus as jest.Mock;
const useGetActionLicenseMock = useGetActionLicense as jest.Mock;

describe('AllCases', () => {
const dispatchUpdateCaseProperty = jest.fn();
const refetchCases = jest.fn();
const setFilters = jest.fn();
const setQueryParams = jest.fn();
Expand All @@ -43,7 +42,6 @@ describe('AllCases', () => {

const defaultGetCases = {
...useGetCasesMockState,
dispatchUpdateCaseProperty,
refetchCases,
setFilters,
setQueryParams,
Expand Down
75 changes: 1 addition & 74 deletions x-pack/plugins/cases/public/containers/use_get_cases.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ import {
useGetCases,
UseGetCases,
} from './use_get_cases';
import { UpdateKey } from './types';
import { allCases, basicCase, caseWithAlerts, caseWithAlertsSyncOff } from './mock';
import { allCases, basicCase } from './mock';
import * as api from './api';
import { TestProviders } from '../common/mock';
import { useToasts } from '../common/lib/kibana';
Expand All @@ -42,7 +41,6 @@ describe('useGetCases', () => {
await act(async () => {
expect(result.current).toEqual({
data: initialData,
dispatchUpdateCaseProperty: result.current.dispatchUpdateCaseProperty,
filterOptions: DEFAULT_FILTER_OPTIONS,
isError: false,
loading: ['cases'],
Expand Down Expand Up @@ -79,7 +77,6 @@ describe('useGetCases', () => {
await waitForNextUpdate();
expect(result.current).toEqual({
data: allCases,
dispatchUpdateCaseProperty: result.current.dispatchUpdateCaseProperty,
filterOptions: DEFAULT_FILTER_OPTIONS,
isError: false,
loading: [],
Expand All @@ -93,75 +90,6 @@ describe('useGetCases', () => {
});
});

it('dispatch update case property', async () => {
const spyOnPatchCase = jest.spyOn(api, 'patchCase');
await act(async () => {
const updateCase = {
updateKey: 'description' as UpdateKey,
updateValue: 'description update',
caseId: basicCase.id,
refetchCasesStatus: jest.fn(),
version: '99999',
};
const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});
await waitForNextUpdate();
result.current.dispatchUpdateCaseProperty(updateCase);
expect(result.current.loading).toEqual(['caseUpdate']);
expect(spyOnPatchCase).toBeCalledWith(
basicCase.id,
{ [updateCase.updateKey]: updateCase.updateValue },
updateCase.version,
abortCtrl.signal
);
});
expect(addSuccess).toHaveBeenCalledWith({
title: `Updated "${basicCase.title}"`,
});
});

it('shows a success toast notifying of synced alerts when sync is on', async () => {
await act(async () => {
const updateCase = {
updateKey: 'status' as UpdateKey,
updateValue: 'open',
caseId: caseWithAlerts.id,
refetchCasesStatus: jest.fn(),
version: '99999',
};
const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});
await waitForNextUpdate();
result.current.dispatchUpdateCaseProperty(updateCase);
});
expect(addSuccess).toHaveBeenCalledWith({
text: 'Updated the statuses of attached alerts.',
title: 'Updated "Another horrible breach!!"',
});
});

it('shows a success toast without notifying of synced alerts when sync is off', async () => {
await act(async () => {
const updateCase = {
updateKey: 'status' as UpdateKey,
updateValue: 'open',
caseId: caseWithAlertsSyncOff.id,
refetchCasesStatus: jest.fn(),
version: '99999',
};
const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases(), {
wrapper: ({ children }) => <TestProviders>{children}</TestProviders>,
});
await waitForNextUpdate();
result.current.dispatchUpdateCaseProperty(updateCase);
});
expect(addSuccess).toHaveBeenCalledWith({
title: 'Updated "Another horrible breach!!"',
});
});

it('refetch cases', async () => {
const spyOnGetCases = jest.spyOn(api, 'getCases');
await act(async () => {
Expand Down Expand Up @@ -200,7 +128,6 @@ describe('useGetCases', () => {

expect(result.current).toEqual({
data: initialData,
dispatchUpdateCaseProperty: result.current.dispatchUpdateCaseProperty,
filterOptions: DEFAULT_FILTER_OPTIONS,
isError: true,
loading: [],
Expand Down
Loading

0 comments on commit 9cd7cb6

Please sign in to comment.