kibana/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx

319 lines
10 KiB
TypeScript

/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { mount } from 'enzyme';
import React from 'react';
import { MemoryRouter } from 'react-router-dom';
import { merge } from 'lodash';
import '../../common/mock/match_media';
import { TestProviders } from '../../common/mock';
import {
useMessagesStorage,
UseMessagesStorage,
} from '../../common/containers/local_storage/use_messages_storage';
import { Overview } from './index';
import {
initialUserPrivilegesState,
useUserPrivileges,
} from '../../common/components/user_privileges';
import { useSourcererDataView } from '../../common/containers/sourcerer';
import { useFetchIndex } from '../../common/containers/source';
import { useIsThreatIntelModuleEnabled } from '../containers/overview_cti_links/use_is_threat_intel_module_enabled';
import { useCtiEventCounts } from '../containers/overview_cti_links/use_cti_event_counts';
import {
mockCtiEventCountsResponse,
mockCtiLinksResponse,
} from '../components/overview_cti_links/mock';
import { useCtiDashboardLinks } from '../containers/overview_cti_links';
import { EndpointPrivileges } from '../../common/components/user_privileges/endpoint/use_endpoint_privileges';
import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features';
import { useHostsRiskScore } from '../containers/overview_risky_host_links/use_hosts_risk_score';
jest.mock('../../common/lib/kibana');
jest.mock('../../common/containers/source');
jest.mock('../../common/containers/sourcerer');
jest.mock('../../common/containers/use_global_time', () => ({
useGlobalTime: jest.fn().mockReturnValue({
from: '2020-07-07T08:20:18.966Z',
isInitializing: false,
to: '2020-07-08T08:20:18.966Z',
setQuery: jest.fn(),
}),
}));
// Test will fail because we will to need to mock some core services to make the test work
// For now let's forget about SiemSearchBar and QueryBar
jest.mock('../../common/components/search_bar', () => ({
SiemSearchBar: () => null,
}));
jest.mock('../../common/components/query_bar', () => ({
QueryBar: () => null,
}));
jest.mock('../../common/components/user_privileges', () => {
return {
...jest.requireActual('../../common/components/user_privileges'),
useUserPrivileges: jest.fn(() => {
return {
listPrivileges: { loading: false, error: undefined, result: undefined },
detectionEnginePrivileges: { loading: false, error: undefined, result: undefined },
endpointPrivileges: {
loading: false,
canAccessEndpointManagement: true,
canAccessFleet: true,
},
};
}),
};
});
jest.mock('../../common/containers/local_storage/use_messages_storage');
jest.mock('../containers/overview_cti_links');
jest.mock('../containers/overview_cti_links/use_cti_event_counts');
const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock;
useCtiDashboardLinksMock.mockReturnValue(mockCtiLinksResponse);
jest.mock('../containers/overview_cti_links/use_cti_event_counts');
const useCTIEventCountsMock = useCtiEventCounts as jest.Mock;
useCTIEventCountsMock.mockReturnValue(mockCtiEventCountsResponse);
jest.mock('../containers/overview_cti_links/use_is_threat_intel_module_enabled');
const useIsThreatIntelModuleEnabledMock = useIsThreatIntelModuleEnabled as jest.Mock;
useIsThreatIntelModuleEnabledMock.mockReturnValue(true);
jest.mock('../containers/overview_risky_host_links/use_hosts_risk_score');
const useHostsRiskScoreMock = useHostsRiskScore as jest.Mock;
useHostsRiskScoreMock.mockReturnValue({
loading: false,
isModuleEnabled: false,
listItems: [],
});
jest.mock('../../common/hooks/use_experimental_features');
const useIsExperimentalFeatureEnabledMock = useIsExperimentalFeatureEnabled as jest.Mock;
useIsExperimentalFeatureEnabledMock.mockReturnValue(true);
const endpointNoticeMessage = (hasMessageValue: boolean) => {
return {
hasMessage: () => hasMessageValue,
getMessages: () => [],
addMessage: () => undefined,
removeMessage: () => undefined,
clearAllMessages: () => undefined,
};
};
const mockUseSourcererDataView = useSourcererDataView as jest.Mock;
const mockUseUserPrivileges = useUserPrivileges as jest.Mock;
const mockUseFetchIndex = useFetchIndex as jest.Mock;
const mockUseMessagesStorage: jest.Mock = useMessagesStorage as jest.Mock<UseMessagesStorage>;
describe('Overview', () => {
const loadedUserPrivilegesState = (
endpointOverrides: Partial<EndpointPrivileges> = {}
): ReturnType<typeof initialUserPrivilegesState> =>
merge(initialUserPrivilegesState(), {
endpointPrivileges: {
loading: false,
canAccessFleet: true,
canAccessEndpointManagement: true,
...endpointOverrides,
},
});
beforeEach(() => {
mockUseUserPrivileges.mockReturnValue(loadedUserPrivilegesState());
mockUseFetchIndex.mockReturnValue([
false,
{
indexExists: true,
},
]);
});
afterAll(() => {
mockUseUserPrivileges.mockReset();
});
describe('rendering', () => {
test('it DOES NOT render the Getting started text when an index is available', () => {
mockUseSourcererDataView.mockReturnValue({
selectedPatterns: [],
indicesExist: true,
indexPattern: {},
});
mockUseMessagesStorage.mockImplementation(() => endpointNoticeMessage(false));
const wrapper = mount(
<TestProviders>
<MemoryRouter>
<Overview />
</MemoryRouter>
</TestProviders>
);
expect(wrapper.find('[data-test-subj="empty-page"]').exists()).toBe(false);
wrapper.unmount();
});
test('it DOES render the Endpoint banner when the endpoint index is NOT available AND storage is NOT set', () => {
mockUseFetchIndex.mockReturnValue([
false,
{
indexExists: false,
},
]);
mockUseSourcererDataView.mockReturnValue({
selectedPatterns: [],
indicesExist: true,
indexPattern: {},
});
mockUseMessagesStorage.mockImplementation(() => endpointNoticeMessage(false));
const wrapper = mount(
<TestProviders>
<MemoryRouter>
<Overview />
</MemoryRouter>
</TestProviders>
);
expect(wrapper.find('[data-test-subj="endpoint-prompt-banner"]').exists()).toBe(true);
wrapper.unmount();
});
test('it does NOT render the Endpoint banner when the endpoint index is NOT available but storage is set', () => {
mockUseFetchIndex.mockReturnValue([
false,
{
indexExists: false,
},
]);
mockUseSourcererDataView.mockReturnValueOnce({
selectedPatterns: [],
indicesExist: true,
indexPattern: {},
});
mockUseMessagesStorage.mockImplementation(() => endpointNoticeMessage(true));
const wrapper = mount(
<TestProviders>
<MemoryRouter>
<Overview />
</MemoryRouter>
</TestProviders>
);
expect(wrapper.find('[data-test-subj="endpoint-prompt-banner"]').exists()).toBe(false);
wrapper.unmount();
});
test('it does NOT render the Endpoint banner when the endpoint index is available AND storage is set', () => {
mockUseSourcererDataView.mockReturnValue({
selectedPatterns: [],
indexExists: true,
indexPattern: {},
});
mockUseMessagesStorage.mockImplementation(() => endpointNoticeMessage(true));
const wrapper = mount(
<TestProviders>
<MemoryRouter>
<Overview />
</MemoryRouter>
</TestProviders>
);
expect(wrapper.find('[data-test-subj="endpoint-prompt-banner"]').exists()).toBe(false);
wrapper.unmount();
});
test('it does NOT render the Endpoint banner when an index IS available but storage is NOT set', () => {
mockUseSourcererDataView.mockReturnValue({
selectedPatterns: [],
indicesExist: true,
indexPattern: {},
});
mockUseMessagesStorage.mockImplementation(() => endpointNoticeMessage(false));
const wrapper = mount(
<TestProviders>
<MemoryRouter>
<Overview />
</MemoryRouter>
</TestProviders>
);
wrapper.update();
expect(wrapper.find('[data-test-subj="endpoint-prompt-banner"]').exists()).toBe(false);
wrapper.unmount();
});
test('it does NOT render the Endpoint banner when Ingest is NOT available', () => {
mockUseSourcererDataView.mockReturnValue({
selectedPatterns: [],
indicesExist: true,
indexPattern: {},
});
mockUseMessagesStorage.mockImplementation(() => endpointNoticeMessage(true));
mockUseUserPrivileges.mockReturnValue(loadedUserPrivilegesState({ canAccessFleet: false }));
const wrapper = mount(
<TestProviders>
<MemoryRouter>
<Overview />
</MemoryRouter>
</TestProviders>
);
expect(wrapper.find('[data-test-subj="endpoint-prompt-banner"]').exists()).toBe(false);
wrapper.unmount();
});
describe('when no index is available', () => {
beforeEach(() => {
mockUseSourcererDataView.mockReturnValue({
selectedPatterns: [],
indicesExist: false,
});
mockUseUserPrivileges.mockReturnValue(loadedUserPrivilegesState({ canAccessFleet: false }));
mockUseMessagesStorage.mockImplementation(() => endpointNoticeMessage(false));
});
it('renders the Setup Instructions text', () => {
const wrapper = mount(
<TestProviders>
<MemoryRouter>
<Overview />
</MemoryRouter>
</TestProviders>
);
expect(wrapper.find('[data-test-subj="empty-page"]').exists()).toBe(true);
});
});
});
describe('Threat Intel Dashboard Links', () => {
it('invokes useIsThreatIntelModuleEnabled hook only once', () => {
useIsThreatIntelModuleEnabledMock.mockClear();
mount(
<TestProviders>
<MemoryRouter>
<Overview />
</MemoryRouter>
</TestProviders>
);
expect(useIsThreatIntelModuleEnabledMock).toHaveBeenCalledTimes(1);
});
});
});