Skip to content

Commit

Permalink
Add renetrant test for query params changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Igor Terzic authored and Stanley Stuart committed Jun 18, 2016
1 parent 6639900 commit adef2d0
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 14 deletions.
13 changes: 4 additions & 9 deletions packages/ember-routing/lib/system/router.js
Original file line number Diff line number Diff line change
Expand Up @@ -668,11 +668,6 @@ const EmberRouter = EmberObject.extend(Evented, {
assert(`The route ${targetRouteName} was not found`, targetRouteName && this.router.hasRoute(targetRouteName));

let queryParams = {};
// merge in any queryParams from the active transition which could include
// queryparams from the url on initial load.
if (this.router.activeTransition) {
assign(queryParams, this.router.activeTransition.queryParams);
}

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

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

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

var unchangedQPs = {};
Expand All @@ -700,9 +695,9 @@ const EmberRouter = EmberObject.extend(Evented, {
}
}

// We need to fully scope query params so that we can create one object
// that represetns both pased in query params and ones that arent' changed
// from the actice transition
// We need to fully scope queryParams so that we can create one object
// that represents both pased in queryParams and ones that aren't changed
// from the active transition.
this._fullyScopeQueryParams(targetRouteName, models, _queryParams);
this._fullyScopeQueryParams(targetRouteName, models, unchangedQPs);
assign(queryParams, unchangedQPs);
Expand Down
139 changes: 134 additions & 5 deletions packages/ember/tests/routing/query_params_test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Controller from 'ember-runtime/controllers/controller';
import RSVP from 'ember-runtime/ext/rsvp';
import Route from 'ember-routing/system/route';
import run from 'ember-metal/run_loop';
import get from 'ember-metal/property_get';
Expand Down Expand Up @@ -2491,11 +2492,13 @@ if (isEnabled('ember-routing-route-configured-query-params')) {
});

QUnit.test('queryParams are updated when a controller property is set and the route is refreshed. Issue #13263 ', function() {
Ember.TEMPLATES.application = compile(
'<button id="test-button" {{action \'increment\'}}>Increment</button>' +
'<span id="test-value">{{foo}}</span>' +
'{{outlet}}'
);
setTemplates({
application: compile(
'<button id="test-button" {{action \'increment\'}}>Increment</button>' +
'<span id="test-value">{{foo}}</span>' +
'{{outlet}}'
)
});
App.ApplicationController = Controller.extend({
queryParams: ['foo'],
foo: 1,
Expand Down Expand Up @@ -3222,6 +3225,132 @@ if (isEnabled('ember-routing-route-configured-query-params')) {
equal(get(controller, 'foo'), undefined);
});
}
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() {
expect(6);

var appModelCount = 0;
var promiseResolve;

App.ApplicationRoute = Route.extend({
queryParams: {
'appomg': {
defaultValue: 'applol'
}
},
model(params) {
appModelCount++;
}
});

App.IndexController = Controller.extend({
queryParams: ['omg']
// uncommon to not support default value, but should assume undefined.
});

var indexModelCount = 0;
App.IndexRoute = Route.extend({
queryParams: {
omg: {
refreshModel: true
}
},
actions: {
loading: function() {
return false;
}
},
model(params) {
indexModelCount++;
if (indexModelCount === 2) {
deepEqual(params, { omg: 'lex' });
return new RSVP.Promise(function(resolve) {
promiseResolve = resolve;
return;
});
} else if (indexModelCount === 3) {
deepEqual(params, { omg: 'hello' }, 'Model hook reruns even if the previous one didnt finish');
}
}
});

bootApplication();

equal(indexModelCount, 1);

var indexController = container.lookup('controller:index');
setAndFlush(indexController, 'omg', 'lex');
equal(indexModelCount, 2);

setAndFlush(indexController, 'omg', 'hello');
equal(indexModelCount, 3);
run(function() {
promiseResolve();
});
equal(get(indexController, 'omg'), 'hello', 'At the end last value prevails');
});

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() {
expect(7);

var appModelCount = 0;
var promiseResolve;

App.ApplicationRoute = Route.extend({
queryParams: {
'appomg': {
defaultValue: 'applol'
}
},
model(params) {
appModelCount++;
}
});

App.IndexController = Controller.extend({
queryParams: ['omg']
// uncommon to not support default value, but should assume undefined.
});

var indexModelCount = 0;
App.IndexRoute = Route.extend({
queryParams: {
omg: {
refreshModel: true
}
},
model(params) {
indexModelCount++;

if (indexModelCount === 2) {
deepEqual(params, { omg: 'lex' });
return new RSVP.Promise(function(resolve) {
promiseResolve = resolve;
return;
});
} else if (indexModelCount === 3) {
ok(false, 'shouldnt get here');
}
}
});

bootApplication();

equal(appModelCount, 1);
equal(indexModelCount, 1);

var indexController = container.lookup('controller:index');
setAndFlush(indexController, 'omg', 'lex');

equal(appModelCount, 1);
equal(indexModelCount, 2);

setAndFlush(indexController, 'omg', 'hello');
equal(get(indexController, 'omg'), 'hello', ' value was set');
equal(indexModelCount, 2);
run(function() {
promiseResolve();
});
});

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

0 comments on commit adef2d0

Please sign in to comment.