Merge branch 'master' into master-web

This commit is contained in:
MangKyu
2022-01-04 20:19:30 +09:00
36 changed files with 1271 additions and 255 deletions

View File

@@ -1,6 +1,7 @@
plugins {
id 'org.springframework.boot' version '2.6.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
id 'java'
}
@@ -38,6 +39,9 @@ dependencies {
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0'
implementation group: 'com.querydsl', name: 'querydsl-apt', version: '5.0.0'
implementation group: 'com.querydsl', name: 'querydsl-jpa', version: '5.0.0'
implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'io.springfox:springfox-swagger-ui:3.0.0'
}
@@ -45,3 +49,22 @@ dependencies {
test {
useJUnitPlatform()
}
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}

View File

@@ -0,0 +1,10 @@
package com.mangkyu.employment.interview.app.answer.constants;
import lombok.NoArgsConstructor;
@NoArgsConstructor
public final class AnswerConstants {
public static final int MAX_ANSWER_SIZE = 5000;
}

View File

@@ -0,0 +1,32 @@
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.app.common.erros.exception.QuizException;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequiredArgsConstructor
public class AnswerController {
private final AnswerService answerService;
@PostMapping("/answer")
public ResponseEntity<Void> addQuiz(@RequestBody @Valid final AddAnswerRequest addAnswerRequest) throws QuizException {
answerService.addAnswer(addAnswerRequest);
return ResponseEntity.status(HttpStatus.CREATED)
.build();
}
@GetMapping("/answer/{resourceId}")
public ResponseEntity<GetAnswerResponse> getAnswer(@PathVariable final String resourceId) throws QuizException {
return ResponseEntity.ok(answerService.getAnswer(resourceId));
}
}

View File

@@ -0,0 +1,28 @@
package com.mangkyu.employment.interview.app.answer.dto;
import com.mangkyu.employment.interview.app.answer.constants.AnswerConstants;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.UUID;
@Getter
@Builder
@RequiredArgsConstructor
@NoArgsConstructor(force = true)
public class AddAnswerRequest {
@NotBlank
private final String quizResourceId;
private final String resourceId = String.valueOf(UUID.randomUUID());
@NotBlank
@Size(max = AnswerConstants.MAX_ANSWER_SIZE)
private final String desc;
}

View File

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

View File

@@ -0,0 +1,31 @@
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.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "answer")
@Getter
@Builder
@NoArgsConstructor(force = true)
@AllArgsConstructor
public class Answer extends BaseEntity {
@Column(nullable = false)
private String resourceId;
@OneToOne(mappedBy = "answer")
private Quiz quiz;
@Lob
@Column(length = AnswerConstants.MAX_ANSWER_SIZE)
private String desc;
}

View File

@@ -0,0 +1,12 @@
package com.mangkyu.employment.interview.app.answer.repository;
import com.mangkyu.employment.interview.app.answer.entity.Answer;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface AnswerRepository extends JpaRepository<Answer, Long> {
Optional<Answer> findByResourceId(final String resourceId);
}

View File

@@ -0,0 +1,39 @@
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.entity.Answer;
import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository;
import com.mangkyu.employment.interview.app.common.erros.errorcode.CommonErrorCode;
import com.mangkyu.employment.interview.app.common.erros.exception.QuizException;
import com.mangkyu.employment.interview.app.quiz.converter.QuizDtoConverter;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class AnswerService {
private final QuizService quizService;
private final AnswerRepository answerRepository;
public GetAnswerResponse getAnswer(final String resourceId) throws QuizException {
final Answer answer = answerRepository.findByResourceId(resourceId)
.orElseThrow(() -> new QuizException(CommonErrorCode.RESOURCE_NOT_FOUND));
return QuizDtoConverter.convert(answer);
}
@Transactional
public void addAnswer(final AddAnswerRequest addAnswerRequest) throws QuizException {
final Quiz quiz = quizService.findQuiz(addAnswerRequest.getQuizResourceId());
final Answer answer = QuizDtoConverter.convert(addAnswerRequest, quiz);
answerRepository.save(answer);
quiz.setAnswer(answer);
}
}

View File

@@ -22,7 +22,7 @@ public class CursorPageable<T> {
page.hasNext(),
page.nextOrLastPageable().getPageNumber(),
page.nextOrLastPageable().getPageSize(),
page.getTotalElements());
page.getTotalPages());
}
public static <T> CursorPageable<T> of(final T response, final Page<?> page) {

View File

@@ -12,5 +12,5 @@ public class ResponseMetaData {
private final boolean hasNext;
private final int page;
private final int size;
private final long totalElements;
private final int totalPage;
}

View File

@@ -39,9 +39,9 @@ public class QuizController {
.build();
}
@GetMapping("/quiz/{id}")
public ResponseEntity<GetQuizResponse> getQuiz(@PathVariable final long id) throws QuizException {
return ResponseEntity.ok(quizService.getQuiz(id));
@GetMapping("/quiz/{resourceId}")
public ResponseEntity<GetQuizResponse> getQuiz(@PathVariable final String resourceId) throws QuizException {
return ResponseEntity.ok(quizService.getQuiz(resourceId));
}
@GetMapping("/quizzes")
@@ -58,4 +58,10 @@ public class QuizController {
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,10 +1,11 @@
package com.mangkyu.employment.interview.app.quiz.converter;
import com.mangkyu.employment.interview.app.quiz.dto.GetQuizRequest;
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.entity.Answer;
import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponse;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.enums.common.EnumMapperValue;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import lombok.NoArgsConstructor;
@@ -15,9 +16,19 @@ import java.util.stream.Collectors;
@NoArgsConstructor
public final class QuizDtoConverter {
public static GetAnswerResponse convert(final Answer answer) {
return GetAnswerResponse.builder()
.resourceId(answer.getResourceId())
.quizResourceId(answer.getQuiz().getResourceId())
.desc(answer.getDesc())
.createdAt(Timestamp.valueOf(answer.getCreatedAt()).getTime())
.build();
}
public static GetQuizResponse convert(final Quiz quiz) {
return GetQuizResponse.builder()
.id(quiz.getId())
.resourceId(quiz.getResourceId())
.answerResourceId(getAnswerResourceId(quiz))
.title(quiz.getTitle())
.quizLevelList(convert(quiz.getQuizLevel()))
.createdAt(Timestamp.valueOf(quiz.getCreatedAt()).getTime())
@@ -26,7 +37,8 @@ public final class QuizDtoConverter {
public static GetQuizResponse convert(final Quiz quiz, final EnumMapperValue enumMapperValue) {
return GetQuizResponse.builder()
.id(quiz.getId())
.resourceId(quiz.getResourceId())
.answerResourceId(getAnswerResourceId(quiz))
.title(quiz.getTitle())
.category(enumMapperValue)
.quizLevelList(convert(quiz.getQuizLevel()))
@@ -40,12 +52,17 @@ public final class QuizDtoConverter {
.collect(Collectors.toList());
}
public static GetQuizRequest convert(final int size, final int page, final QuizCategory category) {
return GetQuizRequest.builder()
.size(size)
.page(page)
.category(category)
.build();
public static Answer convert(final AddAnswerRequest addAnswerRequest, final Quiz quiz) {
return Answer.builder()
.resourceId(addAnswerRequest.getResourceId())
.quiz(quiz)
.desc(addAnswerRequest.getDesc()).build();
}
private static String getAnswerResourceId(final Quiz quiz) {
return (quiz.getAnswer() == null)
? null
: quiz.getAnswer().getResourceId();
}
}

View File

@@ -11,6 +11,7 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.UUID;
@Getter
@Builder
@@ -24,6 +25,8 @@ public class AddQuizRequest {
@NotNull
private final QuizCategory quizCategory;
private final String resourceId = String.valueOf(UUID.randomUUID());
@NotEmpty
private final List<QuizLevel> quizLevel;

View File

@@ -13,7 +13,11 @@ import java.util.List;
@RequiredArgsConstructor
public class GetQuizResponse {
private final long id;
private final String resourceId;
@JsonInclude(JsonInclude.Include.NON_NULL)
private final String answerResourceId;
private final String title;
@JsonInclude(JsonInclude.Include.NON_NULL)

View File

@@ -1,5 +1,6 @@
package com.mangkyu.employment.interview.app.quiz.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.mangkyu.employment.interview.app.common.pagination.ResponseMetaData;
import com.mangkyu.employment.interview.enums.common.EnumMapperValue;
import lombok.Builder;
@@ -11,11 +12,13 @@ import java.util.List;
public class GetQuizResponseHolder extends ResponseMetaData {
private final List<GetQuizResponse> quizList;
@JsonInclude(JsonInclude.Include.NON_NULL)
private final EnumMapperValue category;
@Builder
public GetQuizResponseHolder(final List<GetQuizResponse> quizList, final EnumMapperValue category, final boolean hasNext, final int page, final int size, final long totalElements) {
super(hasNext, page, size, totalElements);
public GetQuizResponseHolder(final List<GetQuizResponse> quizList, final EnumMapperValue category, final boolean hasNext, final int page, final int size, final int totalPages) {
super(hasNext, page, size, totalPages);
this.category = category;
this.quizList = quizList;
}

View File

@@ -0,0 +1,22 @@
package com.mangkyu.employment.interview.app.quiz.dto;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import java.util.Set;
@Getter
@Builder
@RequiredArgsConstructor
@NoArgsConstructor(force = true)
public class QuizSearchCondition {
private final String query;
private final Set<QuizCategory> categories;
private final Set<QuizLevel> levels;
}

View File

@@ -0,0 +1,33 @@
package com.mangkyu.employment.interview.app.quiz.dto;
import com.mangkyu.employment.interview.app.quiz.constants.QuizConstants;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import lombok.*;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotEmpty;
import java.util.Set;
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SearchQuizListRequest {
private String query;
private Set<QuizCategory> categories;
private Set<QuizLevel> levels;
@Builder.Default
@Range(min = QuizConstants.MIN_PAGE_NUMBER)
private int page = QuizConstants.DEFAULT_PAGE_NUMBER;
@Builder.Default
@Range(min = QuizConstants.MIN_PAGE_SIZE, max = QuizConstants.MAX_PAGE_SIZE)
private int size = QuizConstants.DEFAULT_PAGE_SIZE;
}

View File

@@ -1,12 +1,10 @@
package com.mangkyu.employment.interview.app.quiz.entity;
import com.mangkyu.employment.interview.app.answer.entity.Answer;
import com.mangkyu.employment.interview.app.common.entity.BaseEntity;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.*;
import javax.persistence.*;
import java.util.List;
@@ -19,6 +17,9 @@ import java.util.List;
@AllArgsConstructor
public class Quiz extends BaseEntity {
@Column(nullable = false)
private String resourceId;
private String title;
@Enumerated(EnumType.STRING)
@@ -29,4 +30,9 @@ public class Quiz extends BaseEntity {
@Enumerated(EnumType.STRING)
private List<QuizLevel> quizLevel;
@Setter
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id")
private Answer answer;
}

View File

@@ -8,9 +8,12 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
import java.util.Set;
public interface QuizRepository extends JpaRepository<Quiz, Long> {
public interface QuizRepository extends JpaRepository<Quiz, Long>, QuizRepositoryCustom {
Optional<Quiz> findByResourceId(final String resourceId);
Page<Quiz> findByQuizCategoryIs(final QuizCategory quizCategory, final Pageable pageable);

View File

@@ -0,0 +1,12 @@
package com.mangkyu.employment.interview.app.quiz.repository;
import com.mangkyu.employment.interview.app.quiz.dto.QuizSearchCondition;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
public interface QuizRepositoryCustom {
Page<Quiz> search(QuizSearchCondition condition, final Pageable pageable);
}

View File

@@ -0,0 +1,77 @@
package com.mangkyu.employment.interview.app.quiz.repository;
import com.mangkyu.employment.interview.app.quiz.dto.QuizSearchCondition;
import com.mangkyu.employment.interview.app.quiz.entity.QQuiz;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Set;
@Repository
@RequiredArgsConstructor
public class QuizRepositoryImpl implements QuizRepositoryCustom {
private final JPAQueryFactory query;
@Override
public Page<Quiz> search(final QuizSearchCondition condition, final Pageable pageable) {
final QQuiz qQuiz = QQuiz.quiz;
final List<Quiz> quizList = query.selectFrom(qQuiz)
.where(titleLike(qQuiz, condition.getQuery()))
.where(quizCategoriesIn(qQuiz, condition.getCategories()))
.where(quizLevelsIn(qQuiz, condition.getLevels()))
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
final long count = query.selectFrom(qQuiz)
.where(quizCategoriesIn(qQuiz, condition.getCategories()))
.where(quizLevelsIn(qQuiz, condition.getLevels()))
.stream().count();
return new PageImpl<>(quizList, pageable, count);
}
private BooleanExpression quizCategoriesIn(final QQuiz qQuiz, final Set<QuizCategory> categories) {
return categories == null || categories.isEmpty()
? null
: qQuiz.quizCategory.eqAny(
JPAExpressions.select(qQuiz.quizCategory)
.from(qQuiz)
.where(qQuiz.quizCategory.in(categories))
);
}
private BooleanBuilder quizLevelsIn(final QQuiz qQuiz, final Set<QuizLevel> quizLevels) {
return quizLevels == null || quizLevels.isEmpty()
? null
: quizLevelsMultipleIn(qQuiz, quizLevels);
}
private BooleanBuilder quizLevelsMultipleIn(final QQuiz qQuiz, final Set<QuizLevel> quizLevels) {
final BooleanBuilder booleanBuilder = new BooleanBuilder();
for (final QuizLevel quizLevel : quizLevels) {
booleanBuilder.or(qQuiz.quizLevel.contains(quizLevel));
}
return booleanBuilder;
}
private BooleanExpression titleLike(final QQuiz qQuiz, final String query) {
return StringUtils.isBlank(query) ? null : qQuiz.title.contains(query);
}
}

View File

@@ -41,9 +41,13 @@ public class QuizService {
quizRepository.save(quiz);
}
public GetQuizResponse getQuiz(final long id) throws QuizException {
final Quiz quiz = quizRepository.findById(id)
public Quiz findQuiz(final String resourceId) throws QuizException {
return quizRepository.findByResourceId(resourceId)
.orElseThrow(() -> new QuizException(CommonErrorCode.RESOURCE_NOT_FOUND));
}
public GetQuizResponse getQuiz(final String resourceId) throws QuizException {
final Quiz quiz = findQuiz(resourceId);
return QuizDtoConverter.convert(quiz, enumMapperFactory.getElement(EnumMapperKey.QUIZ_CATEGORY, quiz.getQuizCategory()));
}
@@ -61,7 +65,7 @@ public class QuizService {
.hasNext(quizPage.hasNext())
.page(quizPage.nextOrLastPageable().getPageNumber())
.size(quizPage.nextOrLastPageable().getPageSize())
.totalElements(quizPage.getTotalElements())
.totalPages(quizPage.getTotalPages())
.build();
}
@@ -110,4 +114,23 @@ public class QuizService {
.build();
}
public GetQuizResponseHolder searchQuizList(final SearchQuizListRequest searchRequest) {
final QuizSearchCondition condition = modelMapper.map(searchRequest, QuizSearchCondition.class);
final PageRequest pageRequest = PageRequest.of(searchRequest.getPage(), searchRequest.getSize());
final Page<Quiz> quizPage = quizRepository.search(condition, pageRequest);
final List<GetQuizResponse> quizResponseList = quizPage.getContent().stream()
.map(QuizDtoConverter::convert)
.collect(Collectors.toList());
return GetQuizResponseHolder.builder()
.quizList(quizResponseList)
.hasNext(quizPage.hasNext())
.page(quizPage.nextOrLastPageable().getPageNumber())
.size(quizPage.nextOrLastPageable().getPageSize())
.totalPages(quizPage.getTotalPages())
.build();
}
}

View File

@@ -25,6 +25,9 @@ import static com.mangkyu.employment.interview.app.quiz.constants.QuizConstants.
@AllArgsConstructor
public class User extends BaseEntity {
@Column(nullable = false)
private String resourceId;
@Column(unique = true)
private String email;

View File

@@ -2,6 +2,7 @@ package com.mangkyu.employment.interview.config.modelmapper;
import org.modelmapper.ModelMapper;
import org.modelmapper.config.Configuration.AccessLevel;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -13,7 +14,8 @@ public class ModelMapperConfig {
final ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
.setFieldAccessLevel(AccessLevel.PRIVATE)
.setFieldMatchingEnabled(true);
.setFieldMatchingEnabled(true)
.setMatchingStrategy(MatchingStrategies.STRICT);
return modelMapper;
}

View File

@@ -0,0 +1,17 @@
package com.mangkyu.employment.interview.config.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManager;
@Component
public class QueryDslConfig {
@Bean
public JPAQueryFactory jpaQueryFactory(final EntityManager em) {
return new JPAQueryFactory(em);
}
}

View File

@@ -0,0 +1,135 @@
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.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
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 org.springframework.test.web.servlet.setup.MockMvcBuilders;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(MockitoExtension.class)
class AnswerControllerTest {
@InjectMocks
private AnswerController target;
@Mock
private AnswerService answerService;
private MockMvc mockMvc;
@BeforeEach
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(target).build();
}
@Test
public void getAnswer() throws Exception {
// given
final String resourceId = UUID.randomUUID().toString();
final String url = "/answer/" + resourceId;
final GetAnswerResponse getAnswerResponse = GetAnswerResponse.builder()
.resourceId(resourceId)
.quizResourceId(UUID.randomUUID().toString())
.desc("설명")
.createdAt(System.currentTimeMillis())
.build();
doReturn(getAnswerResponse).when(answerService).getAnswer(resourceId);
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
);
// then
final ResultActions resultActions = result.andExpect(status().isOk());
final String stringResponse = resultActions.andReturn().getResponse().getContentAsString(StandardCharsets.UTF_8);
final GetAnswerResponse getAnswerResult = new Gson().fromJson(stringResponse, GetAnswerResponse.class);
assertThat(getAnswerResult.getResourceId()).isEqualTo(getAnswerResponse.getResourceId());
assertThat(getAnswerResult.getDesc()).isEqualTo(getAnswerResponse.getDesc());
assertThat(getAnswerResult.getCreatedAt()).isEqualTo(getAnswerResponse.getCreatedAt());
}
@ParameterizedTest
@MethodSource("provideParameters")
public void addAnswerFail_InvalidParameter(final String quizResourceId, final String desc) throws Exception {
// given
final String url = "/answer";
final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder()
.quizResourceId(quizResourceId)
.desc(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 = "/answer";
final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder()
.quizResourceId(UUID.randomUUID().toString())
.desc("desc")
.build();
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.post(url)
.content(new Gson().toJson(addAnswerRequest))
.contentType(MediaType.APPLICATION_JSON)
);
// then
result.andExpect(status().isCreated());
}
private static Stream<Arguments> 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();
}
}

View File

@@ -0,0 +1,68 @@
package com.mangkyu.employment.interview.app.answer.repository;
import com.mangkyu.employment.interview.app.answer.entity.Answer;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.app.quiz.repository.QuizRepository;
import com.mangkyu.employment.interview.testutils.EntityCreationUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import javax.persistence.EntityManager;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
class AnswerRepositoryTest {
@Autowired
private AnswerRepository answerRepository;
@Autowired
private QuizRepository quizRepository;
@Autowired
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.getDesc()).isEqualTo(answer.getDesc());
assertThat(result.getQuiz()).isEqualTo(quiz);
}
@Test
public void selectAnswerByQuizId() {
// given
final Quiz quiz = EntityCreationUtils.quiz();
final Quiz savedQuiz = quizRepository.save(quiz);
final Answer answer = EntityCreationUtils.answer(savedQuiz);
final Answer saveAnswer = answerRepository.save(answer);
savedQuiz.setAnswer(answer);
entityManager.flush();
// then
final Optional<Answer> result = answerRepository.findByResourceId(answer.getResourceId());
final Optional<Quiz> optionalQuizResult = quizRepository.findById(savedQuiz.getId());
assertThat(result.isPresent()).isTrue();
assertThat(result.get().getDesc()).isEqualTo(answer.getDesc());
assertThat(optionalQuizResult.isPresent()).isTrue();
assertThat(optionalQuizResult.get().getAnswer()).isNotNull();
assertThat(optionalQuizResult.get().getAnswer().getResourceId()).isEqualTo(saveAnswer.getResourceId());
}
}

View File

@@ -0,0 +1,80 @@
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.entity.Answer;
import com.mangkyu.employment.interview.app.answer.repository.AnswerRepository;
import com.mangkyu.employment.interview.app.common.erros.errorcode.CommonErrorCode;
import com.mangkyu.employment.interview.app.common.erros.exception.QuizException;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.app.quiz.service.QuizService;
import com.mangkyu.employment.interview.testutils.EntityCreationUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Optional;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.doReturn;
@ExtendWith(MockitoExtension.class)
class AnswerServiceTest {
@InjectMocks
private AnswerService answerService;
@Mock
private QuizService quizService;
@Mock
private AnswerRepository answerRepository;
@Test
public void addAnswerSuccess() throws QuizException {
// given
final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder()
.quizResourceId(UUID.randomUUID().toString())
.desc("desc")
.build();
final Quiz quiz = EntityCreationUtils.quiz();
doReturn(quiz).when(quizService).findQuiz(addAnswerRequest.getQuizResourceId());
// when
answerService.addAnswer(addAnswerRequest);
// then
}
@Test
public void getAnswerByQuizResourceIdFail_AnswerNotExists() {
// given
final String resourceId = UUID.randomUUID().toString();
doReturn(Optional.empty()).when(answerRepository).findByResourceId(resourceId);
// when
final QuizException result = assertThrows(QuizException.class, () -> answerService.getAnswer(resourceId));
// then
assertThat(result.getErrorCode()).isEqualTo(CommonErrorCode.RESOURCE_NOT_FOUND);
}
@Test
public void getAnswerByQuizResourceIdSuccess() throws QuizException {
// given
final Quiz quiz = EntityCreationUtils.quiz();
final Answer answer = EntityCreationUtils.answer(quiz);
doReturn(Optional.of(answer)).when(answerRepository).findByResourceId(answer.getResourceId());
// when
final GetAnswerResponse result = answerService.getAnswer(answer.getResourceId());
// then
assertThat(result.getDesc()).isEqualTo(answer.getDesc());
}
}

View File

@@ -25,6 +25,7 @@ import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import java.util.Collections;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doThrow;
@@ -53,11 +54,11 @@ class GlobalExceptionHandlerTest {
@Test
public void handleQuizException() throws Exception {
// given
final long quizId = -1;
final String url = "/quiz/" + quizId;
final String resourceId = UUID.randomUUID().toString();
final String url = "/quiz/" + resourceId;
final ErrorCode errorCode = CommonErrorCode.RESOURCE_NOT_FOUND;
doThrow(new QuizException(errorCode)).when(quizService).getQuiz(quizId);
doThrow(new QuizException(errorCode)).when(quizService).getQuiz(resourceId);
// when
final ResultActions result = mockMvc.perform(
@@ -77,11 +78,11 @@ class GlobalExceptionHandlerTest {
@Test
public void handleIllegalArgument() throws Exception {
// given
final long quizId = -1;
final String url = "/quiz/" + quizId;
final String resourceId = UUID.randomUUID().toString();
final String url = "/quiz/" + resourceId;
final String message = "message";
doThrow(new IllegalArgumentException(message)).when(quizService).getQuiz(quizId);
doThrow(new IllegalArgumentException(message)).when(quizService).getQuiz(resourceId);
// when
final ResultActions result = mockMvc.perform(

View File

@@ -29,6 +29,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import java.util.Arrays;
import java.util.Collections;
import java.util.UUID;
import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
@@ -55,14 +56,14 @@ class QuizControllerTest {
@Test
public void getQuiz() throws Exception {
// given
final long id = -1L;
final String url = "/quiz/" + id;
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))
.build();
doReturn(quizResponse).when(quizService).getQuiz(id);
doReturn(quizResponse).when(quizService).getQuiz(resourceId);
// when
final ResultActions result = mockMvc.perform(
@@ -74,7 +75,7 @@ class QuizControllerTest {
final String stringResponse = resultActions.andReturn().getResponse().getContentAsString();
final GetQuizResponse getQuizResult = new Gson().fromJson(stringResponse, GetQuizResponse.class);
assertThat(getQuizResult.getId()).isEqualTo(quizResponse.getId());
assertThat(getQuizResult.getResourceId()).isEqualTo(quizResponse.getResourceId());
assertThat(getQuizResult.getTitle()).isEqualTo(quizResponse.getTitle());
assertThat(getQuizResult.getCategory().getCode()).isEqualTo(quizResponse.getCategory().getCode());
assertThat(getQuizResult.getCreatedAt()).isEqualTo(quizResponse.getCreatedAt());
@@ -94,9 +95,6 @@ class QuizControllerTest {
.quizLevelList(Arrays.asList(QuizLevel.JUNIOR.name(), QuizLevel.SENIOR.name()))
.category(enumMapperValue(QuizCategory.JAVA))
.build();
final GetQuizResponseHolder getQuizResponseHolder = GetQuizResponseHolder.builder()
.quizList(Collections.singletonList(quizResponse))
.build();
// when
final ResultActions result = mockMvc.perform(
@@ -131,7 +129,7 @@ class QuizControllerTest {
.hasNext(quizPage.hasNext())
.page(quizPage.nextOrLastPageable().getPageNumber())
.size(quizPage.nextOrLastPageable().getPageSize())
.totalElements(quizPage.getTotalElements())
.totalPages(quizPage.getTotalPages())
.build();
doReturn(getQuizResponseHolder).when(quizService).getQuizList(any(GetQuizRequest.class));
@@ -198,6 +196,69 @@ class QuizControllerTest {
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 {
// 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))
.build();
// when
final ResultActions result = mockMvc.perform(
MockMvcRequestBuilders.get(url)
.param("size", String.valueOf(size))
.param("page", String.valueOf(page))
);
// then
result.andExpect(status().isBadRequest());
}
@Test
public 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))
.build();
final Pageable pageable = PageRequest.of(page, size);
final PageImpl<Quiz> quizPage = new PageImpl<>(Collections.emptyList(), pageable, 0);
final GetQuizResponseHolder getQuizResponseHolder = GetQuizResponseHolder.builder()
.quizList(Collections.singletonList(quizResponse))
.hasNext(quizPage.hasNext())
.page(quizPage.nextOrLastPageable().getPageNumber())
.size(quizPage.nextOrLastPageable().getPageSize())
.totalPages(quizPage.getTotalPages())
.build();
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))
);
// then
result.andExpect(status().isOk());
}
private static Stream<Arguments> provideParameters() {
return Stream.of(
Arguments.of(null, 10, 10),

View File

@@ -1,67 +1,125 @@
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.entity.Answer;
import com.mangkyu.employment.interview.app.quiz.dto.GetQuizResponse;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.enums.common.EnumMapperType;
import com.mangkyu.employment.interview.enums.common.EnumMapperValue;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import com.mangkyu.employment.interview.testutils.EntityCreationUtils;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
class QuizDtoConverterTest {
@Test
public void convertQuizToGetQuizResponseWithCategory() {
public void convertAddAnswerRequestToAnswer() {
// given
final long id = -1L;
final Quiz quiz = quiz(id);
final AddAnswerRequest addAnswerRequest = AddAnswerRequest.builder()
.quizResourceId(UUID.randomUUID().toString())
.desc("desc")
.build();
final Quiz quiz = EntityCreationUtils.quiz();
// when
final Answer result = QuizDtoConverter.convert(addAnswerRequest, quiz);
// then
assertThat(result.getQuiz()).isEqualTo(quiz);
assertThat(result.getDesc()).isEqualTo(addAnswerRequest.getDesc());
}
@Test
public void convertAnswerToGetAnswerResponse() {
// given
final Quiz quiz = EntityCreationUtils.quiz();
final Answer answer = EntityCreationUtils.answer(quiz);
// when
final GetAnswerResponse result = QuizDtoConverter.convert(answer);
// then
assertThat(result.getResourceId()).isEqualTo(answer.getResourceId());
assertThat(result.getQuizResourceId()).isEqualTo(answer.getQuiz().getResourceId());
assertThat(result.getCreatedAt()).isEqualTo(Timestamp.valueOf(answer.getCreatedAt()).getTime());
assertThat(result.getDesc()).isEqualTo(answer.getDesc());
}
@Test
public void convertQuizToGetQuizResponseWithCategory_AnswerExists() {
// given
final Quiz quiz = EntityCreationUtils.quiz();
final Answer answer = EntityCreationUtils.answer(quiz);
quiz.setAnswer(answer);
// when
final GetQuizResponse result = QuizDtoConverter.convert(quiz, enumMapperValue(quiz.getQuizCategory()));
// then
assertThat(result.getId()).isEqualTo(id);
assertThat(result.getResourceId()).isEqualTo(quiz.getResourceId());
assertThat(result.getTitle()).isEqualTo(quiz.getTitle());
assertThat(result.getQuizLevelList().size()).isEqualTo(quiz.getQuizLevel().size());
assertThat(result.getCreatedAt()).isEqualTo(Timestamp.valueOf(quiz.getCreatedAt()).getTime());
assertThat(result.getCategory().getCode()).isEqualTo(enumMapperValue(quiz.getQuizCategory()).getCode());
assertThat(result.getAnswerResourceId()).isEqualTo(answer.getResourceId());
}
@Test
public void convertQuizToGetQuizResponse() {
public void convertQuizToGetQuizResponseWithCategory_NotAnswerExists() {
// given
final long id = -1L;
final Quiz quiz = quiz(id);
final Quiz quiz = EntityCreationUtils.quiz();
// when
final GetQuizResponse result = QuizDtoConverter.convert(quiz, enumMapperValue(quiz.getQuizCategory()));
// then
assertThat(result.getResourceId()).isEqualTo(quiz.getResourceId());
assertThat(result.getTitle()).isEqualTo(quiz.getTitle());
assertThat(result.getQuizLevelList().size()).isEqualTo(quiz.getQuizLevel().size());
assertThat(result.getCreatedAt()).isEqualTo(Timestamp.valueOf(quiz.getCreatedAt()).getTime());
assertThat(result.getCategory().getCode()).isEqualTo(enumMapperValue(quiz.getQuizCategory()).getCode());
assertThat(result.getAnswerResourceId()).isNull();
}
@Test
public void convertQuizToGetQuizResponse_AnswerExists() {
// given
final Quiz quiz = EntityCreationUtils.quiz();
final Answer answer = EntityCreationUtils.answer(quiz);
quiz.setAnswer(answer);
// when
final GetQuizResponse result = QuizDtoConverter.convert(quiz);
// then
assertThat(result.getId()).isEqualTo(id);
assertThat(result.getResourceId()).isEqualTo(quiz.getResourceId());
assertThat(result.getTitle()).isEqualTo(quiz.getTitle());
assertThat(result.getQuizLevelList().size()).isEqualTo(quiz.getQuizLevel().size());
assertThat(result.getCreatedAt()).isEqualTo(Timestamp.valueOf(quiz.getCreatedAt()).getTime());
assertThat(result.getCategory()).isNull();
assertThat(result.getAnswerResourceId()).isEqualTo(answer.getResourceId());
}
private Quiz quiz(final long id) {
final Quiz quiz = Quiz.builder()
.title("quiz")
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
@Test
public void convertQuizToGetQuizResponse_AnswerNotExists() {
// given
final Quiz quiz = EntityCreationUtils.quiz();
ReflectionTestUtils.setField(quiz, "id", id);
ReflectionTestUtils.setField(quiz, "createdAt", LocalDateTime.now());
return quiz;
// when
final GetQuizResponse result = QuizDtoConverter.convert(quiz);
// then
assertThat(result.getResourceId()).isEqualTo(quiz.getResourceId());
assertThat(result.getTitle()).isEqualTo(quiz.getTitle());
assertThat(result.getQuizLevelList().size()).isEqualTo(quiz.getQuizLevel().size());
assertThat(result.getCreatedAt()).isEqualTo(Timestamp.valueOf(quiz.getCreatedAt()).getTime());
assertThat(result.getCategory()).isNull();
assertThat(result.getAnswerResourceId()).isNull();
}
private EnumMapperValue enumMapperValue(final EnumMapperType enumMapperType) {

View File

@@ -1,78 +1,204 @@
package com.mangkyu.employment.interview.app.quiz.repository;
import com.mangkyu.employment.interview.app.quiz.dto.QuizSearchCondition;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.config.querydsl.QueryDslConfig;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import com.mangkyu.employment.interview.testutils.EntityCreationUtils;
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.orm.jpa.DataJpaTest;
import org.springframework.context.annotation.Import;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import java.util.*;
import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
@Import({QueryDslConfig.class})
class QuizRepositoryTest {
@Autowired
private QuizRepository quizRepository;
@ParameterizedTest
@MethodSource("validQuizParameters")
public void search_QueryOnly_QuizValid(final String query) {
// given
final QuizCategory quizCategory = QuizCategory.JAVA;
initForPaging(quizCategory);
final QuizSearchCondition searchCondition = QuizSearchCondition.builder()
.query(query)
.categories(null)
.levels(null)
.build();
boolean hasNext = true;
int page = 0;
int size = 3;
long result = 0;
while (hasNext) {
final PageRequest pageRequest = PageRequest.of(page++, size);
final Page<Quiz> pageQuiz = quizRepository.search(searchCondition, pageRequest);
result += pageQuiz.getContent().size();
hasNext = pageQuiz.hasNext();
}
// when
// then
assertThat(result).isEqualTo(8);
}
@ParameterizedTest
@MethodSource("invalidQuizParameters")
public void search_QueryOnly_QuizInvalid(final String query) {
// given
final QuizCategory quizCategory = QuizCategory.JAVA;
initForPaging(quizCategory);
final QuizSearchCondition searchCondition = QuizSearchCondition.builder()
.query(query)
.categories(null)
.levels(null)
.build();
boolean hasNext = true;
int page = 0;
int size = 3;
long result = 0;
while (hasNext) {
final PageRequest pageRequest = PageRequest.of(page++, size);
final Page<Quiz> pageQuiz = quizRepository.search(searchCondition, pageRequest);
result += pageQuiz.getContent().size();
hasNext = pageQuiz.hasNext();
}
// when
// then
assertThat(result).isEqualTo(0);
}
@Test
public void search_LevelsOnly() {
// given
final QuizCategory quizCategory = QuizCategory.JAVA;
initForPaging(quizCategory);
final QuizSearchCondition searchCondition = QuizSearchCondition.builder()
.query(null)
.categories(Collections.emptySet())
.levels(new HashSet<>(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR)))
.build();
boolean hasNext = true;
int page = 0;
int size = 3;
long result = 0;
while (hasNext) {
final PageRequest pageRequest = PageRequest.of(page++, size);
final Page<Quiz> pageQuiz = quizRepository.search(searchCondition, pageRequest);
result += pageQuiz.getContent().size();
hasNext = pageQuiz.hasNext();
}
// when
// then
assertThat(result).isEqualTo(6);
}
@Test
public void search_CategoriesOnly() {
// given
final QuizCategory quizCategory = QuizCategory.JAVA;
initForPaging(quizCategory);
final QuizSearchCondition searchCondition = QuizSearchCondition.builder()
.query(null)
.categories(new HashSet<>(Arrays.asList(QuizCategory.ALGORITHM, QuizCategory.DATABASE)))
.levels(Collections.emptySet())
.build();
boolean hasNext = true;
int page = 0;
int size = 3;
long result = 0;
while (hasNext) {
final PageRequest pageRequest = PageRequest.of(page++, size);
final Page<Quiz> pageQuiz = quizRepository.search(searchCondition, pageRequest);
result += pageQuiz.getContent().size();
hasNext = pageQuiz.hasNext();
}
// when
// then
assertThat(result).isEqualTo(2);
}
@Test
public void search_AllEmpty() {
// given
final QuizCategory quizCategory = QuizCategory.JAVA;
initForPaging(quizCategory);
final QuizSearchCondition searchCondition = QuizSearchCondition.builder()
.query(null)
.categories(Collections.emptySet())
.levels(Collections.emptySet())
.build();
boolean hasNext = true;
int page = 0;
int size = 3;
long result = 0;
while (hasNext) {
final PageRequest pageRequest = PageRequest.of(page++, size);
final Page<Quiz> pageQuiz = quizRepository.search(searchCondition, pageRequest);
result += pageQuiz.getContent().size();
hasNext = pageQuiz.hasNext();
}
// when
// then
assertThat(result).isEqualTo(8);
}
@Test
public void selectByResourceId() {
// given
final Quiz quiz = EntityCreationUtils.quiz();
quizRepository.save(quiz);
// when
final Optional<Quiz> result = quizRepository.findByResourceId(quiz.getResourceId());
// then
assertThat(result.isPresent()).isTrue();
assertThat(result.get().getTitle()).isEqualTo(quiz.getTitle());
}
@Test
public void selectQuizListByCategoryWithPaging() {
// given
final QuizCategory quizCategory = QuizCategory.JAVA;
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(quizCategory)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(quizCategory)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(quizCategory)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(quizCategory)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(quizCategory)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(quizCategory)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(quizCategory)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(quizCategory)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(QuizCategory.ALGORITHM)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
quizRepository.save(Quiz.builder()
.title("quiz4")
.quizCategory(QuizCategory.DATABASE)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build());
initForPaging(quizCategory);
// when
boolean hasNext = true;
@@ -94,26 +220,10 @@ class QuizRepositoryTest {
@Test
public void selectQuizCountByCategory() {
// given
final Quiz quiz1 = Quiz.builder()
.title("quiz1")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz2 = Quiz.builder()
.title("quiz2")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz3 = Quiz.builder()
.title("quiz3")
.quizCategory(QuizCategory.DATABASE)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz4 = Quiz.builder()
.title("quiz4")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz1 = EntityCreationUtils.quiz("quiz1", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz2 = EntityCreationUtils.quiz("quiz2", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz3 = EntityCreationUtils.quiz("quiz3", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz4 = EntityCreationUtils.quiz("quiz4", QuizCategory.DATABASE, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR));
quizRepository.save(quiz1);
quizRepository.save(quiz2);
@@ -132,11 +242,7 @@ class QuizRepositoryTest {
@Test
public void insertQuiz() {
// given
final Quiz quiz = Quiz.builder()
.title("quiz")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz = EntityCreationUtils.quiz();
// when
final Quiz result = quizRepository.save(quiz);
@@ -149,26 +255,10 @@ class QuizRepositoryTest {
@Test
public void selectQuizNotInAndLevelAndQuizCategory() {
// given
final Quiz quiz1 = Quiz.builder()
.title("quiz1")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz2 = Quiz.builder()
.title("quiz2")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz3 = Quiz.builder()
.title("quiz3")
.quizCategory(QuizCategory.DATABASE)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz4 = Quiz.builder()
.title("quiz4")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz1 = EntityCreationUtils.quiz("quiz1", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz2 = EntityCreationUtils.quiz("quiz2", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz3 = EntityCreationUtils.quiz("quiz3", QuizCategory.DATABASE, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz4 = EntityCreationUtils.quiz("quiz4", QuizCategory.JAVA, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz savedQuiz1 = quizRepository.save(quiz1);
final Quiz savedQuiz2 = quizRepository.save(quiz2);
@@ -193,26 +283,10 @@ class QuizRepositoryTest {
@Test
public void selectQuizNotInAndLevel() {
// given
final Quiz quiz1 = Quiz.builder()
.title("quiz1")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz2 = Quiz.builder()
.title("quiz2")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz3 = Quiz.builder()
.title("quiz3")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz4 = Quiz.builder()
.title("quiz4")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz1 = EntityCreationUtils.quiz("quiz1", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz2 = EntityCreationUtils.quiz("quiz2", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz3 = EntityCreationUtils.quiz("quiz3", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz4 = EntityCreationUtils.quiz("quiz4", QuizCategory.JAVA, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz savedQuiz1 = quizRepository.save(quiz1);
final Quiz savedQuiz2 = quizRepository.save(quiz2);
@@ -231,26 +305,10 @@ class QuizRepositoryTest {
@Test
public void selectQuizLevel() {
// given
final Quiz quiz1 = Quiz.builder()
.title("quiz1")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz2 = Quiz.builder()
.title("quiz2")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz3 = Quiz.builder()
.title("quiz3")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz4 = Quiz.builder()
.title("quiz4")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final Quiz quiz1 = EntityCreationUtils.quiz("quiz1", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz2 = EntityCreationUtils.quiz("quiz2", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz3 = EntityCreationUtils.quiz("quiz3", QuizCategory.JAVA, Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR));
final Quiz quiz4 = EntityCreationUtils.quiz("quiz4", QuizCategory.JAVA, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR));
quizRepository.save(quiz1);
quizRepository.save(quiz2);
@@ -264,4 +322,33 @@ class QuizRepositoryTest {
assertThat(unsolvedQuizList.size()).isEqualTo(3);
}
private void initForPaging(final QuizCategory quizCategory) {
quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR)));
quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR)));
quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR)));
quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR)));
quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR)));
quizRepository.save(EntityCreationUtils.quiz("quiz", quizCategory, Arrays.asList(QuizLevel.JUNIOR, QuizLevel.SENIOR)));
quizRepository.save(EntityCreationUtils.quiz("quiz", QuizCategory.ALGORITHM, Collections.singletonList(QuizLevel.SENIOR)));
quizRepository.save(EntityCreationUtils.quiz("quiz", QuizCategory.DATABASE, Collections.singletonList(QuizLevel.SENIOR)));
}
private static Stream<Arguments> validQuizParameters() {
return Stream.of(
Arguments.of("q"),
Arguments.of("qui"),
Arguments.of("ui"),
Arguments.of("iz")
);
}
private static Stream<Arguments> invalidQuizParameters() {
return Stream.of(
Arguments.of("banana"),
Arguments.of("taxi"),
Arguments.of("mangkyu"),
Arguments.of("gosudeath")
);
}
}

View File

@@ -7,12 +7,12 @@ import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.app.quiz.repository.QuizRepository;
import com.mangkyu.employment.interview.app.solvedquiz.entity.SolvedQuiz;
import com.mangkyu.employment.interview.app.solvedquiz.repository.SolvedQuizRepository;
import com.mangkyu.employment.interview.config.modelmapper.ModelMapperConfig;
import com.mangkyu.employment.interview.enums.common.EnumMapperKey;
import com.mangkyu.employment.interview.enums.common.EnumMapperValue;
import com.mangkyu.employment.interview.enums.factory.EnumMapperFactory;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
@@ -20,7 +20,6 @@ import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import org.modelmapper.ModelMapper;
import org.modelmapper.config.Configuration;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
@@ -49,29 +48,78 @@ class QuizServiceTest {
@Mock
private EnumMapperFactory enumMapperFactory;
@Spy
private ModelMapper modelMapper;
private ModelMapper modelMapper = new ModelMapperConfig().modelMapper();
private final Long userId = -1L;
private final QuizLevel quizLevel = QuizLevel.NEW;
private final int quizSize = 3;
@BeforeEach
public void init() {
modelMapper.getConfiguration()
.setFieldAccessLevel(Configuration.AccessLevel.PRIVATE)
.setFieldMatchingEnabled(true);
@Test
public void searchQuizList() {
// given
final int page = 0;
final int size = 20;
final List<Quiz> quizList = quizList();
final SearchQuizListRequest request = SearchQuizListRequest.builder()
.query("query")
.categories(new HashSet<>(Arrays.asList(QuizCategory.CULTURE, QuizCategory.JAVA)))
.levels(new HashSet<>(Arrays.asList(QuizLevel.NEW, QuizLevel.SENIOR)))
.page(0)
.size(20)
.build();
final Pageable pageable = PageRequest.of(page, size);
final PageImpl<Quiz> quizPage = new PageImpl<>(quizList(), pageable, quizList.size());
doReturn(quizPage).when(quizRepository).search(any(QuizSearchCondition.class), any(PageRequest.class));
// when
final GetQuizResponseHolder result = quizService.searchQuizList(request);
// then
assertThat(result.getQuizList().size()).isEqualTo(quizList.size());
}
@Test
public void findQuizEntityFail_NotExists() {
// given
final Quiz quiz = quiz(-1L);
doReturn(Optional.empty()).when(quizRepository).findByResourceId(quiz.getResourceId());
// when
final QuizException result = assertThrows(QuizException.class, () -> quizService.findQuiz(quiz.getResourceId()));
// then
assertThat(result.getErrorCode()).isEqualTo(CommonErrorCode.RESOURCE_NOT_FOUND);
}
@Test
public void findQuizEntitySuccess() throws QuizException {
// given
final long id = -1L;
final Quiz quiz = quiz(id);
doReturn(Optional.of(quiz)).when(quizRepository).findByResourceId(quiz.getResourceId());
// when
final Quiz result = quizService.findQuiz(quiz.getResourceId());
// then
assertThat(result.getResourceId()).isEqualTo(quiz.getResourceId());
assertThat(result.getTitle()).isEqualTo(quiz.getTitle());
assertThat(result.getCreatedAt()).isEqualTo(quiz.getCreatedAt());
}
@Test
public void getQuizFail_NotExists() {
// given
final long id = -1L;
final Quiz quiz = quiz(id);
final Quiz quiz = quiz(-1L);
doReturn(Optional.empty()).when(quizRepository).findById(id);
doReturn(Optional.empty()).when(quizRepository).findByResourceId(quiz.getResourceId());
// when
final QuizException result = assertThrows(QuizException.class, () -> quizService.getQuiz(id));
final QuizException result = assertThrows(QuizException.class, () -> quizService.getQuiz(quiz.getResourceId()));
// then
assertThat(result.getErrorCode()).isEqualTo(CommonErrorCode.RESOURCE_NOT_FOUND);
@@ -83,13 +131,13 @@ class QuizServiceTest {
final long id = -1L;
final Quiz quiz = quiz(id);
doReturn(Optional.of(quiz)).when(quizRepository).findById(id);
doReturn(Optional.of(quiz)).when(quizRepository).findByResourceId(quiz.getResourceId());
// when
final GetQuizResponse result = quizService.getQuiz(id);
final GetQuizResponse result = quizService.getQuiz(quiz.getResourceId());
// then
assertThat(result.getId()).isEqualTo(id);
assertThat(result.getResourceId()).isEqualTo(quiz.getResourceId());
assertThat(result.getTitle()).isEqualTo(quiz.getTitle());
assertThat(result.getCategory()).isEqualTo(enumMapperFactory.getElement(EnumMapperKey.QUIZ_CATEGORY, quiz.getQuizCategory()));
assertThat(result.getQuizLevelList().size()).isEqualTo(quiz.getQuizLevel().size());
@@ -268,6 +316,7 @@ class QuizServiceTest {
.build();
ReflectionTestUtils.setField(quiz, "id", id);
ReflectionTestUtils.setField(quiz, "resourceId", UUID.randomUUID().toString());
ReflectionTestUtils.setField(quiz, "createdAt", LocalDateTime.now());
return quiz;
}

View File

@@ -1,19 +1,15 @@
package com.mangkyu.employment.interview.app.solvedquiz.repository;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import com.mangkyu.employment.interview.app.quiz.repository.QuizRepository;
import com.mangkyu.employment.interview.app.solvedquiz.entity.SolvedQuiz;
import com.mangkyu.employment.interview.app.user.entity.User;
import com.mangkyu.employment.interview.app.user.repository.UserRepository;
import com.mangkyu.employment.interview.testutils.EntityCreationUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import java.util.Arrays;
import java.util.Collections;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
@@ -31,23 +27,13 @@ class SolvedQuizRepositoryTest {
@Test
public void insertQuiz() {
// given
final User user = User.builder()
.email("minkyu@test.com")
.quizLevel(QuizLevel.JUNIOR)
.solvedQuizList(Collections.emptyList())
.build();
final Quiz quiz = Quiz.builder()
.title("quiz")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
final User user = EntityCreationUtils.user();
final Quiz quiz = EntityCreationUtils.quiz();
final Quiz quizResult = quizRepository.save(quiz);
final User userResult = userRepository.save(user);
final SolvedQuiz solvedQuiz = SolvedQuiz.builder()
.user(userResult)
.quiz(quizResult)
.build();
final SolvedQuiz solvedQuiz = EntityCreationUtils.solvedQuiz(quiz, user);
// when
final SolvedQuiz result = solvedQuizRepository.save(solvedQuiz);

View File

@@ -3,7 +3,7 @@ package com.mangkyu.employment.interview.app.user.repository;
import com.mangkyu.employment.interview.app.user.entity.User;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizDay;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import com.mangkyu.employment.interview.testutils.EntityCreationUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@@ -20,7 +20,6 @@ class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void selectUserListByCycle() {
// given
@@ -34,13 +33,7 @@ class UserRepositoryTest {
quizCategorySet.add(QuizCategory.DATABASE);
quizCategorySet.add(QuizCategory.EXPERIENCE);
final User user = User.builder()
.email("minkyu@test.com")
.quizLevel(QuizLevel.JUNIOR)
.quizSize(5)
.quizDaySet(quizDaySet)
.quizCategorySet(quizCategorySet)
.build();
final User user = EntityCreationUtils.user(5, quizDaySet, quizCategorySet);
final User savedUser = userRepository.save(user);
userRepository.save(savedUser);
@@ -67,13 +60,7 @@ class UserRepositoryTest {
quizCategorySet.add(QuizCategory.DATABASE);
quizCategorySet.add(QuizCategory.EXPERIENCE);
final User user = User.builder()
.email("minkyu@test.com")
.quizLevel(QuizLevel.JUNIOR)
.quizSize(5)
.quizDaySet(quizDaySet)
.quizCategorySet(quizCategorySet)
.build();
final User user = EntityCreationUtils.user(5, quizDaySet, quizCategorySet);
// when
final User result = userRepository.save(user);
@@ -97,12 +84,7 @@ class UserRepositoryTest {
quizCategorySet.add(QuizCategory.DATABASE);
quizCategorySet.add(QuizCategory.EXPERIENCE);
final User user = User.builder()
.email("minkyu@test.com")
.quizLevel(QuizLevel.JUNIOR)
.quizDaySet(quizDaySet)
.quizCategorySet(quizCategorySet)
.build();
final User user = EntityCreationUtils.user(3, quizDaySet, quizCategorySet);
final User savedUser = userRepository.save(user);
savedUser.setIsEnable(false);

View File

@@ -0,0 +1,86 @@
package com.mangkyu.employment.interview.testutils;
import com.mangkyu.employment.interview.app.answer.entity.Answer;
import com.mangkyu.employment.interview.app.quiz.entity.Quiz;
import com.mangkyu.employment.interview.app.solvedquiz.entity.SolvedQuiz;
import com.mangkyu.employment.interview.app.user.entity.User;
import com.mangkyu.employment.interview.enums.value.QuizCategory;
import com.mangkyu.employment.interview.enums.value.QuizDay;
import com.mangkyu.employment.interview.enums.value.QuizLevel;
import org.springframework.test.util.ReflectionTestUtils;
import java.time.LocalDateTime;
import java.util.*;
public final class EntityCreationUtils {
public static Quiz quiz() {
final Quiz quiz = Quiz.builder()
.resourceId(UUID.randomUUID().toString())
.title("quiz")
.quizCategory(QuizCategory.JAVA)
.quizLevel(Arrays.asList(QuizLevel.NEW, QuizLevel.JUNIOR, QuizLevel.SENIOR))
.build();
ReflectionTestUtils.setField(quiz, "createdAt", LocalDateTime.now());
return quiz;
}
public static Quiz quiz(final String title, final QuizCategory category, final List<QuizLevel> quizLevelList) {
final Quiz quiz = Quiz.builder()
.resourceId(UUID.randomUUID().toString())
.title(title)
.quizCategory(category)
.quizLevel(quizLevelList)
.build();
ReflectionTestUtils.setField(quiz, "createdAt", LocalDateTime.now());
return quiz;
}
public static User user() {
final User user = User.builder()
.resourceId(UUID.randomUUID().toString())
.email("minkyu@test.com")
.quizLevel(QuizLevel.JUNIOR)
.solvedQuizList(Collections.emptyList())
.build();
ReflectionTestUtils.setField(user, "createdAt", LocalDateTime.now());
return user;
}
public static User user(final int quizSize, final Set<QuizDay> daySet, final Set<QuizCategory> categorySet) {
final User user = User.builder()
.resourceId( UUID.randomUUID().toString())
.email("minkyu@test.com")
.quizLevel(QuizLevel.JUNIOR)
.solvedQuizList(Collections.emptyList())
.quizSize(quizSize)
.quizDaySet(daySet)
.quizCategorySet(categorySet)
.build();
ReflectionTestUtils.setField(user, "createdAt", LocalDateTime.now());
return user;
}
public static SolvedQuiz solvedQuiz(final Quiz quiz, final User user) {
return SolvedQuiz.builder()
.quiz(quiz)
.user(user)
.build();
}
public static Answer answer(final Quiz quiz) {
final Answer answer = Answer.builder()
.resourceId(UUID.randomUUID().toString())
.quiz(quiz)
.desc("desc")
.build();
ReflectionTestUtils.setField(answer, "createdAt", LocalDateTime.now());
return answer;
}
}