Skip to content

Commit b413fb1

Browse files
authored
[test/#420] Recommendation 회귀 테스트 보강 (#449)
* test: MMR 서비스 단위 테스트 작성 * test: 추천 재생성 API 서비스 단위 테스트 작성 * test: 스케쥴러 단위 테스트 작성 * test: 리포지토리 단위 테스트 작성 * test: 추천 이력 엔티티 단위 테스트 작성 * test: 통합 테스트를 integration 패키지로 네이밍을 바꾸고 Nested 구조로 변경 * test: post 픽스쳐를 네이밍 명확화 * test: Recommendation 패키지의 fixture를 공통으로 분리 * test: query 테스트도 정확한 목록을 체크하도록 변경 * test: 통합 테스트의 네이밍 명확화 * refactor: 메서드 네이밍 오타 정정 * test: Mockito Matcher를 인라인화
1 parent d4dd0cc commit b413fb1

14 files changed

Lines changed: 827 additions & 349 deletions

src/main/java/com/techfork/domain/recommendation/entity/RecommendationHistory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public static RecommendationHistory fromRecommendedPost(RecommendedPost recommen
8585
/**
8686
* 클릭 기록
8787
*/
88-
public void markAsisClicked() {
88+
public void markAsClicked() {
8989
this.isClicked = true;
9090
this.clickedAt = LocalDateTime.now();
9191
}

src/test/java/com/techfork/domain/recommendation/controller/RecommendationControllerIntegrationTest.java

Lines changed: 0 additions & 260 deletions
This file was deleted.

src/test/java/com/techfork/domain/recommendation/converter/RecommendationConverterTest.java

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
import com.techfork.domain.recommendation.entity.RecommendedPost;
66
import com.techfork.domain.source.entity.TechBlog;
77
import com.techfork.useraccount.domain.User;
8-
import com.techfork.useraccount.domain.enums.SocialType;
98
import com.techfork.global.util.CloudflareThirdPartyThumbnailOptimizer;
109
import org.junit.jupiter.api.DisplayName;
1110
import org.junit.jupiter.api.Test;
1211

1312
import java.time.LocalDateTime;
1413

14+
import static com.techfork.domain.recommendation.fixture.RecommendationPostFixture.post;
15+
import static com.techfork.domain.recommendation.fixture.RecommendedPostFixture.recommendedPost;
16+
import static com.techfork.domain.recommendation.fixture.RecommendationPostFixture.techBlog;
17+
import static com.techfork.domain.recommendation.fixture.RecommendationUserFixture.user;
1518
import static org.assertj.core.api.Assertions.assertThat;
1619
import static org.mockito.Mockito.mock;
1720
import static org.mockito.Mockito.when;
@@ -24,32 +27,20 @@ void toRecommendedPostDto_OptimizesThumbnailUrl() {
2427
CloudflareThirdPartyThumbnailOptimizer thumbnailOptimizer = mock(CloudflareThirdPartyThumbnailOptimizer.class);
2528
RecommendationConverter converter = new RecommendationConverter(thumbnailOptimizer);
2629

27-
TechBlog techBlog = TechBlog.create(
28-
"테스트 회사",
29-
"https://techfork.com",
30-
"https://techfork.com/rss",
31-
"https://techfork.com/logo.png"
30+
TechBlog techBlog = techBlog("테스트 회사", "https://techfork.com");
31+
Post post = post(
32+
techBlog,
33+
"게시글",
34+
"전체 내용",
35+
"본문 내용",
36+
null,
37+
"요약",
38+
"https://images.example.com/thumb.jpg",
39+
"https://techfork.com/posts/1",
40+
LocalDateTime.now()
3241
);
33-
34-
Post post = Post.builder()
35-
.title("게시글")
36-
.shortSummary("요약")
37-
.company("테스트 회사")
38-
.url("https://techfork.com/posts/1")
39-
.thumbnailUrl("https://images.example.com/thumb.jpg")
40-
.publishedAt(LocalDateTime.now())
41-
.crawledAt(LocalDateTime.now())
42-
.techBlog(techBlog)
43-
.build();
44-
45-
User user = User.createSocialUser(
46-
SocialType.KAKAO,
47-
"social-id",
48-
"test@example.com",
49-
"https://example.com/profile.png"
50-
);
51-
52-
RecommendedPost recommendedPost = RecommendedPost.create(user, post, 0.9, 0.8, 1);
42+
User user = user("social-id", "test@example.com");
43+
RecommendedPost recommendedPost = recommendedPost(user, post, 0.9, 0.8, 1);
5344

5445
when(thumbnailOptimizer.optimize("https://images.example.com/thumb.jpg"))
5546
.thenReturn("https://api.techfork.com/cdn-cgi/image/fit=scale-down,width=480,quality=75,format=auto/https://images.example.com/thumb.jpg");
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.techfork.domain.recommendation.entity;
2+
3+
import com.techfork.post.domain.Post;
4+
import com.techfork.useraccount.domain.User;
5+
import org.junit.jupiter.api.DisplayName;
6+
import org.junit.jupiter.api.Test;
7+
8+
import java.time.LocalDateTime;
9+
10+
import static com.techfork.domain.recommendation.fixture.RecommendationPostFixture.post;
11+
import static com.techfork.domain.recommendation.fixture.RecommendedPostFixture.recommendedPost;
12+
import static com.techfork.domain.recommendation.fixture.RecommendationPostFixture.techBlog;
13+
import static com.techfork.domain.recommendation.fixture.RecommendationUserFixture.user;
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
16+
@DisplayName("RecommendationHistory 단위 테스트")
17+
class RecommendationHistoryTest {
18+
19+
@Test
20+
@DisplayName("현재 추천 게시글로부터 추천 이력을 생성한다")
21+
void fromRecommendedPost_CopiesRecommendationSnapshot() {
22+
User user = user("recommendation-history-user", "history@example.com");
23+
Post post = post(techBlog("테스트회사", "https://history-test.com"), "추천 이력 테스트 게시글", "https://history-test.com/posts/1");
24+
RecommendedPost recommendedPost = recommendedPost(user, post, 0.91, 0.82, 3);
25+
26+
RecommendationHistory history = RecommendationHistory.fromRecommendedPost(recommendedPost);
27+
28+
assertThat(history.getUser()).isSameAs(user);
29+
assertThat(history.getPost()).isSameAs(post);
30+
assertThat(history.getSimilarityScore()).isEqualTo(0.91);
31+
assertThat(history.getMmrScore()).isEqualTo(0.82);
32+
assertThat(history.getRankOrder()).isEqualTo(3);
33+
assertThat(history.getRecommendedAt()).isEqualTo(recommendedPost.getRecommendedAt());
34+
assertThat(history.getIsClicked()).isFalse();
35+
assertThat(history.getClickedAt()).isNull();
36+
}
37+
38+
@Test
39+
@DisplayName("추천 이력을 클릭 상태로 표시한다")
40+
void markAsClicked_MarksHistoryAsClicked() {
41+
RecommendationHistory history = RecommendationHistory.fromRecommendedPost(
42+
recommendedPost(
43+
user("recommendation-history-user", "history@example.com"),
44+
post(techBlog("테스트회사", "https://history-test.com"), "추천 이력 테스트 게시글", "https://history-test.com/posts/1"),
45+
0.91,
46+
0.82,
47+
1
48+
)
49+
);
50+
51+
LocalDateTime beforeClick = LocalDateTime.now();
52+
history.markAsClicked();
53+
LocalDateTime afterClick = LocalDateTime.now();
54+
55+
assertThat(history.getIsClicked()).isTrue();
56+
assertThat(history.getClickedAt()).isBetween(beforeClick, afterClick);
57+
}
58+
}

0 commit comments

Comments
 (0)