[Discover] Dont trigger onChange when the same index pattern is selected (#102652)

This commit is contained in:
Matthias Wilhelm 2021-06-23 17:18:20 +02:00 committed by GitHub
parent 702661d34f
commit dbbfdbcbc0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 78 additions and 5 deletions

View file

@ -0,0 +1,71 @@
/*
* 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 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import React from 'react';
import { EuiSelectable } from '@elastic/eui';
import { ShallowWrapper } from 'enzyme';
import { act } from 'react-dom/test-utils';
import { shallowWithIntl } from '@kbn/test/jest';
import { ChangeIndexPattern } from './change_indexpattern';
import { indexPatternMock } from '../../../../../__mocks__/index_pattern';
import { indexPatternWithTimefieldMock } from '../../../../../__mocks__/index_pattern_with_timefield';
import { IndexPatternRef } from './types';
function getProps() {
return {
indexPatternId: indexPatternMock.id,
indexPatternRefs: [
indexPatternMock as IndexPatternRef,
indexPatternWithTimefieldMock as IndexPatternRef,
],
onChangeIndexPattern: jest.fn(),
trigger: {
label: indexPatternMock.title,
title: indexPatternMock.title,
'data-test-subj': 'indexPattern-switch-link',
},
};
}
function getIndexPatternPickerList(instance: ShallowWrapper) {
return instance.find(EuiSelectable).first();
}
function getIndexPatternPickerOptions(instance: ShallowWrapper) {
return getIndexPatternPickerList(instance).prop('options');
}
export function selectIndexPatternPickerOption(instance: ShallowWrapper, selectedLabel: string) {
const options: Array<{ label: string; checked?: 'on' | 'off' }> = getIndexPatternPickerOptions(
instance
).map((option: { label: string }) =>
option.label === selectedLabel
? { ...option, checked: 'on' }
: { ...option, checked: undefined }
);
return getIndexPatternPickerList(instance).prop('onChange')!(options);
}
describe('ChangeIndexPattern', () => {
test('switching index pattern to the same index pattern does not trigger onChangeIndexPattern', async () => {
const props = getProps();
const comp = shallowWithIntl(<ChangeIndexPattern {...props} />);
await act(async () => {
selectIndexPatternPickerOption(comp, indexPatternMock.title);
});
expect(props.onChangeIndexPattern).toHaveBeenCalledTimes(0);
});
test('switching index pattern to a different index pattern triggers onChangeIndexPattern', async () => {
const props = getProps();
const comp = shallowWithIntl(<ChangeIndexPattern {...props} />);
await act(async () => {
selectIndexPatternPickerOption(comp, indexPatternWithTimefieldMock.title);
});
expect(props.onChangeIndexPattern).toHaveBeenCalledTimes(1);
expect(props.onChangeIndexPattern).toHaveBeenCalledWith(indexPatternWithTimefieldMock.id);
});
});

View file

@ -26,17 +26,17 @@ export type ChangeIndexPatternTriggerProps = EuiButtonProps & {
// TODO: refactor to shared component with ../../../../../../../../x-pack/legacy/plugins/lens/public/indexpattern_plugin/change_indexpattern
export function ChangeIndexPattern({
indexPatternRefs,
indexPatternId,
indexPatternRefs,
onChangeIndexPattern,
trigger,
selectableProps,
trigger,
}: {
trigger: ChangeIndexPatternTriggerProps;
indexPatternId?: string;
indexPatternRefs: IndexPatternRef[];
onChangeIndexPattern: (newId: string) => void;
indexPatternId?: string;
selectableProps?: EuiSelectableProps<{ value: string }>;
trigger: ChangeIndexPatternTriggerProps;
}) {
const [isPopoverOpen, setPopoverIsOpen] = useState(false);
@ -86,7 +86,9 @@ export function ChangeIndexPattern({
const choice = (choices.find(({ checked }) => checked) as unknown) as {
value: string;
};
onChangeIndexPattern(choice.value);
if (choice.value !== indexPatternId) {
onChangeIndexPattern(choice.value);
}
setPopoverIsOpen(false);
}}
searchProps={{