route-registry.spec.js 2.9 KB

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