diff --git a/src/main/java/school/hei/vola/endpoint/rest/controller/ErrorHandler.java b/src/main/java/school/hei/vola/endpoint/rest/controller/ErrorHandler.java new file mode 100644 index 0000000..64ed4d3 --- /dev/null +++ b/src/main/java/school/hei/vola/endpoint/rest/controller/ErrorHandler.java @@ -0,0 +1,37 @@ +package school.hei.vola.endpoint.rest.controller; + +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import school.hei.vola.endpoint.rest.security.UnauthorizedException; + +@ControllerAdvice +public class ErrorHandler { + + @ExceptionHandler(NotFoundException.class) + public String handleNotFoundException(Model model, HttpServletResponse response) { + model.addAttribute("status", HttpServletResponse.SC_NOT_FOUND); + model.addAttribute("error", "Not Found"); + model.addAttribute("errorMessage", "La ressource demandée est introuvable"); + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + return "error"; + } + + @ExceptionHandler(UnauthorizedException.class) + public String handleUnauthorizedException(Model model, HttpServletResponse response) { + model.addAttribute("status", HttpServletResponse.SC_UNAUTHORIZED); + model.addAttribute("error", "Unauthorized"); + model.addAttribute("errorMessage", "Accès non autorisé"); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return "error"; + } + + @ExceptionHandler(Exception.class) + public String handleException(Exception ex, Model model, HttpServletResponse response) { + var message = ex.getMessage() != null ? ex.getMessage() : ex.getClass().getSimpleName(); + model.addAttribute("errorMessage", message); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + return "error"; + } +} diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html new file mode 100644 index 0000000..e65015d --- /dev/null +++ b/src/main/resources/templates/error.html @@ -0,0 +1,55 @@ + + + + Vola - Erreur + + + + + + + + + +
+
+
+
+ error_outline +
+ +

Loza! Oops...

+ +
+ + Erreur - + +
+ +
+

+
+ +
+

+
+ + + arrow_back + Retour à l'accueil + +
+
+
+ + diff --git a/src/test/java/school/hei/vola/endpoint/rest/controller/ErrorHandlerTest.java b/src/test/java/school/hei/vola/endpoint/rest/controller/ErrorHandlerTest.java new file mode 100644 index 0000000..8d31406 --- /dev/null +++ b/src/test/java/school/hei/vola/endpoint/rest/controller/ErrorHandlerTest.java @@ -0,0 +1,67 @@ +package school.hei.vola.endpoint.rest.controller; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.ui.Model; + +class ErrorHandlerTest { + + private ErrorHandler errorHandler; + private Model model; + private HttpServletResponse response; + + @BeforeEach + void setUp() { + errorHandler = new ErrorHandler(); + model = mock(Model.class); + response = mock(HttpServletResponse.class); + } + + @Test + void handleException_setsStatus500_andErrorMessage() { + var exception = new RuntimeException("Test error"); + + var result = errorHandler.handleException(exception, model, response); + + assertEquals("error", result); + verify(response).setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + verify(model).addAttribute("errorMessage", "Test error"); + } + + @Test + void handleException_withNullMessage_usesClassName() { + var exception = new RuntimeException((String) null); + + var result = errorHandler.handleException(exception, model, response); + + assertEquals("error", result); + verify(response).setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + verify(model).addAttribute("errorMessage", "RuntimeException"); + } + + @Test + void handleNotFoundException_setsStatus404() { + var result = errorHandler.handleNotFoundException(model, response); + + assertEquals("error", result); + verify(response).setStatus(HttpServletResponse.SC_NOT_FOUND); + verify(model).addAttribute("status", HttpServletResponse.SC_NOT_FOUND); + verify(model).addAttribute("error", "Not Found"); + verify(model).addAttribute("errorMessage", "La ressource demandée est introuvable"); + } + + @Test + void handleUnauthorizedException_setsStatus401() { + var result = errorHandler.handleUnauthorizedException(model, response); + + assertEquals("error", result); + verify(response).setStatus(HttpServletResponse.SC_UNAUTHORIZED); + verify(model).addAttribute("status", HttpServletResponse.SC_UNAUTHORIZED); + verify(model).addAttribute("error", "Unauthorized"); + verify(model).addAttribute("errorMessage", "Accès non autorisé"); + } +}