Skip to content

Commit

Permalink
Merge pull request #96 from ef4/fix-initializers
Browse files Browse the repository at this point in the history
Run initializers and instance-initializers inside engines
  • Loading branch information
rwjblue committed May 3, 2016
2 parents 9d7e2be + 015eeea commit b792db4
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 9 deletions.
12 changes: 9 additions & 3 deletions README.md
Expand Up @@ -98,12 +98,18 @@ Within your engine's `addon` directory, add a new `engine.js` file:
```js
import Engine from 'ember-engines/engine';
import Resolver from 'ember-engines/resolver';
import loadInitializers from 'ember-load-initializers';

export default Engine.extend({
modulePrefix: 'ember-blog',

const modulePrefix = 'ember-blog';
const Eng = Engine.extend({
modulePrefix,
Resolver
});

loadInitializers(Eng, modulePrefix);

export default Eng;

```

It's important to define a `modulePrefix` that will be used to resolve your
Expand Down
14 changes: 14 additions & 0 deletions addon/-private/engine-ext.js
Expand Up @@ -18,6 +18,20 @@ const {
} = Ember;

Engine.reopen({
_initializersRan: false,

ensureInitializers() {
if (!this._initializersRan) {
this.runInitializers();
this._initializersRan = true;
}
},

buildInstance(options) {
this.ensureInitializers();
return this._super(options);
},

buildRegistry() {
let namespace = this;
let registry = this._super(...arguments);
Expand Down
@@ -1,7 +1,13 @@
import Engine from 'ember-engines/engine';
import Resolver from 'ember-engines/resolver';
import loadInitializers from 'ember-load-initializers';

export default Engine.extend({
modulePrefix: '<%= dasherizedModuleName %>',
const modulePrefix = 'ember-blog';
const Eng = Engine.extend({
modulePrefix,
Resolver
});

loadInitializers(Eng, modulePrefix);

export default Eng;
@@ -1,7 +1,13 @@
import Engine from 'ember-engines/engine';
import Resolver from 'ember-engines/resolver';
import loadInitializers from 'ember-load-initializers';

export default Engine.extend({
modulePrefix: '<%= dasherizedModuleName %>',
const modulePrefix = 'ember-blog';
const Eng = Engine.extend({
modulePrefix,
Resolver
});

loadInitializers(Eng, modulePrefix);

export default Eng;
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -44,6 +44,7 @@
"ember-export-application-global": "^1.0.5",
"ember-load-initializers": "^0.5.1",
"ember-resolver": "^2.0.3",
"ember-sinon": "0.5.0",
"ember-try": "^0.2.2",
"loader.js": "^4.0.1"
},
Expand Down
52 changes: 52 additions & 0 deletions tests/acceptance/routeable-engine-demo-test.js
@@ -1,5 +1,8 @@
import { test } from 'qunit';
import sinon from 'sinon';
import moduleForAcceptance from '../../tests/helpers/module-for-acceptance';
import Initializer from 'ember-blog/initializers/ember-blog-initializer';
import InstanceInitializer from 'ember-blog/instance-initializers/ember-blog-instance-initializer';

moduleForAcceptance('Acceptance | routable engine demo');

Expand Down Expand Up @@ -93,3 +96,52 @@ test('transitionTo works properly within parent application', function(assert) {
assert.equal(currentURL(), '/routeless-engine-demo');
});
});

test('initializers run within engine', function(assert) {
assert.expect(1);

let stub = sinon.stub(Initializer, 'initialize');

visit('/routable-engine-demo/blog/new');

andThen(() => {
assert.ok(stub.calledOnce, 'Initializer ran once');
stub.restore();
});
});

test('instance initializers run within engine', function(assert) {
assert.expect(1);

let stub = sinon.stub(InstanceInitializer, 'initialize');

visit('/routable-engine-demo/blog/new');

andThen(() => {
assert.ok(stub.calledOnce, 'Instance initializer ran once');
stub.restore();
});
});

test('instance-initializers run after initializers', function(assert) {
assert.expect(2);

let appInitialized = false;
let instanceInitialized = false;

let appInit = sinon.stub(Initializer, 'initialize', function() {
appInitialized = true;
assert.ok(!instanceInitialized, 'instance initialized has not run yet');
});
let instanceInit = sinon.stub(InstanceInitializer, 'initialize', function() {
instanceInitialized = true;
assert.ok(appInitialized, 'initializer already ran');
});

visit('/routable-engine-demo/blog/new');

andThen(() => {
appInit.restore();
instanceInit.restore();
});
});
12 changes: 10 additions & 2 deletions tests/dummy/lib/ember-blog/addon/engine.js
@@ -1,9 +1,13 @@
import Engine from 'ember-engines/engine';
import Resolver from 'ember-engines/resolver';
import loadInitializers from 'ember-load-initializers';

export default Engine.extend({
modulePrefix: 'ember-blog',
let Eng;

const modulePrefix = 'ember-blog';

Eng = Engine.extend({
modulePrefix,
Resolver,

dependencies: {
Expand All @@ -12,3 +16,7 @@ export default Engine.extend({
]
}
});

loadInitializers(Eng, modulePrefix);

export default Eng;
@@ -0,0 +1,6 @@
export default {
name: 'ember-blog-initializer',
initialize() {

}
}
@@ -0,0 +1,5 @@
export default {
name: 'ember-blog-instance-initializer',
initialize() {
}
}

0 comments on commit b792db4

Please sign in to comment.