package se.bilhalsning.controller; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.UUID; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import se.bilhalsning.entity.Order; import se.bilhalsning.entity.OrderStatus; import se.bilhalsning.exception.OrderNotFoundException; import se.bilhalsning.service.OrderService; @SpringBootTest @AutoConfigureMockMvc class PaymentControllerTest { @Autowired private MockMvc mockMvc; @MockitoBean private OrderService orderService; @Test void shouldReturn403WhenNotAuthenticated() throws Exception { mockMvc.perform(post("/api/payment/{orderId}/pay", "c1eebc99-9c0b-4ef8-bb6d-6bb9bd380a11")) .andExpect(status().isForbidden()); } @Test @WithMockUser(username = "test@bilhej.se") void shouldConfirmPaymentSuccessfully() throws Exception { UUID orderId = UUID.fromString("c1eebc99-9c0b-4ef8-bb6d-6bb9bd380a11"); Order order = new Order(); order.setId(orderId); order.setPlate("ABC123"); order.setStatus(OrderStatus.PROCESSING); when(orderService.confirmPayment(eq(orderId))).thenReturn(order); mockMvc.perform(post("/api/payment/{orderId}/pay", orderId) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(orderId.toString())) .andExpect(jsonPath("$.status").value("processing")); } @Test @WithMockUser(username = "test@bilhej.se") void shouldReturn404WhenOrderNotFound() throws Exception { UUID orderId = UUID.fromString("c1eebc99-9c0b-4ef8-bb6d-6bb9bd380a11"); when(orderService.confirmPayment(eq(orderId))) .thenThrow(new OrderNotFoundException(orderId)); mockMvc.perform(post("/api/payment/{orderId}/pay", orderId) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNotFound()); } @Test void shouldReturnSwishInfoUnauthenticated() throws Exception { mockMvc.perform(get("/api/payment/swish-info")) .andExpect(status().isOk()) .andExpect(jsonPath("$.number").exists()) .andExpect(jsonPath("$.amount").exists()); } }