mirror of
https://github.com/discourse/discourse.git
synced 2024-11-23 03:54:59 +08:00
Upgrade ember qunit, create new interface for testing components
This commit is contained in:
parent
1397507d05
commit
7a58d64f37
|
@ -103,7 +103,7 @@ const PostMenuComponent = Ember.Component.extend(StringBuffer, {
|
|||
|
||||
const replyCount = post.get('reply_count');
|
||||
buffer.push("<button class='show-replies highlight-action' data-action='replies'>");
|
||||
buffer.push(I18n.t("post.has_replies", { count: replyCount }));
|
||||
buffer.push(I18n.t("post.has_replies", { count: replyCount || 0 }));
|
||||
|
||||
const icon = (this.get('post.replies.length') > 0) ? 'chevron-up' : 'chevron-down';
|
||||
return buffer.push(iconHTML(icon) + "</button>");
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
|
@ -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');
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
14
test/javascripts/components/post-menu-test.js.es6
Normal file
14
test/javascripts/components/post-menu-test.js.es6
Normal file
|
@ -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');
|
||||
}
|
||||
});
|
|
@ -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');
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
22
test/javascripts/helpers/component-test.js.es6
Normal file
22
test/javascripts/helpers/component-test.js.es6
Normal file
|
@ -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);
|
||||
});
|
||||
});
|
||||
}
|
197
vendor/assets/javascripts/ember-qunit.js
vendored
197
vendor/assets/javascripts/ember-qunit.js
vendored
|
@ -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
|
Loading…
Reference in New Issue
Block a user