From 0b2999ea2abbeb05cc0b13ef35e78b69823b126c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Wed, 18 Mar 2026 18:57:20 +0900 Subject: [PATCH 1/5] =?UTF-8?q?test:=20=EC=B1=84=ED=8C=85=20API=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integration/domain/chat/ChatApiTest.java | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java diff --git a/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java new file mode 100644 index 00000000..7d4dc913 --- /dev/null +++ b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java @@ -0,0 +1,222 @@ +package gg.agit.konect.integration.domain.chat; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.time.LocalDateTime; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import gg.agit.konect.domain.chat.dto.ChatMessageSendRequest; +import gg.agit.konect.domain.chat.dto.ChatRoomCreateRequest; +import gg.agit.konect.domain.chat.model.ChatMessage; +import gg.agit.konect.domain.chat.model.ChatRoom; +import gg.agit.konect.domain.chat.model.ChatRoomMember; +import gg.agit.konect.domain.chat.repository.ChatMessageRepository; +import gg.agit.konect.domain.chat.repository.ChatRoomRepository; +import gg.agit.konect.domain.chat.service.ChatPresenceService; +import gg.agit.konect.domain.club.model.Club; +import gg.agit.konect.domain.notification.enums.NotificationTargetType; +import gg.agit.konect.domain.notification.repository.NotificationMuteSettingRepository; +import gg.agit.konect.domain.notification.service.NotificationService; +import gg.agit.konect.domain.university.model.University; +import gg.agit.konect.domain.user.model.User; +import gg.agit.konect.support.IntegrationTestSupport; +import gg.agit.konect.support.fixture.ClubFixture; +import gg.agit.konect.support.fixture.ClubMemberFixture; +import gg.agit.konect.support.fixture.UniversityFixture; +import gg.agit.konect.support.fixture.UserFixture; + +class ChatApiTest extends IntegrationTestSupport { + + @Autowired + private ChatRoomRepository chatRoomRepository; + + @Autowired + private ChatMessageRepository chatMessageRepository; + + @Autowired + private NotificationMuteSettingRepository notificationMuteSettingRepository; + + @MockitoBean + private ChatPresenceService chatPresenceService; + + @MockitoBean + private NotificationService notificationService; + + private User adminUser; + private User normalUser; + private User targetUser; + private User outsiderUser; + private Club club; + + @BeforeEach + void setUp() { + University university = persist(UniversityFixture.create()); + adminUser = persist(UserFixture.createAdmin(university)); + normalUser = persist(UserFixture.createUser(university, "일반유저", "2021136001")); + targetUser = persist(UserFixture.createUser(university, "상대유저", "2021136002")); + outsiderUser = persist(UserFixture.createUser(university, "외부유저", "2021136003")); + club = persist(ClubFixture.create(university, "BCSD Lab")); + persist(ClubMemberFixture.createPresident(club, normalUser)); + persist(ClubMemberFixture.createMember(club, targetUser)); + clearPersistenceContext(); + } + + @Nested + @DisplayName("POST /chats/rooms - 일반 채팅방 생성") + class CreateDirectChatRoom { + + @Test + @DisplayName("일반 채팅방을 생성한다") + void createDirectChatRoomSuccess() throws Exception { + // given + mockLoginUser(normalUser.getId()); + + // when & then + performPost("/chats/rooms", new ChatRoomCreateRequest(targetUser.getId())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.chatRoomId").isNumber()); + + clearPersistenceContext(); + assertThat(chatRoomRepository.findByTwoUsers(normalUser.getId(), targetUser.getId())).isPresent(); + } + } + + @Nested + @DisplayName("POST /chats/rooms/admin, GET /chats/rooms - 관리자 전용 방 생성 및 조회") + class AdminChatRoom { + + @Test + @DisplayName("관리자 전용 방을 만들고 목록에서 조회한다") + void createAdminChatRoomAndGetRoomsSuccess() throws Exception { + // given + mockLoginUser(normalUser.getId()); + + // when + performPost("/chats/rooms/admin") + .andExpect(status().isOk()) + .andExpect(jsonPath("$.chatRoomId").isNumber()); + + // then + performGet("/chats/rooms") + .andExpect(status().isOk()) + .andExpect(jsonPath("$.rooms[0].chatType").value("DIRECT")) + .andExpect(jsonPath("$.rooms[0].roomName").value(adminUser.getName())) + .andExpect(jsonPath("$.rooms[0].lastMessage").doesNotExist()) + .andExpect(jsonPath("$.rooms[0].isMuted").value(false)); + } + } + + @Nested + @DisplayName("POST /chats/rooms/{chatRoomId}/messages - 메시지 전송") + class SendMessage { + + @Test + @DisplayName("메시지를 전송하고 응답 형태를 반환한다") + void sendMessageSuccess() throws Exception { + // given + ChatRoom chatRoom = createDirectChatRoom(normalUser, targetUser); + mockLoginUser(normalUser.getId()); + + // when & then + performPost("/chats/rooms/" + chatRoom.getId() + "/messages", new ChatMessageSendRequest("안녕하세요")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.messageId").isNumber()) + .andExpect(jsonPath("$.senderId").value(normalUser.getId())) + .andExpect(jsonPath("$.senderName").doesNotExist()) + .andExpect(jsonPath("$.content").value("안녕하세요")) + .andExpect(jsonPath("$.isRead").value(true)) + .andExpect(jsonPath("$.unreadCount").isNumber()) + .andExpect(jsonPath("$.isMine").value(true)); + + clearPersistenceContext(); + assertThat(chatMessageRepository.findByChatRoomId(chatRoom.getId(), PageRequest.of(0, 20)).getContent()) + .hasSize(1) + .extracting(ChatMessage::getContent) + .containsExactly("안녕하세요"); + } + } + + @Nested + @DisplayName("GET /chats/rooms/{chatRoomId} - 채팅방 메시지 조회 실패") + class GetMessagesFail { + + @Test + @DisplayName("존재하지 않는 채팅방이면 404를 반환한다") + void getMessagesNotFound() throws Exception { + // given + mockLoginUser(normalUser.getId()); + + // when & then + performGet("/chats/rooms/99999?page=1&limit=20") + .andExpect(status().isNotFound()) + .andExpect(jsonPath("$.code").value("NOT_FOUND_CHAT_ROOM")); + } + + @Test + @DisplayName("참여하지 않은 사용자가 조회하면 403을 반환한다") + void getMessagesForbidden() throws Exception { + // given + ChatRoom chatRoom = createDirectChatRoom(normalUser, targetUser); + mockLoginUser(outsiderUser.getId()); + + // when & then + performGet("/chats/rooms/" + chatRoom.getId() + "?page=1&limit=20") + .andExpect(status().isForbidden()) + .andExpect(jsonPath("$.code").value("FORBIDDEN_CHAT_ROOM_ACCESS")); + } + } + + @Nested + @DisplayName("POST /chats/rooms/{chatRoomId}/mute - 채팅방 뮤트 토글") + class ToggleMute { + + @Test + @DisplayName("뮤트를 켰다가 다시 끈다") + void toggleMuteSuccessAndDuplicateProcessing() throws Exception { + // given + ChatRoom chatRoom = createDirectChatRoom(normalUser, targetUser); + mockLoginUser(normalUser.getId()); + + // when & then + performPost("/chats/rooms/" + chatRoom.getId() + "/mute") + .andExpect(status().isOk()) + .andExpect(jsonPath("$.isMuted").value(true)); + + performPost("/chats/rooms/" + chatRoom.getId() + "/mute") + .andExpect(status().isOk()) + .andExpect(jsonPath("$.isMuted").value(false)); + + clearPersistenceContext(); + assertThat(notificationMuteSettingRepository.findByTargetTypeAndTargetIdAndUserId( + NotificationTargetType.CHAT_ROOM, + chatRoom.getId(), + normalUser.getId() + )).isPresent() + .get() + .extracting(setting -> setting.getIsMuted()) + .isEqualTo(false); + } + } + + private ChatRoom createDirectChatRoom(User firstUser, User secondUser) { + ChatRoom chatRoom = persist(ChatRoom.directOf()); + LocalDateTime joinedAt = chatRoom.getCreatedAt(); + ChatRoom managedChatRoom = entityManager.getReference(ChatRoom.class, chatRoom.getId()); + User managedFirstUser = entityManager.getReference(User.class, firstUser.getId()); + User managedSecondUser = entityManager.getReference(User.class, secondUser.getId()); + + persist(ChatRoomMember.of(managedChatRoom, managedFirstUser, joinedAt)); + persist(ChatRoomMember.of(managedChatRoom, managedSecondUser, joinedAt)); + clearPersistenceContext(); + return chatRoom; + } +} From afec05d3dc23cf7cc56f0bfb7c053b2357f594f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Wed, 18 Mar 2026 19:00:16 +0900 Subject: [PATCH 2/5] =?UTF-8?q?test:=20=EC=97=A3=EC=A7=80=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EB=B3=B4=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integration/domain/chat/ChatApiTest.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java index 7d4dc913..76319c4f 100644 --- a/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java +++ b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java @@ -20,6 +20,7 @@ import gg.agit.konect.domain.chat.model.ChatRoom; import gg.agit.konect.domain.chat.model.ChatRoomMember; import gg.agit.konect.domain.chat.repository.ChatMessageRepository; +import gg.agit.konect.domain.chat.repository.ChatRoomMemberRepository; import gg.agit.konect.domain.chat.repository.ChatRoomRepository; import gg.agit.konect.domain.chat.service.ChatPresenceService; import gg.agit.konect.domain.club.model.Club; @@ -42,6 +43,9 @@ class ChatApiTest extends IntegrationTestSupport { @Autowired private ChatMessageRepository chatMessageRepository; + @Autowired + private ChatRoomMemberRepository chatRoomMemberRepository; + @Autowired private NotificationMuteSettingRepository notificationMuteSettingRepository; @@ -88,6 +92,51 @@ void createDirectChatRoomSuccess() throws Exception { clearPersistenceContext(); assertThat(chatRoomRepository.findByTwoUsers(normalUser.getId(), targetUser.getId())).isPresent(); } + + @Test + @DisplayName("자기 자신과 채팅방을 만들면 400을 반환한다") + void createDirectChatRoomWithSelfFails() throws Exception { + // given + mockLoginUser(normalUser.getId()); + + // when & then + performPost("/chats/rooms", new ChatRoomCreateRequest(normalUser.getId())) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value("CANNOT_CREATE_CHAT_ROOM_WITH_SELF")); + } + + @Test + @DisplayName("존재하지 않는 대상 유저면 404를 반환한다") + void createDirectChatRoomWithMissingUserFails() throws Exception { + // given + mockLoginUser(normalUser.getId()); + + // when & then + performPost("/chats/rooms", new ChatRoomCreateRequest(99999)) + .andExpect(status().isNotFound()) + .andExpect(jsonPath("$.code").value("NOT_FOUND_USER")); + } + + @Test + @DisplayName("이미 같은 상대와 채팅방이 있으면 기존 방을 반환한다") + void createDirectChatRoomReturnsExistingRoom() throws Exception { + // given + ChatRoom existingRoom = createDirectChatRoom(normalUser, targetUser); + mockLoginUser(normalUser.getId()); + + // when & then + performPost("/chats/rooms", new ChatRoomCreateRequest(targetUser.getId())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.chatRoomId").value(existingRoom.getId())); + + clearPersistenceContext(); + assertThat(chatRoomRepository.findByTwoUsers(normalUser.getId(), targetUser.getId())) + .isPresent() + .get() + .extracting(ChatRoom::getId) + .isEqualTo(existingRoom.getId()); + assertThat(chatRoomMemberRepository.findByChatRoomId(existingRoom.getId())).hasSize(2); + } } @Nested @@ -143,6 +192,35 @@ void sendMessageSuccess() throws Exception { .extracting(ChatMessage::getContent) .containsExactly("안녕하세요"); } + + @Test + @DisplayName("빈 메시지를 전송하면 400을 반환한다") + void sendBlankMessageFails() throws Exception { + // given + ChatRoom chatRoom = createDirectChatRoom(normalUser, targetUser); + mockLoginUser(normalUser.getId()); + + // when & then + performPost("/chats/rooms/" + chatRoom.getId() + "/messages", new ChatMessageSendRequest(" ")) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value("INVALID_REQUEST_BODY")) + .andExpect(jsonPath("$.fieldErrors[0].field").value("content")); + } + + @Test + @DisplayName("1000자를 초과한 메시지를 전송하면 400을 반환한다") + void sendTooLongMessageFails() throws Exception { + // given + ChatRoom chatRoom = createDirectChatRoom(normalUser, targetUser); + mockLoginUser(normalUser.getId()); + String tooLongContent = "a".repeat(1001); + + // when & then + performPost("/chats/rooms/" + chatRoom.getId() + "/messages", new ChatMessageSendRequest(tooLongContent)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value("INVALID_REQUEST_BODY")) + .andExpect(jsonPath("$.fieldErrors[0].field").value("content")); + } } @Nested From eab3431bb618a5f779447562a6b1e65b9d2b16cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Wed, 18 Mar 2026 21:46:55 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=EC=B1=84=ED=8C=85=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=9D=98=20fixture=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=EB=A5=BC=20=EC=8B=9C=EB=82=98=EB=A6=AC?= =?UTF-8?q?=EC=98=A4=EB=B3=84=20=EC=9D=98=EC=A1=B4=EC=84=B1=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EA=B2=8C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integration/domain/chat/ChatApiTest.java | 48 ++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java index 76319c4f..a566bf1e 100644 --- a/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java +++ b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java @@ -23,15 +23,12 @@ import gg.agit.konect.domain.chat.repository.ChatRoomMemberRepository; import gg.agit.konect.domain.chat.repository.ChatRoomRepository; import gg.agit.konect.domain.chat.service.ChatPresenceService; -import gg.agit.konect.domain.club.model.Club; import gg.agit.konect.domain.notification.enums.NotificationTargetType; import gg.agit.konect.domain.notification.repository.NotificationMuteSettingRepository; import gg.agit.konect.domain.notification.service.NotificationService; import gg.agit.konect.domain.university.model.University; import gg.agit.konect.domain.user.model.User; import gg.agit.konect.support.IntegrationTestSupport; -import gg.agit.konect.support.fixture.ClubFixture; -import gg.agit.konect.support.fixture.ClubMemberFixture; import gg.agit.konect.support.fixture.UniversityFixture; import gg.agit.konect.support.fixture.UserFixture; @@ -59,18 +56,12 @@ class ChatApiTest extends IntegrationTestSupport { private User normalUser; private User targetUser; private User outsiderUser; - private Club club; + private University university; @BeforeEach void setUp() { - University university = persist(UniversityFixture.create()); - adminUser = persist(UserFixture.createAdmin(university)); + university = persist(UniversityFixture.create()); normalUser = persist(UserFixture.createUser(university, "일반유저", "2021136001")); - targetUser = persist(UserFixture.createUser(university, "상대유저", "2021136002")); - outsiderUser = persist(UserFixture.createUser(university, "외부유저", "2021136003")); - club = persist(ClubFixture.create(university, "BCSD Lab")); - persist(ClubMemberFixture.createPresident(club, normalUser)); - persist(ClubMemberFixture.createMember(club, targetUser)); clearPersistenceContext(); } @@ -78,6 +69,12 @@ void setUp() { @DisplayName("POST /chats/rooms - 일반 채팅방 생성") class CreateDirectChatRoom { + @BeforeEach + void setUpDirectChatFixture() { + targetUser = createUser("상대유저", "2021136002"); + clearPersistenceContext(); + } + @Test @DisplayName("일반 채팅방을 생성한다") void createDirectChatRoomSuccess() throws Exception { @@ -143,6 +140,12 @@ void createDirectChatRoomReturnsExistingRoom() throws Exception { @DisplayName("POST /chats/rooms/admin, GET /chats/rooms - 관리자 전용 방 생성 및 조회") class AdminChatRoom { + @BeforeEach + void setUpAdminChatFixture() { + adminUser = persist(UserFixture.createAdmin(university)); + clearPersistenceContext(); + } + @Test @DisplayName("관리자 전용 방을 만들고 목록에서 조회한다") void createAdminChatRoomAndGetRoomsSuccess() throws Exception { @@ -168,6 +171,12 @@ void createAdminChatRoomAndGetRoomsSuccess() throws Exception { @DisplayName("POST /chats/rooms/{chatRoomId}/messages - 메시지 전송") class SendMessage { + @BeforeEach + void setUpMessageFixture() { + targetUser = createUser("상대유저", "2021136002"); + clearPersistenceContext(); + } + @Test @DisplayName("메시지를 전송하고 응답 형태를 반환한다") void sendMessageSuccess() throws Exception { @@ -227,6 +236,13 @@ void sendTooLongMessageFails() throws Exception { @DisplayName("GET /chats/rooms/{chatRoomId} - 채팅방 메시지 조회 실패") class GetMessagesFail { + @BeforeEach + void setUpMessageAccessFixture() { + targetUser = createUser("상대유저", "2021136002"); + outsiderUser = createUser("외부유저", "2021136003"); + clearPersistenceContext(); + } + @Test @DisplayName("존재하지 않는 채팅방이면 404를 반환한다") void getMessagesNotFound() throws Exception { @@ -257,6 +273,12 @@ void getMessagesForbidden() throws Exception { @DisplayName("POST /chats/rooms/{chatRoomId}/mute - 채팅방 뮤트 토글") class ToggleMute { + @BeforeEach + void setUpMuteFixture() { + targetUser = createUser("상대유저", "2021136002"); + clearPersistenceContext(); + } + @Test @DisplayName("뮤트를 켰다가 다시 끈다") void toggleMuteSuccessAndDuplicateProcessing() throws Exception { @@ -297,4 +319,8 @@ private ChatRoom createDirectChatRoom(User firstUser, User secondUser) { clearPersistenceContext(); return chatRoom; } + + private User createUser(String name, String studentId) { + return persist(UserFixture.createUser(university, name, studentId)); + } } From 14e6b61ff33f9c0bdafe24a0de2f1519a7ae9927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Wed, 18 Mar 2026 21:50:33 +0900 Subject: [PATCH 4/5] =?UTF-8?q?test:=20=EC=9D=BC=EB=B0=98=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EB=B0=A9=20=EC=83=9D=EC=84=B1=EC=9D=B4=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=8C=8D=EB=8B=B9=20=ED=95=98=EB=82=98?= =?UTF-8?q?=EB=A7=8C=20=EC=9C=A0=EC=A7=80=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EA=B3=84=EC=95=BD=EC=9D=84=20=EA=B3=A0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integration/domain/chat/ChatApiTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java index a566bf1e..650df5e5 100644 --- a/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java +++ b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java @@ -5,6 +5,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.time.LocalDateTime; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -79,6 +80,7 @@ void setUpDirectChatFixture() { @DisplayName("일반 채팅방을 생성한다") void createDirectChatRoomSuccess() throws Exception { // given + long beforeCount = countDirectRoomsBetween(normalUser, targetUser); mockLoginUser(normalUser.getId()); // when & then @@ -88,6 +90,7 @@ void createDirectChatRoomSuccess() throws Exception { clearPersistenceContext(); assertThat(chatRoomRepository.findByTwoUsers(normalUser.getId(), targetUser.getId())).isPresent(); + assertThat(countDirectRoomsBetween(normalUser, targetUser)).isEqualTo(beforeCount + 1); } @Test @@ -119,6 +122,7 @@ void createDirectChatRoomWithMissingUserFails() throws Exception { void createDirectChatRoomReturnsExistingRoom() throws Exception { // given ChatRoom existingRoom = createDirectChatRoom(normalUser, targetUser); + long beforeCount = countDirectRoomsBetween(normalUser, targetUser); mockLoginUser(normalUser.getId()); // when & then @@ -132,6 +136,7 @@ void createDirectChatRoomReturnsExistingRoom() throws Exception { .get() .extracting(ChatRoom::getId) .isEqualTo(existingRoom.getId()); + assertThat(countDirectRoomsBetween(normalUser, targetUser)).isEqualTo(beforeCount); assertThat(chatRoomMemberRepository.findByChatRoomId(existingRoom.getId())).hasSize(2); } } @@ -323,4 +328,18 @@ private ChatRoom createDirectChatRoom(User firstUser, User secondUser) { private User createUser(String name, String studentId) { return persist(UserFixture.createUser(university, name, studentId)); } + + private long countDirectRoomsBetween(User firstUser, User secondUser) { + return chatRoomRepository.findByUserId(firstUser.getId()).stream() + .map(ChatRoom::getId) + .filter(roomId -> isDirectRoomBetween(roomId, firstUser.getId(), secondUser.getId())) + .count(); + } + + private boolean isDirectRoomBetween(Integer roomId, Integer firstUserId, Integer secondUserId) { + List roomMembers = chatRoomMemberRepository.findByChatRoomId(roomId); + return roomMembers.size() == 2 + && roomMembers.stream().anyMatch(member -> member.getUserId().equals(firstUserId)) + && roomMembers.stream().anyMatch(member -> member.getUserId().equals(secondUserId)); + } } From 239891bc67f45b2f74cbc9bf1b5c5335b2e45e4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Wed, 18 Mar 2026 21:54:29 +0900 Subject: [PATCH 5/5] =?UTF-8?q?test:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EB=AE=A4=ED=8A=B8=20=ED=95=B4=EC=A0=9C=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=B5=9C=EC=A2=85=20=EC=83=81=ED=83=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/agit/konect/integration/domain/chat/ChatApiTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java index 650df5e5..d5037be7 100644 --- a/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java +++ b/src/test/java/gg/agit/konect/integration/domain/chat/ChatApiTest.java @@ -305,10 +305,7 @@ void toggleMuteSuccessAndDuplicateProcessing() throws Exception { NotificationTargetType.CHAT_ROOM, chatRoom.getId(), normalUser.getId() - )).isPresent() - .get() - .extracting(setting -> setting.getIsMuted()) - .isEqualTo(false); + )).matches(setting -> setting.isEmpty() || !setting.get().getIsMuted()); } }