application/__tests__/hocs/draftable-test.js
jest.unmock('./../../hocs/draftable');
jest.unmock('./../../services/base-service');
jest.unmock('./../../services/error-service');
jest.unmock('./../../services/draft-service');
jest.unmock('./../../util/strings');
jest.unmock('./../../alt');
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 {DraftService, DraftsStore} from './../../services/draft-service';
import {withDraftable} from './../../hocs/draftable';
class MockChild extends React.Component {
constructor(props) {
super(props);
}
draftCb() {
return;
}
updateCb() {
return;
}
componentWillMount() {
this.props.draftable.doesHaveDraft({'srn': 'tsn:123'}, this.draftCb);
this.props.draftable.setDraftCreatedHook(this.updateCb);
}
componentWillUnmount() {
}
render() {
return (
<div className='internalObject'></div>
);
}
}
const MockWrapped = withDraftable(MockChild);
describe('DraftableComponent', () => {
beforeEach(() => {
jasmine.clock().uninstall();
jasmine.clock().install();
sinon.stub(window, 'fetch').returns(fetch([
{
id: 1,
srn: 'srn:tsn:ceo-core:content/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,
version: 5
}
]));
sinon.stub(MockChild.prototype, 'componentWillMount');
});
afterEach(() => {
window.fetch.restore();
jasmine.clock().uninstall();
MockChild.prototype.componentWillMount.restore();
});
it('wraps component', () => {
const wrapSpy = sinon.spy(MockWrapped.prototype, 'componentWillMount');
const el = TestUtils.renderIntoDocument(<MockWrapped />);
expect(wrapSpy.called).toEqual(true);
expect(el.interval).not.toEqual(false);
MockWrapped.prototype.componentWillMount.restore();
});
it('calls interval', () => {
const wrapSpy = sinon.spy(MockWrapped.prototype, 'createDraft');
const el = TestUtils.renderIntoDocument(<MockWrapped />);
expect(wrapSpy.called).toEqual(false);
expect(el.isDirty).toEqual(false);
jasmine.clock().tick(5001);
expect(wrapSpy.called).toEqual(true);
expect(el.isDirty).toEqual(false);
MockWrapped.prototype.createDraft.restore();
});
it('is dirty', (done) => {
const wrapSpy = sinon.spy(MockWrapped.prototype, 'createDraft');
const el = TestUtils.renderIntoDocument(<MockWrapped />);
el.setState({'raw': {}});
expect(wrapSpy.called).toEqual(false);
expect(el.isDirty).toEqual(false);
expect(JSON.stringify(el.state.raw)).toEqual('{}');
el.onChange({'raw': {'foo': 'bar'}});
expect(JSON.stringify(el.state.raw)).toEqual('{"foo":"bar"}');
expect(el.isDirty).toEqual(true);
jasmine.clock().tick(5001);
expect(wrapSpy.called).toEqual(true);
jasmine.clock().tick(101);
expect(window.fetch.called).toEqual(true);
// actually wait for the return
jasmine.clock().uninstall();
setTimeout(() => {
expect(el.isDirty).toEqual(false);
MockWrapped.prototype.createDraft.restore();
done()
}, 100);
});
it('is not dirty', () => {
const wrapSpy = sinon.spy(MockWrapped.prototype, 'createDraft');
const el = TestUtils.renderIntoDocument(<MockWrapped />);
el.setState({'raw': {'foo': 'bar'}});
expect(wrapSpy.called).toEqual(false);
expect(el.isDirty).toEqual(false);
el.onChange({'raw': {'foo': 'bar'}});
expect(el.isDirty).toEqual(false);
jasmine.clock().tick(5001);
expect(wrapSpy.called).toEqual(true);
jasmine.clock().tick(101);
expect(el.isDirty).toEqual(false);
expect(window.fetch.called).toEqual(false);
MockWrapped.prototype.createDraft.restore();
});
it('returns valid draft', (done) => {
window.fetch.restore();
MockChild.prototype.componentWillMount.restore();
sinon.stub(window, 'fetch').returns(fetch([
{
id: 1,
content_raw: '{"foo":"bar"}'
}
]));
const mockSpy = sinon.spy(MockChild.prototype, 'draftCb');
const checkSpy = sinon.spy(MockWrapped.prototype, 'checkDraft');
jasmine.clock().uninstall();
const el = TestUtils.renderIntoDocument(<MockWrapped />);
setTimeout(() => {
expect(checkSpy.called).toEqual(true);
expect(window.fetch.called).toEqual(true);
expect(mockSpy.called).toEqual(true);
const ret = mockSpy.getCalls()[0].args[0];
expect(ret.get('content_raw')).toEqual('{"foo":"bar"}');
MockChild.prototype.draftCb.restore();
MockWrapped.prototype.checkDraft.restore();
sinon.stub(MockChild.prototype, 'componentWillMount');
done();
}, 100);
});
it('returns empty draft', (done) => {
window.fetch.restore();
MockChild.prototype.componentWillMount.restore();
sinon.stub(window, 'fetch').returns(fetch([]));
const mockSpy = sinon.spy(MockChild.prototype, 'draftCb');
const checkSpy = sinon.spy(MockWrapped.prototype, 'checkDraft');
jasmine.clock().uninstall();
const el = TestUtils.renderIntoDocument(<MockWrapped />);
setTimeout(() => {
expect(checkSpy.called).toEqual(true);
expect(window.fetch.called).toEqual(true);
expect(mockSpy.called).toEqual(true);
const ret = mockSpy.getCalls()[0].args[0];
expect(ret).toEqual(false);
MockChild.prototype.draftCb.restore();
MockWrapped.prototype.checkDraft.restore();
sinon.stub(MockChild.prototype, 'componentWillMount');
done();
}, 100);
});
it('returns calls update callback', (done) => {
window.fetch.restore();
MockChild.prototype.componentWillMount.restore();
sinon.stub(window, 'fetch').returns(fetch([
{
id: 1,
content_raw: '{"foo":"bar"}'
}
]));
const mockSpy = sinon.spy(MockChild.prototype, 'updateCb');
const el = TestUtils.renderIntoDocument(<MockWrapped />);
expect(mockSpy.called).toEqual(false);
el.onChange({'raw': {'foo': 'bar'}});
jasmine.clock().tick(5101);
// actually wait for the return
jasmine.clock().uninstall();
setTimeout(() => {
expect(mockSpy.called).toEqual(true);
MockChild.prototype.updateCb.restore();
sinon.stub(MockChild.prototype, 'componentWillMount');
done();
}, 100);
});
});