controller.class.test.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { assert, assertEquals } from 'test-deps';
  2. import { HTTPStatus } from 'deps';
  3. import Controller, {
  4. ControllerHandler,
  5. } from 'if/controllers/controller.class.ts';
  6. import { Logger } from 'infra/logger.ts';
  7. Deno.test('Controller class', async () => {
  8. const mockHandler = (req: Request) => new Response('Hello, world!');
  9. const controller = new Controller({
  10. '/_GET': mockHandler,
  11. });
  12. // Test that the handler was stored correctly
  13. assert(controller.hasHandler('/', 'GET'));
  14. // Test the response method
  15. const req = new Request('http://localhost/');
  16. const res = controller.response(req, 'Hello, world!');
  17. assertEquals(res.status, 200);
  18. assertEquals(
  19. new TextDecoder().decode(new Uint8Array(await res.arrayBuffer())),
  20. 'Hello, world!',
  21. );
  22. // Test the responseJSON method
  23. const jsonRes = controller.responseJSON(req, { message: 'Hello, world!' });
  24. assertEquals(jsonRes.status, 200);
  25. assertEquals(await jsonRes.json(), { message: 'Hello, world!' });
  26. });
  27. Deno.test('Controller class error handling', async () => {
  28. const error = new Error('Test error');
  29. const errorHandler = (
  30. req: Request,
  31. error?: string,
  32. headers?: Record<string, string>,
  33. ): Response => {
  34. return controller.response(req, error ?? 'Unknown error', {
  35. status: HTTPStatus.InternalServerError,
  36. });
  37. };
  38. const controller = new Controller({
  39. '/_GET': errorHandler,
  40. });
  41. // Test that the handler was stored correctly
  42. assert(controller.hasHandler('/', 'GET'));
  43. // Test the error response method
  44. const req = new Request('http://localhost/');
  45. const handler = controller.getHandler('/', 'GET');
  46. if (handler) {
  47. const res = await handler(req, error.message);
  48. assertEquals(res.status, HTTPStatus.InternalServerError);
  49. assertEquals(
  50. new TextDecoder().decode(new Uint8Array(await res.arrayBuffer())),
  51. error.message,
  52. );
  53. } else {
  54. assert(false, 'Handler not found');
  55. }
  56. });
  57. Deno.test({
  58. name: 'Controller should log debug message for health check user agent',
  59. fn: async () => {
  60. let logger = Logger.getInstance('test');
  61. const userAgent = Deno.env.get('DOCKER_USER_AGENT') ?? '';
  62. console.log(userAgent);
  63. const req = new Request('http://localhost', {
  64. method: 'GET',
  65. headers: new Headers({
  66. 'User-Agent': userAgent,
  67. }),
  68. });
  69. const handler: ControllerHandler = (req: Request) => {
  70. return controller.response(req, 'Hello, World!');
  71. };
  72. const controller = new Controller({ '/_GET': handler }, logger);
  73. const response = await controller.getHandler('/', 'GET')(req);
  74. // Check if the expected debug message was logged
  75. const debugMessage = logger.getMessages().find((message) =>
  76. message.startsWith('[DEBUG] ') && message.endsWith(`(${userAgent})`)
  77. );
  78. assert(debugMessage !== undefined, 'Expected debug message was not logged');
  79. assertEquals(response.status, 200);
  80. },
  81. });