application/__tests__/components/assignment/assignment-item-test.js
jest.unmock('./../../../services/base-service');
jest.unmock('./../../../services/error-service');
jest.unmock('./../../../services/content-service');
jest.unmock('./../../../services/assignment-service');
jest.unmock('./../../../metaproperties/meta-properties');
jest.unmock('./../../../metaproperties/text-meta-property');
jest.unmock('./../../../components/assignment/assignment-item');
// jest.unmock('./../../../components/content/content-meta-properties');
jest.unmock('./../../../util/strings');
jest.unmock('./../../../alt');
jest.unmock('draft-js');
import React from 'react';
import ReactDOM from 'react-dom';
import TestUtils from 'react-addons-test-utils';
import Immutable from 'immutable';
import sinon from 'sinon';
import AltTestingUtils from 'alt-utils/lib/AltTestingUtils';
import {Input} from 'react-materialize';
import fetch from './../../../util/mock-fetch';
import {AssignmentService, AssignmentsStore} from './../../../services/assignment-service';
import AssignmentItem from './../../../components/assignment/assignment-item';
import MetaProperties from './../../../metaproperties/meta-properties';
describe('AssignmentItemComponent', () => {
    beforeEach(() => {
        jasmine.clock().uninstall();
        sinon.stub(window, 'fetch').returns(fetch([
            {
                id: 1,
                srn: 'srn:tsn:ceo-core:assignment/5432543-54325432',
                uuid: '5432543-54325432',
                slug: 'imma-test-slug',
                created_at: '2016-05-09 15:23:01',
                modified_at: '2016-05-09 15:34:16',
                published_at: null
            }
        ]));
    });
    afterEach(() => {
        window.fetch.restore();
    });
    it('renders base form', (done) => {
        const el = TestUtils.renderIntoDocument(<AssignmentItem uuid='5432543-54325432' />);
        setTimeout(() => {
            expect(el.state.assignment.get('uuid')).toEqual('5432543-54325432');
            expect(el.isUserEditable()).toEqual(false);
            const inputs = TestUtils.scryRenderedDOMComponentsWithTag(el, 'input');
            expect(inputs.length).toBeGreaterThan(0);
            done();
        }, 100);
    });
    it('handles checkout', (done) => {
        const el = TestUtils.renderIntoDocument(<AssignmentItem uuid='5432543-54325432' />);
        setTimeout(() => {
            window.fetch.restore();
            sinon.stub(window, 'fetch').returns(fetch([
                {
                    id: 1,
                    srn: 'srn:tsn:ceo-core:assignment/5432543-54325432',
                    uuid: '5432543-54325432',
                    slug: 'imma-test-slug',
                    created_at: '2016-05-09 15:23:01',
                    modified_at: '2016-05-09 15:34:16',
                    published_at: null,
                    lock: {
                        user_id: 1
                    }
                }
            ]));
            const checkoutSpy = sinon.spy(AssignmentService, 'checkoutAndFetch');
            expect(el.state.assignment.get('uuid')).toEqual('5432543-54325432');
            expect(el.isUserEditable()).toEqual(false);
            // const btn = TestUtils.findRenderedDOMComponentWithClass(el, 'action-checkout');
            // TestUtils.Simulate.click(btn, {});
            el.handleCheckout();
            setTimeout(() => {
                expect(checkoutSpy.called).toEqual(true);
                AssignmentService.checkoutAndFetch.restore();
                expect(el.isUserEditable()).toEqual(true);
                done();
            }, 100);
        }, 100);
    })
    it('handles checkin', (done) => {
        window.fetch.restore();
        sinon.stub(window, 'fetch').returns(fetch([
            {
                id: 1,
                uuid: '5432543-54325432',
                slug: 'imma-test-slug',
                created_at: '2016-05-09 15:23:01',
                modified_at: '2016-05-09 15:34:16',
                published_at: null,
                lock: {
                    user_id: 1
                }
            }
        ]));
        const el = TestUtils.renderIntoDocument(<AssignmentItem uuid='5432543-54325432' />);
        setTimeout(() => {
            const checkinSpy = sinon.spy(AssignmentService, 'checkinAndFetch');
            expect(el.state.assignment.get('uuid')).toEqual('5432543-54325432');
            expect(el.isUserEditable()).toEqual(true);
            window.fetch.restore();
            sinon.stub(window, 'fetch').returns(fetch([
                {
                    id: 1,
                    uuid: '5432543-54325432',
                    slug: 'imma-test-slug',
                    created_at: '2016-05-09 15:23:01',
                    modified_at: '2016-05-09 15:34:16',
                    published_at: null
                }
            ]));
            // const btn = TestUtils.findRenderedDOMComponentWithClass(el, 'action-checkin');
            // expect(btn);
            // TestUtils.Simulate.click(btn, {});
            el.handleCheckin();
            setTimeout(() => {
                expect(checkinSpy.called).toEqual(true);
                AssignmentService.checkinAndFetch.restore();
                expect(el.isUserEditable()).toEqual(false);
                done();
            }, 100);
        }, 100);
    });
    it('handles checkout when locked', (done) => {
        window.fetch.restore();
        sinon.stub(window, 'fetch').returns(fetch([
            {
                id: 1,
                uuid: '5432543-54325432',
                slug: 'imma-test-slug',
                created_at: '2016-05-09 15:23:01',
                modified_at: '2016-05-09 15:34:16',
                published_at: null,
                lock: {
                    // different user than the ID in the mock user
                    user_id: 2
                }
            }
        ]));
        const el = TestUtils.renderIntoDocument(<AssignmentItem uuid='5432543-54325432' />);
        setTimeout(() => {
            const checkinSpy = sinon.spy(AssignmentService, 'checkoutAndFetch');
            expect(el.state.assignment.get('uuid')).toEqual('5432543-54325432');
            expect(el.isUserEditable()).toEqual(false);
            // const btn = TestUtils.findRenderedDOMComponentWithClass(el, 'action-checkout');
            // TestUtils.Simulate.click(btn, {});
            el.handleCheckout();
            setTimeout(() => {
                expect(checkinSpy.called).toEqual(true);
                AssignmentService.checkoutAndFetch.restore();
                expect(el.isUserEditable()).toEqual(false);
                done();
            }, 100);
        }, 100);
    });
    it('handles save', (done) => {
        window.fetch.restore();
        sinon.stub(window, 'fetch').returns(fetch([
            {
                id: 1,
                uuid: '5432543-54325432',
                slug: 'imma-test-slug',
                created_at: '2016-05-09 15:23:01',
                modified_at: '2016-05-09 15:34:16',
                published_at: null,
                lock: {
                    user_id: 1
                }
            }
        ]));
        const el = TestUtils.renderIntoDocument(<AssignmentItem uuid='5432543-54325432' />);
        setTimeout(() => {
            expect(el.state.assignment.get('uuid')).toEqual('5432543-54325432');
            expect(el.isUserEditable()).toEqual(true);
            const saveSpy = sinon.spy(AssignmentService, 'update');
            // const btn = TestUtils.findRenderedDOMComponentWithClass(el, 'action-save');
            // TestUtils.Simulate.click(btn, {});
            el.handleSave();
            setTimeout(() => {
                expect(saveSpy.called).toEqual(true);
                AssignmentService.update.restore();
                done();
            }, 100);
        }, 100);
    });
    it('handles save with users', (done) => {
        window.fetch.restore();
        sinon.stub(window, 'fetch').returns(fetch([
            {
                id: 1,
                uuid: '5432543-54325432',
                slug: 'imma-test-slug',
                created_at: '2016-05-09 15:23:01',
                modified_at: '2016-05-09 15:34:16',
                published_at: null,
                lock: {
                    user_id: 1
                }
            }
        ]));
        const el = TestUtils.renderIntoDocument(<AssignmentItem uuid='5432543-54325432' />);
        setTimeout(() => {
            expect(el.state.assignment.get('uuid')).toEqual('5432543-54325432');
            expect(el.isUserEditable()).toEqual(true);
            el.onSelectUser({}, Immutable.fromJS([
                {
                    uuid: 6,
                    name: 'foo bar'
                }
            ]));
            const saveSpy = sinon.spy(AssignmentService, 'update');
            // const btn = TestUtils.findRenderedDOMComponentWithClass(el, 'action-save');
            // TestUtils.Simulate.click(btn, {});
            el.handleSave();
            setTimeout(() => {
                expect(saveSpy.called).toEqual(true);
                AssignmentService.update.restore();
                const data = window.fetch.getCalls()[1].args[1];
                expect(data.body);
                expect(data.body).toContain('"users":[6]');
                // expect(window.fetch.getCalls()[1].arguments);
                done();
            }, 100);
        }, 100);
    });
    it('handles save with content', (done) => {
        window.fetch.restore();
        sinon.stub(window, 'fetch').returns(fetch([
            {
                id: 1,
                uuid: '5432543-54325432',
                slug: 'imma-test-slug',
                created_at: '2016-05-09 15:23:01',
                modified_at: '2016-05-09 15:34:16',
                published_at: null,
                lock: {
                    user_id: 1
                }
            }
        ]));
        const el = TestUtils.renderIntoDocument(<AssignmentItem uuid='5432543-54325432' />);
        setTimeout(() => {
            expect(el.state.assignment.get('uuid')).toEqual('5432543-54325432');
            expect(el.isUserEditable()).toEqual(true);
            el.onSelectContent({}, Immutable.fromJS([
                {
                    uuid: '12321-432432',
                    content: 'foo bar'
                }
            ]));
            const saveSpy = sinon.spy(AssignmentService, 'update');
            // const btn = TestUtils.findRenderedDOMComponentWithClass(el, 'action-save');
            // TestUtils.Simulate.click(btn, {});
            el.handleSave();
            setTimeout(() => {
                expect(saveSpy.called).toEqual(true);
                AssignmentService.update.restore();
                const data = window.fetch.getCalls()[1].args[1];
                expect(data.body);
                expect(data.body).toContain('"children":["12321-432432"]');
                done();
            }, 100);
        }, 100);
    });
    it('handles save locked', (done) => {
        const el = TestUtils.renderIntoDocument(<AssignmentItem uuid='5432543-54325432' />);
            const saveSpy = sinon.spy(AssignmentService, 'update');
        setTimeout(() => {
            expect(el.state.assignment.get('uuid')).toEqual('5432543-54325432');
            expect(el.isUserEditable()).toEqual(false);
            // const btn = TestUtils.findRenderedDOMComponentWithClass(el, 'action-save');
            // TestUtils.Simulate.click(btn, {});
            el.handleSave();
            setTimeout(() => {
                expect(saveSpy.called).toEqual(false);
                AssignmentService.update.restore();
                done();
            }, 100);
        }, 100);
    });
    it('displays new assignment', (done) => {
        const el = TestUtils.renderIntoDocument(<AssignmentItem />);
        setTimeout(() => {
            expect(el.isUserEditable()).toEqual(true);
            expect(el.isNew()).toEqual(true);
            const inputs = TestUtils.scryRenderedDOMComponentsWithTag(el, 'input');
            expect(inputs.length).toBeGreaterThan(0);
            done();
        }, 100);
    });
});