Skip to content

Commit 38a6bb1

Browse files
authored
Merge pull request #53 from feat/test-code/user
[test] userService 및 EmotionRecordService 테스트코드 작성
2 parents 7ee4f09 + 4999cb4 commit 38a6bb1

File tree

3 files changed

+233
-29
lines changed

3 files changed

+233
-29
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package org.dfbf.soundlink.domain.emtionRecord;
2+
3+
import org.dfbf.soundlink.domain.emotionRecord.dto.request.EmotionRecordRequestDTO;
4+
import org.dfbf.soundlink.domain.emotionRecord.dto.request.EmotionRecordUpdateRequestDTO;
5+
import org.dfbf.soundlink.domain.emotionRecord.entity.EmotionRecord;
6+
import org.dfbf.soundlink.domain.emotionRecord.entity.SpotifyMusic;
7+
import org.dfbf.soundlink.domain.emotionRecord.repository.EmotionRecordRepository;
8+
import org.dfbf.soundlink.domain.emotionRecord.repository.SpotifyMusicRepository;
9+
import org.dfbf.soundlink.domain.emotionRecord.service.EmotionRecordService;
10+
import org.dfbf.soundlink.domain.user.entity.User;
11+
import org.dfbf.soundlink.domain.user.repository.UserRepository;
12+
import org.dfbf.soundlink.global.comm.enums.Emotions;
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;
17+
import org.junit.jupiter.api.extension.ExtendWith;
18+
import org.mockito.InjectMocks;
19+
import org.mockito.Mock;
20+
import org.mockito.junit.jupiter.MockitoExtension;
21+
import org.springframework.dao.DataAccessException;
22+
import org.springframework.http.HttpStatus;
23+
24+
import java.util.Optional;
25+
26+
import static org.dfbf.soundlink.global.comm.enums.Emotions.HAPPY;
27+
import static org.junit.jupiter.api.Assertions.assertEquals;
28+
import static org.mockito.Mockito.*;
29+
30+
@ExtendWith(MockitoExtension.class)
31+
class EmotionRecordServiceTest {
32+
@InjectMocks
33+
private EmotionRecordService emotionRecordService;
34+
@Mock
35+
private EmotionRecordRepository emotionRecordRepository;
36+
@Mock
37+
private SpotifyMusicRepository spotifyMusicRepository;
38+
@Mock
39+
private UserRepository userRepository;
40+
41+
42+
@DisplayName("감정기록 작성(제목,가수,앨범,스포티파이아이디,감정,멘트):성공")
43+
@Test
44+
void saveEmotionRecordWithMusic_SUCCESS() {
45+
// given
46+
Long userId = 1L;
47+
EmotionRecordRequestDTO requestDTO = new EmotionRecordRequestDTO(
48+
"spotify1233", "New Title", "New Artist", "New Image", HAPPY, "Test comment"
49+
);
50+
51+
User mockUser = mock(User.class);
52+
SpotifyMusic newSpotifyMusic = new SpotifyMusic(requestDTO.spotifyId(), requestDTO.title(), requestDTO.artist(), requestDTO.albumImage());
53+
EmotionRecord newEmotionRecord = mock(EmotionRecord.class);
54+
55+
when(userRepository.findById(userId)).thenReturn(Optional.of(mockUser)); // 사용자 조회 성공
56+
when(spotifyMusicRepository.save(any(SpotifyMusic.class))).thenReturn(newSpotifyMusic); // 음악 저장
57+
when(emotionRecordRepository.save(any(EmotionRecord.class))).thenReturn(newEmotionRecord); // 감정 기록 저장
58+
59+
// when
60+
ResponseResult result = emotionRecordService.saveEmotionRecordWithMusic(userId, requestDTO);
61+
62+
// then
63+
assertEquals(HttpStatus.OK.value(), result.getCode());
64+
verify(spotifyMusicRepository).save(any(SpotifyMusic.class)); // 음악이 저장되었는지 검증
65+
verify(emotionRecordRepository).save(any(EmotionRecord.class)); // 감정 기록이 저장되었는지 검증
66+
}
67+
68+
//감정기록 삭제 : 성공
69+
@DisplayName("감정기록 삭제:성공")
70+
@Test
71+
void deleteEmotionRecord_SUCCESS() {
72+
//given
73+
Long recordId = 1L;
74+
when(emotionRecordRepository.deleteByRecordId(recordId)).thenReturn(1);//삭제된 레코드 수 1개
75+
//when
76+
ResponseResult result = emotionRecordService.deleteEmotionRecord(recordId);
77+
//then
78+
assertEquals(200,result.getCode());
79+
verify(emotionRecordRepository).deleteByRecordId(recordId);
80+
}
81+
82+
83+
@DisplayName("감정기록 DB오류 : 실패")
84+
@Test
85+
void deleteEmotionRecord_DataAccessException() {
86+
// given
87+
Long recordId = 1L;
88+
when(emotionRecordRepository.deleteByRecordId(recordId)).thenThrow(new DataAccessException("Database error") {});
89+
90+
// when
91+
ResponseResult result = emotionRecordService.deleteEmotionRecord(recordId);
92+
93+
// then
94+
assertEquals(ErrorCode.DB_ERROR, result.getCode());
95+
assertEquals("Database error", result.getMessage());
96+
}
97+
98+
@Test
99+
@DisplayName("감정 기록 수정 성공 테스트")
100+
void updateEmotionRecord_Success() {
101+
// given
102+
Long recordId = 1L;
103+
EmotionRecordUpdateRequestDTO updateDTO = new EmotionRecordUpdateRequestDTO(
104+
"spotify1233", "New Title", "New Artist", "New Image", "HAPPY", "Test comment"
105+
);
106+
107+
// 기존 감정 기록 및 음악 정보
108+
SpotifyMusic existingMusic = new SpotifyMusic("spotify123", "Old Title", "Old Artist", "Old Image");
109+
EmotionRecord existingRecord = new EmotionRecord(
110+
mock(User.class), Emotions.SAD, "Old Comment", existingMusic
111+
);
112+
113+
// 기존 감정 기록 조회
114+
when(emotionRecordRepository.findByRecordId(recordId)).thenReturn(Optional.of(existingRecord));
115+
when(spotifyMusicRepository.findBySpotifyId(updateDTO.spotifyId())).thenReturn(Optional.of(existingMusic));
116+
117+
// when
118+
ResponseResult result = emotionRecordService.updateEmotionRecord(recordId, updateDTO);
119+
120+
// then
121+
assertEquals(200, result.getCode());
122+
verify(emotionRecordRepository).findByRecordId(recordId);
123+
verify(spotifyMusicRepository).findBySpotifyId(updateDTO.spotifyId());
124+
verify(emotionRecordRepository, never()).save(any()); // update는 save 호출 안 함
125+
}
126+
127+
128+
129+
}

src/test/java/org/dfbf/soundlink/domain/user/CreateJwtTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
1313

1414
@SpringBootTest
15-
public class CreateJwtTest {
15+
class CreateJwtTest {
1616

1717
@Value("${jwt.secret}")
1818
private String secretKeyPlain;
Lines changed: 103 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,128 @@
11
package org.dfbf.soundlink.domain.user;
22

3+
import org.dfbf.soundlink.domain.emotionRecord.entity.SpotifyMusic;
4+
import org.dfbf.soundlink.domain.emotionRecord.repository.EmotionRecordRepository;
35
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;
410
import org.dfbf.soundlink.domain.user.repository.UserRepository;
511
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;
617
import org.junit.jupiter.api.extension.ExtendWith;
718
import org.mockito.InjectMocks;
819
import org.mockito.Mock;
920
import org.mockito.junit.jupiter.MockitoExtension;
1021
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
1122

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+
1230
@ExtendWith(MockitoExtension.class)
13-
public class UserServiceTest {
31+
class UserServiceTest {
1432
@InjectMocks
1533
private UserService userService;
1634

17-
@Mock
35+
@Mock(lenient = true)
1836
private UserRepository userRepository;
1937

2038
@Mock
2139
private SpotifyMusicRepository spotifyMusicRepository;
2240

23-
@Mock
41+
@Mock(lenient = true)
2442
private BCryptPasswordEncoder passwordEncoder;
2543

44+
@Mock
45+
private EmotionRecordRepository emotionRecordRepository;
46+
47+
@Mock
48+
private ProfileMusicRepository profileMusicRepository;
49+
2650
// 회원 정보 수정
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+
Optional.of("[email protected]"),
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);
52122

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+
}
53128
}

0 commit comments

Comments
 (0)