From 791546592e753f2b59f563d2d0ddb82fb48b7b1a Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Wed, 31 Dec 2014 03:40:14 -0500 Subject: [PATCH] 4831: Tests pass with "make test", "mocha --watch", and browser at /test.html --- apps/backstage/Makefile | 13 +++++++------ apps/backstage/test/mithril-dom.js | 25 ++++++++++++++++++++++++- apps/backstage/test/runner.js | 12 ++++++++---- apps/backstage/test/unit/filter.js | 18 ++++++++++++------ apps/backstage/test/webdriver-client.js | 3 ++- 5 files changed, 53 insertions(+), 18 deletions(-) diff --git a/apps/backstage/Makefile b/apps/backstage/Makefile index 305f19b2be..209a8aea4c 100644 --- a/apps/backstage/Makefile +++ b/apps/backstage/Makefile @@ -6,17 +6,18 @@ clean: rm -rvf dist npmdeps: - for x in bootstrap bower browserify chai chai-jquery jquery mithril mithril-query mocha mocha-phantomjs sinon; do [ -d "$(NPMBIN)/../$$x" ] || npm install $$x --save-dev; done + ulimit -n 4000; for x in bootstrap bower browserify chai chai-jquery jquery jsdom mithril mithril-query mocha mocha-phantomjs sinon; do [ -d "$(NPMBIN)/../$$x" ] || npm install $$x --save-dev; done # This uses --debug to enable source maps. -build: build-app build-test build-css +build: build-app build-test build-assets build-app: mkdir -p dist - $(NPMBIN)/browserify --debug -o dist/app.js app/app.js + ulimit -n 4000; $(NPMBIN)/browserify --debug -o dist/app.js app/app.js build-test: mkdir -p dist - $(NPMBIN)/browserify --debug -o dist/test.js test/runner.js -build-css: + ulimit -n 4000; $(NPMBIN)/browserify --debug -o dist/test.js test/runner.js +build-assets: dist/bootstrap +dist/bootstrap: mkdir -p dist rsync -a $(NPMBIN)/../bootstrap/dist/ dist/bootstrap/ @@ -24,5 +25,5 @@ server: build [ -e $(NPMBIN)/harp ] || npm install harp $(NPMBIN)/harp server --port 9000 -test: build-test build-css +test: build-test build-assets $(NPMBIN)/mocha-phantomjs test.html diff --git a/apps/backstage/test/mithril-dom.js b/apps/backstage/test/mithril-dom.js index 6b92b49aa0..e1fd8d0692 100644 --- a/apps/backstage/test/mithril-dom.js +++ b/apps/backstage/test/mithril-dom.js @@ -1,10 +1,33 @@ var $ = require('jquery') +, jsdom = require('jsdom') , m = require('mithril'); module.exports = md; +var global = (function() { return this })(); +var jsdomWin = global; + +md.ready = function(cb) { + if (typeof window !== 'undefined' && global === window) { + cb($); + return; + } + jsdom.env({ + html: '', + scripts: [ + '../node_modules/jquery/dist/jquery.js', + '../node_modules/mithril/mithril.js', + ], + done: function(err, win) { + jsdomWin = win; + $ = win.jQuery; + cb($); + } + }); +} + function md(cell) { var div = $('
')[0]; - m.render(div, cell); + (jsdomWin.m || m).render(div, cell); return div.children; } diff --git a/apps/backstage/test/runner.js b/apps/backstage/test/runner.js index 18270c48b5..ff4a670ee3 100644 --- a/apps/backstage/test/runner.js +++ b/apps/backstage/test/runner.js @@ -1,9 +1,13 @@ var global = (function() { return this })(); -global.$ = global.jQuery = require('jquery'); -chaiJquery = require('chai-jquery'); -require('chai').use(chaiJquery); -mocha.setup({ui: 'tdd'}); +if (global.mocha) { + // Running in browser. + global.$ = global.jQuery = require('jquery'); + var cj = require('chai-jquery'); + var c = require('chai'); + c.use(cj); + global.mocha.setup({ui: 'tdd'}); +} require('test/unit/filter.js'); require('test/unit/filterset.js'); diff --git a/apps/backstage/test/unit/filter.js b/apps/backstage/test/unit/filter.js index d8ffd5ed0f..427866f8fc 100644 --- a/apps/backstage/test/unit/filter.js +++ b/apps/backstage/test/unit/filter.js @@ -9,7 +9,13 @@ var Filter = require('app/filter') , s = sinon; suite('Filter', function() { - function setup(filterClass, initialFilter) { + setup(function(done) { + md.ready(function(jQuery) { + $ = jQuery; + done(); + }); + }); + function prep(filterClass, initialFilter) { var f = {}; f.tested = new filterClass({attr: 'fakeAttr'}); f.cfSpy = sinon.stub(); @@ -21,13 +27,13 @@ suite('Filter', function() { } suite('AnyText', function() { test("default is existing filter value", function() { - f = setup(Filter.AnyText, ['any','ilike','%quux%']); + f = prep(Filter.AnyText, ['any','ilike','%quux%']); f.rendered = f.tested.view(f.ctrl); f.domfrag = mq(f.rendered); c.assert.equal(f.domfrag.first('input').attrs.value, "quux"); }); test("fires currentFilter on input change", function() { - f = setup(Filter.AnyText); + f = prep(Filter.AnyText); f.domfrag.setValue('input', 'qux'); // Should call again to set new filter value s.assert.calledWith(f.cfSpy, 'any', 'ilike', '%qux%'); @@ -35,20 +41,20 @@ suite('Filter', function() { }); suite('ObjectType', function() { test("default is existing filter value", function() { - f = setup(Filter.ObjectType, ['fakeAttr','is_a','arvados#collection']); + f = prep(Filter.ObjectType, ['fakeAttr','is_a','arvados#collection']); f.rendered = f.tested.view(f.ctrl); f.md = md(f.rendered); c.assert.lengthOf($('.dropdown-toggle:contains(Type)', f.md), 0); c.assert.lengthOf($('.dropdown-toggle:contains(collection)', f.md), 1); }); test("show generic label if no existing filter value", function() { - f = setup(Filter.ObjectType, undefined); + f = prep(Filter.ObjectType, undefined); f.rendered = f.tested.view(f.ctrl); f.md = md(f.rendered); c.assert.lengthOf($('.dropdown-toggle:contains(Type)', f.md), 1); }); test("fires currentFilter on selection", function() { - f = setup(Filter.ObjectType); + f = prep(Filter.ObjectType); f.domfrag.click('li a[data-value="arvados#pipelineInstance"]'); s.assert.calledOn(f.cfSpy, f.ctrl); s.assert.calledWith(f.cfSpy, 'fakeAttr', 'is_a', 'arvados#pipelineInstance'); diff --git a/apps/backstage/test/webdriver-client.js b/apps/backstage/test/webdriver-client.js index 752a79757f..54996dc569 100644 --- a/apps/backstage/test/webdriver-client.js +++ b/apps/backstage/test/webdriver-client.js @@ -9,5 +9,6 @@ var client = webdriverjs.remote({ // However, if anything goes wrong, remove this to see more details // logLevel: 'silent' }); -client.init(); +// client.init(); + module.exports = client; -- 2.30.2