From cf569386adf3e15b4d774318b5609fd54930dc2b Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Wed, 26 Feb 2025 10:49:04 +0100 Subject: [PATCH 1/6] add test for user controller --- .../szut/casino/user/UserControllerTest.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 backend/src/test/java/de/szut/casino/user/UserControllerTest.java 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..9620a87 --- /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) // Disables Spring Security filters +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.setKeycloakId(TEST_ID); + getUserDto.setUsername("testuser"); + + testUser = new UserEntity(); + testUser.setKeycloakId(TEST_ID); + testUser.setUsername("testuser"); + + createUserDto = new CreateUserDto(); + createUserDto.setKeycloakId(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("$.keycloakId").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("$.keycloakId").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("$.keycloakId").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 -- 2.47.2 From 834cb559efe68ba46a574182c7cad2cf1e320297 Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Wed, 26 Feb 2025 10:54:21 +0100 Subject: [PATCH 2/6] add test for health controller --- .../casino/health/HealthControllerTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 backend/src/test/java/de/szut/casino/health/HealthControllerTest.java 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 -- 2.47.2 From 39a9ca1831169a93c488ebbd50019cf9073af306 Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Wed, 26 Feb 2025 10:57:36 +0100 Subject: [PATCH 3/6] add test to ci --- .gitea/workflows/ci.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 97dbeeb..5265980 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -35,6 +35,38 @@ jobs: - name: "Stop Gradle" working-directory: ./backend run: gradle --stop + + test: + name: "Test" + runs-on: "vps-4" + container: + image: "cimg/openjdk:22.0-node" + steps: + - name: "Checkout" + uses: actions/checkout@v3 + - name: Setup Java 22 + uses: actions/setup-java@v3 + with: + distribution: "temurin" + java-version: "22" + - name: "Cache Gradle dependencies" + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-common + restore-keys: | + gradle-${{ runner.os }}- + - name: "Prepare Gradle" + working-directory: ./backend + run: gradle clean + - name: "Test" + working-directory: ./backend + run: gradle test + - name: "Stop Gradle" + working-directory: ./backend + run: gradle --stop eslint: name: eslint -- 2.47.2 From 74f598a24cfe447f5e30782d106ec9af58c748a0 Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Wed, 26 Feb 2025 11:01:23 +0100 Subject: [PATCH 4/6] remove comment --- .../src/test/java/de/szut/casino/user/UserControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/test/java/de/szut/casino/user/UserControllerTest.java b/backend/src/test/java/de/szut/casino/user/UserControllerTest.java index 9620a87..2addb43 100644 --- a/backend/src/test/java/de/szut/casino/user/UserControllerTest.java +++ b/backend/src/test/java/de/szut/casino/user/UserControllerTest.java @@ -24,7 +24,7 @@ import de.szut.casino.user.dto.CreateUserDto; import de.szut.casino.user.dto.GetUserDto; @WebMvcTest(UserController.class) -@AutoConfigureMockMvc(addFilters = false) // Disables Spring Security filters +@AutoConfigureMockMvc(addFilters = false) public class UserControllerTest { @Autowired -- 2.47.2 From bb7bac9a679d5bbb5b531487ccca1dfc656ed603 Mon Sep 17 00:00:00 2001 From: Jan-Marlon Leibl Date: Thu, 6 Mar 2025 12:42:18 +0100 Subject: [PATCH 5/6] style(footer): correct spelling of "Klarna" in footer text --- frontend/src/app/shared/components/footer/footer.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/shared/components/footer/footer.component.html b/frontend/src/app/shared/components/footer/footer.component.html index 87c4682..e886973 100644 --- a/frontend/src/app/shared/components/footer/footer.component.html +++ b/frontend/src/app/shared/components/footer/footer.component.html @@ -47,7 +47,7 @@