@@ -2,11 +2,13 @@ import { moduleFor, ApplicationTestCase, strip } from 'internal-test-helpers';
22
33import { ENV } from '@ember/-internals/environment' ;
44import Controller from '@ember/controller' ;
5+ import { inject as service } from '@ember/service' ;
56import { Route } from '@ember/-internals/routing' ;
6- import { Component } from '@ember/-internals/glimmer' ;
7+ import { Component , helper } from '@ember/-internals/glimmer' ;
78import { set , tracked } from '@ember/-internals/metal' ;
9+ import { Promise } from 'rsvp' ;
810import { backtrackingMessageFor } from '../../utils/debug-stack' ;
9- import { runTask } from '../../../../../../internal-test-helpers/lib/run' ;
11+ import { runLoopSettled , runTask } from '../../../../../../internal-test-helpers/lib/run' ;
1012
1113moduleFor (
1214 'Application test: rendering' ,
@@ -73,6 +75,106 @@ moduleFor(
7375 } ) ;
7476 }
7577
78+ async [ '@test only the resolved model is visiable to @model when switching between the same route (with different params)' ] (
79+ assert
80+ ) {
81+ assert . timeout ( - 1 ) ;
82+
83+ let deferred = ( ) => {
84+ let resolve , reject ;
85+ let promise = new Promise ( ( _resolve , _reject ) => {
86+ resolve = _resolve ;
87+ reject = _reject ;
88+ } ) ;
89+ return { promise, resolve, reject } ;
90+ } ;
91+
92+ this . router . map ( function ( ) {
93+ this . route ( 'color' , { path : '/:color' } ) ;
94+ } ) ;
95+
96+ let count = 0 ;
97+ let deferredModel ;
98+
99+ this . add (
100+ 'helper:never-undefined' ,
101+ helper ( ( [ model ] ) => {
102+ if ( model === undefined ) {
103+ assert . ok ( false , 'should never receive undefined' ) ;
104+ throw new Error ( 'get outta here' ) ;
105+ } else {
106+ return model ;
107+ }
108+ } )
109+ ) ;
110+
111+ let router ;
112+ this . add (
113+ 'route:color' ,
114+ Route . extend ( {
115+ router : service ( ) ,
116+ init ( ) {
117+ this . _super ( ...arguments ) ;
118+
119+ router = this . router ;
120+ } ,
121+
122+ model ( ) {
123+ count ++ ;
124+ deferredModel = deferred ( ) ;
125+ return deferredModel . promise ;
126+ } ,
127+ } )
128+ ) ;
129+
130+ this . addTemplate ( 'color' , '[model: {{never-undefined @model}}]' ) ;
131+
132+ assert . strictEqual ( count , 0 , 'model hook was never called' ) ;
133+
134+ let visitPromise = this . visit ( '/red' ) ;
135+ await runLoopSettled ( ) ;
136+
137+ assert . strictEqual ( count , 1 , 'model hook was called once' ) ;
138+
139+ deferredModel . resolve ( 'RED' ) ;
140+ await visitPromise ;
141+
142+ assert . strictEqual ( count , 1 , 'model hook was called once' ) ;
143+ this . assertInnerHTML ( `[model: RED]` ) ;
144+
145+ visitPromise = router . transitionTo ( 'color' , 'blue' ) ;
146+ await runLoopSettled ( ) ;
147+
148+ assert . strictEqual ( count , 2 , 'model hook was called twice' ) ;
149+ this . assertInnerHTML ( `[model: RED]` ) ;
150+
151+ deferredModel . resolve ( 'BLUE' ) ;
152+
153+ this . assertInnerHTML ( `[model: RED]` ) ;
154+
155+ await visitPromise ;
156+ await runLoopSettled ( ) ;
157+
158+ assert . strictEqual ( count , 2 , 'model hook was called twice' ) ;
159+ this . assertInnerHTML ( `[model: BLUE]` ) ;
160+
161+ visitPromise = this . visit ( '/green' ) ;
162+ await runLoopSettled ( ) ;
163+
164+ assert . strictEqual ( count , 3 , 'model hook was called three times' ) ;
165+ this . assertInnerHTML ( `[model: BLUE]` ) ;
166+
167+ deferredModel . resolve ( 'GREEN' ) ;
168+
169+ this . assertInnerHTML ( `[model: BLUE]` ) ;
170+
171+ await visitPromise ;
172+
173+ this . assertInnerHTML ( `[model: GREEN]` ) ;
174+
175+ assert . strictEqual ( count , 3 , 'model hook was called three times' ) ;
176+ }
177+
76178 [ '@test it can access the model provided by the route via this.model' ] ( ) {
77179 this . add (
78180 'route:application' ,
0 commit comments