route-registry.spec.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import {Route} from './route.js';
  2. import {expect} from './chai.js';
  3. import {HttpMethod} from './route.js';
  4. import {format} from '@e22m4u/js-format';
  5. import {RouteRegistry} from './route-registry.js';
  6. import {ServiceContainer} from '@e22m4u/js-service';
  7. describe('RouteRegistry', function () {
  8. describe('defineRoute', function () {
  9. it('requires the first parameter to be an Object', function () {
  10. const s = new RouteRegistry();
  11. const throwable = v => () => s.defineRoute(v);
  12. const error = v =>
  13. format('The route definition should be an Object, but %s given.', v);
  14. expect(throwable('str')).to.throw(error('"str"'));
  15. expect(throwable('')).to.throw(error('""'));
  16. expect(throwable(10)).to.throw(error('10'));
  17. expect(throwable(0)).to.throw(error('0'));
  18. expect(throwable(true)).to.throw(error('true'));
  19. expect(throwable(false)).to.throw(error('false'));
  20. expect(throwable(null)).to.throw(error('null'));
  21. expect(throwable([])).to.throw(error('Array'));
  22. expect(throwable(undefined)).to.throw(error('undefined'));
  23. expect(throwable(() => undefined)).to.throw(error('Function'));
  24. throwable({
  25. method: HttpMethod.GET,
  26. path: '/path',
  27. handler: () => undefined,
  28. })();
  29. });
  30. it('returns a new route with the given "method", "path" and "handler"', function () {
  31. const s = new RouteRegistry();
  32. const method = HttpMethod.PATCH;
  33. const path = '/myPath';
  34. const handler = () => undefined;
  35. const route = s.defineRoute({method, path, handler});
  36. expect(route.method).to.be.eq(method);
  37. expect(route.path).to.be.eq(path);
  38. expect(route.handler).to.be.eq(handler);
  39. });
  40. it('adds a new route to the Trie', function () {
  41. const s = new RouteRegistry();
  42. const method = HttpMethod.PATCH;
  43. const path = '/myPath';
  44. const handler = () => undefined;
  45. const route = s.defineRoute({method, path, handler});
  46. const triePath = `${method}/${path}`;
  47. const res = s._trie.match(triePath);
  48. expect(typeof res).to.be.eq('object');
  49. expect(res.value).to.be.eq(route);
  50. });
  51. });
  52. describe('matchRouteByRequest', function () {
  53. it('returns the route and parsed parameters', function () {
  54. const s = new RouteRegistry(new ServiceContainer());
  55. const handler = () => undefined;
  56. s.defineRoute({
  57. method: HttpMethod.GET,
  58. path: '/foo/:p1/bar/:p2',
  59. handler,
  60. });
  61. const res = s.matchRouteByRequest({
  62. url: '/foo/baz/bar/qux',
  63. method: HttpMethod.GET,
  64. });
  65. expect(typeof res).to.be.eq('object');
  66. expect(res.route).to.be.instanceof(Route);
  67. expect(res.route.method).to.be.eq(HttpMethod.GET);
  68. expect(res.route.path).to.be.eq('/foo/:p1/bar/:p2');
  69. expect(res.route.handler).to.be.eq(handler);
  70. expect(res.params).to.be.eql({p1: 'baz', p2: 'qux'});
  71. });
  72. });
  73. });