From ce4b3a7e0255462e579dec7c5e730f974cd97acc Mon Sep 17 00:00:00 2001 From: yereumi Date: Thu, 15 May 2025 13:40:13 +0900 Subject: [PATCH 1/7] =?UTF-8?q?test:=20UserService=20=EB=8B=A8=EC=9C=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conal/UserServiceTest.java | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/test/java/com/specialwarriors/conal/UserServiceTest.java diff --git a/src/test/java/com/specialwarriors/conal/UserServiceTest.java b/src/test/java/com/specialwarriors/conal/UserServiceTest.java new file mode 100644 index 0000000..1606144 --- /dev/null +++ b/src/test/java/com/specialwarriors/conal/UserServiceTest.java @@ -0,0 +1,111 @@ +package com.specialwarriors.conal; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import com.specialwarriors.conal.common.auth.oauth.GithubOAuth2WebClient; +import com.specialwarriors.conal.common.exception.GeneralException; +import com.specialwarriors.conal.user.domain.User; +import com.specialwarriors.conal.user.repository.UserRepository; +import com.specialwarriors.conal.user.service.UserService; +import java.util.Optional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; + +@ExtendWith(MockitoExtension.class) +public class UserServiceTest { + + @Mock + private UserRepository userRepository; + + @Mock + private RedisTemplate redisTemplate; + + @Mock + private GithubOAuth2WebClient githubOAuth2WebClient; + + @InjectMocks + private UserService userService; + + private User mockUser; + + @BeforeEach + void setUp() { + mockUser = new User(1, "홍길동", "fdsf"); + } + + @Test + @DisplayName("유저 아이디로 사용자를 조회할 수 있다") + void findUserByUserId() { + + // given + given(userRepository.findById(1L)).willReturn(Optional.of(mockUser)); + + // when + User result = userService.getUserByUserId(1L); + + // then + assertThat(result).isEqualTo(mockUser); + verify(userRepository).findById(1L); + } + + @Test + @DisplayName("유저 아이디로 사용자 조회 시 존재하지 않으면 예외를 던진다") + void throwsExceptionWhenUserNotFoundById() { + + // given + given(userRepository.findById(1L)).willReturn(Optional.empty()); + + // when, then + assertThatThrownBy(() -> { + userService.getUserByUserId(1L); + }).isInstanceOf(GeneralException.class); + + verify(userRepository).findById(1L); + } + + @Test + @DisplayName("사용자를 삭제할 때 깃허브 토큰과 세션을 삭제한다") + void deletesGithubTokenAndSessionWhenUserIsDeleted() { + + // given + given(userRepository.findById(1L)).willReturn(Optional.of(mockUser)); + + ValueOperations ops = mock(ValueOperations.class); + given(redisTemplate.opsForValue()).willReturn(ops); + given(ops.get("github:token:1")).willReturn("fake-access-token"); + + // when + userService.deleteUser(1L); + + // then + verify(githubOAuth2WebClient).unlink("fake-access-token"); + verify(redisTemplate).unlink("github:token:1"); + verify(userRepository).deleteById(1L); + } + + @Test + @DisplayName("사용자를 삭제하려 할 때 사용자가 존재하지 않으면 예외를 던진다") + void throwsExceptionWhenDeletingNonexistentUser() { + + // given + given(userRepository.findById(1L)).willReturn(Optional.empty()); + + // when, then + assertThatThrownBy(() -> { + userService.deleteUser(1L); + }).isInstanceOf(GeneralException.class); + + verify(userRepository).findById(1L); + } +} From dafdcc2e518380e1e84d41e3088c11013be80369 Mon Sep 17 00:00:00 2001 From: yereumi Date: Thu, 15 May 2025 14:41:37 +0900 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../specialwarriors/conal/user/controller/UserController.java | 4 ++-- .../com/specialwarriors/conal/user/service/UserService.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/specialwarriors/conal/user/controller/UserController.java b/src/main/java/com/specialwarriors/conal/user/controller/UserController.java index e97aa24..d44aed4 100644 --- a/src/main/java/com/specialwarriors/conal/user/controller/UserController.java +++ b/src/main/java/com/specialwarriors/conal/user/controller/UserController.java @@ -32,7 +32,7 @@ public String index() { @GetMapping("/home") public String home(Model model, @SessionAttribute("userId") Long userId) { - User user = userService.getUserByUserId(userId); + User user = userService.getUser(userId); GithubRepoPageResponse response = githubRepoService.getGithubRepoInfos(userId, 0); model.addAttribute("repositories", response); // 레포지토리 리스트 @@ -57,7 +57,7 @@ public String loginFailure() { @GetMapping("/mypage") public String myPage(Model model, @SessionAttribute("userId") Long userId) { - User user = userService.getUserByUserId(userId); + User user = userService.getUser(userId); model.addAttribute("avatarUrl", user.getAvatarUrl()); model.addAttribute("username", user.getUsername()); diff --git a/src/main/java/com/specialwarriors/conal/user/service/UserService.java b/src/main/java/com/specialwarriors/conal/user/service/UserService.java index a4452f3..0ed41c0 100644 --- a/src/main/java/com/specialwarriors/conal/user/service/UserService.java +++ b/src/main/java/com/specialwarriors/conal/user/service/UserService.java @@ -17,7 +17,7 @@ public class UserService { private final RedisTemplate redisTemplate; private final GithubOAuth2WebClient githubOAuth2WebClient; - public User getUserByUserId(Long userId) { + public User getUser(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new GeneralException(UserException.USER_NOT_FOUND)); From 7246ae2e106b02f283abc1b320cc724c37c2c02b Mon Sep 17 00:00:00 2001 From: yereumi Date: Thu, 15 May 2025 14:47:23 +0900 Subject: [PATCH 3/7] =?UTF-8?q?test:=20=EB=A6=AC=EB=B7=B0=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EB=B0=98=EC=98=81(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conal/UserServiceTest.java | 112 +++++++++++------- 1 file changed, 66 insertions(+), 46 deletions(-) diff --git a/src/test/java/com/specialwarriors/conal/UserServiceTest.java b/src/test/java/com/specialwarriors/conal/UserServiceTest.java index 1606144..44a645a 100644 --- a/src/test/java/com/specialwarriors/conal/UserServiceTest.java +++ b/src/test/java/com/specialwarriors/conal/UserServiceTest.java @@ -9,11 +9,13 @@ import com.specialwarriors.conal.common.auth.oauth.GithubOAuth2WebClient; import com.specialwarriors.conal.common.exception.GeneralException; import com.specialwarriors.conal.user.domain.User; +import com.specialwarriors.conal.user.exception.UserException; import com.specialwarriors.conal.user.repository.UserRepository; import com.specialwarriors.conal.user.service.UserService; import java.util.Optional; 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.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -44,68 +46,86 @@ void setUp() { mockUser = new User(1, "홍길동", "fdsf"); } - @Test - @DisplayName("유저 아이디로 사용자를 조회할 수 있다") - void findUserByUserId() { + @Nested + @DisplayName("유저 아이디로 사용자를 조회할 때") + class FindUserById { - // given - given(userRepository.findById(1L)).willReturn(Optional.of(mockUser)); + @Test + @DisplayName("성공한다") + void success() { - // when - User result = userService.getUserByUserId(1L); + // given + long userId = 1L; + given(userRepository.findById(userId)).willReturn(Optional.of(mockUser)); - // then - assertThat(result).isEqualTo(mockUser); - verify(userRepository).findById(1L); - } + // when + User result = userService.getUser(userId); - @Test - @DisplayName("유저 아이디로 사용자 조회 시 존재하지 않으면 예외를 던진다") - void throwsExceptionWhenUserNotFoundById() { + // then + assertThat(result).isEqualTo(mockUser); + verify(userRepository).findById(userId); + } - // given - given(userRepository.findById(1L)).willReturn(Optional.empty()); + @Test + @DisplayName("시용자가 존재하지 않으면 예외를 던진다") + void throwsExceptionWhenUserNotFoundById() { - // when, then - assertThatThrownBy(() -> { - userService.getUserByUserId(1L); - }).isInstanceOf(GeneralException.class); + // given + long userId = 1L; + given(userRepository.findById(userId)).willReturn(Optional.empty()); - verify(userRepository).findById(1L); + // when, then + assertThatThrownBy(() -> userService.getUser(userId)) + .isInstanceOf(GeneralException.class) + .extracting("exception") + .isEqualTo(UserException.USER_NOT_FOUND); + } } - @Test - @DisplayName("사용자를 삭제할 때 깃허브 토큰과 세션을 삭제한다") - void deletesGithubTokenAndSessionWhenUserIsDeleted() { + @Nested + @DisplayName("사용자를 삭제할 때") + class DeleteUser { - // given - given(userRepository.findById(1L)).willReturn(Optional.of(mockUser)); + @Test + @DisplayName("깃허브 토큰과 세션을 삭제한다") + void deletesGithubTokenAndSessionWhenUserIsDeleted() { - ValueOperations ops = mock(ValueOperations.class); - given(redisTemplate.opsForValue()).willReturn(ops); - given(ops.get("github:token:1")).willReturn("fake-access-token"); + // given + long userId = 1L; + String githubTokenKey = "github:token:1"; + String githubTokenValue = "fake-access-token"; - // when - userService.deleteUser(1L); + given(userRepository.findById(userId)).willReturn(Optional.of(mockUser)); - // then - verify(githubOAuth2WebClient).unlink("fake-access-token"); - verify(redisTemplate).unlink("github:token:1"); - verify(userRepository).deleteById(1L); - } + ValueOperations ops = mock(ValueOperations.class); + given(redisTemplate.opsForValue()).willReturn(ops); + given(ops.get(githubTokenKey)).willReturn(githubTokenValue); + + // when + userService.deleteUser(userId); - @Test - @DisplayName("사용자를 삭제하려 할 때 사용자가 존재하지 않으면 예외를 던진다") - void throwsExceptionWhenDeletingNonexistentUser() { + // then + verify(githubOAuth2WebClient).unlink(githubTokenValue); + verify(redisTemplate).unlink(githubTokenKey); + verify(userRepository).deleteById(userId); + } - // given - given(userRepository.findById(1L)).willReturn(Optional.empty()); + @Test + @DisplayName("사용자가 존재하지 않으면 예외를 던진다") + void throwsExceptionWhenDeletingNonexistentUser() { - // when, then - assertThatThrownBy(() -> { - userService.deleteUser(1L); - }).isInstanceOf(GeneralException.class); + // given + long userId = 1L; + given(userRepository.findById(userId)).willReturn(Optional.empty()); - verify(userRepository).findById(1L); + // when, then + assertThatThrownBy(() -> userService.deleteUser(userId)) + .isInstanceOf(GeneralException.class) + .extracting("exception") + .isEqualTo(UserException.USER_NOT_FOUND); + + verify(userRepository).findById(userId); + } } + } From 31ef07687fbf44c0d5d7f78e5e7596e758a0c619 Mon Sep 17 00:00:00 2001 From: yereumi Date: Thu, 15 May 2025 15:18:19 +0900 Subject: [PATCH 4/7] =?UTF-8?q?test:=20avatarUrl=20=EC=88=98=EC=A0=95(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/com/specialwarriors/conal/UserServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/specialwarriors/conal/UserServiceTest.java b/src/test/java/com/specialwarriors/conal/UserServiceTest.java index 44a645a..30df4df 100644 --- a/src/test/java/com/specialwarriors/conal/UserServiceTest.java +++ b/src/test/java/com/specialwarriors/conal/UserServiceTest.java @@ -43,7 +43,7 @@ public class UserServiceTest { @BeforeEach void setUp() { - mockUser = new User(1, "홍길동", "fdsf"); + mockUser = new User(1, "홍길동", "honggildong@gmail.com"); } @Nested From 82b29f4514acd5ad4ce740d2c754afa35909ce84 Mon Sep 17 00:00:00 2001 From: yereumi Date: Thu, 15 May 2025 15:30:22 +0900 Subject: [PATCH 5/7] =?UTF-8?q?test:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conal/user/controller/UserController.java | 6 +++--- .../com/specialwarriors/conal/user/service/UserService.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/specialwarriors/conal/user/controller/UserController.java b/src/main/java/com/specialwarriors/conal/user/controller/UserController.java index d44aed4..9b3284c 100644 --- a/src/main/java/com/specialwarriors/conal/user/controller/UserController.java +++ b/src/main/java/com/specialwarriors/conal/user/controller/UserController.java @@ -32,7 +32,7 @@ public String index() { @GetMapping("/home") public String home(Model model, @SessionAttribute("userId") Long userId) { - User user = userService.getUser(userId); + User user = userService.findById(userId); GithubRepoPageResponse response = githubRepoService.getGithubRepoInfos(userId, 0); model.addAttribute("repositories", response); // 레포지토리 리스트 @@ -57,7 +57,7 @@ public String loginFailure() { @GetMapping("/mypage") public String myPage(Model model, @SessionAttribute("userId") Long userId) { - User user = userService.getUser(userId); + User user = userService.findById(userId); model.addAttribute("avatarUrl", user.getAvatarUrl()); model.addAttribute("username", user.getUsername()); @@ -68,7 +68,7 @@ public String myPage(Model model, @SessionAttribute("userId") Long userId) { public String deleteUser(HttpServletRequest request, @SessionAttribute("userId") Long userId) { sessionManager.clearSession(request); - userService.deleteUser(userId); + userService.deleteById(userId); return "user/delete-success"; } diff --git a/src/main/java/com/specialwarriors/conal/user/service/UserService.java b/src/main/java/com/specialwarriors/conal/user/service/UserService.java index 0ed41c0..727128b 100644 --- a/src/main/java/com/specialwarriors/conal/user/service/UserService.java +++ b/src/main/java/com/specialwarriors/conal/user/service/UserService.java @@ -17,13 +17,13 @@ public class UserService { private final RedisTemplate redisTemplate; private final GithubOAuth2WebClient githubOAuth2WebClient; - public User getUser(Long userId) { + public User findById(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new GeneralException(UserException.USER_NOT_FOUND)); } - public void deleteUser(Long userId) { + public void deleteById(Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new GeneralException(UserException.USER_NOT_FOUND)); From 018f951bbadafc901e5f213e1184fe15224774d3 Mon Sep 17 00:00:00 2001 From: yereumi Date: Thu, 15 May 2025 15:30:38 +0900 Subject: [PATCH 6/7] =?UTF-8?q?test:=20=EC=9D=B4=EB=84=88=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=AA=85=20=EC=88=98=EC=A0=95(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/specialwarriors/conal/UserServiceTest.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/specialwarriors/conal/UserServiceTest.java b/src/test/java/com/specialwarriors/conal/UserServiceTest.java index 30df4df..40488ff 100644 --- a/src/test/java/com/specialwarriors/conal/UserServiceTest.java +++ b/src/test/java/com/specialwarriors/conal/UserServiceTest.java @@ -48,7 +48,7 @@ void setUp() { @Nested @DisplayName("유저 아이디로 사용자를 조회할 때") - class FindUserById { + class FindUserByIdTest { @Test @DisplayName("성공한다") @@ -59,7 +59,7 @@ void success() { given(userRepository.findById(userId)).willReturn(Optional.of(mockUser)); // when - User result = userService.getUser(userId); + User result = userService.findById(userId); // then assertThat(result).isEqualTo(mockUser); @@ -75,7 +75,7 @@ void throwsExceptionWhenUserNotFoundById() { given(userRepository.findById(userId)).willReturn(Optional.empty()); // when, then - assertThatThrownBy(() -> userService.getUser(userId)) + assertThatThrownBy(() -> userService.findById(userId)) .isInstanceOf(GeneralException.class) .extracting("exception") .isEqualTo(UserException.USER_NOT_FOUND); @@ -84,7 +84,7 @@ void throwsExceptionWhenUserNotFoundById() { @Nested @DisplayName("사용자를 삭제할 때") - class DeleteUser { + class DeleteUserTest { @Test @DisplayName("깃허브 토큰과 세션을 삭제한다") @@ -102,7 +102,7 @@ void deletesGithubTokenAndSessionWhenUserIsDeleted() { given(ops.get(githubTokenKey)).willReturn(githubTokenValue); // when - userService.deleteUser(userId); + userService.deleteById(userId); // then verify(githubOAuth2WebClient).unlink(githubTokenValue); @@ -119,12 +119,10 @@ void throwsExceptionWhenDeletingNonexistentUser() { given(userRepository.findById(userId)).willReturn(Optional.empty()); // when, then - assertThatThrownBy(() -> userService.deleteUser(userId)) + assertThatThrownBy(() -> userService.deleteById(userId)) .isInstanceOf(GeneralException.class) .extracting("exception") .isEqualTo(UserException.USER_NOT_FOUND); - - verify(userRepository).findById(userId); } } From ec9701504a04d3642c7a544d3edcaa3a4835f5e7 Mon Sep 17 00:00:00 2001 From: yereumi Date: Thu, 15 May 2025 17:27:28 +0900 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20UserServiceTest=20Mock=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/specialwarriors/conal/UserServiceTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/com/specialwarriors/conal/UserServiceTest.java b/src/test/java/com/specialwarriors/conal/UserServiceTest.java index 40488ff..884ede2 100644 --- a/src/test/java/com/specialwarriors/conal/UserServiceTest.java +++ b/src/test/java/com/specialwarriors/conal/UserServiceTest.java @@ -8,6 +8,8 @@ import com.specialwarriors.conal.common.auth.oauth.GithubOAuth2WebClient; import com.specialwarriors.conal.common.exception.GeneralException; +import com.specialwarriors.conal.github_repo.repository.GithubRepoRepository; +import com.specialwarriors.conal.notification.repository.NotificationAgreementRepository; import com.specialwarriors.conal.user.domain.User; import com.specialwarriors.conal.user.exception.UserException; import com.specialwarriors.conal.user.repository.UserRepository; @@ -36,6 +38,12 @@ public class UserServiceTest { @Mock private GithubOAuth2WebClient githubOAuth2WebClient; + @Mock + private GithubRepoRepository githubRepoRepository; + + @Mock + private NotificationAgreementRepository notificationAgreementRepository; + @InjectMocks private UserService userService;