From 01e6d375a35280b75f07462c734496256e027526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A7=80=ED=98=84?= <102128060+wlgusqkr@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:17:16 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20PageRequest=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/alarm/controller/AlarmApi.java | 4 ++-- .../controller/AlarmQueryController.java | 4 ++-- .../repository/AlarmDynamicRepository.java | 4 ++-- .../AlarmDynamicRepositoryImpl.java | 9 ++------ .../alarm/service/AlarmQueryService.java | 4 ++-- .../domain/feed/controller/FeedApi.java | 4 ++-- .../feed/controller/FeedController.java | 4 ++-- .../repository/FeedDynamicRepository.java | 4 ++-- .../repository/FeedDynamicRepositoryImpl.java | 4 ++-- .../domain/feed/service/FeedQueryService.java | 4 ++-- .../controller/SubscriptionApi.java | 4 ++-- .../controller/SubscriptionController.java | 4 ++-- .../service/SubscriptionQueryService.java | 4 ++-- .../{PageRequestDTO.java => PageRequest.java} | 2 +- .../feed/controller/FeedControllerTest.java | 21 +++++++++++++++++++ .../support/DocumentationTestSupport.java | 19 ++++++++--------- 16 files changed, 57 insertions(+), 42 deletions(-) rename src/main/java/com/todaysound/todaysound_server/global/dto/{PageRequestDTO.java => PageRequest.java} (81%) create mode 100644 src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java diff --git a/src/main/java/com/todaysound/todaysound_server/domain/alarm/controller/AlarmApi.java b/src/main/java/com/todaysound/todaysound_server/domain/alarm/controller/AlarmApi.java index 119752e..2b7c416 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/alarm/controller/AlarmApi.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/alarm/controller/AlarmApi.java @@ -1,7 +1,7 @@ package com.todaysound.todaysound_server.domain.alarm.controller; import com.todaysound.todaysound_server.domain.alarm.dto.response.RecentAlarmResponse; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import com.todaysound.todaysound_server.global.exception.CustomErrorResponse; import com.todaysound.todaysound_server.global.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; @@ -91,7 +91,7 @@ public interface AlarmApi { ) }) List getRecentAlarms( - @ModelAttribute PageRequestDTO pageRequest, + @ModelAttribute PageRequest pageRequest, @RequestHeader("X-User-ID") String userUuid, @RequestHeader("X-Device-Secret") String deviceSecret ); diff --git a/src/main/java/com/todaysound/todaysound_server/domain/alarm/controller/AlarmQueryController.java b/src/main/java/com/todaysound/todaysound_server/domain/alarm/controller/AlarmQueryController.java index 4b8bb87..d58fe98 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/alarm/controller/AlarmQueryController.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/alarm/controller/AlarmQueryController.java @@ -6,7 +6,7 @@ import com.todaysound.todaysound_server.domain.alarm.dto.response.RecentAlarmResponse; import com.todaysound.todaysound_server.domain.alarm.service.AlarmQueryService; import com.todaysound.todaysound_server.domain.summary.service.SummaryCommandService; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import lombok.RequiredArgsConstructor; @RestController @@ -23,7 +23,7 @@ public class AlarmQueryController implements AlarmApi { @GetMapping() @Override public List getRecentAlarms( - @ModelAttribute final PageRequestDTO pageRequest, + @ModelAttribute final PageRequest pageRequest, @RequestHeader("X-User-ID") String userUuid, @RequestHeader("X-Device-Secret") String deviceSecret) { diff --git a/src/main/java/com/todaysound/todaysound_server/domain/alarm/repository/AlarmDynamicRepository.java b/src/main/java/com/todaysound/todaysound_server/domain/alarm/repository/AlarmDynamicRepository.java index c5a2208..1e9849b 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/alarm/repository/AlarmDynamicRepository.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/alarm/repository/AlarmDynamicRepository.java @@ -3,10 +3,10 @@ import java.util.List; import com.todaysound.todaysound_server.domain.summary.entity.Summary; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; public interface AlarmDynamicRepository { - List findAlarms(Long userId, PageRequestDTO pageRequest); + List findAlarms(Long userId, PageRequest pageRequest); } diff --git a/src/main/java/com/todaysound/todaysound_server/domain/alarm/repository/AlarmDynamicRepositoryImpl.java b/src/main/java/com/todaysound/todaysound_server/domain/alarm/repository/AlarmDynamicRepositoryImpl.java index 88e72a6..a2edfa7 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/alarm/repository/AlarmDynamicRepositoryImpl.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/alarm/repository/AlarmDynamicRepositoryImpl.java @@ -3,14 +3,9 @@ import java.util.List; import com.todaysound.todaysound_server.domain.summary.entity.Summary; -import com.todaysound.todaysound_server.global.exception.BaseException; import org.springframework.stereotype.Repository; -import com.querydsl.core.types.dsl.BooleanExpression; -import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; -import com.todaysound.todaysound_server.domain.alarm.exception.AlarmException; -import com.todaysound.todaysound_server.domain.subscription.entity.Subscription; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import lombok.RequiredArgsConstructor; import static com.todaysound.todaysound_server.domain.subscription.entity.QSubscription.subscription; @@ -24,7 +19,7 @@ public class AlarmDynamicRepositoryImpl implements AlarmDynamicRepository { private final JPAQueryFactory queryFactory; @Override - public List findAlarms(Long userId, PageRequestDTO pageRequest) { + public List findAlarms(Long userId, PageRequest pageRequest) { return queryFactory.selectFrom(summary).innerJoin(summary.subscription, subscription).fetchJoin() .where(subscription.user.id.eq(userId), subscription.isAlarmEnabled.eq(true)) diff --git a/src/main/java/com/todaysound/todaysound_server/domain/alarm/service/AlarmQueryService.java b/src/main/java/com/todaysound/todaysound_server/domain/alarm/service/AlarmQueryService.java index 1a3d9b9..e25f458 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/alarm/service/AlarmQueryService.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/alarm/service/AlarmQueryService.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Service; import com.todaysound.todaysound_server.domain.alarm.dto.response.RecentAlarmResponse; import com.todaysound.todaysound_server.domain.alarm.repository.AlarmRepository; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @@ -20,7 +20,7 @@ public class AlarmQueryService { private final AlarmRepository alarmRepository; private final HeaderAuthValidator headerAuthValidator; - public List getRecentAlarms(final PageRequestDTO pageRequest, final String userUuid, + public List getRecentAlarms(final PageRequest pageRequest, final String userUuid, final String deviceSecret) { // 헤더 인증 검증 및 사용자 획득 diff --git a/src/main/java/com/todaysound/todaysound_server/domain/feed/controller/FeedApi.java b/src/main/java/com/todaysound/todaysound_server/domain/feed/controller/FeedApi.java index af01931..23d2c80 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/feed/controller/FeedApi.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/feed/controller/FeedApi.java @@ -2,7 +2,7 @@ import com.todaysound.todaysound_server.domain.feed.dto.response.FeedResponseDTO; import com.todaysound.todaysound_server.domain.feed.dto.response.HomeFeedResponse; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.ModelAttribute; @@ -17,7 +17,7 @@ public interface FeedApi { 사용자의 읽지 않은 요약(Summary) 중 알람이 활성화된 구독의 요약들인 피드를 페이지네이션하여 조회합니다. """, tags = {"Feed"}, operationId = "getFeeds") - List findFeeds(@ModelAttribute PageRequestDTO pageRequest, + List findFeeds(@ModelAttribute PageRequest pageRequest, @RequestHeader("X-User-ID") String userUuid, @RequestHeader("X-Device-Secret") String deviceSecret); diff --git a/src/main/java/com/todaysound/todaysound_server/domain/feed/controller/FeedController.java b/src/main/java/com/todaysound/todaysound_server/domain/feed/controller/FeedController.java index b49333f..8169e9f 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/feed/controller/FeedController.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/feed/controller/FeedController.java @@ -9,7 +9,7 @@ import com.todaysound.todaysound_server.domain.feed.dto.response.FeedResponseDTO; import com.todaysound.todaysound_server.domain.feed.dto.response.HomeFeedResponse; import com.todaysound.todaysound_server.domain.feed.service.FeedQueryService; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import lombok.RequiredArgsConstructor; @RestController @@ -21,7 +21,7 @@ public class FeedController implements FeedApi { @Override @GetMapping() - public List findFeeds(@ModelAttribute final PageRequestDTO pageRequest, + public List findFeeds(@ModelAttribute final PageRequest pageRequest, @RequestHeader("X-User-ID") String userUuid, @RequestHeader("X-Device-Secret") String deviceSecret) { diff --git a/src/main/java/com/todaysound/todaysound_server/domain/feed/repository/FeedDynamicRepository.java b/src/main/java/com/todaysound/todaysound_server/domain/feed/repository/FeedDynamicRepository.java index 0cf42ef..cedee90 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/feed/repository/FeedDynamicRepository.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/feed/repository/FeedDynamicRepository.java @@ -3,13 +3,13 @@ import java.util.List; import com.todaysound.todaysound_server.domain.summary.entity.Summary; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; public interface FeedDynamicRepository { - List findFeeds(Long userId, PageRequestDTO pageRequest); + List findFeeds(Long userId, PageRequest pageRequest); List findFeedsForHome(Long userId); diff --git a/src/main/java/com/todaysound/todaysound_server/domain/feed/repository/FeedDynamicRepositoryImpl.java b/src/main/java/com/todaysound/todaysound_server/domain/feed/repository/FeedDynamicRepositoryImpl.java index 7cd5e34..b863829 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/feed/repository/FeedDynamicRepositoryImpl.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/feed/repository/FeedDynamicRepositoryImpl.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Repository; import com.querydsl.jpa.impl.JPAQueryFactory; import com.todaysound.todaysound_server.domain.summary.entity.Summary; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import lombok.RequiredArgsConstructor; import static com.todaysound.todaysound_server.domain.summary.entity.QSummary.summary; @@ -18,7 +18,7 @@ public class FeedDynamicRepositoryImpl implements FeedDynamicRepository { private final JPAQueryFactory queryFactory; @Override - public List findFeeds(Long userId, PageRequestDTO pageRequest) { + public List findFeeds(Long userId, PageRequest pageRequest) { return queryFactory.selectFrom(summary).innerJoin(summary.subscription, subscription).fetchJoin() .where(subscription.user.id.eq(userId)).orderBy(summary.updatedAt.desc(), summary.id.desc()) diff --git a/src/main/java/com/todaysound/todaysound_server/domain/feed/service/FeedQueryService.java b/src/main/java/com/todaysound/todaysound_server/domain/feed/service/FeedQueryService.java index 44b9d8e..24a9241 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/feed/service/FeedQueryService.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/feed/service/FeedQueryService.java @@ -7,7 +7,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import com.todaysound.todaysound_server.domain.feed.dto.response.FeedResponseDTO; import com.todaysound.todaysound_server.domain.feed.dto.response.HomeFeedResponse; import com.todaysound.todaysound_server.domain.feed.repository.FeedDynamicRepository; @@ -23,7 +23,7 @@ public class FeedQueryService { private final HeaderAuthValidator headerAuthValidator; public List findFeeds(final String userUuid, final String deviceSecret, - final PageRequestDTO pageRequest) { + final PageRequest pageRequest) { User user = headerAuthValidator.validateAndGetUser(userUuid, deviceSecret); diff --git a/src/main/java/com/todaysound/todaysound_server/domain/subscription/controller/SubscriptionApi.java b/src/main/java/com/todaysound/todaysound_server/domain/subscription/controller/SubscriptionApi.java index d9126cb..b7de8fa 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/subscription/controller/SubscriptionApi.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/subscription/controller/SubscriptionApi.java @@ -4,7 +4,7 @@ import com.todaysound.todaysound_server.domain.subscription.dto.response.KeywordListResponseDto; import com.todaysound.todaysound_server.domain.subscription.dto.response.SubscriptionCreationResponseDto; import com.todaysound.todaysound_server.domain.subscription.dto.response.SubscriptionResponse; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import com.todaysound.todaysound_server.global.exception.CustomErrorResponse; import com.todaysound.todaysound_server.global.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; @@ -105,7 +105,7 @@ public interface SubscriptionApi { ) }) List getMySubscriptions( - @ModelAttribute PageRequestDTO pageRequest, + @ModelAttribute PageRequest pageRequest, @RequestHeader("X-User-ID") String userUuid, @RequestHeader("X-Device-Secret") String deviceSecret ); diff --git a/src/main/java/com/todaysound/todaysound_server/domain/subscription/controller/SubscriptionController.java b/src/main/java/com/todaysound/todaysound_server/domain/subscription/controller/SubscriptionController.java index 17f9d66..26631d3 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/subscription/controller/SubscriptionController.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/subscription/controller/SubscriptionController.java @@ -7,7 +7,7 @@ import com.todaysound.todaysound_server.domain.subscription.dto.response.SubscriptionResponse; import com.todaysound.todaysound_server.domain.subscription.service.SubscriptionCommandService; import com.todaysound.todaysound_server.domain.subscription.service.SubscriptionQueryService; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -27,7 +27,7 @@ public class SubscriptionController implements SubscriptionApi { // 사용자의 구독을 페이지네이션(한 페이지 size 만큼)해서 가져옴. @GetMapping() - public List getMySubscriptions(@ModelAttribute final PageRequestDTO pageRequest, + public List getMySubscriptions(@ModelAttribute final PageRequest pageRequest, @RequestHeader("X-User-ID") String userUuid, @RequestHeader("X-Device-Secret") String deviceSecret) { diff --git a/src/main/java/com/todaysound/todaysound_server/domain/subscription/service/SubscriptionQueryService.java b/src/main/java/com/todaysound/todaysound_server/domain/subscription/service/SubscriptionQueryService.java index c015544..19a5a2e 100644 --- a/src/main/java/com/todaysound/todaysound_server/domain/subscription/service/SubscriptionQueryService.java +++ b/src/main/java/com/todaysound/todaysound_server/domain/subscription/service/SubscriptionQueryService.java @@ -11,7 +11,7 @@ import com.todaysound.todaysound_server.domain.subscription.repository.SubscriptionRepository; import com.todaysound.todaysound_server.domain.user.entity.User; import com.todaysound.todaysound_server.domain.user.validator.HeaderAuthValidator; -import com.todaysound.todaysound_server.global.dto.PageRequestDTO; +import com.todaysound.todaysound_server.global.dto.PageRequest; import lombok.RequiredArgsConstructor; @Service @@ -23,7 +23,7 @@ public class SubscriptionQueryService { private final KeywordRepository keywordRepository; private final HeaderAuthValidator headerAuthValidator; - public List getMySubscriptions(final PageRequestDTO pageRequest, + public List getMySubscriptions(final PageRequest pageRequest, final String userUuid, final String deviceSecret) { // 헤더 인증 검증 및 사용자 획득 diff --git a/src/main/java/com/todaysound/todaysound_server/global/dto/PageRequestDTO.java b/src/main/java/com/todaysound/todaysound_server/global/dto/PageRequest.java similarity index 81% rename from src/main/java/com/todaysound/todaysound_server/global/dto/PageRequestDTO.java rename to src/main/java/com/todaysound/todaysound_server/global/dto/PageRequest.java index 6264aba..3051004 100644 --- a/src/main/java/com/todaysound/todaysound_server/global/dto/PageRequestDTO.java +++ b/src/main/java/com/todaysound/todaysound_server/global/dto/PageRequest.java @@ -1,6 +1,6 @@ package com.todaysound.todaysound_server.global.dto; -public record PageRequestDTO(Long page, Integer size) { +public record PageRequest(Long page, Integer size) { private static final Integer DEFAULT_SIZE = 5; @Override diff --git a/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java b/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java new file mode 100644 index 0000000..a62039e --- /dev/null +++ b/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java @@ -0,0 +1,21 @@ +package com.todaysound.todaysound_server.domain.feed.controller; + +import static org.junit.jupiter.api.Assertions.*; + +import com.todaysound.todaysound_server.support.DocumentationTestSupport; +import org.junit.jupiter.api.Test; + +class FeedControllerTest extends DocumentationTestSupport { + +// +// @Test +// void 피드_목록을_조회합니다() { +// // given +// +// +// // when +// +// // then +// } + +} \ No newline at end of file diff --git a/src/test/java/com/todaysound/todaysound_server/support/DocumentationTestSupport.java b/src/test/java/com/todaysound/todaysound_server/support/DocumentationTestSupport.java index 44d42d5..647a2a4 100644 --- a/src/test/java/com/todaysound/todaysound_server/support/DocumentationTestSupport.java +++ b/src/test/java/com/todaysound/todaysound_server/support/DocumentationTestSupport.java @@ -1,6 +1,7 @@ package com.todaysound.todaysound_server.support; import com.fasterxml.jackson.databind.ObjectMapper; +import com.todaysound.todaysound_server.domain.feed.controller.FeedController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -10,22 +11,20 @@ import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(controllers = { - -}) -@Import({ - RestDocsConfig.class, + FeedController.class, }) +@Import({RestDocsConfig.class,}) @AutoConfigureRestDocs @AutoConfigureMockMvc(addFilters = false) public class DocumentationTestSupport { - @Autowired - protected RestDocumentationResultHandler restDocsHandler; + @Autowired + protected RestDocumentationResultHandler restDocsHandler; - @Autowired - protected MockMvc mockMvc; + @Autowired + protected MockMvc mockMvc; - @Autowired - protected ObjectMapper objectMapper; + @Autowired + protected ObjectMapper objectMapper; } From 3337034dfa65d5c9589ad47372d9a62a0df43d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A7=80=ED=98=84?= <102128060+wlgusqkr@users.noreply.github.com> Date: Tue, 13 Jan 2026 15:59:16 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20FeedControllerTest=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/controller/FeedControllerTest.java | 70 ++++++++++++++++--- .../support/DocumentationTestSupport.java | 5 ++ 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java b/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java index a62039e..8a0430e 100644 --- a/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java +++ b/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java @@ -1,21 +1,69 @@ package com.todaysound.todaysound_server.domain.feed.controller; -import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.todaysound.todaysound_server.domain.feed.dto.response.FeedResponseDTO; import com.todaysound.todaysound_server.support.DocumentationTestSupport; +import java.util.List; import org.junit.jupiter.api.Test; +import org.springframework.data.domain.PageRequest; +import org.springframework.test.web.servlet.ResultActions; class FeedControllerTest extends DocumentationTestSupport { -// -// @Test -// void 피드_목록을_조회합니다() { -// // given -// -// -// // when -// -// // then -// } + + @Test + void 피드_목록을_조회합니다() throws Exception { + // given + PageRequest request = PageRequest.of(0, 10); + + FeedResponseDTO response1 = new FeedResponseDTO(1L, "피드 내용", "작성자 이름", "2024-06-01T12:00:00", "fe", + "1시간 전"); + FeedResponseDTO response2 = new FeedResponseDTO(2L, "또 다른 피드 내용", "다른 작성자", "2024-06-01T11:30:00", "fe2", + "2시간 전"); + FeedResponseDTO response3 = new FeedResponseDTO(3L, "세 번째 피드 내용", "세 번째 작성자", "2024-06-01T10:00:00", + "fe3", "3시간 전"); + + List responseList = List.of(response1, response2, response3); + + given(feedQueryService.findFeeds(anyString(), anyString(), any())).willReturn(responseList); + + // when + ResultActions result = mockMvc.perform( + get("/api/feeds") + .header("X-User-Id", "test-user-id") + .header("X-Device-Secret", "test-device-secret") + .param("page", String.valueOf(request.getPageNumber())) + .param("size", String.valueOf(request.getPageSize())) + ); + // then + result.andExpect(status().isOk()) + .andDo(restDocsHandler.document( + queryParameters( + parameterWithName("page").description("페이지 번호 (0부터 시작)"), + parameterWithName("size").description("페이지 크기") + ), + responseFields( + fieldWithPath("errorCode").description("응답 코드"), + fieldWithPath("message").description("응답 메시지"), + fieldWithPath("result").description("피드 목록"), + fieldWithPath("result[].subscriptionId").description("구독 ID"), + fieldWithPath("result[].alias").description("구독 별칭"), + fieldWithPath("result[].summaryTitle").description("요약 제목"), + fieldWithPath("result[].summaryContent").description("요약 내용"), + fieldWithPath("result[].postUrl").description("연결 url"), + fieldWithPath("result[].timeAgo").description("피드 작성 후 경과 시간") + ))); + } } \ No newline at end of file diff --git a/src/test/java/com/todaysound/todaysound_server/support/DocumentationTestSupport.java b/src/test/java/com/todaysound/todaysound_server/support/DocumentationTestSupport.java index 647a2a4..b07b22f 100644 --- a/src/test/java/com/todaysound/todaysound_server/support/DocumentationTestSupport.java +++ b/src/test/java/com/todaysound/todaysound_server/support/DocumentationTestSupport.java @@ -2,12 +2,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.todaysound.todaysound_server.domain.feed.controller.FeedController; +import com.todaysound.todaysound_server.domain.feed.service.FeedQueryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(controllers = { @@ -27,4 +29,7 @@ public class DocumentationTestSupport { @Autowired protected ObjectMapper objectMapper; + @MockitoBean + protected FeedQueryService feedQueryService; + } From 8a894edacd64a3674b68617723644a5f06afbe13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A7=80=ED=98=84?= <102128060+wlgusqkr@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:15:08 +0900 Subject: [PATCH 3/3] =?UTF-8?q?test:=20=ED=99=88=20=ED=94=BC=EB=93=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20test=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/controller/FeedControllerTest.java | 73 ++++++++++++------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java b/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java index 8a0430e..ddad25a 100644 --- a/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java +++ b/src/test/java/com/todaysound/todaysound_server/domain/feed/controller/FeedControllerTest.java @@ -3,6 +3,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willReturn; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; @@ -13,6 +14,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.todaysound.todaysound_server.domain.feed.dto.response.FeedResponseDTO; +import com.todaysound.todaysound_server.domain.feed.dto.response.HomeFeedResponse; import com.todaysound.todaysound_server.support.DocumentationTestSupport; import java.util.List; import org.junit.jupiter.api.Test; @@ -27,12 +29,11 @@ class FeedControllerTest extends DocumentationTestSupport { // given PageRequest request = PageRequest.of(0, 10); - FeedResponseDTO response1 = new FeedResponseDTO(1L, "피드 내용", "작성자 이름", "2024-06-01T12:00:00", "fe", - "1시간 전"); + FeedResponseDTO response1 = new FeedResponseDTO(1L, "피드 내용", "작성자 이름", "2024-06-01T12:00:00", "fe", "1시간 전"); FeedResponseDTO response2 = new FeedResponseDTO(2L, "또 다른 피드 내용", "다른 작성자", "2024-06-01T11:30:00", "fe2", "2시간 전"); - FeedResponseDTO response3 = new FeedResponseDTO(3L, "세 번째 피드 내용", "세 번째 작성자", "2024-06-01T10:00:00", - "fe3", "3시간 전"); + FeedResponseDTO response3 = new FeedResponseDTO(3L, "세 번째 피드 내용", "세 번째 작성자", "2024-06-01T10:00:00", "fe3", + "3시간 전"); List responseList = List.of(response1, response2, response3); @@ -40,30 +41,50 @@ class FeedControllerTest extends DocumentationTestSupport { // when ResultActions result = mockMvc.perform( - get("/api/feeds") - .header("X-User-Id", "test-user-id") - .header("X-Device-Secret", "test-device-secret") + get("/api/feeds").header("X-User-Id", "test-user-id").header("X-Device-Secret", "test-device-secret") .param("page", String.valueOf(request.getPageNumber())) - .param("size", String.valueOf(request.getPageSize())) - ); + .param("size", String.valueOf(request.getPageSize()))); // then - result.andExpect(status().isOk()) - .andDo(restDocsHandler.document( - queryParameters( - parameterWithName("page").description("페이지 번호 (0부터 시작)"), - parameterWithName("size").description("페이지 크기") - ), - responseFields( - fieldWithPath("errorCode").description("응답 코드"), - fieldWithPath("message").description("응답 메시지"), - fieldWithPath("result").description("피드 목록"), - fieldWithPath("result[].subscriptionId").description("구독 ID"), - fieldWithPath("result[].alias").description("구독 별칭"), - fieldWithPath("result[].summaryTitle").description("요약 제목"), - fieldWithPath("result[].summaryContent").description("요약 내용"), - fieldWithPath("result[].postUrl").description("연결 url"), - fieldWithPath("result[].timeAgo").description("피드 작성 후 경과 시간") - ))); + result.andExpect(status().isOk()).andDo(restDocsHandler.document( + queryParameters(parameterWithName("page").description("페이지 번호 (0부터 시작)"), + parameterWithName("size").description("페이지 크기")), + responseFields(fieldWithPath("errorCode").description("응답 코드"), + fieldWithPath("message").description("응답 메시지"), fieldWithPath("result").description("피드 목록"), + fieldWithPath("result[].subscriptionId").description("구독 ID"), + fieldWithPath("result[].alias").description("구독 별칭"), + fieldWithPath("result[].summaryTitle").description("요약 제목"), + fieldWithPath("result[].summaryContent").description("요약 내용"), + fieldWithPath("result[].postUrl").description("연결 url"), + fieldWithPath("result[].timeAgo").description("피드 작성 후 경과 시간")))); } + + @Test + void 홈_피드_목록을_조회합니다() throws Exception { + // given + + HomeFeedResponse response1 = new HomeFeedResponse(1L, "피드 내용", "작성자 이름", "2024-06-01T12:00:00", "fe", "1시간 전"); + HomeFeedResponse response2 = new HomeFeedResponse(2L, "또 다른 피드 내용", "다른 작성자", "2024-06-01T11:30:00", "fe2", + "2시간 전"); + HomeFeedResponse response3 = new HomeFeedResponse(3L, "세 번째 피드 내용", "세 번째 작성자", "2024-06-01T10:00:00", "fe3", + "3시간 전"); + + List responseList = List.of(response1, response2, response3); + + given(feedQueryService.findFeedsForHome(anyString(), anyString())).willReturn(responseList); + + // when + ResultActions result = mockMvc.perform(get("/api/feeds/home").header("X-User-Id", "test-user-id") + .header("X-Device-Secret", "test-device-secret")); + // then + result.andExpect(status().isOk()).andDo(restDocsHandler.document( + responseFields(fieldWithPath("errorCode").description("응답 코드"), + fieldWithPath("message").description("응답 메시지"), fieldWithPath("result").description("피드 목록"), + fieldWithPath("result[].subscriptionId").description("구독 ID"), + fieldWithPath("result[].alias").description("구독 별칭"), + fieldWithPath("result[].summaryTitle").description("요약 제목"), + fieldWithPath("result[].summaryContent").description("요약 내용"), + fieldWithPath("result[].postUrl").description("연결 url"), + fieldWithPath("result[].timeAgo").description("피드 작성 후 경과 시간")))); + } } \ No newline at end of file