Refactor access modifier, line and ... etc

This commit is contained in:
MangKyu
2023-02-18 17:21:23 +09:00
parent c0955737e4
commit 5901cf1d02
18 changed files with 77 additions and 92 deletions

View File

@@ -11,13 +11,13 @@ import javax.validation.Valid;
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
public class AddAnswerController { class AddAnswerController {
private final UpdateAnswerService answerService; private final UpdateAnswerService answerService;
@PostMapping("/answers") @PostMapping("/answers")
public ResponseEntity<Void> postAnswer(@RequestBody @Valid final AddAnswerRequest addAnswerRequest) { public ResponseEntity<Void> add(@RequestBody @Valid final AddAnswerRequest request) {
answerService.addAnswer(addAnswerRequest); answerService.add(request);
return ResponseEntity.noContent() return ResponseEntity.noContent()
.build(); .build();
} }

View File

@@ -1,9 +1,9 @@
package com.mangkyu.employment.interview.app.answer.controller; package com.mangkyu.employment.interview.app.answer.controller;
import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
@@ -11,17 +11,17 @@ import java.util.UUID;
@Getter @Getter
@Builder @Builder
@RequiredArgsConstructor @NoArgsConstructor
@NoArgsConstructor(force = true) @AllArgsConstructor
public class AddAnswerRequest { public class AddAnswerRequest {
@NotBlank @NotBlank
private final String quizResourceId; private String quizResourceId;
private final String resourceId = String.valueOf(UUID.randomUUID()); private String resourceId = String.valueOf(UUID.randomUUID());
@NotBlank @NotBlank
@Size(max = 5000) @Size(max = 5000)
private final String description; private String description;
} }

View File

@@ -9,13 +9,13 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
public class DeleteAnswerController { class DeleteAnswerController {
private final DeleteAnswerService answerService; private final DeleteAnswerService answerService;
@DeleteMapping("/answers/{resourceId}") @DeleteMapping("/answers/{resourceId}")
public ResponseEntity<Void> deleteAnswer(@PathVariable final String resourceId) { public ResponseEntity<Void> delete(@PathVariable final String resourceId) {
answerService.deleteAnswer(resourceId); answerService.delete(resourceId);
return ResponseEntity.noContent().build(); return ResponseEntity.noContent().build();
} }

View File

@@ -9,13 +9,13 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
public class GetAnswerController { class GetAnswerController {
private final GetAnswerService answerService; private final GetAnswerService answerService;
@GetMapping("/answers/{resourceId}") @GetMapping("/answers/{resourceId}")
public ResponseEntity<GetAnswerResponse> getAnswer(@PathVariable final String resourceId) { public ResponseEntity<GetAnswerResponse> get(@PathVariable final String resourceId) {
return ResponseEntity.ok(answerService.getAnswer(resourceId)); return ResponseEntity.ok(answerService.get(resourceId));
} }
} }

View File

@@ -1,17 +1,19 @@
package com.mangkyu.employment.interview.app.answer.controller; package com.mangkyu.employment.interview.app.answer.controller;
import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.NoArgsConstructor;
@Getter @Getter
@Builder @Builder
@RequiredArgsConstructor @NoArgsConstructor
@AllArgsConstructor
public class GetAnswerResponse { public class GetAnswerResponse {
private final String resourceId; private String resourceId;
private final String quizResourceId; private String quizResourceId;
private final String description; private String description;
private final long createdAt; private long createdAt;
} }

View File

@@ -1,6 +1,5 @@
package com.mangkyu.employment.interview.app.answer.controller; package com.mangkyu.employment.interview.app.answer.controller;
import com.mangkyu.employment.interview.app.answer.service.GetAnswerService;
import com.mangkyu.employment.interview.app.answer.service.UpdateAnswerService; import com.mangkyu.employment.interview.app.answer.service.UpdateAnswerService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -12,13 +11,13 @@ import javax.validation.Valid;
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
public class UpdateAnswerController { class UpdateAnswerController {
private final UpdateAnswerService answerService; private final UpdateAnswerService answerService;
@PutMapping("/answers") @PutMapping("/answers")
public ResponseEntity<Void> putAnswer(@RequestBody @Valid final AddAnswerRequest addAnswerRequest) { public ResponseEntity<Void> update(@RequestBody @Valid final AddAnswerRequest request) {
answerService.addAnswer(addAnswerRequest); answerService.add(request);
return ResponseEntity.noContent() return ResponseEntity.noContent()
.build(); .build();
} }

View File

@@ -2,7 +2,6 @@ package com.mangkyu.employment.interview.app.answer.service;
import com.mangkyu.employment.interview.app.answer.entity.Answer; import com.mangkyu.employment.interview.app.answer.entity.Answer;
import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository; import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import com.mangkyu.employment.interview.erros.errorcode.CommonErrorCode; import com.mangkyu.employment.interview.erros.errorcode.CommonErrorCode;
import com.mangkyu.employment.interview.erros.exception.RestApiException; import com.mangkyu.employment.interview.erros.exception.RestApiException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -11,13 +10,12 @@ import org.springframework.transaction.annotation.Transactional;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@Transactional(readOnly = true) @Transactional
public class DeleteAnswerService { public class DeleteAnswerService {
private final AnswerRepository answerRepository; private final AnswerRepository answerRepository;
@Transactional public void delete(final String resourceId) {
public void deleteAnswer(final String resourceId) throws RestApiException {
final Answer answer = answerRepository.findByResourceId(resourceId) final Answer answer = answerRepository.findByResourceId(resourceId)
.orElseThrow(() -> new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND)); .orElseThrow(() -> new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND));
answer.getQuiz().setAnswer(null); answer.getQuiz().setAnswer(null);

View File

@@ -17,7 +17,7 @@ public class GetAnswerService {
private final AnswerRepository answerRepository; private final AnswerRepository answerRepository;
public GetAnswerResponse getAnswer(final String resourceId) throws RestApiException { public GetAnswerResponse get(final String resourceId) {
final Answer answer = answerRepository.findByResourceId(resourceId) final Answer answer = answerRepository.findByResourceId(resourceId)
.orElseThrow(() -> new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND)); .orElseThrow(() -> new RestApiException(CommonErrorCode.RESOURCE_NOT_FOUND));

View File

@@ -12,22 +12,21 @@ import org.springframework.transaction.annotation.Transactional;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@Transactional(readOnly = true) @Transactional
public class UpdateAnswerService { public class UpdateAnswerService {
private final QuizService quizService; private final QuizService quizService;
private final AnswerRepository answerRepository; private final AnswerRepository answerRepository;
@Transactional public void add(final AddAnswerRequest request) {
public void addAnswer(final AddAnswerRequest addAnswerRequest) { final Quiz quiz = quizService.findQuiz(request.getQuizResourceId());
final Quiz quiz = quizService.findQuiz(addAnswerRequest.getQuizResourceId());
final Answer quizAnswer = quiz.getAnswer(); final Answer quizAnswer = quiz.getAnswer();
if (quizAnswer == null) { if (quizAnswer == null) {
final Answer answer = QuizDtoConverter.convert(addAnswerRequest, quiz); final Answer answer = QuizDtoConverter.convert(request, quiz);
answerRepository.save(answer); answerRepository.save(answer);
quiz.setAnswer(answer); quiz.setAnswer(answer);
} else { } else {
quizAnswer.setDescription(addAnswerRequest.getDescription()); quizAnswer.setDescription(request.getDescription());
} }
} }

View File

@@ -24,7 +24,7 @@ public class WebQuizController {
model.addAttribute("quiz", quiz); model.addAttribute("quiz", quiz);
if (StringUtils.isNotBlank(quiz.getAnswerResourceId())) { if (StringUtils.isNotBlank(quiz.getAnswerResourceId())) {
final GetAnswerResponse answer = answerService.getAnswer(quiz.getAnswerResourceId()); final GetAnswerResponse answer = answerService.get(quiz.getAnswerResourceId());
model.addAttribute("answer", answer); model.addAttribute("answer", answer);
} else { } else {
model.addAttribute("answer", GetAnswerResponse.builder().build()); model.addAttribute("answer", GetAnswerResponse.builder().build());

View File

@@ -31,17 +31,15 @@ class AddAnswerControllerTest {
@MethodSource("provideParameters") @MethodSource("provideParameters")
public void addAnswerFail_InvalidParameter(final String quizResourceId, final String desc) throws Exception { public void addAnswerFail_InvalidParameter(final String quizResourceId, final String desc) throws Exception {
// given // given
final String url = "/answers"; final AddAnswerRequest request = AddAnswerRequest.builder()
final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder()
.quizResourceId(quizResourceId) .quizResourceId(quizResourceId)
.description(desc) .description(desc)
.build(); .build();
// when // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.post(url) MockMvcRequestBuilders.post("/answers")
.content(new Gson().toJson(addAnswerRequest)) .content(new Gson().toJson(request))
.contentType(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON)
); );
@@ -52,8 +50,6 @@ class AddAnswerControllerTest {
@Test @Test
public void addAnswerSuccess() throws Exception { public void addAnswerSuccess() throws Exception {
// given // given
final String url = "/answers";
final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder()
.quizResourceId(UUID.randomUUID().toString()) .quizResourceId(UUID.randomUUID().toString())
.description("desc") .description("desc")
@@ -62,7 +58,7 @@ class AddAnswerControllerTest {
// when // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.post(url) MockMvcRequestBuilders.post("/answers")
.content(new Gson().toJson(addAnswerRequest)) .content(new Gson().toJson(addAnswerRequest))
.contentType(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON)
); );

View File

@@ -24,11 +24,10 @@ class DeleteAnswerControllerTest {
@Test @Test
public void deleteAnswerSuccess() throws Exception { public void deleteAnswerSuccess() throws Exception {
// given // given
final String url = "/answers/" + UUID.randomUUID();
// when // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.delete(url) MockMvcRequestBuilders.delete("/answers/" + UUID.randomUUID())
); );
// then // then

View File

@@ -27,7 +27,6 @@ class GetAnswerControllerTest {
public void getAnswer() throws Exception { public void getAnswer() throws Exception {
// given // given
final String resourceId = UUID.randomUUID().toString(); final String resourceId = UUID.randomUUID().toString();
final String url = "/answers/" + resourceId;
final GetAnswerResponse getAnswerResponse = GetAnswerResponse.builder() final GetAnswerResponse getAnswerResponse = GetAnswerResponse.builder()
.resourceId(resourceId) .resourceId(resourceId)
.quizResourceId(UUID.randomUUID().toString()) .quizResourceId(UUID.randomUUID().toString())
@@ -35,11 +34,11 @@ class GetAnswerControllerTest {
.createdAt(System.currentTimeMillis()) .createdAt(System.currentTimeMillis())
.build(); .build();
doReturn(getAnswerResponse).when(answerService).getAnswer(resourceId); doReturn(getAnswerResponse).when(answerService).get(resourceId);
// when // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url) MockMvcRequestBuilders.get("/answers/" + resourceId)
); );
// then // then

View File

@@ -31,8 +31,6 @@ class UpdateAnswerControllerTest {
@MethodSource("provideParameters") @MethodSource("provideParameters")
public void putAnswerFail_InvalidParameter(final String quizResourceId, final String desc) throws Exception { public void putAnswerFail_InvalidParameter(final String quizResourceId, final String desc) throws Exception {
// given // given
final String url = "/answers";
final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder() final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder()
.quizResourceId(quizResourceId) .quizResourceId(quizResourceId)
.description(desc) .description(desc)
@@ -40,7 +38,7 @@ class UpdateAnswerControllerTest {
// when // when
final ResultActions result = mockMvc.perform( final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.put(url) MockMvcRequestBuilders.put("/answers")
.content(new Gson().toJson(addAnswerRequest)) .content(new Gson().toJson(addAnswerRequest))
.contentType(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON)
); );

View File

@@ -24,25 +24,6 @@ class AnswerRepositoryTest {
@Autowired @Autowired
private EntityManager entityManager; private EntityManager entityManager;
@Test
public void insertAnswer() {
// given
final Quiz quiz = EntityCreationUtils.quiz();
final Quiz savedQuiz = quizRepository.save(quiz);
final Answer answer = EntityCreationUtils.answer(savedQuiz);
answerRepository.save(answer);
savedQuiz.setAnswer(answer);
entityManager.flush();
// then
final Answer result = answerRepository.save(answer);
assertThat(result.getResourceId()).isEqualTo(answer.getResourceId());
assertThat(result.getDescription()).isEqualTo(answer.getDescription());
assertThat(result.getQuiz()).isEqualTo(quiz);
}
@Test @Test
public void selectAnswerByQuizId() { public void selectAnswerByQuizId() {
// given // given

View File

@@ -1,11 +1,8 @@
package com.mangkyu.employment.interview.app.answer.service; package com.mangkyu.employment.interview.app.answer.service;
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.entity.Answer;
import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository; import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository;
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.erros.errorcode.CommonErrorCode; import com.mangkyu.employment.interview.erros.errorcode.CommonErrorCode;
import com.mangkyu.employment.interview.erros.exception.RestApiException; import com.mangkyu.employment.interview.erros.exception.RestApiException;
import com.mangkyu.employment.interview.testutils.EntityCreationUtils; import com.mangkyu.employment.interview.testutils.EntityCreationUtils;
@@ -14,7 +11,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@@ -32,27 +28,35 @@ class DeleteAnswerServiceTest {
private AnswerRepository answerRepository; private AnswerRepository answerRepository;
@Test @Test
public void deleteAnswerByQuizResourceIdFail_AnswerNotExists() { void deleteAnswerByQuizResourceIdFail_AnswerNotExists() {
// given // given
final String resourceId = UUID.randomUUID().toString(); final String resourceId = UUID.randomUUID().toString();
doReturn(Optional.empty()).when(answerRepository).findByResourceId(resourceId);
doReturn(Optional.empty())
.when(answerRepository)
.findByResourceId(resourceId);
// when // when
final RestApiException result = assertThrows(RestApiException.class, () -> answerService.deleteAnswer(resourceId)); final RestApiException result = assertThrows(
RestApiException.class,
() -> answerService.delete(resourceId));
// then // then
assertThat(result.getErrorCode()).isEqualTo(CommonErrorCode.RESOURCE_NOT_FOUND); assertThat(result.getErrorCode()).isEqualTo(CommonErrorCode.RESOURCE_NOT_FOUND);
} }
@Test @Test
public void deleteAnswerByQuizResourceIdSuccess() throws RestApiException { void deleteAnswerByQuizResourceIdSuccess() throws RestApiException {
// given // given
final Quiz quiz = EntityCreationUtils.quiz(); final Quiz quiz = EntityCreationUtils.quiz();
final Answer answer = EntityCreationUtils.answer(quiz); final Answer answer = EntityCreationUtils.answer(quiz);
doReturn(Optional.of(answer)).when(answerRepository).findByResourceId(answer.getResourceId());
doReturn(Optional.of(answer))
.when(answerRepository)
.findByResourceId(answer.getResourceId());
// when // when
answerService.deleteAnswer(answer.getResourceId()); answerService.delete(answer.getResourceId());
// then // then

View File

@@ -1,6 +1,5 @@
package com.mangkyu.employment.interview.app.answer.service; package com.mangkyu.employment.interview.app.answer.service;
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.controller.GetAnswerResponse;
import com.mangkyu.employment.interview.app.answer.entity.Answer; import com.mangkyu.employment.interview.app.answer.entity.Answer;
import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository; import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository;
@@ -14,7 +13,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@@ -38,10 +36,15 @@ class GetAnswerServiceTest {
public void getAnswerByQuizResourceIdFail_AnswerNotExists() { public void getAnswerByQuizResourceIdFail_AnswerNotExists() {
// given // given
final String resourceId = UUID.randomUUID().toString(); final String resourceId = UUID.randomUUID().toString();
doReturn(Optional.empty()).when(answerRepository).findByResourceId(resourceId);
doReturn(Optional.empty())
.when(answerRepository)
.findByResourceId(resourceId);
// when // when
final RestApiException result = assertThrows(RestApiException.class, () -> answerService.getAnswer(resourceId)); final RestApiException result = assertThrows(
RestApiException.class,
() -> answerService.get(resourceId));
// then // then
assertThat(result.getErrorCode()).isEqualTo(CommonErrorCode.RESOURCE_NOT_FOUND); assertThat(result.getErrorCode()).isEqualTo(CommonErrorCode.RESOURCE_NOT_FOUND);
@@ -52,10 +55,13 @@ class GetAnswerServiceTest {
// given // given
final Quiz quiz = EntityCreationUtils.quiz(); final Quiz quiz = EntityCreationUtils.quiz();
final Answer answer = EntityCreationUtils.answer(quiz); final Answer answer = EntityCreationUtils.answer(quiz);
doReturn(Optional.of(answer)).when(answerRepository).findByResourceId(answer.getResourceId());
doReturn(Optional.of(answer))
.when(answerRepository)
.findByResourceId(answer.getResourceId());
// when // when
final GetAnswerResponse result = answerService.getAnswer(answer.getResourceId()); final GetAnswerResponse result = answerService.get(answer.getResourceId());
// then // then
assertThat(result.getDescription()).isEqualTo(answer.getDescription()); assertThat(result.getDescription()).isEqualTo(answer.getDescription());

View File

@@ -40,10 +40,12 @@ class UpdateAnswerServiceTest {
final Answer answer = EntityCreationUtils.answer(quiz); final Answer answer = EntityCreationUtils.answer(quiz);
ReflectionTestUtils.setField(quiz, "answer", answer); ReflectionTestUtils.setField(quiz, "answer", answer);
doReturn(quiz).when(quizService).findQuiz(addAnswerRequest.getQuizResourceId()); doReturn(quiz)
.when(quizService)
.findQuiz(addAnswerRequest.getQuizResourceId());
// when // when
answerService.addAnswer(addAnswerRequest); answerService.add(addAnswerRequest);
// then // then
@@ -60,10 +62,12 @@ class UpdateAnswerServiceTest {
.build(); .build();
final Quiz quiz = EntityCreationUtils.quiz(); final Quiz quiz = EntityCreationUtils.quiz();
doReturn(quiz).when(quizService).findQuiz(addAnswerRequest.getQuizResourceId()); doReturn(quiz)
.when(quizService)
.findQuiz(addAnswerRequest.getQuizResourceId());
// when // when
answerService.addAnswer(addAnswerRequest); answerService.add(addAnswerRequest);
// then // then
verify(answerRepository, times(1)).save(any(Answer.class)); verify(answerRepository, times(1)).save(any(Answer.class));