Skip to content

Commit

Permalink
add/state-in-query-string add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
ovvost committed Dec 7, 2015
1 parent 52c2c31 commit d277973
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 9 deletions.
34 changes: 34 additions & 0 deletions components/appState/uri/tests/parser.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -139,4 +139,38 @@ describe("UriParser", function() {
assert.deepEqual(state.params, expectedState);
assert.equal(state.slug, 'booklet');
});

it("в правильном порядке парсит строку #4 со стейтом в GET-параметрах", function() {
var patterns = [
newDef('query/:query'),
newDef('filials/:firmId'),
newDef('geo/:id')
];

var getParamName = 'queryState';
var state = parser.parse(patterns, 'filials/2?' + getParamName + '=geo/4/query/5', [], getParamName);

assert.equal(state.length, 3);

assert.equal(state[0].slug, 'filials');
assert.equal(state[1].slug, 'geo');
assert.equal(state[2].slug, 'query');
});

it("наличие или отсутсвие слэша в начале не влияет на результат", function() {
var patterns = [
newDef('geo/:id'),
newDef('filials/:firmId'),
newDef('query/:query')
];

var state = parser.parse(patterns, 'filials/2/geo/4/query/5');
var state2 = parser.parse(patterns, 'filials/2/geo/4/query/5');

assert.equal(state.length, state2.length);

assert.equal(state[0].slug, state[0].slug);
assert.equal(state[1].slug, state[1].slug);
assert.equal(state[2].slug, state[2].slug);
});
});
37 changes: 34 additions & 3 deletions components/appState/uri/tests/resolver.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,17 @@ function inject(entry, state) {
return state[entry.slug];
}

function makeConf(patterns) {
var queryParamName = 'queryState';
function makeConf(patterns, queryParamsList) {
var structured = {};
_.each(patterns, function(p) {
structured[p] = inject;
});
return new StateConf({urls: structured});
return new StateConf({
urls: structured,
queryParamName: queryParamName,
queryParamsList: queryParamsList
});
}

describe("UrlResolver", function() {
Expand All @@ -40,6 +45,32 @@ describe("UrlResolver", function() {
assert.equal(decodeURIComponent(resolver(conf, state)), 'search/пиво/inbuild/13');
});

it("правильно преобразует стэйт в строку c GET-параметрами", function() {
var conf = makeConf([
'zoom/:zoom',
'center/:lat,:lon',
'inbuild/:house'
], ['zoom', 'center']);

var state = {
search: {
query: 'пиво'
},
inbuild: {
house: 13
},
zoom: {
zoom: 15
},
center: {
lat: 12,
lon: 10
}
};

assert.equal(decodeURIComponent(resolver(conf, state)), 'inbuild/13?' + queryParamName + '=zoom/15/center/12,10');
});

it("правильно алиасит кириллицу", function() {
var conf = makeConf([
'booklet/:bookletId'
Expand All @@ -58,4 +89,4 @@ describe("UrlResolver", function() {
assert.equal(decodeURIComponent(resolver(conf, state, aliases)), 'сбербанк');

});
});
});
7 changes: 1 addition & 6 deletions components/stateTracker.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,7 @@ StateTracker.prototype.resolveURL = function(url) {
url = url || document.location.pathname;

if (!history.emulate) { // если у нас не hash url, добавляем query string чтобы не потерялась
var urlParse = require('url-parse');
var newLocation = urlParse(url, true);
var currentLocation = urlParse(location.href, true);

var search = stuff.state2uri(_.extend(currentLocation.query, newLocation.query));
url = newLocation.pathname + (search ? '?' + search : '');
url = stuff.extendQuery(location.href, url);
}

return url;
Expand Down
21 changes: 21 additions & 0 deletions lib/stuff.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,3 +178,24 @@ exports.uri2state = function(uri) {
});
return result;
};

/**
* Extend query string
*
* @param [String] urlOld
* @param [String] urlNew
* @returns {String}
*/
exports.extendQuery = function(urlOld, urlNew) {
if (!urlOld || !urlNew) {
if (!urlOld) return urlNew;
if (!urlNew) return urlOld;
return '';
}

var urlParse = require('url-parse');
var newLocation = urlParse(urlNew, true);
var currentLocation = urlParse(urlOld, true);

return newLocation.set('query', _.extend(currentLocation.query, newLocation.query)).toString();
};
39 changes: 39 additions & 0 deletions lib/tests/stuff.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
var assert = require('assert');

describe('stuff', function() {
var stuff = require('../stuff');

describe('extendQuery', function() {
var extendQuery = stuff.extendQuery;

it('новые параметры добавляются', function() {
var newUrl = 'https://www.search.ru/?q=beer';
var oldUrl = 'https://www.search.ru/';

assert.equal(extendQuery(oldUrl, newUrl), 'https://www.search.ru/?q=beer');
});

it('если параметров нет в новом УРЛе, то они остаются от старого', function() {
var newUrl = 'https://www.search.ru/?q=beer';
var oldUrl = 'https://www.search.ru/?r=whiskey';

assert.equal(extendQuery(oldUrl, newUrl), 'https://www.search.ru/?r=whiskey&q=beer');
});

it('если параметр есть и там, и там, берется новое значение', function() {
var newUrl = 'https://www.search.ru/?q=beer';
var oldUrl = 'https://www.search.ru/?q=whiskey';

assert.equal(extendQuery(oldUrl, newUrl), 'https://www.search.ru/?q=beer');
});

it('прочие части нового УРЛа остаются неизменными', function() {
var newUrl = 'https://www.search.ru/?q=beer';
var oldUrl = 'http://another.ru/search/?q=beer';

assert.equal(extendQuery(oldUrl, newUrl), 'https://www.search.ru/?q=beer');
});

});

});

0 comments on commit d277973

Please sign in to comment.