From fd554a05e7ea490776d94698130db952cd15510b Mon Sep 17 00:00:00 2001 From: JiWoo Date: Tue, 9 Jan 2024 20:16:35 +0900 Subject: [PATCH] [Refactor] move feedback package (#109) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(Feedback): Feedback 페키지를 User 하부로 이동 * refactor(Content): Feedback의 본문 내용인 Content 를 값객체로 리팩토링 * test(Feedback): 피드백 도메인 테스트 작성 * test(FeedbackTest): 피드백 동등성 테스트 작성 * test(FeedbackTest): 접근제어자 제거 * test(FeedbackTest):clear_all_feedback 에서 사이즈를 확인하는 단언문을 hasSize를 사용하도록 변경 --- .../kuring/admin/common/dto/FeedbackDto.java | 2 +- .../common/dto/SaveFeedbackV1Request.java | 21 --- .../presentation/FeedbackControllerV1.java | 34 ---- .../business/FeedbackService.java | 4 +- .../common/dto/SaveFeedbackResponse.java | 2 +- .../kustacks/kuring/user/domain/Content.java | 31 ++++ .../{feedback => user}/domain/Feedback.java | 20 +-- .../domain/FeedbackRepository.java | 2 +- .../kuring/user/domain/Feedbacks.java | 1 - .../com/kustacks/kuring/user/domain/User.java | 1 - .../kuring/user/facade/UserCommandFacade.java | 2 +- .../kuring/user/facade/UserQueryFacade.java | 2 +- .../kuring/acceptance/FeedbackStep.java | 14 +- .../kuring/admin/domain/AdminTest.java | 1 + .../controller/FeedbackControllerTest.java | 163 ------------------ .../kuring/user/domain/FeedbackTest.java | 101 +++++++++++ .../kuring/user/domain/UserFeedbackTest.java | 38 ---- .../kustacks/kuring/user/domain/UserTest.java | 1 + 18 files changed, 155 insertions(+), 285 deletions(-) delete mode 100644 src/main/java/com/kustacks/kuring/feedback/common/dto/SaveFeedbackV1Request.java delete mode 100644 src/main/java/com/kustacks/kuring/feedback/presentation/FeedbackControllerV1.java rename src/main/java/com/kustacks/kuring/{feedback => user}/business/FeedbackService.java (94%) rename src/main/java/com/kustacks/kuring/{feedback => user}/common/dto/SaveFeedbackResponse.java (81%) create mode 100644 src/main/java/com/kustacks/kuring/user/domain/Content.java rename src/main/java/com/kustacks/kuring/{feedback => user}/domain/Feedback.java (67%) rename src/main/java/com/kustacks/kuring/{feedback => user}/domain/FeedbackRepository.java (75%) delete mode 100644 src/test/java/com/kustacks/kuring/controller/FeedbackControllerTest.java create mode 100644 src/test/java/com/kustacks/kuring/user/domain/FeedbackTest.java delete mode 100644 src/test/java/com/kustacks/kuring/user/domain/UserFeedbackTest.java diff --git a/src/main/java/com/kustacks/kuring/admin/common/dto/FeedbackDto.java b/src/main/java/com/kustacks/kuring/admin/common/dto/FeedbackDto.java index 74704d1e..e37a9d0c 100644 --- a/src/main/java/com/kustacks/kuring/admin/common/dto/FeedbackDto.java +++ b/src/main/java/com/kustacks/kuring/admin/common/dto/FeedbackDto.java @@ -1,6 +1,6 @@ package com.kustacks.kuring.admin.common.dto; -import com.kustacks.kuring.feedback.domain.Feedback; +import com.kustacks.kuring.user.domain.Feedback; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/kustacks/kuring/feedback/common/dto/SaveFeedbackV1Request.java b/src/main/java/com/kustacks/kuring/feedback/common/dto/SaveFeedbackV1Request.java deleted file mode 100644 index db1a348c..00000000 --- a/src/main/java/com/kustacks/kuring/feedback/common/dto/SaveFeedbackV1Request.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.kustacks.kuring.feedback.common.dto; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotBlank; - -@Getter -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class SaveFeedbackV1Request { - - @NotBlank - private String id; - - @NotBlank - private String content; -} - diff --git a/src/main/java/com/kustacks/kuring/feedback/presentation/FeedbackControllerV1.java b/src/main/java/com/kustacks/kuring/feedback/presentation/FeedbackControllerV1.java deleted file mode 100644 index a6678707..00000000 --- a/src/main/java/com/kustacks/kuring/feedback/presentation/FeedbackControllerV1.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.kustacks.kuring.feedback.presentation; - -import com.kustacks.kuring.feedback.business.FeedbackService; -import com.kustacks.kuring.feedback.common.dto.SaveFeedbackResponse; -import com.kustacks.kuring.feedback.common.dto.SaveFeedbackV1Request; -import com.kustacks.kuring.message.firebase.FirebaseService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -@RestController -@RequiredArgsConstructor -@RequestMapping(value = "/api/v1", produces = MediaType.APPLICATION_JSON_VALUE) -public class FeedbackControllerV1 { - - private final FirebaseService firebaseService; - private final FeedbackService feedbackService; - - @PostMapping("/feedback") - public SaveFeedbackResponse saveFeedback(@Valid @RequestBody SaveFeedbackV1Request request) { - String token = request.getId(); - String content = request.getContent(); - - firebaseService.validationToken(token); - feedbackService.saveFeedback(token, content); - - return new SaveFeedbackResponse(); - } -} diff --git a/src/main/java/com/kustacks/kuring/feedback/business/FeedbackService.java b/src/main/java/com/kustacks/kuring/user/business/FeedbackService.java similarity index 94% rename from src/main/java/com/kustacks/kuring/feedback/business/FeedbackService.java rename to src/main/java/com/kustacks/kuring/user/business/FeedbackService.java index 6646a7bb..d8a9eb98 100644 --- a/src/main/java/com/kustacks/kuring/feedback/business/FeedbackService.java +++ b/src/main/java/com/kustacks/kuring/user/business/FeedbackService.java @@ -1,9 +1,9 @@ -package com.kustacks.kuring.feedback.business; +package com.kustacks.kuring.user.business; import com.kustacks.kuring.admin.common.dto.FeedbackDto; import com.kustacks.kuring.common.exception.code.ErrorCode; import com.kustacks.kuring.common.exception.NotFoundException; -import com.kustacks.kuring.feedback.domain.FeedbackRepository; +import com.kustacks.kuring.user.domain.FeedbackRepository; import com.kustacks.kuring.message.firebase.FirebaseService; import com.kustacks.kuring.message.firebase.ServerProperties; import com.kustacks.kuring.user.domain.User; diff --git a/src/main/java/com/kustacks/kuring/feedback/common/dto/SaveFeedbackResponse.java b/src/main/java/com/kustacks/kuring/user/common/dto/SaveFeedbackResponse.java similarity index 81% rename from src/main/java/com/kustacks/kuring/feedback/common/dto/SaveFeedbackResponse.java rename to src/main/java/com/kustacks/kuring/user/common/dto/SaveFeedbackResponse.java index 96cdc84b..b61db4c0 100644 --- a/src/main/java/com/kustacks/kuring/feedback/common/dto/SaveFeedbackResponse.java +++ b/src/main/java/com/kustacks/kuring/user/common/dto/SaveFeedbackResponse.java @@ -1,4 +1,4 @@ -package com.kustacks.kuring.feedback.common.dto; +package com.kustacks.kuring.user.common.dto; import com.kustacks.kuring.common.dto.ResponseDto; import lombok.Getter; diff --git a/src/main/java/com/kustacks/kuring/user/domain/Content.java b/src/main/java/com/kustacks/kuring/user/domain/Content.java new file mode 100644 index 00000000..9a07b4ce --- /dev/null +++ b/src/main/java/com/kustacks/kuring/user/domain/Content.java @@ -0,0 +1,31 @@ +package com.kustacks.kuring.user.domain; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +@Embeddable +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Content { + + private static final int MAX_LENGTH = 256; + + @Column(name = "content", length = 256, nullable = false) + private String value; + + public Content(String content) { + validate(content); + this.value = content; + } + + public String getValue() { + return value; + } + + private void validate(String content) { + if (content.length() > MAX_LENGTH) throw new IllegalArgumentException("본문 내용은 " + MAX_LENGTH + "자 이하여야 합니다"); + if (content.isBlank()) throw new IllegalArgumentException("본문은 공백일 수 없습니다"); + } +} diff --git a/src/main/java/com/kustacks/kuring/feedback/domain/Feedback.java b/src/main/java/com/kustacks/kuring/user/domain/Feedback.java similarity index 67% rename from src/main/java/com/kustacks/kuring/feedback/domain/Feedback.java rename to src/main/java/com/kustacks/kuring/user/domain/Feedback.java index d796b7c6..159cfa0e 100644 --- a/src/main/java/com/kustacks/kuring/feedback/domain/Feedback.java +++ b/src/main/java/com/kustacks/kuring/user/domain/Feedback.java @@ -1,19 +1,11 @@ -package com.kustacks.kuring.feedback.domain; +package com.kustacks.kuring.user.domain; import com.kustacks.kuring.common.domain.BaseTimeEntity; -import com.kustacks.kuring.user.domain.User; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; +import javax.persistence.*; import java.util.Objects; @Entity @@ -26,20 +18,20 @@ public class Feedback extends BaseTimeEntity { @Column(name = "id", unique = true, nullable = false) private Long id; - @Column(name = "content", length = 256, nullable = false) - private String content; + @Embedded + private Content content; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; public Feedback(String content, User user) { - this.content = content; + this.content = new Content(content); this.user = user; } public String getContent() { - return content; + return content.getValue(); } public Long getUserId() { diff --git a/src/main/java/com/kustacks/kuring/feedback/domain/FeedbackRepository.java b/src/main/java/com/kustacks/kuring/user/domain/FeedbackRepository.java similarity index 75% rename from src/main/java/com/kustacks/kuring/feedback/domain/FeedbackRepository.java rename to src/main/java/com/kustacks/kuring/user/domain/FeedbackRepository.java index ea60223f..c7f9a4cc 100644 --- a/src/main/java/com/kustacks/kuring/feedback/domain/FeedbackRepository.java +++ b/src/main/java/com/kustacks/kuring/user/domain/FeedbackRepository.java @@ -1,4 +1,4 @@ -package com.kustacks.kuring.feedback.domain; +package com.kustacks.kuring.user.domain; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/kustacks/kuring/user/domain/Feedbacks.java b/src/main/java/com/kustacks/kuring/user/domain/Feedbacks.java index 33a77e75..3cbf0e0c 100644 --- a/src/main/java/com/kustacks/kuring/user/domain/Feedbacks.java +++ b/src/main/java/com/kustacks/kuring/user/domain/Feedbacks.java @@ -1,6 +1,5 @@ package com.kustacks.kuring.user.domain; -import com.kustacks.kuring.feedback.domain.Feedback; import lombok.NoArgsConstructor; import javax.persistence.CascadeType; diff --git a/src/main/java/com/kustacks/kuring/user/domain/User.java b/src/main/java/com/kustacks/kuring/user/domain/User.java index 01c2d25b..788e39fe 100644 --- a/src/main/java/com/kustacks/kuring/user/domain/User.java +++ b/src/main/java/com/kustacks/kuring/user/domain/User.java @@ -1,7 +1,6 @@ package com.kustacks.kuring.user.domain; import com.kustacks.kuring.notice.domain.CategoryName; -import com.kustacks.kuring.feedback.domain.Feedback; import com.kustacks.kuring.notice.domain.DepartmentName; import lombok.AccessLevel; import lombok.Getter; diff --git a/src/main/java/com/kustacks/kuring/user/facade/UserCommandFacade.java b/src/main/java/com/kustacks/kuring/user/facade/UserCommandFacade.java index a8cf20b7..0f8528a0 100644 --- a/src/main/java/com/kustacks/kuring/user/facade/UserCommandFacade.java +++ b/src/main/java/com/kustacks/kuring/user/facade/UserCommandFacade.java @@ -1,6 +1,6 @@ package com.kustacks.kuring.user.facade; -import com.kustacks.kuring.feedback.business.FeedbackService; +import com.kustacks.kuring.user.business.FeedbackService; import com.kustacks.kuring.message.firebase.FirebaseService; import com.kustacks.kuring.message.firebase.exception.FirebaseSubscribeException; import com.kustacks.kuring.message.firebase.exception.FirebaseUnSubscribeException; diff --git a/src/main/java/com/kustacks/kuring/user/facade/UserQueryFacade.java b/src/main/java/com/kustacks/kuring/user/facade/UserQueryFacade.java index 320f58d6..e2a520bf 100644 --- a/src/main/java/com/kustacks/kuring/user/facade/UserQueryFacade.java +++ b/src/main/java/com/kustacks/kuring/user/facade/UserQueryFacade.java @@ -1,7 +1,7 @@ package com.kustacks.kuring.user.facade; import com.kustacks.kuring.admin.common.dto.FeedbackDto; -import com.kustacks.kuring.feedback.business.FeedbackService; +import com.kustacks.kuring.user.business.FeedbackService; import com.kustacks.kuring.notice.domain.CategoryName; import com.kustacks.kuring.message.firebase.FirebaseService; import com.kustacks.kuring.notice.common.dto.CategoryNameDto; diff --git a/src/test/java/com/kustacks/kuring/acceptance/FeedbackStep.java b/src/test/java/com/kustacks/kuring/acceptance/FeedbackStep.java index 806ac706..16c68407 100644 --- a/src/test/java/com/kustacks/kuring/acceptance/FeedbackStep.java +++ b/src/test/java/com/kustacks/kuring/acceptance/FeedbackStep.java @@ -1,9 +1,10 @@ package com.kustacks.kuring.acceptance; -import com.kustacks.kuring.feedback.common.dto.SaveFeedbackV1Request; +import com.kustacks.kuring.user.common.dto.SaveFeedbackRequest; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import static org.assertj.core.api.Assertions.assertThat; @@ -13,18 +14,19 @@ public class FeedbackStep { public static void 피드백_요청_응답_확인(ExtractableResponse response) { assertAll( - () -> assertThat(response.jsonPath().getBoolean("isSuccess")).isTrue(), - () -> assertThat(response.jsonPath().getString("resultMsg")).isEqualTo("성공"), - () -> assertThat(response.jsonPath().getInt("resultCode")).isEqualTo(201) + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(response.jsonPath().getInt("code")).isEqualTo(200), + () -> assertThat(response.jsonPath().getString("message")).isEqualTo("피드백 저장에 성공하였습니다") ); } public static ExtractableResponse 피드백_요청(String fcmToken, String feedback) { return RestAssured .given().log().all() + .header("User-Token", fcmToken) .contentType(MediaType.APPLICATION_JSON_VALUE) - .body(new SaveFeedbackV1Request(fcmToken, feedback)) - .when().post("/api/v1/feedback") + .body(new SaveFeedbackRequest(feedback)) + .when().post("/api/v2/users/feedbacks") .then().log().all() .extract(); } diff --git a/src/test/java/com/kustacks/kuring/admin/domain/AdminTest.java b/src/test/java/com/kustacks/kuring/admin/domain/AdminTest.java index b22e4168..e403cfb5 100644 --- a/src/test/java/com/kustacks/kuring/admin/domain/AdminTest.java +++ b/src/test/java/com/kustacks/kuring/admin/domain/AdminTest.java @@ -6,6 +6,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; +@DisplayName("도메인 : Admin") class AdminTest { @DisplayName("Admin 생성 테스트") diff --git a/src/test/java/com/kustacks/kuring/controller/FeedbackControllerTest.java b/src/test/java/com/kustacks/kuring/controller/FeedbackControllerTest.java deleted file mode 100644 index 3c096121..00000000 --- a/src/test/java/com/kustacks/kuring/controller/FeedbackControllerTest.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.kustacks.kuring.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.firebase.messaging.FirebaseMessagingException; -import com.kustacks.kuring.auth.AuthConfig; -import com.kustacks.kuring.common.exception.code.ErrorCode; -import com.kustacks.kuring.feedback.business.FeedbackService; -import com.kustacks.kuring.feedback.common.dto.SaveFeedbackV1Request; -import com.kustacks.kuring.feedback.presentation.FeedbackControllerV1; -import com.kustacks.kuring.message.firebase.FirebaseService; -import com.kustacks.kuring.message.firebase.exception.FirebaseInvalidTokenException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.FilterType; -import org.springframework.http.MediaType; -import org.springframework.restdocs.RestDocumentationContextProvider; -import org.springframework.restdocs.RestDocumentationExtension; -import org.springframework.restdocs.payload.JsonFieldType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import static com.kustacks.kuring.ApiDocumentUtils.getDocumentRequest; -import static com.kustacks.kuring.ApiDocumentUtils.getDocumentResponse; -import static org.mockito.Mockito.doThrow; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@ExtendWith({RestDocumentationExtension.class}) -@WebMvcTest(controllers = FeedbackControllerV1.class, excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = AuthConfig.class)}) -public class FeedbackControllerTest { - - @Autowired - private WebApplicationContext webApplicationContext; - - @Autowired - private ObjectMapper objectMapper; - - private MockMvc mockMvc; - - @MockBean - private FirebaseService firebaseService; - - @MockBean - private FeedbackService feedbackService; - - @Mock - private FirebaseMessagingException firebaseMessagingException; - - @BeforeEach - public void setUp(RestDocumentationContextProvider restDocumentation) { - - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext) - .apply(documentationConfiguration(restDocumentation)) - .build(); - } - - @DisplayName("피드백 저장 API - 성공") - @Test - public void saveFeedbackSuccessTest() throws Exception { - - String token = "TEST_TOKEN"; - String content = "테스트 피드백입니다."; - - SaveFeedbackV1Request requestDTO = new SaveFeedbackV1Request(token, content); - - String requestBody = objectMapper.writeValueAsString(requestDTO); - - // given - /* - firebaseService.verifyToken 및 feedbackService.insertFeedback은 성공 시 void 리턴. - */ - - // when - ResultActions result = mockMvc.perform(post("/api/v1/feedback") - .accept(MediaType.APPLICATION_JSON) - .contentType(MediaType.APPLICATION_JSON) - .content(requestBody)); - - // then - result.andExpect(status().isOk()) - .andExpect(jsonPath("isSuccess").value(true)) - .andExpect(jsonPath("resultMsg").value("성공")) - .andExpect(jsonPath("resultCode").value(201)) - .andDo(document("save-feedback-success", - getDocumentRequest(), - getDocumentResponse(), - requestFields( - fieldWithPath("id").type(JsonFieldType.STRING).description("FCM 토큰"), - fieldWithPath("content").type(JsonFieldType.STRING).description("피드백 내용. 5자 이상 256자 이하") - ), - responseFields( - fieldWithPath("isSuccess").type(JsonFieldType.BOOLEAN).description("성공 여부"), - fieldWithPath("resultMsg").type(JsonFieldType.STRING).description("결과 메세지"), - fieldWithPath("resultCode").type(JsonFieldType.NUMBER).description("결과 코드") - )) - ); - } - - @DisplayName("피드백 저장 API - 실패 - 유효하지 않은 토큰") - @Test - public void saveFeedbackFailByInvalidTokenTest() throws Exception { - // given - String token = "INVALID_TOKEN"; - String content = "테스트 피드백입니다."; - String requestBody = objectMapper.writeValueAsString(new SaveFeedbackV1Request(token, content)); - - doThrow(new FirebaseInvalidTokenException()).when(firebaseService).validationToken(token); - - // when - ResultActions result = mockMvc.perform(post("/api/v1/feedback") - .accept(MediaType.APPLICATION_JSON) - .contentType(MediaType.APPLICATION_JSON) - .content(requestBody)); - - // then - result.andExpect(status().isUnauthorized()) - .andExpect(jsonPath("isSuccess").value(false)) - .andExpect(jsonPath("resultMsg").value(ErrorCode.API_FB_INVALID_TOKEN.getMessage())) - .andExpect(jsonPath("resultCode").value(ErrorCode.API_FB_INVALID_TOKEN.getHttpStatus().value())) - .andDo(document("save-feedback-fail-invalid-token", - getDocumentRequest(), - getDocumentResponse()) - ); - } - - @DisplayName("피드백 저장 API - 실패 - 유효하지 않은 피드백 길이") - @Test - public void saveFeedbackFailByInvalidContentLength() throws Exception { - // given - String token = "TEST_TOKEN"; - String content = ""; - String requestBody = objectMapper.writeValueAsString(new SaveFeedbackV1Request(token, content)); - - // when - ResultActions result = mockMvc.perform(post("/api/v1/feedback") - .accept(MediaType.APPLICATION_JSON) - .contentType(MediaType.APPLICATION_JSON) - .content(requestBody)); - - // then - result.andExpect(status().isBadRequest()) - .andExpect(jsonPath("isSuccess").value(false)) - .andExpect(jsonPath("resultMsg").value(ErrorCode.API_MISSING_PARAM.getMessage())) - .andExpect(jsonPath("resultCode").value(ErrorCode.API_MISSING_PARAM.getHttpStatus().value())) - .andDo(document("save-feedback-fail-invalid-content-length", - getDocumentRequest(), - getDocumentResponse()) - ); - } -} diff --git a/src/test/java/com/kustacks/kuring/user/domain/FeedbackTest.java b/src/test/java/com/kustacks/kuring/user/domain/FeedbackTest.java new file mode 100644 index 00000000..6941575f --- /dev/null +++ b/src/test/java/com/kustacks/kuring/user/domain/FeedbackTest.java @@ -0,0 +1,101 @@ +package com.kustacks.kuring.user.domain; + +import org.assertj.core.api.ThrowableAssert.ThrowingCallable; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.test.util.ReflectionTestUtils; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.*; + +@DisplayName("도메인 : Feedback") +class FeedbackTest { + + @DisplayName("피드백을 생성할 수 있다") + @Test + void create_feedback() { + // given + User user = new User("token"); + + // when, then + assertThatCode(() -> new Feedback("contents!", user)) + .doesNotThrowAnyException(); + } + + @DisplayName("피드백 동등성 확인") + @Test + void feedback_equals() { + // given + User user = new User("token"); + Feedback feedback1 = createFeedback(1, "contents1", user); + Feedback feedback2 = createFeedback(1, "contents2", user); + + // when, then + assertThat(feedback1).isEqualTo(feedback2); + } + + @DisplayName("피드백을 추가할 수 있다") + @Test + void add_feedback() { + // given + User user = new User("token"); + + // when + user.addFeedback("피드백1"); + user.addFeedback("피드백2"); + + // then + assertThat(user.getAllFeedback()).hasSize(2); + } + + @DisplayName("피드백을 모두 지울 수 있다") + @Test + void clear_all_feedback() { + // given + User user = new User("token"); + user.addFeedback("피드백1"); + user.addFeedback("피드백2"); + + // when + user.clearFeedbacks(); + + // then + assertThat(user.getAllFeedback()).hasSize(0); + } + + @DisplayName("256자 초과의 피드백은 예외를 발생시킨다") + @ParameterizedTest + @MethodSource("invalidLengthContentsInputProvider") + void invalid_length_feedback(String content, String errorMessage) { + // given + User user = new User("token"); + + // when + ThrowingCallable actual = () -> user.addFeedback(content); + + // then + assertThatThrownBy(actual) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(errorMessage); + } + + private static Stream invalidLengthContentsInputProvider() { + return Stream.of( + Arguments.of("https://www.google.com/search?q=%EC%95%88%EB%8dsfajaslkfjasdkfjkldsafjlsadkjf" + + "lksajfldkadsfajaslkfjasdkfjkldsafjlsadkjflksajfldkajlafkj;lkdjalkfjads;jfalksdfjlasjf;" + + "ljlfsaddsfajaslkfjasdkfjkldsafjlsadkjflksajfldkajlafkj;lkdjalkfjads;jfalksdfjlasjf;ljlf" + + "sadjlafkj;lkdjalkfjads", "본문 내용은 256자 이하여야 합니다"), + Arguments.of("", "본문은 공백일 수 없습니다") + ); + } + + private Feedback createFeedback(long id, String content, User user) { + Feedback feedback = new Feedback(content, user); + ReflectionTestUtils.setField(feedback, "id", id); + return feedback; + } +} diff --git a/src/test/java/com/kustacks/kuring/user/domain/UserFeedbackTest.java b/src/test/java/com/kustacks/kuring/user/domain/UserFeedbackTest.java deleted file mode 100644 index 72a5a6e9..00000000 --- a/src/test/java/com/kustacks/kuring/user/domain/UserFeedbackTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.kustacks.kuring.user.domain; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class UserFeedbackTest { - - @DisplayName("피드백을 추가할 수 있다") - @Test - public void add_feedback() { - // given - User user = new User("token"); - - // when - user.addFeedback("피드백1"); - user.addFeedback("피드백2"); - - // then - assertThat(user.getAllFeedback().size()).isEqualTo(2); - } - - @DisplayName("피드백을 모두 지울 수 있다") - @Test - public void clear_all_feedback() { - // given - User user = new User("token"); - user.addFeedback("피드백1"); - user.addFeedback("피드백2"); - - // when - user.clearFeedbacks(); - - // then - assertThat(user.getAllFeedback().size()).isEqualTo(0); - } -} diff --git a/src/test/java/com/kustacks/kuring/user/domain/UserTest.java b/src/test/java/com/kustacks/kuring/user/domain/UserTest.java index 3d693c83..d69fdc64 100644 --- a/src/test/java/com/kustacks/kuring/user/domain/UserTest.java +++ b/src/test/java/com/kustacks/kuring/user/domain/UserTest.java @@ -11,6 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; +@DisplayName("도메인 : User") class UserTest { @DisplayName("User 생성 테스트")