From cbdfa03783e0218a03b75c258905ac1c3097a8ed Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Wed, 18 Mar 2020 13:28:00 -0600 Subject: [PATCH] [SIEM] [Cases] Shell scripts and unit tests (#60183) (#60543) --- .../pages/case/components/all_cases/index.tsx | 7 +- .../case/components/bulk_actions/index.tsx | 1 + .../case/components/case_view/index.test.tsx | 60 ++++++++++++- .../pages/case/components/case_view/index.tsx | 2 +- .../components/confirm_delete_case/index.tsx | 1 + .../pages/case/components/create/index.tsx | 11 ++- .../components/property_actions/index.tsx | 14 ++- x-pack/plugins/case/server/scripts/README.md | 90 +++++++++++++++++++ .../server/scripts/check_env_variables.sh | 41 +++++++++ .../case/server/scripts/delete_cases.sh | 51 +++++++++++ .../case/server/scripts/delete_comment.sh | 39 ++++++++ .../plugins/case/server/scripts/find_cases.sh | 17 ++++ .../server/scripts/find_cases_by_filter.sh | 28 ++++++ .../case/server/scripts/find_cases_sort.sh | 24 +++++ .../scripts/generate_case_and_comment_data.sh | 30 +++++++ .../case/server/scripts/generate_case_data.sh | 16 ++++ .../plugins/case/server/scripts/get_case.sh | 38 ++++++++ .../case/server/scripts/get_case_comments.sh | 38 ++++++++ .../case/server/scripts/get_comment.sh | 40 +++++++++ .../case/server/scripts/get_reporters.sh | 23 +++++ .../plugins/case/server/scripts/get_status.sh | 23 +++++ .../plugins/case/server/scripts/get_tags.sh | 23 +++++ .../plugins/case/server/scripts/hard_reset.sh | 29 ++++++ .../server/scripts/mock/case/post_case.json | 8 ++ .../scripts/mock/case/post_case_v2.json | 8 ++ .../scripts/mock/comment/post_comment.json | 3 + .../scripts/mock/comment/post_comment_v2.json | 3 + .../case/server/scripts/patch_cases.sh | 24 +++++ .../case/server/scripts/patch_comment.sh | 26 ++++++ .../plugins/case/server/scripts/post_case.sh | 37 ++++++++ .../case/server/scripts/post_comment.sh | 57 ++++++++++++ 31 files changed, 801 insertions(+), 11 deletions(-) create mode 100644 x-pack/plugins/case/server/scripts/README.md create mode 100755 x-pack/plugins/case/server/scripts/check_env_variables.sh create mode 100755 x-pack/plugins/case/server/scripts/delete_cases.sh create mode 100755 x-pack/plugins/case/server/scripts/delete_comment.sh create mode 100755 x-pack/plugins/case/server/scripts/find_cases.sh create mode 100755 x-pack/plugins/case/server/scripts/find_cases_by_filter.sh create mode 100755 x-pack/plugins/case/server/scripts/find_cases_sort.sh create mode 100755 x-pack/plugins/case/server/scripts/generate_case_and_comment_data.sh create mode 100755 x-pack/plugins/case/server/scripts/generate_case_data.sh create mode 100755 x-pack/plugins/case/server/scripts/get_case.sh create mode 100755 x-pack/plugins/case/server/scripts/get_case_comments.sh create mode 100755 x-pack/plugins/case/server/scripts/get_comment.sh create mode 100755 x-pack/plugins/case/server/scripts/get_reporters.sh create mode 100755 x-pack/plugins/case/server/scripts/get_status.sh create mode 100755 x-pack/plugins/case/server/scripts/get_tags.sh create mode 100755 x-pack/plugins/case/server/scripts/hard_reset.sh create mode 100644 x-pack/plugins/case/server/scripts/mock/case/post_case.json create mode 100644 x-pack/plugins/case/server/scripts/mock/case/post_case_v2.json create mode 100644 x-pack/plugins/case/server/scripts/mock/comment/post_comment.json create mode 100644 x-pack/plugins/case/server/scripts/mock/comment/post_comment_v2.json create mode 100755 x-pack/plugins/case/server/scripts/patch_cases.sh create mode 100755 x-pack/plugins/case/server/scripts/patch_comment.sh create mode 100755 x-pack/plugins/case/server/scripts/post_case.sh create mode 100755 x-pack/plugins/case/server/scripts/post_comment.sh diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx index 7b655999ace09c..9f836bd043c9dc 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx @@ -231,10 +231,7 @@ export const AllCases = React.memo(() => { sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, }; const euiBasicTableSelectionProps = useMemo>( - () => ({ - selectable: (item: Case) => true, - onSelectionChange: setSelectedCases, - }), + () => ({ onSelectionChange: setSelectedCases }), [selectedCases] ); const isCasesLoading = useMemo( @@ -305,6 +302,7 @@ export const AllCases = React.memo(() => { {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} { { closePopover(); deleteCasesAction(selectedCaseIds); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx index 8754c0404d40ba..15d6cf7cf7317a 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx @@ -7,16 +7,30 @@ import React from 'react'; import { mount } from 'enzyme'; import { CaseComponent } from './'; -import * as apiHook from '../../../../containers/case/use_update_case'; +import * as updateHook from '../../../../containers/case/use_update_case'; +import * as deleteHook from '../../../../containers/case/use_delete_cases'; import { caseProps, data } from './__mock__'; import { TestProviders } from '../../../../mock'; describe('CaseView ', () => { + const handleOnDeleteConfirm = jest.fn(); + const handleToggleModal = jest.fn(); + const dispatchResetIsDeleted = jest.fn(); const updateCaseProperty = jest.fn(); + /* eslint-disable no-console */ + // Silence until enzyme fixed to use ReactTestUtils.act() + const originalError = console.error; + beforeAll(() => { + console.error = jest.fn(); + }); + afterAll(() => { + console.error = originalError; + }); + /* eslint-enable no-console */ beforeEach(() => { jest.resetAllMocks(); - jest.spyOn(apiHook, 'useUpdateCase').mockReturnValue({ + jest.spyOn(updateHook, 'useUpdateCase').mockReturnValue({ caseData: data, isLoading: false, isError: false, @@ -119,4 +133,46 @@ describe('CaseView ', () => { .prop('source') ).toEqual(data.comments[0].comment); }); + + it('toggle delete modal and cancel', () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeFalsy(); + + wrapper + .find( + '[data-test-subj="case-view-actions"] button[data-test-subj="property-actions-ellipses"]' + ) + .first() + .simulate('click'); + wrapper.find('button[data-test-subj="property-actions-trash"]').simulate('click'); + expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeTruthy(); + wrapper.find('button[data-test-subj="confirmModalCancelButton"]').simulate('click'); + expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeFalsy(); + }); + + it('toggle delete modal and confirm', () => { + jest.spyOn(deleteHook, 'useDeleteCases').mockReturnValue({ + dispatchResetIsDeleted, + handleToggleModal, + handleOnDeleteConfirm, + isLoading: false, + isError: false, + isDeleted: false, + isDisplayConfirmDeleteModal: true, + }); + const wrapper = mount( + + + + ); + + expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeTruthy(); + wrapper.find('button[data-test-subj="confirmModalConfirmButton"]').simulate('click'); + expect(handleOnDeleteConfirm.mock.calls[0][0]).toEqual([caseProps.caseId]); + }); }); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx index 5ff542d2089054..82216e88a091e7 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx @@ -216,7 +216,7 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => onChange={toggleStatusCase} /> - + diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/confirm_delete_case/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/confirm_delete_case/index.tsx index dff36a6dac5716..5755258b363885 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/confirm_delete_case/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/confirm_delete_case/index.tsx @@ -32,6 +32,7 @@ const ConfirmDeleteCaseModalComp: React.FC = ({ buttonColor="danger" cancelButtonText={i18n.CANCEL} confirmButtonText={isPlural ? i18n.DELETE_CASES : i18n.DELETE_CASE} + data-test-subj="confirm-delete-case-modal" defaultFocusedButton="confirm" onCancel={onCancel} onConfirm={onConfirm} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx index 3b9af8349437e8..20712c3c5a815d 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx @@ -72,6 +72,10 @@ export const Create = React.memo(() => { } }, [form]); + const handleSetIsCancel = useCallback(() => { + setIsCancel(true); + }, [isCancel]); + if (caseData != null && caseData.id) { return ; } @@ -137,7 +141,12 @@ export const Create = React.memo(() => { responsive={false} > - setIsCancel(true)} iconType="cross"> + {i18n.CANCEL} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/property_actions/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/property_actions/index.tsx index 7fe5b6f5f87940..01ccf3c510b604 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/property_actions/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/property_actions/index.tsx @@ -13,9 +13,12 @@ export interface PropertyActionButtonProps { label: string; } +const ComponentId = 'property-actions'; + const PropertyActionButton = React.memo( ({ onClick, iconType, label }) => ( (({ propertyActio }, []); return ( - + (({ propertyActio isOpen={showActions} closePopover={onClosePopover} > - + {propertyActions.map((action, key) => (