diff --git a/pom.xml b/pom.xml index 837de1be..374cc6cf 100644 --- a/pom.xml +++ b/pom.xml @@ -87,7 +87,10 @@ 2.20.0 - + + com.fasterxml.jackson.core + jackson-databind + diff --git a/src/test/java/org/example/vet1177/controller/VetControllerTest.java b/src/test/java/org/example/vet1177/controller/VetControllerTest.java new file mode 100644 index 00000000..2ffaa8bc --- /dev/null +++ b/src/test/java/org/example/vet1177/controller/VetControllerTest.java @@ -0,0 +1,173 @@ +package org.example.vet1177.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.example.vet1177.dto.request.vet.VetRequest; +import org.example.vet1177.dto.response.vet.VetResponse; +import org.example.vet1177.entities.User; +import org.example.vet1177.exception.ForbiddenException; +import org.example.vet1177.exception.ResourceNotFoundException; +import org.example.vet1177.policy.AdminPolicy; +import org.example.vet1177.services.VetService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; + +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(VetController.class) +@AutoConfigureMockMvc(addFilters = false) // stänger av security +class VetControllerTest { + + @Autowired + private MockMvc mockMvc; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @MockitoBean + private VetService vetService; + + @MockitoBean + private AdminPolicy adminPolicy; + +// ========================= +// POST /api/vets +// ========================= + + @Test + void shouldCreateVet_whenAdmin() throws Exception { + UUID userId = UUID.randomUUID(); + + VetRequest request = new VetRequest( + userId, + "LIC123", + "Surgery", + "Available" + ); + + VetResponse response = new VetResponse( + userId, + "Dr. Smith", + "test@test.com", + "LIC123", + "Surgery", + "Available", + "Clinic", + true + ); + + doNothing().when(adminPolicy).requireAdmin(any(User.class)); + when(vetService.createVet(any())).thenReturn(response); + + mockMvc.perform(post("/api/vets") + .contentType("application/json") + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.name").value("Dr. Smith")) + .andExpect(jsonPath("$.licenseId").value("LIC123")); + } + + @Test + void shouldReturn403_whenNotAdmin() throws Exception { + VetRequest request = new VetRequest( + UUID.randomUUID(), + "LIC123", + "Surgery", + "Info" + ); + + doThrow(new ForbiddenException("Forbidden")) + .when(adminPolicy) + .requireAdmin(any()); + + mockMvc.perform(post("/api/vets") + .contentType("application/json") + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isForbidden()); + } + + @Test + void shouldReturn400_whenInvalidRequest() throws Exception { + VetRequest request = new VetRequest( + null, // invalid + "", + "Surgery", + "Info" + ); + + mockMvc.perform(post("/api/vets") + .contentType("application/json") + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isBadRequest()); + } + +// ========================= +// GET /api/vets +// ========================= + + @Test + void shouldReturnAllVets() throws Exception { + VetResponse response = new VetResponse( + UUID.randomUUID(), + "Dr. Smith", + "test@test.com", + "LIC123", + "Surgery", + "Available", + "Clinic", + true + ); + + when(vetService.getAllVets()).thenReturn(List.of(response)); + + mockMvc.perform(get("/api/vets")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$[0].name").value("Dr. Smith")); + } + +// ========================= +// GET /api/vets/{id} +// ========================= + + @Test + void shouldReturnVetById() throws Exception { + UUID id = UUID.randomUUID(); + + VetResponse response = new VetResponse( + id, + "Dr. Smith", + "test@test.com", + "LIC123", + "Surgery", + "Available", + "Clinic", + true + ); + + when(vetService.getVetById(id)).thenReturn(response); + + mockMvc.perform(get("/api/vets/" + id)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.name").value("Dr. Smith")); + } + + @Test + void shouldReturn404_whenVetNotFound() throws Exception { + UUID id = UUID.randomUUID(); + + when(vetService.getVetById(id)) + .thenThrow(new ResourceNotFoundException("Vet", id)); + + mockMvc.perform(get("/api/vets/" + id)) + .andExpect(status().isNotFound()); + } +}