From 3898aee748f8f8eaee0d56ff390d0350ea37d995 Mon Sep 17 00:00:00 2001 From: seungsje <111065574+AreSain@users.noreply.github.com> Date: Fri, 6 Sep 2024 18:01:21 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20[Bug]=20AgendaTeamAdmin=EC=97=90?= =?UTF-8?q?=EC=84=9C=20cancel=20=EC=83=81=ED=83=9C=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=8B=9C=EC=97=90=20Confirm=20=ED=8C=80=EC=9D=BC?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20currentTeam=EC=9D=B4=20=EC=A4=84=EC=96=B4?= =?UTF-8?q?=EB=93=A4=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=20#1004=20(#1005)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/AgendaTeamAdminService.java | 8 ++ .../AgendaTeamAdminControllerTest.java | 125 +++++++++++++++--- .../service/AgendaTeamAdminServiceTest.java | 98 -------------- .../agenda/service/AgendaServiceTest.java | 2 +- .../src/main/java/gg/data/agenda/Agenda.java | 16 +++ .../main/java/gg/data/agenda/AgendaTeam.java | 4 - .../java/gg/utils/exception/ErrorCode.java | 2 + .../utils/fixture/agenda/AgendaFixture.java | 2 +- 8 files changed, 136 insertions(+), 121 deletions(-) diff --git a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java index b28db45c3..1d99a9d18 100644 --- a/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java +++ b/gg-agenda-api/src/main/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminService.java @@ -71,6 +71,7 @@ public void updateAgendaTeam(AgendaTeamUpdateDto agendaTeamUpdateDto) { // AgendaTeam 정보 변경 team.updateTeamAdmin(agendaTeamUpdateDto.getTeamName(), agendaTeamUpdateDto.getTeamContent(), agendaTeamUpdateDto.getTeamIsPrivate(), agendaTeamUpdateDto.getTeamStatus()); + team.getAgenda().adminConfirmTeam(team.getStatus()); team.updateLocation(agendaTeamUpdateDto.getTeamLocation(), profiles); team.acceptAward(agendaTeamUpdateDto.getTeamAward(), agendaTeamUpdateDto.getTeamAwardPriority()); @@ -95,6 +96,11 @@ public void updateAgendaTeam(AgendaTeamUpdateDto agendaTeamUpdateDto) { AgendaTeamProfile agendaTeamProfile = new AgendaTeamProfile(team, team.getAgenda(), profile); agendaTeamProfileAdminRepository.save(agendaTeamProfile); }); + + // 팀장이 없는지 확인하는 로직 + if (profiles.stream().noneMatch(profile -> profile.getProfile().getIntraId().equals(team.getLeaderIntraId()))) { + throw new NotExistException(TEAM_LEADER_NOT_FOUND); + } } @Transactional @@ -102,6 +108,8 @@ public void cancelAgendaTeam(AgendaTeam agendaTeam) { List agendaTeamProfiles = agendaTeamProfileAdminRepository .findAllByAgendaTeamAndIsExistIsTrue(agendaTeam); agendaTeamProfiles.forEach(AgendaTeamProfile::changeExistFalse); + Agenda agenda = agendaTeam.getAgenda(); + agenda.adminCancelTeam(agendaTeam.getStatus()); agendaTeam.adminCancelTeam(); } } diff --git a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java index dd9433a51..ca9328888 100644 --- a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java +++ b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/controller/AgendaTeamAdminControllerTest.java @@ -1,5 +1,6 @@ package gg.agenda.api.admin.agendateam.controller; +import static gg.data.agenda.type.Location.*; import static org.assertj.core.api.AssertionsForClassTypes.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -236,17 +237,19 @@ class UpdateAgendaTeamAdmin { void updateAgendaTeamAdminSuccess() throws Exception { // given Agenda agenda = agendaFixture.createAgenda(); - AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda); + AgendaProfile seoulUserAgendaProfile = agendaProfileFixture.createAgendaProfile(); + AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda, seoulUserAgendaProfile); List profiles = agendaProfileFixture.createAgendaProfileList(5); profiles.forEach(profile -> agendaTeamProfileFixture .createAgendaTeamProfile(agenda, team, profile)); + agendaTeamProfileFixture.createAgendaTeamProfile(team, seoulUserAgendaProfile); List updateTeamMates = profiles.stream() .map(profile -> new AgendaTeamMateReqDto(profile.getIntraId())) .collect(Collectors.toList()); AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() .teamKey(team.getTeamKey()).teamMates(updateTeamMates) - .teamStatus(AgendaTeamStatus.CANCEL).teamLocation(Location.MIX) + .teamStatus(AgendaTeamStatus.CONFIRM).teamLocation(Location.MIX) .teamName("newName").teamContent("newContent").teamIsPrivate(true) .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); String request = objectMapper.writeValueAsString(updateDto); @@ -271,7 +274,7 @@ void updateAgendaTeamAdminSuccess() throws Exception { } @Test - @DisplayName("Admin AgendaTeam 수정 성공 - Location을 변경할 수 없는 경우") + @DisplayName("Admin AgendaTeam 수정 실패 - Location을 변경할 수 없는 경우") void updateAgendaTeamAdminFailedWithLocation() throws Exception { // given Agenda agenda = agendaFixture.createAgenda(Location.MIX); @@ -285,7 +288,7 @@ void updateAgendaTeamAdminFailedWithLocation() throws Exception { .collect(Collectors.toList()); AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() .teamKey(team.getTeamKey()).teamMates(updateTeamMates) - .teamStatus(AgendaTeamStatus.CANCEL).teamLocation(Location.GYEONGSAN) + .teamStatus(AgendaTeamStatus.CONFIRM).teamLocation(Location.GYEONGSAN) .teamName("newName").teamContent("newContent").teamIsPrivate(true) .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); String request = objectMapper.writeValueAsString(updateDto); @@ -314,11 +317,13 @@ void updateAgendaTeamAdminFailedWithLocation() throws Exception { void updateAgendaTeamAdminSuccessWithAddTeammate() throws Exception { // given Agenda agenda = agendaFixture.createAgenda(); - AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda); + AgendaProfile seoulUserAgendaProfile = agendaProfileFixture.createAgendaProfile(); + AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda, seoulUserAgendaProfile); List profiles = agendaProfileFixture.createAgendaProfileList(3); profiles.forEach(profile -> agendaTeamProfileFixture .createAgendaTeamProfile(agenda, team, profile)); AgendaProfile newProfile = agendaProfileFixture.createAgendaProfile(); + agendaTeamProfileFixture.createAgendaTeamProfile(team, seoulUserAgendaProfile); List updateTeamMates = profiles.stream() .map(profile -> new AgendaTeamMateReqDto(profile.getIntraId())) @@ -326,7 +331,7 @@ void updateAgendaTeamAdminSuccessWithAddTeammate() throws Exception { updateTeamMates.add(new AgendaTeamMateReqDto(newProfile.getIntraId())); AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() .teamKey(team.getTeamKey()).teamMates(updateTeamMates) - .teamStatus(AgendaTeamStatus.CANCEL).teamLocation(Location.MIX) + .teamStatus(AgendaTeamStatus.CONFIRM).teamLocation(Location.MIX) .teamName("newName").teamContent("newContent").teamIsPrivate(true) .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); String request = objectMapper.writeValueAsString(updateDto); @@ -357,6 +362,34 @@ void updateAgendaTeamAdminSuccessWithAddTeammate() throws Exception { .isTrue(); } + @Test + @DisplayName("Admin AgendaTeam 수정 실패 - AgendaTeamStatus는 Cancel로 변경할 수 없음") + void updateAgendaTeamAdminFailedWithCancelStatus() throws Exception { + // given + Agenda agenda = agendaFixture.createAgenda(); + AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda); + List profiles = agendaProfileFixture.createAgendaProfileList(5); + profiles.forEach(profile -> agendaTeamProfileFixture + .createAgendaTeamProfile(agenda, team, profile)); + + List updateTeamMates = profiles.stream() + .map(profile -> new AgendaTeamMateReqDto(profile.getIntraId())) + .collect(Collectors.toList()); + AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() + .teamKey(team.getTeamKey()).teamMates(updateTeamMates) + .teamStatus(AgendaTeamStatus.CANCEL).teamLocation(Location.MIX) + .teamName("newName").teamContent("newContent").teamIsPrivate(true) + .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); + String request = objectMapper.writeValueAsString(updateDto); + + // when + mockMvc.perform(patch("/agenda/admin/team") + .header("Authorization", "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(request)) + .andExpect(status().isBadRequest()); + } + @Test @DisplayName("Admin AgendaTeam 수정 실패 - 이미 꽉 찬 팀에 팀원 추가하기") void updateAgendaTeamAdminFailedWithMaxPeople() throws Exception { @@ -374,7 +407,7 @@ void updateAgendaTeamAdminFailedWithMaxPeople() throws Exception { updateTeamMates.add(new AgendaTeamMateReqDto(newProfile.getIntraId())); AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() .teamKey(team.getTeamKey()).teamMates(updateTeamMates) - .teamStatus(AgendaTeamStatus.CANCEL).teamLocation(Location.MIX) + .teamStatus(AgendaTeamStatus.CONFIRM).teamLocation(Location.MIX) .teamName("newName").teamContent("newContent").teamIsPrivate(true) .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); String request = objectMapper.writeValueAsString(updateDto); @@ -392,19 +425,21 @@ void updateAgendaTeamAdminFailedWithMaxPeople() throws Exception { void updateAgendaTeamAdminSuccessWithRemoveTeammate() throws Exception { // given Agenda agenda = agendaFixture.createAgenda(); - AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda); + AgendaProfile seoulUserAgendaProfile = agendaProfileFixture.createAgendaProfile(); + AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda, seoulUserAgendaProfile); List profiles = agendaProfileFixture.createAgendaProfileList(3); profiles.forEach(profile -> agendaTeamProfileFixture .createAgendaTeamProfile(agenda, team, profile)); AgendaProfile wrongProfile = agendaProfileFixture.createAgendaProfile(); agendaTeamProfileFixture.createAgendaTeamProfile(agenda, team, wrongProfile); + agendaTeamProfileFixture.createAgendaTeamProfile(team, seoulUserAgendaProfile); List updateTeamMates = profiles.stream() .map(profile -> new AgendaTeamMateReqDto(profile.getIntraId())) .collect(Collectors.toList()); AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() .teamKey(team.getTeamKey()).teamMates(updateTeamMates) - .teamStatus(AgendaTeamStatus.CANCEL).teamLocation(Location.MIX) + .teamStatus(AgendaTeamStatus.CONFIRM).teamLocation(Location.MIX) .teamName("newName").teamContent("newContent").teamIsPrivate(true) .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); String request = objectMapper.writeValueAsString(updateDto); @@ -440,10 +475,8 @@ void updateAgendaTeamAdminSuccessWithRemoveTeammate() throws Exception { void updateAgendaTeamAdminFailedWithRemoveLeader() throws Exception { // given Agenda agenda = agendaFixture.createAgenda(); - User user = testDataUtils.createNewUser(); - AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda, user); - AgendaProfile leaderProfile = agendaProfileFixture.createAgendaProfile(user, Location.SEOUL); - agendaTeamProfileFixture.createAgendaTeamProfile(agenda, team, leaderProfile); + AgendaProfile seoulUserAgendaProfile = agendaProfileFixture.createAgendaProfile(); + AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda, seoulUserAgendaProfile); List profiles = agendaProfileFixture.createAgendaProfileList(3); profiles.forEach(profile -> agendaTeamProfileFixture .createAgendaTeamProfile(agenda, team, profile)); @@ -453,7 +486,35 @@ void updateAgendaTeamAdminFailedWithRemoveLeader() throws Exception { .collect(Collectors.toList()); AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() .teamKey(team.getTeamKey()).teamMates(updateTeamMates) - .teamStatus(AgendaTeamStatus.CANCEL).teamLocation(Location.MIX) + .teamStatus(AgendaTeamStatus.CONFIRM).teamLocation(Location.MIX) + .teamName("newName").teamContent("newContent").teamIsPrivate(true) + .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); + String request = objectMapper.writeValueAsString(updateDto); + + // when + mockMvc.perform(patch("/agenda/admin/team") + .header("Authorization", "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(request)) + .andExpect(status().isNotFound()); + } + + @Test + @DisplayName("Admin AgendaTeam 수정 실패 - 팀장이 존재하지 않음") + void updateAgendaTeamAdminFailedWithNoLeader() throws Exception { + // given + Agenda agenda = agendaFixture.createAgenda(); + AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda); + List profiles = agendaProfileFixture.createAgendaProfileList(3); + profiles.forEach(profile -> agendaTeamProfileFixture + .createAgendaTeamProfile(agenda, team, profile)); + + List updateTeamMates = profiles.stream() + .map(profile -> new AgendaTeamMateReqDto(profile.getIntraId())) + .collect(Collectors.toList()); + AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() + .teamKey(team.getTeamKey()).teamMates(updateTeamMates) + .teamStatus(AgendaTeamStatus.CONFIRM).teamLocation(Location.MIX) .teamName("newName").teamContent("newContent").teamIsPrivate(true) .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); String request = objectMapper.writeValueAsString(updateDto); @@ -463,7 +524,7 @@ void updateAgendaTeamAdminFailedWithRemoveLeader() throws Exception { .header("Authorization", "Bearer " + accessToken) .contentType(MediaType.APPLICATION_JSON) .content(request)) - .andExpect(status().isForbidden()); + .andExpect(status().isNotFound()); } @Test @@ -481,7 +542,7 @@ void updateAgendaTeamAdminFailedWithInvalidTeamKey() throws Exception { .collect(Collectors.toList()); AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() .teamKey(UUID.randomUUID()).teamMates(updateTeamMates) - .teamStatus(AgendaTeamStatus.CANCEL).teamLocation(Location.MIX) + .teamStatus(AgendaTeamStatus.CONFIRM).teamLocation(Location.MIX) .teamName("newName").teamContent("newContent").teamIsPrivate(true) .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); String request = objectMapper.writeValueAsString(updateDto); @@ -510,7 +571,7 @@ void updateAgendaTeamAdminFailedWithInvalidIntraId() throws Exception { updateTeamMates.add(new AgendaTeamMateReqDto("invalid")); AgendaTeamUpdateDto updateDto = AgendaTeamUpdateDto.builder() .teamKey(team.getTeamKey()).teamMates(updateTeamMates) - .teamStatus(AgendaTeamStatus.CANCEL).teamLocation(Location.MIX) + .teamStatus(AgendaTeamStatus.CONFIRM).teamLocation(Location.MIX) .teamName("newName").teamContent("newContent").teamIsPrivate(true) .teamAward("newAward").teamAwardPriority(team.getAwardPriority() + 1).build(); String request = objectMapper.writeValueAsString(updateDto); @@ -560,6 +621,36 @@ void cancelAgendaTeamAdminSuccess() throws Exception { assertThat(result.getStatus()).isEqualTo(AgendaTeamStatus.CANCEL); assertThat(agendaTeamProfileAdminRepository .findAllByAgendaTeamAndIsExistIsTrue(result).size()).isEqualTo(0); + assertThat(agenda.getCurrentTeam()).isEqualTo(1); + } + + @Nested + @DisplayName("Admin Confirm 상태의 AgendaTeam 취소") + class CancelConfirmAgendaTeamAdmin { + @Test + @DisplayName("Admin AgendaTeam 취소 성공") + void cancelAgendaTeamAdminSuccess() throws Exception { + // given + Agenda agenda = agendaFixture.createAgenda(); + AgendaTeam team = agendaTeamFixture.createAgendaTeam(agenda, SEOUL, AgendaTeamStatus.CONFIRM); + List profiles = agendaProfileFixture.createAgendaProfileList(5); + profiles.forEach(profile -> agendaTeamProfileFixture + .createAgendaTeamProfile(team, profile)); + + // when + mockMvc.perform(patch("/agenda/admin/team/cancel") + .header("Authorization", "Bearer " + accessToken) + .param("team_key", team.getTeamKey().toString())) + .andExpect(status().isNoContent()); + AgendaTeam result = agendaTeamAdminRepository.findByTeamKey(team.getTeamKey()) + .orElseThrow(() -> new AssertionError("AgendaTeam not found")); + + // then + assertThat(result.getStatus()).isEqualTo(AgendaTeamStatus.CANCEL); + assertThat(agendaTeamProfileAdminRepository + .findAllByAgendaTeamAndIsExistIsTrue(result).size()).isEqualTo(0); + assertThat(agenda.getCurrentTeam()).isEqualTo(0); + } } @Test diff --git a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminServiceTest.java b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminServiceTest.java index 03c706703..1c5f7fc63 100644 --- a/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminServiceTest.java +++ b/gg-agenda-api/src/test/java/gg/agenda/api/admin/agendateam/service/AgendaTeamAdminServiceTest.java @@ -176,104 +176,6 @@ void getAgendaProfileListByAgendaTeamFailedWithNoTeam() { @Nested @DisplayName("Admin AgendaTeam 수정") class UpdateAgendaTeamAdmin { - - @Test - @DisplayName("Admin AgendaTeam 수정 성공") - void updateAgendaTeamAdminSuccess() { - // given - Agenda agenda = Agenda.builder().build(); - AgendaTeam team = AgendaTeam.builder().teamKey(UUID.randomUUID()).agenda(agenda).build(); - AgendaProfile profile = AgendaProfile.builder().intraId("intra").build(); - AgendaTeamProfile participant = AgendaTeamProfile.builder() - .agendaTeam(team).agenda(agenda).profile(profile).build(); - AgendaTeamMateReqDto agendaTeamMateReqDto = AgendaTeamMateReqDto.builder() - .intraId("intra").build(); - AgendaTeamUpdateDto agendaTeamUpdateDto = AgendaTeamUpdateDto.builder() - .teamKey(team.getTeamKey()).teamMates(List.of(agendaTeamMateReqDto)).build(); - when(agendaTeamAdminRepository.findByTeamKey(any(UUID.class))).thenReturn(Optional.of(team)); - when(agendaTeamProfileAdminRepository.findAllByAgendaTeamAndIsExistIsTrue(any(AgendaTeam.class))) - .thenReturn(List.of(participant)); - - // when - agendaTeamAdminService.updateAgendaTeam(agendaTeamUpdateDto); - - // then - verify(agendaTeamAdminRepository, times(1)) - .findByTeamKey(any(UUID.class)); - verify(agendaTeamProfileAdminRepository, times(1)) - .findAllByAgendaTeamAndIsExistIsTrue(any(AgendaTeam.class)); - } - - @Test - @DisplayName("Admin AgendaTeam 수정 성공 - 팀원 추가하기") - void updateAgendaTeamAdminSuccessWithAddTeammate() { - // given - Agenda agenda = Agenda.builder().maxPeople(10).build(); - AgendaTeam team = AgendaTeam.builder().teamKey(UUID.randomUUID()).agenda(agenda).build(); - AgendaProfile profile = AgendaProfile.builder().intraId("intra").build(); - AgendaTeamProfile participant = AgendaTeamProfile.builder() - .agendaTeam(team).agenda(agenda).profile(profile).build(); - - AgendaProfile newProfile = AgendaProfile.builder().intraId("newIntra").build(); - List updateTeamMates = new ArrayList<>(); - updateTeamMates.add(AgendaTeamMateReqDto.builder() - .intraId(profile.getIntraId()).build()); - updateTeamMates.add(AgendaTeamMateReqDto.builder() - .intraId(newProfile.getIntraId()).build()); - - AgendaTeamUpdateDto agendaTeamUpdateDto = AgendaTeamUpdateDto.builder() - .teamKey(team.getTeamKey()).teamMates(updateTeamMates).build(); - - when(agendaTeamAdminRepository.findByTeamKey(any(UUID.class))).thenReturn(Optional.of(team)); - when(agendaTeamProfileAdminRepository.findAllByAgendaTeamAndIsExistIsTrue(any(AgendaTeam.class))) - .thenReturn(List.of(participant)); - when(agendaProfileAdminRepository.findByIntraId("newIntra")) - .thenReturn(Optional.of(newProfile)); - when(agendaTeamProfileAdminRepository.save(any(AgendaTeamProfile.class))) - .thenReturn(mock(AgendaTeamProfile.class)); - - // when - agendaTeamAdminService.updateAgendaTeam(agendaTeamUpdateDto); - - // then - verify(agendaTeamAdminRepository, times(1)) - .findByTeamKey(any(UUID.class)); - verify(agendaTeamProfileAdminRepository, times(1)) - .findAllByAgendaTeamAndIsExistIsTrue(any(AgendaTeam.class)); - verify(agendaProfileAdminRepository, times(1)) - .findByIntraId("newIntra"); - verify(agendaTeamProfileAdminRepository, times(1)) - .save(any(AgendaTeamProfile.class)); - } - - @Test - @DisplayName("Admin AgendaTeam 수정 성공 - 팀원 삭제하기") - void updateAgendaTeamAdminSuccessWithRemoveTeammate() { - // given - Agenda agenda = Agenda.builder().build(); - AgendaTeam team = AgendaTeam.builder().teamKey(UUID.randomUUID()).agenda(agenda).build(); - AgendaProfile profile = AgendaProfile.builder().intraId("intra").build(); - AgendaTeamProfile participant = AgendaTeamProfile.builder() - .agendaTeam(team).agenda(agenda).profile(profile).build(); - - AgendaTeamUpdateDto agendaTeamUpdateDto = AgendaTeamUpdateDto.builder() - .teamKey(team.getTeamKey()).teamMates(List.of()).build(); - - when(agendaTeamAdminRepository.findByTeamKey(any(UUID.class))).thenReturn(Optional.of(team)); - when(agendaTeamProfileAdminRepository.findAllByAgendaTeamAndIsExistIsTrue(any(AgendaTeam.class))) - .thenReturn(List.of(participant)); - - // when - agendaTeamAdminService.updateAgendaTeam(agendaTeamUpdateDto); - - // then - verify(agendaTeamAdminRepository, times(1)) - .findByTeamKey(any(UUID.class)); - verify(agendaTeamProfileAdminRepository, times(1)) - .findAllByAgendaTeamAndIsExistIsTrue(any(AgendaTeam.class)); - assertThat(participant.getIsExist()).isFalse(); // leaveTeam() 호출 확인 - } - @Test @DisplayName("Admin AgendaTeam 수정 실패 - 존재하지 않는 Team Key") void updateAgendaTeamAdminFailedWithInvalidTeamKey() { diff --git a/gg-agenda-api/src/test/java/gg/agenda/api/user/agenda/service/AgendaServiceTest.java b/gg-agenda-api/src/test/java/gg/agenda/api/user/agenda/service/AgendaServiceTest.java index 96bbb7811..7ac7d12d0 100644 --- a/gg-agenda-api/src/test/java/gg/agenda/api/user/agenda/service/AgendaServiceTest.java +++ b/gg-agenda-api/src/test/java/gg/agenda/api/user/agenda/service/AgendaServiceTest.java @@ -113,7 +113,7 @@ class GetAgendaListCurrent { void getAgendaListSuccess() { // given int officialSize = 3; - int nonOfficialSize = 6; + int nonOfficialSize = 3; List agendas = new ArrayList<>(); IntStream.range(0, officialSize).forEach(i -> agendas.add(Agenda.builder().isOfficial(true) .deadline(LocalDateTime.now().plusDays(i + 5)).build())); diff --git a/gg-data/src/main/java/gg/data/agenda/Agenda.java b/gg-data/src/main/java/gg/data/agenda/Agenda.java index 8eaeb2158..11c11b025 100644 --- a/gg-data/src/main/java/gg/data/agenda/Agenda.java +++ b/gg-data/src/main/java/gg/data/agenda/Agenda.java @@ -23,6 +23,7 @@ import gg.data.agenda.type.AgendaStatus; import gg.data.agenda.type.AgendaTeamStatus; import gg.data.agenda.type.Location; +import gg.utils.exception.custom.BusinessException; import gg.utils.exception.custom.ForbiddenException; import gg.utils.exception.custom.InvalidParameterException; import lombok.AccessLevel; @@ -320,4 +321,19 @@ public void agendaStatusMustBeConfirm() { throw new InvalidParameterException(AGENDA_ALREADY_FINISHED); } } + + public void adminCancelTeam(AgendaTeamStatus status) { + if (status == AgendaTeamStatus.CONFIRM) { + this.currentTeam--; + } + } + + public void adminConfirmTeam(AgendaTeamStatus status) { + if (status == AgendaTeamStatus.CANCEL) { + throw new BusinessException(AGENDA_TEAM_CANCEL_FAIL); + } + if (status == AgendaTeamStatus.CONFIRM) { + this.currentTeam++; + } + } } diff --git a/gg-data/src/main/java/gg/data/agenda/AgendaTeam.java b/gg-data/src/main/java/gg/data/agenda/AgendaTeam.java index aef548d31..1a69ac55a 100644 --- a/gg-data/src/main/java/gg/data/agenda/AgendaTeam.java +++ b/gg-data/src/main/java/gg/data/agenda/AgendaTeam.java @@ -23,7 +23,6 @@ import gg.data.agenda.type.AgendaTeamStatus; import gg.data.agenda.type.Location; import gg.utils.exception.custom.BusinessException; -import gg.utils.exception.custom.ForbiddenException; import gg.utils.exception.custom.InvalidParameterException; import lombok.AccessLevel; import lombok.Builder; @@ -125,9 +124,6 @@ public void leaveTeamMate() { } public void leaveTeamMateAdmin(String intraId) { - if (intraId.equals(this.leaderIntraId)) { - throw new ForbiddenException(NOT_TEAM_MATE); - } this.mateCount--; } diff --git a/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java b/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java index e39ddf8fa..5526b53d0 100644 --- a/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java +++ b/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java @@ -208,6 +208,7 @@ public enum ErrorCode { AGENDA_TEAM_ALREADY_CONFIRM(400, "AG112", "이미 확정된 팀입니다."), AGENDA_POSTER_SIZE_TOO_LARGE(400, "AG113", "포스터 사이즈가 너무 큽니다."), AGENDA_AWARD_PRIORITY_DUPLICATE(400, "AG114", "시상 우선순위가 중복됩니다."), + AGENDA_TEAM_CANCEL_FAIL(400, "AG115", "팀 취소를 이용해주세요."), AGENDA_NO_CAPACITY(403, "AG201", "해당 일정에 참여할 수 있는 팀이 꽉 찼습니다."), HOST_FORBIDDEN(403, "AG202", "개최자는 팀을 생성할 수 없습니다."), TICKET_NOT_EXIST(403, "AG203", "보유한 티켓이 부족합니다."), @@ -225,6 +226,7 @@ public enum ErrorCode { AGENDA_PROFILE_NOT_FOUND(404, "AG306", "프로필이 존재하지 않습니다."), POINT_HISTORY_NOT_FOUND(404, "AG307", "기부 내역이 존재하지 않습니다."), AGENDA_ANNOUNCEMENT_NOT_FOUND(404, "AG308", "공지사항이 존재하지 않습니다."), + TEAM_LEADER_NOT_FOUND(404, "AG309", "팀장이 존재하지 않습니다."), TEAM_NAME_EXIST(409, "AG401", "이미 존재하는 팀 이름입니다."), ALREADY_TICKET_SETUP(409, "AG402", "이미 티켓 신청이 되어있습니다."), AGENDA_DOES_NOT_CONFIRM(409, "AG403", "확정되지 않은 일정입니다."), diff --git a/gg-utils/src/testFixtures/java/gg/utils/fixture/agenda/AgendaFixture.java b/gg-utils/src/testFixtures/java/gg/utils/fixture/agenda/AgendaFixture.java index c99385bf5..23affa18b 100644 --- a/gg-utils/src/testFixtures/java/gg/utils/fixture/agenda/AgendaFixture.java +++ b/gg-utils/src/testFixtures/java/gg/utils/fixture/agenda/AgendaFixture.java @@ -28,7 +28,7 @@ public Agenda createAgenda() { .endTime(LocalDateTime.now().plusDays(6)) .minTeam(2) .maxTeam(5) - .currentTeam(0) + .currentTeam(1) .minPeople(1) .maxPeople(6) .status(OPEN)