|
1 | 1 | package org.dfbf.soundlink.domain.user; |
2 | 2 |
|
| 3 | +import org.dfbf.soundlink.domain.emotionRecord.entity.SpotifyMusic; |
| 4 | +import org.dfbf.soundlink.domain.emotionRecord.repository.EmotionRecordRepository; |
3 | 5 | import org.dfbf.soundlink.domain.emotionRecord.repository.SpotifyMusicRepository; |
| 6 | +import org.dfbf.soundlink.domain.user.dto.request.UserSignUpDto; |
| 7 | +import org.dfbf.soundlink.domain.user.dto.request.UserUpdateDto; |
| 8 | +import org.dfbf.soundlink.domain.user.entity.User; |
| 9 | +import org.dfbf.soundlink.domain.user.repository.ProfileMusicRepository; |
4 | 10 | import org.dfbf.soundlink.domain.user.repository.UserRepository; |
5 | 11 | import org.dfbf.soundlink.domain.user.service.UserService; |
| 12 | +import org.dfbf.soundlink.global.comm.enums.SocialType; |
| 13 | +import org.dfbf.soundlink.global.exception.ErrorCode; |
| 14 | +import org.dfbf.soundlink.global.exception.ResponseResult; |
| 15 | +import org.junit.jupiter.api.DisplayName; |
| 16 | +import org.junit.jupiter.api.Test; |
6 | 17 | import org.junit.jupiter.api.extension.ExtendWith; |
7 | 18 | import org.mockito.InjectMocks; |
8 | 19 | import org.mockito.Mock; |
9 | 20 | import org.mockito.junit.jupiter.MockitoExtension; |
10 | 21 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; |
11 | 22 |
|
| 23 | +import java.util.Optional; |
| 24 | + |
| 25 | +import static org.dfbf.soundlink.global.comm.enums.SocialType.KAKAO; |
| 26 | +import static org.mockito.Mockito.*; |
| 27 | +import static org.mockito.ArgumentMatchers.any; |
| 28 | +import static org.junit.jupiter.api.Assertions.assertEquals; |
| 29 | + |
12 | 30 | @ExtendWith(MockitoExtension.class) |
13 | | -public class UserServiceTest { |
| 31 | +class UserServiceTest { |
14 | 32 | @InjectMocks |
15 | 33 | private UserService userService; |
16 | 34 |
|
17 | | - @Mock |
| 35 | + @Mock(lenient = true) |
18 | 36 | private UserRepository userRepository; |
19 | 37 |
|
20 | 38 | @Mock |
21 | 39 | private SpotifyMusicRepository spotifyMusicRepository; |
22 | 40 |
|
23 | | - @Mock |
| 41 | + @Mock(lenient = true) |
24 | 42 | private BCryptPasswordEncoder passwordEncoder; |
25 | 43 |
|
| 44 | + @Mock |
| 45 | + private EmotionRecordRepository emotionRecordRepository; |
| 46 | + |
| 47 | + @Mock |
| 48 | + private ProfileMusicRepository profileMusicRepository; |
| 49 | + |
26 | 50 | // 회원 정보 수정 |
27 | | -// @Test |
28 | | -// public void testUpdateUser() { |
29 | | -// // Given |
30 | | -// Long userId = 1L; |
31 | | -// UserUpdateDto userUpdateDto = mock(UserUpdateDto.class); |
32 | | -// User existingUser = mock(User.class); |
33 | | -// SpotifyMusic spotifyMusic = mock(SpotifyMusic.class); |
34 | | -// |
35 | | -// |
36 | | -// // When |
37 | | -// when(userRepository.findById(userId)).thenReturn(Optional.of(existingUser)); |
38 | | -// when(userUpdateDto.spotifyId()).thenReturn(123L); |
39 | | -// when(spotifyMusicRepository.findById(123L)).thenReturn(Optional.of(spotifyMusic)); |
40 | | -// |
41 | | -// ResponseResult result = userService.updateUser(userId, userUpdateDto); |
42 | | -// |
43 | | -// |
44 | | -// // Then |
45 | | -// assertEquals(200, result.getCode()); |
46 | | -// assertEquals("성공", result.getMessage()); |
47 | | -// |
48 | | -// verify(spotifyMusicRepository).save(any(SpotifyMusic.class)); |
49 | | -// |
50 | | -// verify(existingUser).update(eq(userUpdateDto), any(BCryptPasswordEncoder.class), eq(spotifyMusic)); |
51 | | -// } |
| 51 | + @Test |
| 52 | + void updateUser_Success() { |
| 53 | + // Given |
| 54 | + Long userId = 1L; |
| 55 | + User user = mock(User.class); |
| 56 | + |
| 57 | + UserUpdateDto updateDto = new UserUpdateDto( //dto는 mock객체로 사용하지 않음. |
| 58 | + |
| 59 | + Optional.of("newLoginId"), |
| 60 | + Optional.of("newNickName"), |
| 61 | + Optional.of("newPassword"), |
| 62 | + Optional.of("spotify123"), // Spotify ID 존재 |
| 63 | + Optional.of("New Title"), |
| 64 | + Optional.of("New Artist"), |
| 65 | + Optional.of("New Album Image") |
| 66 | + ); |
| 67 | + |
| 68 | + SpotifyMusic spotifyMusic = new SpotifyMusic(updateDto); |
| 69 | + |
| 70 | + // Mocking |
| 71 | + when(userRepository.findByUserIdWithCache(userId)).thenReturn(Optional.of(user)); |
| 72 | + when(spotifyMusicRepository.findBySpotifyId("spotify123")).thenReturn(Optional.of(spotifyMusic)); |
| 73 | + when(passwordEncoder.encode(anyString())).thenReturn("encodedPassword"); |
| 74 | + |
| 75 | + // When |
| 76 | + ResponseResult result = userService.updateUser(userId, updateDto); |
| 77 | + |
| 78 | + // Then |
| 79 | + assertEquals(200, result.getCode()); |
| 80 | + verify(userRepository).saveWithCache(any(User.class)); //수정 저장 확인(유저,캐시) |
| 81 | + verify(profileMusicRepository).save(any()); //스포티파이 저장 확인 |
| 82 | + } |
| 83 | + |
| 84 | + |
| 85 | + |
| 86 | + @Test |
| 87 | + @DisplayName("회원가입 테스트 성공 - 비밀번호 암호화 및 저장") |
| 88 | + void signUp_Success(){ |
| 89 | + //given |
| 90 | + UserSignUpDto userSignUpDto = new UserSignUpDto( |
| 91 | + "testNickname", 12345L, KAKAO, "testLoginId", "password123", "[email protected]" |
| 92 | + ); |
| 93 | + //when |
| 94 | + //save 메소드 호출 시 모킹 처리 |
| 95 | + when(passwordEncoder.encode(userSignUpDto.password())).thenReturn("encodedPassword"); |
| 96 | + |
| 97 | + ResponseResult result = userService.signUp(userSignUpDto); |
| 98 | + //then |
| 99 | + assertEquals(200, result.getCode()); |
| 100 | + |
| 101 | + verify(userRepository, times(1)).save(any(User.class)); |
| 102 | + |
| 103 | + verify(passwordEncoder, times(1)).encode(userSignUpDto.password()); |
| 104 | + } |
| 105 | + |
| 106 | + @Test |
| 107 | + @DisplayName("회원삭제 성공") |
| 108 | + void deleteUser_Success(){ |
| 109 | + //given |
| 110 | + Long userId = 1L; |
| 111 | + User user = mock(User.class); |
| 112 | + |
| 113 | + // 유저를 찾기 |
| 114 | + when(userRepository.findByUserIdWithCache(userId)).thenReturn(Optional.of(user)); |
| 115 | + // 감정 기록 삭제, doNotion()-> 단지 메소드가 호출되었는지만 확인 |
| 116 | + doNothing().when(emotionRecordRepository).deleteByUser(user); |
| 117 | + // 유저 삭제 |
| 118 | + doNothing().when(userRepository).deleteById(userId); |
| 119 | + |
| 120 | + //when |
| 121 | + ResponseResult result = userService.deleteUser(userId); |
52 | 122 |
|
| 123 | + //then |
| 124 | + assertEquals(200, result.getCode()); |
| 125 | + verify(emotionRecordRepository, times(1)).deleteByUser(user); //(1): 1번 호출되었는지 확인 = 감정기록이 삭제 됨. |
| 126 | +// verify(userRepository, times(0)).deleteById(userId);//(0):호출되지 않았는지 확인 = 사용자가 삭제 되지 않음.(1):성공적으로 삭제됨. |
| 127 | + } |
53 | 128 | } |
0 commit comments