Skip to content

Commit

Permalink
[Test] 테스트 코드 작성
Browse files Browse the repository at this point in the history
  • Loading branch information
AreSain committed Sep 2, 2024
1 parent 852da37 commit 3733ee3
Show file tree
Hide file tree
Showing 3 changed files with 188 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package gg.agenda.api.user.agendateam.controller;

import static gg.data.agenda.type.AgendaTeamStatus.*;
import static gg.utils.exception.ErrorCode.*;

import java.util.List;
import java.util.Optional;
Expand Down Expand Up @@ -42,6 +43,7 @@
import gg.data.agenda.type.Coalition;
import gg.utils.dto.PageRequestDto;
import gg.utils.dto.PageResponseDto;
import gg.utils.exception.custom.ForbiddenException;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.RequiredArgsConstructor;

Expand Down Expand Up @@ -115,6 +117,9 @@ public ResponseEntity<Void> leaveAgendaTeam(@Parameter(hidden = true) @Login Use
AgendaTeam agendaTeam = agendaTeamService.getAgendaTeam(teamKeyReqDto.getTeamKey());
agendaTeam.getAgenda().agendaStatusMustBeOpen();
agendaTeam.agendaTeamStatusMustBeOpenAndConfirm();
if (!agendaTeam.getLeaderIntraId().equals(user.getIntraId())) {
throw new ForbiddenException(TEAM_LEADER_FORBIDDEN);
}
agendaTeamService.leaveTeamAll(agendaTeam);
agendaSlackService.slackCancelAgendaTeam(agendaTeam.getAgenda(), agendaTeam);
return ResponseEntity.noContent().build();
Expand All @@ -130,6 +135,9 @@ public ResponseEntity<Void> dropAgendaTeamMate(@Parameter(hidden = true) @Login
AgendaTeam agendaTeam = agendaTeamService.getAgendaTeam(teamKeyReqDto.getTeamKey());
agendaTeam.getAgenda().agendaStatusMustBeOpen();
agendaTeam.agendaTeamStatusMustBeOpen();
if (agendaTeam.getLeaderIntraId().equals(user.getIntraId())) {
throw new ForbiddenException(NOT_TEAM_MATE);
}
agendaTeamService.leaveTeamMate(agendaTeam, user);
agendaSlackService.slackLeaveTeamMate(agendaTeam.getAgenda(), agendaTeam, user.getIntraId());
return ResponseEntity.noContent().build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -827,7 +827,7 @@ public void notValidAgendaTeam() throws Exception {
}

@Nested
@DisplayName(" Leave 테스트")
@DisplayName("팀장 Leave 테스트")
class LeaveTeamTest {
@BeforeEach
void beforeEach() {
Expand All @@ -843,34 +843,22 @@ void beforeEach() {
}

@Test
@DisplayName("200 팀원 팀 나가기 성공")
@DisplayName("403 팀원 팀 나가기 실패")
public void leaveTeamMateSuccess() throws Exception {
//given
Agenda agenda = agendaMockData.createAgenda(SEOUL);
AgendaTeam team = agendaMockData.createAgendaTeam(agenda, seoulUser, 2);
agendaMockData.createAgendaTeamProfile(team, seoulUserAgendaProfile);
AgendaTeamProfile atp = agendaMockData.createAgendaTeamProfile(team, anotherSeoulUserAgendaProfile);
agendaMockData.createAgendaTeamProfile(team, anotherSeoulUserAgendaProfile);
// when
mockMvc.perform(
patch("/agenda/team/cancel")
.header("Authorization", "Bearer " + anotherSeoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.param("teamKey", team.getTeamKey().toString())
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isNoContent());
.andExpect(status().isForbidden());
// then
AgendaTeam updatedTeam = agendaTeamRepository.findByTeamKey(team.getTeamKey()).orElse(null);
assert updatedTeam != null;
assertThat(updatedTeam.getMateCount()).isEqualTo(1);
assertThat(agenda.getCurrentTeam()).isEqualTo(1);
AgendaTeamProfile updatedAtp = agendaTeamProfileRepository.findById(atp.getId()).orElse(null);
assert updatedAtp != null;
assertThat(updatedAtp.getIsExist()).isFalse();
ticketRepository.findFirstByAgendaProfileAndIsApprovedTrueAndIsUsedFalseOrderByCreatedAtAsc(
updatedAtp.getProfile())
.ifPresent(ticket -> {
assertThat(ticket.getUsedTo()).isNull();
});
}

@Test
Expand Down Expand Up @@ -999,6 +987,176 @@ public void notValidAgendaTeamStatusWhenTeamLeader() throws Exception {
.andExpect(status().isBadRequest());
}

@Test
@DisplayName("400 탈퇴 불가능한 Agenda 시간으로 인한 실패")
public void notValidAgendaDeadline() throws Exception {
//given
Agenda agenda = agendaMockData.createAgenda(LocalDateTime.now().minusHours(1));
AgendaTeam team = agendaMockData.createAgendaTeam(agenda, seoulUser, SEOUL);
agendaMockData.createAgendaTeamProfile(team, seoulUserAgendaProfile);
TeamKeyReqDto req = new TeamKeyReqDto(team.getTeamKey());
String content = objectMapper.writeValueAsString(req);
// when && then
mockMvc.perform(
patch("/agenda/team/cancel")
.header("Authorization", "Bearer " + seoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.content(content)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isBadRequest());
}

@Test
@DisplayName("403 탈퇴 불가능한 Agenda Status 으로 인한 실패")
public void notValidAgendaStatus() throws Exception {
//given
Agenda agenda = agendaMockData.createAgenda(FINISH);
AgendaTeam team = agendaMockData.createAgendaTeam(agenda, seoulUser, SEOUL);
agendaMockData.createAgendaTeamProfile(team, seoulUserAgendaProfile);
TeamKeyReqDto req = new TeamKeyReqDto(team.getTeamKey());
String content = objectMapper.writeValueAsString(req);
// when && then
mockMvc.perform(
patch("/agenda/team/cancel")
.header("Authorization", "Bearer " + seoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.content(content)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isBadRequest());
}

@Test
@DisplayName("403 팀장이 아님으로 인한 실패")
public void notTeamMateFail() throws Exception {
//given
Agenda agenda = agendaMockData.createAgenda(SEOUL);
AgendaTeam team = agendaMockData.createAgendaTeam(agenda, seoulUser, 2);
agendaMockData.createAgendaTeamProfile(team, seoulUserAgendaProfile);
// when && then
mockMvc.perform(
patch("/agenda/team/cancel")
.header("Authorization", "Bearer " + gyeongsanUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.param("teamKey", team.getTeamKey().toString())
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isForbidden());
}
}

@Nested
@DisplayName("팀원 Drop 테스트")
class DropTeamTest {
@BeforeEach
void beforeEach() {
seoulUser = testDataUtils.createNewUser();
seoulUserAccessToken = testDataUtils.getLoginAccessTokenFromUser(seoulUser);
seoulUserAgendaProfile = agendaMockData.createAgendaProfile(seoulUser, SEOUL);
anotherSeoulUser = testDataUtils.createNewUser();
anotherSeoulUserAccessToken = testDataUtils.getLoginAccessTokenFromUser(anotherSeoulUser);
anotherSeoulUserAgendaProfile = agendaMockData.createAgendaProfile(anotherSeoulUser, SEOUL);
gyeongsanUser = testDataUtils.createNewUser();
gyeongsanUserAccessToken = testDataUtils.getLoginAccessTokenFromUser(gyeongsanUser);
gyeongsanUserAgendaProfile = agendaMockData.createAgendaProfile(gyeongsanUser, GYEONGSAN);
}

@Test
@DisplayName("200 팀원 팀 나가기 성공")
public void leaveTeamMateSuccess() throws Exception {
//given
Agenda agenda = agendaMockData.createAgenda(SEOUL);
AgendaTeam team = agendaMockData.createAgendaTeam(agenda, seoulUser, 2);
agendaMockData.createAgendaTeamProfile(team, seoulUserAgendaProfile);
AgendaTeamProfile atp = agendaMockData.createAgendaTeamProfile(team, anotherSeoulUserAgendaProfile);
// when
mockMvc.perform(
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + anotherSeoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.param("teamKey", team.getTeamKey().toString())
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isNoContent());
// then
AgendaTeam updatedTeam = agendaTeamRepository.findByTeamKey(team.getTeamKey()).orElse(null);
assert updatedTeam != null;
assertThat(updatedTeam.getMateCount()).isEqualTo(1);
assertThat(agenda.getCurrentTeam()).isEqualTo(1);
AgendaTeamProfile updatedAtp = agendaTeamProfileRepository.findById(atp.getId()).orElse(null);
assert updatedAtp != null;
assertThat(updatedAtp.getIsExist()).isFalse();
ticketRepository.findFirstByAgendaProfileAndIsApprovedTrueAndIsUsedFalseOrderByCreatedAtAsc(
updatedAtp.getProfile())
.ifPresent(ticket -> {
assertThat(ticket.getUsedTo()).isNull();
});
}

@Test
@DisplayName("403 팀리더 팀 나가기 실패")
public void leaveTeamLeaderSuccess() throws Exception {
//given
Agenda agenda = agendaMockData.createAgenda(SEOUL);
AgendaTeam team = agendaMockData.createAgendaTeam(agenda, seoulUser, 2);
AgendaTeamProfile atpLeader = agendaMockData.createAgendaTeamProfile(team, seoulUserAgendaProfile);
AgendaTeamProfile atp = agendaMockData.createAgendaTeamProfile(team, anotherSeoulUserAgendaProfile);
// when
mockMvc.perform(
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + seoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.param("teamKey", team.getTeamKey().toString())
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isForbidden());
}

@Test
@DisplayName("403 Confirm 팀 리더 팀 나가기 실패")
public void leaveTeamLeaderTeamStatusConfirmSuccess() throws Exception {
//given
Agenda agenda = agendaMockData.createAgenda(SEOUL);
AgendaTeam team = agendaMockData.createAgendaTeam(agenda, seoulUser, SEOUL, AgendaTeamStatus.CONFIRM);
agendaMockData.createAgendaTeamProfile(team, seoulUserAgendaProfile);
agendaMockData.createAgendaTeamProfile(team, anotherSeoulUserAgendaProfile);
// when
mockMvc.perform(
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + seoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.param("teamKey", team.getTeamKey().toString())
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isBadRequest());
}

@Test
@DisplayName("404 agenda 없음으로 인한 실패")
public void noAgendaFail() throws Exception {
//given
UUID noAgendaKey = UUID.randomUUID();
UUID noTeamKey = UUID.randomUUID();
// when && then
mockMvc.perform(
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + seoulUserAccessToken)
.param("agenda_key", noAgendaKey.toString())
.param("teamKey", noTeamKey.toString())
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isNotFound());
}

@Test
@DisplayName("404 team 없음으로 인한 실패")
public void noTeamFail() throws Exception {
//given
Agenda agenda = agendaMockData.createAgenda(SEOUL);
// when && then
mockMvc.perform(
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + seoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.param("teamKey", UUID.randomUUID().toString())
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isNotFound());
}

@Test
@DisplayName("400 탈퇴 불가능한 AgendaTeam Status로 인한 팀원의 나가기 실패")
public void notValidAgendaTeamStatusConfirmWhenTeamMate() throws Exception {
Expand All @@ -1011,7 +1169,7 @@ public void notValidAgendaTeamStatusConfirmWhenTeamMate() throws Exception {
String content = objectMapper.writeValueAsString(req);
// when && then
mockMvc.perform(
patch("/agenda/team/cancel")
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + anotherSeoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.content(content)
Expand All @@ -1031,7 +1189,7 @@ public void notValidAgendaTeamStatusCoiWhenTeamMate() throws Exception {
String content = objectMapper.writeValueAsString(req);
// when && then
mockMvc.perform(
patch("/agenda/team/cancel")
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + anotherSeoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.content(content)
Expand All @@ -1050,7 +1208,7 @@ public void notValidAgendaDeadline() throws Exception {
String content = objectMapper.writeValueAsString(req);
// when && then
mockMvc.perform(
patch("/agenda/team/cancel")
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + seoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.content(content)
Expand All @@ -1069,7 +1227,7 @@ public void notValidAgendaStatus() throws Exception {
String content = objectMapper.writeValueAsString(req);
// when && then
mockMvc.perform(
patch("/agenda/team/cancel")
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + seoulUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.content(content)
Expand All @@ -1086,7 +1244,7 @@ public void notTeamMateFail() throws Exception {
agendaMockData.createAgendaTeamProfile(team, seoulUserAgendaProfile);
// when && then
mockMvc.perform(
patch("/agenda/team/cancel")
patch("/agenda/team/drop")
.header("Authorization", "Bearer " + gyeongsanUserAccessToken)
.param("agenda_key", agenda.getAgendaKey().toString())
.param("teamKey", team.getTeamKey().toString())
Expand Down
2 changes: 1 addition & 1 deletion gg-utils/src/main/java/gg/utils/exception/ErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ public enum ErrorCode {
NOT_TEAM_MATE(403, "AG204", "팀원이 아닙니다."),
CONFIRM_FORBIDDEN(403, "AG205", "개최자만 일정을 종료할 수 있습니다."),
TICKET_FORBIDDEN(403, "AG206", "티켓 신청은 1분의 대기시간이 있습니다."),
TEAM_LEADER_FORBIDDEN(403, "AG207", "팀장만 팀을 확정할 수 있습니다."),
TEAM_LEADER_FORBIDDEN(403, "AG207", "팀장이 아닙니다."),
AGENDA_TEAM_FORBIDDEN(403, "AG208", "일정에 참여한 팀이 있습니다."),
AGENDA_MODIFICATION_FORBIDDEN(403, "AG209", "개최자만 일정을 수정할 수 있습니다."),
AUTH_NOT_FOUND(404, "AG301", "42 정보가 만료되었습니다."),
Expand Down

0 comments on commit 3733ee3

Please sign in to comment.