@tdb/util
Version:
Shared helpers and utilities.
346 lines • 14.6 kB
JavaScript
;
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