From 6dfe5f531b14068c4fdc26d01e988bd057b3f1a3 Mon Sep 17 00:00:00 2001 From: MangKyu Date: Sat, 18 Feb 2023 16:51:08 +0900 Subject: [PATCH] Divide AnswerController independently --- .../app/answer/constants/AnswerConstants.java | 11 -- .../controller/AddAnswerController.java | 25 +++ .../{dto => controller}/AddAnswerRequest.java | 5 +- .../answer/controller/AnswerController.java | 44 ----- .../controller/DeleteAnswerController.java | 23 +++ .../controller/GetAnswerController.java | 21 +++ .../GetAnswerResponse.java | 2 +- .../controller/UpdateAnswerController.java | 25 +++ .../interview/app/answer/entity/Answer.java | 3 +- .../app/answer/service/AnswerService.java | 4 +- .../quiz/controller/WebQuizController.java | 2 +- .../app/quiz/converter/QuizDtoConverter.java | 5 +- .../quiz/repository/QuizRepositoryImpl.java | 4 +- .../controller/AddAnswerControllerTest.java | 90 +++++++++ .../controller/AnswerControllerTest.java | 178 ------------------ .../DeleteAnswerControllerTest.java | 38 ++++ .../controller/GetAnswerControllerTest.java | 53 ++++++ .../UpdateAnswerControllerTest.java | 90 +++++++++ .../app/answer/service/AnswerServiceTest.java | 4 +- .../quiz/converter/QuizDtoConverterTest.java | 4 +- 20 files changed, 380 insertions(+), 251 deletions(-) delete mode 100644 src/main/java/com/mangkyu/employment/interview/app/answer/constants/AnswerConstants.java create mode 100644 src/main/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerController.java rename src/main/java/com/mangkyu/employment/interview/app/answer/{dto => controller}/AddAnswerRequest.java (74%) delete mode 100644 src/main/java/com/mangkyu/employment/interview/app/answer/controller/AnswerController.java create mode 100644 src/main/java/com/mangkyu/employment/interview/app/answer/controller/DeleteAnswerController.java create mode 100644 src/main/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerController.java rename src/main/java/com/mangkyu/employment/interview/app/answer/{dto => controller}/GetAnswerResponse.java (83%) create mode 100644 src/main/java/com/mangkyu/employment/interview/app/answer/controller/UpdateAnswerController.java create mode 100644 src/test/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerControllerTest.java delete mode 100644 src/test/java/com/mangkyu/employment/interview/app/answer/controller/AnswerControllerTest.java create mode 100644 src/test/java/com/mangkyu/employment/interview/app/answer/controller/DeleteAnswerControllerTest.java create mode 100644 src/test/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerControllerTest.java create mode 100644 src/test/java/com/mangkyu/employment/interview/app/answer/controller/UpdateAnswerControllerTest.java diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/constants/AnswerConstants.java b/src/main/java/com/mangkyu/employment/interview/app/answer/constants/AnswerConstants.java deleted file mode 100644 index 9c5443a..0000000 --- a/src/main/java/com/mangkyu/employment/interview/app/answer/constants/AnswerConstants.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.mangkyu.employment.interview.app.answer.constants; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class AnswerConstants { - - public static final int MAX_ANSWER_SIZE = 5000; - -} \ No newline at end of file diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerController.java b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerController.java new file mode 100644 index 0000000..9e69c5e --- /dev/null +++ b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerController.java @@ -0,0 +1,25 @@ +package com.mangkyu.employment.interview.app.answer.controller; + +import com.mangkyu.employment.interview.app.answer.service.AnswerService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +public class AddAnswerController { + + private final AnswerService answerService; + + @PostMapping("/answers") + public ResponseEntity postAnswer(@RequestBody @Valid final AddAnswerRequest addAnswerRequest) { + answerService.addAnswer(addAnswerRequest); + return ResponseEntity.noContent() + .build(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/dto/AddAnswerRequest.java b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerRequest.java similarity index 74% rename from src/main/java/com/mangkyu/employment/interview/app/answer/dto/AddAnswerRequest.java rename to src/main/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerRequest.java index 0f30d5a..48b8936 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/answer/dto/AddAnswerRequest.java +++ b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerRequest.java @@ -1,6 +1,5 @@ -package com.mangkyu.employment.interview.app.answer.dto; +package com.mangkyu.employment.interview.app.answer.controller; -import com.mangkyu.employment.interview.app.answer.constants.AnswerConstants; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -22,7 +21,7 @@ public class AddAnswerRequest { private final String resourceId = String.valueOf(UUID.randomUUID()); @NotBlank - @Size(max = AnswerConstants.MAX_ANSWER_SIZE) + @Size(max = 5000) private final String description; } diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/controller/AnswerController.java b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/AnswerController.java deleted file mode 100644 index 7f88fc7..0000000 --- a/src/main/java/com/mangkyu/employment/interview/app/answer/controller/AnswerController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.mangkyu.employment.interview.app.answer.controller; - -import com.mangkyu.employment.interview.app.answer.dto.AddAnswerRequest; -import com.mangkyu.employment.interview.app.answer.dto.GetAnswerResponse; -import com.mangkyu.employment.interview.app.answer.service.AnswerService; -import com.mangkyu.employment.interview.erros.exception.RestApiException; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -@RestController -@RequiredArgsConstructor -public class AnswerController { - - private final AnswerService answerService; - - @PutMapping("/answers") - public ResponseEntity putAnswer(@RequestBody @Valid final AddAnswerRequest addAnswerRequest) throws RestApiException { - answerService.addAnswer(addAnswerRequest); - return ResponseEntity.noContent() - .build(); - } - - @PostMapping("/answers") - public ResponseEntity postAnswer(@RequestBody @Valid final AddAnswerRequest addAnswerRequest) throws RestApiException { - answerService.addAnswer(addAnswerRequest); - return ResponseEntity.noContent() - .build(); - } - - @GetMapping("/answers/{resourceId}") - public ResponseEntity getAnswer(@PathVariable final String resourceId) throws RestApiException { - return ResponseEntity.ok(answerService.getAnswer(resourceId)); - } - - @DeleteMapping("/answers/{resourceId}") - public ResponseEntity deleteAnswer(@PathVariable final String resourceId) throws RestApiException { - answerService.deleteAnswer(resourceId); - - return ResponseEntity.noContent().build(); - } -} \ No newline at end of file diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/controller/DeleteAnswerController.java b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/DeleteAnswerController.java new file mode 100644 index 0000000..20b7bba --- /dev/null +++ b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/DeleteAnswerController.java @@ -0,0 +1,23 @@ +package com.mangkyu.employment.interview.app.answer.controller; + +import com.mangkyu.employment.interview.app.answer.service.AnswerService; +import com.mangkyu.employment.interview.erros.exception.RestApiException; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class DeleteAnswerController { + + private final AnswerService answerService; + + @DeleteMapping("/answers/{resourceId}") + public ResponseEntity deleteAnswer(@PathVariable final String resourceId) { + answerService.deleteAnswer(resourceId); + + return ResponseEntity.noContent().build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerController.java b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerController.java new file mode 100644 index 0000000..3b526bb --- /dev/null +++ b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerController.java @@ -0,0 +1,21 @@ +package com.mangkyu.employment.interview.app.answer.controller; + +import com.mangkyu.employment.interview.app.answer.service.AnswerService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class GetAnswerController { + + private final AnswerService answerService; + + @GetMapping("/answers/{resourceId}") + public ResponseEntity getAnswer(@PathVariable final String resourceId) { + return ResponseEntity.ok(answerService.getAnswer(resourceId)); + } + +} \ No newline at end of file diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/dto/GetAnswerResponse.java b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerResponse.java similarity index 83% rename from src/main/java/com/mangkyu/employment/interview/app/answer/dto/GetAnswerResponse.java rename to src/main/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerResponse.java index 7da6324..76cf523 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/answer/dto/GetAnswerResponse.java +++ b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerResponse.java @@ -1,4 +1,4 @@ -package com.mangkyu.employment.interview.app.answer.dto; +package com.mangkyu.employment.interview.app.answer.controller; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/controller/UpdateAnswerController.java b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/UpdateAnswerController.java new file mode 100644 index 0000000..348876b --- /dev/null +++ b/src/main/java/com/mangkyu/employment/interview/app/answer/controller/UpdateAnswerController.java @@ -0,0 +1,25 @@ +package com.mangkyu.employment.interview.app.answer.controller; + +import com.mangkyu.employment.interview.app.answer.service.AnswerService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +public class UpdateAnswerController { + + private final AnswerService answerService; + + @PutMapping("/answers") + public ResponseEntity putAnswer(@RequestBody @Valid final AddAnswerRequest addAnswerRequest) { + answerService.addAnswer(addAnswerRequest); + return ResponseEntity.noContent() + .build(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/entity/Answer.java b/src/main/java/com/mangkyu/employment/interview/app/answer/entity/Answer.java index 85820df..6e746ed 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/answer/entity/Answer.java +++ b/src/main/java/com/mangkyu/employment/interview/app/answer/entity/Answer.java @@ -1,6 +1,5 @@ package com.mangkyu.employment.interview.app.answer.entity; -import com.mangkyu.employment.interview.app.answer.constants.AnswerConstants; import com.mangkyu.employment.interview.app.common.entity.BaseEntity; import com.mangkyu.employment.interview.app.quiz.entity.Quiz; import lombok.*; @@ -23,7 +22,7 @@ public class Answer extends BaseEntity { @Setter @Lob - @Column(length = AnswerConstants.MAX_ANSWER_SIZE) + @Column(length = 5000) private String description; } \ No newline at end of file diff --git a/src/main/java/com/mangkyu/employment/interview/app/answer/service/AnswerService.java b/src/main/java/com/mangkyu/employment/interview/app/answer/service/AnswerService.java index 9d72ba5..cbebd39 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/answer/service/AnswerService.java +++ b/src/main/java/com/mangkyu/employment/interview/app/answer/service/AnswerService.java @@ -1,7 +1,7 @@ package com.mangkyu.employment.interview.app.answer.service; -import com.mangkyu.employment.interview.app.answer.dto.AddAnswerRequest; -import com.mangkyu.employment.interview.app.answer.dto.GetAnswerResponse; +import com.mangkyu.employment.interview.app.answer.controller.AddAnswerRequest; +import com.mangkyu.employment.interview.app.answer.controller.GetAnswerResponse; import com.mangkyu.employment.interview.app.answer.entity.Answer; import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository; import com.mangkyu.employment.interview.erros.errorcode.CommonErrorCode; diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/controller/WebQuizController.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/controller/WebQuizController.java index 544c0d5..d265fa5 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/controller/WebQuizController.java +++ b/src/main/java/com/mangkyu/employment/interview/app/quiz/controller/WebQuizController.java @@ -1,6 +1,6 @@ package com.mangkyu.employment.interview.app.quiz.controller; -import com.mangkyu.employment.interview.app.answer.dto.GetAnswerResponse; +import com.mangkyu.employment.interview.app.answer.controller.GetAnswerResponse; import com.mangkyu.employment.interview.app.answer.service.AnswerService; import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponse; import com.mangkyu.employment.interview.app.quiz.service.QuizService; diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverter.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverter.java index d8bd14e..0da03a2 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverter.java +++ b/src/main/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverter.java @@ -1,7 +1,7 @@ package com.mangkyu.employment.interview.app.quiz.converter; -import com.mangkyu.employment.interview.app.answer.dto.AddAnswerRequest; -import com.mangkyu.employment.interview.app.answer.dto.GetAnswerResponse; +import com.mangkyu.employment.interview.app.answer.controller.AddAnswerRequest; +import com.mangkyu.employment.interview.app.answer.controller.GetAnswerResponse; import com.mangkyu.employment.interview.app.answer.entity.Answer; import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponse; import com.mangkyu.employment.interview.app.quiz.entity.Quiz; @@ -9,7 +9,6 @@ import com.mangkyu.employment.interview.enums.common.EnumMapperValue; import com.mangkyu.employment.interview.enums.value.QuizLevel; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.commons.lang3.StringUtils; import java.sql.Timestamp; import java.util.List; diff --git a/src/main/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryImpl.java b/src/main/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryImpl.java index 54df27b..fd35208 100644 --- a/src/main/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryImpl.java +++ b/src/main/java/com/mangkyu/employment/interview/app/quiz/repository/QuizRepositoryImpl.java @@ -35,7 +35,7 @@ public class QuizRepositoryImpl implements QuizRepositoryCustom { .where(quizLevelsIn(qQuiz, condition.getLevels())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) - .where(qQuiz.answer.isNotNull()) +// .where(qQuiz.answer.isNull()) .where(qQuiz.isEnable.isTrue()) .fetch(); @@ -43,7 +43,7 @@ public class QuizRepositoryImpl implements QuizRepositoryCustom { .where(titleLike(qQuiz, condition.getQuery())) .where(quizCategoriesIn(qQuiz, condition.getCategories())) .where(quizLevelsIn(qQuiz, condition.getLevels())) - .where(qQuiz.answer.isNotNull()) +// .where(qQuiz.answer.isNull()) .where(qQuiz.isEnable.isTrue()) .stream().count(); diff --git a/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerControllerTest.java new file mode 100644 index 0000000..be0cfb1 --- /dev/null +++ b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AddAnswerControllerTest.java @@ -0,0 +1,90 @@ +package com.mangkyu.employment.interview.app.answer.controller; + +import com.google.gson.Gson; +import com.mangkyu.employment.interview.app.answer.service.AnswerService; +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.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import java.util.UUID; +import java.util.stream.Stream; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest +class AddAnswerControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private AnswerService answerService; + + @ParameterizedTest + @MethodSource("provideParameters") + public void addAnswerFail_InvalidParameter(final String quizResourceId, final String desc) throws Exception { + // given + final String url = "/answers"; + + final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() + .quizResourceId(quizResourceId) + .description(desc) + .build(); + + // when + final ResultActions result = mockMvc.perform( + MockMvcRequestBuilders.post(url) + .content(new Gson().toJson(addAnswerRequest)) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect(status().isBadRequest()); + } + + @Test + public void addAnswerSuccess() throws Exception { + // given + final String url = "/answers"; + + final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() + .quizResourceId(UUID.randomUUID().toString()) + .description("desc") + .build(); + + + // when + final ResultActions result = mockMvc.perform( + MockMvcRequestBuilders.post(url) + .content(new Gson().toJson(addAnswerRequest)) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect(status().isNoContent()); + } + + private static Stream provideParameters() { + return Stream.of( + Arguments.of(null, desc(1)), + Arguments.of(UUID.randomUUID().toString(), null), + Arguments.of(UUID.randomUUID().toString(), desc(1000)) + ); + } + + private static String desc(final int count) { + final StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < count; i++) { + stringBuilder.append("AAAAAAAAAAAAAAAAAAAAAAAAAAA"); + } + return stringBuilder.toString(); + } + +} \ No newline at end of file diff --git a/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AnswerControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AnswerControllerTest.java deleted file mode 100644 index b0a8f6a..0000000 --- a/src/test/java/com/mangkyu/employment/interview/app/answer/controller/AnswerControllerTest.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.mangkyu.employment.interview.app.answer.controller; - -import com.google.gson.Gson; -import com.mangkyu.employment.interview.app.answer.dto.AddAnswerRequest; -import com.mangkyu.employment.interview.app.answer.dto.GetAnswerResponse; -import com.mangkyu.employment.interview.app.answer.service.AnswerService; -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.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; - -import java.util.UUID; -import java.util.stream.Stream; - -import static org.mockito.Mockito.doReturn; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@WebMvcTest -class AnswerControllerTest { - - @Autowired - private MockMvc mockMvc; - - @Autowired - private AnswerService answerService; - - @Test - public void getAnswer() throws Exception { - // given - final String resourceId = UUID.randomUUID().toString(); - final String url = "/answers/" + resourceId; - final GetAnswerResponse getAnswerResponse = GetAnswerResponse.builder() - .resourceId(resourceId) - .quizResourceId(UUID.randomUUID().toString()) - .description("설명") - .createdAt(System.currentTimeMillis()) - .build(); - - doReturn(getAnswerResponse).when(answerService).getAnswer(resourceId); - - // when - final ResultActions result = mockMvc.perform( - MockMvcRequestBuilders.get(url) - ); - - // then - result.andExpect(status().isOk()) - .andExpect(jsonPath("resourceId").value(getAnswerResponse.getResourceId())) - .andExpect(jsonPath("quizResourceId").value(getAnswerResponse.getQuizResourceId())) - .andExpect(jsonPath("description").value(getAnswerResponse.getDescription())); - } - - @ParameterizedTest - @MethodSource("provideParameters") - public void addAnswerFail_InvalidParameter(final String quizResourceId, final String desc) throws Exception { - // given - final String url = "/answers"; - - final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() - .quizResourceId(quizResourceId) - .description(desc) - .build(); - - // when - final ResultActions result = mockMvc.perform( - MockMvcRequestBuilders.post(url) - .content(new Gson().toJson(addAnswerRequest)) - .contentType(MediaType.APPLICATION_JSON) - ); - - // then - result.andExpect(status().isBadRequest()); - } - - @Test - public void addAnswerSuccess() throws Exception { - // given - final String url = "/answers"; - - final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() - .quizResourceId(UUID.randomUUID().toString()) - .description("desc") - .build(); - - - // when - final ResultActions result = mockMvc.perform( - MockMvcRequestBuilders.post(url) - .content(new Gson().toJson(addAnswerRequest)) - .contentType(MediaType.APPLICATION_JSON) - ); - - // then - result.andExpect(status().isNoContent()); - } - - @ParameterizedTest - @MethodSource("provideParameters") - public void putAnswerFail_InvalidParameter(final String quizResourceId, final String desc) throws Exception { - // given - final String url = "/answers"; - - final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() - .quizResourceId(quizResourceId) - .description(desc) - .build(); - - // when - final ResultActions result = mockMvc.perform( - MockMvcRequestBuilders.put(url) - .content(new Gson().toJson(addAnswerRequest)) - .contentType(MediaType.APPLICATION_JSON) - ); - - // then - result.andExpect(status().isBadRequest()); - } - - @Test - public void putAnswerSuccess() throws Exception { - // given - final String url = "/answers"; - - final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() - .quizResourceId(UUID.randomUUID().toString()) - .description("desc") - .build(); - - - // when - final ResultActions result = mockMvc.perform( - MockMvcRequestBuilders.put(url) - .content(new Gson().toJson(addAnswerRequest)) - .contentType(MediaType.APPLICATION_JSON) - ); - - // then - result.andExpect(status().isNoContent()); - } - - @Test - public void deleteAnswerSuccess() throws Exception { - // given - final String url = "/answers/" + UUID.randomUUID(); - - // when - final ResultActions result = mockMvc.perform( - MockMvcRequestBuilders.delete(url) - ); - - // then - result.andExpect(status().isNoContent()); - } - - private static Stream provideParameters() { - return Stream.of( - Arguments.of(null, desc(1)), - Arguments.of(UUID.randomUUID().toString(), null), - Arguments.of(UUID.randomUUID().toString(), desc(1000)) - ); - } - - private static String desc(final int count) { - final StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < count; i++) { - stringBuilder.append("AAAAAAAAAAAAAAAAAAAAAAAAAAA"); - } - return stringBuilder.toString(); - } - -} \ No newline at end of file diff --git a/src/test/java/com/mangkyu/employment/interview/app/answer/controller/DeleteAnswerControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/DeleteAnswerControllerTest.java new file mode 100644 index 0000000..739436e --- /dev/null +++ b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/DeleteAnswerControllerTest.java @@ -0,0 +1,38 @@ +package com.mangkyu.employment.interview.app.answer.controller; + +import com.mangkyu.employment.interview.app.answer.service.AnswerService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import java.util.UUID; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest +class DeleteAnswerControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private AnswerService answerService; + + @Test + public void deleteAnswerSuccess() throws Exception { + // given + final String url = "/answers/" + UUID.randomUUID(); + + // when + final ResultActions result = mockMvc.perform( + MockMvcRequestBuilders.delete(url) + ); + + // then + result.andExpect(status().isNoContent()); + } + +} \ No newline at end of file diff --git a/src/test/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerControllerTest.java new file mode 100644 index 0000000..59bcd6a --- /dev/null +++ b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/GetAnswerControllerTest.java @@ -0,0 +1,53 @@ +package com.mangkyu.employment.interview.app.answer.controller; + +import com.mangkyu.employment.interview.app.answer.service.AnswerService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import java.util.UUID; + +import static org.mockito.Mockito.doReturn; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest +class GetAnswerControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private AnswerService answerService; + + @Test + public void getAnswer() throws Exception { + // given + final String resourceId = UUID.randomUUID().toString(); + final String url = "/answers/" + resourceId; + final GetAnswerResponse getAnswerResponse = GetAnswerResponse.builder() + .resourceId(resourceId) + .quizResourceId(UUID.randomUUID().toString()) + .description("설명") + .createdAt(System.currentTimeMillis()) + .build(); + + doReturn(getAnswerResponse).when(answerService).getAnswer(resourceId); + + // when + final ResultActions result = mockMvc.perform( + MockMvcRequestBuilders.get(url) + ); + + // then + result.andExpect(status().isOk()) + .andExpect(jsonPath("resourceId").value(getAnswerResponse.getResourceId())) + .andExpect(jsonPath("quizResourceId").value(getAnswerResponse.getQuizResourceId())) + .andExpect(jsonPath("description").value(getAnswerResponse.getDescription())); + } + + +} \ No newline at end of file diff --git a/src/test/java/com/mangkyu/employment/interview/app/answer/controller/UpdateAnswerControllerTest.java b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/UpdateAnswerControllerTest.java new file mode 100644 index 0000000..381c902 --- /dev/null +++ b/src/test/java/com/mangkyu/employment/interview/app/answer/controller/UpdateAnswerControllerTest.java @@ -0,0 +1,90 @@ +package com.mangkyu.employment.interview.app.answer.controller; + +import com.google.gson.Gson; +import com.mangkyu.employment.interview.app.answer.service.AnswerService; +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.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import java.util.UUID; +import java.util.stream.Stream; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest +class UpdateAnswerControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private AnswerService answerService; + + @ParameterizedTest + @MethodSource("provideParameters") + public void putAnswerFail_InvalidParameter(final String quizResourceId, final String desc) throws Exception { + // given + final String url = "/answers"; + + final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() + .quizResourceId(quizResourceId) + .description(desc) + .build(); + + // when + final ResultActions result = mockMvc.perform( + MockMvcRequestBuilders.put(url) + .content(new Gson().toJson(addAnswerRequest)) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect(status().isBadRequest()); + } + + @Test + public void putAnswerSuccess() throws Exception { + // given + final String url = "/answers"; + + final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() + .quizResourceId(UUID.randomUUID().toString()) + .description("desc") + .build(); + + + // when + final ResultActions result = mockMvc.perform( + MockMvcRequestBuilders.put(url) + .content(new Gson().toJson(addAnswerRequest)) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect(status().isNoContent()); + } + + private static Stream provideParameters() { + return Stream.of( + Arguments.of(null, desc(1)), + Arguments.of(UUID.randomUUID().toString(), null), + Arguments.of(UUID.randomUUID().toString(), desc(1000)) + ); + } + + private static String desc(final int count) { + final StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < count; i++) { + stringBuilder.append("AAAAAAAAAAAAAAAAAAAAAAAAAAA"); + } + return stringBuilder.toString(); + } + +} \ No newline at end of file diff --git a/src/test/java/com/mangkyu/employment/interview/app/answer/service/AnswerServiceTest.java b/src/test/java/com/mangkyu/employment/interview/app/answer/service/AnswerServiceTest.java index 51f9f54..2d13147 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/answer/service/AnswerServiceTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/answer/service/AnswerServiceTest.java @@ -1,7 +1,7 @@ package com.mangkyu.employment.interview.app.answer.service; -import com.mangkyu.employment.interview.app.answer.dto.AddAnswerRequest; -import com.mangkyu.employment.interview.app.answer.dto.GetAnswerResponse; +import com.mangkyu.employment.interview.app.answer.controller.AddAnswerRequest; +import com.mangkyu.employment.interview.app.answer.controller.GetAnswerResponse; import com.mangkyu.employment.interview.app.answer.entity.Answer; import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository; import com.mangkyu.employment.interview.erros.errorcode.CommonErrorCode; diff --git a/src/test/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverterTest.java b/src/test/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverterTest.java index c7eb6d9..eaae91a 100644 --- a/src/test/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverterTest.java +++ b/src/test/java/com/mangkyu/employment/interview/app/quiz/converter/QuizDtoConverterTest.java @@ -1,7 +1,7 @@ package com.mangkyu.employment.interview.app.quiz.converter; -import com.mangkyu.employment.interview.app.answer.dto.AddAnswerRequest; -import com.mangkyu.employment.interview.app.answer.dto.GetAnswerResponse; +import com.mangkyu.employment.interview.app.answer.controller.AddAnswerRequest; +import com.mangkyu.employment.interview.app.answer.controller.GetAnswerResponse; import com.mangkyu.employment.interview.app.answer.entity.Answer; import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponse; import com.mangkyu.employment.interview.app.quiz.entity.Quiz;