Skip to content

Commit dfeedac

Browse files
committed
Replace 'null' with empty string
Fixes #51
1 parent 8d262cc commit dfeedac

File tree

4 files changed

+255
-234
lines changed

4 files changed

+255
-234
lines changed

Resources/js/router.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,13 @@ fos.Router.prototype.generate = function(name, opt_params, absolute) {
181181
var empty = true === value || false === value || '' === value;
182182

183183
if (!empty || !optional) {
184-
url = token[1] + encodeURIComponent(value).replace(/%2F/g, '/') + url;
184+
var encodedValue = encodeURIComponent(value).replace(/%2F/g, '/');
185+
186+
if ('null' === encodedValue && null === value) {
187+
encodedValue = '';
188+
}
189+
190+
url = token[1] + encodedValue + url;
185191
}
186192

187193
optional = false;

Resources/js/router.test.js

Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
goog.require('goog.testing.jsunit');
2+
3+
function testGenerate() {
4+
var router = new fos.Router({base_url: ''}, {
5+
literal: {
6+
tokens: [['text', '/homepage']],
7+
defaults: {},
8+
requirements: {}
9+
}
10+
});
11+
12+
assertEquals('/homepage', router.generate('literal'));
13+
}
14+
15+
function testGenerateWithParams() {
16+
var router = new fos.Router({base_url: ''}, {
17+
blog_post: {
18+
tokens: [['variable', '/', '[^/]+?', 'slug'], ['text', '/blog-post']],
19+
defaults: {},
20+
requirements: {}
21+
}
22+
});
23+
24+
assertEquals('/blog-post/foo', router.generate('blog_post', {slug: 'foo'}));
25+
}
26+
27+
function testGenerateUsesBaseUrl() {
28+
var router = new fos.Router({base_url: '/foo'}, {
29+
homepage: {
30+
tokens: [['text', '/bar']],
31+
defaults: {},
32+
requirements: {}
33+
}
34+
});
35+
36+
assertEquals('/foo/bar', router.generate('homepage'));
37+
}
38+
39+
function testGenerateUsesSchemeRequirements() {
40+
var router = new fos.Router({base_url: '/foo', host: "localhost"}, {
41+
homepage: {
42+
tokens: [['text', '/bar']],
43+
defaults: {},
44+
requirements: {"_scheme": "https"}
45+
}
46+
});
47+
48+
assertEquals('https://localhost/foo/bar', router.generate('homepage'));
49+
}
50+
51+
function testGenerateUsesAbsoluteUrl() {
52+
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
53+
homepage: {
54+
tokens: [['text', '/bar']],
55+
defaults: {},
56+
requirements: {}
57+
}
58+
});
59+
60+
assertEquals('http://localhost/foo/bar', router.generate('homepage', [], true));
61+
}
62+
63+
function testGenerateWithOptionalTrailingParam() {
64+
var router = new fos.Router({base_url: ''}, {
65+
posts: {
66+
tokens: [['variable', '.', '', '_format'], ['text', '/posts']],
67+
defaults: {},
68+
requirements: {}
69+
}
70+
});
71+
72+
assertEquals('/posts', router.generate('posts'));
73+
assertEquals('/posts.json', router.generate('posts', {'_format': 'json'}));
74+
}
75+
76+
function testGenerateQueryStringWithoutDefaults() {
77+
var router = new fos.Router({base_url: ''}, {
78+
posts: {
79+
tokens: [['variable', '/', '[1-9]+[0-9]*', 'page'], ['text', '/blog-posts']],
80+
defaults: {'page' : 1},
81+
requirements: {}
82+
}
83+
});
84+
85+
assertEquals('/blog-posts?extra=1', router.generate('posts', {page: 1, extra: 1}));
86+
}
87+
88+
function testAllowSlashes() {
89+
var router = new fos.Router({base_url: ''}, {
90+
posts: {
91+
tokens: [['variable', '/', '.+', 'id'], ['text', '/blog-post']],
92+
defaults: {},
93+
requirements: {}
94+
}
95+
});
96+
97+
assertEquals('/blog-post/foo/bar', router.generate('posts', {id: 'foo/bar'}));
98+
}
99+
100+
function testGenerateWithExtraParams() {
101+
var router = new fos.Router(undefined, {
102+
foo: {
103+
tokens: [['variable', '/', '', 'bar']],
104+
defaults: {},
105+
requirements: {}
106+
}
107+
});
108+
109+
assertEquals('/baz?foo=bar', router.generate('foo', {
110+
bar: 'baz',
111+
foo: 'bar'
112+
}));
113+
}
114+
115+
function testGenerateWithExtraParamsDeep() {
116+
var router = new fos.Router(undefined, {
117+
foo: {
118+
tokens: [['variable', '/', '', 'bar']],
119+
defaults: {},
120+
requirements: {}
121+
}
122+
});
123+
124+
assertEquals('/baz?foo%5B%5D=1&foo%5B1%5D%5B%5D=1&foo%5B1%5D%5B%5D=2&foo%5B1%5D%5B%5D=3&foo%5B1%5D%5B%5D=foo&foo%5B%5D=3&foo%5B%5D=4&foo%5B%5D=bar&foo%5B5%5D%5B%5D=1&foo%5B5%5D%5B%5D=2&foo%5B5%5D%5B%5D=3&foo%5B5%5D%5B%5D=baz&baz%5Bfoo%5D=bar+foo&baz%5Bbar%5D=baz&bob=cat', router.generate('foo', {
125+
bar: 'baz', // valid param, not included in the query string
126+
foo: [1, [1, 2, 3, 'foo'], 3, 4, 'bar', [1, 2, 3, 'baz']],
127+
baz: {
128+
foo : 'bar foo',
129+
bar : 'baz'
130+
},
131+
bob: 'cat'
132+
}));
133+
}
134+
135+
function testGenerateThrowsErrorWhenRequiredParameterWasNotGiven() {
136+
var router = new fos.Router({base_url: ''}, {
137+
foo: {
138+
tokens: [['text', '/moo'], ['variable', '/', '', 'bar']],
139+
defaults: {},
140+
requirements: {}
141+
}
142+
});
143+
144+
try {
145+
router.generate('foo');
146+
fail('generate() was expected to throw an error, but has not.');
147+
} catch (e) {
148+
assertEquals('The route "foo" requires the parameter "bar".', e.message);
149+
}
150+
}
151+
152+
function testGenerateThrowsErrorForNonExistentRoute() {
153+
var router = new fos.Router({base_url: ''}, {});
154+
155+
try {
156+
router.generate('foo');
157+
fail('generate() was expected to throw an error, but has not.');
158+
} catch (e) { }
159+
}
160+
161+
function testGetBaseUrl() {
162+
var router = new fos.Router({base_url: '/foo'}, {
163+
homepage: {
164+
tokens: [['text', '/bar']],
165+
defaults: {},
166+
requirements: {}
167+
}
168+
});
169+
170+
assertEquals('/foo', router.getBaseUrl());
171+
}
172+
173+
function testGeti18n() {
174+
var router = new fos.Router({base_url: '/foo', prefix: 'en__RG__'}, {
175+
en__RG__homepage: {
176+
tokens: [['text', '/bar']],
177+
defaults: {},
178+
requirements: {}
179+
},
180+
es__RG__homepage: {
181+
tokens: [['text', '/es/bar']],
182+
defaults: {},
183+
requirements: {}
184+
},
185+
_admin: {
186+
tokens: [['text', '/admin']],
187+
defaults: {},
188+
requirements: {}
189+
}
190+
});
191+
192+
assertEquals('/foo/bar', router.generate('homepage'));
193+
assertEquals('/foo/admin', router.generate('_admin'));
194+
195+
router.setPrefix('es__RG__');
196+
assertEquals('/foo/es/bar', router.generate('homepage'));
197+
}
198+
199+
function testGetRoute() {
200+
var router = new fos.Router({base_url: ''}, {
201+
blog_post: {
202+
tokens: [['variable', '/', '[^/]+?', 'slug'], ['text', '/blog-post']],
203+
defaults: {},
204+
requirements: {"_scheme": "http"}
205+
}
206+
});
207+
208+
var expected = {
209+
'defaults': {},
210+
'tokens' : [
211+
['variable', '/', '[^/]+?', 'slug'],
212+
['text', '/blog-post']
213+
],
214+
'requirements': {"_scheme": "http"}
215+
};
216+
217+
assertObjectEquals(expected, router.getRoute('blog_post'));
218+
}
219+
220+
function testGenerateWithNullValue() {
221+
var router = new fos.Router({base_url: ''}, {
222+
posts: {
223+
tokens: [
224+
['variable', '/', '.+', 'id'],
225+
['variable', '/', '.+', 'page'],
226+
['text', '/blog-post']
227+
],
228+
defaults: {},
229+
requirements: {}
230+
}
231+
});
232+
233+
assertEquals('/blog-post//10', router.generate('posts', { page: null, id: 10 }));
234+
}

0 commit comments

Comments
 (0)