update wording for temporary sourcerer (#127907) (#128115)

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
(cherry picked from commit 32d08793f0)

Co-authored-by: Angela Chuang <6295984+angorayc@users.noreply.github.com>
This commit is contained in:
Kibana Machine 2022-03-19 15:01:14 -04:00 committed by GitHub
parent 8e0253b259
commit 01e39e5587
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 217 additions and 3 deletions

View file

@ -7,6 +7,8 @@
import React from 'react';
import { mount, ReactWrapper } from 'enzyme';
import { cloneDeep } from 'lodash';
import { initialSourcererState, SourcererScopeName } from '../../store/sourcerer/model';
import { Sourcerer } from './index';
import { sourcererActions, sourcererModel } from '../../store/sourcerer';
@ -22,6 +24,7 @@ import { EuiSuperSelectOption } from '@elastic/eui/src/components/form/super_sel
import { waitFor } from '@testing-library/dom';
import { useSourcererDataView } from '../../containers/sourcerer';
import { useSignalHelpers } from '../../containers/sourcerer/use_signal_helpers';
import { TimelineId, TimelineType } from '../../../../common/types';
const mockDispatch = jest.fn();
@ -989,6 +992,16 @@ describe('Update available', () => {
expect(wrapper.find(`UpdateDefaultDataViewModal`).prop('isShowing')).toEqual(true);
});
test('Show UpdateDefaultDataViewModal Callout', () => {
wrapper.find(`[data-test-subj="timeline-sourcerer-trigger"]`).first().simulate('click');
wrapper.find(`button[data-test-subj="sourcerer-deprecated-update"]`).first().simulate('click');
expect(wrapper.find(`[data-test-subj="sourcerer-deprecated-callout"]`).first().text()).toEqual(
'This timeline uses a legacy data view selector'
);
});
test('Show Add index pattern in UpdateDefaultDataViewModal', () => {
wrapper.find(`[data-test-subj="timeline-sourcerer-trigger"]`).first().simulate('click');
@ -1017,3 +1030,176 @@ describe('Update available', () => {
);
});
});
describe('Update available for timeline template', () => {
const { storage } = createSecuritySolutionStorageMock();
const state2 = {
...mockGlobalState,
timeline: {
...mockGlobalState.timeline,
timelineById: {
...mockGlobalState.timeline.timelineById,
[TimelineId.active]: {
...mockGlobalState.timeline.timelineById.test,
timelineType: TimelineType.template,
},
},
},
sourcerer: {
...mockGlobalState.sourcerer,
kibanaDataViews: [
mockGlobalState.sourcerer.defaultDataView,
{
...mockGlobalState.sourcerer.defaultDataView,
id: '1234',
title: 'auditbeat-*',
patternList: ['auditbeat-*'],
},
{
...mockGlobalState.sourcerer.defaultDataView,
id: '12347',
title: 'packetbeat-*',
patternList: ['packetbeat-*'],
},
],
sourcererScopes: {
...mockGlobalState.sourcerer.sourcererScopes,
[SourcererScopeName.timeline]: {
...mockGlobalState.sourcerer.sourcererScopes[SourcererScopeName.timeline],
loading: false,
patternList,
selectedDataViewId: null,
selectedPatterns: ['myFakebeat-*'],
missingPatterns: ['myFakebeat-*'],
},
},
},
};
let wrapper: ReactWrapper;
beforeEach(() => {
(useSourcererDataView as jest.Mock).mockReturnValue({
...sourcererDataView,
activePatterns: ['myFakebeat-*'],
});
store = createStore(state2, SUB_PLUGINS_REDUCER, kibanaObservable, storage);
wrapper = mount(
<TestProviders store={store}>
<Sourcerer scope={sourcererModel.SourcererScopeName.timeline} />
</TestProviders>
);
});
afterEach(() => {
jest.clearAllMocks();
});
test('Show UpdateDefaultDataViewModal CallOut', () => {
wrapper.find(`[data-test-subj="timeline-sourcerer-trigger"]`).first().simulate('click');
wrapper.find(`button[data-test-subj="sourcerer-deprecated-update"]`).first().simulate('click');
expect(wrapper.find(`[data-test-subj="sourcerer-deprecated-callout"]`).first().text()).toEqual(
'This timeline template uses a legacy data view selector'
);
});
});
describe('Missing index patterns', () => {
const { storage } = createSecuritySolutionStorageMock();
const state2 = {
...mockGlobalState,
timeline: {
...mockGlobalState.timeline,
timelineById: {
...mockGlobalState.timeline.timelineById,
[TimelineId.active]: {
...mockGlobalState.timeline.timelineById.test,
timelineType: TimelineType.template,
},
},
},
sourcerer: {
...mockGlobalState.sourcerer,
kibanaDataViews: [
mockGlobalState.sourcerer.defaultDataView,
{
...mockGlobalState.sourcerer.defaultDataView,
id: '1234',
title: 'auditbeat-*',
patternList: ['auditbeat-*'],
},
{
...mockGlobalState.sourcerer.defaultDataView,
id: '12347',
title: 'packetbeat-*',
patternList: ['packetbeat-*'],
},
],
sourcererScopes: {
...mockGlobalState.sourcerer.sourcererScopes,
[SourcererScopeName.timeline]: {
...mockGlobalState.sourcerer.sourcererScopes[SourcererScopeName.timeline],
loading: false,
patternList,
selectedDataViewId: 'fake-data-view-id',
selectedPatterns: ['myFakebeat-*'],
missingPatterns: ['myFakebeat-*'],
},
},
},
};
let wrapper: ReactWrapper;
afterEach(() => {
jest.clearAllMocks();
});
test('Show UpdateDefaultDataViewModal CallOut for timeline', () => {
(useSourcererDataView as jest.Mock).mockReturnValue({
...sourcererDataView,
activePatterns: ['myFakebeat-*'],
});
const state3 = cloneDeep(state2);
state3.timeline.timelineById[TimelineId.active].timelineType = TimelineType.default;
store = createStore(state3, SUB_PLUGINS_REDUCER, kibanaObservable, storage);
wrapper = mount(
<TestProviders store={store}>
<Sourcerer scope={sourcererModel.SourcererScopeName.timeline} />
</TestProviders>
);
wrapper.find(`[data-test-subj="timeline-sourcerer-trigger"]`).first().simulate('click');
wrapper.find(`button[data-test-subj="sourcerer-deprecated-update"]`).first().simulate('click');
expect(wrapper.find(`[data-test-subj="sourcerer-deprecated-callout"]`).first().text()).toEqual(
'This timeline is out of date with the Security Data View'
);
});
test('Show UpdateDefaultDataViewModal CallOut for timeline template', () => {
(useSourcererDataView as jest.Mock).mockReturnValue({
...sourcererDataView,
activePatterns: ['myFakebeat-*'],
});
store = createStore(state2, SUB_PLUGINS_REDUCER, kibanaObservable, storage);
wrapper = mount(
<TestProviders store={store}>
<Sourcerer scope={sourcererModel.SourcererScopeName.timeline} />
</TestProviders>
);
wrapper.find(`[data-test-subj="timeline-sourcerer-trigger"]`).first().simulate('click');
wrapper.find(`button[data-test-subj="sourcerer-deprecated-update"]`).first().simulate('click');
expect(wrapper.find(`[data-test-subj="sourcerer-deprecated-callout"]`).first().text()).toEqual(
'This timeline template is out of date with the Security Data View'
);
});
});

View file

@ -22,6 +22,10 @@ import React, { useMemo } from 'react';
import * as i18n from './translations';
import { Blockquote, ResetButton } from './helpers';
import { UpdateDefaultDataViewModal } from './update_default_data_view_modal';
import { TimelineId, TimelineType } from '../../../../common/types';
import { timelineSelectors } from '../../../timelines/store/timeline';
import { useDeepEqualSelector } from '../../hooks/use_selector';
import { timelineDefaults } from '../../../timelines/store/timeline/defaults';
interface Props {
activePatterns?: string[];
@ -36,11 +40,17 @@ interface Props {
const translations = {
deprecated: {
title: i18n.CALL_OUT_DEPRECATED_TITLE,
title: {
[TimelineType.default]: i18n.CALL_OUT_DEPRECATED_TITLE,
[TimelineType.template]: i18n.CALL_OUT_DEPRECATED_TEMPLATE_TITLE,
},
update: i18n.UPDATE_INDEX_PATTERNS,
},
missingPatterns: {
title: i18n.CALL_OUT_MISSING_PATTERNS_TITLE,
title: {
[TimelineType.default]: i18n.CALL_OUT_MISSING_PATTERNS_TITLE,
[TimelineType.template]: i18n.CALL_OUT_MISSING_PATTERNS_TEMPLATE_TITLE,
},
update: i18n.ADD_INDEX_PATTERN,
},
};
@ -87,7 +97,11 @@ export const TemporarySourcererComp = React.memo<Props>(
activePatterns && activePatterns.length > 0
? selectedPatterns.filter((p) => !activePatterns.includes(p))
: [];
const getTimeline = useMemo(() => timelineSelectors.getTimelineByIdSelector(), []);
const timelineType = useDeepEqualSelector(
(state) => (getTimeline(state, TimelineId.active) ?? timelineDefaults).timelineType
);
return (
<>
<EuiCallOut
@ -95,7 +109,7 @@ export const TemporarySourcererComp = React.memo<Props>(
data-test-subj="sourcerer-deprecated-callout"
iconType="alert"
size="s"
title={translations[isModified].title}
title={translations[isModified].title[timelineType]}
/>
<EuiSpacer size="s" />
<EuiText size="s">

View file

@ -18,6 +18,13 @@ export const CALL_OUT_DEPRECATED_TITLE = i18n.translate(
}
);
export const CALL_OUT_DEPRECATED_TEMPLATE_TITLE = i18n.translate(
'xpack.securitySolution.indexPatterns.callOutDeprecxatedTemplateTitle',
{
defaultMessage: 'This timeline template uses a legacy data view selector',
}
);
export const CALL_OUT_MISSING_PATTERNS_TITLE = i18n.translate(
'xpack.securitySolution.indexPatterns.callOutMissingPatternsTitle',
{
@ -25,6 +32,13 @@ export const CALL_OUT_MISSING_PATTERNS_TITLE = i18n.translate(
}
);
export const CALL_OUT_MISSING_PATTERNS_TEMPLATE_TITLE = i18n.translate(
'xpack.securitySolution.indexPatterns.callOutMissingPatternsTemplateTitle',
{
defaultMessage: 'This timeline template is out of date with the Security Data View',
}
);
export const CALL_OUT_TIMELINE_TITLE = i18n.translate(
'xpack.securitySolution.indexPatterns.callOutTimelineTitle',
{