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