Explorar o código

maximize test coverage for controller class

Richard Köhl %!s(int64=2) %!d(string=hai) anos
pai
achega
5b38c4bd12

+ 4 - 0
src/infrastructure/logger.ts

@@ -82,6 +82,10 @@ export class Logger {
   public getMessages(): string[] {
     return this.messages;
   }
+
+  public getLastMessage(): string | undefined {
+    return this.messages.slice(-1)[0];
+  }
 }
 
 export const logger = Logger.getInstance();

+ 2 - 1
src/interfaces/router.ts

@@ -1,8 +1,9 @@
 import controllers from 'if/controllers/index.ts';
 import { ControllerErrors } from 'if/controllers/errors.controller.ts';
+import { ControllerHandler } from './controllers/controller.class.ts';
 
 // Preprocess controllers into a map
-const controllerMap = new Map();
+const controllerMap: Map<string, ControllerHandler> = new Map();
 for (const controller of controllers) {
   for (const [key, handler] of Object.entries(controller.getHandlers())) {
     controllerMap.set(key, handler);

+ 24 - 10
test/interfaces/controllers/controller.class.test.ts

@@ -6,14 +6,21 @@ import Controller, {
 } from 'if/controllers/controller.class.ts';
 import { Logger } from 'infra/logger.ts';
 
+const testLogger = Logger.getInstance('test');
+
 Deno.test('Controller class', async () => {
   const mockHandler = (req: Request) => new Response('Hello, world!');
-  const controller = new Controller({
+  const mockHandlers = {
     '/_GET': mockHandler,
-  });
+    '/x_POST': mockHandler,
+  };
+
+  const controller = new Controller({}, testLogger);
+  controller.setHandlers(mockHandlers);
 
   // Test that the handler was stored correctly
   assert(controller.hasHandler('/', 'GET'));
+  assertEquals(controller.getHandlers(), mockHandlers);
 
   // Test the response method
   const req = new Request('http://localhost/');
@@ -28,6 +35,17 @@ Deno.test('Controller class', async () => {
   const jsonRes = controller.responseJSON(req, { message: 'Hello, world!' });
   assertEquals(jsonRes.status, 200);
   assertEquals(await jsonRes.json(), { message: 'Hello, world!' });
+
+  // Test basic auth username / password
+  const authReq = new Request('http://localhost/', {
+    headers: {
+      Authorization: 'Basic ZGVtbzpwQDU1dzByZA==',
+    },
+  });
+  const authRes = controller.response(authReq, 'Hello, world!');
+  assertEquals(authRes.status, 200);
+  const lastMessage = testLogger.getLastMessage();
+  assert(lastMessage?.startsWith('[INFO] GET / demo '));
 });
 
 Deno.test('Controller class error handling', async () => {
@@ -42,9 +60,8 @@ Deno.test('Controller class error handling', async () => {
     });
   };
 
-  const controller = new Controller({
-    '/_GET': errorHandler,
-  });
+  const controller = new Controller();
+  controller.setHandler('/', 'GET', errorHandler);
 
   // Test that the handler was stored correctly
   assert(controller.hasHandler('/', 'GET'));
@@ -67,10 +84,7 @@ Deno.test('Controller class error handling', async () => {
 Deno.test({
   name: 'Controller should log debug message for health check user agent',
   fn: async () => {
-    let logger = Logger.getInstance('test');
-
     const userAgent = Deno.env.get('DOCKER_USER_AGENT') ?? '';
-    console.log(userAgent);
     const req = new Request('http://localhost', {
       method: 'GET',
       headers: new Headers({
@@ -80,11 +94,11 @@ Deno.test({
     const handler: ControllerHandler = (req: Request) => {
       return controller.response(req, 'Hello, World!');
     };
-    const controller = new Controller({ '/_GET': handler }, logger);
+    const controller = new Controller({ '/_GET': handler }, testLogger);
     const response = await controller.getHandler('/', 'GET')(req);
 
     // Check if the expected debug message was logged
-    const debugMessage = logger.getMessages().find((message) =>
+    const debugMessage = testLogger.getMessages().find((message) =>
       message.startsWith('[DEBUG] ') && message.endsWith(`(${userAgent})`)
     );