route-registry.spec.js 2.9 KB

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