Updated Branches: refs/heads/master 5c9f9a9f0 -> 96be583d8
http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/app/core/tests/routeObjectSpec.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/core/tests/routeObjectSpec.js b/src/fauxton/app/core/tests/routeObjectSpec.js new file mode 100644 index 0000000..2fca94d --- /dev/null +++ b/src/fauxton/app/core/tests/routeObjectSpec.js @@ -0,0 +1,96 @@ +// 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. +define([ + 'api', + 'testUtils' +], function (FauxtonAPI, testUtils) { + var assert = testUtils.assert, + 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: sinon.spy(), + clearBreadcrumbs: sinon.spy(), + setView: sinon.spy(), + renderView: sinon.spy(), + hooks: [], + setBreadcrumbs: sinon.spy(), + apiBar: apiBar + }; + + }); + + it('Should set template for first render ', function () { + testRouteObject.renderWith('the-route', mockLayout, 'args'); + + assert.ok(mockLayout.setTemplate.calledOnce, 'setTempalte was called'); + }); + + it('Should not set template after first render', function () { + testRouteObject.renderWith('the-route', mockLayout, 'args'); + + testRouteObject.renderWith('the-route', mockLayout, 'args'); + + assert.ok(mockLayout.setTemplate.calledOnce, 'SetTemplate not meant to be called'); + }); + + + 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; + getViewsSpy.returns({'#view': 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'); + }); + }); + + }); + + +}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/app/core/utils.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/core/utils.js b/src/fauxton/app/core/utils.js new file mode 100644 index 0000000..44945e8 --- /dev/null +++ b/src/fauxton/app/core/utils.js @@ -0,0 +1,94 @@ +// 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. + + +// This file creates a set of helper functions that will be loaded for all html +// templates. These functions should be self contained and not rely on any +// external dependencies as they are loaded prior to the application. We may +// want to change this later, but for now this should be thought of as a +// "purely functional" helper system. + + +define([ + "jquery", + "lodash" +], + +function($, _ ) { + + var onWindowResize = {}; + + var utils = { + // Thanks to: http://stackoverflow.com/a/2880929 + getParams: function(queryString) { + if (queryString) { + // I think this could be combined into one if + if (queryString.substring(0,1) === "?") { + queryString = queryString.substring(1); + } else if (queryString.indexOf('?') > -1) { + queryString = queryString.split('?')[1]; + } + } + var hash = window.location.hash.split('?')[1]; + queryString = queryString || hash || window.location.search.substring(1); + var match, + urlParams = {}, + pl = /\+/g, // Regex for replacing addition symbol with a space + search = /([^&=]+)=?([^&]*)/g, + decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); }, + query = queryString; + + if (queryString) { + while ((match = search.exec(query))) { + urlParams[decode(match[1])] = decode(match[2]); + } + } + + return urlParams; + }, + + addWindowResize: function(fun, key){ + onWindowResize[key]=fun; + // You shouldn't need to call it here. Just define it at startup and each time it will loop + // through all the functions in the hash. + //app.initWindowResize(); + }, + + removeWindowResize: function(key){ + delete onWindowResize[key]; + utils.initWindowResize(); + }, + + initWindowResize: function(){ + //when calling this it should be overriding what was called previously + window.onresize = function(e) { + // could do this instead of the above for loop + _.each(onWindowResize, function (fn) { + fn(); + }); + }; + }, + + removeSpecialCharacters: function(name){ + return name.replace(/[^\w\s]/gi,""); + }, + + safeURLName: function(name){ + var testName = name || ""; + var checkforBad = testName.match(/[\$\-/_,+-]/g); + return (checkforBad !== null)?encodeURIComponent(name):name; + } + }; + + return utils; +}); + http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/app/main.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/main.js b/src/fauxton/app/main.js index 6fe9991..9df15c5 100644 --- a/src/fauxton/app/main.js +++ b/src/fauxton/app/main.js @@ -13,19 +13,18 @@ require([ // Application. "app", - - // Main Router. - "router" + "api", + "load_addons" ], -function(app, Router) { +function(app, FauxtonAPI, LoadAddons) { - // Define your master router on the application namespace and trigger all - // navigation from this instance. - app.router = new Router(); + app.addons = LoadAddons.addons; + FauxtonAPI.router = app.router = new FauxtonAPI.Router(app.addons); // Trigger the initial route and enable HTML5 History API support, set the // root folder to '/' by default. Change in app.js. Backbone.history.start({ pushState: false, root: app.root }); + // All navigation that is relative should be passed through the navigate // method, to be processed by the router. If the link has a `data-bypass` // attribute, bypass the delegation completely. http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/app/resizeColumns.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/resizeColumns.js b/src/fauxton/app/resizeColumns.js deleted file mode 100644 index bb50767..0000000 --- a/src/fauxton/app/resizeColumns.js +++ /dev/null @@ -1,87 +0,0 @@ -// 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. - - -// This file creates a set of helper functions that will be loaded for all html -// templates. These functions should be self contained and not rely on any -// external dependencies as they are loaded prior to the application. We may -// want to change this later, but for now this should be thought of as a -// "purely functional" helper system. - -define([ - "utils" -], - -function(utils) { - - var Resize = function(options){ - this.options = options; - this.options.selectorElements = options.selectorElements || ".window-resizeable"; - }; - - Resize.prototype = { - getPrimaryNavWidth: function(){ - var primaryNavWidth = $('body').hasClass('closeMenu')? 64:224; - return primaryNavWidth; - }, - getPanelWidth: function(){ - var sidebarWidth = $('#sidebar-content').length > 0 ? $('#sidebar-content').width(): 0; - return (this.getPrimaryNavWidth() + sidebarWidth); - }, - initialize: function(){ - // $(window).off('resize'); - var that = this; - //add throttler :) - this.lazyLayout = _.debounce(that.onResizeHandler, 300).bind(this); - utils.addWindowResize(this.lazyLayout,"animation"); - utils.initWindowResize(); - this.onResizeHandler(); - }, - updateOptions:function(options){ - this.options = {}; - this.options = options; - this.options.selectorElements = options.selectorElements || ".window-resizeable"; - }, - turnOff:function(){ - utils.removeWindowResize("animation"); - }, - cleanupCallback: function(){ - this.callback = null; - }, - onResizeHandler: function (){ - //if there is an override, do that instead - if (this.options.onResizeHandler){ - this.options.onResizeHandler(); - } else { - var combinedWidth = window.innerWidth - this.getPanelWidth(), - smallWidthConstraint = ($('#sidebar-content').length > 0)? 470:800, - panelWidth; - - if( combinedWidth > smallWidthConstraint && combinedWidth < 1400){ - panelWidth = window.innerWidth - this.getPanelWidth(); - } else if (combinedWidth < smallWidthConstraint){ - panelWidth = smallWidthConstraint; - } else if(combinedWidth > 1400){ - panelWidth = 1400; - } - - $(this.options.selectorElements).innerWidth(panelWidth); - } - //if there is a callback, run that - if(this.options.callback) { - this.options.callback(); - } - } - }; - - return Resize; -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/app/router.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/router.js b/src/fauxton/app/router.js deleted file mode 100644 index 89c60cf..0000000 --- a/src/fauxton/app/router.js +++ /dev/null @@ -1,142 +0,0 @@ -// 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. - -define([ - // Load require for use in nested requiring - // as per the note in: http://requirejs.org/docs/api.html#multiversion - "require", - - // Application. - "app", - - // Initialize application - "initialize", - - // Load Fauxton API - "api", - - // Modules - "addons/fauxton/base", - // Layout - "addons/fauxton/layout", - - "load_addons" -], - -function(req, app, Initialize, FauxtonAPI, Fauxton, Layout, LoadAddons) { - - var beforeUnloads = {}; - - var Router = app.router = Backbone.Router.extend({ - routes: {}, - - beforeUnload: function (name, fn) { - beforeUnloads[name] = fn; - }, - - removeBeforeUnload: function (name) { - delete beforeUnloads[name]; - }, - - navigate: function (fragment, trigger) { - var continueNav = true, - msg = _.find(_.map(beforeUnloads, function (fn) { return fn(); }), function (beforeReturn) { - if (beforeReturn) { return true; } - }); - - if (msg) { - continueNav = window.confirm(msg); - } - - if (continueNav) { - Backbone.Router.prototype.navigate(fragment, trigger); - } - }, - - addModuleRouteObject: function(RouteObject) { - var that = this; - var masterLayout = this.masterLayout, - routeUrls = RouteObject.prototype.getRouteUrls(); - - _.each(routeUrls, function(route) { - this.route(route, route.toString(), function() { - var args = Array.prototype.slice.call(arguments), - roles = RouteObject.prototype.getRouteRoles(route), - authPromise = app.auth.checkAccess(roles); - - authPromise.then(function () { - if (!that.activeRouteObject || !that.activeRouteObject.hasRoute(route)) { - if (that.activeRouteObject) { - that.activeRouteObject.cleanup(); - } - that.activeRouteObject = new RouteObject(route, masterLayout, args); - } - - var routeObject = that.activeRouteObject; - routeObject.routeCallback(route, args); - routeObject.renderWith(route, masterLayout, args); - }, function () { - FauxtonAPI.auth.authDeniedCb(); - }); - - }); - }, this); - }, - - setModuleRoutes: function() { - _.each(LoadAddons.addons, function(module) { - if (module){ - module.initialize(); - // This is pure routes the addon provides - if (module.RouteObjects) { - _.each(module.RouteObjects, this.addModuleRouteObject, this); - } - } - }, this); - }, - - initialize: function() { - //TODO: It would be nice to handle this with a router - this.navBar = app.navBar = new Fauxton.NavBar(); - this.apiBar = app.apiBar = new Fauxton.ApiBar(); - this.auth = app.auth = FauxtonAPI.auth; - app.session = FauxtonAPI.session; - - app.masterLayout = this.masterLayout = new Layout(this.navBar, this.apiBar); - app.footer = new Fauxton.Footer({el: "#footer-content"}); - - // NOTE: This must be below creation of the layout - // FauxtonAPI header links and others depend on existence of the layout - //this.setAddonHooks(); - this.setModuleRoutes(); - - $("#app-container").html(this.masterLayout.el); - this.masterLayout.render(); - - // TODO: move this to a proper Fauxton.View - $.when.apply(null, app.footer.establish()).done(function() { - app.footer.render(); - }); - }, - - triggerRouteEvent: function(event, args) { - if (this.activeRouteObject) { - var eventArgs = [event].concat(args); - this.activeRouteObject.trigger.apply(this.activeRouteObject, eventArgs ); - this.activeRouteObject.renderWith(eventArgs, this.masterLayout, args); - } - } - }); - - return Router; - -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/app/utils.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/utils.js b/src/fauxton/app/utils.js deleted file mode 100644 index ded7dac..0000000 --- a/src/fauxton/app/utils.js +++ /dev/null @@ -1,66 +0,0 @@ -// 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. - - -// This file creates a set of helper functions that will be loaded for all html -// templates. These functions should be self contained and not rely on any -// external dependencies as they are loaded prior to the application. We may -// want to change this later, but for now this should be thought of as a -// "purely functional" helper system. - - -define([ - "jquery", - "lodash" -], - -function($, _ ) { - - var utils = {}; - - var onWindowResize = {}; - - utils.addWindowResize = function(fun, key){ - onWindowResize[key]=fun; - // You shouldn't need to call it here. Just define it at startup and each time it will loop - // through all the functions in the hash. - //app.initWindowResize(); - }; - - utils.removeWindowResize = function(key){ - delete onWindowResize[key]; - utils.initWindowResize(); - }; - - utils.initWindowResize = function(){ - //when calling this it should be overriding what was called previously - window.onresize = function(e) { - // could do this instead of the above for loop - _.each(onWindowResize, function (fn) { - fn(); - }); - }; - }; - - utils.removeSpecialCharacters = function(name){ - return name.replace(/[^\w\s]/gi,""); - }; - - utils.safeURLName = function(name){ - var testName = name || ""; - var checkforBad = testName.match(/[\$\-/_,+-]/g); - return (checkforBad !== null)?encodeURIComponent(name):name; - }; - - return utils; -}); - http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/settings.json.default ---------------------------------------------------------------------- diff --git a/src/fauxton/settings.json.default b/src/fauxton/settings.json.default index cb09eb2..e817b79 100644 --- a/src/fauxton/settings.json.default +++ b/src/fauxton/settings.json.default @@ -1,5 +1,6 @@ { "deps": [ + { "name": "fauxton" }, { "name": "databases" }, { "name": "documents" }, { "name": "pouchdb" }, http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/tasks/couchserver.js ---------------------------------------------------------------------- diff --git a/src/fauxton/tasks/couchserver.js b/src/fauxton/tasks/couchserver.js index 5ccbfe1..21c2fcb 100644 --- a/src/fauxton/tasks/couchserver.js +++ b/src/fauxton/tasks/couchserver.js @@ -61,7 +61,7 @@ module.exports = function (grunt) { // server js from app directory filePath = path.join(app_dir, url.replace('/_utils/fauxton/','')); } else if (!!url.match(/testrunner/)) { - var testSetup = grunt.util.spawn({cmd: 'grunt', grunt: true, args: ['mochaSetup']}, function (error, result, code) {/* log.writeln(String(result));*/ }); + var testSetup = grunt.util.spawn({cmd: 'grunt', grunt: true, args: ['test_inline']}, function (error, result, code) {/* log.writeln(String(result));*/ }); testSetup.stdout.pipe(process.stdout); testSetup.stderr.pipe(process.stderr); filePath = path.join('./test/runner.html'); http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/test/core/layoutSpec.js ---------------------------------------------------------------------- diff --git a/src/fauxton/test/core/layoutSpec.js b/src/fauxton/test/core/layoutSpec.js deleted file mode 100644 index 4167100..0000000 --- a/src/fauxton/test/core/layoutSpec.js +++ /dev/null @@ -1,94 +0,0 @@ -// 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. -define([ - 'addons/fauxton/layout', - 'testUtils' -], function (Layout, testUtils) { - var assert = testUtils.assert; - - describe("Faxuton Layout", function () { - var layout; - - beforeEach(function () { - var navBar = new Backbone.View(); - var apiBar = new Backbone.View(); - layout = new Layout(navBar, apiBar); - }); - - describe('#setTemplate', function () { - - it("Should set template without prefix", function () { - layout.setTemplate('myTemplate'); - - assert.equal(layout.layout.template, 'templates/layouts/myTemplate'); - - }); - - it("Should set template with prefix", function () { - layout.setTemplate({name: 'myTemplate', prefix: 'myPrefix/'}); - - assert.equal(layout.layout.template, 'myPrefix/myTemplate'); - }); - - it("Should remove old views", function () { - var view = { - remove: function () {} - }; - - layout.layoutViews = { - 'selector': view - }; - - var mockRemove = sinon.spy(view, 'remove'); - layout.setTemplate('myTemplate'); - assert.ok(mockRemove.calledOnce); - - }); - - it("Should render", function () { - var mockRender = sinon.spy(layout, 'render'); - - layout.setTemplate('myTemplate'); - - assert.ok(mockRender.calledOnce); - - }); - - }); - - describe('#renderView', function () { - - it('Should render existing view', function () { - var view = new Backbone.View(); - var mockRender = sinon.spy(view, 'render'); - layout.layoutViews = { - '#selector': view - }; - - var out = layout.renderView('#selector'); - - assert.ok(mockRender.calledOnce); - }); - - it('Should return false for non-existing view', function () { - var view = new Backbone.View(); - layout.layoutViews = { - 'selector': view - }; - - var out = layout.renderView('wrongSelector'); - assert.notOk(out, 'No view found'); - }); - }); - - }); -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/test/core/navbarSpec.js ---------------------------------------------------------------------- diff --git a/src/fauxton/test/core/navbarSpec.js b/src/fauxton/test/core/navbarSpec.js deleted file mode 100644 index 3eca6f6..0000000 --- a/src/fauxton/test/core/navbarSpec.js +++ /dev/null @@ -1,107 +0,0 @@ -// 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. -define([ - 'addons/fauxton/base', - 'testUtils' -], function (Fauxton, testUtils) { - var assert = testUtils.assert, - NavBar = Fauxton.NavBar; - - describe('NavBar', function () { - - describe('adding links', function () { - var navBar; - - beforeEach(function () { - navBar = new NavBar(); - navBar.navLinks = []; - navBar.bottomNavLinks = []; - navBar.footerNavLinks = []; - }); - - it('Should add link to navlinks', function () { - navBar.addLink({href: '#/test', title: 'Test Title'}); - - assert.equal(navBar.navLinks.length, 1); - assert.equal(navBar.footerNavLinks.length, 0); - assert.equal(navBar.bottomNavLinks.length, 0); - }); - - it('Should add link to bottom links', function () { - navBar.addLink({href: '#/test', bottomNav: true, title: 'Test Title'}); - - assert.equal(navBar.bottomNavLinks.length, 1); - assert.equal(navBar.navLinks.length, 0); - assert.equal(navBar.footerNavLinks.length, 0); - }); - - it('Should add link to footer links', function () { - navBar.addLink({href: '#/test', footerNav: true, title: 'Test Title'}); - - assert.equal(navBar.footerNavLinks.length, 1); - assert.equal(navBar.bottomNavLinks.length, 0); - assert.equal(navBar.navLinks.length, 0); - }); - }); - - describe('removing links', function () { - var navBar; - - beforeEach(function () { - navBar = new NavBar(); - navBar.navLinks = []; - navBar.bottomNavLinks = []; - navBar.footerNavLinks = []; - navBar.addLink({ - href: '#/test', - footerNav: true, - title: 'Test Title Footer' - }); - - navBar.addLink({ - href: '#/test', - bottomNav: true, - title: 'Test Title Bottom' - }); - - navBar.addLink({ - href: '#/test', - title: 'Test Title' - }); - }); - - it("should remove links from list", function () { - navBar.removeLink({ - title: 'Test Title Footer', - footerNav: true - }); - - assert.equal(navBar.footerNavLinks.length, 0); - assert.equal(navBar.bottomNavLinks.length, 1); - assert.equal(navBar.navLinks.length, 1); - }); - - it("Should call render after removing links", function () { - var renderSpy = sinon.stub(navBar,'render'); - - navBar.removeLink({ - title: 'Test Title Footer', - footerNav: true - }); - - assert.ok(renderSpy.calledOnce); - }); - - }); - }); - -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/test/core/paginateSpec.js ---------------------------------------------------------------------- diff --git a/src/fauxton/test/core/paginateSpec.js b/src/fauxton/test/core/paginateSpec.js deleted file mode 100644 index d05b322..0000000 --- a/src/fauxton/test/core/paginateSpec.js +++ /dev/null @@ -1,109 +0,0 @@ -// 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. -define([ - 'api', - 'addons/fauxton/components', - 'addons/documents/resources', - 'testUtils', - 'app' -], function (FauxtonAPI, Views, Models, testUtils, app) { - var assert = testUtils.assert, - ViewSandbox = testUtils.ViewSandbox; - - - describe('IndexPaginate', function () { - var viewSandbox, paginate, collection, navigateMock; - beforeEach(function () { - app.router = { - navigate: function () {} - }; - - collection = new Models.IndexCollection([{ - id:'myId1', - doc: 'num1' - }, - { - id:'myId2', - doc: 'num2' - }], { - database: {id: 'databaseId'}, - design: '_design/myDoc' - }); - - paginate = new Views.IndexPagination({ - collection: collection, - previousUrlfn: function () {}, - nextUrlfn: function () {}, - canShowPreviousfn: function () { return true; }, - canShowNextfn: function () { return true;} - }); - viewSandbox = new ViewSandbox(); - viewSandbox.renderView(paginate); - }); - - afterEach(function () { - viewSandbox.remove(); - }); - - describe('#next', function () { - beforeEach(function () { - //do this so it doesn't throw an error on other unwired up components - FauxtonAPI.triggerRouteEvent = function () {}; - //FauxtonAPI.triggerRouteEvent.restore && FauxtonAPI.triggerRouteEvent.restore(); - //FauxtonAPI.navigate.restore && FauxtonAPI.navigate.restore(); - }); - - it('Should navigate', function () { - var navigateMock = sinon.spy(FauxtonAPI, 'navigate'); - - paginate.$('a#next').click(); - - assert.ok(navigateMock.calledOnce); - FauxtonAPI.navigate.restore(); - }); - - it('Should trigger routeEvent', function () { - var navigateMock = sinon.spy(FauxtonAPI, 'triggerRouteEvent'); - - paginate.$('a#next').click(); - - assert.ok(navigateMock.calledOnce); - FauxtonAPI.triggerRouteEvent.restore(); - }); - - }); - - - describe('#previous', function () { - - it('Should navigate', function () { - var navigateMock = sinon.spy(FauxtonAPI, 'navigate'); - - paginate.$('a#previous').click(); - - assert.ok(navigateMock.calledOnce); - FauxtonAPI.navigate.restore(); - }); - - it('Should trigger routeEvent', function () { - var navigateMock = sinon.spy(FauxtonAPI, 'triggerRouteEvent'); - - paginate.$('a#previous').click(); - - assert.ok(navigateMock.calledOnce); - FauxtonAPI.triggerRouteEvent.restore(); - }); - - }); - - }); -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/test/core/routeObjectSpec.js ---------------------------------------------------------------------- diff --git a/src/fauxton/test/core/routeObjectSpec.js b/src/fauxton/test/core/routeObjectSpec.js deleted file mode 100644 index 987d5b7..0000000 --- a/src/fauxton/test/core/routeObjectSpec.js +++ /dev/null @@ -1,105 +0,0 @@ -// 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. -define([ - 'api', - 'testUtils' -], function (FauxtonAPI, testUtils) { - var assert = testUtils.assert, - 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: sinon.spy(), - clearBreadcrumbs: sinon.spy(), - setView: sinon.spy(), - renderView: sinon.spy(), - hooks: [], - setBreadcrumbs: sinon.spy(), - apiBar: apiBar - }; - - }); - - it('Should set template for first render ', function () { - testRouteObject.renderWith('the-route', mockLayout, 'args'); - - assert.ok(mockLayout.setTemplate.calledOnce, 'setTempalte was called'); - }); - - it('Should not set template after first render', function () { - testRouteObject.renderWith('the-route', mockLayout, 'args'); - - testRouteObject.renderWith('the-route', mockLayout, 'args'); - - assert.ok(mockLayout.setTemplate.calledOnce, 'SetTemplate not meant to be called'); - }); - - it('Should clear breadcrumbs', function () { - testRouteObject.renderWith('the-route', mockLayout, 'args'); - assert.ok(mockLayout.clearBreadcrumbs.calledOnce, 'Clear Breadcrumbs called'); - }); - - it('Should set breadcrumbs when breadcrumbs exist', function () { - testRouteObject.renderWith('the-route', mockLayout, 'args'); - assert.ok(mockLayout.setBreadcrumbs.calledOnce, 'Set Breadcrumbs was called'); - }); - - 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; - getViewsSpy.returns({'#view': 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'); - }); - }); - - }); - - -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/test/mocha/testUtils.js ---------------------------------------------------------------------- diff --git a/src/fauxton/test/mocha/testUtils.js b/src/fauxton/test/mocha/testUtils.js index f9643e8..2c418f9 100644 --- a/src/fauxton/test/mocha/testUtils.js +++ b/src/fauxton/test/mocha/testUtils.js @@ -11,11 +11,12 @@ // the License. define([ + "api", "chai", "sinon-chai", "underscore" ], -function(chai, sinonChai) { +function(FauxtonAPI,chai, sinonChai) { chai.use(sinonChai); var ViewSandbox = function () { http://git-wip-us.apache.org/repos/asf/couchdb/blob/96be583d/src/fauxton/test/test.config.underscore ---------------------------------------------------------------------- diff --git a/src/fauxton/test/test.config.underscore b/src/fauxton/test/test.config.underscore index dda16f2..5cebe78 100644 --- a/src/fauxton/test/test.config.underscore +++ b/src/fauxton/test/test.config.underscore @@ -5,6 +5,7 @@ require.config( ); require([ + "app", <% _.each(testFiles, function (test) {%> '../<%= test %>', <% }) %>