/* * 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 { findTestSubject } from '@elastic/eui/lib/test'; import React from 'react'; import { skip } from 'rxjs/operators'; import { mount } from 'enzyme'; import { I18nProvider } from '@osd/i18n/react'; import sizeMe from 'react-sizeme'; import { nextTick } from 'test_utils/enzyme_helpers'; import { DashboardViewport, DashboardViewportProps } from './dashboard_viewport'; import { DashboardContainer, DashboardContainerOptions } from '../dashboard_container'; import { getSampleDashboardInput } from '../../test_helpers'; import { CONTACT_CARD_EMBEDDABLE, ContactCardEmbeddableFactory, } from '../../../../../embeddable/public/lib/test_samples'; import { embeddablePluginMock } from '../../../../../embeddable/public/mocks'; import { OpenSearchDashboardsContextProvider } from '../../../../../opensearch_dashboards_react/public'; import { applicationServiceMock } from '../../../../../../core/public/mocks'; sizeMe.noPlaceholders = true; let dashboardContainer: DashboardContainer | undefined; const ExitFullScreenButton = () =>
EXIT
; function getProps( props?: Partial ): { props: DashboardViewportProps; options: DashboardContainerOptions; } { const { setup, doStart } = embeddablePluginMock.createInstance(); setup.registerEmbeddableFactory( CONTACT_CARD_EMBEDDABLE, new ContactCardEmbeddableFactory((() => null) as any, {} as any) ); const start = doStart(); const options: DashboardContainerOptions = { application: applicationServiceMock.createStartContract(), embeddable: { getTriggerCompatibleActions: (() => []) as any, getEmbeddablePanel: jest.fn(), getEmbeddableFactories: start.getEmbeddableFactories, getEmbeddableFactory: start.getEmbeddableFactory, } as any, notifications: {} as any, overlays: {} as any, inspector: { isAvailable: jest.fn(), } as any, SavedObjectFinder: () => null, ExitFullScreenButton, uiActions: { getTriggerCompatibleActions: (() => []) as any, } as any, }; const input = getSampleDashboardInput({ panels: { '1': { gridData: { x: 0, y: 0, w: 6, h: 6, i: '1' }, type: CONTACT_CARD_EMBEDDABLE, explicitInput: { id: '1' }, }, '2': { gridData: { x: 6, y: 6, w: 6, h: 6, i: '2' }, type: CONTACT_CARD_EMBEDDABLE, explicitInput: { id: '2' }, }, }, }); dashboardContainer = new DashboardContainer(input, options); const defaultTestProps: DashboardViewportProps = { container: dashboardContainer, PanelComponent: () =>
, }; return { props: Object.assign(defaultTestProps, props), options, }; } test('renders DashboardViewport', () => { const { props, options } = getProps(); const component = mount( ); const panels = findTestSubject(component, 'dashboardPanel'); expect(panels.length).toBe(2); }); test('renders DashboardViewport with no visualizations', () => { const { props, options } = getProps(); props.container.updateInput({ panels: {} }); const component = mount( ); const panels = findTestSubject(component, 'dashboardPanel'); expect(panels.length).toBe(0); component.unmount(); }); test('renders DashboardEmptyScreen', () => { const renderEmptyScreen = jest.fn(); const { props, options } = getProps({ renderEmpty: renderEmptyScreen }); props.container.updateInput({ isEmptyState: true }); const component = mount( ); const dashboardEmptyScreenDiv = component.find('.dshDashboardEmptyScreen'); expect(dashboardEmptyScreenDiv.length).toBe(1); expect(renderEmptyScreen).toHaveBeenCalled(); component.unmount(); }); test('renders exit full screen button when in full screen mode', async () => { const { props, options } = getProps(); props.container.updateInput({ isFullScreenMode: true }); const component = mount( ); expect((component.find('.dshDashboardViewport').childAt(0).type() as any).name).toBe( 'ExitFullScreenButton' ); props.container.updateInput({ isFullScreenMode: false }); component.update(); await nextTick(); expect((component.find('.dshDashboardViewport').childAt(0).type() as any).name).not.toBe( 'ExitFullScreenButton' ); component.unmount(); }); test('renders exit full screen button when in full screen mode and empty screen', async () => { const renderEmptyScreen = jest.fn(); renderEmptyScreen.mockReturnValue(React.createElement('div')); const { props, options } = getProps({ renderEmpty: renderEmptyScreen }); props.container.updateInput({ isEmptyState: true, isFullScreenMode: true }); const component = mount( ); expect((component.find('.dshDashboardEmptyScreen').childAt(0).type() as any).name).toBe( 'ExitFullScreenButton' ); props.container.updateInput({ isFullScreenMode: false }); component.update(); await nextTick(); expect((component.find('.dshDashboardEmptyScreen').childAt(0).type() as any).name).not.toBe( 'ExitFullScreenButton' ); component.unmount(); }); test('DashboardViewport unmount unsubscribes', (done) => { const { props, options } = getProps(); const component = mount( ); component.unmount(); props.container .getInput$() .pipe(skip(1)) .subscribe(() => { done(); }); props.container.updateInput({ panels: {} }); });