diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/api/AdminFeedApi.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/api/AdminFeedApi.java index 132b461d..c77ba83f 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/api/AdminFeedApi.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/api/AdminFeedApi.java @@ -1,7 +1,6 @@ package ddingdong.ddingdongBE.domain.feed.api; import ddingdong.ddingdongBE.domain.feed.controller.dto.response.AdminClubFeedRankingResponse; -import ddingdong.ddingdongBE.domain.feed.controller.dto.response.AdminFeedRankingWinnerResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; @@ -22,16 +21,6 @@ @RequestMapping("/server/admin/feeds") public interface AdminFeedApi { - @Operation(summary = "총동연 월별 1위 동아리 목록 조회 API") - @ApiResponse(responseCode = "200", description = "월별 1위 동아리 목록 조회 성공", - content = @Content(array = @ArraySchema(schema = @Schema(implementation = AdminFeedRankingWinnerResponse.class)))) - @ResponseStatus(HttpStatus.OK) - @SecurityRequirement(name = "AccessToken") - @GetMapping("/ranking/last") - List getMonthlyWinners( - @RequestParam("year") @Min(value = 2000, message = "year는 2000 이상이어야 합니다.") @Max(value = 2100, message = "year는 2100 이하여야 합니다.") int year - ); - @Operation(summary = "총동연 피드 랭킹 조회 API") @ApiResponse(responseCode = "200", description = "동아리별 피드 랭킹 조회 성공", content = @Content(array = @ArraySchema(schema = @Schema(implementation = AdminClubFeedRankingResponse.class)))) diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/AdminFeedController.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/AdminFeedController.java index 41adb0bf..f2fdd160 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/AdminFeedController.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/AdminFeedController.java @@ -2,7 +2,6 @@ import ddingdong.ddingdongBE.domain.feed.api.AdminFeedApi; import ddingdong.ddingdongBE.domain.feed.controller.dto.response.AdminClubFeedRankingResponse; -import ddingdong.ddingdongBE.domain.feed.controller.dto.response.AdminFeedRankingWinnerResponse; import ddingdong.ddingdongBE.domain.feed.service.FeedRankingService; import java.util.List; import lombok.RequiredArgsConstructor; @@ -16,13 +15,6 @@ public class AdminFeedController implements AdminFeedApi { private final FeedRankingService feedRankingService; - @Override - public List getMonthlyWinners(int year) { - return feedRankingService.getMonthlyWinners(year).stream() - .map(AdminFeedRankingWinnerResponse::from) - .toList(); - } - @Override public List getClubFeedRanking(int year, int month) { return AdminClubFeedRankingResponse.from( diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/AdminFeedRankingWinnerResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/AdminFeedRankingWinnerResponse.java deleted file mode 100644 index b3c5dfa2..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/AdminFeedRankingWinnerResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package ddingdong.ddingdongBE.domain.feed.controller.dto.response; - -import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedRankingWinnerQuery; -import lombok.Builder; - -@Builder -public record AdminFeedRankingWinnerResponse( - Long clubId, - String clubName, - long feedCount, - long viewCount, - long likeCount, - long commentCount, - long score, - int targetYear, - int targetMonth -) { - - public static AdminFeedRankingWinnerResponse from(FeedRankingWinnerQuery query) { - return AdminFeedRankingWinnerResponse.builder() - .clubId(query.clubId()) - .clubName(query.clubName()) - .feedCount(query.feedCount()) - .viewCount(query.viewCount()) - .likeCount(query.likeCount()) - .commentCount(query.commentCount()) - .score(query.score()) - .targetYear(query.targetYear()) - .targetMonth(query.targetMonth()) - .build(); - } -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedMonthlyRankingRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedMonthlyRankingRepository.java index 5e534726..ed87a4be 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedMonthlyRankingRepository.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedMonthlyRankingRepository.java @@ -1,12 +1,9 @@ package ddingdong.ddingdongBE.domain.feed.repository; import ddingdong.ddingdongBE.domain.feed.entity.FeedMonthlyRanking; -import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; public interface FeedMonthlyRankingRepository extends JpaRepository { boolean existsByTargetYearAndTargetMonth(int targetYear, int targetMonth); - - List findByTargetYearAndRankingOrderByTargetMonthAsc(int targetYear, int ranking); } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FeedRankingService.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FeedRankingService.java index fca1d2d3..eee0c16b 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FeedRankingService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FeedRankingService.java @@ -2,13 +2,10 @@ import ddingdong.ddingdongBE.domain.feed.service.dto.query.ClubFeedRankingQuery; import ddingdong.ddingdongBE.domain.feed.service.dto.query.ClubMonthlyStatusQuery; -import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedRankingWinnerQuery; import java.util.List; public interface FeedRankingService { - List getMonthlyWinners(int year); - List getClubFeedRanking(int year, int month); ClubMonthlyStatusQuery getClubMonthlyStatus(Long userId, int year, int month); diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedRankingService.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedRankingService.java index dfb6f0c7..e8896a99 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedRankingService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedRankingService.java @@ -2,13 +2,10 @@ import ddingdong.ddingdongBE.domain.club.entity.Club; import ddingdong.ddingdongBE.domain.club.service.ClubService; -import ddingdong.ddingdongBE.domain.feed.entity.FeedMonthlyRanking; -import ddingdong.ddingdongBE.domain.feed.repository.FeedMonthlyRankingRepository; import ddingdong.ddingdongBE.domain.feed.repository.FeedRepository; import ddingdong.ddingdongBE.domain.feed.repository.dto.MonthlyFeedRankingDto; import ddingdong.ddingdongBE.domain.feed.service.dto.query.ClubFeedRankingQuery; import ddingdong.ddingdongBE.domain.feed.service.dto.query.ClubMonthlyStatusQuery; -import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedRankingWinnerQuery; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -21,26 +18,14 @@ @Transactional(readOnly = true) public class GeneralFeedRankingService implements FeedRankingService { - private static final int WINNER_RANKING = 1; private static final int FEED_WEIGHT = 10; private static final int VIEW_WEIGHT = 1; private static final int LIKE_WEIGHT = 3; private static final int COMMENT_WEIGHT = 5; - private final FeedMonthlyRankingRepository feedMonthlyRankingRepository; private final FeedRepository feedRepository; private final ClubService clubService; - @Override - public List getMonthlyWinners(int year) { - List rankings = - feedMonthlyRankingRepository.findByTargetYearAndRankingOrderByTargetMonthAsc(year, WINNER_RANKING); - - return rankings.stream() - .map(FeedRankingWinnerQuery::from) - .toList(); - } - @Override public List getClubFeedRanking(int year, int month) { List rawRankings = feedRepository.findMonthlyRankingByClub(year, month); diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedRankingWinnerQuery.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedRankingWinnerQuery.java deleted file mode 100644 index ec6a1499..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedRankingWinnerQuery.java +++ /dev/null @@ -1,32 +0,0 @@ -package ddingdong.ddingdongBE.domain.feed.service.dto.query; - -import ddingdong.ddingdongBE.domain.feed.entity.FeedMonthlyRanking; -import lombok.Builder; - -@Builder -public record FeedRankingWinnerQuery( - Long clubId, - String clubName, - long feedCount, - long viewCount, - long likeCount, - long commentCount, - long score, - int targetYear, - int targetMonth -) { - - public static FeedRankingWinnerQuery from(FeedMonthlyRanking entity) { - return FeedRankingWinnerQuery.builder() - .clubId(entity.getClubId()) - .clubName(entity.getClubName()) - .feedCount(entity.getFeedCount()) - .viewCount(entity.getViewCount()) - .likeCount(entity.getLikeCount()) - .commentCount(entity.getCommentCount()) - .score(entity.getScore()) - .targetYear(entity.getTargetYear()) - .targetMonth(entity.getTargetMonth()) - .build(); - } -} diff --git a/src/test/java/ddingdong/ddingdongBE/domain/feed/controller/AdminFeedControllerE2ETest.java b/src/test/java/ddingdong/ddingdongBE/domain/feed/controller/AdminFeedControllerE2ETest.java index b87869dd..2aabe9f0 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/feed/controller/AdminFeedControllerE2ETest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/feed/controller/AdminFeedControllerE2ETest.java @@ -7,16 +7,13 @@ import ddingdong.ddingdongBE.auth.controller.dto.response.SignInResponse; import ddingdong.ddingdongBE.common.fixture.ClubFixture; import ddingdong.ddingdongBE.common.fixture.FeedFixture; -import ddingdong.ddingdongBE.common.fixture.FeedMonthlyRankingFixture; import ddingdong.ddingdongBE.common.fixture.UserFixture; import ddingdong.ddingdongBE.common.support.NonTxTestContainerSupport; import ddingdong.ddingdongBE.domain.club.entity.Club; import ddingdong.ddingdongBE.domain.club.repository.ClubRepository; import ddingdong.ddingdongBE.domain.feed.controller.dto.response.AdminClubFeedRankingResponse; -import ddingdong.ddingdongBE.domain.feed.controller.dto.response.AdminFeedRankingWinnerResponse; import ddingdong.ddingdongBE.domain.feed.entity.Feed; import ddingdong.ddingdongBE.domain.feed.repository.FeedLikeRepository; -import ddingdong.ddingdongBE.domain.feed.repository.FeedMonthlyRankingRepository; import ddingdong.ddingdongBE.domain.feed.repository.FeedRepository; import ddingdong.ddingdongBE.domain.user.entity.User; import ddingdong.ddingdongBE.domain.user.repository.UserRepository; @@ -42,9 +39,6 @@ class AdminFeedControllerE2ETest extends NonTxTestContainerSupport { @Autowired private UserRepository userRepository; - @Autowired - private FeedMonthlyRankingRepository feedMonthlyRankingRepository; - @Autowired private ClubRepository clubRepository; @@ -67,37 +61,9 @@ void setUp() { User admin = userRepository.save( UserFixture.createAdminUser(passwordEncoder.encode("1234"))); - feedMonthlyRankingRepository.saveAll(List.of( - FeedMonthlyRankingFixture.createWinner(1L, "1월 우승 동아리", 2025, 1), - FeedMonthlyRankingFixture.createWinner(2L, "2월 우승 동아리", 2025, 2), - FeedMonthlyRankingFixture.createWinner(3L, "3월 우승 동아리", 2025, 3) - )); - adminToken = getAuthToken(admin.getAuthId(), "1234"); } - @DisplayName("총동연 월별 1위 동아리 목록 조회 API - 성공") - @Test - void getMonthlyWinners_success() { - List response = given() - .contentType(ContentType.JSON) - .header("Authorization", "Bearer " + adminToken) - .queryParam("year", 2025) - .when() - .get("/server/admin/feeds/ranking/last") - .then() - .statusCode(200) - .extract() - .jsonPath() - .getList(".", AdminFeedRankingWinnerResponse.class); - - assertThat(response).hasSize(3); - assertThat(response.get(0).clubName()).isEqualTo("1월 우승 동아리"); - assertThat(response.get(0).targetMonth()).isEqualTo(1); - assertThat(response.get(2).clubName()).isEqualTo("3월 우승 동아리"); - assertThat(response.get(2).targetMonth()).isEqualTo(3); - } - @DisplayName("총동연 피드 랭킹 조회 API - 성공: 점수 순으로 랭킹이 반환된다") @Test void getClubFeedRanking_success() { diff --git a/src/test/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/AdminFeedRankingWinnerResponseTest.java b/src/test/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/AdminFeedRankingWinnerResponseTest.java deleted file mode 100644 index 38d98c55..00000000 --- a/src/test/java/ddingdong/ddingdongBE/domain/feed/controller/dto/response/AdminFeedRankingWinnerResponseTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package ddingdong.ddingdongBE.domain.feed.controller.dto.response; - -import static org.assertj.core.api.SoftAssertions.assertSoftly; - -import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedRankingWinnerQuery; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class AdminFeedRankingWinnerResponseTest { - - @DisplayName("from - FeedRankingWinnerQuery의 모든 필드를 올바르게 매핑한다") - @Test - void from_mapsAllFields() { - // given - FeedRankingWinnerQuery query = FeedRankingWinnerQuery.builder() - .clubName("테스트 동아리") - .feedCount(10) - .viewCount(100) - .likeCount(50) - .commentCount(20) - .score(450) - .targetYear(2025) - .targetMonth(3) - .build(); - - // when - AdminFeedRankingWinnerResponse response = AdminFeedRankingWinnerResponse.from(query); - - // then - assertSoftly(softly -> { - softly.assertThat(response.clubName()).isEqualTo("테스트 동아리"); - softly.assertThat(response.feedCount()).isEqualTo(10); - softly.assertThat(response.viewCount()).isEqualTo(100); - softly.assertThat(response.likeCount()).isEqualTo(50); - softly.assertThat(response.commentCount()).isEqualTo(20); - softly.assertThat(response.score()).isEqualTo(450); - softly.assertThat(response.targetYear()).isEqualTo(2025); - softly.assertThat(response.targetMonth()).isEqualTo(3); - }); - } -} diff --git a/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedMonthlyRankingRepositoryTest.java b/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedMonthlyRankingRepositoryTest.java index b67c7842..82704497 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedMonthlyRankingRepositoryTest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedMonthlyRankingRepositoryTest.java @@ -1,12 +1,9 @@ package ddingdong.ddingdongBE.domain.feed.repository; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.SoftAssertions.assertSoftly; import ddingdong.ddingdongBE.common.fixture.FeedMonthlyRankingFixture; import ddingdong.ddingdongBE.common.support.DataJpaTestSupport; -import ddingdong.ddingdongBE.domain.feed.entity.FeedMonthlyRanking; -import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -27,47 +24,4 @@ void existsByTargetYearAndTargetMonth() { assertThat(feedMonthlyRankingRepository.existsByTargetYearAndTargetMonth(2026, 1)).isTrue(); assertThat(feedMonthlyRankingRepository.existsByTargetYearAndTargetMonth(2026, 2)).isFalse(); } - - @DisplayName("findByTargetYearAndRankingOrderByTargetMonthAsc - 해당 연도의 지정 순위만 월 오름차순으로 조회한다") - @Test - void findByTargetYearAndRankingOrderByTargetMonthAsc() { - // given - feedMonthlyRankingRepository.saveAll(List.of( - FeedMonthlyRankingFixture.createWinner(1L, "1월 1위", 2025, 1), - FeedMonthlyRankingFixture.createWithRanking(2L, "1월 2위", 2025, 1, 2), - FeedMonthlyRankingFixture.createWinner(3L, "3월 1위", 2025, 3), - FeedMonthlyRankingFixture.createWinner(4L, "2월 1위", 2025, 2), - FeedMonthlyRankingFixture.createWinner(5L, "다른 연도", 2024, 1) - )); - - // when - List result = - feedMonthlyRankingRepository.findByTargetYearAndRankingOrderByTargetMonthAsc(2025, 1); - - // then - assertThat(result).hasSize(3); - assertSoftly(softly -> { - softly.assertThat(result.get(0).getClubName()).isEqualTo("1월 1위"); - softly.assertThat(result.get(0).getTargetMonth()).isEqualTo(1); - softly.assertThat(result.get(1).getClubName()).isEqualTo("2월 1위"); - softly.assertThat(result.get(1).getTargetMonth()).isEqualTo(2); - softly.assertThat(result.get(2).getClubName()).isEqualTo("3월 1위"); - softly.assertThat(result.get(2).getTargetMonth()).isEqualTo(3); - }); - } - - @DisplayName("findByTargetYearAndRankingOrderByTargetMonthAsc - 해당 연도에 데이터가 없으면 빈 리스트를 반환한다") - @Test - void findByTargetYearAndRankingOrderByTargetMonthAsc_emptyResult() { - // given - feedMonthlyRankingRepository.save( - FeedMonthlyRankingFixture.createWinner(1L, "2024년 동아리", 2024, 1)); - - // when - List result = - feedMonthlyRankingRepository.findByTargetYearAndRankingOrderByTargetMonthAsc(2025, 1); - - // then - assertThat(result).isEmpty(); - } } diff --git a/src/test/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedRankingServiceTest.java b/src/test/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedRankingServiceTest.java index b3bbfa52..456c3466 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedRankingServiceTest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedRankingServiceTest.java @@ -5,7 +5,6 @@ import ddingdong.ddingdongBE.common.fixture.ClubFixture; import ddingdong.ddingdongBE.common.fixture.FeedFixture; -import ddingdong.ddingdongBE.common.fixture.FeedMonthlyRankingFixture; import ddingdong.ddingdongBE.common.fixture.UserFixture; import ddingdong.ddingdongBE.common.support.TestContainerSupport; import ddingdong.ddingdongBE.domain.club.entity.Club; @@ -13,11 +12,9 @@ import ddingdong.ddingdongBE.domain.feed.entity.Feed; import ddingdong.ddingdongBE.domain.feed.repository.FeedCommentRepository; import ddingdong.ddingdongBE.domain.feed.repository.FeedLikeRepository; -import ddingdong.ddingdongBE.domain.feed.repository.FeedMonthlyRankingRepository; import ddingdong.ddingdongBE.domain.feed.repository.FeedRepository; import ddingdong.ddingdongBE.domain.feed.service.dto.query.ClubFeedRankingQuery; import ddingdong.ddingdongBE.domain.feed.service.dto.query.ClubMonthlyStatusQuery; -import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedRankingWinnerQuery; import ddingdong.ddingdongBE.domain.user.entity.User; import ddingdong.ddingdongBE.domain.user.repository.UserRepository; import java.time.LocalDate; @@ -33,9 +30,6 @@ class GeneralFeedRankingServiceTest extends TestContainerSupport { @Autowired private FeedRankingService feedRankingService; - @Autowired - private FeedMonthlyRankingRepository feedMonthlyRankingRepository; - @Autowired private ClubRepository clubRepository; @@ -51,132 +45,6 @@ class GeneralFeedRankingServiceTest extends TestContainerSupport { @Autowired private UserRepository userRepository; - @DisplayName("월별 1위 동아리 목록 조회 - 성공: 각 월의 1위 동아리가 반환된다") - @Test - void getMonthlyWinners_success() { - // given - int year = 2025; - feedMonthlyRankingRepository.saveAll(List.of( - FeedMonthlyRankingFixture.createWinner(1L, "동아리A", year, 1), - FeedMonthlyRankingFixture.createWinner(2L, "동아리B", year, 2), - FeedMonthlyRankingFixture.createWinner(3L, "동아리C", year, 3) - )); - - // when - List result = feedRankingService.getMonthlyWinners(year); - - // then - assertThat(result).hasSize(3); - assertSoftly(softly -> { - softly.assertThat(result.get(0).clubName()).isEqualTo("동아리A"); - softly.assertThat(result.get(0).targetMonth()).isEqualTo(1); - softly.assertThat(result.get(1).clubName()).isEqualTo("동아리B"); - softly.assertThat(result.get(1).targetMonth()).isEqualTo(2); - softly.assertThat(result.get(2).clubName()).isEqualTo("동아리C"); - softly.assertThat(result.get(2).targetMonth()).isEqualTo(3); - }); - } - - @DisplayName("월별 1위 동아리 목록 조회 - 성공: 동점으로 같은 월에 ranking=1이 여러 개면 모두 반환된다") - @Test - void getMonthlyWinners_tieBreak() { - // given - int year = 2025; - feedMonthlyRankingRepository.saveAll(List.of( - FeedMonthlyRankingFixture.create(1L, "동아리A", 10, 100, 50, 20, year, 1, 1), - FeedMonthlyRankingFixture.create(2L, "동아리B", 10, 100, 50, 20, year, 1, 1) - )); - - // when - List result = feedRankingService.getMonthlyWinners(year); - - // then - assertThat(result).hasSize(2); - assertSoftly(softly -> { - softly.assertThat(result.get(0).targetMonth()).isEqualTo(1); - softly.assertThat(result.get(0).clubName()).isEqualTo("동아리A"); - softly.assertThat(result.get(1).targetMonth()).isEqualTo(1); - softly.assertThat(result.get(1).clubName()).isEqualTo("동아리B"); - }); - } - - @DisplayName("월별 1위 동아리 목록 조회 - 성공: 해당 연도 데이터가 없으면 빈 리스트를 반환한다") - @Test - void getMonthlyWinners_emptyData() { - // when - List result = feedRankingService.getMonthlyWinners(2025); - - // then - assertThat(result).isEmpty(); - } - - @DisplayName("월별 1위 동아리 목록 조회 - 성공: 2위 이하 동아리는 포함되지 않는다") - @Test - void getMonthlyWinners_excludesNonWinners() { - // given - int year = 2025; - feedMonthlyRankingRepository.saveAll(List.of( - FeedMonthlyRankingFixture.createWinner(1L, "1위 동아리", year, 1), - FeedMonthlyRankingFixture.createWithRanking(2L, "2위 동아리", year, 1, 2), - FeedMonthlyRankingFixture.createWithRanking(3L, "3위 동아리", year, 1, 3) - )); - - // when - List result = feedRankingService.getMonthlyWinners(year); - - // then - assertThat(result).hasSize(1); - assertThat(result.get(0).clubName()).isEqualTo("1위 동아리"); - } - - @DisplayName("월별 1위 동아리 목록 조회 - 성공: 다른 연도의 1위 데이터는 포함되지 않는다") - @Test - void getMonthlyWinners_yearIsolation() { - // given - feedMonthlyRankingRepository.saveAll(List.of( - FeedMonthlyRankingFixture.createWinner(1L, "2025년 동아리", 2025, 1), - FeedMonthlyRankingFixture.createWinner(2L, "2024년 동아리", 2024, 1), - FeedMonthlyRankingFixture.createWinner(3L, "2025년 3월 동아리", 2025, 3) - )); - - // when - List result = feedRankingService.getMonthlyWinners(2025); - - // then - assertThat(result).hasSize(2); - assertSoftly(softly -> { - softly.assertThat(result.get(0).clubName()).isEqualTo("2025년 동아리"); - softly.assertThat(result.get(0).targetMonth()).isEqualTo(1); - softly.assertThat(result.get(1).clubName()).isEqualTo("2025년 3월 동아리"); - softly.assertThat(result.get(1).targetMonth()).isEqualTo(3); - }); - } - - @DisplayName("월별 1위 동아리 목록 조회 - 성공: 응답에 score 필드가 올바르게 매핑된다") - @Test - void getMonthlyWinners_scoreMapping() { - // given - int year = 2025; - // feedCount=10, viewCount=100, likeCount=50, commentCount=20 - // score = 10*10 + 100*1 + 50*3 + 20*5 = 450 - feedMonthlyRankingRepository.save( - FeedMonthlyRankingFixture.create(1L, "점수 검증 동아리", 10, 100, 50, 20, year, 1, 1)); - - // when - List result = feedRankingService.getMonthlyWinners(year); - - // then - assertThat(result).hasSize(1); - assertSoftly(softly -> { - softly.assertThat(result.get(0).clubName()).isEqualTo("점수 검증 동아리"); - softly.assertThat(result.get(0).score()).isEqualTo(450L); - softly.assertThat(result.get(0).feedCount()).isEqualTo(10); - softly.assertThat(result.get(0).viewCount()).isEqualTo(100); - softly.assertThat(result.get(0).likeCount()).isEqualTo(50); - softly.assertThat(result.get(0).commentCount()).isEqualTo(20); - }); - } - @DisplayName("동아리별 피드 랭킹 조회 - 성공: 점수 높은 순서로 정렬된다") @Test void getClubFeedRanking_sortedByScore() { diff --git a/src/test/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedRankingWinnerQueryTest.java b/src/test/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedRankingWinnerQueryTest.java deleted file mode 100644 index 0b6cf65e..00000000 --- a/src/test/java/ddingdong/ddingdongBE/domain/feed/service/dto/query/FeedRankingWinnerQueryTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package ddingdong.ddingdongBE.domain.feed.service.dto.query; - -import static org.assertj.core.api.SoftAssertions.assertSoftly; - -import ddingdong.ddingdongBE.common.fixture.FeedMonthlyRankingFixture; -import ddingdong.ddingdongBE.domain.feed.entity.FeedMonthlyRanking; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class FeedRankingWinnerQueryTest { - - @DisplayName("from - FeedMonthlyRanking 엔티티의 모든 필드를 올바르게 매핑한다") - @Test - void from_mapsAllFields() { - // given - FeedMonthlyRanking entity = FeedMonthlyRankingFixture.create( - 1L, "테스트 동아리", 10, 100, 50, 20, 2025, 3, 1); - - // when - FeedRankingWinnerQuery query = FeedRankingWinnerQuery.from(entity); - - // then - assertSoftly(softly -> { - softly.assertThat(query.clubName()).isEqualTo("테스트 동아리"); - softly.assertThat(query.feedCount()).isEqualTo(10); - softly.assertThat(query.viewCount()).isEqualTo(100); - softly.assertThat(query.likeCount()).isEqualTo(50); - softly.assertThat(query.commentCount()).isEqualTo(20); - softly.assertThat(query.score()).isEqualTo(450L); - softly.assertThat(query.targetYear()).isEqualTo(2025); - softly.assertThat(query.targetMonth()).isEqualTo(3); - }); - } -}