Skip to content

Commit 0d1c7c0

Browse files
committed
test: the same user's multi requests thest
1 parent bc80ada commit 0d1c7c0

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

pennyway-app-external-api/src/main/java/kr/co/pennyway/api/apis/chat/service/ChatMemberJoinService.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import kr.co.pennyway.domain.domains.chatroom.exception.ChatRoomErrorCode;
1010
import kr.co.pennyway.domain.domains.chatroom.exception.ChatRoomErrorException;
1111
import kr.co.pennyway.domain.domains.member.domain.ChatMember;
12-
import kr.co.pennyway.domain.domains.member.exception.ChatMemberErrorCode;
13-
import kr.co.pennyway.domain.domains.member.exception.ChatMemberErrorException;
1412
import kr.co.pennyway.domain.domains.user.domain.User;
1513
import kr.co.pennyway.domain.domains.user.exception.UserErrorCode;
1614
import kr.co.pennyway.domain.domains.user.exception.UserErrorException;
@@ -49,11 +47,6 @@ public class ChatMemberJoinService {
4947
public Triple<ChatRoom, Integer, Long> execute(Long userId, Long chatRoomId, Integer password) {
5048
ChatRoom chatRoom = chatRoomService.readChatRoom(chatRoomId).orElseThrow(() -> new ChatRoomErrorException(ChatRoomErrorCode.NOT_FOUND_CHAT_ROOM));
5149

52-
if (chatMemberService.isExists(chatRoomId, userId)) {
53-
log.warn("이미 채팅방에 참여한 사용자입니다. chatRoomId: {}, userId: {}", chatRoomId, userId);
54-
throw new ChatMemberErrorException(ChatMemberErrorCode.ALREADY_JOINED);
55-
}
56-
5750
Long currentMemberCount = chatMemberService.countActiveMembers(chatRoomId);
5851
if (isFullRoom(currentMemberCount)) {
5952
log.warn("채팅방이 가득 찼습니다. chatRoomId: {}", chatRoomId);

pennyway-app-external-api/src/test/java/kr/co/pennyway/api/apis/chat/integration/ChatMemberJoinIntegrationTest.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import kr.co.pennyway.domain.domains.chatroom.domain.ChatRoom;
1616
import kr.co.pennyway.domain.domains.chatroom.exception.ChatRoomErrorCode;
1717
import kr.co.pennyway.domain.domains.chatroom.repository.ChatRoomRepository;
18+
import kr.co.pennyway.domain.domains.member.exception.ChatMemberErrorCode;
1819
import kr.co.pennyway.domain.domains.member.repository.ChatMemberRepository;
1920
import kr.co.pennyway.domain.domains.user.domain.User;
2021
import kr.co.pennyway.domain.domains.user.repository.UserRepository;
@@ -220,7 +221,44 @@ void successJoinPrivateRoomWithValidPassword() {
220221

221222
// then
222223
assertEquals(HttpStatus.OK, response.getStatusCode());
224+
}
225+
226+
@Test
227+
@DisplayName("같은 사용자가 하나의 채팅방에 동시에 100개의 요청을 보내면, 100개의 가입 요청 중 1개만 성공한다")
228+
void concurrentJoinRequestsFromSameUser() throws InterruptedException {
229+
// given
230+
User admin = userRepository.save(UserFixture.GENERAL_USER.toUser());
231+
ChatRoom chatRoom = chatRoomRepository.save(ChatRoomFixture.PUBLIC_CHAT_ROOM.toEntity(idGenerator.generate()));
232+
chatMemberRepository.save(ChatMemberFixture.ADMIN.toEntity(admin, chatRoom));
233+
234+
User user = userRepository.save(UserFixture.GENERAL_USER.toUser());
235+
236+
// when
237+
CountDownLatch latch = new CountDownLatch(100);
238+
List<CompletableFuture<JoinResult>> futures = IntStream.range(0, 100)
239+
.mapToObj(i -> CompletableFuture.supplyAsync(() -> {
240+
try {
241+
return JoinResult.from(
242+
postJoining(user, chatRoom.getId(), new ChatMemberReq.Join(null))
243+
);
244+
} finally {
245+
latch.countDown();
246+
}
247+
}))
248+
.toList();
249+
250+
latch.await();
251+
252+
List<JoinResult> results = futures.stream()
253+
.map(CompletableFuture::join)
254+
.toList();
223255

256+
// then
257+
assertAll(
258+
() -> assertEquals(1, results.stream().filter(JoinResult::isSuccess).count()),
259+
() -> assertEquals(99, results.stream().filter(JoinResult::isAlreadyJoinedError).count()),
260+
() -> assertEquals(2, chatMemberRepository.countByChatRoomIdAndActive(chatRoom.getId()))
261+
);
224262
}
225263

226264
private ResponseEntity<?> postJoining(User user, Long chatRoomId, ChatMemberReq.Join request) {
@@ -282,5 +320,12 @@ public boolean isFullRoomError() {
282320
}
283321
return false;
284322
}
323+
324+
public boolean isAlreadyJoinedError() {
325+
if (!isSuccess && body instanceof ErrorResponse errorResponse) {
326+
return errorResponse.getCode().equals(ChatMemberErrorCode.ALREADY_JOINED.causedBy().getCode());
327+
}
328+
return false;
329+
}
285330
}
286331
}

0 commit comments

Comments
 (0)