diff --git a/x-pack/plugins/security_solution/public/cases/components/callout/callout.test.tsx b/x-pack/plugins/security_solution/public/cases/components/callout/callout.test.tsx index abda8d1d8ebdf71..bc42c588136c69a 100644 --- a/x-pack/plugins/security_solution/public/cases/components/callout/callout.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/callout/callout.test.tsx @@ -7,13 +7,12 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CallOut } from './callout'; -import { ErrorMessage } from './types'; +import { CallOut, CallOutProps } from './callout'; describe('Callout', () => { - const defaultProps = { + const defaultProps: CallOutProps = { id: 'md5-hex', - type: 'primary' as NonNullable, + type: 'primary', title: 'a tittle', messages: [ { @@ -26,6 +25,10 @@ describe('Callout', () => { handleDismissCallout: jest.fn(), }; + beforeEach(() => { + jest.clearAllMocks(); + }); + it('It renders the callout', () => { const wrapper = mount(); expect(wrapper.find(`[data-test-subj="case-callout-md5-hex"]`).exists()).toBeTruthy(); @@ -60,11 +63,12 @@ describe('Callout', () => { ); }); - it('dismiss the button correctly', () => { + it('dismiss the callout correctly', () => { const wrapper = mount(); expect(wrapper.find(`[data-test-subj="callout-dismiss-md5-hex"]`).exists()).toBeTruthy(); wrapper.find(`button[data-test-subj="callout-dismiss-md5-hex"]`).simulate('click'); wrapper.update(); - expect(defaultProps.handleDismissCallout).toHaveBeenCalledWith('md5-hex'); + + expect(defaultProps.handleDismissCallout).toHaveBeenCalledWith('md5-hex', 'primary'); }); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/callout/callout.tsx b/x-pack/plugins/security_solution/public/cases/components/callout/callout.tsx index 77352c305128510..e1ebe5c5db17e8a 100644 --- a/x-pack/plugins/security_solution/public/cases/components/callout/callout.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/callout/callout.tsx @@ -11,7 +11,7 @@ import React, { memo, useCallback } from 'react'; import { ErrorMessage } from './types'; import * as i18n from './translations'; -interface CallOutProps { +export interface CallOutProps { id: string; type: NonNullable; title: string; diff --git a/x-pack/plugins/security_solution/public/cases/components/callout/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/callout/index.test.tsx index 61c513f615fde05..5469fae4fe56a82 100644 --- a/x-pack/plugins/security_solution/public/cases/components/callout/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/callout/index.test.tsx @@ -10,9 +10,9 @@ import { mount } from 'enzyme'; import { useMessagesStorage } from '../../../common/containers/local_storage/use_messages_storage'; import { TestProviders } from '../../../common/mock'; import { createCalloutId } from './helpers'; -import { CaseCallOut } from '.'; +import { CaseCallOut, CaseCallOutProps } from '.'; -jest.mock('../../../common/containers/use_messages_storage'); +jest.mock('../../../common/containers/local_storage/use_messages_storage'); const useSecurityLocalStorageMock = useMessagesStorage as jest.Mock; const securityLocalStorageMock = { @@ -20,35 +20,15 @@ const securityLocalStorageMock = { addMessage: jest.fn(), }; -const defaultProps = { - title: 'hey title', -}; - describe('CaseCallOut ', () => { beforeEach(() => { jest.clearAllMocks(); useSecurityLocalStorageMock.mockImplementation(() => securityLocalStorageMock); }); - it('Renders single message callout', () => { - const props = { - ...defaultProps, - message: 'we have one message', - }; - - const wrapper = mount( - - - - ); - - expect(wrapper.find(`[data-test-subj="callout-message-primary"]`).last().exists()).toBeTruthy(); - }); - - it('Renders multi message callout', () => { - const props = { - ...defaultProps, - message: 'we have one message', + it('renders a callout correctly', () => { + const props: CaseCallOutProps = { + title: 'hey title', messages: [ { id: 'message-one', title: 'title', description:

{'we have two messages'}

}, { id: 'message-two', title: 'title', description:

{'for real'}

}, @@ -60,20 +40,19 @@ describe('CaseCallOut ', () => { ); - const id = createCalloutId(['message-one', 'message-two', 'generic-message-error']); - + const id = createCalloutId(['message-one', 'message-two']); expect(wrapper.find(`[data-test-subj="callout-messages-${id}"]`).last().exists()).toBeTruthy(); }); - it('shows the correct type of callouts', () => { - const props = { - ...defaultProps, + it('groups the messages correctly', () => { + const props: CaseCallOutProps = { + title: 'hey title', messages: [ { id: 'message-one', title: 'title one', description:

{'we have two messages'}

, - errorType: 'danger' as 'primary' | 'success' | 'warning' | 'danger', + errorType: 'danger', }, { id: 'message-two', title: 'title two', description:

{'for real'}

}, ], @@ -96,10 +75,12 @@ describe('CaseCallOut ', () => { ).toBeTruthy(); }); - it('Dismisses callout', () => { - const props = { - ...defaultProps, - message: 'we have one message', + it('dismisses the callout correctly', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { id: 'message-one', title: 'title', description:

{'we have two messages'}

}, + ], }; const wrapper = mount( @@ -107,17 +88,19 @@ describe('CaseCallOut ', () => { ); - const id = createCalloutId(['generic-message-error']); + const id = createCalloutId(['message-one']); expect(wrapper.find(`[data-test-subj="case-callout-${id}"]`).last().exists()).toBeTruthy(); wrapper.find(`[data-test-subj="callout-dismiss-${id}"]`).last().simulate('click'); expect(wrapper.find(`[data-test-subj="case-callout-${id}"]`).exists()).toBeFalsy(); }); - it('persist the callout when dismissed', () => { - const props = { - ...defaultProps, - message: 'we have one message', + it('persist the callout of type primary when dismissed', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { id: 'message-one', title: 'title', description:

{'we have two messages'}

}, + ], }; const wrapper = mount( @@ -126,19 +109,21 @@ describe('CaseCallOut ', () => { ); - const id = createCalloutId(['generic-message-error']); + const id = createCalloutId(['message-one']); expect(securityLocalStorageMock.getMessages).toHaveBeenCalledWith('case'); wrapper.find(`[data-test-subj="callout-dismiss-${id}"]`).last().simulate('click'); expect(securityLocalStorageMock.addMessage).toHaveBeenCalledWith('case', id); }); it('do not show the callout if is in the localStorage', () => { - const props = { - ...defaultProps, - message: 'we have one message', + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { id: 'message-one', title: 'title', description:

{'we have two messages'}

}, + ], }; - const id = createCalloutId(['generic-message-error']); + const id = createCalloutId(['message-one']); useSecurityLocalStorageMock.mockImplementation(() => ({ ...securityLocalStorageMock, @@ -155,8 +140,8 @@ describe('CaseCallOut ', () => { }); it('do not persist a callout of type danger', () => { - const props = { - ...defaultProps, + const props: CaseCallOutProps = { + title: 'hey title', messages: [ { id: 'message-one', @@ -167,18 +152,21 @@ describe('CaseCallOut ', () => { ], }; - mount( + const wrapper = mount( ); + const id = createCalloutId(['message-one']); + wrapper.find(`button[data-test-subj="callout-dismiss-${id}"]`).simulate('click'); + wrapper.update(); expect(securityLocalStorageMock.addMessage).not.toHaveBeenCalled(); }); it('do not persist a callout of type warning', () => { - const props = { - ...defaultProps, + const props: CaseCallOutProps = { + title: 'hey title', messages: [ { id: 'message-one', @@ -189,18 +177,21 @@ describe('CaseCallOut ', () => { ], }; - mount( + const wrapper = mount( ); + const id = createCalloutId(['message-one']); + wrapper.find(`button[data-test-subj="callout-dismiss-${id}"]`).simulate('click'); + wrapper.update(); expect(securityLocalStorageMock.addMessage).not.toHaveBeenCalled(); }); it('do not persist a callout of type success', () => { - const props = { - ...defaultProps, + const props: CaseCallOutProps = { + title: 'hey title', messages: [ { id: 'message-one', @@ -211,12 +202,15 @@ describe('CaseCallOut ', () => { ], }; - mount( + const wrapper = mount( ); + const id = createCalloutId(['message-one']); + wrapper.find(`button[data-test-subj="callout-dismiss-${id}"]`).simulate('click'); + wrapper.update(); expect(securityLocalStorageMock.addMessage).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/callout/index.tsx b/x-pack/plugins/security_solution/public/cases/components/callout/index.tsx index 9c9fb54df4eb072..1ad859389304aef 100644 --- a/x-pack/plugins/security_solution/public/cases/components/callout/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/callout/index.tsx @@ -14,7 +14,7 @@ import { createCalloutId } from './helpers'; export * from './helpers'; -interface CaseCallOutProps { +export interface CaseCallOutProps { title: string; messages?: ErrorMessage[]; } diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx index f2de830a71644d6..8f51650698a9bad 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx @@ -110,7 +110,7 @@ describe('usePushToService', () => { await waitForNextUpdate(); const errorsMsg = result.current.pushCallouts?.props.messages; expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].title).toEqual(getLicenseError().title); + expect(errorsMsg[0].id).toEqual('license-error'); }); }); @@ -132,7 +132,7 @@ describe('usePushToService', () => { await waitForNextUpdate(); const errorsMsg = result.current.pushCallouts?.props.messages; expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].title).toEqual(getKibanaConfigError().title); + expect(errorsMsg[0].id).toEqual('kibana-config-error'); }); }); @@ -152,7 +152,7 @@ describe('usePushToService', () => { await waitForNextUpdate(); const errorsMsg = result.current.pushCallouts?.props.messages; expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].title).toEqual(i18n.PUSH_DISABLE_BY_NO_CONFIG_TITLE); + expect(errorsMsg[0].id).toEqual('connector-missing-error'); }); }); @@ -171,7 +171,7 @@ describe('usePushToService', () => { await waitForNextUpdate(); const errorsMsg = result.current.pushCallouts?.props.messages; expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].title).toEqual(i18n.PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE); + expect(errorsMsg[0].id).toEqual('connector-not-selected-error'); }); }); @@ -191,7 +191,7 @@ describe('usePushToService', () => { await waitForNextUpdate(); const errorsMsg = result.current.pushCallouts?.props.messages; expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].title).toEqual(i18n.PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE); + expect(errorsMsg[0].id).toEqual('connector-deleted-error'); }); }); @@ -212,7 +212,7 @@ describe('usePushToService', () => { await waitForNextUpdate(); const errorsMsg = result.current.pushCallouts?.props.messages; expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].title).toEqual(i18n.PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE); + expect(errorsMsg[0].id).toEqual('connector-deleted-error'); }); }); @@ -231,7 +231,7 @@ describe('usePushToService', () => { await waitForNextUpdate(); const errorsMsg = result.current.pushCallouts?.props.messages; expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].title).toEqual(i18n.PUSH_DISABLE_BECAUSE_CASE_CLOSED_TITLE); + expect(errorsMsg[0].id).toEqual('closed-case-push-error'); }); }); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx index 9dbc761be76c49f..7b4a29098bddedd 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx @@ -105,17 +105,6 @@ export const usePushToService = ({ /> ), }, - { - id: 'connector-deleted-error', - title: i18n.PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE, - description: ( - - ), - errorType: 'danger', - }, ]; } else if (caseConnectorId === 'none' && !loadingLicense) { errors = [ diff --git a/x-pack/plugins/security_solution/public/common/containers/local_storage/use_messages_storage.test.tsx b/x-pack/plugins/security_solution/public/common/containers/local_storage/use_messages_storage.test.tsx index 09b09801a520497..d122a74b1eb1397 100644 --- a/x-pack/plugins/security_solution/public/common/containers/local_storage/use_messages_storage.test.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/local_storage/use_messages_storage.test.tsx @@ -9,7 +9,7 @@ import { useKibana } from '../../lib/kibana'; import { createUseKibanaMock } from '../../mock/kibana_react'; import { useMessagesStorage, UseMessagesStorage } from './use_messages_storage'; -jest.mock('../lib/kibana'); +jest.mock('../../lib/kibana'); const useKibanaMock = useKibana as jest.Mock; describe('useLocalStorage', () => {