/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*
* Any modifications Copyright OpenSearch Contributors. See
* GitHub history for details.
*/
/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import React from 'react';
import { mount } from 'enzyme';
import { findTestSubject } from 'test_utils/helpers';
import { DocViewTable } from './table';
import { indexPatterns, IndexPattern } from '../../../../../data/public';
const indexPattern = ({
fields: {
getAll: () => [
{
name: '_index',
type: 'string',
scripted: false,
filterable: true,
},
{
name: 'message',
type: 'string',
scripted: false,
filterable: false,
},
{
name: 'extension',
type: 'string',
scripted: false,
filterable: true,
},
{
name: 'bytes',
type: 'number',
scripted: false,
filterable: true,
},
{
name: 'scripted',
type: 'number',
scripted: true,
filterable: false,
},
],
},
metaFields: ['_index', '_score'],
flattenHit: undefined,
formatHit: jest.fn((hit) => hit._source),
} as unknown) as IndexPattern;
indexPattern.fields.getByName = (name: string) => {
return indexPattern.fields.getAll().find((field) => field.name === name);
};
indexPattern.flattenHit = indexPatterns.flattenHitWrapper(indexPattern, indexPattern.metaFields);
describe('DocViewTable at Discover', () => {
// At Discover's main view, all buttons are rendered
// check for existence of action buttons and warnings
const hit = {
_index: 'logstash-2014.09.09',
_type: 'doc',
_id: 'id123',
_score: 1,
_source: {
message:
'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. \
Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus \
et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, \
ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. \
Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, \
rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. \
Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. \
Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut',
extension: 'html',
not_mapped: 'yes',
bytes: 100,
objectArray: [{ foo: true }],
relatedContent: {
test: 1,
},
scripted: 123,
_underscore: 123,
},
};
const props = {
hit,
columns: ['extension'],
indexPattern,
filter: jest.fn(),
onAddColumn: jest.fn(),
onRemoveColumn: jest.fn(),
};
const component = mount();
[
{
_property: '_index',
addInclusiveFilterButton: true,
collapseBtn: false,
noMappingWarning: false,
toggleColumnButton: true,
underscoreWarning: false,
},
{
_property: 'message',
addInclusiveFilterButton: false,
collapseBtn: true,
noMappingWarning: false,
toggleColumnButton: true,
underscoreWarning: false,
},
{
_property: '_underscore',
addInclusiveFilterButton: false,
collapseBtn: false,
noMappingWarning: false,
toggleColumnButton: true,
underScoreWarning: true,
},
{
_property: 'scripted',
addInclusiveFilterButton: false,
collapseBtn: false,
noMappingWarning: false,
toggleColumnButton: true,
underScoreWarning: false,
},
{
_property: 'not_mapped',
addInclusiveFilterButton: false,
collapseBtn: false,
noMappingWarning: true,
toggleColumnButton: true,
underScoreWarning: false,
},
].forEach((check) => {
const rowComponent = findTestSubject(component, `tableDocViewRow-${check._property}`);
it(`renders row for ${check._property}`, () => {
expect(rowComponent.length).toBe(1);
});
([
'addInclusiveFilterButton',
'collapseBtn',
'toggleColumnButton',
'underscoreWarning',
] as const).forEach((element) => {
const elementExist = check[element];
if (typeof elementExist === 'boolean') {
const btn = findTestSubject(rowComponent, element);
it(`renders ${element} for '${check._property}' correctly`, () => {
const disabled = btn.length ? btn.props().disabled : true;
const clickAble = btn.length && !disabled ? true : false;
expect(clickAble).toBe(elementExist);
});
}
});
(['noMappingWarning'] as const).forEach((element) => {
const elementExist = check[element];
if (typeof elementExist === 'boolean') {
const el = findTestSubject(rowComponent, element);
it(`renders ${element} for '${check._property}' correctly`, () => {
expect(el.length).toBe(elementExist ? 1 : 0);
});
}
});
});
});
describe('DocViewTable at Discover Doc', () => {
const hit = {
_index: 'logstash-2014.09.09',
_score: 1,
_type: 'doc',
_id: 'id123',
_source: {
extension: 'html',
not_mapped: 'yes',
},
};
// here no action buttons are rendered
const props = {
hit,
indexPattern,
};
const component = mount();
const foundLength = findTestSubject(component, 'addInclusiveFilterButton').length;
it(`renders no action buttons`, () => {
expect(foundLength).toBe(0);
});
});
describe('DocViewTable at Discover Context', () => {
// here no toggleColumnButtons are rendered
const hit = {
_index: 'logstash-2014.09.09',
_type: 'doc',
_id: 'id123',
_score: 1,
_source: {
message:
'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. \
Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus \
et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, \
ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. \
Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, \
rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. \
Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. \
Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vestibulum volutpat pretium libero. Cras id dui. Aenean ut',
},
};
const props = {
hit,
columns: ['extension'],
indexPattern,
filter: jest.fn(),
};
const component = mount();
it(`renders no toggleColumnButton`, () => {
const foundLength = findTestSubject(component, 'toggleColumnButtons').length;
expect(foundLength).toBe(0);
});
it(`renders addInclusiveFilterButton`, () => {
const row = findTestSubject(component, `tableDocViewRow-_index`);
const btn = findTestSubject(row, 'addInclusiveFilterButton');
expect(btn.length).toBe(1);
btn.simulate('click');
expect(props.filter).toBeCalled();
});
it(`renders functional collapse button`, () => {
const btn = findTestSubject(component, `collapseBtn`);
const html = component.html();
expect(component.html()).toContain('truncate-by-height');
expect(btn.length).toBe(1);
btn.simulate('click');
expect(component.html() !== html).toBeTruthy();
});
});