mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
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:
parent
8e0253b259
commit
01e39e5587
3 changed files with 217 additions and 3 deletions
|
@ -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'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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',
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue