Skip to content

Commit adef2d0

Browse files
Igor TerzicStanley Stuart
authored andcommitted
Add renetrant test for query params changes
1 parent 6639900 commit adef2d0

File tree

2 files changed

+138
-14
lines changed

2 files changed

+138
-14
lines changed

packages/ember-routing/lib/system/router.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -668,11 +668,6 @@ const EmberRouter = EmberObject.extend(Evented, {
668668
assert(`The route ${targetRouteName} was not found`, targetRouteName && this.router.hasRoute(targetRouteName));
669669

670670
let queryParams = {};
671-
// merge in any queryParams from the active transition which could include
672-
// queryparams from the url on initial load.
673-
if (this.router.activeTransition) {
674-
assign(queryParams, this.router.activeTransition.queryParams);
675-
}
676671

677672
this._processActiveTransitionQueryParams(targetRouteName, models, queryParams, _queryParams);
678673

@@ -689,7 +684,7 @@ const EmberRouter = EmberObject.extend(Evented, {
689684

690685
_processActiveTransitionQueryParams(targetRouteName, models, queryParams, _queryParams) {
691686
// merge in any queryParams from the active transition which could include
692-
// queryparams from the url on initial load.
687+
// queryParams from the url on initial load.
693688
if (!this.router.activeTransition) { return; }
694689

695690
var unchangedQPs = {};
@@ -700,9 +695,9 @@ const EmberRouter = EmberObject.extend(Evented, {
700695
}
701696
}
702697

703-
// We need to fully scope query params so that we can create one object
704-
// that represetns both pased in query params and ones that arent' changed
705-
// from the actice transition
698+
// We need to fully scope queryParams so that we can create one object
699+
// that represents both pased in queryParams and ones that aren't changed
700+
// from the active transition.
706701
this._fullyScopeQueryParams(targetRouteName, models, _queryParams);
707702
this._fullyScopeQueryParams(targetRouteName, models, unchangedQPs);
708703
assign(queryParams, unchangedQPs);

packages/ember/tests/routing/query_params_test.js

Lines changed: 134 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Controller from 'ember-runtime/controllers/controller';
2+
import RSVP from 'ember-runtime/ext/rsvp';
23
import Route from 'ember-routing/system/route';
34
import run from 'ember-metal/run_loop';
45
import get from 'ember-metal/property_get';
@@ -2491,11 +2492,13 @@ if (isEnabled('ember-routing-route-configured-query-params')) {
24912492
});
24922493

24932494
QUnit.test('queryParams are updated when a controller property is set and the route is refreshed. Issue #13263 ', function() {
2494-
Ember.TEMPLATES.application = compile(
2495-
'<button id="test-button" {{action \'increment\'}}>Increment</button>' +
2496-
'<span id="test-value">{{foo}}</span>' +
2497-
'{{outlet}}'
2498-
);
2495+
setTemplates({
2496+
application: compile(
2497+
'<button id="test-button" {{action \'increment\'}}>Increment</button>' +
2498+
'<span id="test-value">{{foo}}</span>' +
2499+
'{{outlet}}'
2500+
)
2501+
});
24992502
App.ApplicationController = Controller.extend({
25002503
queryParams: ['foo'],
25012504
foo: 1,
@@ -3222,6 +3225,132 @@ if (isEnabled('ember-routing-route-configured-query-params')) {
32223225
equal(get(controller, 'foo'), undefined);
32233226
});
32243227
}
3228+
QUnit.test('when refreshModel is true and loading action returns false, model hook will rerun when QPs change even if previous did not finish', function() {
3229+
expect(6);
3230+
3231+
var appModelCount = 0;
3232+
var promiseResolve;
3233+
3234+
App.ApplicationRoute = Route.extend({
3235+
queryParams: {
3236+
'appomg': {
3237+
defaultValue: 'applol'
3238+
}
3239+
},
3240+
model(params) {
3241+
appModelCount++;
3242+
}
3243+
});
3244+
3245+
App.IndexController = Controller.extend({
3246+
queryParams: ['omg']
3247+
// uncommon to not support default value, but should assume undefined.
3248+
});
3249+
3250+
var indexModelCount = 0;
3251+
App.IndexRoute = Route.extend({
3252+
queryParams: {
3253+
omg: {
3254+
refreshModel: true
3255+
}
3256+
},
3257+
actions: {
3258+
loading: function() {
3259+
return false;
3260+
}
3261+
},
3262+
model(params) {
3263+
indexModelCount++;
3264+
if (indexModelCount === 2) {
3265+
deepEqual(params, { omg: 'lex' });
3266+
return new RSVP.Promise(function(resolve) {
3267+
promiseResolve = resolve;
3268+
return;
3269+
});
3270+
} else if (indexModelCount === 3) {
3271+
deepEqual(params, { omg: 'hello' }, 'Model hook reruns even if the previous one didnt finish');
3272+
}
3273+
}
3274+
});
3275+
3276+
bootApplication();
3277+
3278+
equal(indexModelCount, 1);
3279+
3280+
var indexController = container.lookup('controller:index');
3281+
setAndFlush(indexController, 'omg', 'lex');
3282+
equal(indexModelCount, 2);
3283+
3284+
setAndFlush(indexController, 'omg', 'hello');
3285+
equal(indexModelCount, 3);
3286+
run(function() {
3287+
promiseResolve();
3288+
});
3289+
equal(get(indexController, 'omg'), 'hello', 'At the end last value prevails');
3290+
});
3291+
3292+
QUnit.test('when refreshModel is true and loading action does not return false, model hook will not rerun when QPs change even if previous did not finish', function() {
3293+
expect(7);
3294+
3295+
var appModelCount = 0;
3296+
var promiseResolve;
3297+
3298+
App.ApplicationRoute = Route.extend({
3299+
queryParams: {
3300+
'appomg': {
3301+
defaultValue: 'applol'
3302+
}
3303+
},
3304+
model(params) {
3305+
appModelCount++;
3306+
}
3307+
});
3308+
3309+
App.IndexController = Controller.extend({
3310+
queryParams: ['omg']
3311+
// uncommon to not support default value, but should assume undefined.
3312+
});
3313+
3314+
var indexModelCount = 0;
3315+
App.IndexRoute = Route.extend({
3316+
queryParams: {
3317+
omg: {
3318+
refreshModel: true
3319+
}
3320+
},
3321+
model(params) {
3322+
indexModelCount++;
3323+
3324+
if (indexModelCount === 2) {
3325+
deepEqual(params, { omg: 'lex' });
3326+
return new RSVP.Promise(function(resolve) {
3327+
promiseResolve = resolve;
3328+
return;
3329+
});
3330+
} else if (indexModelCount === 3) {
3331+
ok(false, 'shouldnt get here');
3332+
}
3333+
}
3334+
});
3335+
3336+
bootApplication();
3337+
3338+
equal(appModelCount, 1);
3339+
equal(indexModelCount, 1);
3340+
3341+
var indexController = container.lookup('controller:index');
3342+
setAndFlush(indexController, 'omg', 'lex');
3343+
3344+
equal(appModelCount, 1);
3345+
equal(indexModelCount, 2);
3346+
3347+
setAndFlush(indexController, 'omg', 'hello');
3348+
equal(get(indexController, 'omg'), 'hello', ' value was set');
3349+
equal(indexModelCount, 2);
3350+
run(function() {
3351+
promiseResolve();
3352+
});
3353+
});
32253354

32263355
QUnit.test('warn user that routes query params configuration must be an Object, not an Array', function() {
32273356
expect(1);

0 commit comments

Comments
 (0)