Skip to content

Commit

Permalink
Add support for Ember < 1.11.
Browse files Browse the repository at this point in the history
  • Loading branch information
rwjblue committed Jun 5, 2016
1 parent 3131864 commit 696da08
Show file tree
Hide file tree
Showing 2 changed files with 183 additions and 86 deletions.
90 changes: 90 additions & 0 deletions lib/ember-test-helpers/-legacy-overrides.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import Ember from 'ember';

import hasEmberVersion from './has-ember-version';

export function preoutletRefactorSetupIntegrationForComponent() {
var module = this;
var context = this.context;

this.actionHooks = {};

context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();
context.dispatcher.setup({}, '#ember-testing');
context.actions = module.actionHooks;

(this.registry || this.container).register('component:-test-holder', Ember.Component.extend());

context.render = function(template) {
// in case `this.render` is called twice, make sure to teardown the first invocation
module.teardownComponent();

if (!template) {
throw new Error("in a component integration test you must pass a template to `render()`");
}
if (Ember.isArray(template)) {
template = template.join('');
}
if (typeof template === 'string') {
template = Ember.Handlebars.compile(template);
}
module.component = module.container.lookupFactory('component:-test-holder').create({
layout: template
});

module.component.set('context' ,context);
module.component.set('controller', context);

Ember.run(function() {
module.component.appendTo('#ember-testing');
});
};

context.$ = function() {
return module.component.$.apply(module.component, arguments);
};

context.set = function(key, value) {
var ret = Ember.run(function() {
return Ember.set(context, key, value);
});

if (hasEmberVersion(2,0)) {
return ret;
}
};

context.setProperties = function(hash) {
var ret = Ember.run(function() {
return Ember.setProperties(context, hash);
});

if (hasEmberVersion(2,0)) {
return ret;
}
};

context.get = function(key) {
return Ember.get(context, key);
};

context.getProperties = function() {
var args = Array.prototype.slice.call(arguments);
return Ember.getProperties(context, args);
};

context.on = function(actionName, handler) {
module.actionHooks[actionName] = handler;
};

context.send = function(actionName) {
var hook = module.actionHooks[actionName];
if (!hook) {
throw new Error("integration testing template received unexpected action " + actionName);
}
hook.apply(module, Array.prototype.slice.call(arguments, 1));
};

context.clearRender = function() {
module.teardownComponent();
};
}
179 changes: 93 additions & 86 deletions lib/ember-test-helpers/test-module-for-component.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import TestModule from './test-module';
import Ember from 'ember';
import { getResolver } from './test-resolver';
import hasEmberVersion from './has-ember-version';
import { preoutletRefactorSetupIntegrationForComponent } from './-legacy-overrides';

let ACTION_KEY;
if (hasEmberVersion(2,0)) {
Expand Down Expand Up @@ -129,101 +130,107 @@ export default TestModule.extend({
};
},

setupComponentIntegrationTest: function() {
var module = this;
var context = this.context;
setupComponentIntegrationTest: (function() {
if (!hasEmberVersion(1,11)) {
return preoutletRefactorSetupIntegrationForComponent;
} else {
return function() {
var module = this;
var context = this.context;

this.actionHooks = context[ACTION_KEY] = {};
context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();
context.dispatcher.setup({}, '#ember-testing');
this.actionHooks = context[ACTION_KEY] = {};
context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();
context.dispatcher.setup({}, '#ember-testing');

var OutletView = module.container.lookupFactory('view:-outlet');
var toplevelView = this._toplevelView = OutletView.create();
toplevelView.setOutletState({ render: { }, outlets: { }});

var element = document.getElementById('ember-testing');
Ember.run(this._toplevelView, 'appendTo', '#ember-testing');

context.render = function(template) {
if (!template) {
throw new Error("in a component integration test you must pass a template to `render()`");
}
if (Ember.isArray(template)) {
template = template.join('');
}
if (typeof template === 'string') {
template = Ember.Handlebars.compile(template);
}

Ember.run(function() {
toplevelView.setOutletState({
render: {
controller: module.context,
template
}
});
});
};
var OutletView = module.container.lookupFactory('view:-outlet');
var toplevelView = module.component = OutletView.create();
toplevelView.setOutletState({ render: { }, outlets: { }});

context.$ = function(selector) {
// emulates Ember internal behavor of `this.$` in a component
// https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18
return selector ? Ember.$(selector, element) : Ember.$(element);
};

context.set = function(key, value) {
var ret = Ember.run(function() {
return Ember.set(context, key, value);
});
var element = document.getElementById('ember-testing');
Ember.run(module.component, 'appendTo', '#ember-testing');

if (hasEmberVersion(2,0)) {
return ret;
}
};
context.render = function(template) {
if (!template) {
throw new Error("in a component integration test you must pass a template to `render()`");
}
if (Ember.isArray(template)) {
template = template.join('');
}
if (typeof template === 'string') {
template = Ember.Handlebars.compile(template);
}

context.setProperties = function(hash) {
var ret = Ember.run(function() {
return Ember.setProperties(context, hash);
});
Ember.run(function() {
toplevelView.setOutletState({
render: {
controller: module.context,
template
}
});
});
};

context.$ = function(selector) {
// emulates Ember internal behavor of `this.$` in a component
// https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18
return selector ? Ember.$(selector, element) : Ember.$(element);
};

context.set = function(key, value) {
var ret = Ember.run(function() {
return Ember.set(context, key, value);
});

if (hasEmberVersion(2,0)) {
return ret;
}
};

if (hasEmberVersion(2,0)) {
return ret;
}
};
context.setProperties = function(hash) {
var ret = Ember.run(function() {
return Ember.setProperties(context, hash);
});

context.get = function(key) {
return Ember.get(context, key);
};
if (hasEmberVersion(2,0)) {
return ret;
}
};

context.getProperties = function() {
var args = Array.prototype.slice.call(arguments);
return Ember.getProperties(context, args);
};
context.get = function(key) {
return Ember.get(context, key);
};

context.on = function(actionName, handler) {
module.actionHooks[actionName] = handler;
};
context.getProperties = function() {
var args = Array.prototype.slice.call(arguments);
return Ember.getProperties(context, args);
};

context.send = function(actionName) {
var hook = module.actionHooks[actionName];
if (!hook) {
throw new Error("integration testing template received unexpected action " + actionName);
}
hook.apply(module.context, Array.prototype.slice.call(arguments, 1));
};
context.on = function(actionName, handler) {
module.actionHooks[actionName] = handler;
};

context.clearRender = function() {
Ember.run(function() {
toplevelView.setOutletState({
render: {
controller: module.context,
randomKey: 'empty'
},
outlets: {}
});
});
};
},
context.send = function(actionName) {
var hook = module.actionHooks[actionName];
if (!hook) {
throw new Error("integration testing template received unexpected action " + actionName);
}
hook.apply(module.context, Array.prototype.slice.call(arguments, 1));
};

context.clearRender = function() {
Ember.run(function() {
toplevelView.setOutletState({
render: {
controller: module.context,
randomKey: 'empty'
},
outlets: {}
});
});
};
};
}
})(),

setupContext: function() {
this._super.call(this);
Expand All @@ -240,10 +247,10 @@ export default TestModule.extend({
},

teardownComponent: function() {
var component = this._toplevelView;
var component = this.component;
if (component) {
Ember.run(component, 'destroy');
this._toplevelView = null;
this.component = null;
}
}
});

0 comments on commit 696da08

Please sign in to comment.