33import io .crops .warmletter .domain .auth .facade .AuthFacade ;
44import io .crops .warmletter .domain .share .cache .PostLikeRedisManager ;
55import io .crops .warmletter .domain .share .dto .response .SharePostLikeResponse ;
6+ import io .crops .warmletter .domain .share .entity .SharePostLike ;
67import io .crops .warmletter .domain .share .exception .ShareInvalidInputValue ;
78import io .crops .warmletter .domain .share .repository .SharePostLikeRepository ;
89import org .junit .jupiter .api .DisplayName ;
1213import org .mockito .Mock ;
1314import org .mockito .junit .jupiter .MockitoExtension ;
1415
16+ import java .util .Optional ;
17+
1518import static org .junit .jupiter .api .Assertions .*;
1619import static org .mockito .Mockito .*;
1720
@@ -31,25 +34,101 @@ class SharePostLikeServiceTest {
3134 private SharePostLikeService sharePostLikeService ;
3235
3336 @ Test
34- @ DisplayName ("좋아요 토글 요청 처리" )
35- void toggleLike () {
37+ @ DisplayName ("좋아요 토글 요청 처리 - Redis에 존재" )
38+ void toggleLike_Redis () {
39+ // given
40+ Long postId = 1L ;
41+ Long memberId = 1L ;
42+
43+ when (authFacade .getCurrentUserId ()).thenReturn (memberId );
44+ when (redisManager .getLikedStatus (postId , memberId )).thenReturn (Optional .of (true ));
45+
46+ // when
47+ sharePostLikeService .toggleLike (postId );
48+
49+ // then
50+ verify (authFacade ).getCurrentUserId ();
51+ verify (redisManager ).getLikedStatus (postId , memberId );
52+ verify (redisManager ).toggleLike (postId , memberId , false ); // true -> false로 토글
53+ verify (sharePostLikeRepository , never ()).findBySharePostIdAndMemberId (anyLong (), anyLong ());
54+ }
55+
56+ @ Test
57+ @ DisplayName ("좋아요 토글 - Redis에 정보가 없고 DB에 있는 경우" )
58+ void toggleLike_DB () {
59+ // given
60+ Long postId = 1L ;
61+ Long memberId = 1L ;
62+ SharePostLike existingLike = mock (SharePostLike .class );
63+
64+ when (authFacade .getCurrentUserId ()).thenReturn (memberId );
65+ when (redisManager .getLikedStatus (postId , memberId )).thenReturn (Optional .empty ());
66+ when (sharePostLikeRepository .findBySharePostIdAndMemberId (postId , memberId ))
67+ .thenReturn (Optional .of (existingLike ));
68+ when (existingLike .isLiked ()).thenReturn (true );
69+
70+ // when
71+ sharePostLikeService .toggleLike (postId );
72+
73+ // then
74+ verify (authFacade ).getCurrentUserId ();
75+ verify (redisManager ).getLikedStatus (postId , memberId );
76+ verify (sharePostLikeRepository ).findBySharePostIdAndMemberId (postId , memberId );
77+ verify (redisManager ).toggleLike (postId , memberId , false ); // true -> false로 토글
78+ }
79+
80+ @ Test
81+ @ DisplayName ("좋아요 토글 - Redis에 정보가 없고 DB에도 없는 경우" )
82+ void toggleLike_WithoutRedisAndDB () {
3683 // given
3784 Long postId = 1L ;
3885 Long memberId = 1L ;
3986
4087 when (authFacade .getCurrentUserId ()).thenReturn (memberId );
88+ when (redisManager .getLikedStatus (postId , memberId )).thenReturn (Optional .empty ());
89+ when (sharePostLikeRepository .findBySharePostIdAndMemberId (postId , memberId ))
90+ .thenReturn (Optional .empty ());
4191
4292 // when
4393 sharePostLikeService .toggleLike (postId );
4494
4595 // then
4696 verify (authFacade ).getCurrentUserId ();
47- verify (redisManager ).toggleLike (postId , memberId );
97+ verify (redisManager ).getLikedStatus (postId , memberId );
98+ verify (sharePostLikeRepository ).findBySharePostIdAndMemberId (postId , memberId );
99+ verify (redisManager ).toggleLike (postId , memberId , true ); // false -> true로 토글 (기본값은 false)
100+ }
101+
102+ @ Test
103+ @ DisplayName ("좋아요 개수와 상태 - Redis" )
104+ void getLikeCountAndStatus_WithRedisStatus () {
105+ // given
106+ Long sharePostId = 1L ;
107+ Long memberId = 1L ;
108+ SharePostLikeResponse dbResponse = new SharePostLikeResponse (5L , false );
109+
110+ when (authFacade .getCurrentUserId ()).thenReturn (memberId );
111+ when (sharePostLikeRepository .getLikeCountAndStatus (sharePostId , memberId ))
112+ .thenReturn (dbResponse );
113+ when (redisManager .getLikeCount (sharePostId )).thenReturn (2 );
114+ when (redisManager .getLikedStatus (sharePostId , memberId )).thenReturn (Optional .of (true ));
115+
116+ // when
117+ SharePostLikeResponse result = sharePostLikeService .getLikeCountAndStatus (sharePostId );
118+
119+ // then
120+ assertNotNull (result );
121+ assertEquals (7L , result .getLikeCount ()); // 5(DB) + 2(Redis) = 7
122+ assertTrue (result .isLiked ()); // Redis 값 사용
123+ verify (authFacade ).getCurrentUserId ();
124+ verify (sharePostLikeRepository ).getLikeCountAndStatus (sharePostId , memberId );
125+ verify (redisManager ).getLikeCount (sharePostId );
126+ verify (redisManager ).getLikedStatus (sharePostId , memberId );
48127 }
49128
50129 @ Test
51- @ DisplayName ("좋아요 개수와 상태 조회 성공 " )
52- void getLikeCountAndStatus_Success () {
130+ @ DisplayName ("좋아요 개수와 상태 - NoRedis " )
131+ void getLikeCountAndStatus_SuccessNoRedis () {
53132 // given
54133 Long sharePostId = 1L ;
55134 Long memberId = 1L ;
@@ -58,6 +137,8 @@ void getLikeCountAndStatus_Success() {
58137 when (authFacade .getCurrentUserId ()).thenReturn (memberId );
59138 when (sharePostLikeRepository .getLikeCountAndStatus (sharePostId , memberId ))
60139 .thenReturn (mockResponse );
140+ when (redisManager .getLikeCount (sharePostId )).thenReturn (0 );
141+ when (redisManager .getLikedStatus (sharePostId , memberId )).thenReturn (Optional .empty ());
61142
62143 // when
63144 SharePostLikeResponse result = sharePostLikeService .getLikeCountAndStatus (sharePostId );
@@ -68,6 +149,8 @@ void getLikeCountAndStatus_Success() {
68149 assertTrue (result .isLiked ());
69150 verify (authFacade ).getCurrentUserId ();
70151 verify (sharePostLikeRepository ).getLikeCountAndStatus (sharePostId , memberId );
152+ verify (redisManager ).getLikeCount (sharePostId );
153+ verify (redisManager ).getLikedStatus (sharePostId , memberId );
71154 }
72155
73156 @ Test
@@ -107,5 +190,7 @@ void getLikeCountAndStatus_NullPostId() {
107190
108191 verify (authFacade ).getCurrentUserId ();
109192 verify (sharePostLikeRepository , never ()).getLikeCountAndStatus (any (), any ());
193+ verify (redisManager , never ()).getLikeCount (any ());
194+ verify (redisManager , never ()).getLikedStatus (any (), any ());
110195 }
111196}
0 commit comments