Skip to content

Commit

Permalink
Merge pull request #30 from Seasoning-Today/refactor/#14-prevent-send…
Browse files Browse the repository at this point in the history
…ing-a-friend-request-to-an-already-existing-friend

예외처리 : 이미 친구인 사용자에게 친구 신청
  • Loading branch information
csct3434 authored Jan 27, 2024
2 parents 4acd073 + 6e86aaa commit 5fc99fe
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import today.seasoning.seasoning.friendship.service.CancelFriendRequestService;
import today.seasoning.seasoning.friendship.service.DeclineFriendRequestService;
import today.seasoning.seasoning.friendship.service.FindUserFriendsService;
import today.seasoning.seasoning.friendship.service.RequestFriendshipService;
import today.seasoning.seasoning.friendship.service.SendFriendRequestService;
import today.seasoning.seasoning.friendship.service.SearchUserService;
import today.seasoning.seasoning.friendship.service.UnfriendService;

Expand All @@ -29,13 +29,13 @@
@RequiredArgsConstructor
public class FriendshipController {

private final RequestFriendshipService requestFriendshipService;
private final UnfriendService unfriendService;
private final SearchUserService searchUserService;
private final FindUserFriendsService findUserFriendsService;
private final SendFriendRequestService sendFriendRequestService;
private final AcceptFriendRequestService acceptFriendRequestService;
private final CancelFriendRequestService cancelFriendRequestService;
private final DeclineFriendRequestService declineFriendRequestService;
private final UnfriendService unfriendService;
private final SearchUserService searchUserService;

@RequestMapping("/add")
public ResponseEntity<String> requestFriendship(
Expand All @@ -45,7 +45,7 @@ public ResponseEntity<String> requestFriendship(
Long userId = principal.getId();
String requesteeAccountId = accountIdDto.getAccountId();

requestFriendshipService.doService(userId, requesteeAccountId);
sendFriendRequestService.doService(userId, requesteeAccountId);

return ResponseEntity.ok().body("신청 완료");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import today.seasoning.seasoning.common.util.EntitySerializationUtil;
import today.seasoning.seasoning.friendship.domain.FriendRequest;
import today.seasoning.seasoning.friendship.domain.FriendRequestRepository;
import today.seasoning.seasoning.friendship.domain.FriendshipRepository;
import today.seasoning.seasoning.notification.domain.NotificationType;
import today.seasoning.seasoning.notification.service.NotificationService;
import today.seasoning.seasoning.user.domain.User;
Expand All @@ -17,10 +18,11 @@
@Service
@Transactional
@RequiredArgsConstructor
public class RequestFriendshipService {
public class SendFriendRequestService {

private final UserRepository userRepository;
private final NotificationService notificationService;
private final FriendshipRepository friendshipRepository;
private final FriendRequestRepository friendRequestRepository;

public void doService(Long fromUserId, String toUserAccountId) {
Expand All @@ -37,12 +39,19 @@ public void doService(Long fromUserId, String toUserAccountId) {
}

private void checkException(User fromUser, User toUser) {
// 자신에게 친구 요청한 경우
if (fromUser == toUser) {
throw new CustomException(HttpStatus.BAD_REQUEST, "Invalid Request");
}

// 이미 친구 신청을 한 경우
if (friendRequestRepository.existsByFromUserIdAndToUserId(fromUser.getId(), toUser.getId())) {
throw new CustomException(HttpStatus.CONFLICT, "Already Requested");
throw new CustomException(HttpStatus.CONFLICT, "Friend request already sent");
}

// 이미 친구인 경우
if (friendshipRepository.existsByUserIdAndFriendId(fromUser.getId(), toUser.getId())) {
throw new CustomException(HttpStatus.CONFLICT, "Already friends with this user");
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,25 @@
import today.seasoning.seasoning.common.enums.LoginType;
import today.seasoning.seasoning.common.exception.CustomException;
import today.seasoning.seasoning.friendship.domain.FriendRequestRepository;
import today.seasoning.seasoning.friendship.domain.FriendshipRepository;
import today.seasoning.seasoning.notification.service.NotificationService;
import today.seasoning.seasoning.user.domain.User;
import today.seasoning.seasoning.user.domain.UserRepository;

@DisplayName("친구 신청 서비스")
@ExtendWith(MockitoExtension.class)
class RequestFriendshipServiceTest {
class SendFriendRequestServiceTest {

@Mock
UserRepository userRepository;
@Mock
NotificationService notificationService;
@Mock
FriendRequestRepository friendRequestRepository;

@Mock
FriendshipRepository friendshipRepository;
@InjectMocks
RequestFriendshipService requestFriendshipService;
SendFriendRequestService sendFriendRequestService;

User requester = new User("requester", "https://test.com/requester.jpg", "requester@email.com", LoginType.KAKAO);
User requestee = new User("requestee", "https://test.com/requestee.jpg", "requestee@email.com", LoginType.KAKAO);
Expand All @@ -54,7 +56,7 @@ void success() {
.willReturn(false);

//when & then : 예외가 발생하지 않는다
assertDoesNotThrow(() -> requestFriendshipService.doService(requester.getId(), requestee.getAccountId()));
assertDoesNotThrow(() -> sendFriendRequestService.doService(requester.getId(), requestee.getAccountId()));
}

@Test
Expand Down Expand Up @@ -82,7 +84,7 @@ void failedBySelfRequest() {
}

@Test
@DisplayName("실패 - 이미 신청함")
@DisplayName("실패 - 이미 신청한 상태")
void failedByAlreadyExists() {
//given : 친구 신청 내역이 존재하는 경우(=이미 신청한 경우)
given(friendRequestRepository.existsByFromUserIdAndToUserId(requester.getId(), requestee.getId()))
Expand All @@ -95,8 +97,25 @@ void failedByAlreadyExists() {
assertFailedValidation(requester.getId(), requestee.getAccountId(), HttpStatus.CONFLICT);
}

@Test
@DisplayName("실패 - 이미 친구인 상태")
void test() {
//given: 이미 친구인 경우
given(friendshipRepository.existsByUserIdAndFriendId(requester.getId(), requestee.getId()))
.willReturn(true);

given(userRepository.findByAccountId(requestee.getAccountId()))
.willReturn(Optional.of(requestee));

given(friendRequestRepository.existsByFromUserIdAndToUserId(requester.getId(), requestee.getId()))
.willReturn(false);

//when & then : 409 Conflict 예외가 발생한다
assertFailedValidation(requester.getId(), requestee.getAccountId(), HttpStatus.CONFLICT);
}

private void assertFailedValidation(Long requesterId, String requesteeAccountId, HttpStatus httpStatus) {
assertThatThrownBy(() -> requestFriendshipService.doService(requesterId, requesteeAccountId))
assertThatThrownBy(() -> sendFriendRequestService.doService(requesterId, requesteeAccountId))
.isInstanceOf(CustomException.class)
.hasFieldOrPropertyWithValue("httpStatus", httpStatus);
}
Expand Down

0 comments on commit 5fc99fe

Please sign in to comment.