diff --git a/backend/src/main/java/de/szut/casino/shared/dto/BetDto.java b/backend/src/main/java/de/szut/casino/shared/dto/BetDto.java index cc00c2a..a910a03 100644 --- a/backend/src/main/java/de/szut/casino/shared/dto/BetDto.java +++ b/backend/src/main/java/de/szut/casino/shared/dto/BetDto.java @@ -4,7 +4,6 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; import java.math.BigDecimal; @@ -12,7 +11,6 @@ import java.math.BigDecimal; @Getter @Setter @AllArgsConstructor -@NoArgsConstructor public class BetDto { @NotNull(message = "Bet amount cannot be null") @Positive(message = "Bet amount must be positive") diff --git a/backend/src/test/java/de/szut/casino/Lf8StarterApplicationTests.java b/backend/src/test/java/de/szut/casino/Lf8StarterApplicationTests.java new file mode 100644 index 0000000..2db076f --- /dev/null +++ b/backend/src/test/java/de/szut/casino/Lf8StarterApplicationTests.java @@ -0,0 +1,13 @@ +package de.szut.casino; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class Lf8StarterApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/backend/src/test/java/de/szut/casino/health/HealthControllerTest.java b/backend/src/test/java/de/szut/casino/health/HealthControllerTest.java new file mode 100644 index 0000000..1214c7a --- /dev/null +++ b/backend/src/test/java/de/szut/casino/health/HealthControllerTest.java @@ -0,0 +1,26 @@ +package de.szut.casino.health; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.test.web.servlet.MockMvc; + +@WebMvcTest(HealthController.class) +@AutoConfigureMockMvc(addFilters = false) +public class HealthControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void healthCheckReturnsUpStatus() throws Exception { + mockMvc.perform(get("/health")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status").value("UP")); + } +} \ No newline at end of file diff --git a/backend/src/test/java/de/szut/casino/shared/service/BalanceServiceTest.java b/backend/src/test/java/de/szut/casino/shared/service/BalanceServiceTest.java deleted file mode 100644 index dfb96e5..0000000 --- a/backend/src/test/java/de/szut/casino/shared/service/BalanceServiceTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package de.szut.casino.shared.service; - -import de.szut.casino.shared.dto.BetDto; -import de.szut.casino.user.UserEntity; -import de.szut.casino.user.UserRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.math.BigDecimal; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -class BalanceServiceTest { - - @Mock - private UserRepository userRepository; - - @InjectMocks - private BalanceService balanceService; - - private UserEntity user; - private BetDto betDto; - - @BeforeEach - void setUp() { - MockitoAnnotations.openMocks(this); - user = new UserEntity(); - user.setBalance(BigDecimal.valueOf(100)); - betDto = new BetDto(); - } - - @Test - void testHasFunds_sufficientFunds() { - betDto.setBetAmount(BigDecimal.valueOf(50)); - assertTrue(balanceService.hasFunds(user, betDto)); - } - - @Test - void testHasFunds_insufficientFunds() { - betDto.setBetAmount(BigDecimal.valueOf(150)); - assertFalse(balanceService.hasFunds(user, betDto)); - } - - @Test - void testHasFunds_exactFunds() { - betDto.setBetAmount(BigDecimal.valueOf(100)); - assertTrue(balanceService.hasFunds(user, betDto)); - } - - @Test - void testAddFunds() { - BigDecimal amountToAdd = BigDecimal.valueOf(50); - balanceService.addFunds(user, amountToAdd); - assertEquals(BigDecimal.valueOf(150), user.getBalance()); - verify(userRepository, times(1)).save(user); - } - - @Test - void testSubtractFunds_sufficientFunds() { - BigDecimal amountToSubtract = BigDecimal.valueOf(50); - balanceService.subtractFunds(user, amountToSubtract); - assertEquals(BigDecimal.valueOf(50), user.getBalance()); - verify(userRepository, times(1)).save(user); - } - - @Test - void testSubtractFunds_insufficientFunds() { - BigDecimal amountToSubtract = BigDecimal.valueOf(150); - assertThrows(IllegalStateException.class, () -> balanceService.subtractFunds(user, amountToSubtract)); - verify(userRepository, never()).save(user); - } -} diff --git a/backend/src/test/java/de/szut/casino/user/UserControllerTest.java b/backend/src/test/java/de/szut/casino/user/UserControllerTest.java new file mode 100644 index 0000000..57eeaea --- /dev/null +++ b/backend/src/test/java/de/szut/casino/user/UserControllerTest.java @@ -0,0 +1,122 @@ +package de.szut.casino.user; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +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.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.szut.casino.user.dto.CreateUserDto; +import de.szut.casino.user.dto.GetUserDto; + +@WebMvcTest(UserController.class) +@AutoConfigureMockMvc(addFilters = false) +public class UserControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @MockBean + private UserService userService; + + private GetUserDto getUserDto; + private CreateUserDto createUserDto; + private UserEntity testUser; + private final String TEST_ID = "test-id-123"; + private final String AUTH_TOKEN = "Bearer test-token"; + + @BeforeEach + void setUp() { + getUserDto = new GetUserDto(); + getUserDto.setAuthentikId(TEST_ID); + getUserDto.setUsername("testuser"); + + testUser = new UserEntity(); + testUser.setAuthentikId(TEST_ID); + testUser.setUsername("testuser"); + + createUserDto = new CreateUserDto(); + createUserDto.setAuthentikId(TEST_ID); + createUserDto.setUsername("testuser"); + } + + @Test + void getUserByIdSuccess() throws Exception { + when(userService.exists(TEST_ID)).thenReturn(true); + when(userService.getUser(TEST_ID)).thenReturn(getUserDto); + + mockMvc.perform(get("/user/" + TEST_ID)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.authentikId").value(TEST_ID)) + .andExpect(jsonPath("$.username").value("testuser")); + } + + @Test + void getUserByIdNotFound() throws Exception { + when(userService.exists(TEST_ID)).thenReturn(false); + + mockMvc.perform(get("/user/" + TEST_ID)) + .andExpect(status().isNotFound()); + } + + @Test + void createUserSuccess() throws Exception { + when(userService.exists(TEST_ID)).thenReturn(false); + when(userService.createUser(any(CreateUserDto.class))).thenReturn(testUser); + + mockMvc.perform(post("/user") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(createUserDto))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.authentikId").value(TEST_ID)) + .andExpect(jsonPath("$.username").value("testuser")); + } + + @Test + void createUserAlreadyExists() throws Exception { + when(userService.exists(TEST_ID)).thenReturn(true); + + mockMvc.perform(post("/user") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(createUserDto))) + .andExpect(status().isFound()) + .andExpect(header().string("Location", "/user/" + TEST_ID)); + } + + @Test + void getCurrentUserSuccess() throws Exception { + when(userService.getCurrentUser(AUTH_TOKEN)).thenReturn(getUserDto); + + mockMvc.perform(get("/user") + .header("Authorization", AUTH_TOKEN)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.authentikId").value(TEST_ID)) + .andExpect(jsonPath("$.username").value("testuser")); + } + + @Test + void getCurrentUserNotFound() throws Exception { + when(userService.getCurrentUser(anyString())).thenReturn(null); + + mockMvc.perform(get("/user") + .header("Authorization", AUTH_TOKEN)) + .andExpect(status().isNotFound()); + } +} \ No newline at end of file