import { mock } from 'angular'; import type { IModalService } from 'angular-ui-bootstrap'; import type { ReactWrapper } from 'enzyme'; import { mount } from 'enzyme'; import React from 'react'; import { Button } from 'react-bootstrap'; import type { IInsightMenuProps, IInsightMenuState } from './InsightMenu'; import { InsightMenu } from './InsightMenu'; import type { CacheInitializerService } from '../cache/cacheInitializer.service'; import { OverrideRegistry } from '../overrideRegistry/override.registry'; beforeEach(() => { mock.module(($provide: any) => { $provide.value('$uibModal', {} as IModalService); $provide.value('overrideRegistry', new OverrideRegistry()); $provide.value('cacheInitializer', {} as CacheInitializerService); }); }); describe('', () => { let component: ReactWrapper; function getNewMenu(params: object): ReactWrapper { // Set defaults to zero so we only need to pass in the prop we want rendered const mergedParams = { ...{ createApp: false, createProject: false, refreshCaches: false }, ...params }; return mount( , ); } it('should only render create application button when initialized', () => { component = getNewMenu({ createApp: true }); const btn = component.find(Button); expect(btn.length).toBe(1); expect(btn.text()).toEqual('Create Application'); // Button should always be primary for create application // FIXME: when this project moves to v1+ of react-bootstrap this prop will need to change. expect(btn.prop('bsStyle')).toEqual('primary'); }); it('should only render create project button when initialized', () => { component = getNewMenu({ createProject: true }); const btn = component.find(Button); expect(btn.length).toBe(1); expect(btn.text()).toEqual('Create Project'); // If project is the only button rendered, it should be primary. // FIXME: when this project moves to v1+ of react-bootstrap this prop will need to change. expect(btn.prop('bsStyle')).toEqual('primary'); }); it('should only render refresh cache button when initialized', () => { // note: this test doesn't validate the state changes that could occur w/ // the refresh button in particular. component = getNewMenu({ refreshCaches: true }); const btn = component.find(Button); expect(btn.length).toBe(1); expect(btn.text()).toMatch('Refresh'); }); it('should only render create application as primary when multiple buttons are rendered', () => { component = getNewMenu({ createApp: true, createProject: true }); const btns = component.find(Button); const proj = btns.at(0); const app = btns.at(1); expect(btns.length).toBe(2); // Project button should be first expect(proj.text()).toEqual('Create Project'); // FIXME: when this project moves to v1+ of react-bootstrap this prop will need to change. expect(proj.prop('bsStyle')).toEqual('default'); // Application button should be second, so that it renders furthest to the right expect(app.text()).toEqual('Create Application'); // FIXME: when this project moves to v1+ of react-bootstrap this prop will need to change. expect(app.prop('bsStyle')).toEqual('primary'); }); });