Skip to content

Commit

Permalink
🐛 [Bug] AgendaTeamAdmin에서 cancel 상태로 변경시에 Confirm 팀일경우 currentTeam이 줄…
Browse files Browse the repository at this point in the history
…어들지 않는 버그 발생 #1004 (#1005)
  • Loading branch information
AreSain authored Sep 6, 2024
1 parent 97682d8 commit 3898aee
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 121 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand All @@ -95,13 +96,20 @@ 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
public void cancelAgendaTeam(AgendaTeam agendaTeam) {
List<AgendaTeamProfile> agendaTeamProfiles = agendaTeamProfileAdminRepository
.findAllByAgendaTeamAndIsExistIsTrue(agendaTeam);
agendaTeamProfiles.forEach(AgendaTeamProfile::changeExistFalse);
Agenda agenda = agendaTeam.getAgenda();
agenda.adminCancelTeam(agendaTeam.getStatus());
agendaTeam.adminCancelTeam();
}
}
Original file line number Diff line number Diff line change
@@ -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.*;
Expand Down Expand Up @@ -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<AgendaProfile> profiles = agendaProfileFixture.createAgendaProfileList(5);
profiles.forEach(profile -> agendaTeamProfileFixture
.createAgendaTeamProfile(agenda, team, profile));
agendaTeamProfileFixture.createAgendaTeamProfile(team, seoulUserAgendaProfile);

List<AgendaTeamMateReqDto> 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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -314,19 +317,21 @@ 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<AgendaProfile> profiles = agendaProfileFixture.createAgendaProfileList(3);
profiles.forEach(profile -> agendaTeamProfileFixture
.createAgendaTeamProfile(agenda, team, profile));
AgendaProfile newProfile = agendaProfileFixture.createAgendaProfile();
agendaTeamProfileFixture.createAgendaTeamProfile(team, seoulUserAgendaProfile);

List<AgendaTeamMateReqDto> updateTeamMates = profiles.stream()
.map(profile -> new AgendaTeamMateReqDto(profile.getIntraId()))
.collect(Collectors.toList());
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);
Expand Down Expand Up @@ -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<AgendaProfile> profiles = agendaProfileFixture.createAgendaProfileList(5);
profiles.forEach(profile -> agendaTeamProfileFixture
.createAgendaTeamProfile(agenda, team, profile));

List<AgendaTeamMateReqDto> 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 {
Expand All @@ -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);
Expand All @@ -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<AgendaProfile> 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<AgendaTeamMateReqDto> 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);
Expand Down Expand Up @@ -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<AgendaProfile> profiles = agendaProfileFixture.createAgendaProfileList(3);
profiles.forEach(profile -> agendaTeamProfileFixture
.createAgendaTeamProfile(agenda, team, profile));
Expand All @@ -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<AgendaProfile> profiles = agendaProfileFixture.createAgendaProfileList(3);
profiles.forEach(profile -> agendaTeamProfileFixture
.createAgendaTeamProfile(agenda, team, profile));

List<AgendaTeamMateReqDto> 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);
Expand All @@ -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
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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<AgendaProfile> 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<AgendaTeamMateReqDto> 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() {
Expand Down
Loading

0 comments on commit 3898aee

Please sign in to comment.