import React from 'react'; import ExtensionPoint from './ExtensionPoint'; import { shallow, mount } from 'enzyme'; import '@scm-manager/ui-tests/enzyme'; import binder from './binder'; jest.mock('./binder'); describe('ExtensionPoint test', () => { beforeEach(() => { binder.hasExtension.mockReset(); binder.getExtension.mockReset(); binder.getExtensions.mockReset(); }); it('should render nothing, if no extension was bound', () => { binder.hasExtension.mockReturnValue(true); binder.getExtensions.mockReturnValue([]); const rendered = shallow(); expect(rendered.text()).toBe(''); }); it('should render the given component', () => { const label = () => { return ; }; binder.hasExtension.mockReturnValue(true); binder.getExtension.mockReturnValue(label); const rendered = mount(); expect(rendered.text()).toBe('Extension One'); }); // We use this wrapper since Enzyme cannot handle React Fragments (see https://github.com/airbnb/enzyme/issues/1213) class ExtensionPointEnzymeFix extends ExtensionPoint { render() { return
{super.render()}
; } } it('should render the given components', () => { const labelOne = () => { return ; }; const labelTwo = () => { return ; }; binder.hasExtension.mockReturnValue(true); binder.getExtensions.mockReturnValue([labelOne, labelTwo]); const rendered = mount( , ); const text = rendered.text(); expect(text).toContain('Extension One'); expect(text).toContain('Extension Two'); }); it('should render the given component, with the given props', () => { type Props = { value: string; }; const label = (props: Props) => { return ; }; binder.hasExtension.mockReturnValue(true); binder.getExtension.mockReturnValue(label); const rendered = mount( , ); const text = rendered.text(); expect(text).toContain('Awesome'); }); it('should render children, if no extension is bound', () => { const rendered = mount(

Cool stuff

, ); const text = rendered.text(); expect(text).toContain('Cool stuff'); }); it('should not render children, if an extension was bound', () => { const label = () => { return ; }; binder.hasExtension.mockReturnValue(true); binder.getExtension.mockReturnValue(label); const rendered = mount(

Cool stuff

, ); const text = rendered.text(); expect(text).toContain('Bound Extension'); }); it('should pass the context of the parent component', () => { const UserContext = React.createContext({ name: 'anonymous', }); type HelloProps = { name: string; }; const Hello = (props: HelloProps) => { return ; }; const HelloUser = () => { return ( {({ name }) => } ); }; binder.hasExtension.mockReturnValue(true); binder.getExtension.mockReturnValue(HelloUser); const App = () => { return ( ); }; const rendered = mount(); const text = rendered.text(); expect(text).toBe('Hello Trillian'); }); });