Skip to content

Commit

Permalink
Lazily setup the router in non-application tests for <LinkTo> component
Browse files Browse the repository at this point in the history
(cherry picked from commit 8816a25)
  • Loading branch information
rwjblue committed Feb 10, 2021
1 parent c63ef82 commit a827b58
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,11 @@ moduleFor(
['@test should be able to be inserted in DOM when the router is not present - block']() {
this.render(`<LinkTo @route='index'>Go to Index</LinkTo>`);

this.assertText('Go to Index');
this.assertComponentElement(this.element.firstChild, {
tagName: 'a',
attrs: { href: '#/' },
content: 'Go to Index',
});
}
}
);
16 changes: 15 additions & 1 deletion packages/@ember/-internals/routing/lib/services/routing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@
@module ember
*/

import { getOwner, Owner } from '@ember/-internals/owner';
import { symbol } from '@ember/-internals/utils';
import { readOnly } from '@ember/object/computed';
import { assign } from '@ember/polyfills';
import Service from '@ember/service';
import EmberRouter, { QueryParam } from '../system/router';
import RouterState from '../system/router_state';

const ROUTER = symbol('ROUTER') as string;

/**
The Routing service is used by LinkComponent, and provides facilities for
the component/view layer to interact with the router.
Expand All @@ -19,7 +23,17 @@ import RouterState from '../system/router_state';
@class RoutingService
*/
export default class RoutingService extends Service {
router!: EmberRouter;
get router(): EmberRouter {
let router = this[ROUTER];
if (router !== undefined) {
return router;
}
const owner = getOwner(this) as Owner;
router = owner.lookup('router:main') as EmberRouter;
router.setupRouter();
return (this[ROUTER] = router);
}

hasRoute(routeName: string) {
return this.router.hasRoute(routeName);
}
Expand Down
1 change: 0 additions & 1 deletion packages/@ember/application/tests/application_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,6 @@ moduleFor(
verifyRegistration(assert, application, 'component:textarea');

verifyRegistration(assert, application, 'service:-routing');
verifyInjection(assert, application, 'service:-routing', 'router', 'router:main');

// DEBUGGING
verifyRegistration(assert, application, 'resolver-for-debugging:main');
Expand Down
2 changes: 0 additions & 2 deletions packages/@ember/engine/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -511,8 +511,6 @@ function commonSetupRegistry(registry) {

// Register the routing service...
registry.register('service:-routing', RoutingService);
// Then inject the app router into it
registry.injection('service:-routing', 'router', 'router:main');

// DEBUGGING
registry.register('resolver-for-debugging:main', registry.resolver, {
Expand Down
1 change: 0 additions & 1 deletion packages/@ember/engine/tests/engine_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ moduleFor(
verifyRegistration(assert, engine, 'component:textarea');

verifyRegistration(assert, engine, 'service:-routing');
verifyInjection(assert, engine, 'service:-routing', 'router', 'router:main');

// DEBUGGING
verifyRegistration(assert, engine, 'resolver-for-debugging:main');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,28 +21,31 @@ moduleFor(
},

setupRouter() {
this._super(...arguments);
let { _handlerPromises: handlerPromises, _seenHandlers: seenHandlers } = this;
let getRoute = this._routerMicrolib.getRoute;

this._routerMicrolib.getRoute = function (routeName) {
fetchedHandlers.push(routeName);

// Cache the returns so we don't have more than one Promise for a
// given handler.
return (
handlerPromises[routeName] ||
(handlerPromises[routeName] = new RSVP.Promise((resolve) => {
setTimeout(() => {
let handler = getRoute(routeName);

seenHandlers[routeName] = handler;

resolve(handler);
}, 10);
}))
);
};
let isNewSetup = this._super(...arguments);
if (isNewSetup) {
let { _handlerPromises: handlerPromises, _seenHandlers: seenHandlers } = this;
let getRoute = this._routerMicrolib.getRoute;

this._routerMicrolib.getRoute = function (routeName) {
fetchedHandlers.push(routeName);

// Cache the returns so we don't have more than one Promise for a
// given handler.
return (
handlerPromises[routeName] ||
(handlerPromises[routeName] = new RSVP.Promise((resolve) => {
setTimeout(() => {
let handler = getRoute(routeName);

seenHandlers[routeName] = handler;

resolve(handler);
}, 10);
}))
);
};
}
return isNewSetup;
},

_getQPMeta(routeInfo) {
Expand Down

0 comments on commit a827b58

Please sign in to comment.