Skip to content

Commit cf582e6

Browse files
committed
add tests with async loaded substates. WIP fixing emberjs#19266
1 parent dfd38c8 commit cf582e6

File tree

5 files changed

+1105
-1084
lines changed

5 files changed

+1105
-1084
lines changed

packages/@ember/-internals/routing/lib/system/router.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,9 +1397,15 @@ function findRouteStateName(route: Route, state: string) {
13971397
return routeHasBeenDefined(owner, router, stateName, stateNameFull) ? stateNameFull : '';
13981398
}
13991399

1400+
function isPromise(p: unknown): boolean {
1401+
return p !== null && typeof p === 'object' && typeof p.then === 'function';
1402+
}
1403+
14001404
/**
1401-
Determines whether or not a route has been defined by checking that the route
1402-
is in the Router's map and the owner has a registration for that route.
1405+
Determines whether or not a route has been defined by checking
1406+
- that the route is in the Router's map and
1407+
- the owner has a registration for that route and
1408+
- it has been fully resolved (think of aync assets loading)
14031409
14041410
@private
14051411
@param {Owner} owner
@@ -1412,7 +1418,7 @@ function routeHasBeenDefined(owner: Owner, router: any, localName: string, fullN
14121418
let routerHasRoute = router.hasRoute(fullName);
14131419
let ownerHasRoute =
14141420
owner.hasRegistration(`template:${localName}`) || owner.hasRegistration(`route:${localName}`);
1415-
return routerHasRoute && ownerHasRoute;
1421+
return routerHasRoute && ownerHasRoute && !isPromise(router._routerMicrolib.getRoute(fullName));
14161422
}
14171423

14181424
export function triggerEvent(

packages/ember/tests/routing/model_loading_test.js

Lines changed: 8 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
import { Route } from '@ember/-internals/routing';
33
import Controller from '@ember/controller';
44
import { Object as EmberObject, A as emberA } from '@ember/-internals/runtime';
5-
import { moduleFor, ApplicationTestCase, getTextOf, runLoopSettled } from 'internal-test-helpers';
5+
import {
6+
moduleFor,
7+
ApplicationTestCase,
8+
getTextOf,
9+
runLoopSettled,
10+
lazyLoadingRouterOptions,
11+
} from 'internal-test-helpers';
612
import { run } from '@ember/runloop';
713
import { computed, set } from '@ember/-internals/metal';
8-
import { isDestroying } from '@glimmer/destroyable';
9-
import RSVP from 'rsvp';
1014

1115
let originalConsoleError;
1216

@@ -958,49 +962,7 @@ moduleFor(
958962
'Route - model loading (simulated within lazy engine)',
959963
class extends LoadingTests {
960964
get routerOptions() {
961-
return {
962-
location: 'none',
963-
setupRouter() {
964-
this._super(...arguments);
965-
let getRoute = this._routerMicrolib.getRoute;
966-
this._enginePromises = Object.create(null);
967-
this._resolvedEngines = Object.create(null);
968-
969-
let routes = new Map();
970-
let routePromises = new Map();
971-
this._routerMicrolib.getRoute = (name) => {
972-
if (routes.has(name)) {
973-
return routes.get(name);
974-
}
975-
976-
if (routePromises.has(name)) {
977-
return routePromises.get(name);
978-
}
979-
980-
// if (name.indexOf('loading')) {
981-
// let route = getRoute(name);
982-
// routes.set(name, route);
983-
// return route;
984-
// }
985-
986-
let promise = new RSVP.Promise((resolve) => {
987-
setTimeout(() => {
988-
if (isDestroying(this)) {
989-
return;
990-
}
991-
992-
let route = getRoute(name);
993-
994-
routes.set(name, route);
995-
resolve(route);
996-
}, 10);
997-
});
998-
routePromises.set(name, promise);
999-
1000-
return promise;
1001-
};
1002-
},
1003-
};
965+
return lazyLoadingRouterOptions;
1004966
}
1005967
}
1006968
);

0 commit comments

Comments
 (0)