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); memberRepository.save(member1);
// userRepository.save(user2); // 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/quizzes/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/quizzes/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/quizzes/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/quizzes/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/quizzes/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/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/quiz/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.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.DATABASE, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR), "MSA의 장점과 단점에 대해 설명해주세요")).getResourceId());
// quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "당신은 ㅜ구인가")); // quizRepository.save(quiz(QuizCategory.JAVA, Collections.singletonList(QuizLevel.JUNIOR), "당신은 ㅜ구인가"));
// quizRepository.save(quiz(QuizCategory.DATABASE, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR), "퇴근합시다")); // 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 QuizService quizService;
private final GetAnswerService answerService; private final GetAnswerService answerService;
@GetMapping("/quiz/editView/{resourceId}") @GetMapping("/quizzes/editView/{resourceId}")
public String addUserPage(@PathVariable final String resourceId, final Model model) { public String addUserPage(@PathVariable final String resourceId, final Model model) {
final GetQuizResponse quiz = quizService.getQuiz(resourceId); final GetQuizResponse quiz = quizService.getQuiz(resourceId);
model.addAttribute("quiz", quiz); 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; package com.mangkyu.employment.interview.app.quiz.controller;
import com.google.gson.Gson; import com.mangkyu.employment.interview.app.quiz.dto.GetQuizRequest;
import com.mangkyu.employment.interview.app.quiz.constants.QuizConstants; import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponse;
import com.mangkyu.employment.interview.app.quiz.dto.*; 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.entity.Quiz;
import com.mangkyu.employment.interview.app.quiz.service.QuizService; import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import com.mangkyu.employment.interview.enums.common.EnumMapperType; 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.PageImpl;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@@ -28,13 +28,13 @@ import java.util.Collections;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Stream; 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.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest @WebMvcTest
class QuizControllerTest { class GetQuizControllerTest {
@Autowired @Autowired
private MockMvc mockMvc; private MockMvc mockMvc;
@@ -42,52 +42,49 @@ class QuizControllerTest {
@Autowired @Autowired
private QuizService quizService; 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 @Test
public void getQuiz() throws Exception { void getQuiz() throws Exception {
// given // given
final String resourceId = UUID.randomUUID().toString(); final String resourceId = UUID.randomUUID().toString();
final String url = "/quiz/" + resourceId;
final GetQuizResponse quizResponse = GetQuizResponse.builder() final GetQuizResponse quizResponse = GetQuizResponse.builder()
.title("quiz") .title("quiz")
.quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name())) .quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name()))
.category(enumMapperValue(QuizCategory.JAVA).getTitle()) .category(enumMapperValue(QuizCategory.JAVA).getTitle())
.build(); .build();
doReturn(quizResponse).when(quizService).getQuiz(resourceId);
doReturn(quizResponse)
.when(quizService)
.getQuiz(resourceId);
// when // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url) MockMvcRequestBuilders.get("/quizzes/{resourceId}", resourceId)
); );
// then // then
final ResultActions resultActions = result.andExpect(status().isOk()); 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());
} }
@ParameterizedTest @ParameterizedTest
@MethodSource("provideParameters") @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 // given
final String url = "/quizzes";
final String category = quizCategory == null final String category = quizCategory == null
? null ? null
: quizCategory.name(); : 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 // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url) MockMvcRequestBuilders.get("/quizzes")
.param("category", category) .param("category", category)
.param("size", String.valueOf(size)) .param("size", String.valueOf(size))
.param("page", String.valueOf(page)) .param("page", String.valueOf(page))
@@ -98,19 +95,15 @@ class QuizControllerTest {
} }
@Test @Test
public void getQuizList() throws Exception { void getQuizList() throws Exception {
// given // given
final int size = QuizConstants.MIN_PAGE_SIZE;
final int page = QuizConstants.MIN_PAGE_NUMBER;
final String url = "/quizzes";
final GetQuizResponse quizResponse = GetQuizResponse.builder() final GetQuizResponse quizResponse = GetQuizResponse.builder()
.title("quiz") .title("quiz")
.quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name())) .quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name()))
.category(enumMapperValue(QuizCategory.JAVA).getTitle()) .category(enumMapperValue(QuizCategory.JAVA).getTitle())
.build(); .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 PageImpl<Quiz> quizPage = new PageImpl<>(Collections.emptyList(), pageable, 0);
final GetQuizResponseHolder getQuizResponseHolder = GetQuizResponseHolder.builder() final GetQuizResponseHolder getQuizResponseHolder = GetQuizResponseHolder.builder()
@@ -121,88 +114,33 @@ class QuizControllerTest {
.totalPages(quizPage.getTotalPages()) .totalPages(quizPage.getTotalPages())
.build(); .build();
doReturn(getQuizResponseHolder).when(quizService).getQuizList(any(GetQuizRequest.class)); doReturn(getQuizResponseHolder)
.when(quizService)
.getQuizList(any(GetQuizRequest.class));
// when // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url) MockMvcRequestBuilders.get("/quizzes")
.param("category", QuizCategory.JAVA.name()) .param("category", QuizCategory.JAVA.name())
.param("size", String.valueOf(size)) .param("size", String.valueOf(MIN_PAGE_SIZE))
.param("page", String.valueOf(page)) .param("page", String.valueOf(MIN_PAGE_NUMBER))
); );
// then // then
result.andExpect(status().isOk()); 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 @ParameterizedTest
@MethodSource("provideParameters") @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 // given
if (quizCategory == null) { if (quizCategory == null) {
return; 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 // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url) MockMvcRequestBuilders.get("/quizzes/search")
.param("size", String.valueOf(size)) .param("size", String.valueOf(size))
.param("page", String.valueOf(page)) .param("page", String.valueOf(page))
); );
@@ -212,19 +150,15 @@ class QuizControllerTest {
} }
@Test @Test
public void searchQuizSuccess() throws Exception { void searchQuizSuccess() throws Exception {
// given // 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() final GetQuizResponse quizResponse = GetQuizResponse.builder()
.title("quiz") .title("quiz")
.quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name())) .quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name()))
.category(enumMapperValue(QuizCategory.JAVA).getTitle()) .category(enumMapperValue(QuizCategory.JAVA).getTitle())
.build(); .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 PageImpl<Quiz> quizPage = new PageImpl<>(Collections.emptyList(), pageable, 0);
final GetQuizResponseHolder getQuizResponseHolder = GetQuizResponseHolder.builder() final GetQuizResponseHolder getQuizResponseHolder = GetQuizResponseHolder.builder()
@@ -235,28 +169,21 @@ class QuizControllerTest {
.totalPages(quizPage.getTotalPages()) .totalPages(quizPage.getTotalPages())
.build(); .build();
doReturn(getQuizResponseHolder).when(quizService).searchQuizList(any(SearchQuizListRequest.class)); doReturn(getQuizResponseHolder)
.when(quizService)
.searchQuizList(any(SearchQuizListRequest.class));
// when // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url) MockMvcRequestBuilders.get("/quizzes/search")
.param("size", String.valueOf(size)) .param("size", String.valueOf(MIN_PAGE_SIZE))
.param("page", String.valueOf(page)) .param("page", String.valueOf(MIN_PAGE_NUMBER))
); );
// then // then
result.andExpect(status().isOk()); 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) { private EnumMapperValue enumMapperValue(final EnumMapperType enumMapperType) {
return EnumMapperValue.builder() return EnumMapperValue.builder()
.code(enumMapperType.name()) .code(enumMapperType.name())

View File

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

View File

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