import expect from 'expect'; import React from 'react'; import TestUtils from 'react-addons-test-utils'; import Footer from '../../components/Footer'; import { SHOW_ALL, SHOW_ACTIVE } from '../../constants/TodoFilters'; function setup(propOverrides) { const props = Object.assign( { completedCount: 0, activeCount: 0, filter: SHOW_ALL, onClearCompleted: expect.createSpy(), onShow: expect.createSpy(), }, propOverrides ); const renderer = TestUtils.createRenderer(); renderer.render(<Footer {...props} />); const output = renderer.getRenderOutput(); return { props: props, output: output, }; } function getTextContent(elem) { const children = Array.isArray(elem.props.children) ? elem.props.children : [elem.props.children]; return children.reduce(function concatText(out, child) { // Children are either elements or text strings return out + (child.props ? getTextContent(child) : child); }, ''); } describe('components', () => { describe('Footer', () => { it('should render container', () => { const { output } = setup(); expect(output.type).toBe('footer'); expect(output.props.className).toBe('footer'); }); it('should display active count when 0', () => { const { output } = setup({ activeCount: 0 }); const [count] = output.props.children; expect(getTextContent(count)).toBe('No items left'); }); it('should display active count when above 0', () => { const { output } = setup({ activeCount: 1 }); const [count] = output.props.children; expect(getTextContent(count)).toBe('1 item left'); }); it('should render filters', () => { const { output } = setup(); const [, filters] = output.props.children; expect(filters.type).toBe('ul'); expect(filters.props.className).toBe('filters'); expect(filters.props.children.length).toBe(3); filters.props.children.forEach(function checkFilter(filter, i) { expect(filter.type).toBe('li'); const a = filter.props.children; expect(a.props.className).toBe(i === 0 ? 'selected' : ''); expect(a.props.children).toBe( { 0: 'All', 1: 'Active', 2: 'Completed', }[i] ); }); }); it('should call onShow when a filter is clicked', () => { const { output, props } = setup(); const [, filters] = output.props.children; const filterLink = filters.props.children[1].props.children; filterLink.props.onClick({}); expect(props.onShow).toHaveBeenCalledWith(SHOW_ACTIVE); }); it('shouldnt show clear button when no completed todos', () => { const { output } = setup({ completedCount: 0 }); const [, , clear] = output.props.children; expect(clear).toBe(undefined); }); it('should render clear button when completed todos', () => { const { output } = setup({ completedCount: 1 }); const [, , clear] = output.props.children; expect(clear.type).toBe('button'); expect(clear.props.children).toBe('Clear completed'); }); it('should call onClearCompleted on clear button click', () => { const { output, props } = setup({ completedCount: 1 }); const [, , clear] = output.props.children; clear.props.onClick({}); expect(props.onClearCompleted).toHaveBeenCalled(); }); }); });