import Engine from '@ember/engine'; import Application from '@ember/application'; import ApplicationInstance from '@ember/application/instance'; import { run } from '@ember/runloop'; import { privatize as P } from 'container'; import { factory } from 'internal-test-helpers'; import { Object as EmberObject } from 'ember-runtime'; import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers'; import { getDebugFunction, setDebugFunction } from '@ember/debug'; const originalDebug = getDebugFunction('debug'); const noop = function() {}; let application, appInstance; moduleFor( 'ApplicationInstance', class extends TestCase { constructor() { setDebugFunction('debug', noop); super(); document.getElementById('qunit-fixture').innerHTML = `
HI
HI
`; application = run(() => Application.create({ rootElement: '#one', router: null })); } teardown() { setDebugFunction('debug', originalDebug); if (appInstance) { run(appInstance, 'destroy'); appInstance = null; } if (application) { run(application, 'destroy'); application = null; } document.getElementById('qunit-fixture').innerHTML = ''; } ['@test an application instance can be created based upon an application'](assert) { appInstance = run(() => ApplicationInstance.create({ application })); assert.ok(appInstance, 'instance should be created'); assert.equal(appInstance.application, application, 'application should be set to parent'); } ['@test customEvents added to the application before setupEventDispatcher'](assert) { assert.expect(1); appInstance = run(() => ApplicationInstance.create({ application })); appInstance.setupRegistry(); application.customEvents = { awesome: 'sauce', }; let eventDispatcher = appInstance.lookup('event_dispatcher:main'); eventDispatcher.setup = function(events) { assert.equal(events.awesome, 'sauce'); }; appInstance.setupEventDispatcher(); } ['@test customEvents added to the application before setupEventDispatcher'](assert) { assert.expect(1); appInstance = run(() => ApplicationInstance.create({ application })); appInstance.setupRegistry(); application.customEvents = { awesome: 'sauce', }; let eventDispatcher = appInstance.lookup('event_dispatcher:main'); eventDispatcher.setup = function(events) { assert.equal(events.awesome, 'sauce'); }; appInstance.setupEventDispatcher(); } ['@test customEvents added to the application instance before setupEventDispatcher'](assert) { assert.expect(1); appInstance = run(() => ApplicationInstance.create({ application })); appInstance.setupRegistry(); appInstance.customEvents = { awesome: 'sauce', }; let eventDispatcher = appInstance.lookup('event_dispatcher:main'); eventDispatcher.setup = function(events) { assert.equal(events.awesome, 'sauce'); }; appInstance.setupEventDispatcher(); } ['@test unregistering a factory clears all cached instances of that factory'](assert) { assert.expect(5); appInstance = run(() => ApplicationInstance.create({ application })); let PostController1 = factory(); let PostController2 = factory(); appInstance.register('controller:post', PostController1); let postController1 = appInstance.lookup('controller:post'); let postController1Factory = appInstance.factoryFor('controller:post'); assert.ok(postController1 instanceof PostController1, 'precond - lookup creates instance'); assert.equal( PostController1, postController1Factory.class, 'precond - factoryFor().class matches' ); appInstance.unregister('controller:post'); appInstance.register('controller:post', PostController2); let postController2 = appInstance.lookup('controller:post'); let postController2Factory = appInstance.factoryFor('controller:post'); assert.ok(postController2 instanceof PostController2, 'lookup creates instance'); assert.equal(PostController2, postController2Factory.class, 'factoryFor().class matches'); assert.notStrictEqual( postController1, postController2, 'lookup creates a brand new instance, because the previous one was reset' ); } ['@skip unregistering a factory clears caches with source of that factory'](assert) { assert.expect(1); appInstance = run(() => ApplicationInstance.create({ application })); let PostController1 = factory(); let PostController2 = factory(); appInstance.register('controller:post', PostController1); appInstance.lookup('controller:post'); let postControllerLookupWithSource = appInstance.lookup('controller:post', { source: 'doesnt-even-matter', }); appInstance.unregister('controller:post'); appInstance.register('controller:post', PostController2); // The cache that is source-specific is not cleared assert.ok( postControllerLookupWithSource !== appInstance.lookup('controller:post', { source: 'doesnt-even-matter', }), 'lookup with source creates a new instance' ); } ['@test can build and boot a registered engine'](assert) { assert.expect(11); let ChatEngine = Engine.extend(); let chatEngineInstance; application.register('engine:chat', ChatEngine); run(() => { appInstance = ApplicationInstance.create({ application }); appInstance.setupRegistry(); chatEngineInstance = appInstance.buildChildEngineInstance('chat'); }); return chatEngineInstance.boot().then(() => { assert.ok(true, 'boot successful'); let registrations = ['route:basic', 'service:-routing', 'service:-glimmer-environment']; registrations.forEach(key => { assert.strictEqual( chatEngineInstance.resolveRegistration(key), appInstance.resolveRegistration(key), `Engine and parent app share registrations for '${key}'` ); }); let singletons = [ 'router:main', P`-bucket-cache:main`, '-view-registry:main', '-environment:main', 'service:-document', 'event_dispatcher:main', ]; let env = appInstance.lookup('-environment:main'); singletons.push(env.isInteractive ? 'renderer:-dom' : 'renderer:-inert'); singletons.forEach(key => { assert.strictEqual( chatEngineInstance.lookup(key), appInstance.lookup(key), `Engine and parent app share singleton '${key}'` ); }); }); } ['@test can build a registry via ApplicationInstance.setupRegistry() -- simulates ember-test-helpers']( assert ) { let namespace = EmberObject.create({ Resolver: { create: function() {} }, }); let registry = Application.buildRegistry(namespace); ApplicationInstance.setupRegistry(registry); assert.equal(registry.resolve('service:-document'), document); } } );