Skip to content

Commit d893ad3

Browse files
Merge branch 'feat/obs-custom-roles' of github.com:dominiqueclarke/kibana into feat/obs-custom-roles
2 parents 51b1696 + d31595f commit d893ad3

123 files changed

Lines changed: 2257 additions & 1411 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1782,7 +1782,7 @@
17821782
"babel-plugin-transform-react-remove-prop-types": "^0.4.24",
17831783
"babel-plugin-transform-require-default": "^0.1.7",
17841784
"babel-plugin-transform-typescript-metadata": "^0.3.2",
1785-
"backport": "^10.0.0",
1785+
"backport": "^10.0.1",
17861786
"blob-polyfill": "^9.0.20240710",
17871787
"buildkite-test-collector": "^1.8.1",
17881788
"callsites": "^3.1.0",

src/platform/packages/shared/react/kibana_context/root/eui_provider.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,33 @@ export interface KibanaEuiProviderProps extends Pick<EuiProviderProps<{}>, 'modi
3636
globalStyles?: boolean;
3737
}
3838

39-
// Set up the caches.
40-
// https://eui.elastic.co/#/utilities/provider#cache-location
41-
const stylisPlugins = [euiStylisPrefixer]; // https://emotion.sh/docs/@emotion/cache#stylisplugins
39+
const sharedCacheOptions = {
40+
// Set up the caches.
41+
// https://eui.elastic.co/docs/utilities/provider/#emotioncache-customization
42+
stylisPlugins: [euiStylisPrefixer], // https://emotion.sh/docs/@emotion/cache#stylisplugins
43+
44+
// Enables Emotion's speedy mode in dev (same as prod).
45+
// This uses `insertRule` instead of default injecting <style> tags for better performance (~10x faster).
46+
// Historically disabled in dev for easier inspection, but it's no longer the issue: modern dev tools support editing styles.
47+
// docs: https://github.com/emotion-js/emotion/blob/main/packages/sheet/README.md#speedy
48+
speedy: true, // Enable speedy mode for better performance
49+
};
4250

4351
const emotionCache = createCache({
52+
...sharedCacheOptions,
4453
key: 'css',
45-
stylisPlugins,
4654
container: document.querySelector('meta[name="emotion"]') as HTMLElement,
4755
});
4856

4957
const globalCache = createCache({
58+
...sharedCacheOptions,
5059
key: EUI_STYLES_GLOBAL,
51-
stylisPlugins,
5260
container: document.querySelector(`meta[name="${EUI_STYLES_GLOBAL}"]`) as HTMLElement,
5361
});
5462

5563
const utilitiesCache = createCache({
64+
...sharedCacheOptions,
5665
key: EUI_STYLES_UTILS,
57-
stylisPlugins,
5866
container: document.querySelector(`meta[name="${EUI_STYLES_UTILS}"]`) as HTMLElement,
5967
});
6068

src/platform/plugins/shared/discover/public/__mocks__/services.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ export function createDiscoverServicesMock(): DiscoverServices {
188188
advancedSettings: {
189189
save: true,
190190
},
191+
indexPatterns: {
192+
save: true,
193+
},
191194
},
192195
fieldFormats: fieldFormatsMock,
193196
filterManager: dataPlugin.query.filterManager,
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
11+
import React, { type PropsWithChildren, useMemo, useState } from 'react';
12+
import {
13+
type CombinedRuntimeState,
14+
InternalStateProvider,
15+
RuntimeStateProvider,
16+
CurrentTabProvider,
17+
} from '../application/main/state_management/redux';
18+
import {
19+
DiscoverCustomizationProvider,
20+
type DiscoverCustomizationService,
21+
} from '../customizations';
22+
import { DiscoverMainProvider } from '../application/main/state_management/discover_state_provider';
23+
import { type ScopedProfilesManager, ScopedProfilesManagerProvider } from '../context_awareness';
24+
import type { DiscoverServices } from '../build_services';
25+
import { createDiscoverServicesMock } from './services';
26+
import type { DiscoverStateContainer } from '../application/main/state_management/discover_state';
27+
import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render';
28+
import { ChartPortalsRenderer } from '../application/main/components/chart';
29+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
30+
31+
export const DiscoverTestProvider = ({
32+
services: originalServices,
33+
stateContainer,
34+
customizationService,
35+
runtimeState,
36+
scopedProfilesManager: originalScopedProfilesManager,
37+
currentTabId: originalCurrentTabId,
38+
usePortalsRenderer,
39+
children,
40+
}: PropsWithChildren<{
41+
services?: DiscoverServices;
42+
stateContainer?: DiscoverStateContainer;
43+
customizationService?: DiscoverCustomizationService;
44+
scopedProfilesManager?: ScopedProfilesManager;
45+
runtimeState?: CombinedRuntimeState;
46+
currentTabId?: string;
47+
usePortalsRenderer?: boolean;
48+
}>) => {
49+
const [queryClient] = useState(() => new QueryClient());
50+
const services = useMemo(
51+
() => originalServices ?? createDiscoverServicesMock(),
52+
[originalServices]
53+
);
54+
const scopedProfilesManager = useMemo(
55+
() => originalScopedProfilesManager ?? services.profilesManager.createScopedProfilesManager(),
56+
[originalScopedProfilesManager, services.profilesManager]
57+
);
58+
const currentTabId = originalCurrentTabId ?? stateContainer?.getCurrentTab().id;
59+
60+
children = (
61+
<ScopedProfilesManagerProvider scopedProfilesManager={scopedProfilesManager}>
62+
{children}
63+
</ScopedProfilesManagerProvider>
64+
);
65+
66+
if (runtimeState) {
67+
children = <RuntimeStateProvider {...runtimeState}>{children}</RuntimeStateProvider>;
68+
}
69+
70+
if (stateContainer) {
71+
children = <DiscoverMainProvider value={stateContainer}>{children}</DiscoverMainProvider>;
72+
}
73+
74+
if (currentTabId && !usePortalsRenderer) {
75+
children = <CurrentTabProvider currentTabId={currentTabId}>{children}</CurrentTabProvider>;
76+
}
77+
78+
if (customizationService) {
79+
children = (
80+
<DiscoverCustomizationProvider value={customizationService}>
81+
{children}
82+
</DiscoverCustomizationProvider>
83+
);
84+
}
85+
86+
if (stateContainer && usePortalsRenderer) {
87+
children = (
88+
<ChartPortalsRenderer runtimeStateManager={stateContainer.runtimeStateManager}>
89+
{children}
90+
</ChartPortalsRenderer>
91+
);
92+
}
93+
94+
if (stateContainer) {
95+
children = (
96+
<InternalStateProvider store={stateContainer.internalState}>{children}</InternalStateProvider>
97+
);
98+
}
99+
100+
return (
101+
<KibanaRenderContextProvider {...services.core}>
102+
<KibanaContextProvider services={services}>
103+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
104+
</KibanaContextProvider>
105+
</KibanaRenderContextProvider>
106+
);
107+
};

src/platform/plugins/shared/discover/public/application/context/components/action_bar/action_bar.test.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import { mountWithIntl } from '@kbn/test-jest-helpers';
1212
import type { ActionBarProps } from './action_bar';
1313
import { ActionBar } from './action_bar';
1414
import { findTestSubject } from '@elastic/eui/lib/test';
15-
import { EuiThemeProvider } from '@elastic/eui';
1615
import { MAX_CONTEXT_SIZE, MIN_CONTEXT_SIZE } from '../../services/constants';
1716
import { SurrDocType } from '../../services/context';
17+
import { DiscoverTestProvider } from '../../../../__mocks__/test_provider';
1818

1919
describe('Test Discover Context ActionBar for successor | predecessor records', () => {
2020
[SurrDocType.SUCCESSORS, SurrDocType.PREDECESSORS].forEach((type) => {
@@ -29,9 +29,9 @@ describe('Test Discover Context ActionBar for successor | predecessor records',
2929
type,
3030
} as ActionBarProps;
3131
const wrapper = mountWithIntl(
32-
<EuiThemeProvider>
32+
<DiscoverTestProvider>
3333
<ActionBar {...props} />
34-
</EuiThemeProvider>
34+
</DiscoverTestProvider>
3535
);
3636

3737
const input = findTestSubject(wrapper, `${type}CountPicker`);
@@ -89,9 +89,9 @@ describe('Test Discover Context ActionBar for successor | predecessor records',
8989

9090
test(`${type}: Load button disabled when defaultStepSize is 0`, () => {
9191
const wrapperWhenZeroStep = mountWithIntl(
92-
<EuiThemeProvider>
92+
<DiscoverTestProvider>
9393
<ActionBar {...props} defaultStepSize={0} />
94-
</EuiThemeProvider>
94+
</DiscoverTestProvider>
9595
);
9696
const inputWhenZeroStep = findTestSubject(wrapperWhenZeroStep, `${type}CountPicker`);
9797
const btnWhenZeroStep = findTestSubject(wrapperWhenZeroStep, `${type}LoadMoreButton`);

src/platform/plugins/shared/discover/public/application/context/context_app.test.tsx

Lines changed: 18 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -10,78 +10,30 @@
1010
import React from 'react';
1111
import { waitFor } from '@testing-library/react';
1212
import { mountWithIntl } from '@kbn/test-jest-helpers';
13-
import { createFilterManagerMock } from '@kbn/data-plugin/public/query/filter_manager/filter_manager.mock';
14-
import { EuiThemeProvider } from '@elastic/eui';
1513
import { mockTopNavMenu } from './__mocks__/top_nav_menu';
1614
import { ContextAppContent } from './context_app_content';
1715
import { dataViewMock } from '@kbn/discover-utils/src/__mocks__';
18-
import { ContextApp } from './context_app';
19-
import type { DiscoverServices } from '../../build_services';
20-
import { dataViewsMock } from '../../__mocks__/data_views';
16+
import { ContextApp, type ContextAppProps } from './context_app';
2117
import { act } from 'react-dom/test-utils';
2218
import { uiSettingsMock } from '../../__mocks__/ui_settings';
23-
import { themeServiceMock } from '@kbn/core/public/mocks';
24-
import { LocalStorageMock } from '../../__mocks__/local_storage_mock';
25-
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
26-
import type { HistoryLocationState } from '../../build_services';
27-
import { createSearchSessionMock } from '../../__mocks__/search_session';
2819
import { createDiscoverServicesMock } from '../../__mocks__/services';
20+
import { DiscoverTestProvider } from '../../__mocks__/test_provider';
21+
import type { NavigationPublicStart } from '@kbn/navigation-plugin/public/types';
2922

30-
const mockFilterManager = createFilterManagerMock();
3123
const mockNavigationPlugin = {
3224
ui: { TopNavMenu: mockTopNavMenu, AggregateQueryTopNavMenu: mockTopNavMenu },
33-
};
34-
const discoverServices = createDiscoverServicesMock();
25+
} as unknown as NavigationPublicStart;
26+
const services = createDiscoverServicesMock();
27+
const addFiltersMock = jest.spyOn(services.filterManager, 'addFilters');
28+
const updateSavedObjectMock = jest.spyOn(services.dataViews, 'updateSavedObject');
3529

36-
describe('ContextApp test', () => {
37-
const { history } = createSearchSessionMock();
38-
const services = {
39-
data: discoverServices.data,
40-
capabilities: {
41-
discover: {
42-
save: true,
43-
},
44-
indexPatterns: {
45-
save: true,
46-
},
47-
},
48-
dataViews: dataViewsMock,
49-
toastNotifications: { addDanger: () => {} },
50-
navigation: mockNavigationPlugin,
51-
core: {
52-
...discoverServices.core,
53-
executionContext: {
54-
set: jest.fn(),
55-
},
56-
notifications: { toasts: [] },
57-
theme: { theme$: themeServiceMock.createStartContract().theme$ },
58-
},
59-
history,
60-
fieldFormats: {
61-
getDefaultInstance: jest.fn(() => ({ convert: (value: unknown) => value })),
62-
getFormatterForField: jest.fn(() => ({ convert: (value: unknown) => value })),
63-
},
64-
filterManager: mockFilterManager,
65-
uiSettings: uiSettingsMock,
66-
storage: new LocalStorageMock({}),
67-
chrome: { setBreadcrumbs: jest.fn() },
68-
locator: {
69-
useUrl: jest.fn(() => ''),
70-
navigate: jest.fn(),
71-
getUrl: jest.fn(() => Promise.resolve('mock-url')),
72-
},
73-
contextLocator: { getRedirectUrl: jest.fn(() => '') },
74-
singleDocLocator: { getRedirectUrl: jest.fn(() => '') },
75-
profilesManager: discoverServices.profilesManager,
76-
ebtManager: discoverServices.ebtManager,
77-
timefilter: discoverServices.timefilter,
78-
uiActions: discoverServices.uiActions,
79-
} as unknown as DiscoverServices;
30+
services.navigation = mockNavigationPlugin;
31+
services.uiSettings = uiSettingsMock;
8032

81-
const defaultProps = {
33+
describe('ContextApp test', () => {
34+
const defaultProps: ContextAppProps = {
8235
dataView: dataViewMock,
8336
anchorId: 'mocked_anchor_id',
84-
locationState: {} as HistoryLocationState,
8537
};
8638

8739
const topNavProps = {
@@ -96,11 +48,9 @@ describe('ContextApp test', () => {
9648

9749
const mountComponent = () => {
9850
return mountWithIntl(
99-
<KibanaContextProvider services={services}>
100-
<EuiThemeProvider>
101-
<ContextApp {...defaultProps} />
102-
</EuiThemeProvider>
103-
</KibanaContextProvider>
51+
<DiscoverTestProvider services={services}>
52+
<ContextApp {...defaultProps} />
53+
</DiscoverTestProvider>
10454
);
10555
};
10656

@@ -125,15 +75,15 @@ describe('ContextApp test', () => {
12575
);
12676
});
12777

128-
expect(mockFilterManager.addFilters.mock.calls.length).toBe(1);
129-
expect(mockFilterManager.addFilters.mock.calls[0][0]).toEqual([
78+
expect(addFiltersMock.mock.calls.length).toBe(1);
79+
expect(addFiltersMock.mock.calls[0][0]).toEqual([
13080
{
13181
$state: { store: 'appState' },
13282
meta: { alias: null, disabled: false, index: 'the-data-view-id', negate: false },
13383
query: { match_phrase: { message: '2021-06-08T07:52:19.000Z' } },
13484
},
13585
]);
136-
expect(dataViewsMock.updateSavedObject.mock.calls.length).toBe(1);
137-
expect(dataViewsMock.updateSavedObject.mock.calls[0]).toEqual([dataViewMock, 0, true]);
86+
expect(updateSavedObjectMock.mock.calls.length).toBe(1);
87+
expect(updateSavedObjectMock.mock.calls[0]).toEqual([dataViewMock, 0, true]);
13888
});
13989
});

0 commit comments

Comments
 (0)