Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat/29] 친구 요청 거절 API 구현 및 테스트 #31

Merged
merged 3 commits into from
Dec 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,12 @@ public ApiResponse<FriendRequestResponse> acceptFriendRequest(@PathVariable(name
return ApiResponse.ok(friendFacadeService.acceptFriendRequest(member, targetMemberId));
}

@Operation(summary = "친구 요청 거절 API", description = "대상 회원이 보낸 친구 요청을 거절 처리하는 API 입니다.")
@Parameter(name = "memberId", description = "친구 요청을 거절할 대상 회원의 id 입니다.")
@PatchMapping("/request/{memberId}/reject")
public ApiResponse<FriendRequestResponse> rejectFriendRequest(@PathVariable(name = "memberId") Long targetMemberId,
@AuthMember Member member) {
return ApiResponse.ok(friendFacadeService.rejectFriendRequest(member, targetMemberId));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,19 @@ public FriendRequestResponse acceptFriendRequest(Member member, Long targetMembe
return FriendRequestResponse.of(friendRequest.getFromMember().getId(), "친구 요청 수락 성공");
}

/**
* 친구 요청 거절 Facade 메소드
*
* @param member
* @param targetMemberId
* @return
*/
@Transactional
public FriendRequestResponse rejectFriendRequest(Member member, Long targetMemberId) {
Member targetMember = memberService.findMember(targetMemberId);
FriendRequest friendRequest = friendService.rejectFriendRequest(member, targetMember);

return FriendRequestResponse.of(friendRequest.getFromMember().getId(), "친구 요청 거절 성공");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,31 @@ public FriendRequest acceptFriendRequest(Member member, Member targetMember) {
return friendRequest;
}

/**
* targetMember가 보낸 친구 요청 거절 처리 메소드
*
* @param member
* @param targetMember
* @return
*/
@Transactional
public FriendRequest rejectFriendRequest(Member member, Member targetMember) {
// targetMember로 나 자신을 요청한 경우 검증
validateNotSelf(member, targetMember);

// 수락 대기 상태인 FriendRequest 엔티티 조회 및 검증
FriendRequest friendRequest = friendRequestRepository.findByFromMemberAndToMemberAndStatus(targetMember,
member, FriendRequestStatus.PENDING)
.orElseThrow(() -> new FriendException(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST));

// FriendRequest 엔티티 상태 변경
friendRequest.updateStatus(FriendRequestStatus.REJECTED);

// targetMember에게 친구 요청 거절 알림 생성

return friendRequest;
}

private void validateNotSelf(Member member, Member targetMember) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 private 메소드에도 // 한 줄 주석으로 어떤 메소드인지 알려주는걸 추가하는건 어떠신가요?

if (member.equals(targetMember)) {
throw new FriendException(ErrorCode.FRIEND_BAD_REQUEST);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,4 +198,55 @@ void acceptFriendRequestFailedWhenNoPendingRequest() throws Exception {

}

@Nested
@DisplayName("친구 요청 거절")
class rejectFriendRequestTest {

@DisplayName("친구 요청 거절 성공")
@Test
void rejectFriendRequestSucceeds() throws Exception {
// given
FriendRequestResponse response = FriendRequestResponse.builder()
.targetMemberId(TARGET_MEMBER_ID)
.message("친구 요청 거절 성공")
.build();

given(friendFacadeService.rejectFriendRequest(any(), any())).willReturn(response);

// when // then
mockMvc.perform(patch(API_URL_PREFIX + "/request/{memberId}/reject", TARGET_MEMBER_ID))
.andExpect(status().isOk())
.andExpect(jsonPath("$.message").value("OK"))
.andExpect(jsonPath("$.data.message").value("친구 요청 거절 성공"))
.andExpect(jsonPath("$.data.targetMemberId").value(TARGET_MEMBER_ID));
}

@DisplayName("친구 요청 거절 실패: 본인 id를 요청한 경우 에러 응답을 반환한다.")
@Test
void rejectFriendRequestFailedWhenTargetIsSelf() throws Exception {
// given
willThrow(new FriendException(ErrorCode.FRIEND_BAD_REQUEST))
.given(friendFacadeService).rejectFriendRequest(any(), eq(TARGET_MEMBER_ID));

// when // then
mockMvc.perform(patch(API_URL_PREFIX + "/request/{memberId}/reject", TARGET_MEMBER_ID))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.message").value(ErrorCode.FRIEND_BAD_REQUEST.getMessage()));
}

@DisplayName("친구 요청 거절 실패: PENDING 상태인 친구 요청이 없는 경우 에러 응답을 반환한다.")
@Test
void rejectFriendRequestFailedWhenNoPendingRequest() throws Exception {
// given
willThrow(new FriendException(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST))
.given(friendFacadeService).rejectFriendRequest(any(), eq(TARGET_MEMBER_ID));

// when // then
mockMvc.perform(patch(API_URL_PREFIX + "/request/{memberId}/reject", TARGET_MEMBER_ID))
.andExpect(status().isNotFound())
.andExpect(jsonPath("$.message").value(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST.getMessage()));
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

@ActiveProfiles("test")
Expand Down Expand Up @@ -206,7 +207,7 @@ void acceptFriendRequest_shouldThrowWhenTargetIsSelf() {

@DisplayName("친구 요청 수락 실패: PENDING 상태인 친구 요청이 없는 경우 예외가 발생한다")
@Test
void accpetFriendRequest_shouldThrowWhenNoPendingRequest() {
void acceptFriendRequest_shouldThrowWhenNoPendingRequest() {
// given
Member member = createMember(MEMBER_EMAIL, MEMBER_GAMENAME);
Member targetMember = createMember("target@naver.com", "target");
Expand All @@ -217,6 +218,50 @@ void accpetFriendRequest_shouldThrowWhenNoPendingRequest() {
.hasMessage(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST.getMessage());
}


@DisplayName("친구 요청 거절 성공")
@Test
void rejectFriendRequestSucceeds() {
// given
Member member = createMember(MEMBER_EMAIL, MEMBER_GAMENAME);
Member targetMember = createMember("target@naver.com", "target");

// 상대 -> 나 친구 요청 생성
friendRequestRepository.save(FriendRequest.create(targetMember, member));

// when
FriendRequestResponse response = friendFacadeService.rejectFriendRequest(member, targetMember.getId());

// then
assertThat(response.getTargetMemberId()).isEqualTo(targetMember.getId());
assertFalse(friendRepository.existsByFromMemberAndToMember(member, targetMember));
}

@DisplayName("친구 요청 거절 실패: 본인 id를 요청한 경우 예외가 발생한다.")
@Test
void rejectFriendRequest_shouldThrowWhenTargetIsSelf() {
// given
Member member = createMember(MEMBER_EMAIL, MEMBER_GAMENAME);

// when // then
assertThatThrownBy(() -> friendFacadeService.rejectFriendRequest(member, member.getId()))
.isInstanceOf(FriendException.class)
.hasMessage(ErrorCode.FRIEND_BAD_REQUEST.getMessage());
}

@DisplayName("친구 요청 거절 실패: PENDING 상태인 친구 요청이 없는 경우 예외가 발생한다")
@Test
void rejectFriendRequest_shouldThrowWhenNoPendingRequest() {
// given
Member member = createMember(MEMBER_EMAIL, MEMBER_GAMENAME);
Member targetMember = createMember("target@naver.com", "target");

// when // then
assertThatThrownBy(() -> friendFacadeService.rejectFriendRequest(member, targetMember.getId()))
.isInstanceOf(FriendException.class)
.hasMessage(ErrorCode.PENDING_FRIEND_REQUEST_NOT_EXIST.getMessage());
}

private Member createMember(String email, String gameName) {
return memberRepository.save(Member.builder()
.email(email)
Expand Down
Loading