content: 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();
      });
    });
  });
  