From d26a1bf911c9b5be711997d75bce6c79615667e9 Mon Sep 17 00:00:00 2001 From: Thomas Wang Date: Mon, 8 Feb 2021 21:12:13 -0800 Subject: [PATCH] fix: LinkTo with incomplete model failing in rendering tests LinkTo needs route context to allow omitting model from current active route. Without the guard, tests where LinkTo rendered in tests without routing transition started will break. See issues/19364 --- .../integration/components/link-to/rendering-angle-test.js | 3 --- packages/@ember/-internals/routing/lib/services/routing.ts | 6 ++++-- packages/@ember/-internals/routing/lib/system/router.ts | 3 +++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js index abe67a01630..7fabc522e1c 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/link-to/rendering-angle-test.js @@ -126,9 +126,7 @@ moduleFor( }); }); }); - debugger; return this.visit('/parents/1').then(() => { - debugger; this.assertText('Link To Child'); }); } @@ -173,7 +171,6 @@ moduleFor( ['@test should be able to be inserted in DOM when router is setup but not started']() { this.render(`Link`); - debugger; this.assertComponentElement(this.element.firstChild, { tagName: 'a', content: 'Link', diff --git a/packages/@ember/-internals/routing/lib/services/routing.ts b/packages/@ember/-internals/routing/lib/services/routing.ts index d459c07bacd..ee0a472a331 100644 --- a/packages/@ember/-internals/routing/lib/services/routing.ts +++ b/packages/@ember/-internals/routing/lib/services/routing.ts @@ -54,8 +54,10 @@ export default class RoutingService extends Service { generateURL(routeName: string, models: {}[], queryParams: {}) { let router = this.router; - // return early when the router microlib is not present, which is the case for {{link-to}} in integration tests - if (!router._routerMicrolib) { + // return early when the router microlib is not present, which is the case for in integration tests + // also return early when transition has not started, when rendering in tests without visit(), + // we cannot infer the route context which needs be aware of + if (!router._routerMicrolib || !router._initialTransitionStarted) { return; } diff --git a/packages/@ember/-internals/routing/lib/system/router.ts b/packages/@ember/-internals/routing/lib/system/router.ts index a9439cb8643..230fc44e1ef 100644 --- a/packages/@ember/-internals/routing/lib/system/router.ts +++ b/packages/@ember/-internals/routing/lib/system/router.ts @@ -130,6 +130,7 @@ class EmberRouter extends EmberObject { rootURL!: string; _routerMicrolib!: Router; _didSetupRouter = false; + _initialTransitionStarted = false; currentURL: string | null = null; currentRouteName: string | null = null; @@ -414,6 +415,7 @@ class EmberRouter extends EmberObject { if (initialTransition && initialTransition.error) { throw initialTransition.error; } + this._initialTransitionStarted = true; } } @@ -621,6 +623,7 @@ class EmberRouter extends EmberObject { */ reset() { this._didSetupRouter = false; + this._initialTransitionStarted = false; if (this._routerMicrolib) { this._routerMicrolib.reset(); }