UNPKG

@tdb/util

Version:
346 lines 14.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var _1 = require("."); var test_1 = require("../../test"); describe('url.Route', function () { describe('constructor', function () { it('default values', function () { var route = _1.Route.create(' /foo/:id '); test_1.expect(route.method).to.eql('GET'); test_1.expect(route.path).to.eql('/foo/:id'); test_1.expect(route.toString()).to.eql('/foo/:id'); test_1.expect(route.title).to.eql(undefined); test_1.expect(route.docs).to.eql(undefined); test_1.expect(route.description).to.eql(undefined); test_1.expect(route.meta).to.eql({}); }); it('given values', function () { var route = _1.Route.create('/foo/:id', { title: 'My Title', docs: '/docs', description: 'Does...', meta: { foo: 123 }, }); test_1.expect(route.title).to.eql('My Title'); test_1.expect(route.docs).to.eql('/docs'); test_1.expect(route.description).to.eql('Does...'); test_1.expect(route.meta).to.eql({ foo: 123 }); }); it('sets REST method', function () { var route = _1.Route.create('/foo/:id', { method: 'POST' }); test_1.expect(route.method).to.eql('POST'); }); it('symbols', function () { var route = _1.Route.create('/foo/:id', { schema: { params: 'IFoo', query: 'IBam', data: 'IBoo' }, }); test_1.expect(route.schema.params).to.eql('IFoo'); test_1.expect(route.schema.query).to.eql('IBam'); test_1.expect(route.schema.data).to.eql('IBoo'); }); it('title/docs', function () { var route = _1.Route.create('/foo/:id', { title: 'MyRoute', docs: '/docs/my-route', }); test_1.expect(route.title).to.eql('MyRoute'); test_1.expect(route.docs).to.eql('/docs/my-route'); }); }); describe('clone', function () { it('clones with same values', function () { var route = _1.Route.create('/foo/:id'); var clone = route.clone(); test_1.expect(route).to.not.equal(clone); }); it('clones with new value', function () { var route = _1.Route.create('/foo/:id', {}); var clone = route.clone({ path: '/bar' }); test_1.expect(route).to.not.equal(clone); test_1.expect(clone.path).to.eql('/bar'); }); }); describe('toObject', function () { it('with default values', function () { var route = _1.Route.create('/'); var obj = route.toObject(); test_1.expect(obj.path).to.eql('/'); test_1.expect(obj.method).to.eql('GET'); test_1.expect(obj.tokens).to.eql(['/']); test_1.expect(obj.schema).to.eql({}); }); it('with specific values', function () { var route = _1.Route.create('/foo/:id', { method: 'POST', schema: { params: 'IFoo' }, }); var obj = route.toObject(); test_1.expect(obj.path).to.eql('/foo/:id'); test_1.expect(obj.method).to.eql('POST'); test_1.expect(obj.tokens.length).to.eql(2); test_1.expect(obj.tokens[0]).to.eql('/foo'); test_1.expect(obj.tokens[1]).to.eql({ name: 'id', prefix: '/', delimiter: '/', optional: false, repeat: false, partial: false, }); test_1.expect(obj.schema).to.eql({ params: 'IFoo' }); }); }); describe('isMatch', function () { var test = function (url, result, options) { var route = _1.Route.create('/foo/:id', tslib_1.__assign({}, options)); test_1.expect(route.isMatch(url)).to.eql(result); }; it('is a match', function () { test('/foo/123', true); test('/foo/abc', true); test('/foo/abc?q=123', true); test('/foo/abc/', true, { strict: false }); test('/Foo/bar', true, { caseSensitive: false }); }); it('is not a match', function () { test(undefined, false); test('', false); test('/', false); test('/foobar', false); test('/foo/abc/', false); test('/Foo/bar', false); }); it('multi-part', function () { var route = _1.Route.create('/o/:name/:path*'); var path = '/o/acme/foo/bar'; test_1.expect(route.isMatch(path)).to.eql(true); test_1.expect(route.params(path)).to.eql({ name: 'acme', path: 'foo/bar' }); }); }); describe('params (strongly typed)', function () { var route = _1.Route.create('/foo/:org/:id'); it('no url (undefined}', function () { var res = route.params(); test_1.expect(res).to.eql({}); }); it(':id as string', function () { var res = route.params('/foo/ibm/hello'); test_1.expect(res.org).to.eql('ibm'); test_1.expect(res.id).to.eql('hello'); }); it(':id as number', function () { var res = route.params('/foo/ibm/123'); test_1.expect(res.org).to.eql('ibm'); test_1.expect(res.id).to.eql(123); }); it(':id as boolean', function () { var res = route.params('/foo/ibm/TruE'); test_1.expect(res.org).to.eql('ibm'); test_1.expect(res.id).to.eql(true); }); it('has escaped colon (:) in route', function () { var route = _1.Route.create('/foo::id'); var res = route.params('/foo:123'); test_1.expect(res).to.eql({ id: 123 }); }); }); describe('params', function () { it('wildcard (*)', function () { var route = _1.Route.create('/foo/:bar*'); var res = route.params('/foo/bar/bax'); test_1.expect(res.bar).to.eql('bar/bax'); }); it('removes query-string', function () { var route = _1.Route.create('/foo/:id?q=:srch'); var res = route.params('/foo/123?q=search'); test_1.expect(res.id).to.eql(123); }); }); describe('query', function () { var route = _1.Route.create('/foo/:id'); it('as string', function () { var query = route.query('/foo/123?q=abc'); test_1.expect(query.q).to.eql('abc'); }); it('as number', function () { var query = route.query('/foo/123?q=456'); test_1.expect(query.q).to.eql(456); }); it('as boolean', function () { var query = route.query('/foo/123?q=truE'); test_1.expect(query.q).to.eql(true); }); it('flag', function () { var test = function (url, result) { var query = route.query(url); test_1.expect(query.force).to.eql(result); }; test('/foo?force', true); test('/foo?force=true', true); test('/foo?force=false', false); test('/foo', undefined); }); }); describe('url', function () { var URL = '/foo/123?q=hello&force'; var route = _1.Route.create('/foo/:id', {}); var url = route.url(URL); it('creates URL', function () { test_1.expect(url.route).to.eql(route); test_1.expect(url.path).to.eql(URL); test_1.expect(url.toString()).to.eql(URL); test_1.expect(url.params).to.eql({ id: 123 }); test_1.expect(url.query).to.eql({ q: 'hello', force: true }); }); it('url with origin (domain)', function () { var complete = "http://localhost:3000/foo/123?q=hello&force"; var res1 = url.toString({ origin: 'http://localhost:3000' }); var res2 = url.toString({ origin: 'http://localhost:3000/' }); var res3 = url.toString({ origin: 'http://localhost:3000///' }); test_1.expect(res1).to.eql(complete); test_1.expect(res2).to.eql(complete); test_1.expect(res3).to.eql(complete); }); it('hasFlag', function () { test_1.expect(url.hasFlag('force')).to.eql(true); test_1.expect(url.hasFlag('f')).to.eql(false); test_1.expect(url.hasFlag(['f', 'force'])).to.eql(true); test_1.expect(url.hasFlag()).to.eql(false); test_1.expect(url.hasFlag('bob')).to.eql(false); }); }); describe('toUrl', function () { var route = _1.Route.create('/foo/:org/:id'); it('no params (error)', function () { var fn = function () { route.toUrl({ params: {} }); }; test_1.expect(fn).to.throw(/Expected "org"/); }); it('params only', function () { var url = route.toUrl({ params: { org: 'acme', id: 123 }, }).s; test_1.expect(url).to.eql('/foo/acme/123'); }); it('query as [:param]', function () { var route = _1.Route.create('/manifest?path=:path&markdown'); var url = route.toUrl({ params: { path: '/my/path' } }); test_1.expect(url.toString()).to.eql('/manifest?path=%2Fmy%2Fpath&markdown'); test_1.expect(url.query).to.eql({ path: '/my/path', markdown: true }); test_1.expect(url.params).to.eql({ path: '%2Fmy%2Fpath' }); }); it('query as [:param] as well as {object}', function () { var route = _1.Route.create('/manifest?path=:path&markdown'); var url = route.toUrl({ params: { path: '**' }, query: { s: 'find' }, }); test_1.expect(url.toString()).to.eql('/manifest?path=**&markdown&s=find'); test_1.expect(url.query).to.eql({ path: '**', markdown: true, s: 'find' }); }); it('encoded', function () { var org = 'café verona'; var url = route.toUrl({ params: { org: org, id: 123 }, }).s; test_1.expect(url).to.eql('/foo/caf%C3%A9%20verona/123'); test_1.expect(decodeURI(url)).to.eql('/foo/café verona/123'); }); it('params and query-string', function () { var url = route .toUrl({ params: { org: 'acme', id: 123 }, query: { q: 'search' }, }) .toString(); test_1.expect(url).to.eql('/foo/acme/123?q=search'); }); it('multi part query-string', function () { var url = route .toUrl({ params: { org: 'acme', id: 123 }, query: { q: 'hello', f: true }, }) .toString(); test_1.expect(url).to.eql('/foo/acme/123?q=hello&f=true'); }); it('query-string with no value (undeined)', function () { var url = route .toUrl({ params: { org: 'acme', id: 123 }, query: { q: 'hello', f: undefined }, }) .toString(); test_1.expect(url).to.eql('/foo/acme/123?q=hello'); }); it('encoded query-string', function () { var url = route .toUrl({ params: { org: 'acme', id: 123 }, query: { q: 'foo bar' }, }) .toString(); test_1.expect(url).to.eql('/foo/acme/123?q=foo%20bar'); }); it('has no origin by default', function () { var url = route.toUrl({ params: { org: 'acme', id: 123 } }); test_1.expect(url.origin).to.eql(undefined); test_1.expect(url.toString()).to.eql('/foo/acme/123'); }); it('sets a default origin', function () { var url = route.toUrl({ params: { org: 'acme', id: 123 }, origin: 'http://localhost:8080//', }); test_1.expect(url.origin).to.eql('http://localhost:8080'); test_1.expect(url.toString()).to.eql('http://localhost:8080/foo/acme/123'); test_1.expect(url.toString({ origin: 'localhost:3000' })).to.eql('localhost:3000/foo/acme/123'); }); }); describe('walk/map/find', function () { var TREE = { id: 123, foo: _1.Route.create('/foo'), bar: { baz: _1.Route.create('/foo/bar'), label: 'Hello', zoo: { child: _1.Route.create('/deep'), }, }, }; it('walks a tree', function () { var routes = []; _1.Route.walk(TREE, function (route) { return (routes = routes.concat([route])); }); test_1.expect(routes.length).to.eql(3); test_1.expect(routes[0].path).to.eql('/foo'); test_1.expect(routes[1].path).to.eql('/foo/bar'); test_1.expect(routes[2].path).to.eql('/deep'); }); it('walks a tree and stops before end', function () { var count = 0; _1.Route.walk(TREE, function (route, e) { if (count >= 1) { e.stop(); } count++; }); test_1.expect(count).to.eql(2); }); it('maps a tree', function () { var res = _1.Route.map(TREE, function (route) { return route.path; }); test_1.expect(res).to.eql(['/foo', '/foo/bar', '/deep']); }); it('finds a route', function () { var res1 = _1.Route.find(TREE, function (r) { return r.path.startsWith('/foo'); }); var res2 = _1.Route.find(TREE, function (r) { return r.path.startsWith('/deep'); }); var res3 = _1.Route.find(TREE, function (r) { return r.path.startsWith('/__NOT_EXIST__'); }); test_1.expect(res1 && res1.path).to.eql('/foo'); test_1.expect(res2 && res2.path).to.eql('/deep'); test_1.expect(res3).to.eql(undefined); }); }); }); //# sourceMappingURL=Route.test.js.map