From b307405cb360989543688d5b13404c6b952939fb Mon Sep 17 00:00:00 2001 From: Junho Hwang <72647031+juno-junho@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:52:13 -0700 Subject: [PATCH] =?UTF-8?q?[SKRB-163]=20feat:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=20(#19)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/spaceclub/event/domain/Event.java | 16 +- .../user/controller/UserController.java | 1 + .../user/controller/UserControllerTest.java | 139 ++++++++++++++++++ 3 files changed, 150 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/spaceclub/user/controller/UserControllerTest.java diff --git a/src/main/java/com/spaceclub/event/domain/Event.java b/src/main/java/com/spaceclub/event/domain/Event.java index bf1ad5d8..2ac0e861 100644 --- a/src/main/java/com/spaceclub/event/domain/Event.java +++ b/src/main/java/com/spaceclub/event/domain/Event.java @@ -43,12 +43,16 @@ public class Event extends BaseTimeEntity { private Long clubId; @Builder - private Event(Category category, - EventInfo eventInfo, - BankInfo bankInfo, - TicketInfo ticketInfo, - FormInfo formInfo, - Long clubId) { + private Event( + Long id, + Category category, + EventInfo eventInfo, + BankInfo bankInfo, + TicketInfo ticketInfo, + FormInfo formInfo, + Long clubId + ) { + this.id = id; this.category = category; this.eventInfo = eventInfo; this.bankInfo = bankInfo; diff --git a/src/main/java/com/spaceclub/user/controller/UserController.java b/src/main/java/com/spaceclub/user/controller/UserController.java index 6c9537c4..4a23c109 100644 --- a/src/main/java/com/spaceclub/user/controller/UserController.java +++ b/src/main/java/com/spaceclub/user/controller/UserController.java @@ -24,6 +24,7 @@ public class UserController { @GetMapping("/{userId}/events") public EventPageResponse getAllEvents(@PathVariable Long userId, Pageable pageable) { Page eventPages = userService.findAllEventPages(userId, pageable); + System.out.println(eventPages); List eventResponses = eventPages.getContent() .stream() .map(EventResponse::from) diff --git a/src/test/java/com/spaceclub/user/controller/UserControllerTest.java b/src/test/java/com/spaceclub/user/controller/UserControllerTest.java new file mode 100644 index 00000000..0c50d68b --- /dev/null +++ b/src/test/java/com/spaceclub/user/controller/UserControllerTest.java @@ -0,0 +1,139 @@ +package com.spaceclub.user.controller; + +import com.spaceclub.SpaceClubCustomDisplayNameGenerator; +import com.spaceclub.event.domain.Category; +import com.spaceclub.event.domain.Event; +import com.spaceclub.event.domain.EventInfo; +import com.spaceclub.user.service.UserService; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; + +import java.time.LocalDate; +import java.util.List; + +import static org.mockito.BDDMockito.given; +import static org.springframework.data.domain.Sort.Direction.DESC; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.payload.JsonFieldType.ARRAY; +import static org.springframework.restdocs.payload.JsonFieldType.BOOLEAN; +import static org.springframework.restdocs.payload.JsonFieldType.NUMBER; +import static org.springframework.restdocs.payload.JsonFieldType.OBJECT; +import static org.springframework.restdocs.payload.JsonFieldType.STRING; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +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.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(UserController.class) +@AutoConfigureRestDocs +@DisplayNameGeneration(SpaceClubCustomDisplayNameGenerator.ReplaceUnderscores.class) +class UserControllerTest { + + @Autowired + private MockMvc mvc; + + @MockBean + private UserService userService; + + @Test + @WithMockUser + void 유저의_모든_이벤트_조회에_성공한다() throws Exception { + // given + final Long userId = 1L; + List events = List.of( + Event.builder() + .id(1L) + .category(Category.SHOW) + .eventInfo( + EventInfo.builder() + .title("title1") + .content("content1") + .startDate(LocalDate.of(2023, 9, 20)) + .location("location1") + .capacity(10).build() + ) + .clubId(1L).build(), + Event.builder() + .id(2L) + .category(Category.SHOW) + .eventInfo( + EventInfo.builder() + .title("title2") + .content("content2") + .startDate(LocalDate.of(2023, 10, 30)) + .location("location2") + .capacity(50).build() + ) + .clubId(2L).build(), + Event.builder() + .id(3L) + .category(Category.SHOW) + .eventInfo( + EventInfo.builder() + .title("title3") + .content("content3") + .startDate(LocalDate.of(2023, 11, 30)) + .location("location3").capacity(100).build() + ) + .clubId(3L).build() + ); + PageRequest pageRequest = PageRequest.of(1, 10, Sort.by(DESC, "startDate")); + Page eventPages = new PageImpl<>(events); + given(userService.findAllEventPages(userId, pageRequest)).willReturn(eventPages); + + // when, then + mvc.perform(get("/api/v1/users/{userId}/events", userId) + .param("page", "1") + .param("size", "10") + .param("sort", "startDate,desc") + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.size()").value(events.size())) + .andExpect(jsonPath("$.pageData.first").value(true)) + .andExpect(jsonPath("$.pageData.last").value(true)) + .andExpect(jsonPath("$.pageData.pageNumber").value(0)) + .andExpect(jsonPath("$.pageData.size").value(3)) + .andExpect(jsonPath("$.pageData.totalPages").value(1)) + .andExpect(jsonPath("$.pageData.totalElements").value(events.size())) + .andDo( + document("user/getAllEvents", + queryParameters( + parameterWithName("page").description("페이지"), + parameterWithName("size").description("페이지 내 개수"), + parameterWithName("sort").description("정렬 방법((ex) id,desc)") + ), + pathParameters( + parameterWithName("userId").description("유저 아이디")), + responseFields( + fieldWithPath("data").type(ARRAY).description("페이지 내 이벤트 정보"), + fieldWithPath("data[].id").type(NUMBER).description("이벤트 아이디"), + fieldWithPath("data[].title").type(STRING).description("이벤트 제목"), + fieldWithPath("data[].location").type(STRING).description("이벤트 위치"), + fieldWithPath("data[].host").type(STRING).description("이벤트 주최자"), + fieldWithPath("pageData").type(OBJECT).description("페이지 정보"), + fieldWithPath("pageData.first").type(BOOLEAN).description("첫 페이지 여부"), + fieldWithPath("pageData.last").type(BOOLEAN).description("마지막 페이지 여부"), + fieldWithPath("pageData.pageNumber").type(NUMBER).description("현재 페이지 번호"), + fieldWithPath("pageData.size").type(NUMBER).description("페이지 내 개수"), + fieldWithPath("pageData.totalPages").type(NUMBER).description("총 페이지 개수"), + fieldWithPath("pageData.totalElements").type(NUMBER).description("총 이벤트 개수") + ) + ) + ); + } + +}