From 6b392d850dfccfef46db581677f05f86898fda84 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Sun, 8 Mar 2015 08:05:47 -0400 Subject: [PATCH] Starting to add tests - Created moduleForView test helper to allow testing views --- Brocfile.js | 22 ++++++- addon/helper.js | 12 ++++ app/initializers/list-view-helper.js | 16 +---- bower.json | 7 ++- index.js | 48 ++++++++++++++- .../app/routes/multi-height-multi-view.js | 2 +- .../dummy/app/routes/multi-height-virtual.js | 2 +- tests/dummy/app/routes/multi-height.js | 2 +- tests/dummy/app/views/test.js | 3 + tests/helpers/generate-content.js | 9 +++ tests/helpers/module-for-view.js | 58 +++++++++++++++++++ tests/unit/content-test.js | 40 +++++++++++++ 12 files changed, 201 insertions(+), 20 deletions(-) create mode 100644 tests/dummy/app/views/test.js create mode 100644 tests/helpers/generate-content.js create mode 100644 tests/helpers/module-for-view.js create mode 100644 tests/unit/content-test.js diff --git a/Brocfile.js b/Brocfile.js index 7bae6f3..e5640f4 100644 --- a/Brocfile.js +++ b/Brocfile.js @@ -1,6 +1,5 @@ /* jshint node: true */ /* global require, module */ - var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); var app = new EmberAddon(); @@ -18,7 +17,28 @@ var app = new EmberAddon(); // please specify an object with the list of modules as keys // along with the exports of each module as its value. +app.import('bower_components/ember-template-compiler/index.js'); app.import('vendor/zynga-scroller/Animate.js'); app.import('vendor/zynga-scroller/Scroller.js'); +app.import('vendor/ember-test-helpers.amd.js', { + exports: { + 'ember-test-helpers': [ + 'isolatedContainer', + 'TestModule', + 'TestModuleForComponent', + 'TestModuleForModel', + 'getContext', + 'setContext', + 'setResolver' + ] + } +}); +app.import('vendor/ember-qunit-module.amd.js', { + exports: { + 'ember-qunit-module': [ + 'createModule' + ] + } +}); module.exports = app.toTree(); diff --git a/addon/helper.js b/addon/helper.js index 9db5bb3..371efef 100644 --- a/addon/helper.js +++ b/addon/helper.js @@ -5,6 +5,18 @@ import EmberVirtualListView from './virtual_list_view'; export var EmberVirtualList = createHelper(EmberVirtualListView); export var EmberList = createHelper(EmberListView); +export function register() { + var registerHelper; + if (Ember.HTMLBars) { + // registerHelper was used for some 1.10-beta's and _registerHelper is for 1.10.0 final. + registerHelper = Ember.HTMLBars._registerHelper || Ember.HTMLBars.registerHelper; + } else { + registerHelper = Ember.Handlebars.registerHelper; + } + registerHelper('ember-list', EmberList); + registerHelper('ember-virtual-list', EmberVirtualList); +} + function createHelper(view) { if (Ember.HTMLBars) { return { diff --git a/app/initializers/list-view-helper.js b/app/initializers/list-view-helper.js index fcd0acc..ce87480 100644 --- a/app/initializers/list-view-helper.js +++ b/app/initializers/list-view-helper.js @@ -1,19 +1,9 @@ import Ember from 'ember'; -import {EmberList, EmberVirtualList} from 'list-view/helper'; +import {register} from 'list-view/helper'; -export function initialize() { - var registerHelper; - if (Ember.HTMLBars) { - // registerHelper was used for some 1.10-beta's and _registerHelper is for 1.10.0 final. - registerHelper = Ember.HTMLBars._registerHelper || Ember.HTMLBars.registerHelper; - } else { - registerHelper = Ember.Handlebars.registerHelper; - } - registerHelper('ember-list', EmberList); - registerHelper('ember-virtual-list', EmberVirtualList); -} +export var initialize = register; export default { name: 'list-view-helper', - initialize: initialize + initialize: register }; diff --git a/bower.json b/bower.json index 6d95b59..2da6d82 100644 --- a/bower.json +++ b/bower.json @@ -10,7 +10,10 @@ "ember-cli-test-loader": "ember-cli-test-loader#0.1.3", "ember-load-initializers": "ember-cli/ember-load-initializers#0.0.2", "ember-qunit": "0.2.8", + "ember-qunit-source": "https://github.com/rwjblue/ember-qunit.git#9b8614cac1ac68c3b2f1ffb1dcd4e998fd636e2f", "ember-qunit-notifications": "0.0.7", - "qunit": "~1.17.1" + "qunit": "~1.17.1", + "ember-test-helpers": "~0.3.4", + "ember-template-compiler": "http://builds.emberjs.com/tags/v1.10.0/ember-template-compiler.js" } -} \ No newline at end of file +} diff --git a/index.js b/index.js index 603f834..3468a6c 100644 --- a/index.js +++ b/index.js @@ -2,5 +2,51 @@ 'use strict'; module.exports = { - name: 'list-view' + name: 'list-view', + treeForVendor: function() { + + var klassy = new this.Funnel('bower_components', { + srcDir: '/klassy/lib', + files: ['klassy.js'], + destDir: '/' + }); + + var emberTestHelpers = new this.Funnel('bower_components', { + srcDir: '/ember-test-helpers/lib', + include: [/.js$/], + destDir: '/' + }); + + var es6EmberTestHelpers = new this.transpileModules(this.mergeTrees([klassy, emberTestHelpers]), { + esperantoOptions: { + _evilES3SafeReExports: true, + strict: true + } + }); + + var emberTestHelpersAMD = this.concatFiles(es6EmberTestHelpers, { + inputFiles: ['**/*.js'], + outputFile: '/ember-test-helpers.amd.js' + }); + + var qunitModule = new this.Funnel('bower_components', { + srcDir: '/ember-qunit-source/lib/ember-qunit', + include: [/qunit-module.js$/], + destDir: '/' + }); + + var es6QunitModule = new this.transpileModules(this.mergeTrees([klassy, qunitModule]), { + esperantoOptions: { + _evilES3SafeReExports: true, + strict: true + } + }); + + var qunitModuleAMD = this.concatFiles(es6QunitModule, { + inputFiles: ['**/*.js'], + outputFile: '/ember-qunit-module.amd.js' + }); + + return this.mergeTrees(['vendor', emberTestHelpersAMD, qunitModuleAMD]); + } }; diff --git a/tests/dummy/app/routes/multi-height-multi-view.js b/tests/dummy/app/routes/multi-height-multi-view.js index 39f5c8d..e30fb56 100644 --- a/tests/dummy/app/routes/multi-height-multi-view.js +++ b/tests/dummy/app/routes/multi-height-multi-view.js @@ -3,6 +3,6 @@ import {types} from '../utils/fixtures'; export default Ember.Route.extend({ model: function() { - return types + return types; } }); diff --git a/tests/dummy/app/routes/multi-height-virtual.js b/tests/dummy/app/routes/multi-height-virtual.js index 39f5c8d..e30fb56 100644 --- a/tests/dummy/app/routes/multi-height-virtual.js +++ b/tests/dummy/app/routes/multi-height-virtual.js @@ -3,6 +3,6 @@ import {types} from '../utils/fixtures'; export default Ember.Route.extend({ model: function() { - return types + return types; } }); diff --git a/tests/dummy/app/routes/multi-height.js b/tests/dummy/app/routes/multi-height.js index 39f5c8d..e30fb56 100644 --- a/tests/dummy/app/routes/multi-height.js +++ b/tests/dummy/app/routes/multi-height.js @@ -3,6 +3,6 @@ import {types} from '../utils/fixtures'; export default Ember.Route.extend({ model: function() { - return types + return types; } }); diff --git a/tests/dummy/app/views/test.js b/tests/dummy/app/views/test.js new file mode 100644 index 0000000..8712a88 --- /dev/null +++ b/tests/dummy/app/views/test.js @@ -0,0 +1,3 @@ +import Ember from 'ember'; + +export default Ember.View.extend(); diff --git a/tests/helpers/generate-content.js b/tests/helpers/generate-content.js new file mode 100644 index 0000000..31860fd --- /dev/null +++ b/tests/helpers/generate-content.js @@ -0,0 +1,9 @@ +import Ember from 'ember'; + +export default function generateContent(n) { + var content = Ember.A(); + for (var i = 0; i < n; i++) { + content.push({name: "Item " + (i+1)}); + } + return content; +} diff --git a/tests/helpers/module-for-view.js b/tests/helpers/module-for-view.js new file mode 100644 index 0000000..be5b7ce --- /dev/null +++ b/tests/helpers/module-for-view.js @@ -0,0 +1,58 @@ +import Ember from 'ember'; +import TestModule from 'ember-test-helpers/test-module'; +import { getResolver } from 'ember-test-helpers/test-resolver'; +import { createModule } from 'qunit-module'; + +var TestModuleForView = TestModule.extend({ + init: function(viewName, description, callbacks) { + this.viewName = viewName; + this._super.call(this, 'view:' + viewName, description, callbacks); + this.setupSteps.push(this.setupView); + }, + setupView: function() { + var _this = this; + var resolver = getResolver(); + var container = this.container; + var context = this.context; + var templateName = 'template:' + this.viewName; + var template = resolver.resolve(templateName); + if (template) { + container.register(templateName, template); + container.injection(this.subjectName, 'template', templateName); + } + context.dispatcher = Ember.EventDispatcher.create(); + context.dispatcher.setup({}, '#ember-testing'); + this.callbacks.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; + }); + _this.teardownSteps.unshift(function() { + Ember.run(function() { + Ember.tryInvoke(containerView, 'destroy'); + }); + }); + return view.$(); + }; + this.callbacks.append = function() { + Ember.deprecate('this.append() is deprecated. Please use this.render() instead.'); + return this.callbacks.render(); + }; + context.$ = function() { + var $view = this.render(); + var subject = this.subject(); + if (arguments.length){ + return subject.$.apply(subject, arguments); + } else { + return $view; + } + }; + } +}); + +export default function moduleForView(name, description, callbacks) { + createModule(TestModuleForView, name, description, callbacks); +} diff --git a/tests/unit/content-test.js b/tests/unit/content-test.js new file mode 100644 index 0000000..40dcd7f --- /dev/null +++ b/tests/unit/content-test.js @@ -0,0 +1,40 @@ +import Ember from 'ember'; +import { test } from 'ember-qunit'; +import moduleForView from '../helpers/module-for-view'; +import generateContent from '../helpers/generate-content'; +import {register} from 'list-view/helper'; + +var compile = Ember.Handlebars.compile; + +moduleForView('test', 'list-view integration - content', { + setup: function() { + register(); + } +}); + +test('the ember-list helper', function(assert){ + var view = this.subject({ + controller: { + model: generateContent(100) + }, + template: compile(`{{#ember-list items=model height=500 row-height=50}}{{name}}{{/ember-list}}`) + }); + + this.render(); + + assert.equal(this.$('.ember-list-item-view').length, 11, "The rendered list was updated"); + assert.equal(this.$('.ember-list-container').height(), 5000, "The scrollable view has the correct height"); +}); + +test("the ember-list helper uses items=", function(assert) { + + var view = this.subject({ + controller: { itemz: generateContent(100) }, + template: compile("{{#ember-list items=itemz height=500 rowHeight=50}}{{name}}{{/ember-list}}") + }); + + this.render(); + + assert.equal(this.$('.ember-list-item-view').length, 11, "The rendered list was updated"); + assert.equal(this.$('.ember-list-container').height(), 5000, "The scrollable view has the correct height"); +});