Skip to content

Commit

Permalink
Merge pull request #163 from rwjblue/fix-module-for-integration
Browse files Browse the repository at this point in the history
Fix the module-for-integration tests on Ember canary.
  • Loading branch information
rwjblue authored Jun 19, 2016
2 parents f57c8ea + 7fd91b6 commit 2fed217
Showing 1 changed file with 106 additions and 73 deletions.
179 changes: 106 additions & 73 deletions lib/ember-test-helpers/test-module-for-integration.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ import AbstractTestModule from './abstract-test-module';
import { getResolver } from './test-resolver';
import buildRegistry from './build-registry';
import hasEmberVersion from './has-ember-version';
import { preGlimmerSetupIntegrationForComponent } from './-legacy-overrides';

let ACTION_KEY;
if (hasEmberVersion(2,0)) {
ACTION_KEY = 'actions';
} else {
ACTION_KEY = '_actions';
}

export default AbstractTestModule.extend({
initSetupSteps() {
Expand Down Expand Up @@ -113,89 +121,114 @@ export default AbstractTestModule.extend({
}
},

setupComponentIntegrationTest: function() {
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) {
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');
});
};
setupComponentIntegrationTest: (function() {
if (!hasEmberVersion(1,13)) {
return preGlimmerSetupIntegrationForComponent;
} 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');

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

var element = document.getElementById('ember-testing');
Ember.run(module.component, '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
},

outlets: { }
});
});

// ensure the element is based on the wrapping toplevel view
// Ember still wraps the main application template with a
// normal tagged view
element = Ember.$('#ember-testing > .ember-view');
};

context.$ = function() {
return module.component.$.apply(module.component, arguments);
};
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);
});
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.setProperties = function(hash) {
var ret = Ember.run(function() {
return Ember.setProperties(context, hash);
});

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

context.get = function(key) {
return Ember.get(context, key);
};
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.getProperties = function() {
var args = Array.prototype.slice.call(arguments);
return Ember.getProperties(context, args);
};

context.on = function(actionName, handler) {
module.actionHooks[actionName] = handler;
};
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.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() {
module.teardownComponent();
};
},
context.clearRender = function() {
Ember.run(function() {
toplevelView.setOutletState({
render: {
controller: module.context,
randomKey: 'empty'
},
outlets: {}
});
});
};
};
}
})(),

teardownComponent: function() {
var component = this.component;
Expand Down

0 comments on commit 2fed217

Please sign in to comment.