Merge branch 'master' into master-web
This commit is contained in:
23
build.gradle
23
build.gradle
@@ -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
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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(
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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")
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user