diff --git a/app/assets/javascripts/discourse/components/post-menu.js.es6 b/app/assets/javascripts/discourse/components/post-menu.js.es6 index d50a6f3610e..68346372eba 100644 --- a/app/assets/javascripts/discourse/components/post-menu.js.es6 +++ b/app/assets/javascripts/discourse/components/post-menu.js.es6 @@ -103,7 +103,7 @@ const PostMenuComponent = Ember.Component.extend(StringBuffer, { const replyCount = post.get('reply_count'); buffer.push(""); diff --git a/app/assets/javascripts/discourse/models/topic.js.es6 b/app/assets/javascripts/discourse/models/topic.js.es6 index 486129f4f9f..2481f2574b8 100644 --- a/app/assets/javascripts/discourse/models/topic.js.es6 +++ b/app/assets/javascripts/discourse/models/topic.js.es6 @@ -70,7 +70,7 @@ const Topic = RestModel.extend({ }.property('url'), url: function() { - let slug = this.get('slug'); + let slug = this.get('slug') || ''; if (slug.trim().length === 0) { slug = "topic"; } diff --git a/test/javascripts/components/ace-editor-test.js.es6 b/test/javascripts/components/ace-editor-test.js.es6 index 7aff365e53e..58dedbb19fe 100644 --- a/test/javascripts/components/ace-editor-test.js.es6 +++ b/test/javascripts/components/ace-editor-test.js.es6 @@ -1,19 +1,17 @@ +import componentTest from 'helpers/component-test'; + moduleForComponent('ace-editor', {integration: true}); -test('css editor', function(assert) { - andThen(() => { - this.render('{{ace-editor mode="css"}}'); - }); - andThen(() => { +componentTest('css editor', { + template: '{{ace-editor mode="css"}}', + test(assert) { assert.ok(this.$('.ace_editor').length, 'it renders the ace editor'); - }); + } }); -test('html editor', function(assert) { - andThen(() => { - this.render('{{ace-editor mode="html"}}'); - }); - andThen(() => { +componentTest('html editor', { + template: '{{ace-editor mode="html"}}', + test(assert) { assert.ok(this.$('.ace_editor').length, 'it renders the ace editor'); - }); + } }); diff --git a/test/javascripts/components/post-menu-test.js.es6 b/test/javascripts/components/post-menu-test.js.es6 new file mode 100644 index 00000000000..aef7c4b1a38 --- /dev/null +++ b/test/javascripts/components/post-menu-test.js.es6 @@ -0,0 +1,14 @@ +import componentTest from 'helpers/component-test'; + +moduleForComponent('post-menu', {integration: true}); + +componentTest('render buttons', { + template: "{{post-menu post=post}}", + setup(store) { + const topic = store.createRecord('topic', {id: 123}); + this.set('post', store.createRecord('post', {id: 1, post_number: 1, topic})); + }, + test(assert) { + assert.ok(this.$('.post-menu-area').length, 'it renders a post menu'); + } +}); diff --git a/test/javascripts/components/value-list-test.js.es6 b/test/javascripts/components/value-list-test.js.es6 index db8767471b4..df838f95421 100644 --- a/test/javascripts/components/value-list-test.js.es6 +++ b/test/javascripts/components/value-list-test.js.es6 @@ -1,31 +1,30 @@ +import componentTest from 'helpers/component-test'; moduleForComponent('value-list', {integration: true}); -test('functionality', function(assert) { - andThen(() => { - this.render('{{value-list value=values}}'); - }); +componentTest('functionality', { + template: '{{value-list value=values}}', + test: function(assert) { + andThen(() => { + assert.ok(this.$('.values .value').length === 0, 'it has no values'); + assert.ok(this.$('input').length, 'it renders the input'); + assert.ok(this.$('.btn-primary[disabled]').length, 'it is disabled with no value'); + }); - andThen(() => { - assert.ok(this.$('.values .value').length === 0, 'it has no values'); - assert.ok(this.$('input').length, 'it renders the input'); - assert.ok(this.$('.btn-primary[disabled]').length, 'it is disabled with no value'); - }); + fillIn('input', 'eviltrout'); + andThen(() => { + assert.ok(!this.$('.btn-primary[disabled]').length, "it isn't disabled anymore"); + }); - fillIn('input', 'eviltrout'); - andThen(() => { - assert.ok(!this.$('.btn-primary[disabled]').length, "it isn't disabled anymore"); - }); - - click('.btn-primary'); - andThen(() => { - assert.ok(this.$('.values .value').length === 1, 'it adds the value'); - assert.ok(this.$('input').val() === '', 'it clears the input'); - assert.ok(this.$('.btn-primary[disabled]').length, "it is disabled again"); - }); - - click('.value .btn-small'); - andThen(() => { - assert.ok(this.$('.values .value').length === 0, 'it removes the value'); - }); + click('.btn-primary'); + andThen(() => { + assert.ok(this.$('.values .value').length === 1, 'it adds the value'); + assert.ok(this.$('input').val() === '', 'it clears the input'); + assert.ok(this.$('.btn-primary[disabled]').length, "it is disabled again"); + }); + click('.value .btn-small'); + andThen(() => { + assert.ok(this.$('.values .value').length === 0, 'it removes the value'); + }); + } }); diff --git a/test/javascripts/helpers/component-test.js.es6 b/test/javascripts/helpers/component-test.js.es6 new file mode 100644 index 00000000000..f6cb5c248f8 --- /dev/null +++ b/test/javascripts/helpers/component-test.js.es6 @@ -0,0 +1,22 @@ +import createStore from 'helpers/create-store'; + +export default function(name, opts) { + opts = opts || {}; + + test(name, function(assert) { + if (opts.setup) { + const store = createStore(); + opts.setup.call(this, store); + } + this.container.register('site-settings:main', Discourse.SiteSettings, { instantiate: false }); + this.container.injection('component', 'siteSettings', 'site-settings:main'); + + andThen(() => { + this.render(opts.template); + }); + + andThen(() => { + opts.test.call(this, assert); + }); + }); +} diff --git a/vendor/assets/javascripts/ember-qunit.js b/vendor/assets/javascripts/ember-qunit.js index b09e6a02233..c3717ef55bf 100644 --- a/vendor/assets/javascripts/ember-qunit.js +++ b/vendor/assets/javascripts/ember-qunit.js @@ -229,15 +229,10 @@ define('ember-qunit/test', ['exports', 'ember', 'ember-test-helpers', 'qunit'], 'use strict'; - function resetViews() { - Ember['default'].View.views = {}; - } - function test(testName, callback) { function wrapper(assert) { var context = ember_test_helpers.getContext(); - resetViews(); var result = callback.call(context, assert); function failTestOnPromiseRejection(reason) { @@ -261,13 +256,12 @@ define('ember-qunit/test', ['exports', 'ember', 'ember-test-helpers', 'qunit'], exports['default'] = test; }); -define('ember-test-helpers', ['exports', 'ember', 'ember-test-helpers/isolated-container', 'ember-test-helpers/test-module', 'ember-test-helpers/test-module-for-component', 'ember-test-helpers/test-module-for-model', 'ember-test-helpers/test-context', 'ember-test-helpers/test-resolver'], function (exports, Ember, isolated_container, TestModule, TestModuleForComponent, TestModuleForModel, test_context, test_resolver) { +define('ember-test-helpers', ['exports', 'ember', 'ember-test-helpers/test-module', 'ember-test-helpers/test-module-for-component', 'ember-test-helpers/test-module-for-model', 'ember-test-helpers/test-context', 'ember-test-helpers/test-resolver'], function (exports, Ember, TestModule, TestModuleForComponent, TestModuleForModel, test_context, test_resolver) { 'use strict'; Ember['default'].testing = true; - exports.isolatedContainer = isolated_container.isolatedContainer; exports.TestModule = TestModule['default']; exports.TestModuleForComponent = TestModuleForComponent['default']; exports.TestModuleForModel = TestModuleForModel['default']; @@ -276,13 +270,10 @@ define('ember-test-helpers', ['exports', 'ember', 'ember-test-helpers/isolated-c exports.setResolver = test_resolver.setResolver; }); -define('ember-test-helpers/isolated-container', ['exports', 'ember-test-helpers/test-resolver', 'ember'], function (exports, test_resolver, Ember) { +define('ember-test-helpers/build-registry', ['exports'], function (exports) { 'use strict'; - exports.isolatedRegistry = isolatedRegistry; - exports.isolatedContainer = isolatedContainer; - function exposeRegistryMethodsWithoutDeprecations(container) { var methods = [ 'register', @@ -309,86 +300,63 @@ define('ember-test-helpers/isolated-container', ['exports', 'ember-test-helpers/ } } - function isolatedRegistry(fullNames) { - var resolver = test_resolver.getResolver(); - var container; - var registry; + exports['default'] = function(resolver) { + var registry, container; + var namespace = Ember.Object.create({ + Resolver: { create: function() { return resolver; } } + }); - var normalize = function(fullName) { - return resolver.normalize(fullName); - }; + function register(name, factory) { + var thingToRegisterWith = registry || container; - if (Ember['default'].Registry) { - registry = new Ember['default'].Registry(); - registry.normalizeFullName = normalize; - - container = registry.container(); - exposeRegistryMethodsWithoutDeprecations(container); - - } else { - container = new Ember['default'].Container(); - - //normalizeFullName only exists since Ember 1.9 - if (Ember['default'].typeOf(container.normalizeFullName) === 'function') { - container.normalizeFullName = normalize; - } else { - container.normalize = normalize; + if (!container.lookupFactory(name)) { + thingToRegisterWith.register(name, factory); } } - 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['default'].ComponentLookup); - container.register('controller:basic', Ember['default'].Controller, { instantiate: false }); - container.register('controller:object', Ember['default'].ObjectController, { instantiate: false }); - container.register('controller:array', Ember['default'].ArrayController, { instantiate: false }); - container.register('view:default', Ember['default']._MetamorphView); - container.register('view:toplevel', Ember['default'].View.extend()); - container.register('view:select', Ember['default'].Select); - container.register('route:basic', Ember['default'].Route, { instantiate: false }); + if (Ember.Application.buildRegistry) { + registry = Ember.Application.buildRegistry(namespace); + registry.register('component-lookup:main', Ember.ComponentLookup); - // added in Glimmer - container.register('component:-link-to', Ember['default'].LinkView); - container.register('component:-text-field', Ember['default'].TextField); - container.register('component:-text-area', Ember['default'].TextArea); - container.register('component:-checkbox', Ember['default'].Checkbox); - - if (Ember['default']._LegacyEachView) { - container.register('view:-legacy-each', Ember['default']._LegacyEachView); + registry = registry; + container = registry.container(); + exposeRegistryMethodsWithoutDeprecations(container); + } else { + container = Ember.Application.buildContainer(namespace); + container.register('component-lookup:main', Ember.ComponentLookup); } + // Ember 1.10.0 did not properly add `view:toplevel` or `view:default` + // to the registry in Ember.Application.buildRegistry :( + register('view:toplevel', Ember.View.extend()); + register('view:default', Ember._MetamorphView); + var globalContext = typeof global === 'object' && global || self; if (globalContext.DS) { var DS = globalContext.DS; if (DS._setupContainer) { - DS._setupContainer(container); + DS._setupContainer(registry || container); } else { - container.register('transform:boolean', DS.BooleanTransform); - container.register('transform:date', DS.DateTransform); - container.register('transform:number', DS.NumberTransform); - container.register('transform:string', DS.StringTransform); - container.register('serializer:-default', DS.JSONSerializer); - container.register('serializer:-rest', DS.RESTSerializer); - container.register('adapter:-rest', DS.RESTAdapter); + register('transform:boolean', DS.BooleanTransform); + register('transform:date', DS.DateTransform); + register('transform:number', DS.NumberTransform); + register('transform:string', DS.StringTransform); + register('serializer:-default', DS.JSONSerializer); + register('serializer:-rest', DS.RESTSerializer); + register('adapter:-rest', DS.RESTAdapter); } } - 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: container, - registry: registry + registry: registry, + container: container }; } - function isolatedContainer(fullNames) { - return isolatedRegistry(fullNames).container; - } +}); +define('ember-test-helpers/isolated-container', function () { + + 'use strict'; }); define('ember-test-helpers/test-context', ['exports'], function (exports) { @@ -417,8 +385,10 @@ define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-h init: function(componentName, description, callbacks) { // Allow `description` to be omitted if (!callbacks && typeof description === 'object') { - callbacks = description || {}; + callbacks = description; description = null; + } else if (!callbacks) { + callbacks = {}; } this.componentName = componentName; @@ -500,7 +470,7 @@ define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-h }, setupComponentIntegrationTest: function() { - var self = this; + var module = this; var context = this.context; context.dispatcher = Ember['default'].EventDispatcher.create(); context.dispatcher.setup({}, '#ember-testing'); @@ -516,19 +486,20 @@ define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-h if (typeof template === 'string') { template = Ember['default'].Handlebars.compile(template); } - self.component = Ember['default'].View.create({ - context: context, - controller: self, - template: template, - container: self.container + module.component = Ember['default'].Component.create({ + layout: template, + container: module.container }); + module.component.set('context' ,context); + module.component.set('controller', module); + Ember['default'].run(function() { - self.component.appendTo('#ember-testing'); + module.component.appendTo('#ember-testing'); }); }; context.$ = function() { - return self.component.$.apply(self.component, arguments); + return module.component.$.apply(module.component, arguments); }; context.set = function(key, value) { @@ -542,7 +513,7 @@ define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-h }; context.on = function(actionName, handler) { - self.actionHooks[actionName] = handler; + module.actionHooks[actionName] = handler; }; }, @@ -602,8 +573,8 @@ define('ember-test-helpers/test-module-for-model', ['exports', 'ember-test-helpe callbacks.store = function(){ var container = this.container; - - return container.lookup('store:main'); + var store = container.lookup('service:store') || container.lookup('store:main'); + return store; }; if (callbacks.subject === defaultSubject) { @@ -611,7 +582,8 @@ define('ember-test-helpers/test-module-for-model', ['exports', 'ember-test-helpe var container = this.container; return Ember['default'].run(function() { - return container.lookup('store:main').createRecord(modelName, options); + var store = container.lookup('service:store') || container.lookup('store:main'); + return store.createRecord(modelName, options); }); }; } @@ -619,7 +591,7 @@ define('ember-test-helpers/test-module-for-model', ['exports', 'ember-test-helpe }); }); -define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helpers/isolated-container', 'ember-test-helpers/test-context', 'klassy', 'ember-test-helpers/test-resolver'], function (exports, Ember, isolated_container, test_context, klassy, test_resolver) { +define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helpers/test-context', 'klassy', 'ember-test-helpers/test-resolver', 'ember-test-helpers/build-registry'], function (exports, Ember, test_context, klassy, test_resolver, buildRegistry) { 'use strict'; @@ -638,7 +610,7 @@ define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helper this.callbacks = callbacks || {}; if (this.callbacks.integration) { - this.isIntegration = callbacks.integration; + this.isIntegration = callbacks.integration; delete callbacks.integration; } @@ -655,7 +627,7 @@ define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helper initNeeds: function() { this.needs = [this.subjectName]; if (this.callbacks.needs) { - this.needs = this.needs.concat(this.callbacks.needs) + this.needs = this.needs.concat(this.callbacks.needs); delete this.callbacks.needs; } }, @@ -726,7 +698,10 @@ define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helper function nextStep() { var step = steps.shift(); if (step) { - return Ember['default'].RSVP.resolve(step.call(context)).then(nextStep); + // guard against exceptions, for example missing components referenced from needs. + return new Ember['default'].RSVP.Promise(function(ok) { + ok(step.call(context)); + }).then(nextStep); } else { return Ember['default'].RSVP.resolve(); } @@ -811,7 +786,7 @@ define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helper this.cache = this.cache || {}; this.cachedCalls = this.cachedCalls || {}; - var keys = Ember['default'].keys(callbacks); + var keys = (Object.keys || Ember['default'].keys)(callbacks); for (var i = 0, l = keys.length; i < l; i++) { (function(key) { @@ -831,29 +806,36 @@ define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helper } }, + _setupContainer: function() { + var resolver = test_resolver.getResolver(); + var items = buildRegistry['default'](resolver); + + this.container = items.container; + this.registry = items.registry; + + var thingToRegisterWith = this.registry || this.container; + var router = resolver.resolve('router:main'); + router = router || Ember['default'].Router.extend(); + thingToRegisterWith.register('router:main', router); + }, _setupIsolatedContainer: function() { - var isolated = isolated_container.isolatedRegistry(this.needs); - this.container = isolated.container; - this.registry = isolated.registry; + var resolver = test_resolver.getResolver(); + this._setupContainer(); + + var thingToRegisterWith = this.registry || this.container; + + for (var i = this.needs.length; i > 0; i--) { + var fullName = this.needs[i - 1]; + var normalizedFullName = resolver.normalize(fullName); + thingToRegisterWith.register(fullName, resolver.resolve(normalizedFullName)); + } + + thingToRegisterWith.resolver = function() { }; }, _setupIntegratedContainer: function() { - var resolver = test_resolver.getResolver(); - var namespace = Ember['default'].Object.create({ - Resolver: { create: function() { return resolver; } } - }); - - if (Ember['default'].Application.buildRegistry) { - var registry; - registry = Ember['default'].Application.buildRegistry(namespace); - registry.register('component-lookup:main', Ember['default'].ComponentLookup); - this.registry = registry; - this.container = registry.container(); - } else { - this.container = Ember['default'].Application.buildContainer(namespace); - this.container.register('component-lookup:main', Ember['default'].ComponentLookup); - } + this._setupContainer(); } }); @@ -1061,3 +1043,4 @@ window.test = emberQunit.test; window.setResolver = emberQunit.setResolver; })(); +//# sourceMappingURL=ember-qunit.map \ No newline at end of file