kibana/x-pack/plugins/lens/public/datatable_visualization/expression.test.tsx
Tyler Smalley aba2068291
Consolidates Jest configuration files and scripts (#82671)
Jest tests are currently organized into main configuration files (src/dev/jest/config.js and x-pack/dev-tools/jest/create_jest_config.js). Both of these are similar, but very slightly due to  previously being in separate repositories. This change consolidates the scripts referenced in those configs and moves them to the `@kbn/test` project.

OSS contained an alias for `test_utils`. Those aliases have been removed in favor of importing these utilities from `@kbn/test/jest`

Blocker to #72569

Signed-off-by: Tyler Smalley <tyler.smalley@elastic.co>
2020-11-12 16:19:56 -08:00

279 lines
7.7 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;
* you may not use this file except in compliance with the Elastic License.
*/
import React from 'react';
import { shallow } from 'enzyme';
import { mountWithIntl } from '@kbn/test/jest';
import { datatable, DatatableComponent } from './expression';
import { LensMultiTable } from '../types';
import { DatatableProps } from './expression';
import { createMockExecutionContext } from '../../../../../src/plugins/expressions/common/mocks';
import { IFieldFormat } from '../../../../../src/plugins/data/public';
import { IAggType } from 'src/plugins/data/public';
import { EmptyPlaceholder } from '../shared_components';
import { LensIconChartDatatable } from '../assets/chart_datatable';
function sampleArgs() {
const indexPatternId = 'indexPatternId';
const data: LensMultiTable = {
type: 'lens_multitable',
tables: {
l1: {
type: 'datatable',
columns: [
{
id: 'a',
name: 'a',
meta: {
type: 'string',
source: 'esaggs',
field: 'a',
sourceParams: { type: 'terms', indexPatternId },
},
},
{
id: 'b',
name: 'b',
meta: {
type: 'date',
field: 'b',
source: 'esaggs',
sourceParams: {
type: 'date_histogram',
indexPatternId,
},
},
},
{
id: 'c',
name: 'c',
meta: {
type: 'number',
source: 'esaggs',
field: 'c',
sourceParams: { indexPatternId, type: 'count' },
},
},
],
rows: [{ a: 'shoes', b: 1588024800000, c: 3 }],
},
},
};
const args: DatatableProps['args'] = {
title: 'My fanci metric chart',
columns: {
columnIds: ['a', 'b', 'c'],
type: 'lens_datatable_columns',
},
};
return { data, args };
}
describe('datatable_expression', () => {
let onClickValue: jest.Mock;
beforeEach(() => {
onClickValue = jest.fn();
});
describe('datatable renders', () => {
test('it renders with the specified data and args', () => {
const { data, args } = sampleArgs();
const result = datatable.fn(data, args, createMockExecutionContext());
expect(result).toEqual({
type: 'render',
as: 'lens_datatable_renderer',
value: { data, args },
});
});
});
describe('DatatableComponent', () => {
test('it renders the title and value', () => {
const { data, args } = sampleArgs();
expect(
shallow(
<DatatableComponent
data={data}
args={args}
formatFactory={(x) => x as IFieldFormat}
onClickValue={onClickValue}
getType={jest.fn()}
/>
)
).toMatchSnapshot();
});
test('it invokes executeTriggerActions with correct context on click on top value', () => {
const { args, data } = sampleArgs();
const wrapper = mountWithIntl(
<DatatableComponent
data={{
...data,
dateRange: {
fromDate: new Date('2020-04-20T05:00:00.000Z'),
toDate: new Date('2020-05-03T05:00:00.000Z'),
},
}}
args={args}
formatFactory={(x) => x as IFieldFormat}
onClickValue={onClickValue}
getType={jest.fn(() => ({ type: 'buckets' } as IAggType))}
/>
);
wrapper.find('[data-test-subj="lensDatatableFilterOut"]').first().simulate('click');
expect(onClickValue).toHaveBeenCalledWith({
data: [
{
column: 0,
row: 0,
table: data.tables.l1,
value: 'shoes',
},
],
negate: true,
timeFieldName: 'a',
});
});
test('it invokes executeTriggerActions with correct context on click on timefield', () => {
const { args, data } = sampleArgs();
const wrapper = mountWithIntl(
<DatatableComponent
data={{
...data,
dateRange: {
fromDate: new Date('2020-04-20T05:00:00.000Z'),
toDate: new Date('2020-05-03T05:00:00.000Z'),
},
}}
args={args}
formatFactory={(x) => x as IFieldFormat}
onClickValue={onClickValue}
getType={jest.fn(() => ({ type: 'buckets' } as IAggType))}
/>
);
wrapper.find('[data-test-subj="lensDatatableFilterFor"]').at(3).simulate('click');
expect(onClickValue).toHaveBeenCalledWith({
data: [
{
column: 1,
row: 0,
table: data.tables.l1,
value: 1588024800000,
},
],
negate: false,
timeFieldName: 'b',
});
});
test('it invokes executeTriggerActions with correct context on click on timefield from range', () => {
const data: LensMultiTable = {
type: 'lens_multitable',
tables: {
l1: {
type: 'datatable',
columns: [
{
id: 'a',
name: 'a',
meta: {
type: 'date',
source: 'esaggs',
field: 'a',
sourceParams: { type: 'date_range', indexPatternId: 'a' },
},
},
{
id: 'b',
name: 'b',
meta: {
type: 'number',
source: 'esaggs',
sourceParams: { type: 'count', indexPatternId: 'a' },
},
},
],
rows: [{ a: 1588024800000, b: 3 }],
},
},
};
const args: DatatableProps['args'] = {
title: '',
columns: { columnIds: ['a', 'b'], type: 'lens_datatable_columns' },
};
const wrapper = mountWithIntl(
<DatatableComponent
data={{
...data,
dateRange: {
fromDate: new Date('2020-04-20T05:00:00.000Z'),
toDate: new Date('2020-05-03T05:00:00.000Z'),
},
}}
args={args}
formatFactory={(x) => x as IFieldFormat}
onClickValue={onClickValue}
getType={jest.fn(() => ({ type: 'buckets' } as IAggType))}
/>
);
wrapper.find('[data-test-subj="lensDatatableFilterFor"]').at(1).simulate('click');
expect(onClickValue).toHaveBeenCalledWith({
data: [
{
column: 0,
row: 0,
table: data.tables.l1,
value: 1588024800000,
},
],
negate: false,
timeFieldName: 'a',
});
});
test('it shows emptyPlaceholder for undefined bucketed data', () => {
const { args, data } = sampleArgs();
const emptyData: LensMultiTable = {
...data,
tables: {
l1: {
...data.tables.l1,
rows: [{ a: undefined, b: undefined, c: 0 }],
},
},
};
const component = shallow(
<DatatableComponent
data={emptyData}
args={args}
formatFactory={(x) => x as IFieldFormat}
onClickValue={onClickValue}
getType={jest.fn((type) =>
type === 'count' ? ({ type: 'metrics' } as IAggType) : ({ type: 'buckets' } as IAggType)
)}
/>
);
expect(component.find(EmptyPlaceholder).prop('icon')).toEqual(LensIconChartDatatable);
});
});
});