Divide QuizController separately

This commit is contained in:
MangKyu
2023-02-18 19:30:22 +09:00
parent a40298c30d
commit 9fb8e48c6c
11 changed files with 355 additions and 287 deletions

View File

@@ -73,14 +73,14 @@ public class MailController {
memberRepository.save(member1);
// userRepository.save(user2);
System.out.println("http://localhost:8080/quiz/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quiz/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quiz/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quiz/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quiz/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quiz/editView/" + quizRepository.save(quiz(QuizCategory.PROGRAMMING, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR), "DDD의 Layered Architecture에서 Presentation, Application, Domain, InfraStructure layer의 역할에 대해 설명해 주세요.")).getResourceId());
System.out.println("http://localhost:8080/quiz/editView/" + quizRepository.save(quiz(QuizCategory.SPRING, Collections.singletonList(QuizLevel.JUNIOR), "Spring Framework에서 사용되는 대표적인 디자인 패턴과 적용된 곳을 설명해주세요.")).getResourceId());
System.out.println("http://localhost:8080/quiz/editView/" + quizRepository.save(quiz(QuizCategory.DATABASE, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR), "MSA의 장점과 단점에 대해 설명해주세요")).getResourceId());
System.out.println("http://localhost:8080/quizzes/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quizzes/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quizzes/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quizzes/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quizzes/editView/" + quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "Junit4 vs Junit5 차이는 무엇인가?")).getResourceId());
System.out.println("http://localhost:8080/quizzes/editView/" + quizRepository.save(quiz(QuizCategory.PROGRAMMING, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR), "DDD의 Layered Architecture에서 Presentation, Application, Domain, InfraStructure layer의 역할에 대해 설명해 주세요.")).getResourceId());
System.out.println("http://localhost:8080/quizzes/editView/" + quizRepository.save(quiz(QuizCategory.SPRING, Collections.singletonList(QuizLevel.JUNIOR), "Spring Framework에서 사용되는 대표적인 디자인 패턴과 적용된 곳을 설명해주세요.")).getResourceId());
System.out.println("http://localhost:8080/quizzes/editView/" + quizRepository.save(quiz(QuizCategory.DATABASE, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR), "MSA의 장점과 단점에 대해 설명해주세요")).getResourceId());
// quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "당신은 ㅜ구인가"));
// quizRepository.save(quiz(QuizCategory.DATABASE, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR), "퇴근합시다"));
}

View File

@@ -0,0 +1,45 @@
package com.mangkyu.employment.interview.app.quiz.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mangkyu.employment.interview.app.quiz.dto.AddQuizRequest;
import com.mangkyu.employment.interview.app.quiz.dto.AddQuizRequestHolder;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
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;
import java.io.File;
import java.io.IOException;
@RestController
@RequiredArgsConstructor
class AddQuizController {
private final QuizService quizService;
private final ObjectMapper objectMapper;
@GetMapping("/quizzes/init")
public ResponseEntity<Void> initQuizListByFile() throws IOException {
final File file = ResourceUtils.getFile("classpath:quiz/quiz.json");
final AddQuizRequestHolder addQuizRequestHolder = objectMapper.readValue(file, AddQuizRequestHolder.class);
addQuizRequestHolder.getQuizList().forEach(quizService::addQuiz);
return ResponseEntity.noContent()
.build();
}
@PostMapping("/quizzes")
public ResponseEntity<Void> addQuiz(@RequestBody @Valid final AddQuizRequest addQuizRequest) {
quizService.addQuiz(addQuizRequest);
return ResponseEntity.status(HttpStatus.CREATED)
.build();
}
}

View File

@@ -0,0 +1,24 @@
package com.mangkyu.employment.interview.app.quiz.controller;
import com.mangkyu.employment.interview.app.quiz.dto.QuizCategoryResponseHolder;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
class GetQuizCategoryController {
private final QuizService quizService;
@GetMapping("/quizzes/categories")
public ResponseEntity<QuizCategoryResponseHolder> getQuizCategoryList() {
final QuizCategoryResponseHolder response = QuizCategoryResponseHolder.builder()
.categoryList(quizService.getQuizCategoryList())
.build();
return ResponseEntity.ok(response);
}
}

View File

@@ -0,0 +1,39 @@
package com.mangkyu.employment.interview.app.quiz.controller;
import com.mangkyu.employment.interview.app.quiz.dto.GetQuizRequest;
import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponse;
import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponseHolder;
import com.mangkyu.employment.interview.app.quiz.dto.SearchQuizListRequest;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
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;
import javax.validation.Valid;
@RestController
@RequiredArgsConstructor
class GetQuizController {
private final QuizService quizService;
@GetMapping("/quizzes/{resourceId}")
public ResponseEntity<GetQuizResponse> getQuiz(@PathVariable final String resourceId) {
return ResponseEntity.ok(quizService.getQuiz(resourceId));
}
@GetMapping("/quizzes")
public ResponseEntity<GetQuizResponseHolder> getQuizList(@Valid final GetQuizRequest getQuizRequest) {
final GetQuizResponseHolder response = quizService.getQuizList(getQuizRequest);
return ResponseEntity.ok(response);
}
@GetMapping("/quizzes/search")
public ResponseEntity<GetQuizResponseHolder> searchQuizList(@Valid final SearchQuizListRequest request) {
final GetQuizResponseHolder response = quizService.searchQuizList(request);
return ResponseEntity.ok(response);
}
}

View File

@@ -1,67 +0,0 @@
package com.mangkyu.employment.interview.app.quiz.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mangkyu.employment.interview.erros.exception.RestApiException;
import com.mangkyu.employment.interview.app.quiz.dto.*;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.io.File;
import java.io.IOException;
@RestController
@RequiredArgsConstructor
public class QuizController {
private final QuizService quizService;
@GetMapping("/quiz/init")
public ResponseEntity<Void> initQuizListByFile() throws IOException {
final File file = ResourceUtils.getFile("classpath:quiz/quiz.json");
final ObjectMapper objectMapper = new ObjectMapper();
final AddQuizRequestHolder addQuizRequestHolder = objectMapper.readValue(file, AddQuizRequestHolder.class);
addQuizRequestHolder.getQuizList().forEach(quizService::addQuiz);
return ResponseEntity.noContent()
.build();
}
@PostMapping("/quiz")
public ResponseEntity<Void> addQuiz(@RequestBody @Valid final AddQuizRequest addQuizRequest) {
quizService.addQuiz(addQuizRequest);
return ResponseEntity.status(HttpStatus.CREATED)
.build();
}
@GetMapping("/quiz/{resourceId}")
public ResponseEntity<GetQuizResponse> getQuiz(@PathVariable final String resourceId) throws RestApiException {
return ResponseEntity.ok(quizService.getQuiz(resourceId));
}
@GetMapping("/quizzes")
public ResponseEntity<GetQuizResponseHolder> getQuizList(@Valid final GetQuizRequest getQuizRequest) {
final GetQuizResponseHolder response = quizService.getQuizList(getQuizRequest);
return ResponseEntity.ok(response);
}
@GetMapping("/quiz/categories")
public ResponseEntity<QuizCategoryResponseHolder> getQuizCategoryList() {
final QuizCategoryResponseHolder response = QuizCategoryResponseHolder.builder()
.categoryList(quizService.getQuizCategoryList())
.build();
return ResponseEntity.ok(response);
}
@GetMapping("/quizzes/search")
public ResponseEntity<GetQuizResponseHolder> searchQuizList(@Valid final SearchQuizListRequest request) {
final GetQuizResponseHolder response = quizService.searchQuizList(request);
return ResponseEntity.ok(response);
}
}

View File

@@ -20,7 +20,7 @@ public class WebQuizController {
private final QuizService quizService;
private final GetAnswerService answerService;
@GetMapping("/quiz/editView/{resourceId}")
@GetMapping("/quizzes/editView/{resourceId}")
public String addUserPage(@PathVariable final String resourceId, final Model model) {
final GetQuizResponse quiz = quizService.getQuiz(resourceId);
model.addAttribute("quiz", quiz);

View File

@@ -0,0 +1,48 @@
package com.mangkyu.employment.interview.app.quiz.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mangkyu.employment.interview.app.quiz.dto.AddQuizRequest;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
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.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.Collections;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest
class AddQuizControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@Test
void addQuiz() throws Exception {
// given
final AddQuizRequest request = AddQuizRequest.builder()
.quizCategory(QuizCategory.JAVA)
.title("Title")
.quizLevel(Collections.singletonList(QuizLevel.NEW))
.build();
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.post("/quizzes")
.content(objectMapper.writeValueAsString(request))
.contentType(MediaType.APPLICATION_JSON)
);
// then
result.andExpect(status().isCreated());
}
}

View File

@@ -0,0 +1,50 @@
package com.mangkyu.employment.interview.app.quiz.controller;
import com.mangkyu.employment.interview.app.quiz.dto.QuizCategoryResponse;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
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.List;
import static org.mockito.Mockito.doReturn;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest
class GetQuizCategoryControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private QuizService quizService;
@Test
void getCategory() throws Exception {
// given
final QuizCategoryResponse quizCategoryResponse = QuizCategoryResponse.builder()
.count(15L)
.code(QuizCategory.JAVA.name())
.title(QuizCategory.JAVA.getTitle())
.desc(QuizCategory.JAVA.getDesc())
.build();
doReturn(List.of(quizCategoryResponse))
.when(quizService)
.getQuizCategoryList();
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get("/quizzes/categories")
);
// then
result.andExpect(status().isOk());
}
}

View File

@@ -1,8 +1,9 @@
package com.mangkyu.employment.interview.app.quiz.controller;
import com.google.gson.Gson;
import com.mangkyu.employment.interview.app.quiz.constants.QuizConstants;
import com.mangkyu.employment.interview.app.quiz.dto.*;
import com.mangkyu.employment.interview.app.quiz.dto.GetQuizRequest;
import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponse;
import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponseHolder;
import com.mangkyu.employment.interview.app.quiz.dto.SearchQuizListRequest;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import com.mangkyu.employment.interview.enums.common.EnumMapperType;
@@ -18,7 +19,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
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;
@@ -28,13 +28,13 @@ import java.util.Collections;
import java.util.UUID;
import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
import static com.mangkyu.employment.interview.app.quiz.constants.QuizConstants.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest
class QuizControllerTest {
class GetQuizControllerTest {
@Autowired
private MockMvc mockMvc;
@@ -42,52 +42,49 @@ class QuizControllerTest {
@Autowired
private QuizService quizService;
private static Stream<Arguments> provideParameters() {
return Stream.of(
Arguments.of(null, 10, 10),
Arguments.of(QuizCategory.JAVA, MIN_PAGE_SIZE - 1, MIN_PAGE_NUMBER),
Arguments.of(QuizCategory.JAVA, MAX_PAGE_SIZE + 1, MIN_PAGE_NUMBER),
Arguments.of(QuizCategory.JAVA, MIN_PAGE_SIZE, MIN_PAGE_NUMBER - 1)
);
}
@Test
public void getQuiz() throws Exception {
void getQuiz() throws Exception {
// given
final String resourceId = UUID.randomUUID().toString();
final String url = "/quiz/" + resourceId;
final GetQuizResponse quizResponse = GetQuizResponse.builder()
.title("quiz")
.quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name()))
.category(enumMapperValue(QuizCategory.JAVA).getTitle())
.build();
doReturn(quizResponse).when(quizService).getQuiz(resourceId);
doReturn(quizResponse)
.when(quizService)
.getQuiz(resourceId);
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
MockMvcRequestBuilders.get("/quizzes/{resourceId}", resourceId)
);
// then
final ResultActions resultActions = result.andExpect(status().isOk());
final String stringResponse = resultActions.andReturn().getResponse().getContentAsString();
final GetQuizResponse getQuizResult = new Gson().fromJson(stringResponse, GetQuizResponse.class);
assertThat(getQuizResult.getResourceId()).isEqualTo(quizResponse.getResourceId());
assertThat(getQuizResult.getTitle()).isEqualTo(quizResponse.getTitle());
assertThat(getQuizResult.getCategory()).isEqualTo(quizResponse.getCategory());
assertThat(getQuizResult.getCreatedAt()).isEqualTo(quizResponse.getCreatedAt());
result.andExpect(status().isOk());
}
@ParameterizedTest
@MethodSource("provideParameters")
public void getQuizListFail_BadRequest(final QuizCategory quizCategory, final int size, final int page) throws Exception {
void getQuizListFail_BadRequest(final QuizCategory quizCategory, final int size, final int page) throws Exception {
// given
final String url = "/quizzes";
final String category = quizCategory == null
? null
: quizCategory.name();
final GetQuizResponse quizResponse = GetQuizResponse.builder()
.title("quiz")
.quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name()))
.category(enumMapperValue(QuizCategory.JAVA).getTitle())
.build();
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
MockMvcRequestBuilders.get("/quizzes")
.param("category", category)
.param("size", String.valueOf(size))
.param("page", String.valueOf(page))
@@ -98,19 +95,15 @@ class QuizControllerTest {
}
@Test
public void getQuizList() throws Exception {
void getQuizList() throws Exception {
// given
final int size = QuizConstants.MIN_PAGE_SIZE;
final int page = QuizConstants.MIN_PAGE_NUMBER;
final String url = "/quizzes";
final GetQuizResponse quizResponse = GetQuizResponse.builder()
.title("quiz")
.quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name()))
.category(enumMapperValue(QuizCategory.JAVA).getTitle())
.build();
final Pageable pageable = PageRequest.of(page, size);
final Pageable pageable = PageRequest.of(MIN_PAGE_NUMBER, MIN_PAGE_SIZE);
final PageImpl<Quiz> quizPage = new PageImpl<>(Collections.emptyList(), pageable, 0);
final GetQuizResponseHolder getQuizResponseHolder = GetQuizResponseHolder.builder()
@@ -121,88 +114,33 @@ class QuizControllerTest {
.totalPages(quizPage.getTotalPages())
.build();
doReturn(getQuizResponseHolder).when(quizService).getQuizList(any(GetQuizRequest.class));
doReturn(getQuizResponseHolder)
.when(quizService)
.getQuizList(any(GetQuizRequest.class));
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
MockMvcRequestBuilders.get("/quizzes")
.param("category", QuizCategory.JAVA.name())
.param("size", String.valueOf(size))
.param("page", String.valueOf(page))
.param("size", String.valueOf(MIN_PAGE_SIZE))
.param("page", String.valueOf(MIN_PAGE_NUMBER))
);
// then
result.andExpect(status().isOk());
}
@Test
public void addQuiz() throws Exception {
// given
final String url = "/quiz";
final AddQuizRequest addQuizRequest = AddQuizRequest.builder()
.quizCategory(QuizCategory.JAVA)
.title("Title")
.quizLevel(Collections.singletonList(QuizLevel.NEW))
.build();
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.post(url)
.content(new Gson().toJson(addQuizRequest))
.contentType(MediaType.APPLICATION_JSON)
);
// then
result.andExpect(status().isCreated());
}
@Test
public void getCategory() throws Exception {
// given
final String url = "/quiz/categories";
final long count = 15L;
final QuizCategoryResponse quizCategoryResponse = QuizCategoryResponse.builder()
.count(count)
.code(QuizCategory.JAVA.name())
.title(QuizCategory.JAVA.getTitle())
.desc(QuizCategory.JAVA.getDesc())
.build();
doReturn(Collections.singletonList(quizCategoryResponse)).when(quizService).getQuizCategoryList();
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
);
// then
final ResultActions resultActions = result.andExpect(status().isOk());
final String stringResponse = resultActions.andReturn().getResponse().getContentAsString();
final QuizCategoryResponseHolder responseHolder = new Gson().fromJson(stringResponse, QuizCategoryResponseHolder.class);
assertThat(responseHolder.getCategoryList().size()).isEqualTo(1);
assertThat(responseHolder.getCategoryList().get(0).getCount()).isEqualTo(count);
}
@ParameterizedTest
@MethodSource("provideParameters")
public void searchQuizFail_InvalidParameter(final QuizCategory quizCategory, final int size, final int page) throws Exception {
void searchQuizFail_InvalidParameter(final QuizCategory quizCategory, final int size, final int page) throws Exception {
// given
if (quizCategory == null) {
return;
}
final String url = "/quizzes/search";
final GetQuizResponse quizResponse = GetQuizResponse.builder()
.title("quiz")
.quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name()))
.category(enumMapperValue(QuizCategory.JAVA).getTitle())
.build();
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
MockMvcRequestBuilders.get("/quizzes/search")
.param("size", String.valueOf(size))
.param("page", String.valueOf(page))
);
@@ -212,19 +150,15 @@ class QuizControllerTest {
}
@Test
public void searchQuizSuccess() throws Exception {
void searchQuizSuccess() throws Exception {
// given
final String url = "/quizzes/search";
final int size = QuizConstants.MIN_PAGE_SIZE;
final int page = QuizConstants.MIN_PAGE_NUMBER;
final GetQuizResponse quizResponse = GetQuizResponse.builder()
.title("quiz")
.quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name()))
.category(enumMapperValue(QuizCategory.JAVA).getTitle())
.build();
final Pageable pageable = PageRequest.of(page, size);
final Pageable pageable = PageRequest.of(MIN_PAGE_NUMBER, MIN_PAGE_SIZE);
final PageImpl<Quiz> quizPage = new PageImpl<>(Collections.emptyList(), pageable, 0);
final GetQuizResponseHolder getQuizResponseHolder = GetQuizResponseHolder.builder()
@@ -235,28 +169,21 @@ class QuizControllerTest {
.totalPages(quizPage.getTotalPages())
.build();
doReturn(getQuizResponseHolder).when(quizService).searchQuizList(any(SearchQuizListRequest.class));
doReturn(getQuizResponseHolder)
.when(quizService)
.searchQuizList(any(SearchQuizListRequest.class));
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
.param("size", String.valueOf(size))
.param("page", String.valueOf(page))
MockMvcRequestBuilders.get("/quizzes/search")
.param("size", String.valueOf(MIN_PAGE_SIZE))
.param("page", String.valueOf(MIN_PAGE_NUMBER))
);
// then
result.andExpect(status().isOk());
}
private static Stream<Arguments> provideParameters() {
return Stream.of(
Arguments.of(null, 10, 10),
Arguments.of(QuizCategory.JAVA, QuizConstants.MIN_PAGE_SIZE - 1, QuizConstants.MIN_PAGE_NUMBER),
Arguments.of(QuizCategory.JAVA, QuizConstants.MAX_PAGE_SIZE + 1, QuizConstants.MIN_PAGE_NUMBER),
Arguments.of(QuizCategory.JAVA, QuizConstants.MIN_PAGE_SIZE, QuizConstants.MIN_PAGE_NUMBER - 1)
);
}
private EnumMapperValue enumMapperValue(final EnumMapperType enumMapperType) {
return EnumMapperValue.builder()
.code(enumMapperType.name())

View File

@@ -95,7 +95,7 @@ class QuizServiceTest {
}
@Test
public void findQuizEntitySuccess() throws RestApiException {
public void findQuizEntitySuccess() {
// given
final long id = -1L;
final Quiz quiz = quiz(id);
@@ -126,7 +126,7 @@ class QuizServiceTest {
}
@Test
public void getQuizSuccess() throws RestApiException {
public void getQuizSuccess() {
// given
final long id = -1L;
final Quiz quiz = quiz(id);

View File

@@ -1,15 +1,16 @@
package com.mangkyu.employment.interview.erros.handler;
import com.google.gson.Gson;
//import com.mangkyu.employment.interview.app.quiz.controller.GetQuizController;
import com.mangkyu.employment.interview.erros.errorcode.CommonErrorCode;
import com.mangkyu.employment.interview.erros.errorcode.ErrorCode;
import com.mangkyu.employment.interview.erros.response.ErrorResponse;
import com.mangkyu.employment.interview.erros.exception.RestApiException;
import com.mangkyu.employment.interview.app.quiz.controller.QuizController;
import com.mangkyu.employment.interview.app.quiz.dto.AddQuizRequest;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
@@ -31,100 +32,101 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doThrow;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@Disabled
@ExtendWith(MockitoExtension.class)
class GlobalExceptionHandlerTest {
@InjectMocks
private QuizController target;
@Mock
private QuizService quizService;
private MockMvc mockMvc;
@Spy
private Validator validator = new LocalValidatorFactoryBean();
@BeforeEach
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(target)
.setControllerAdvice(new GlobalExceptionHandler())
.build();
}
@Test
public void handleQuizException() throws Exception {
// given
final String resourceId = UUID.randomUUID().toString();
final String url = "/quiz/" + resourceId;
final ErrorCode errorCode = CommonErrorCode.RESOURCE_NOT_FOUND;
doThrow(new RestApiException(errorCode)).when(quizService).getQuiz(resourceId);
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
);
// then
final ResultActions resultActions = result.andExpect(status().isNotFound());
final String stringResponse = resultActions.andReturn().getResponse().getContentAsString();
final ErrorResponse errorResponse = new Gson().fromJson(stringResponse, ErrorResponse.class);
assertThat(errorResponse.getCode()).isEqualTo(errorCode.name());
assertThat(errorResponse.getMessage()).isEqualTo(errorCode.getMessage());
}
@Test
public void handleIllegalArgument() throws Exception {
// given
final String resourceId = UUID.randomUUID().toString();
final String url = "/quiz/" + resourceId;
final String message = "message";
doThrow(new IllegalArgumentException(message)).when(quizService).getQuiz(resourceId);
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
);
// then
final ResultActions resultActions = result.andExpect(status().isBadRequest());
final String stringResponse = resultActions.andReturn().getResponse().getContentAsString();
final ErrorResponse errorResponse = new Gson().fromJson(stringResponse, ErrorResponse.class);
assertThat(errorResponse.getCode()).isEqualTo(CommonErrorCode.INVALID_PARAMETER.name());
assertThat(errorResponse.getMessage()).isEqualTo(message);
}
@Test
public void handleMethodArgumentNotValid() throws Exception {
// given
final String url = "/quiz";
final ErrorCode errorCode = CommonErrorCode.INVALID_PARAMETER;
final AddQuizRequest addQuizRequest = AddQuizRequest.builder()
.title("Title")
.quizLevel(Collections.singletonList(QuizLevel.NEW))
.build();
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.post(url)
.content(new Gson().toJson(addQuizRequest))
.contentType(MediaType.APPLICATION_JSON)
);
// then
final ResultActions resultActions = result.andExpect(status().isBadRequest());
final String stringResponse = resultActions.andReturn().getResponse().getContentAsString();
final ErrorResponse errorResponse = new Gson().fromJson(stringResponse, ErrorResponse.class);
assertThat(errorResponse.getCode()).isEqualTo(errorCode.name());
assertThat(errorResponse.getMessage()).isEqualTo(errorCode.getMessage());
assertThat(errorResponse.getErrors().size()).isEqualTo(1);
}
//
// @InjectMocks
// private GetQuizController target;
//
// @Mock
// private QuizService quizService;
//
// private MockMvc mockMvc;
// @Spy
// private Validator validator = new LocalValidatorFactoryBean();
//
// @BeforeEach
// public void init() {
// mockMvc = MockMvcBuilders.standaloneSetup(target)
// .setControllerAdvice(new GlobalExceptionHandler())
// .build();
// }
//
// @Test
// public void handleQuizException() throws Exception {
// // given
// final String resourceId = UUID.randomUUID().toString();
// final String url = "/quizzes/" + resourceId;
// final ErrorCode errorCode = CommonErrorCode.RESOURCE_NOT_FOUND;
//
// doThrow(new RestApiException(errorCode)).when(quizService).getQuiz(resourceId);
//
// // when
// final ResultActions result = mockMvc.perform(
// MockMvcRequestBuilders.get(url)
// );
//
// // then
// final ResultActions resultActions = result.andExpect(status().isNotFound());
// final String stringResponse = resultActions.andReturn().getResponse().getContentAsString();
// final ErrorResponse errorResponse = new Gson().fromJson(stringResponse, ErrorResponse.class);
//
//
// assertThat(errorResponse.getCode()).isEqualTo(errorCode.name());
// assertThat(errorResponse.getMessage()).isEqualTo(errorCode.getMessage());
// }
//
// @Test
// public void handleIllegalArgument() throws Exception {
// // given
// final String resourceId = UUID.randomUUID().toString();
// final String url = "/quizzes/" + resourceId;
// final String message = "message";
//
// doThrow(new IllegalArgumentException(message)).when(quizService).getQuiz(resourceId);
//
// // when
// final ResultActions result = mockMvc.perform(
// MockMvcRequestBuilders.get(url)
// );
//
// // then
// final ResultActions resultActions = result.andExpect(status().isBadRequest());
// final String stringResponse = resultActions.andReturn().getResponse().getContentAsString();
// final ErrorResponse errorResponse = new Gson().fromJson(stringResponse, ErrorResponse.class);
//
//
// assertThat(errorResponse.getCode()).isEqualTo(CommonErrorCode.INVALID_PARAMETER.name());
// assertThat(errorResponse.getMessage()).isEqualTo(message);
// }
//
// @Test
// public void handleMethodArgumentNotValid() throws Exception {
// // given
// final String url = "/quiz";
// final ErrorCode errorCode = CommonErrorCode.INVALID_PARAMETER;
//
// final AddQuizRequest addQuizRequest = AddQuizRequest.builder()
// .title("Title")
// .quizLevel(Collections.singletonList(QuizLevel.NEW))
// .build();
//
// // when
// final ResultActions result = mockMvc.perform(
// MockMvcRequestBuilders.post(url)
// .content(new Gson().toJson(addQuizRequest))
// .contentType(MediaType.APPLICATION_JSON)
// );
//
// // then
// final ResultActions resultActions = result.andExpect(status().isBadRequest());
// final String stringResponse = resultActions.andReturn().getResponse().getContentAsString();
// final ErrorResponse errorResponse = new Gson().fromJson(stringResponse, ErrorResponse.class);
//
// assertThat(errorResponse.getCode()).isEqualTo(errorCode.name());
// assertThat(errorResponse.getMessage()).isEqualTo(errorCode.getMessage());
// assertThat(errorResponse.getErrors().size()).isEqualTo(1);
// }
}