Skip to content

Commit

Permalink
Building url for pattern with nested optional groups, fix #44
Browse files Browse the repository at this point in the history
  • Loading branch information
ruslankerimov committed Jul 8, 2015
1 parent 07c653f commit 441a964
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 5 deletions.
9 changes: 7 additions & 2 deletions dist/susanin.js
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,8 @@ Route.prototype._parsePattern = function(pattern, isOptional) {
i = 0, j, size,
countOpened = 0,
isFindingClosed = false,
length = pattern.length;
length = pattern.length,
what;

while (i < length) {
character = pattern.charAt(i++);
Expand All @@ -354,8 +355,12 @@ Route.prototype._parsePattern = function(pattern, isOptional) {
parts.push(part);

for (j = 0, size = part.parts.length; j < size; ++j) {
if (part.parts[j] && part.parts[j].what === 'param') {
what = part.parts[j] && part.parts[j].what;

if (what === 'param') {
part.dependOnParams.push(part.parts[j].name);
} else if (what === 'optional') {
part.dependOnParams.push.apply(part.dependOnParams, part.parts[j].dependOnParams);
}
}

Expand Down
2 changes: 1 addition & 1 deletion dist/susanin.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 7 additions & 2 deletions lib/route.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,8 @@ Route.prototype._parsePattern = function(pattern, isOptional) {
i = 0, j, size,
countOpened = 0,
isFindingClosed = false,
length = pattern.length;
length = pattern.length,
what;

while (i < length) {
character = pattern.charAt(i++);
Expand All @@ -220,8 +221,12 @@ Route.prototype._parsePattern = function(pattern, isOptional) {
parts.push(part);

for (j = 0, size = part.parts.length; j < size; ++j) {
if (part.parts[j] && part.parts[j].what === 'param') {
what = part.parts[j] && part.parts[j].what;

if (what === 'param') {
part.dependOnParams.push(part.parts[j].name);
} else if (what === 'optional') {
part.dependOnParams.push.apply(part.dependOnParams, part.parts[j].dependOnParams);
}
}

Expand Down
30 changes: 30 additions & 0 deletions test/route.build.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ describe('route.build()', function() {
});

assert.strictEqual(route.build(), '/opa/value');
assert.strictEqual(route.build({ param : 'value' }), '/opa/value');
assert.strictEqual(route.build({ param : 'bar' }), '/opa/bar');
assert.strictEqual(route.build({ param : 'bar', foo1 : [ 'bar1', 'bar2' ], foo2 : [ 'bar3' ] }),
'/opa/bar?foo1=bar1&foo1=bar2&foo2=bar3');
Expand Down Expand Up @@ -83,6 +84,7 @@ describe('route.build()', function() {
});

assert.strictEqual(route.build(), '/opa');
assert.strictEqual(route.build({ param : 'value' }), '/opa');
assert.strictEqual(route.build({ param : 'bar' }), '/opa/opapa/bar');
assert.strictEqual(route.build({ param : 'bar', foo1 : [ 'bar1', 'bar2' ], foo2 : [ 'bar3' ] }),
'/opa/opapa/bar?foo1=bar1&foo1=bar2&foo2=bar3');
Expand Down Expand Up @@ -113,15 +115,43 @@ describe('route.build()', function() {
});

assert.strictEqual(route.build(), '/opa');
assert.strictEqual(route.build({ param1 : 'value1' }), '/opa');
assert.strictEqual(route.build({ param2 : 'value2' }), '/opa');
assert.strictEqual(route.build({ param1 : 'bar' }), '/opa/opapa/bar');
assert.strictEqual(route.build({ param2 : 'bar' }), '/opa/bar');
assert.strictEqual(route.build({ param1 : 'value1', param2 : 'value2' }), '/opa');
assert.strictEqual(route.build({ param1 : 'value1', param2 : 'bar' }), '/opa/bar');
assert.strictEqual(route.build({ param1 : 'bar', param2 : 'value2' }), '/opa/opapa/bar');
assert.strictEqual(route.build({ param1 : 'bar1', param2 : 'bar2' }), '/opa/opapa/bar1/bar2');
assert.strictEqual(route.build({ param1 : 'bar', foo1 : [ 'bar1', 'bar2' ], foo2 : [ 'bar3' ] }),
'/opa/opapa/bar?foo1=bar1&foo1=bar2&foo2=bar3');

done();
});

it('/opa(/opapa/<param1>(/<param2>)) and defaults', function(done) {
var route = Route({
pattern : '/opa(/opapa/<param1>(/<param2>))',
defaults : {
param1 : 'value1',
param2 : 'value2'
}
});

assert.strictEqual(route.build(), '/opa');
assert.strictEqual(route.build({ param1 : 'value1' }), '/opa');
assert.strictEqual(route.build({ param2 : 'value2' }), '/opa');
assert.strictEqual(route.build({ param1 : 'bar' }), '/opa/opapa/bar');
assert.strictEqual(route.build({ param2 : 'bar' }), '/opa/opapa/value1/bar');
assert.strictEqual(route.build({ param1 : 'value1', param2 : 'value2' }), '/opa');
assert.strictEqual(route.build({ param1 : 'value1', param2 : 'bar' }), '/opa/opapa/value1/bar');
assert.strictEqual(route.build({ param1 : 'bar', param2 : 'value2' }), '/opa/opapa/bar');
assert.strictEqual(route.build({ param1 : 'bar', foo1 : [ 'bar1', 'bar2' ], foo2 : [ 'bar3' ] }),
'/opa/opapa/bar?foo1=bar1&foo1=bar2&foo2=bar3');

done();
});

it('Unsupported characters in params name', function(done) {
[ '+', '.', ',', ' ' ].forEach(function(character) {
var paramName = 'param' + character,
Expand Down

0 comments on commit 441a964

Please sign in to comment.