controller.class.test.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. const testLogger = Logger.getInstance('test');
  8. Deno.test('Controller class', async () => {
  9. const mockHandler = (req: Request) => new Response('Hello, world!');
  10. const mockHandlers = {
  11. '/_GET': mockHandler,
  12. '/x_POST': mockHandler,
  13. };
  14. const controller = new Controller({}, testLogger);
  15. controller.setHandlers(mockHandlers);
  16. // Test that the handler was stored correctly
  17. assert(controller.hasHandler('/', 'GET'));
  18. assertEquals(controller.getHandlers(), mockHandlers);
  19. // Test the response method
  20. const req = new Request('http://localhost/');
  21. const res = controller.response(req, 'Hello, world!');
  22. assertEquals(res.status, 200);
  23. assertEquals(
  24. new TextDecoder().decode(new Uint8Array(await res.arrayBuffer())),
  25. 'Hello, world!',
  26. );
  27. // Test the responseJSON method
  28. const jsonRes = controller.responseJSON(req, { message: 'Hello, world!' });
  29. assertEquals(jsonRes.status, 200);
  30. assertEquals(await jsonRes.json(), { message: 'Hello, world!' });
  31. // Test basic auth username / password
  32. const authReq = new Request('http://localhost/', {
  33. headers: {
  34. Authorization: 'Basic ZGVtbzpwQDU1dzByZA==',
  35. },
  36. });
  37. const authRes = controller.response(authReq, 'Hello, world!');
  38. assertEquals(authRes.status, 200);
  39. const lastMessage = testLogger.getLastMessage();
  40. assert(lastMessage?.startsWith('[INFO] GET / demo '));
  41. });
  42. Deno.test('Controller class error handling', async () => {
  43. const error = new Error('Test error');
  44. const errorHandler = (
  45. req: Request,
  46. error?: string,
  47. headers?: Record<string, string>,
  48. ): Response => {
  49. return controller.response(req, error ?? 'Unknown error', {
  50. status: HTTPStatus.InternalServerError,
  51. });
  52. };
  53. const controller = new Controller();
  54. controller.setHandler('/', 'GET', errorHandler);
  55. // Test that the handler was stored correctly
  56. assert(controller.hasHandler('/', 'GET'));
  57. // Test the error response method
  58. const req = new Request('http://localhost/');
  59. const handler = controller.getHandler('/', 'GET');
  60. if (handler) {
  61. const res = await handler(req, error.message);
  62. assertEquals(res.status, HTTPStatus.InternalServerError);
  63. assertEquals(
  64. new TextDecoder().decode(new Uint8Array(await res.arrayBuffer())),
  65. error.message,
  66. );
  67. } else {
  68. assert(false, 'Handler not found');
  69. }
  70. });
  71. Deno.test({
  72. name: 'Controller should log debug message for health check user agent',
  73. fn: async () => {
  74. const userAgent = Deno.env.get('DOCKER_USER_AGENT') ?? '';
  75. const req = new Request('http://localhost', {
  76. method: 'GET',
  77. headers: new Headers({
  78. 'User-Agent': userAgent,
  79. }),
  80. });
  81. const handler: ControllerHandler = (req: Request) => {
  82. return controller.response(req, 'Hello, World!');
  83. };
  84. const controller = new Controller({ '/_GET': handler }, testLogger);
  85. const response = await controller.getHandler('/', 'GET')(req);
  86. // Check if the expected debug message was logged
  87. const debugMessage = testLogger.getMessages().find((message) =>
  88. message.startsWith('[DEBUG] ') && message.endsWith(`(${userAgent})`)
  89. );
  90. assert(debugMessage !== undefined, 'Expected debug message was not logged');
  91. assertEquals(response.status, 200);
  92. },
  93. });