diff --git a/pom.xml b/pom.xml index 06c65ed1c..6cacae4f0 100644 --- a/pom.xml +++ b/pom.xml @@ -209,6 +209,13 @@ spring-boot-starter-actuator + + + com.fasterxml.jackson.module + jackson-module-kotlin + ${jackson.version} + + diff --git a/src/main/java/io/codeka/gaia/teams/bo.kt b/src/main/java/io/codeka/gaia/teams/bo.kt index 6571c51cd..d65977dec 100644 --- a/src/main/java/io/codeka/gaia/teams/bo.kt +++ b/src/main/java/io/codeka/gaia/teams/bo.kt @@ -6,7 +6,7 @@ import org.springframework.data.mongodb.core.mapping.DBRef /** * A Gaia Team, which groups users */ -data class Team(val id: String?) +data class Team(val id: String) /** * a Gaia user, which has granted access to modules diff --git a/src/test/java/io/codeka/gaia/teams/controller/TeamsRestControllerIT.java b/src/test/java/io/codeka/gaia/teams/controller/TeamsRestControllerIT.java index f2ec1d98f..b14ce9526 100644 --- a/src/test/java/io/codeka/gaia/teams/controller/TeamsRestControllerIT.java +++ b/src/test/java/io/codeka/gaia/teams/controller/TeamsRestControllerIT.java @@ -55,8 +55,8 @@ void teams_shouldBeAccessible_forAdminUser() { void teams_shouldBeExposed_atSpecificUrl() throws Exception { mockMvc.perform(get("/api/teams")) .andExpect(status().isOk()) - .andExpect(jsonPath("$", hasSize(2))) - .andExpect(jsonPath("$..id", contains("Ze Team", "Not Ze Team"))); + .andExpect(jsonPath("$", hasSize(3))) + .andExpect(jsonPath("$..id", contains("Ze Team", "Not Ze Team", "Sith"))); } } \ No newline at end of file diff --git a/src/test/java/io/codeka/gaia/teams/controller/UsersRestControllerIT.java b/src/test/java/io/codeka/gaia/teams/controller/UsersRestControllerIT.java index 18f27a2d7..2debbbfc0 100644 --- a/src/test/java/io/codeka/gaia/teams/controller/UsersRestControllerIT.java +++ b/src/test/java/io/codeka/gaia/teams/controller/UsersRestControllerIT.java @@ -1,5 +1,8 @@ package io.codeka.gaia.teams.controller; +import io.codeka.gaia.teams.Team; +import io.codeka.gaia.teams.User; +import io.codeka.gaia.teams.repository.UserRepository; import io.codeka.gaia.test.MongoContainer; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -13,11 +16,13 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -39,6 +44,9 @@ class UsersRestControllerIT { @Autowired private UsersRestController usersRestController; + @Autowired + private UserRepository userRepository; + @Autowired private MockMvc mockMvc; @@ -57,9 +65,9 @@ void users_shouldBeAccessible_forAdminUser() { void users_shouldBeExposed_atSpecificUrl() throws Exception { mockMvc.perform(get("/api/users")) .andExpect(status().isOk()) - .andExpect(jsonPath("$", hasSize(2))) - .andExpect(jsonPath("$..username", contains("admin", "Mary J"))) - .andExpect(jsonPath("$..admin", contains(true, false))) + .andExpect(jsonPath("$", hasSize(3))) + .andExpect(jsonPath("$..username", contains("admin", "Mary J", "Darth Vader"))) + .andExpect(jsonPath("$..admin", contains(true, false, false))) .andExpect(jsonPath("$..team.id", contains("Ze Team", "Not Ze Team"))); } @@ -72,6 +80,35 @@ void saveUser_shouldBeExposed_atSpecificUrl() throws Exception { .andExpect(jsonPath("$.username", is("Bob"))) .andExpect(jsonPath("$.admin", is(false))) .andExpect(jsonPath("$.team", isEmptyOrNullString())); + + assertThat(userRepository.existsById("Bob")).isTrue(); + } + + @Test + void users_canBeChangedOfTeam() throws Exception { + // given + assertThat(userRepository.findById("Darth Vader")) + .isPresent() + .map(User::getTeam) + .isNotPresent(); + + // when + mockMvc.perform(put("/api/users/Darth Vader") + .contentType(MediaType.APPLICATION_JSON) + .content("{\"username\": \"Darth Vader\",\"team\": {\"id\": \"Sith\"}}")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.username", is("Darth Vader"))) + .andExpect(jsonPath("$.admin", is(false))) + .andExpect(jsonPath("$.team.id", is("Sith"))); + + // then + assertThat(userRepository.findById("Darth Vader")) + .isPresent() + .map(User::getTeam) + .hasValue(new Team("Sith")); + + mongoContainer.resetDatabase(); } } \ No newline at end of file diff --git a/src/test/resources/db/00_team.js b/src/test/resources/db/00_team.js index 4f95c042b..dd037b607 100644 --- a/src/test/resources/db/00_team.js +++ b/src/test/resources/db/00_team.js @@ -6,5 +6,8 @@ gaia.team.insert([ }, { "_id": "Not Ze Team" + }, + { + "_id": "Sith" } ]); \ No newline at end of file diff --git a/src/test/resources/db/10_user.js b/src/test/resources/db/10_user.js index 8a5f1d5f1..e211c335d 100644 --- a/src/test/resources/db/10_user.js +++ b/src/test/resources/db/10_user.js @@ -9,4 +9,8 @@ gaia.user.insert([ "_id": "Mary J", "team": {"$ref": "team", "$id": "Not Ze Team"} } + , + { + "_id": "Darth Vader" + } ]); \ No newline at end of file