/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import { EuiHeaderProps } from '@elastic/eui'; import React from 'react'; import { BehaviorSubject } from 'rxjs'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { HeaderLogo, DEFAULT_DARK_LOGO, DEFAULT_LOGO } from './header_logo'; import { BasePath } from '../../../http/base_path'; const basePath = new BasePath('/base'); const mockProps = () => ({ href: '/', basePath, navLinks$: new BehaviorSubject([]), forceNavigation$: new BehaviorSubject(false), navigateToApp: jest.fn(), branding: {}, theme: 'default' as EuiHeaderProps['theme'], }); describe('Header logo', () => { describe('when default-themed ', () => { it('uses dashboards logo if no branding is provided', () => { const branding = {}; const props = { ...mockProps(), branding, }; const component = mountWithIntl(); const img = component.find('.logoContainer img'); expect(img.prop('src')).toEqual(`${basePath.serverBasePath}/${DEFAULT_LOGO}`); expect(img.prop('alt')).toEqual(`opensearch dashboards logo`); expect(component).toMatchSnapshot(); }); it('uses dashboards logo if branding containing no logo is provided', () => { const branding = { logo: {}, mark: {}, applicationTitle: 'custom title', assetFolderUrl: 'base/ui/default_branding', }; const props = { ...mockProps(), branding, }; const component = mountWithIntl(); const img = component.find('.logoContainer img'); expect(img.prop('src')).toEqual(`${basePath.serverBasePath}/${DEFAULT_LOGO}`); expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`); expect(component).toMatchSnapshot(); }); it('uses dashboards logo if branding containing a mark but not a logo is provided', () => { const branding = { logo: {}, mark: { defaultUrl: '/defaultModeMark' }, applicationTitle: 'custom title', assetFolderUrl: 'base/ui/default_branding', }; const props = { ...mockProps(), branding, }; const component = mountWithIntl(); const img = component.find('.logoContainer img'); expect(img.prop('src')).toEqual(`${basePath.serverBasePath}/${DEFAULT_LOGO}`); expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`); expect(component).toMatchSnapshot(); }); it('uses custom default-mode logo if branding logo is provided', () => { const branding = { logo: { defaultUrl: '/defaultModeLogo' }, mark: {}, applicationTitle: 'custom title', assetFolderUrl: 'base/ui/default_branding', }; const props = { ...mockProps(), branding, }; const component = mountWithIntl(); const img = component.find('.logoContainer img'); expect(img.prop('src')).toEqual(branding.logo.defaultUrl); expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`); expect(component).toMatchSnapshot(); }); }); describe('when dark-themed', () => { it("uses dashboards' dark logo if no branding is provided", () => { const branding = {}; const props = { ...mockProps(), branding, theme: 'dark' as EuiHeaderProps['theme'], }; const component = mountWithIntl(); const img = component.find('.logoContainer img'); expect(img.prop('src')).toEqual(`${basePath.serverBasePath}/${DEFAULT_DARK_LOGO}`); expect(img.prop('alt')).toEqual(`opensearch dashboards logo`); expect(component).toMatchSnapshot(); }); it("uses dashboards' dark logo if branding containing no logo is provided", () => { const branding = { logo: {}, mark: {}, applicationTitle: 'custom title', assetFolderUrl: 'base/ui/default_branding', }; const props = { ...mockProps(), branding, theme: 'dark' as EuiHeaderProps['theme'], }; const component = mountWithIntl(); const img = component.find('.logoContainer img'); expect(img.prop('src')).toEqual(`${basePath.serverBasePath}/${DEFAULT_DARK_LOGO}`); expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`); expect(component).toMatchSnapshot(); }); it("uses dashboards' dark logo if branding containing a mark but not a logo is provided", () => { const branding = { logo: {}, mark: { defaultUrl: '/defaultModeMark' }, applicationTitle: 'custom title', assetFolderUrl: 'base/ui/default_branding', }; const props = { ...mockProps(), branding, theme: 'dark' as EuiHeaderProps['theme'], }; const component = mountWithIntl(); const img = component.find('.logoContainer img'); expect(img.prop('src')).toEqual(`${basePath.serverBasePath}/${DEFAULT_DARK_LOGO}`); expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`); expect(component).toMatchSnapshot(); }); it('uses default-themed custom logo if branding without dark-mode logo is provided', () => { const branding = { logo: { defaultUrl: '/defaultModeLogo' }, mark: {}, applicationTitle: 'custom title', assetFolderUrl: 'base/ui/default_branding', }; const props = { ...mockProps(), branding, theme: 'dark' as EuiHeaderProps['theme'], }; const component = mountWithIntl(); const img = component.find('.logoContainer img'); expect(img.prop('src')).toEqual(branding.logo.defaultUrl); expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`); expect(component).toMatchSnapshot(); }); it('uses custom dark-mode logo if branding dark-mode logo is provided', () => { const branding = { logo: { defaultUrl: '/defaultModeLogo', darkModeUrl: '/darkModeLogo' }, mark: {}, applicationTitle: 'custom title', assetFolderUrl: 'base/ui/default_branding', }; const props = { ...mockProps(), branding, theme: 'dark' as EuiHeaderProps['theme'], }; const component = mountWithIntl(); const img = component.find('.logoContainer img'); expect(img.prop('src')).toEqual(branding.logo.darkModeUrl); expect(img.prop('alt')).toEqual(`${branding.applicationTitle} logo`); expect(component).toMatchSnapshot(); }); }); });