Skip to content

Commit

Permalink
[Lens] Load indexpatterns list from indexPattern Service (elastic#91984)
Browse files Browse the repository at this point in the history
* [Lens] Load lists from indexPattern Service

* test that indexpattern service has not been called

* Use mock data

Co-authored-by: Kibana Machine <[email protected]>
  • Loading branch information
stratoula and kibanamachine authored Feb 22, 2021
1 parent 556a882 commit bdfa969
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ export function getIndexPatternDatasource({
data: DataPublicPluginStart;
charts: ChartsPluginSetup;
}) {
const savedObjectsClient = core.savedObjects.client;
const uiSettings = core.uiSettings;
const onIndexPatternLoadError = (err: Error) =>
core.notifications.toasts.addError(err, {
Expand Down Expand Up @@ -121,7 +120,6 @@ export function getIndexPatternDatasource({
return loadInitialState({
persistedState,
references,
savedObjectsClient: await savedObjectsClient,
defaultIndexPatternId: core.uiSettings.get('defaultIndex'),
storage,
indexPatternsService,
Expand Down
58 changes: 31 additions & 27 deletions x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* 2.0.
*/

import { HttpHandler, SavedObjectsClientContract } from 'kibana/public';
import { HttpHandler } from 'kibana/public';
import _ from 'lodash';
import {
loadInitialState,
Expand Down Expand Up @@ -183,23 +183,24 @@ const sampleIndexPatterns = {
'2': indexPattern2,
};

function mockClient() {
return ({
find: jest.fn(async () => ({
savedObjects: [
{ id: '1', attributes: { title: sampleIndexPatterns[1].title } },
{ id: '2', attributes: { title: sampleIndexPatterns[2].title } },
],
})),
} as unknown) as Pick<SavedObjectsClientContract, 'find'>;
}

function mockIndexPatternsService() {
return ({
get: jest.fn(async (id: '1' | '2') => {
return { ...sampleIndexPatternsFromService[id], metaFields: [] };
}),
} as unknown) as Pick<IndexPatternsContract, 'get'>;
getIdsWithTitle: jest.fn(async () => {
return [
{
id: sampleIndexPatterns[1].id,
title: sampleIndexPatterns[1].title,
},
{
id: sampleIndexPatterns[2].id,
title: sampleIndexPatterns[2].title,
},
];
}),
} as unknown) as Pick<IndexPatternsContract, 'get' | 'getIdsWithTitle'>;
}

describe('loader', () => {
Expand All @@ -212,7 +213,8 @@ describe('loader', () => {
get: jest.fn(() =>
Promise.reject('mockIndexPatternService.get should not have been called')
),
} as unknown) as Pick<IndexPatternsContract, 'get'>,
getIdsWithTitle: jest.fn(),
} as unknown) as Pick<IndexPatternsContract, 'get' | 'getIdsWithTitle'>,
});

expect(cache).toEqual(sampleIndexPatterns);
Expand Down Expand Up @@ -281,7 +283,11 @@ describe('loader', () => {
},
],
})),
} as unknown) as Pick<IndexPatternsContract, 'get'>,
getIdsWithTitle: jest.fn(async () => ({
id: 'foo',
title: 'Foo index',
})),
} as unknown) as Pick<IndexPatternsContract, 'get' | 'getIdsWithTitle'>,
});

expect(cache.foo.getFieldByName('bytes')!.aggregationRestrictions).toEqual({
Expand Down Expand Up @@ -333,7 +339,11 @@ describe('loader', () => {
},
],
})),
} as unknown) as Pick<IndexPatternsContract, 'get'>,
getIdsWithTitle: jest.fn(async () => ({
id: 'foo',
title: 'Foo index',
})),
} as unknown) as Pick<IndexPatternsContract, 'get' | 'getIdsWithTitle'>,
});

expect(cache.foo.getFieldByName('timestamp')!.meta).toEqual(true);
Expand All @@ -344,7 +354,6 @@ describe('loader', () => {
it('should load a default state', async () => {
const storage = createMockStorage();
const state = await loadInitialState({
savedObjectsClient: mockClient(),
indexPatternsService: mockIndexPatternsService(),
storage,
options: { isFullEditor: true },
Expand All @@ -368,10 +377,9 @@ describe('loader', () => {

it('should load a default state without loading the indexPatterns when embedded', async () => {
const storage = createMockStorage();
const savedObjectsClient = mockClient();
const indexPatternsService = mockIndexPatternsService();
const state = await loadInitialState({
savedObjectsClient,
indexPatternsService: mockIndexPatternsService(),
indexPatternsService,
storage,
options: { isFullEditor: false },
});
Expand All @@ -384,14 +392,12 @@ describe('loader', () => {
});

expect(storage.set).not.toHaveBeenCalled();

expect(savedObjectsClient.find).not.toHaveBeenCalled();
expect(indexPatternsService.getIdsWithTitle).not.toHaveBeenCalled();
});

it('should load a default state when lastUsedIndexPatternId is not found in indexPatternRefs', async () => {
const storage = createMockStorage({ indexPatternId: 'c' });
const state = await loadInitialState({
savedObjectsClient: mockClient(),
indexPatternsService: mockIndexPatternsService(),
storage,
options: { isFullEditor: true },
Expand All @@ -415,7 +421,6 @@ describe('loader', () => {

it('should load lastUsedIndexPatternId if in localStorage', async () => {
const state = await loadInitialState({
savedObjectsClient: mockClient(),
indexPatternsService: mockIndexPatternsService(),
storage: createMockStorage({ indexPatternId: '2' }),
options: { isFullEditor: true },
Expand All @@ -438,7 +443,6 @@ describe('loader', () => {
const storage = createMockStorage();
const state = await loadInitialState({
defaultIndexPatternId: '2',
savedObjectsClient: mockClient(),
indexPatternsService: mockIndexPatternsService(),
storage,
options: { isFullEditor: true },
Expand All @@ -463,7 +467,6 @@ describe('loader', () => {
it('should use the indexPatternId of the visualize trigger field, if provided', async () => {
const storage = createMockStorage();
const state = await loadInitialState({
savedObjectsClient: mockClient(),
indexPatternsService: mockIndexPatternsService(),
storage,
initialContext: {
Expand Down Expand Up @@ -524,7 +527,6 @@ describe('loader', () => {
{ name: 'indexpattern-datasource-layer-layerb', id: '2', type: 'index-pattern' },
{ name: 'another-reference', id: 'c', type: 'index-pattern' },
],
savedObjectsClient: mockClient(),
indexPatternsService: mockIndexPatternsService(),
storage,
options: { isFullEditor: true },
Expand Down Expand Up @@ -681,6 +683,7 @@ describe('loader', () => {
get: jest.fn(async () => {
throw err;
}),
getIdsWithTitle: jest.fn(),
},
onError,
storage,
Expand Down Expand Up @@ -808,6 +811,7 @@ describe('loader', () => {
get: jest.fn(async () => {
throw err;
}),
getIdsWithTitle: jest.fn(),
},
onError,
storage,
Expand Down
28 changes: 8 additions & 20 deletions x-pack/plugins/lens/public/indexpattern_datasource/loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import _ from 'lodash';
import { IStorageWrapper } from 'src/plugins/kibana_utils/public';
import { SavedObjectsClientContract, HttpSetup, SavedObjectReference } from 'kibana/public';
import { HttpSetup, SavedObjectReference } from 'kibana/public';
import { InitializationOptions, StateSetter } from '../types';
import {
IndexPattern,
Expand All @@ -30,8 +30,7 @@ import { readFromStorage, writeToStorage } from '../settings_storage';
import { getFieldByNameFactory } from './pure_helpers';

type SetState = StateSetter<IndexPatternPrivateState>;
type SavedObjectsClient = Pick<SavedObjectsClientContract, 'find'>;
type IndexPatternsService = Pick<IndexPatternsContract, 'get'>;
type IndexPatternsService = Pick<IndexPatternsContract, 'get' | 'getIdsWithTitle'>;
type ErrorHandler = (err: Error) => void;

export async function loadIndexPatterns({
Expand Down Expand Up @@ -186,7 +185,6 @@ export function injectReferences(
export async function loadInitialState({
persistedState,
references,
savedObjectsClient,
defaultIndexPatternId,
storage,
indexPatternsService,
Expand All @@ -195,15 +193,14 @@ export async function loadInitialState({
}: {
persistedState?: IndexPatternPersistedState;
references?: SavedObjectReference[];
savedObjectsClient: SavedObjectsClient;
defaultIndexPatternId?: string;
storage: IStorageWrapper;
indexPatternsService: IndexPatternsService;
initialContext?: VisualizeFieldContext;
options?: InitializationOptions;
}): Promise<IndexPatternPrivateState> {
const { isFullEditor } = options ?? {};
const indexPatternRefs = await (isFullEditor ? loadIndexPatternRefs(savedObjectsClient) : []);
const indexPatternRefs = await (isFullEditor ? loadIndexPatternRefs(indexPatternsService) : []);
const lastUsedIndexPatternId = getLastUsedIndexPatternId(storage, indexPatternRefs);

const state =
Expand Down Expand Up @@ -334,22 +331,13 @@ export async function changeLayerIndexPattern({
}

async function loadIndexPatternRefs(
savedObjectsClient: SavedObjectsClient
indexPatternsService: IndexPatternsService
): Promise<IndexPatternRef[]> {
const result = await savedObjectsClient.find<{ title: string }>({
type: 'index-pattern',
fields: ['title'],
perPage: 10000,
});
const indexPatterns = await indexPatternsService.getIdsWithTitle();

return result.savedObjects
.map((o) => ({
id: String(o.id),
title: (o.attributes as { title: string }).title,
}))
.sort((a, b) => {
return a.title.localeCompare(b.title);
});
return indexPatterns.sort((a, b) => {
return a.title.localeCompare(b.title);
});
}

export async function syncExistingFields({
Expand Down

0 comments on commit bdfa969

Please sign in to comment.