import React from 'react'; import { shallow } from 'enzyme'; import assert from 'assert'; import _, { forEach, has } from 'lodash'; import { common } from '../../util/generic-tests'; import LoadingMessage from './LoadingMessage'; import LoadingIcon from '../Icon/LoadingIcon/LoadingIcon'; import SuccessIcon from '../Icon/SuccessIcon/SuccessIcon'; const { Icon, Title, Body } = LoadingMessage; describe('LoadingMessage', () => { common(LoadingMessage); describe('render', () => { let wrapper: any; beforeEach(() => (wrapper = shallow())); it('should render a LoadingIcon', () => { assert.equal( wrapper.find(LoadingIcon).length, 1, 'must render loading icon' ); }); it('should render "Loading" as the title', () => { assert.equal( wrapper.find('.lucid-LoadingMessage-title').text(), 'Loading' ); }); it('should not render a body', () => { assert.equal(wrapper.find('.lucid-LoadingMessage-body').length, 0); }); it('should not have `&-no-content` class', () => { assert(!wrapper.hasClass('lucid-LoadingMessage-no-content')); }); }); describe('child components', () => { describe('Icon', () => { it('should render the custom icon', () => { const wrapper = shallow( ); assert.equal(wrapper.find(SuccessIcon).length, 1); }); it('should render the custom icon', () => { const wrapper = shallow(} />); assert.equal(wrapper.find(SuccessIcon).length, 1); }); }); describe('Title', () => { it('should render the custom title', () => { const wrapper = shallow( A custom title ); assert.equal( wrapper.find('.lucid-LoadingMessage-title').text(), 'A custom title' ); }); it('should render the custom title', () => { const wrapper = shallow(); assert.equal( wrapper.find('.lucid-LoadingMessage-title').text(), 'A custom title' ); }); describe('null', () => { let wrapper: any; beforeEach(() => (wrapper = shallow())); it('should render a LoadingIcon', () => { assert.equal( wrapper.find(LoadingIcon).length, 1, 'must render loading icon' ); }); it('should not render a title', () => { assert.equal(wrapper.find('.lucid-LoadingMessage-title').length, 0); }); it('should add `&-no-content` class', () => { assert(wrapper.hasClass('lucid-LoadingMessage-no-content')); }); }); }); describe('Body', () => { it('should render the custom body', () => { const wrapper = shallow( A custom body ); assert.equal( wrapper.find('.lucid-LoadingMessage-body').text(), 'A custom body' ); }); it('should render the custom body', () => { const wrapper = shallow(); assert.equal( wrapper.find('.lucid-LoadingMessage-body').text(), 'A custom body' ); }); }); }); describe('pass throughs', () => { let wrapper: any; beforeEach(() => { const props = { className: 'wut', style: { marginRight: 10 }, initialState: { test: true }, callbackId: 1, 'data-testid': 10, Icon: , Title: 'Test Title', Body: 'Test Body', }; wrapper = shallow(); }); afterEach(() => { wrapper.unmount(); }); it('passes through props not defined in `propTypes` to the root element.', () => { const rootProps = wrapper.find('.lucid-LoadingMessage').props(); // Note: 'className' is plucked from the pass through object // but still appear becuase they are also directly passed to the root element as a prop. forEach(['className', 'style', 'data-testid', 'children'], (prop) => { expect(has(rootProps, prop)).toBe(true); }); expect(wrapper.first().prop(['className'])).toContain('wut'); expect(wrapper.first().prop(['style'])).toMatchObject({ marginRight: 10, }); expect(wrapper.first().prop(['data-testid'])).toBe(10); }); it('omits the props defined in `propTypes` from the root element, plus, in addition, `initialState and callbackId`.', () => { const rootProps = wrapper.find('.lucid-LoadingMessage').props(); // initialState and callbackId are always both omitted forEach( ['Icon', 'Title', 'Body', 'initialState', 'callbackId'], (prop) => { expect(has(rootProps, prop)).toBe(false); } ); }); }); });