Skip to content

Commit 12e9eb6

Browse files
Robert Jacksonlocks
authored andcommitted
Add test ensuring @model is never updated to an undefined value
1 parent 942dca8 commit 12e9eb6

1 file changed

Lines changed: 104 additions & 2 deletions

File tree

packages/@ember/-internals/glimmer/tests/integration/application/rendering-test.js

Lines changed: 104 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import { moduleFor, ApplicationTestCase, strip } from 'internal-test-helpers';
22

33
import { ENV } from '@ember/-internals/environment';
44
import Controller from '@ember/controller';
5+
import { inject as service } from '@ember/service';
56
import { Route } from '@ember/-internals/routing';
6-
import { Component } from '@ember/-internals/glimmer';
7+
import { Component, helper } from '@ember/-internals/glimmer';
78
import { set, tracked } from '@ember/-internals/metal';
9+
import { Promise } from 'rsvp';
810
import { 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

1113
moduleFor(
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

Comments
 (0)