From 1e0a2b12ce3f824fa9b2f8feff320e4dfff17c6e Mon Sep 17 00:00:00 2001 From: Nick Reuter Date: Mon, 9 Mar 2026 23:41:08 -0400 Subject: [PATCH] Removes unique constraint on team name #24 --- .../retroapi/team/TeamController.java | 8 +---- .../nickreuter/retroapi/team/TeamEntity.java | 2 -- .../retroapi/team/TeamRepository.java | 1 - .../nickreuter/retroapi/team/TeamService.java | 4 +-- .../exception/TeamAlreadyExistsException.java | 4 --- src/main/resources/db/changelog.xml | 2 +- .../retro/thought/ThoughtRepositoryTest.java | 34 +++++++++++++++++++ .../retroapi/team/TeamControllerTest.java | 12 ------- .../retroapi/team/TeamRepositoryTest.java | 13 ------- .../retroapi/team/TeamServiceTest.java | 14 ++------ 10 files changed, 39 insertions(+), 55 deletions(-) delete mode 100644 src/main/java/io/nickreuter/retroapi/team/exception/TeamAlreadyExistsException.java create mode 100644 src/test/java/io/nickreuter/retroapi/retro/thought/ThoughtRepositoryTest.java diff --git a/src/main/java/io/nickreuter/retroapi/team/TeamController.java b/src/main/java/io/nickreuter/retroapi/team/TeamController.java index fbe9a8b..0bcffa1 100644 --- a/src/main/java/io/nickreuter/retroapi/team/TeamController.java +++ b/src/main/java/io/nickreuter/retroapi/team/TeamController.java @@ -1,7 +1,6 @@ package io.nickreuter.retroapi.team; import io.nickreuter.retroapi.team.exception.BadInviteException; -import io.nickreuter.retroapi.team.exception.TeamAlreadyExistsException; import io.nickreuter.retroapi.team.exception.TeamNotFoundException; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; @@ -25,7 +24,7 @@ public TeamController(TeamService teamService) { } @PostMapping - public ResponseEntity createTeam(@Valid @RequestBody CreateTeamRequest request, Principal principal) throws TeamAlreadyExistsException { + public ResponseEntity createTeam(@Valid @RequestBody CreateTeamRequest request, Principal principal) { var team = teamService.createTeam(request.name(), principal.getName()); return ResponseEntity.created(URI.create("/api/teams/%s".formatted(team.getId()))).build(); } @@ -55,11 +54,6 @@ public ResponseEntity removeUser(@PathVariable("id") UUID teamId, @PathVar return ResponseEntity.ok().build(); } - @ExceptionHandler(TeamAlreadyExistsException.class) - public ResponseEntity handleTeamAlreadyExists() { - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - @ExceptionHandler(TeamNotFoundException.class) public ResponseEntity handleTeamNotFound() { return ResponseEntity.notFound().build(); diff --git a/src/main/java/io/nickreuter/retroapi/team/TeamEntity.java b/src/main/java/io/nickreuter/retroapi/team/TeamEntity.java index 6420065..757d0b4 100644 --- a/src/main/java/io/nickreuter/retroapi/team/TeamEntity.java +++ b/src/main/java/io/nickreuter/retroapi/team/TeamEntity.java @@ -1,6 +1,5 @@ package io.nickreuter.retroapi.team; -import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; @@ -20,7 +19,6 @@ public class TeamEntity { @Id @GeneratedValue private UUID id; - @Column(unique = true) private String name; @CreationTimestamp private Instant createdAt; diff --git a/src/main/java/io/nickreuter/retroapi/team/TeamRepository.java b/src/main/java/io/nickreuter/retroapi/team/TeamRepository.java index 6b9019c..3f4cf98 100644 --- a/src/main/java/io/nickreuter/retroapi/team/TeamRepository.java +++ b/src/main/java/io/nickreuter/retroapi/team/TeamRepository.java @@ -9,6 +9,5 @@ @Repository public interface TeamRepository extends JpaRepository { - boolean existsByName(String name); List findAllByIdInOrderByNameAsc(Set ids); } diff --git a/src/main/java/io/nickreuter/retroapi/team/TeamService.java b/src/main/java/io/nickreuter/retroapi/team/TeamService.java index 21faa3c..0027adb 100644 --- a/src/main/java/io/nickreuter/retroapi/team/TeamService.java +++ b/src/main/java/io/nickreuter/retroapi/team/TeamService.java @@ -1,7 +1,6 @@ package io.nickreuter.retroapi.team; import io.nickreuter.retroapi.team.exception.BadInviteException; -import io.nickreuter.retroapi.team.exception.TeamAlreadyExistsException; import io.nickreuter.retroapi.team.invite.InviteEntity; import io.nickreuter.retroapi.team.invite.InviteService; import io.nickreuter.retroapi.team.usermapping.UserMappingEntity; @@ -28,8 +27,7 @@ public TeamService(TeamRepository teamRepository, UserMappingService userMapping this.inviteService = inviteService; } - public TeamEntity createTeam(String name, String userId) throws TeamAlreadyExistsException { - if (teamRepository.existsByName(name)) throw new TeamAlreadyExistsException(); + public TeamEntity createTeam(String name, String userId) { var team = teamRepository.save(new TeamEntity(name)); userMappingService.addUserToTeam(userId, team.getId()); return team; diff --git a/src/main/java/io/nickreuter/retroapi/team/exception/TeamAlreadyExistsException.java b/src/main/java/io/nickreuter/retroapi/team/exception/TeamAlreadyExistsException.java deleted file mode 100644 index a4ca5e3..0000000 --- a/src/main/java/io/nickreuter/retroapi/team/exception/TeamAlreadyExistsException.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.nickreuter.retroapi.team.exception; - -public class TeamAlreadyExistsException extends Exception { -} diff --git a/src/main/resources/db/changelog.xml b/src/main/resources/db/changelog.xml index 4c65f82..33ccb8c 100644 --- a/src/main/resources/db/changelog.xml +++ b/src/main/resources/db/changelog.xml @@ -13,7 +13,7 @@ - + diff --git a/src/test/java/io/nickreuter/retroapi/retro/thought/ThoughtRepositoryTest.java b/src/test/java/io/nickreuter/retroapi/retro/thought/ThoughtRepositoryTest.java new file mode 100644 index 0000000..83a9e7d --- /dev/null +++ b/src/test/java/io/nickreuter/retroapi/retro/thought/ThoughtRepositoryTest.java @@ -0,0 +1,34 @@ +package io.nickreuter.retroapi.retro.thought; + +import io.nickreuter.retroapi.retro.RetroEntity; +import io.nickreuter.retroapi.retro.RetroRepository; +import io.nickreuter.retroapi.team.TeamEntity; +import io.nickreuter.retroapi.team.TeamRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +class ThoughtRepositoryTest { + @Autowired + private ThoughtRepository subject; + @Autowired + private RetroRepository retroRepository; + @Autowired + private TeamRepository teamRepository; + + @Test + void save_ShouldPreserveEmojiCharacters() { + var team = teamRepository.save(new TeamEntity("test-team")); + var retro = retroRepository.save(new RetroEntity(team.getId(), "template-1")); + var messageWithEmoji = "Great work! 😀🎉👍 Keep it up! 🚀"; + + var thought = ThoughtEntity.from(messageWithEmoji, "happy", retro.getId()); + var saved = subject.save(thought); + + var retrieved = subject.findById(saved.getId()).orElseThrow(); + assertThat(retrieved.getMessage()).isEqualTo(messageWithEmoji); + } +} diff --git a/src/test/java/io/nickreuter/retroapi/team/TeamControllerTest.java b/src/test/java/io/nickreuter/retroapi/team/TeamControllerTest.java index c837e04..ac76dd7 100644 --- a/src/test/java/io/nickreuter/retroapi/team/TeamControllerTest.java +++ b/src/test/java/io/nickreuter/retroapi/team/TeamControllerTest.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.nickreuter.retroapi.team.exception.BadInviteException; -import io.nickreuter.retroapi.team.exception.TeamAlreadyExistsException; import io.nickreuter.retroapi.team.usermapping.UserMappingAuthorizationService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -84,17 +83,6 @@ void createTeam_WithInvalidToken_Throws401() throws Exception { .andExpect(status().isUnauthorized()); } - @Test - void createTeam_WhenTeamAlreadyExists_Throws409() throws Exception { - var teamName = "Team name"; - doThrow(TeamAlreadyExistsException.class).when(service).createTeam(teamName, "user"); - mockMvc.perform(post("/api/teams") - .with(jwt()) - .content(objectMapper.writeValueAsString(new CreateTeamRequest(teamName))) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isConflict()); - } - @Test void getTeamsForUser_ReturnsListOfTeams() throws Exception { var team1 = new TeamEntity(UUID.fromString("7c52730b-b9e8-4db8-a8fd-4fd3a9d84809"), "Team 1", Instant.ofEpochSecond(1000000001)); diff --git a/src/test/java/io/nickreuter/retroapi/team/TeamRepositoryTest.java b/src/test/java/io/nickreuter/retroapi/team/TeamRepositoryTest.java index 2c731e7..5f5b6ad 100644 --- a/src/test/java/io/nickreuter/retroapi/team/TeamRepositoryTest.java +++ b/src/test/java/io/nickreuter/retroapi/team/TeamRepositoryTest.java @@ -8,25 +8,12 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; @DataJpaTest class TeamRepositoryTest { @Autowired private TeamRepository subject; - @Test - public void existsByName_WhenTeamNameDoesNotExist_ReturnsFalse() { - assertFalse(subject.existsByName("name")); - } - - @Test - public void existsByName_WhenTeamNameExists_ReturnsTrue() { - subject.save(new TeamEntity("name")); - assertTrue(subject.existsByName("name")); - } - @Test public void findAllByIdInOrderByNameAsc_WhenTeamsExist_ReturnsTeamsInNameOrderAscending() { var team1 = subject.save(new TeamEntity("C Team")); diff --git a/src/test/java/io/nickreuter/retroapi/team/TeamServiceTest.java b/src/test/java/io/nickreuter/retroapi/team/TeamServiceTest.java index 8596418..6e6efd1 100644 --- a/src/test/java/io/nickreuter/retroapi/team/TeamServiceTest.java +++ b/src/test/java/io/nickreuter/retroapi/team/TeamServiceTest.java @@ -1,7 +1,6 @@ package io.nickreuter.retroapi.team; import io.nickreuter.retroapi.team.exception.BadInviteException; -import io.nickreuter.retroapi.team.exception.TeamAlreadyExistsException; import io.nickreuter.retroapi.team.invite.InviteEntity; import io.nickreuter.retroapi.team.invite.InviteService; import io.nickreuter.retroapi.team.usermapping.UserMappingEntity; @@ -23,9 +22,8 @@ class TeamServiceTest { private final TeamService service = new TeamService(teamRepository, userMappingService, inviteService); @Test - void createTeam_ShouldReturnCreatedTeam() throws TeamAlreadyExistsException { + void createTeam_ShouldReturnCreatedTeam() { var expected = new TeamEntity(UUID.randomUUID(), "expected name", Instant.now()); - when(teamRepository.existsByName("expected name")).thenReturn(false); when(teamRepository.save(ArgumentMatchers.argThat((TeamEntity team) -> team.getId() == null && Objects.equals(team.getName(), "expected name") && @@ -36,16 +34,8 @@ void createTeam_ShouldReturnCreatedTeam() throws TeamAlreadyExistsException { } @Test - void createTeam_WhenTeamAlreadyExists_ShouldThrowException() { - when(teamRepository.existsByName("team already exists")).thenReturn(true); - assertThatExceptionOfType(TeamAlreadyExistsException.class).isThrownBy(() -> service.createTeam("team already exists", "user ID")); - verify(teamRepository, times(0)).save(any()); - } - - @Test - void createTeam_ShouldAddCreatingUserToTeam() throws TeamAlreadyExistsException { + void createTeam_ShouldAddCreatingUserToTeam() { var expected = new TeamEntity(UUID.randomUUID(), "expected team name", Instant.now()); - when(teamRepository.existsByName("expected team name")).thenReturn(false); when(teamRepository.save(any())).thenReturn(expected); var actual = service.createTeam("expected team name", "User ID"); assertThat(actual).isEqualTo(expected);