From 89ea8e2069a1b80f77958f3207e01c9fb157c812 Mon Sep 17 00:00:00 2001 From: Dan Gebhardt Date: Tue, 23 Sep 2014 21:56:06 -0400 Subject: [PATCH] Refactor to use ember-test-helpers The core logic in ember-qunit has been extracted to switchfly/ember-test-helpers. This library now wraps ember-test-helpers with qunit-specific helpers. --- .gitignore | 5 +- .npmignore | 7 +- .travis.yml | 14 +- Brocfile.js | 82 ++++++- README.md | 77 +++--- bower.json | 14 +- dist/amd/isolated-container.js | 23 -- dist/amd/main.js | 33 --- dist/amd/module-for-component.js | 64 ----- dist/amd/module-for-model.js | 36 --- dist/amd/module-for.js | 92 ------- dist/amd/test-context.js | 16 -- dist/amd/test-resolver.js | 17 -- dist/amd/test.js | 33 --- dist/cjs/isolated-container.js | 19 -- dist/cjs/main.js | 29 --- dist/cjs/module-for-component.js | 60 ----- dist/cjs/module-for-model.js | 32 --- dist/cjs/module-for.js | 88 ------- dist/cjs/test-context.js | 12 - dist/cjs/test-resolver.js | 13 - dist/cjs/test.js | 29 --- dist/globals/main.js | 293 ---------------------- dist/named-amd/main.js | 314 ------------------------ karma.conf.js | 38 --- lib/ember-qunit.js | 22 ++ lib/ember-qunit/module-for-component.js | 6 + lib/ember-qunit/module-for-model.js | 6 + lib/ember-qunit/module-for.js | 6 + lib/ember-qunit/qunit-module.js | 12 + lib/{ => ember-qunit}/test.js | 9 +- lib/isolated-container.js | 18 -- lib/main.js | 31 --- lib/module-for-component.js | 59 ----- lib/module-for-model.js | 31 --- lib/module-for.js | 87 ------- lib/test-context.js | 10 - lib/test-resolver.js | 11 - package.json | 32 +-- test/main.spec.js | 267 -------------------- test/support/setup.js | 13 - testem.json | 11 + tests/index.html | 16 ++ tests/module-for-component-test.js | 104 ++++++++ tests/module-for-model-test.js | 111 +++++++++ tests/module-for-test.js | 53 ++++ tests/test-support/resolver.js | 20 ++ 47 files changed, 515 insertions(+), 1860 deletions(-) delete mode 100644 dist/amd/isolated-container.js delete mode 100644 dist/amd/main.js delete mode 100644 dist/amd/module-for-component.js delete mode 100644 dist/amd/module-for-model.js delete mode 100644 dist/amd/module-for.js delete mode 100644 dist/amd/test-context.js delete mode 100644 dist/amd/test-resolver.js delete mode 100644 dist/amd/test.js delete mode 100644 dist/cjs/isolated-container.js delete mode 100644 dist/cjs/main.js delete mode 100644 dist/cjs/module-for-component.js delete mode 100644 dist/cjs/module-for-model.js delete mode 100644 dist/cjs/module-for.js delete mode 100644 dist/cjs/test-context.js delete mode 100644 dist/cjs/test-resolver.js delete mode 100644 dist/cjs/test.js delete mode 100644 dist/globals/main.js delete mode 100644 dist/named-amd/main.js delete mode 100644 karma.conf.js create mode 100644 lib/ember-qunit.js create mode 100644 lib/ember-qunit/module-for-component.js create mode 100644 lib/ember-qunit/module-for-model.js create mode 100644 lib/ember-qunit/module-for.js create mode 100644 lib/ember-qunit/qunit-module.js rename lib/{ => ember-qunit}/test.js (77%) delete mode 100644 lib/isolated-container.js delete mode 100644 lib/main.js delete mode 100644 lib/module-for-component.js delete mode 100644 lib/module-for-model.js delete mode 100644 lib/module-for.js delete mode 100644 lib/test-context.js delete mode 100644 lib/test-resolver.js delete mode 100644 test/main.spec.js delete mode 100644 test/support/setup.js create mode 100644 testem.json create mode 100644 tests/index.html create mode 100644 tests/module-for-component-test.js create mode 100644 tests/module-for-model-test.js create mode 100644 tests/module-for-test.js create mode 100644 tests/test-support/resolver.js diff --git a/.gitignore b/.gitignore index 29d07caf..6047e1c2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -tmp node_modules bower_components - +tmp +dist +build diff --git a/.npmignore b/.npmignore index 5788e230..ab1e8a55 100644 --- a/.npmignore +++ b/.npmignore @@ -1,11 +1,8 @@ bower_components -dist/amd -dist/named-amd -dist/globals lib -test +tests .travis.yml bower.json Brocfile.js -karma.conf.js +testem.json tmp diff --git a/.travis.yml b/.travis.yml index a7dae8d0..722244ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,9 @@ language: node_js -node_js: - - "0.11" - - "0.10" -before_script: - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start + +install: + - npm install -g bower broccoli-cli + - npm install + - bower install + +script: + - npm test diff --git a/Brocfile.js b/Brocfile.js index 3ae2ccf6..b17cd604 100644 --- a/Brocfile.js +++ b/Brocfile.js @@ -1,12 +1,76 @@ -var makeModules = require('broccoli-dist-es6-module'); +var concat = require('broccoli-concat'); +var pickFiles = require('broccoli-static-compiler'); +var mergeTrees = require('broccoli-merge-trees'); +var compileES6 = require('broccoli-es6-concatenator'); -module.exports = makeModules('lib', { - global: 'emq', - packageName: 'ember-qunit', - main: 'main', - shim: { - 'ember': 'Ember', - 'qunit': 'QUnit' - } +// --- Compile ES6 modules --- + +var loader = pickFiles('bower_components', { + srcDir: 'loader', + files: ['loader.js'], + destDir: '/' +}); + +// TODO - this manual dependency management has got to go! +var klassy = pickFiles('bower_components', { + srcDir: '/klassy/lib', + files: ['klassy.js'], + destDir: '/' +}); +var emberTestHelpers = pickFiles('bower_components', { + srcDir: '/ember-test-helpers/lib', + files: ['**/*.js'], + destDir: '/' +}); +var deps = mergeTrees([klassy, emberTestHelpers]); + +var lib = pickFiles('lib', { + srcDir: '/', + files: ['**/*.js'], + destDir: '/' +}); + +var tests = pickFiles('tests', { + srcDir: '/', + files: ['test-support/*.js', '*.js'], + destDir: '/tests' +}); + +var main = mergeTrees([loader, deps, lib, tests]); +main = compileES6(main, { + loaderFile: '/loader.js', + inputFiles: ['**/*.js'], + ignoredModules: ['ember'], + outputFile: '/assets/ember-qunit-tests.amd.js' }); +// --- Select and concat vendor / support files --- + +var vendor = concat('bower_components', { + inputFiles: ['jquery/dist/jquery.js', + 'handlebars/handlebars.js', + 'ember/ember.js', + 'ember-data/ember-data.js'], + outputFile: '/assets/vendor.js' +}); + +var qunit = pickFiles('bower_components', { + srcDir: '/qunit/qunit', + files: ['qunit.js', 'qunit.css'], + destDir: '/assets' +}); + +var testIndex = pickFiles('tests', { + srcDir: '/', + files: ['index.html'], + destDir: '/tests' +}); + +var testSupport = concat('bower_components', { + inputFiles: ['ember-cli-shims/app-shims.js', + 'ember-cli-test-loader/test-loader.js'], + outputFile: '/assets/test-support.js' +}); + +module.exports = mergeTrees([main, vendor, testIndex, qunit, testSupport]); + diff --git a/README.md b/README.md index c1af224a..a009943d 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,10 @@ -Ember QUnit -=========== +# Ember QUnit [![Build Status](https://travis-ci.org/rjackson/ember-qunit.png)](https://travis-ci.org/rwjblue/ember-qunit) -[![Build Status](https://travis-ci.org/rjackson/ember-qunit.png)](https://travis-ci.org/rwjblue/ember-qunit) +Ember QUnit simplifies unit testing of Ember applications with QUnit by +providing QUnit-specific wrappers around the helpers contained in +[ember-test-helpers](https://github.com/switchfly/ember-test-helpers). -[WIP] Unit test helpers for Ember. - -About ------ - -Ember QUnit uses your application's resolver to find and automatically -create test subjects for you with the `moduleFor` and `test` helpers. - -*This is a work in progress* but its also quite handy already. Feedback -is highly encouraged. - -Simple Usage ------------- - -Include `dist/globals/main.js` as a script in your tests index.html - -Module Formats --------------- - -You will find all the popular formats in `dist/`. If using globals, all -methods are found on `window.emq`. - -Examples --------- +## Usage ### Global build setup: @@ -108,7 +86,7 @@ test('selects first tab and shows the panel', function() { ok(panel1.$().is(':visible')); }); ``` -If you are using nested components with templates, you have to list them separately - otherwise your templates won't be loaded: +If you are using nested components with templates, you have to list them separately - otherwise your templates won't be loaded: ```js moduleForComponent('ic-tabs', 'TabsComponent', { @@ -155,7 +133,7 @@ the error and assert that you got there: test('sometimes async gets rejected', function(){ expect(1); var myThing = MyThing.create() - + return myThing.exampleMethod().then(function(){ ok(false, "promise should not be fulfilled"); })['catch'](function(err){ @@ -164,8 +142,7 @@ test('sometimes async gets rejected', function(){ }); ``` -Helpers -------- +## Test Helpers ### `moduleFor(fullName [, description [, callbacks]])` @@ -188,23 +165,41 @@ Helpers - `name`: (String) - the short name of the model you'd use in `store` operations ie `user`, `assignmentGroup`, etc. -Contributing ------------- +## Contributing + +Contributions are welcome. Please follow the instructions below to install and +test this library. + +### Installation ```sh +$ npm install -g bower broccoli-cli $ npm install $ bower install -$ npm install -g karma-cli broccoli-cli +``` + +### Testing + +In order to test in the browser: + +```sh $ broccoli serve -# new tab -$ karma start ``` -Building dist/ --------------- +... and then visit [http://localhost:4200/tests](http://localhost:4200/tests). + +In order to perform a CI test: ```sh -$ broccoli build dist -# Broccoli will not overwrite dist/, so you -# may need to delete it first +$ rm -rf build && BROCCOLI_ENV=test broccoli build build && testem ci ``` + +Or simply: + +```sh +$ npm test +``` + +## Copyright and License + +Copyright 2014 Ryan Florence and contributors. [MIT License](./LICENSE). diff --git a/bower.json b/bower.json index 671b828d..ee82c2ff 100644 --- a/bower.json +++ b/bower.json @@ -3,19 +3,27 @@ "version": "0.1.8", "authors": [ "Stefan Penner", - "Ryan Florence" + "Ryan Florence", + "Robert Jackson", + "Dan Gebhardt" ], "license": "MIT", "ignore": [ "**/.*", "node_modules", "bower_components", - "test" + "tests" ], "dependencies": { - "ember": "^1.3.0" + "ember": "^1.7.0", + "ember-test-helpers": "^0.0.6" }, "devDependencies": { + "qunit": "^1.15.0", + "loader": "stefanpenner/loader.js#1.0.1", + "ember-cli-shims": "stefanpenner/ember-cli-shims#0.0.3", + "ember-cli-test-loader": "rwjblue/ember-cli-test-loader#0.0.4", + "jquery": "~2.1.1", "ember-data": "~1.0.0-beta.10" } } diff --git a/dist/amd/isolated-container.js b/dist/amd/isolated-container.js deleted file mode 100644 index 4a2751b5..00000000 --- a/dist/amd/isolated-container.js +++ /dev/null @@ -1,23 +0,0 @@ -define( - ["./test-resolver","ember","exports"], - function(__dependency1__, __dependency2__, __exports__) { - "use strict"; - var testResolver = __dependency1__["default"] || __dependency1__; - var Ember = __dependency2__["default"] || __dependency2__; - - __exports__["default"] = function isolatedContainer(fullNames) { - var resolver = testResolver.get(); - var container = new Ember.Container(); - container.optionsForType('component', { singleton: false }); - container.optionsForType('view', { singleton: false }); - container.optionsForType('template', { instantiate: false }); - container.optionsForType('helper', { instantiate: false }); - container.register('component-lookup:main', Ember.ComponentLookup); - for (var i = fullNames.length; i > 0; i--) { - var fullName = fullNames[i - 1]; - var normalizedFullName = resolver.normalize(fullName); - container.register(fullName, resolver.resolve(normalizedFullName)); - } - return container; - } - }); \ No newline at end of file diff --git a/dist/amd/main.js b/dist/amd/main.js deleted file mode 100644 index 99f0ec39..00000000 --- a/dist/amd/main.js +++ /dev/null @@ -1,33 +0,0 @@ -define( - ["ember","./isolated-container","./module-for","./module-for-component","./module-for-model","./test","./test-resolver","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) { - "use strict"; - var Ember = __dependency1__["default"] || __dependency1__; - var isolatedContainer = __dependency2__["default"] || __dependency2__; - var moduleFor = __dependency3__["default"] || __dependency3__; - var moduleForComponent = __dependency4__["default"] || __dependency4__; - var moduleForModel = __dependency5__["default"] || __dependency5__; - var test = __dependency6__["default"] || __dependency6__; - var testResolver = __dependency7__["default"] || __dependency7__; - - Ember.testing = true; - - function setResolver(resolver) { - testResolver.set(resolver); - } - - function globalize() { - window.moduleFor = moduleFor; - window.moduleForComponent = moduleForComponent; - window.moduleForModel = moduleForModel; - window.test = test; - window.setResolver = setResolver; - } - - __exports__.globalize = globalize; - __exports__.moduleFor = moduleFor; - __exports__.moduleForComponent = moduleForComponent; - __exports__.moduleForModel = moduleForModel; - __exports__.test = test; - __exports__.setResolver = setResolver; - }); \ No newline at end of file diff --git a/dist/amd/module-for-component.js b/dist/amd/module-for-component.js deleted file mode 100644 index 2f41d4ad..00000000 --- a/dist/amd/module-for-component.js +++ /dev/null @@ -1,64 +0,0 @@ -define( - ["./test-resolver","./module-for","ember","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __exports__) { - "use strict"; - var testResolver = __dependency1__["default"] || __dependency1__; - var moduleFor = __dependency2__["default"] || __dependency2__; - var Ember = __dependency3__["default"] || __dependency3__; - - __exports__["default"] = function moduleForComponent(name, description, callbacks) { - var resolver = testResolver.get(); - - moduleFor('component:' + name, description, callbacks, function(container, context, defaultSubject) { - var layoutName = 'template:components/' + name; - - var layout = resolver.resolve(layoutName); - - if (layout) { - container.register(layoutName, layout); - container.injection('component:' + name, 'layout', layoutName); - } - - context.dispatcher = Ember.EventDispatcher.create(); - context.dispatcher.setup({}, '#ember-testing'); - - context.__setup_properties__.render = function() { - var containerView = Ember.ContainerView.create({container: container}); - var view = Ember.run(function(){ - var subject = context.subject(); - containerView.pushObject(subject); - containerView.appendTo('#ember-testing'); - return subject; - }); - - var oldTeardown = this.teardown; - this.teardown = function() { - Ember.run(function() { - Ember.tryInvoke(containerView, 'destroy'); - }); - - if (oldTeardown) { - return oldTeardown.apply(this, arguments); - } - }; - - return view.$(); - }; - - context.__setup_properties__.append = function(){ - Ember.deprecate('this.append() is deprecated. Please use this.render() instead.'); - return this.render(); - }; - - context.$ = function(){ - var $view = this.render(), subject = this.subject(); - - if(arguments.length){ - return subject.$.apply(subject, arguments); - }else{ - return $view; - } - }; - }); - } - }); \ No newline at end of file diff --git a/dist/amd/module-for-model.js b/dist/amd/module-for-model.js deleted file mode 100644 index b8bd58eb..00000000 --- a/dist/amd/module-for-model.js +++ /dev/null @@ -1,36 +0,0 @@ -define( - ["./module-for","ember","exports"], - function(__dependency1__, __dependency2__, __exports__) { - "use strict"; - var moduleFor = __dependency1__["default"] || __dependency1__; - var Ember = __dependency2__["default"] || __dependency2__; - - __exports__["default"] = function moduleForModel(name, description, callbacks) { - if (!DS) throw new Error('You must have Ember Data installed to use `moduleForModel`.'); - - moduleFor('model:' + name, description, callbacks, function(container, context, defaultSubject) { - if (DS._setupContainer) { - DS._setupContainer(container); - } else { - container.register('store:main', DS.Store); - } - - var adapterFactory = container.lookupFactory('adapter:application'); - if (!adapterFactory) { - container.register('adapter:application', DS.FixtureAdapter); - } - - context.__setup_properties__.store = function(){ - return container.lookup('store:main'); - }; - - if (context.__setup_properties__.subject === defaultSubject) { - context.__setup_properties__.subject = function(options) { - return Ember.run(function() { - return container.lookup('store:main').createRecord(name, options); - }); - }; - } - }); - } - }); \ No newline at end of file diff --git a/dist/amd/module-for.js b/dist/amd/module-for.js deleted file mode 100644 index 7536da6c..00000000 --- a/dist/amd/module-for.js +++ /dev/null @@ -1,92 +0,0 @@ -define( - ["ember","./test-context","./isolated-container","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __exports__) { - "use strict"; - var Ember = __dependency1__["default"] || __dependency1__; - //import QUnit from 'qunit'; // Assumed global in runner - var testContext = __dependency2__["default"] || __dependency2__; - var isolatedContainer = __dependency3__["default"] || __dependency3__; - - __exports__["default"] = function moduleFor(fullName, description, callbacks, delegate) { - var container; - var context; - - var _callbacks = { - setup: function(){ - callbacks = callbacks || { }; - - var needs = [fullName].concat(callbacks.needs || []); - container = isolatedContainer(needs); - - callbacks.subject = callbacks.subject || defaultSubject; - - callbacks.setup = callbacks.setup || function() { }; - callbacks.teardown = callbacks.teardown || function() { }; - - function factory() { - return container.lookupFactory(fullName); - } - - testContext.set({ - container: container, - factory: factory, - dispatcher: null, - __setup_properties__: callbacks - }); - - context = testContext.get(); - - if (delegate) { - delegate(container, context, defaultSubject); - } - - if (Ember.$('#ember-testing').length === 0) { - Ember.$('
').appendTo(document.body); - } - - buildContextVariables(context); - callbacks.setup.call(context, container); - }, - - teardown: function(){ - Ember.run(function(){ - container.destroy(); - - if (context.dispatcher) { - context.dispatcher.destroy(); - } - }); - - callbacks.teardown(container); - Ember.$('#ember-testing').empty(); - } - }; - - QUnit.module(description || fullName, _callbacks); - } - - function defaultSubject(options, factory) { - return factory.create(options); - } - - // allow arbitrary named factories, like rspec let - function buildContextVariables(context) { - var cache = { }; - var callbacks = context.__setup_properties__; - var container = context.container; - var factory = context.factory; - - Ember.keys(callbacks).filter(function(key){ - // ignore the default setup/teardown keys - return key !== 'setup' && key !== 'teardown'; - }).forEach(function(key){ - context[key] = function(options) { - if (cache[key]) { return cache[key]; } - - var result = callbacks[key](options, factory(), container); - cache[key] = result; - return result; - }; - }); - } - }); \ No newline at end of file diff --git a/dist/amd/test-context.js b/dist/amd/test-context.js deleted file mode 100644 index b573c51a..00000000 --- a/dist/amd/test-context.js +++ /dev/null @@ -1,16 +0,0 @@ -define( - ["exports"], - function(__exports__) { - "use strict"; - var __test_context__; - - function set(context) { - __test_context__ = context; - } - - __exports__.set = set;function get() { - return __test_context__; - } - - __exports__.get = get; - }); \ No newline at end of file diff --git a/dist/amd/test-resolver.js b/dist/amd/test-resolver.js deleted file mode 100644 index 5ec49962..00000000 --- a/dist/amd/test-resolver.js +++ /dev/null @@ -1,17 +0,0 @@ -define( - ["exports"], - function(__exports__) { - "use strict"; - var __resolver__; - - function set(resolver) { - __resolver__ = resolver; - } - - __exports__.set = set;function get() { - if (__resolver__ == null) throw new Error('you must set a resolver with `testResolver.set(resolver)`'); - return __resolver__; - } - - __exports__.get = get; - }); \ No newline at end of file diff --git a/dist/amd/test.js b/dist/amd/test.js deleted file mode 100644 index b5c9a974..00000000 --- a/dist/amd/test.js +++ /dev/null @@ -1,33 +0,0 @@ -define( - ["ember","./test-context","exports"], - function(__dependency1__, __dependency2__, __exports__) { - "use strict"; - var Ember = __dependency1__["default"] || __dependency1__; - //import QUnit from 'qunit'; // Assumed global in runner - var testContext = __dependency2__["default"] || __dependency2__; - - function resetViews() { - Ember.View.views = {}; - } - - __exports__["default"] = function test(testName, callback) { - - function wrapper() { - var context = testContext.get(); - - resetViews(); - var result = callback.call(context); - - function failTestOnPromiseRejection(reason) { - ok(false, reason); - } - - Ember.run(function(){ - stop(); - Ember.RSVP.Promise.cast(result)['catch'](failTestOnPromiseRejection)['finally'](start); - }); - } - - QUnit.test(testName, wrapper); - } - }); \ No newline at end of file diff --git a/dist/cjs/isolated-container.js b/dist/cjs/isolated-container.js deleted file mode 100644 index ab27019f..00000000 --- a/dist/cjs/isolated-container.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; -var testResolver = require("./test-resolver")["default"] || require("./test-resolver"); -var Ember = require("ember")["default"] || require("ember"); - -exports["default"] = function isolatedContainer(fullNames) { - var resolver = testResolver.get(); - var container = new Ember.Container(); - container.optionsForType('component', { singleton: false }); - container.optionsForType('view', { singleton: false }); - container.optionsForType('template', { instantiate: false }); - container.optionsForType('helper', { instantiate: false }); - container.register('component-lookup:main', Ember.ComponentLookup); - for (var i = fullNames.length; i > 0; i--) { - var fullName = fullNames[i - 1]; - var normalizedFullName = resolver.normalize(fullName); - container.register(fullName, resolver.resolve(normalizedFullName)); - } - return container; -} \ No newline at end of file diff --git a/dist/cjs/main.js b/dist/cjs/main.js deleted file mode 100644 index 5067bf8a..00000000 --- a/dist/cjs/main.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; -var Ember = require("ember")["default"] || require("ember"); -var isolatedContainer = require("./isolated-container")["default"] || require("./isolated-container"); -var moduleFor = require("./module-for")["default"] || require("./module-for"); -var moduleForComponent = require("./module-for-component")["default"] || require("./module-for-component"); -var moduleForModel = require("./module-for-model")["default"] || require("./module-for-model"); -var test = require("./test")["default"] || require("./test"); -var testResolver = require("./test-resolver")["default"] || require("./test-resolver"); - -Ember.testing = true; - -function setResolver(resolver) { - testResolver.set(resolver); -} - -function globalize() { - window.moduleFor = moduleFor; - window.moduleForComponent = moduleForComponent; - window.moduleForModel = moduleForModel; - window.test = test; - window.setResolver = setResolver; -} - -exports.globalize = globalize; -exports.moduleFor = moduleFor; -exports.moduleForComponent = moduleForComponent; -exports.moduleForModel = moduleForModel; -exports.test = test; -exports.setResolver = setResolver; \ No newline at end of file diff --git a/dist/cjs/module-for-component.js b/dist/cjs/module-for-component.js deleted file mode 100644 index 15615e6b..00000000 --- a/dist/cjs/module-for-component.js +++ /dev/null @@ -1,60 +0,0 @@ -"use strict"; -var testResolver = require("./test-resolver")["default"] || require("./test-resolver"); -var moduleFor = require("./module-for")["default"] || require("./module-for"); -var Ember = require("ember")["default"] || require("ember"); - -exports["default"] = function moduleForComponent(name, description, callbacks) { - var resolver = testResolver.get(); - - moduleFor('component:' + name, description, callbacks, function(container, context, defaultSubject) { - var layoutName = 'template:components/' + name; - - var layout = resolver.resolve(layoutName); - - if (layout) { - container.register(layoutName, layout); - container.injection('component:' + name, 'layout', layoutName); - } - - context.dispatcher = Ember.EventDispatcher.create(); - context.dispatcher.setup({}, '#ember-testing'); - - context.__setup_properties__.render = function() { - var containerView = Ember.ContainerView.create({container: container}); - var view = Ember.run(function(){ - var subject = context.subject(); - containerView.pushObject(subject); - containerView.appendTo('#ember-testing'); - return subject; - }); - - var oldTeardown = this.teardown; - this.teardown = function() { - Ember.run(function() { - Ember.tryInvoke(containerView, 'destroy'); - }); - - if (oldTeardown) { - return oldTeardown.apply(this, arguments); - } - }; - - return view.$(); - }; - - context.__setup_properties__.append = function(){ - Ember.deprecate('this.append() is deprecated. Please use this.render() instead.'); - return this.render(); - }; - - context.$ = function(){ - var $view = this.render(), subject = this.subject(); - - if(arguments.length){ - return subject.$.apply(subject, arguments); - }else{ - return $view; - } - }; - }); -} \ No newline at end of file diff --git a/dist/cjs/module-for-model.js b/dist/cjs/module-for-model.js deleted file mode 100644 index 104e3937..00000000 --- a/dist/cjs/module-for-model.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -var moduleFor = require("./module-for")["default"] || require("./module-for"); -var Ember = require("ember")["default"] || require("ember"); - -exports["default"] = function moduleForModel(name, description, callbacks) { - if (!DS) throw new Error('You must have Ember Data installed to use `moduleForModel`.'); - - moduleFor('model:' + name, description, callbacks, function(container, context, defaultSubject) { - if (DS._setupContainer) { - DS._setupContainer(container); - } else { - container.register('store:main', DS.Store); - } - - var adapterFactory = container.lookupFactory('adapter:application'); - if (!adapterFactory) { - container.register('adapter:application', DS.FixtureAdapter); - } - - context.__setup_properties__.store = function(){ - return container.lookup('store:main'); - }; - - if (context.__setup_properties__.subject === defaultSubject) { - context.__setup_properties__.subject = function(options) { - return Ember.run(function() { - return container.lookup('store:main').createRecord(name, options); - }); - }; - } - }); -} \ No newline at end of file diff --git a/dist/cjs/module-for.js b/dist/cjs/module-for.js deleted file mode 100644 index c8ecdf92..00000000 --- a/dist/cjs/module-for.js +++ /dev/null @@ -1,88 +0,0 @@ -"use strict"; -var Ember = require("ember")["default"] || require("ember"); -//import QUnit from 'qunit'; // Assumed global in runner -var testContext = require("./test-context")["default"] || require("./test-context"); -var isolatedContainer = require("./isolated-container")["default"] || require("./isolated-container"); - -exports["default"] = function moduleFor(fullName, description, callbacks, delegate) { - var container; - var context; - - var _callbacks = { - setup: function(){ - callbacks = callbacks || { }; - - var needs = [fullName].concat(callbacks.needs || []); - container = isolatedContainer(needs); - - callbacks.subject = callbacks.subject || defaultSubject; - - callbacks.setup = callbacks.setup || function() { }; - callbacks.teardown = callbacks.teardown || function() { }; - - function factory() { - return container.lookupFactory(fullName); - } - - testContext.set({ - container: container, - factory: factory, - dispatcher: null, - __setup_properties__: callbacks - }); - - context = testContext.get(); - - if (delegate) { - delegate(container, context, defaultSubject); - } - - if (Ember.$('#ember-testing').length === 0) { - Ember.$('
').appendTo(document.body); - } - - buildContextVariables(context); - callbacks.setup.call(context, container); - }, - - teardown: function(){ - Ember.run(function(){ - container.destroy(); - - if (context.dispatcher) { - context.dispatcher.destroy(); - } - }); - - callbacks.teardown(container); - Ember.$('#ember-testing').empty(); - } - }; - - QUnit.module(description || fullName, _callbacks); -} - -function defaultSubject(options, factory) { - return factory.create(options); -} - -// allow arbitrary named factories, like rspec let -function buildContextVariables(context) { - var cache = { }; - var callbacks = context.__setup_properties__; - var container = context.container; - var factory = context.factory; - - Ember.keys(callbacks).filter(function(key){ - // ignore the default setup/teardown keys - return key !== 'setup' && key !== 'teardown'; - }).forEach(function(key){ - context[key] = function(options) { - if (cache[key]) { return cache[key]; } - - var result = callbacks[key](options, factory(), container); - cache[key] = result; - return result; - }; - }); -} \ No newline at end of file diff --git a/dist/cjs/test-context.js b/dist/cjs/test-context.js deleted file mode 100644 index 20f6ac5d..00000000 --- a/dist/cjs/test-context.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -var __test_context__; - -function set(context) { - __test_context__ = context; -} - -exports.set = set;function get() { - return __test_context__; -} - -exports.get = get; \ No newline at end of file diff --git a/dist/cjs/test-resolver.js b/dist/cjs/test-resolver.js deleted file mode 100644 index c405b261..00000000 --- a/dist/cjs/test-resolver.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -var __resolver__; - -function set(resolver) { - __resolver__ = resolver; -} - -exports.set = set;function get() { - if (__resolver__ == null) throw new Error('you must set a resolver with `testResolver.set(resolver)`'); - return __resolver__; -} - -exports.get = get; \ No newline at end of file diff --git a/dist/cjs/test.js b/dist/cjs/test.js deleted file mode 100644 index 67fa2841..00000000 --- a/dist/cjs/test.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; -var Ember = require("ember")["default"] || require("ember"); -//import QUnit from 'qunit'; // Assumed global in runner -var testContext = require("./test-context")["default"] || require("./test-context"); - -function resetViews() { - Ember.View.views = {}; -} - -exports["default"] = function test(testName, callback) { - - function wrapper() { - var context = testContext.get(); - - resetViews(); - var result = callback.call(context); - - function failTestOnPromiseRejection(reason) { - ok(false, reason); - } - - Ember.run(function(){ - stop(); - Ember.RSVP.Promise.cast(result)['catch'](failTestOnPromiseRejection)['finally'](start); - }); - } - - QUnit.test(testName, wrapper); -} \ No newline at end of file diff --git a/dist/globals/main.js b/dist/globals/main.js deleted file mode 100644 index 91e1b137..00000000 --- a/dist/globals/main.js +++ /dev/null @@ -1,293 +0,0 @@ -!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.emq=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0; i--) { - var fullName = fullNames[i - 1]; - var normalizedFullName = resolver.normalize(fullName); - container.register(fullName, resolver.resolve(normalizedFullName)); - } - return container; -} -},{"./test-resolver":7}],2:[function(_dereq_,module,exports){ -"use strict"; -var Ember = window.Ember["default"] || window.Ember; -var isolatedContainer = _dereq_("./isolated-container")["default"] || _dereq_("./isolated-container"); -var moduleFor = _dereq_("./module-for")["default"] || _dereq_("./module-for"); -var moduleForComponent = _dereq_("./module-for-component")["default"] || _dereq_("./module-for-component"); -var moduleForModel = _dereq_("./module-for-model")["default"] || _dereq_("./module-for-model"); -var test = _dereq_("./test")["default"] || _dereq_("./test"); -var testResolver = _dereq_("./test-resolver")["default"] || _dereq_("./test-resolver"); - -Ember.testing = true; - -function setResolver(resolver) { - testResolver.set(resolver); -} - -function globalize() { - window.moduleFor = moduleFor; - window.moduleForComponent = moduleForComponent; - window.moduleForModel = moduleForModel; - window.test = test; - window.setResolver = setResolver; -} - -exports.globalize = globalize; -exports.moduleFor = moduleFor; -exports.moduleForComponent = moduleForComponent; -exports.moduleForModel = moduleForModel; -exports.test = test; -exports.setResolver = setResolver; -},{"./isolated-container":1,"./module-for":5,"./module-for-component":3,"./module-for-model":4,"./test":8,"./test-resolver":7}],3:[function(_dereq_,module,exports){ -"use strict"; -var testResolver = _dereq_("./test-resolver")["default"] || _dereq_("./test-resolver"); -var moduleFor = _dereq_("./module-for")["default"] || _dereq_("./module-for"); -var Ember = window.Ember["default"] || window.Ember; - -exports["default"] = function moduleForComponent(name, description, callbacks) { - var resolver = testResolver.get(); - - moduleFor('component:' + name, description, callbacks, function(container, context, defaultSubject) { - var layoutName = 'template:components/' + name; - - var layout = resolver.resolve(layoutName); - - if (layout) { - container.register(layoutName, layout); - container.injection('component:' + name, 'layout', layoutName); - } - - context.dispatcher = Ember.EventDispatcher.create(); - context.dispatcher.setup({}, '#ember-testing'); - - context.__setup_properties__.render = function() { - var containerView = Ember.ContainerView.create({container: container}); - var view = Ember.run(function(){ - var subject = context.subject(); - containerView.pushObject(subject); - containerView.appendTo('#ember-testing'); - return subject; - }); - - var oldTeardown = this.teardown; - this.teardown = function() { - Ember.run(function() { - Ember.tryInvoke(containerView, 'destroy'); - }); - - if (oldTeardown) { - return oldTeardown.apply(this, arguments); - } - }; - - return view.$(); - }; - - context.__setup_properties__.append = function(){ - Ember.deprecate('this.append() is deprecated. Please use this.render() instead.'); - return this.render(); - }; - - context.$ = function(){ - var $view = this.render(), subject = this.subject(); - - if(arguments.length){ - return subject.$.apply(subject, arguments); - }else{ - return $view; - } - }; - }); -} -},{"./module-for":5,"./test-resolver":7}],4:[function(_dereq_,module,exports){ -"use strict"; -var moduleFor = _dereq_("./module-for")["default"] || _dereq_("./module-for"); -var Ember = window.Ember["default"] || window.Ember; - -exports["default"] = function moduleForModel(name, description, callbacks) { - if (!DS) throw new Error('You must have Ember Data installed to use `moduleForModel`.'); - - moduleFor('model:' + name, description, callbacks, function(container, context, defaultSubject) { - if (DS._setupContainer) { - DS._setupContainer(container); - } else { - container.register('store:main', DS.Store); - } - - var adapterFactory = container.lookupFactory('adapter:application'); - if (!adapterFactory) { - container.register('adapter:application', DS.FixtureAdapter); - } - - context.__setup_properties__.store = function(){ - return container.lookup('store:main'); - }; - - if (context.__setup_properties__.subject === defaultSubject) { - context.__setup_properties__.subject = function(options) { - return Ember.run(function() { - return container.lookup('store:main').createRecord(name, options); - }); - }; - } - }); -} -},{"./module-for":5}],5:[function(_dereq_,module,exports){ -"use strict"; -var Ember = window.Ember["default"] || window.Ember; -//import QUnit from 'qunit'; // Assumed global in runner -var testContext = _dereq_("./test-context")["default"] || _dereq_("./test-context"); -var isolatedContainer = _dereq_("./isolated-container")["default"] || _dereq_("./isolated-container"); - -exports["default"] = function moduleFor(fullName, description, callbacks, delegate) { - var container; - var context; - - var _callbacks = { - setup: function(){ - callbacks = callbacks || { }; - - var needs = [fullName].concat(callbacks.needs || []); - container = isolatedContainer(needs); - - callbacks.subject = callbacks.subject || defaultSubject; - - callbacks.setup = callbacks.setup || function() { }; - callbacks.teardown = callbacks.teardown || function() { }; - - function factory() { - return container.lookupFactory(fullName); - } - - testContext.set({ - container: container, - factory: factory, - dispatcher: null, - __setup_properties__: callbacks - }); - - context = testContext.get(); - - if (delegate) { - delegate(container, context, defaultSubject); - } - - if (Ember.$('#ember-testing').length === 0) { - Ember.$('
').appendTo(document.body); - } - - buildContextVariables(context); - callbacks.setup.call(context, container); - }, - - teardown: function(){ - Ember.run(function(){ - container.destroy(); - - if (context.dispatcher) { - context.dispatcher.destroy(); - } - }); - - callbacks.teardown(container); - Ember.$('#ember-testing').empty(); - } - }; - - QUnit.module(description || fullName, _callbacks); -} - -function defaultSubject(options, factory) { - return factory.create(options); -} - -// allow arbitrary named factories, like rspec let -function buildContextVariables(context) { - var cache = { }; - var callbacks = context.__setup_properties__; - var container = context.container; - var factory = context.factory; - - Ember.keys(callbacks).filter(function(key){ - // ignore the default setup/teardown keys - return key !== 'setup' && key !== 'teardown'; - }).forEach(function(key){ - context[key] = function(options) { - if (cache[key]) { return cache[key]; } - - var result = callbacks[key](options, factory(), container); - cache[key] = result; - return result; - }; - }); -} -},{"./isolated-container":1,"./test-context":6}],6:[function(_dereq_,module,exports){ -"use strict"; -var __test_context__; - -function set(context) { - __test_context__ = context; -} - -exports.set = set;function get() { - return __test_context__; -} - -exports.get = get; -},{}],7:[function(_dereq_,module,exports){ -"use strict"; -var __resolver__; - -function set(resolver) { - __resolver__ = resolver; -} - -exports.set = set;function get() { - if (__resolver__ == null) throw new Error('you must set a resolver with `testResolver.set(resolver)`'); - return __resolver__; -} - -exports.get = get; -},{}],8:[function(_dereq_,module,exports){ -"use strict"; -var Ember = window.Ember["default"] || window.Ember; -//import QUnit from 'qunit'; // Assumed global in runner -var testContext = _dereq_("./test-context")["default"] || _dereq_("./test-context"); - -function resetViews() { - Ember.View.views = {}; -} - -exports["default"] = function test(testName, callback) { - - function wrapper() { - var context = testContext.get(); - - resetViews(); - var result = callback.call(context); - - function failTestOnPromiseRejection(reason) { - ok(false, reason); - } - - Ember.run(function(){ - stop(); - Ember.RSVP.Promise.cast(result)['catch'](failTestOnPromiseRejection)['finally'](start); - }); - } - - QUnit.test(testName, wrapper); -} -},{"./test-context":6}]},{},[2]) -(2) -}); \ No newline at end of file diff --git a/dist/named-amd/main.js b/dist/named-amd/main.js deleted file mode 100644 index 07328a54..00000000 --- a/dist/named-amd/main.js +++ /dev/null @@ -1,314 +0,0 @@ -define("ember-qunit/isolated-container", - ["./test-resolver","ember","exports"], - function(__dependency1__, __dependency2__, __exports__) { - "use strict"; - var testResolver = __dependency1__["default"] || __dependency1__; - var Ember = __dependency2__["default"] || __dependency2__; - - __exports__["default"] = function isolatedContainer(fullNames) { - var resolver = testResolver.get(); - var container = new Ember.Container(); - container.optionsForType('component', { singleton: false }); - container.optionsForType('view', { singleton: false }); - container.optionsForType('template', { instantiate: false }); - container.optionsForType('helper', { instantiate: false }); - container.register('component-lookup:main', Ember.ComponentLookup); - for (var i = fullNames.length; i > 0; i--) { - var fullName = fullNames[i - 1]; - var normalizedFullName = resolver.normalize(fullName); - container.register(fullName, resolver.resolve(normalizedFullName)); - } - return container; - } - }); -define("ember-qunit", - ["ember","./isolated-container","./module-for","./module-for-component","./module-for-model","./test","./test-resolver","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) { - "use strict"; - var Ember = __dependency1__["default"] || __dependency1__; - var isolatedContainer = __dependency2__["default"] || __dependency2__; - var moduleFor = __dependency3__["default"] || __dependency3__; - var moduleForComponent = __dependency4__["default"] || __dependency4__; - var moduleForModel = __dependency5__["default"] || __dependency5__; - var test = __dependency6__["default"] || __dependency6__; - var testResolver = __dependency7__["default"] || __dependency7__; - - Ember.testing = true; - - function setResolver(resolver) { - testResolver.set(resolver); - } - - function globalize() { - window.moduleFor = moduleFor; - window.moduleForComponent = moduleForComponent; - window.moduleForModel = moduleForModel; - window.test = test; - window.setResolver = setResolver; - } - - __exports__.globalize = globalize; - __exports__.moduleFor = moduleFor; - __exports__.moduleForComponent = moduleForComponent; - __exports__.moduleForModel = moduleForModel; - __exports__.test = test; - __exports__.setResolver = setResolver; - }); -define("ember-qunit/module-for-component", - ["./test-resolver","./module-for","ember","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __exports__) { - "use strict"; - var testResolver = __dependency1__["default"] || __dependency1__; - var moduleFor = __dependency2__["default"] || __dependency2__; - var Ember = __dependency3__["default"] || __dependency3__; - - __exports__["default"] = function moduleForComponent(name, description, callbacks) { - var resolver = testResolver.get(); - - moduleFor('component:' + name, description, callbacks, function(container, context, defaultSubject) { - var layoutName = 'template:components/' + name; - - var layout = resolver.resolve(layoutName); - - if (layout) { - container.register(layoutName, layout); - container.injection('component:' + name, 'layout', layoutName); - } - - context.dispatcher = Ember.EventDispatcher.create(); - context.dispatcher.setup({}, '#ember-testing'); - - context.__setup_properties__.render = function() { - var containerView = Ember.ContainerView.create({container: container}); - var view = Ember.run(function(){ - var subject = context.subject(); - containerView.pushObject(subject); - containerView.appendTo('#ember-testing'); - return subject; - }); - - var oldTeardown = this.teardown; - this.teardown = function() { - Ember.run(function() { - Ember.tryInvoke(containerView, 'destroy'); - }); - - if (oldTeardown) { - return oldTeardown.apply(this, arguments); - } - }; - - return view.$(); - }; - - context.__setup_properties__.append = function(){ - Ember.deprecate('this.append() is deprecated. Please use this.render() instead.'); - return this.render(); - }; - - context.$ = function(){ - var $view = this.render(), subject = this.subject(); - - if(arguments.length){ - return subject.$.apply(subject, arguments); - }else{ - return $view; - } - }; - }); - } - }); -define("ember-qunit/module-for-model", - ["./module-for","ember","exports"], - function(__dependency1__, __dependency2__, __exports__) { - "use strict"; - var moduleFor = __dependency1__["default"] || __dependency1__; - var Ember = __dependency2__["default"] || __dependency2__; - - __exports__["default"] = function moduleForModel(name, description, callbacks) { - if (!DS) throw new Error('You must have Ember Data installed to use `moduleForModel`.'); - - moduleFor('model:' + name, description, callbacks, function(container, context, defaultSubject) { - if (DS._setupContainer) { - DS._setupContainer(container); - } else { - container.register('store:main', DS.Store); - } - - var adapterFactory = container.lookupFactory('adapter:application'); - if (!adapterFactory) { - container.register('adapter:application', DS.FixtureAdapter); - } - - context.__setup_properties__.store = function(){ - return container.lookup('store:main'); - }; - - if (context.__setup_properties__.subject === defaultSubject) { - context.__setup_properties__.subject = function(options) { - return Ember.run(function() { - return container.lookup('store:main').createRecord(name, options); - }); - }; - } - }); - } - }); -define("ember-qunit/module-for", - ["ember","./test-context","./isolated-container","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __exports__) { - "use strict"; - var Ember = __dependency1__["default"] || __dependency1__; - //import QUnit from 'qunit'; // Assumed global in runner - var testContext = __dependency2__["default"] || __dependency2__; - var isolatedContainer = __dependency3__["default"] || __dependency3__; - - __exports__["default"] = function moduleFor(fullName, description, callbacks, delegate) { - var container; - var context; - - var _callbacks = { - setup: function(){ - callbacks = callbacks || { }; - - var needs = [fullName].concat(callbacks.needs || []); - container = isolatedContainer(needs); - - callbacks.subject = callbacks.subject || defaultSubject; - - callbacks.setup = callbacks.setup || function() { }; - callbacks.teardown = callbacks.teardown || function() { }; - - function factory() { - return container.lookupFactory(fullName); - } - - testContext.set({ - container: container, - factory: factory, - dispatcher: null, - __setup_properties__: callbacks - }); - - context = testContext.get(); - - if (delegate) { - delegate(container, context, defaultSubject); - } - - if (Ember.$('#ember-testing').length === 0) { - Ember.$('
').appendTo(document.body); - } - - buildContextVariables(context); - callbacks.setup.call(context, container); - }, - - teardown: function(){ - Ember.run(function(){ - container.destroy(); - - if (context.dispatcher) { - context.dispatcher.destroy(); - } - }); - - callbacks.teardown(container); - Ember.$('#ember-testing').empty(); - } - }; - - QUnit.module(description || fullName, _callbacks); - } - - function defaultSubject(options, factory) { - return factory.create(options); - } - - // allow arbitrary named factories, like rspec let - function buildContextVariables(context) { - var cache = { }; - var callbacks = context.__setup_properties__; - var container = context.container; - var factory = context.factory; - - Ember.keys(callbacks).filter(function(key){ - // ignore the default setup/teardown keys - return key !== 'setup' && key !== 'teardown'; - }).forEach(function(key){ - context[key] = function(options) { - if (cache[key]) { return cache[key]; } - - var result = callbacks[key](options, factory(), container); - cache[key] = result; - return result; - }; - }); - } - }); -define("ember-qunit/test-context", - ["exports"], - function(__exports__) { - "use strict"; - var __test_context__; - - function set(context) { - __test_context__ = context; - } - - __exports__.set = set;function get() { - return __test_context__; - } - - __exports__.get = get; - }); -define("ember-qunit/test-resolver", - ["exports"], - function(__exports__) { - "use strict"; - var __resolver__; - - function set(resolver) { - __resolver__ = resolver; - } - - __exports__.set = set;function get() { - if (__resolver__ == null) throw new Error('you must set a resolver with `testResolver.set(resolver)`'); - return __resolver__; - } - - __exports__.get = get; - }); -define("ember-qunit/test", - ["ember","./test-context","exports"], - function(__dependency1__, __dependency2__, __exports__) { - "use strict"; - var Ember = __dependency1__["default"] || __dependency1__; - //import QUnit from 'qunit'; // Assumed global in runner - var testContext = __dependency2__["default"] || __dependency2__; - - function resetViews() { - Ember.View.views = {}; - } - - __exports__["default"] = function test(testName, callback) { - - function wrapper() { - var context = testContext.get(); - - resetViews(); - var result = callback.call(context); - - function failTestOnPromiseRejection(reason) { - ok(false, reason); - } - - Ember.run(function(){ - stop(); - Ember.RSVP.Promise.cast(result)['catch'](failTestOnPromiseRejection)['finally'](start); - }); - } - - QUnit.test(testName, wrapper); - } - }); \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 4efd1350..00000000 --- a/karma.conf.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = function(config) { - config.set({ - - frameworks: ['qunit'], - - files: [ - 'bower_components/jquery/dist/jquery.js', - 'bower_components/handlebars/handlebars.js', - 'bower_components/ember/ember.js', - 'bower_components/ember-data/ember-data.js', - 'dist/globals/main.js', - // when running broccoli serve, we use this instead - 'http://localhost:4200/globals/main.js', - 'test/support/setup.js', - 'test/**/*.spec.js' - ], - - basePath: '', - - reporters: ['progress'], - - port: 9876, - - colors: true, - - logLevel: config.LOG_INFO, - - autoWatch: true, - - browsers: ['Chrome'], - - captureTimeout: 60000, - - singleRun: false - - }); -}; - diff --git a/lib/ember-qunit.js b/lib/ember-qunit.js new file mode 100644 index 00000000..b8ab95c5 --- /dev/null +++ b/lib/ember-qunit.js @@ -0,0 +1,22 @@ +import moduleFor from 'ember-qunit/module-for'; +import moduleForComponent from 'ember-qunit/module-for-component'; +import moduleForModel from 'ember-qunit/module-for-model'; +import test from 'ember-qunit/test'; +import { setResolver } from 'ember-test-helpers'; + +function globalize() { + window.moduleFor = moduleFor; + window.moduleForComponent = moduleForComponent; + window.moduleForModel = moduleForModel; + window.test = test; + window.setResolver = setResolver; +} + +export { + globalize, + moduleFor, + moduleForComponent, + moduleForModel, + test, + setResolver +}; diff --git a/lib/ember-qunit/module-for-component.js b/lib/ember-qunit/module-for-component.js new file mode 100644 index 00000000..be699be3 --- /dev/null +++ b/lib/ember-qunit/module-for-component.js @@ -0,0 +1,6 @@ +import { createModule } from './qunit-module'; +import { TestModuleForComponent } from 'ember-test-helpers'; + +export default function moduleForComponent(name, description, callbacks) { + createModule(TestModuleForComponent, name, description, callbacks); +} diff --git a/lib/ember-qunit/module-for-model.js b/lib/ember-qunit/module-for-model.js new file mode 100644 index 00000000..7108b304 --- /dev/null +++ b/lib/ember-qunit/module-for-model.js @@ -0,0 +1,6 @@ +import { createModule } from './qunit-module'; +import { TestModuleForModel } from 'ember-test-helpers'; + +export default function moduleForModel(name, description, callbacks) { + createModule(TestModuleForModel, name, description, callbacks); +} diff --git a/lib/ember-qunit/module-for.js b/lib/ember-qunit/module-for.js new file mode 100644 index 00000000..ce206c83 --- /dev/null +++ b/lib/ember-qunit/module-for.js @@ -0,0 +1,6 @@ +import { createModule } from './qunit-module'; +import { TestModule } from 'ember-test-helpers'; + +export default function moduleFor(name, description, callbacks) { + createModule(TestModule, name, description, callbacks); +} diff --git a/lib/ember-qunit/qunit-module.js b/lib/ember-qunit/qunit-module.js new file mode 100644 index 00000000..2092d02b --- /dev/null +++ b/lib/ember-qunit/qunit-module.js @@ -0,0 +1,12 @@ +export function createModule(Constructor, name, description, callbacks) { + var module = new Constructor(name, description, callbacks); + + QUnit.module(module.name, { + setup: function() { + module.setup(); + }, + teardown: function() { + module.teardown(); + } + }); +} \ No newline at end of file diff --git a/lib/test.js b/lib/ember-qunit/test.js similarity index 77% rename from lib/test.js rename to lib/ember-qunit/test.js index cd13d1bb..754bd6c6 100644 --- a/lib/test.js +++ b/lib/ember-qunit/test.js @@ -1,16 +1,14 @@ import Ember from 'ember'; -//import QUnit from 'qunit'; // Assumed global in runner -import testContext from './test-context'; +import { getContext } from 'ember-test-helpers'; function resetViews() { Ember.View.views = {}; } export default function test(testName, callback) { - function wrapper() { - var context = testContext.get(); - + var context = getContext(); + resetViews(); var result = callback.call(context); @@ -26,4 +24,3 @@ export default function test(testName, callback) { QUnit.test(testName, wrapper); } - diff --git a/lib/isolated-container.js b/lib/isolated-container.js deleted file mode 100644 index e835a5b8..00000000 --- a/lib/isolated-container.js +++ /dev/null @@ -1,18 +0,0 @@ -import testResolver from './test-resolver'; -import Ember from 'ember'; - -export default function isolatedContainer(fullNames) { - var resolver = testResolver.get(); - var container = new Ember.Container(); - container.optionsForType('component', { singleton: false }); - container.optionsForType('view', { singleton: false }); - container.optionsForType('template', { instantiate: false }); - container.optionsForType('helper', { instantiate: false }); - container.register('component-lookup:main', Ember.ComponentLookup); - for (var i = fullNames.length; i > 0; i--) { - var fullName = fullNames[i - 1]; - var normalizedFullName = resolver.normalize(fullName); - container.register(fullName, resolver.resolve(normalizedFullName)); - } - return container; -} diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index de334a8c..00000000 --- a/lib/main.js +++ /dev/null @@ -1,31 +0,0 @@ -import Ember from 'ember'; -import isolatedContainer from './isolated-container'; -import moduleFor from './module-for'; -import moduleForComponent from './module-for-component'; -import moduleForModel from './module-for-model'; -import test from './test'; -import testResolver from './test-resolver'; - -Ember.testing = true; - -function setResolver(resolver) { - testResolver.set(resolver); -} - -function globalize() { - window.moduleFor = moduleFor; - window.moduleForComponent = moduleForComponent; - window.moduleForModel = moduleForModel; - window.test = test; - window.setResolver = setResolver; -} - -export { - globalize, - moduleFor, - moduleForComponent, - moduleForModel, - test, - setResolver -}; - diff --git a/lib/module-for-component.js b/lib/module-for-component.js deleted file mode 100644 index 4e41332e..00000000 --- a/lib/module-for-component.js +++ /dev/null @@ -1,59 +0,0 @@ -import testResolver from './test-resolver'; -import moduleFor from './module-for'; -import Ember from 'ember'; - -export default function moduleForComponent(name, description, callbacks) { - var resolver = testResolver.get(); - - moduleFor('component:' + name, description, callbacks, function(container, context, defaultSubject) { - var layoutName = 'template:components/' + name; - - var layout = resolver.resolve(layoutName); - - if (layout) { - container.register(layoutName, layout); - container.injection('component:' + name, 'layout', layoutName); - } - - context.dispatcher = Ember.EventDispatcher.create(); - context.dispatcher.setup({}, '#ember-testing'); - - context.__setup_properties__.render = function() { - var containerView = Ember.ContainerView.create({container: container}); - var view = Ember.run(function(){ - var subject = context.subject(); - containerView.pushObject(subject); - containerView.appendTo('#ember-testing'); - return subject; - }); - - var oldTeardown = this.teardown; - this.teardown = function() { - Ember.run(function() { - Ember.tryInvoke(containerView, 'destroy'); - }); - - if (oldTeardown) { - return oldTeardown.apply(this, arguments); - } - }; - - return view.$(); - }; - - context.__setup_properties__.append = function(){ - Ember.deprecate('this.append() is deprecated. Please use this.render() instead.'); - return this.render(); - }; - - context.$ = function(){ - var $view = this.render(), subject = this.subject(); - - if(arguments.length){ - return subject.$.apply(subject, arguments); - }else{ - return $view; - } - }; - }); -} diff --git a/lib/module-for-model.js b/lib/module-for-model.js deleted file mode 100644 index 5a4bee24..00000000 --- a/lib/module-for-model.js +++ /dev/null @@ -1,31 +0,0 @@ -import moduleFor from './module-for'; -import Ember from 'ember'; - -export default function moduleForModel(name, description, callbacks) { - if (!DS) throw new Error('You must have Ember Data installed to use `moduleForModel`.'); - - moduleFor('model:' + name, description, callbacks, function(container, context, defaultSubject) { - if (DS._setupContainer) { - DS._setupContainer(container); - } else { - container.register('store:main', DS.Store); - } - - var adapterFactory = container.lookupFactory('adapter:application'); - if (!adapterFactory) { - container.register('adapter:application', DS.FixtureAdapter); - } - - context.__setup_properties__.store = function(){ - return container.lookup('store:main'); - }; - - if (context.__setup_properties__.subject === defaultSubject) { - context.__setup_properties__.subject = function(options) { - return Ember.run(function() { - return container.lookup('store:main').createRecord(name, options); - }); - }; - } - }); -} diff --git a/lib/module-for.js b/lib/module-for.js deleted file mode 100644 index b9bd399b..00000000 --- a/lib/module-for.js +++ /dev/null @@ -1,87 +0,0 @@ -import Ember from 'ember'; -//import QUnit from 'qunit'; // Assumed global in runner -import testContext from './test-context'; -import isolatedContainer from './isolated-container'; - -export default function moduleFor(fullName, description, callbacks, delegate) { - var container; - var context; - - var _callbacks = { - setup: function(){ - callbacks = callbacks || { }; - - var needs = [fullName].concat(callbacks.needs || []); - container = isolatedContainer(needs); - - callbacks.subject = callbacks.subject || defaultSubject; - - callbacks.setup = callbacks.setup || function() { }; - callbacks.teardown = callbacks.teardown || function() { }; - - function factory() { - return container.lookupFactory(fullName); - } - - testContext.set({ - container: container, - factory: factory, - dispatcher: null, - __setup_properties__: callbacks - }); - - context = testContext.get(); - - if (Ember.$('#ember-testing').length === 0) { - Ember.$('
').appendTo(document.body); - } - - if (delegate) { - delegate(container, context, defaultSubject); - } - - buildContextVariables(context); - callbacks.setup.call(context, container); - }, - - teardown: function(){ - Ember.run(function(){ - container.destroy(); - - if (context.dispatcher) { - context.dispatcher.destroy(); - } - }); - - callbacks.teardown(container); - Ember.$('#ember-testing').empty(); - } - }; - - QUnit.module(description || fullName, _callbacks); -} - -function defaultSubject(options, factory) { - return factory.create(options); -} - -// allow arbitrary named factories, like rspec let -function buildContextVariables(context) { - var cache = { }; - var callbacks = context.__setup_properties__; - var container = context.container; - var factory = context.factory; - - Ember.keys(callbacks).filter(function(key){ - // ignore the default setup/teardown keys - return key !== 'setup' && key !== 'teardown'; - }).forEach(function(key){ - context[key] = function(options) { - if (cache[key]) { return cache[key]; } - - var result = callbacks[key](options, factory(), container); - cache[key] = result; - return result; - }; - }); -} diff --git a/lib/test-context.js b/lib/test-context.js deleted file mode 100644 index 2e7c3c2e..00000000 --- a/lib/test-context.js +++ /dev/null @@ -1,10 +0,0 @@ -var __test_context__; - -export function set(context) { - __test_context__ = context; -} - -export function get() { - return __test_context__; -} - diff --git a/lib/test-resolver.js b/lib/test-resolver.js deleted file mode 100644 index dc45ecbe..00000000 --- a/lib/test-resolver.js +++ /dev/null @@ -1,11 +0,0 @@ -var __resolver__; - -export function set(resolver) { - __resolver__ = resolver; -} - -export function get() { - if (__resolver__ == null) throw new Error('you must set a resolver with `testResolver.set(resolver)`'); - return __resolver__; -} - diff --git a/package.json b/package.json index 8dc67856..3c6e5cd4 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,24 @@ { "name": "ember-qunit", "version": "0.1.8", - "description": "unit test helpers for ember", - "main": "dist/cjs/main.js", + "description": "QUnit helpers for testing Ember.js applications", + "main": "lib/ember-qunit.js", "scripts": { - "test": "bower install && rm -rf dist && broccoli build dist && karma start --browsers Firefox --single-run" + "test": "rm -rf build && BROCCOLI_ENV=test broccoli build build && testem ci" }, "authors": [ "Stefan Penner", - "Ryan Florence" + "Ryan Florence", + "Robert Jackson", + "Dan Gebhardt" ], "license": "MIT", "devDependencies": { - "broccoli": "^0.12.0", - "broccoli-dist-es6-module": "^0.2.0", - "karma-script-launcher": "~0.1.0", - "karma-chrome-launcher": "~0.1.2", - "karma-firefox-launcher": "~0.1.3", - "karma-html2js-preprocessor": "~0.1.0", - "karma-jasmine": "~0.1.5", - "karma-coffee-preprocessor": "~0.1.3", - "requirejs": "~2.1.11", - "karma-requirejs": "~0.2.1", - "karma-phantomjs-launcher": "~0.1.2", - "karma": "~0.10.9", - "qunitjs": "~1.14.0", - "karma-qunit": "~0.1.1", - "bower": "^1.2.8", - "broccoli-cli": "0.0.1" + "broccoli": "^0.13.0", + "broccoli-concat": "^0.0.11", + "broccoli-es6-concatenator": "^0.1.7", + "broccoli-merge-trees": "^0.1.4", + "broccoli-static-compiler": "^0.1.4", + "testem": "0.6.19" } } diff --git a/test/main.spec.js b/test/main.spec.js deleted file mode 100644 index defc321a..00000000 --- a/test/main.spec.js +++ /dev/null @@ -1,267 +0,0 @@ -emq.globalize(); - -var Post = DS.Model.extend({ - title: DS.attr(), - user: DS.attr(), - comments: DS.hasMany('comment') -}); -var Comment = DS.Model.extend({ - post: DS.belongsTo('post') -}); - -var PrettyColor = Ember.Component.extend({ - classNames: ['pretty-color'], - attributeBindings: ['style'], - style: function(){ - return 'color: ' + this.get('name') + ';'; - }.property('name') -}); - - -var Whazzit = DS.Model.extend({ gear: DS.attr('string') }); -var whazzitCreateRecordCalled = false; -var WhazzitAdapter = DS.FixtureAdapter.extend({ - createRecord: function(){ - whazzitCreateRecordCalled = true; - return this._super.apply(this, arguments); - } -}); - -var ApplicationAdapter = DS.FixtureAdapter.extend(); - -var registry = { - 'component:x-foo': Ember.Component.extend(), - 'component:pretty-color': PrettyColor, - 'template:components/pretty-color': 'Pretty Color: {{name}}'.compile(), - 'route:foo': Ember.Route.extend(), - 'controller:foos': Ember.ArrayController.extend(), - 'controller:hello-world': Ember.ObjectController.extend(), - 'controller:bar': Ember.Controller.extend({ - needs: ['foos', 'helloWorld'] - }), - 'model:post': Post, - 'model:comment': Comment, - 'model:whazzit': Whazzit, - 'adapter:whazzit': WhazzitAdapter, - 'adapter:application': ApplicationAdapter, -}; - -var Resolver = Ember.DefaultResolver.extend({ - resolve: function(fullName) { - return registry[fullName] || this._super.apply(this, arguments); - }, - normalize: function(fullName) { - return Ember.String.dasherize(fullName); - } -}); - -setResolver(Resolver.create()); - -// NOTE: this must be the first test to run because it relies on the -// '#ember-testing' div having not been added to the DOM yet; once added -// it is never removed -moduleFor('component:x-foo', 'moduleFor with empty DOM', {}, function() { - equal(Ember.$('#ember-testing').length, 1, "root element is already in DOM"); -}); - -test("root element is auto-added before moduleFor callback", function() { - expect(1); -}); - - -//moduleForRoute('foo', 'FooRoute'); - -//test('creates route instance', function() { - //expect(1); - //var route = this.subject(); - //ok(route instanceof registry['route:foo']); -//}); - - - -//moduleForController('bar', 'BarController'); - -//test('creates controller instance', function() { - //expect(1); - //var controller = this.subject(); - //ok(controller instanceof registry['controller:bar']); -//}); - -moduleFor('controller:bar', 'moduleFor with bar controller', { - needs: ['controller:foos', 'controller:helloWorld'] -}); - -test('exists', function() { - var bar = this.subject(); - - var foos = bar.get('controllers.foos'); - var helloWorld = bar.get('controllers.helloWorld'); - - ok(bar); - ok(bar instanceof Ember.Controller); - ok(foos instanceof Ember.ArrayController); - ok(helloWorld instanceof Ember.ObjectController); -}); - -test('exists again', function() { - var bar = this.subject(); - - var foos = bar.get('controllers.foos'); - var helloWorld = bar.get('controllers.helloWorld'); - - ok(bar); - ok(bar instanceof Ember.Controller); - ok(foos instanceof Ember.ArrayController); - ok(helloWorld instanceof Ember.ObjectController); -}); - -moduleForModel('whazzit', 'moduleForModel whazzit without adapter'); - -test('store exists', function() { - var store = this.store(); - ok(store instanceof DS.Store); -}); - -test('model exists as subject', function() { - var model = this.subject(); - ok(model); - ok(model instanceof DS.Model); - ok(model instanceof Whazzit); -}); - -test('model is using the FixtureAdapter', function() { - var model = this.subject(), - store = this.store(); - - ok(store.adapterFor(model.constructor) instanceof DS.FixtureAdapter); - ok(!(store.adapterFor(model.constructor) instanceof WhazzitAdapter)); -}); - -moduleForModel('whazzit', 'moduleForModel whazzit with adapter', { - needs: ['adapter:whazzit'], - teardown: function(){ - whazzitCreateRecordCalled = false; - } -}); - -test('model is using the WhazzitAdapter', function() { - var model = this.subject(), - store = this.store(); - - ok(store.adapterFor(model.constructor) instanceof WhazzitAdapter); -}); - -if (DS._setupContainer) { - test('creates the custom adapter', function() { - expect(2); - ok(!whazzitCreateRecordCalled, 'precond - custom adapter is not yet instantiated'); - - var model = this.subject(); - - return Ember.run(function(){ - model.set('gear', '42'); - return model.save().then(function(){ - ok(whazzitCreateRecordCalled, 'uses the custom adapter'); - }); - }); - }); -} else { - test('without DS._setupContainer fails to create the custom adapter', function() { - var thrown = false; - try { - var model = this.subject(); - Ember.run(function(){ - model.set('gear', '42'); - return model.save(); - }); - } catch(e) { - thrown = true; - } - ok(thrown, 'error is thrown without DS._setupContainer'); - }); -} - - -moduleForModel('whazzit', 'moduleForModel whazzit with application adapter', { - needs: ['adapter:application'] -}); - -test('model is using the ApplicationAdapter', function() { - var model = this.subject(), - store = this.store(); - - ok(store.adapterFor(model.constructor) instanceof ApplicationAdapter); - ok(!(store.adapterFor(model.constructor) instanceof WhazzitAdapter)); -}); - -moduleForComponent('x-foo', 'moduleForComponent with x-foo'); - -test('renders', function() { - expect(2); - var component = this.subject(); - equal(component.state, 'preRender'); - this.render(); - equal(component.state, 'inDOM'); -}); - -test('append', function() { - expect(3); - var component = this.subject(); - equal(component.state, 'preRender'); - this.append(); - equal(component.state, 'inDOM'); - ok(Ember.A(Ember.deprecationWarnings).contains('this.append() is deprecated. Please use this.render() instead.')); -}); - -test('yields', function() { - expect(2); - var component = this.subject({ - layout: "yield me".compile() - }); - equal(component.state, 'preRender'); - this.render(); - equal(component.state, 'inDOM'); -}); - -test('can lookup components in its layout', function() { - expect(1); - var component = this.subject({ - layout: "{{x-foo id='yodawg-i-heard-you-liked-x-foo-in-ur-x-foo'}}".compile() - }); - this.render(); - equal(component.state, 'inDOM'); -}); - -test('clears out views from test to test', function() { - expect(1); - var component = this.subject({ - layout: "{{x-foo id='yodawg-i-heard-you-liked-x-foo-in-ur-x-foo'}}".compile() - }); - this.render(); - ok(true, 'rendered without id already being used from another test'); -}); - -moduleForComponent('pretty-color', 'moduleForComponent with pretty-color'); - -test("className", function(){ - // first call to this.$() renders the component. - ok(this.$().is('.pretty-color')); -}); - -test("template", function(){ - var component = this.subject(); - - equal($.trim(this.$().text()), 'Pretty Color:'); - - Ember.run(function(){ - component.set('name', 'green'); - }); - - equal($.trim(this.$().text()), 'Pretty Color: green'); -}); - -test("$", function(){ - var component = this.subject({name: 'green'}); - equal($.trim(this.$('.color-name').text()), 'green'); - equal($.trim(this.$().text()), 'Pretty Color: green'); -}); diff --git a/test/support/setup.js b/test/support/setup.js deleted file mode 100644 index 401359a4..00000000 --- a/test/support/setup.js +++ /dev/null @@ -1,13 +0,0 @@ -Ember.deprecationWarnings = []; - -Ember.deprecate = function(message){ - Ember.deprecationWarnings.push(message); -}; - -String.prototype.compile = function() { - return Ember.Handlebars.compile(this); -}; - -Array.prototype.compile = function() { - return Ember.Handlebars.compile(this.join('\n')); -}; diff --git a/testem.json b/testem.json new file mode 100644 index 00000000..a2bc0b13 --- /dev/null +++ b/testem.json @@ -0,0 +1,11 @@ +{ + "framework": "qunit", + "cwd": "build/", + "serve_files": [ + "assets/vendor.js", + "assets/ember-qunit-tests.amd.js", + "assets/test-support.js" + ], + "launch_in_ci": ["PhantomJS"], + "launch_in_dev": ["PhantomJS", "Chrome"] +} diff --git a/tests/index.html b/tests/index.html new file mode 100644 index 00000000..16e9cd71 --- /dev/null +++ b/tests/index.html @@ -0,0 +1,16 @@ + + + + + Ember-QUnit Tests + + + +
+
+ + + + + + diff --git a/tests/module-for-component-test.js b/tests/module-for-component-test.js new file mode 100644 index 00000000..c4bdfef5 --- /dev/null +++ b/tests/module-for-component-test.js @@ -0,0 +1,104 @@ +import Ember from 'ember'; +import { moduleForComponent, test } from 'ember-qunit'; +import { setResolverRegistry } from 'tests/test-support/resolver'; + +var PrettyColor = Ember.Component.extend({ + classNames: ['pretty-color'], + attributeBindings: ['style'], + style: function(){ + return 'color: ' + this.get('name') + ';'; + }.property('name') +}); + +function setupRegistry() { + setResolverRegistry({ + 'component:x-foo': Ember.Component.extend(), + 'component:pretty-color': PrettyColor, + 'template:components/pretty-color': Ember.Handlebars.compile('Pretty Color: {{name}}') + }); +} + +/////////////////////////////////////////////////////////////////////////////// + +moduleForComponent('x-foo', { + beforeSetup: function() { + setupRegistry(); + } +}); + +test('renders', function() { + expect(2); + var component = this.subject(); + equal(component._state, 'preRender'); + this.render(); + equal(component._state, 'inDOM'); +}); + +test('append', function() { + expect(2); + var component = this.subject(); + equal(component._state, 'preRender'); + this.append(); + equal(component._state, 'inDOM'); + // TODO - is there still a way to check deprecationWarnings? +// ok(Ember.A(Ember.deprecationWarnings).contains('this.append() is deprecated. Please use this.render() instead.')); +}); + +test('yields', function() { + expect(2); + var component = this.subject({ + layout: Ember.Handlebars.compile("yield me") + }); + equal(component._state, 'preRender'); + this.render(); + equal(component._state, 'inDOM'); +}); + +test('can lookup components in its layout', function() { + expect(1); + var component = this.subject({ + layout: Ember.Handlebars.compile("{{x-foo id='yodawg-i-heard-you-liked-x-foo-in-ur-x-foo'}}") + }); + this.render(); + equal(component._state, 'inDOM'); +}); + +test('clears out views from test to test', function() { + expect(1); + this.subject({ + layout: Ember.Handlebars.compile("{{x-foo id='yodawg-i-heard-you-liked-x-foo-in-ur-x-foo'}}") + }); + this.render(); + ok(true, 'rendered without id already being used from another test'); +}); + +/////////////////////////////////////////////////////////////////////////////// + +moduleForComponent('pretty-color', { + beforeSetup: function() { + setupRegistry(); + } +}); + +test("className", function(){ + // first call to this.$() renders the component. + ok(this.$().is('.pretty-color')); +}); + +test("template", function(){ + var component = this.subject(); + + equal($.trim(this.$().text()), 'Pretty Color:'); + + Ember.run(function(){ + component.set('name', 'green'); + }); + + equal($.trim(this.$().text()), 'Pretty Color: green'); +}); + +test("$", function(){ + var component = this.subject({name: 'green'}); + equal($.trim(this.$('.color-name').text()), 'green'); + equal($.trim(this.$().text()), 'Pretty Color: green'); +}); diff --git a/tests/module-for-model-test.js b/tests/module-for-model-test.js new file mode 100644 index 00000000..7cc8198f --- /dev/null +++ b/tests/module-for-model-test.js @@ -0,0 +1,111 @@ +import Ember from 'ember'; +import { moduleForModel, test } from 'ember-qunit'; +import { setResolverRegistry } from 'tests/test-support/resolver'; + +var Whazzit = DS.Model.extend({ gear: DS.attr('string') }); +var whazzitAdapterFindAllCalled = false; +var WhazzitAdapter = DS.FixtureAdapter.extend({ + findAll: function(store, type) { + whazzitAdapterFindAllCalled = true; + return this._super.apply(this, arguments); + } +}); + +var ApplicationAdapter = DS.FixtureAdapter.extend(); + +function setupRegistry() { + setResolverRegistry({ + 'model:whazzit': Whazzit, + 'adapter:whazzit': WhazzitAdapter, + 'adapter:application': ApplicationAdapter + }); +} + +/////////////////////////////////////////////////////////////////////////////// + +moduleForModel('whazzit', 'model:whazzit without adapter', { + beforeSetup: function() { + setupRegistry(); + }, + + setup: function() { + Whazzit.FIXTURES = []; + } +}); + +test('store exists', function() { + var store = this.store(); + ok(store instanceof DS.Store); +}); + +test('model exists as subject', function() { + var model = this.subject(); + ok(model); + ok(model instanceof DS.Model); + ok(model instanceof Whazzit); +}); + +test('FixtureAdapter is registered for model', function() { + var model = this.subject(), + store = this.store(); + + ok(store.adapterFor(model.constructor) instanceof DS.FixtureAdapter); + ok(!(store.adapterFor(model.constructor) instanceof WhazzitAdapter)); +}); + +/////////////////////////////////////////////////////////////////////////////// + +moduleForModel('whazzit', 'model:whazzit with custom adapter', { + needs: ['adapter:whazzit'], + + beforeSetup: function() { + setupRegistry(); + }, + + setup: function() { + Whazzit.FIXTURES = []; + whazzitAdapterFindAllCalled = false; + } +}); + +test('WhazzitAdapter is registered for model', function() { + var model = this.subject(), + store = this.store(); + + ok(store.adapterFor(model.constructor) instanceof WhazzitAdapter); +}); + +test('WhazzitAdapter is used for `find`', function() { + expect(2); + ok(!whazzitAdapterFindAllCalled, 'precond - custom adapter has not yet been called'); + + var store = this.store(); + + return Ember.run(function() { + return store.find('whazzit').then(function() { + ok(whazzitAdapterFindAllCalled, 'uses the custom adapter'); + }); + }); +}); + +/////////////////////////////////////////////////////////////////////////////// + +moduleForModel('whazzit', 'model:whazzit with application adapter', { + needs: ['adapter:application'], + + beforeSetup: function() { + setupRegistry(); + }, + + setup: function() { + Whazzit.FIXTURES = []; + } +}); + +test('ApplicationAdapter is registered for model', function() { + var model = this.subject(), + store = this.store(); + + ok(store.adapterFor(model.constructor) instanceof ApplicationAdapter); + ok(!(store.adapterFor(model.constructor) instanceof WhazzitAdapter)); +}); \ No newline at end of file diff --git a/tests/module-for-test.js b/tests/module-for-test.js new file mode 100644 index 00000000..e7232017 --- /dev/null +++ b/tests/module-for-test.js @@ -0,0 +1,53 @@ +import { moduleFor, test } from 'ember-qunit'; +import { setResolverRegistry } from 'tests/test-support/resolver'; + +function setupRegistry() { + setResolverRegistry({ + 'component:x-foo': Ember.Component.extend() + }); +} + +var a = 0; +var b = 0; +var beforeSetupOk = false; +var beforeTeardownOk = false; + +moduleFor('component:x-foo', 'TestModule callbacks', { + beforeSetup: function() { + setupRegistry(); + + beforeSetupOk = (a === 0); + b += 1; + }, + + setup: function() { + a += 1; + }, + + beforeTeardown: function() { + beforeTeardownOk = (a === 1); + b -= 1; + }, + + teardown: function() { + a -= 1; + } +}); + +test("beforeSetup callback is called prior to any test setup", function() { + ok(beforeSetupOk); + equal(b, 1); +}); + +test("setup callback is called prior to test", function() { + equal(a, 1); +}); + +test("teardown callback is called after test", function() { + equal(a, 1); +}); + +test("beforeTeardown callback is called prior to any test teardown", function() { + ok(beforeTeardownOk); + equal(b, 1); +}); diff --git a/tests/test-support/resolver.js b/tests/test-support/resolver.js new file mode 100644 index 00000000..45416f89 --- /dev/null +++ b/tests/test-support/resolver.js @@ -0,0 +1,20 @@ +import { setResolver } from 'ember-test-helpers'; + +var Resolver = Ember.DefaultResolver.extend({ + registry: null, + + resolve: function(fullName) { + return this.registry[fullName] || this._super.apply(this, arguments); + }, + + normalize: function(fullName) { + return Ember.String.dasherize(fullName); + } +}); + +var resolver = Resolver.create({registry: {}}); +setResolver(resolver); + +export function setResolverRegistry(registry) { + resolver.set('registry', registry); +}