goog.require('goog.testing.jsunit'); goog.require('goog.structs.Map'); function testGenerate() { var router = new fos.Router({base_url: ''}, { literal: { tokens: [['text', '/homepage']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('/homepage', router.generate('literal')); } function testGenerateWithParams() { var router = new fos.Router({base_url: ''}, { blog_post: { tokens: [['variable', '/', '[^/]+?', 'slug'], ['text', '/blog-post']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('/blog-post/foo', router.generate('blog_post', {slug: 'foo'})); } function testGenerateUsesBaseUrl() { var router = new fos.Router({base_url: '/foo'}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('/foo/bar', router.generate('homepage')); } function testGenerateUsesSchemeRequirements() { var router = new fos.Router({base_url: '/foo', host: "localhost"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {"_scheme": "https"}, hosttokens: [] } }); assertEquals('https://localhost/foo/bar', router.generate('homepage')); } function testGenerateUsesHost() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [['text', 'otherhost']] } }); assertEquals('http://otherhost/foo/bar', router.generate('homepage')); } function testGenerateUsesHostWhenTheSameSchemeRequirementGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {"_scheme": "http"}, hosttokens: [['text', 'otherhost']] } }); assertEquals('http://otherhost/foo/bar', router.generate('homepage')); } function testGenerateUsesHostWhenTheSameSchemeGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [['text', 'otherhost']], schemes: ['http'], methods: [] } }); assertEquals('http://otherhost/foo/bar', router.generate('homepage')); } function testGenerateUsesHostWhenAnotherSchemeRequirementGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {"_scheme": "https"}, hosttokens: [['text', 'otherhost']] } }); assertEquals('https://otherhost/foo/bar', router.generate('homepage')); } function testGenerateUsesHostWhenAnotherSchemeGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [['text', 'otherhost']], schemes: ['https'], methods: [] } }); assertEquals('https://otherhost/foo/bar', router.generate('homepage')); } function testGenerateSupportsHostPlaceholders() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [ ['text', '.localhost'], ['variable', '', '', 'subdomain'] ] } }); assertEquals('http://api.localhost/foo/bar', router.generate('homepage', {subdomain: 'api'})); } function testGenerateSupportsHostPlaceholdersDefaults() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {subdomain: 'api'}, requirements: {}, hosttokens: [ ['text', '.localhost'], ['variable', '', '', 'subdomain'] ] } }); assertEquals('http://api.localhost/foo/bar', router.generate('homepage')); } function testGenerateGeneratesRelativePathWhenTheSameHostGiven() { var router = new fos.Router({base_url: '/foo', host: "api.localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [ ['text', '.localhost'], ['variable', '', '', 'subdomain'] ] } }); assertEquals('/foo/bar', router.generate('homepage', {subdomain: 'api'})); } function testGenerateUsesAbsoluteUrl() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('http://localhost/foo/bar', router.generate('homepage', [], true)); } function testGenerateUsesAbsoluteUrlWithGivenPort() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http", port: "8000"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('http://localhost:8000/foo/bar', router.generate('homepage', [], true)); } function testGenerateUsesAbsoluteUrlWithGivenPortAndHostWithPort() { var router = new fos.Router({base_url: '/foo', host: "localhost:8080", scheme: "http", port: "8080"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('http://localhost:8080/foo/bar', router.generate('homepage', [], true)); } function testGenerateUsesAbsoluteUrlWhenSchemeRequirementGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {"_scheme": "http"}, hosttokens: [] } }); assertEquals('http://localhost/foo/bar', router.generate('homepage', [], true)); } function testGenerateUsesAbsoluteUrlWithGivenPortWhenSchemeRequirementGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http", port: "8080"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {"_scheme": "http"}, hosttokens: [] } }); assertEquals('http://localhost:8080/foo/bar', router.generate('homepage', [], true)); } function testGenerateUsesAbsoluteUrlWithGivenPortWhenSchemeRequirementAndHostWithPortGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost:8080", scheme: "http", port: "8080"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {"_scheme": "http"}, hosttokens: [] } }); assertEquals('http://localhost:8080/foo/bar', router.generate('homepage', [], true)); } function testGenerateUsesAbsoluteUrlWhenSchemeGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [], schemes: ['http'], methods: [] } }); assertEquals('http://localhost/foo/bar', router.generate('homepage', [], true)); } function testGenerateUsesAbsoluteUrlWithGivenPortWhenSchemeGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http", port:"1234"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [], schemes: ['http'], methods: [] } }); assertEquals('http://localhost:1234/foo/bar', router.generate('homepage', [], true)); } function testGenerateUsesAbsoluteUrlWithGivenPortWhenSchemeAndHostWithPortGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost:8080", scheme: "http", port:"8080"}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [], schemes: ['http'], methods: [] } }); assertEquals('http://localhost:8080/foo/bar', router.generate('homepage', [], true)); } function testGenerateWithOptionalTrailingParam() { var router = new fos.Router({base_url: ''}, { posts: { tokens: [['variable', '.', '', '_format'], ['text', '/posts']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('/posts', router.generate('posts')); assertEquals('/posts.json', router.generate('posts', {'_format': 'json'})); } function testGenerateQueryStringWithoutDefaults() { var router = new fos.Router({base_url: ''}, { posts: { tokens: [['variable', '/', '[1-9]+[0-9]*', 'page'], ['text', '/blog-posts']], defaults: {'page' : 1}, requirements: {}, hosttokens: [] } }); assertEquals('/blog-posts?extra=1', router.generate('posts', {page: 1, extra: 1})); } function testAllowSlashes() { var router = new fos.Router({base_url: ''}, { posts: { tokens: [['variable', '/', '.+', 'id'], ['text', '/blog-post']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('/blog-post/foo/bar', router.generate('posts', {id: 'foo/bar'})); } function testGenerateWithExtraParams() { var router = new fos.Router(undefined, { foo: { tokens: [['variable', '/', '', 'bar']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('/baz?foo=bar', router.generate('foo', { bar: 'baz', foo: 'bar' })); } function testGenerateWithExtraParamsDeep() { var router = new fos.Router(undefined, { foo: { tokens: [['variable', '/', '', 'bar']], defaults: {}, requirements: {}, hosttokens: [] } }); 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%20foo&baz%5Bbar%5D=baz&bob=cat', router.generate('foo', { bar: 'baz', // valid param, not included in the query string foo: [1, [1, 2, 3, 'foo'], 3, 4, 'bar', [1, 2, 3, 'baz']], baz: { foo : 'bar foo', bar : 'baz' }, bob: 'cat' })); } function testUrlEncoding() { // This test was copied from Symfony URL Generator // This tests the encoding of reserved characters that are used for delimiting of URI components (defined in RFC 3986) // and other special ASCII chars. These chars are tested as static text path, variable path and query param. var chars = '@:[]/()*\'" +,;-._~&$<>|{}%\\^`!?foo=bar#id'; var router = new fos.Router({base_url: '/app.php'}, { posts: { tokens: [['variable', '/', '.+', 'varpath'], ['text', '/'+chars]], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals( '/app.php/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id?query=@:%5B%5D/%28%29*%27%22%20%2B,;-._~%26%24%3C%3E%7C%7B%7D%25%5C%5E%60!?foo%3Dbar%23id', router.generate('posts', {varpath: chars, query: chars}) ); } function testGenerateThrowsErrorWhenRequiredParameterWasNotGiven() { var router = new fos.Router({base_url: ''}, { foo: { tokens: [['text', '/moo'], ['variable', '/', '', 'bar']], defaults: {}, requirements: {} } }); try { router.generate('foo'); fail('generate() was expected to throw an error, but has not.'); } catch (e) { assertEquals('The route "foo" requires the parameter "bar".', e.message); } } function testGenerateThrowsErrorForNonExistentRoute() { var router = new fos.Router({base_url: ''}, {}); try { router.generate('foo'); fail('generate() was expected to throw an error, but has not.'); } catch (e) { } } function testGetBaseUrl() { var router = new fos.Router({base_url: '/foo'}, { homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {} } }); assertEquals('/foo', router.getBaseUrl()); } function testGeti18n() { var router = new fos.Router({base_url: '/foo', prefix: 'en__RG__', locale: 'en'}, { en__RG__homepage: { tokens: [['text', '/bar']], defaults: {}, requirements: {}, hosttokens: [] }, es__RG__homepage: { tokens: [['text', '/es/bar']], defaults: {}, requirements: {}, hosttokens: [] }, _admin: { tokens: [['text', '/admin']], defaults: {}, requirements: {}, hosttokens: [] }, "login.en": { tokens: [['text', '/en/login']], defaults: {}, requirements: {}, hosttokens: [] }, "login.es": { tokens: [['text', '/es/login']], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('/foo/bar', router.generate('homepage')); assertEquals('/foo/admin', router.generate('_admin')); assertEquals('/foo/en/login', router.generate('login')); router.setPrefix('es__RG__'); router.setLocale('es'); assertEquals('/foo/es/bar', router.generate('homepage')); assertEquals('/foo/es/login', router.generate('login')); } function testGetRoute() { var router = new fos.Router({base_url: ''}, { blog_post: { tokens: [['variable', '/', '[^/]+?', 'slug'], ['text', '/blog-post']], defaults: {}, requirements: {"_scheme": "http"} } }); var expected = { 'defaults': {}, 'tokens' : [ ['variable', '/', '[^/]+?', 'slug'], ['text', '/blog-post'] ], 'requirements': {"_scheme": "http"} }; assertObjectEquals(expected, router.getRoute('blog_post')); } function testGetRoutes() { var router = new fos.Router({base_url: ''}, { blog_post: 'test', blog: 'test' }); var expected = new goog.structs.Map({ blog_post: 'test', blog: 'test' }); assertObjectEquals(expected.toObject(), router.getRoutes()); } function testGenerateWithNullValue() { var router = new fos.Router({base_url: ''}, { posts: { tokens: [ ['variable', '/', '.+', 'id'], ['variable', '/', '.+', 'page'], ['text', '/blog-post'] ], defaults: {}, requirements: {}, hosttokens: [] } }); assertEquals('/blog-post//10', router.generate('posts', { page: null, id: 10 })); } function testGenerateWithPort() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http", port: 443}, { homepage: { tokens: [['text', '/bar']], defaults: {subdomain: 'api'}, requirements: {}, hosttokens: [ ['text', '.localhost'], ['variable', '', '', 'subdomain'] ] } }); assertEquals('http://api.localhost:443/foo/bar', router.generate('homepage')); } // Regression test for issue #384 (https://github.com/FriendsOfSymfony/FOSJsRoutingBundle/issues/384) function testGenerateWithPortInHost() { var router = new fos.Router({base_url: '', host: "my-host.loc:81", scheme: "http", port: 81}, { homepage: { tokens: [['text', "\/foo\/"]], defaults: [], requirements: {}, hosttokens: [["text", "my-host.loc"]], methods: ["GET", "POST"], } }); assertEquals('/foo/', router.generate('homepage')); }