blob: 61bd50e6ffe2db02a705965ad15b50a937c30439 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
import FauxtonAPI from "../api";
import React from "react";
import ReactDOM from "react-dom";
import utils from "../../../test/mocha/testUtils";
import TestUtils from "react-addons-test-utils";
import sinon from "sinon";
var assert = utils.assert,
restore = utils.restore,
RouteObject = FauxtonAPI.RouteObject;
describe('RouteObjects', function () {
describe('renderWith', function () {
var TestRouteObject, testRouteObject, mockLayout;
beforeEach(function () {
TestRouteObject = RouteObject.extend({
crumbs: ['mycrumbs']
});
testRouteObject = new TestRouteObject();
var apiBar = {};
apiBar.hide = sinon.spy();
// Need to find a better way of doing this
mockLayout = {
setTemplate: function () {
var promise = $.Deferred();
promise.resolve();
return promise;
},
clearBreadcrumbs: sinon.spy(),
setView: sinon.spy(),
renderView: sinon.spy(),
hooks: [],
apiBar: apiBar
};
});
it('Should set template for first render ', function () {
var setTemplateSpy = sinon.stub(mockLayout, 'setTemplate'),
promise = $.Deferred();
promise.resolve();
setTemplateSpy.returns(promise);
testRouteObject.renderWith('the-route', mockLayout, 'args');
assert.ok(setTemplateSpy.calledOnce);
});
it('Should not set template after first render', function () {
var setTemplateSpy = sinon.stub(mockLayout, 'setTemplate'),
promise = $.Deferred();
promise.resolve();
setTemplateSpy.returns(promise);
testRouteObject.renderWith('the-route', mockLayout, 'args');
testRouteObject.renderWith('the-route', mockLayout, 'args');
assert.ok(setTemplateSpy.calledOnce, 'SetTemplate not meant to be called');
});
it('Should call renderReactComponents', function () {
var renderSpy = sinon.spy(testRouteObject, "renderReactComponents");
testRouteObject.renderWith('the-route', mockLayout, 'args');
assert.ok(renderSpy.calledOnce);
});
it("Should call establish of routeObject", function () {
var establishSpy = sinon.spy(testRouteObject, "establish");
testRouteObject.renderWith('the-route', mockLayout, 'args');
assert.ok(establishSpy.calledOnce, 'Calls establish');
});
it("Should render views", function () {
var view = new FauxtonAPI.View(),
getViewsSpy = sinon.stub(testRouteObject, "getViews"),
viewSpy = sinon.stub(view, "establish");
view.hasRendered = false;
view.promise = function () {
var promise = $.Deferred();
promise.resolve();
return promise;
};
getViewsSpy.returns({'#view': view});
mockLayout.renderView = function () { return view;};
testRouteObject.renderWith('the-route', mockLayout, 'args');
assert.ok(viewSpy.calledOnce, 'Should render view');
});
it("Should not re-render a view", function () {
var view = new FauxtonAPI.View(),
getViewsSpy = sinon.stub(testRouteObject, "getViews"),
viewSpy = sinon.stub(view, "establish");
view.hasRendered = true;
getViewsSpy.returns({'#view': view});
testRouteObject.renderWith('the-route', mockLayout, 'args');
assert.notOk(viewSpy.calledOnce, 'Should render view');
});
});
describe('React Integration', function () {
var testRouteObject;
beforeEach(function () {
var TestRouteObject = RouteObject.extend({
crumbs: ['mycrumbs']
});
testRouteObject = new TestRouteObject();
var apiBar = {};
//apiBar.hide = sinon.spy();
var mockLayout = {
setTemplate: function () {
var promise = $.Deferred();
promise.resolve();
return promise;
},
clearBreadcrumbs: sinon.spy(),
setView: sinon.spy(),
renderView: sinon.spy(),
hooks: [],
apiBar: apiBar
};
});
describe('setComponent', function () {
afterEach(function () {
restore(testRouteObject.removeComponent);
restore(testRouteObject.removeView);
});
it('removes existing view for selector', function () {
var fakeReactComponent = React.createElement('div');
var fakeSelector = '.fake-selector';
console.log('WOOOOOOO');
var spy = sinon.spy(testRouteObject, 'removeView');
testRouteObject.setComponent(fakeSelector, fakeReactComponent);
assert.ok(spy.calledWith(fakeSelector));
});
it('removes existing component for selector', function () {
var fakeReactComponent = React.createElement('div');
var fakeSelector = '.fake-selector';
var spy = sinon.spy(testRouteObject, 'removeComponent');
testRouteObject.setComponent(fakeSelector, fakeReactComponent);
assert.ok(spy.calledWith(fakeSelector));
});
it('sets component for selector', function () {
var fakeReactComponent = React.createElement('div');
var fakeSelector = '.fake-selector';
testRouteObject.setComponent(fakeSelector, fakeReactComponent);
assert.deepEqual(fakeReactComponent, testRouteObject.reactComponents[fakeSelector].component);
});
it('sets props for the selector', function () {
var fakeReactComponent = React.createElement('div');
var fakeSelector = '.fake-selector';
testRouteObject.setComponent(fakeSelector, fakeReactComponent, {foo: 'bar baromat'});
assert.deepEqual(fakeReactComponent, testRouteObject.reactComponents[fakeSelector].component);
});
});
describe('removeComponent', function () {
afterEach(function () {
restore(ReactDOM.unmountComponentAtNode);
});
it('removes existing components via React', function () {
var spy = sinon.stub(ReactDOM, 'unmountComponentAtNode');
var fakeSelector = 'remove-selector';
var container = document.createElement('div');
var Hmm = React.createClass({displayName: "Hmm",
render: function () {
return (
React.createElement("div", {id: "remove-selector"})
);
}
});
TestUtils.renderIntoDocument(React.createElement('Hmm'), container);
testRouteObject.reactComponents[fakeSelector] = React.createElement('div');
testRouteObject.removeComponent(fakeSelector);
assert.ok(_.isUndefined(testRouteObject.reactComponents[fakeSelector]));
});
it('removes existing components key', function () {
var spy = sinon.stub(ReactDOM, 'unmountComponentAtNode');
var fakeSelector = 'remove-selector';
testRouteObject.reactComponents[fakeSelector] = React.createElement('div');
testRouteObject.removeComponent(fakeSelector);
assert.ok(_.isUndefined(testRouteObject.reactComponents[fakeSelector]));
});
it('does nothing for non existing component', function () {
var spy = sinon.spy(ReactDOM, 'unmountComponentAtNode');
var fakeSelector = 'remove-selector';
testRouteObject.removeComponent(fakeSelector);
assert.notOk(spy.calledOnce);
});
});
});
});