Skip to content

Commit

Permalink
[BE] refactor: 필수가 아닌 질문이 작성되지 않을 경우 저장하지 않도록 변경 (#641)
Browse files Browse the repository at this point in the history
* refactor: 리뷰의 답변 매핑 시, 필수가 아닌 질문 중 작성되지 않은 질문을 매핑하지 않도록 변경

* refactor: 사용하지 않는 상수 제거

* test: 필수가 아닌 질문이 답변되지 않을 경우 매핑 로직에 대한 테스트 작성

* [FE] feature: 리뷰 연결, 목록, 상세 페이지의 반응형 레이아웃 구현 (#630)

* feat: ReviewZonePage 미디어 쿼리 적용

* feat: Footer에 미디어 쿼리 적용

* refactor: ReviewGuide 사이즈 조절

* feat: 리뷰미 Topbar 로고에 미디어 쿼리 적용

* feat: PasswordModal에 미디어 쿼리 적용

* feat: ContentModal에 미디어 쿼리 적용

* refactor: AlertModal의 확인 버튼 minWidth를 % 단위로 수정

* feat: DetailedReviewPage에 반응형 도입

* feat: ReviewListPage에 반응형 도입

* refactor: DetailedReviewPage의 Description에 반응형 padding 추가

* refactor: 변경된 media 유틸 형식에 맞게 미디어 쿼리 코드 수정 및 사이즈 내림차순 정렬

* refactor: 누락된 파일 업로드

* refactor: ContentModal에 스타일 prop 추가

* refactor: PasswordModal 스타일 수정 - maxWidth 설정 및 디테일 조절

* fix: 공통 컴포넌트인 ContentModal에서 특정 모달 스타일을 위한 코드 제거

* refactor: ContentModal에 style prop 추가

* refactor: ContentModal의 미디어 쿼리 적용에 따른 padding 감소를 무효화하기 위한 PasswordModal 코드 추가, 에러 메세지를 보여주는 스타일 개선

* [FE] refactor: scrollToTop을 유틸함수로 분리 (#637)

* refactor: scrollToTop을 유틸 함수로 변경

* refactor: scrollToTop 유틸 함수 적용

* refactor: scrollToTop 관련 파일명 변경 및 export 방식 변경

* refactor: debounce 함수 선언문을 함수 표현문으로 변경 및 export 방식 변경

* refactor: isExistentElement export 방식 변경

* [BE] refactor: 패키지 `mapper`, `validator` 분리 (#598)

* refactor: 패키지 `mapper`, `validator` 분리

* refactor: TemplateMapper 패키지명 변경

* refactor: PreviewGenerator 사용되는 패키지로 이동

* [FE] feat: 리뷰 홈 페이지 반응형 구현 (#633)

* feat: 320px 이하 화면 크기를 위한 xxSmall 반응형 구현

* refactor: 상위 컨테이너에서 자식 요소로 스타일 지정 이동

* feat: 425px 이하 화면 크기를 위한 xSmall 반응형 구현

* feat: 768px 이하 화면 크기를 위한 small 반응형 구현

* refactor: 캐러셀 height 조정

* feat: 1024px 이하 화면 크기를 위한 medium 반응형 구현

* design: 캐러셀 position 제거 및 위치 조정

* feat: 화면 크기에 따른 홈 페이지 내 AlertModal 반응형 구현

* refactor: 수정된 media 유틸 적용

* design: URL 복사하기 버튼을 "리뷰 요청 URL" 텍스트 옆으로 이동

* design: 캐러셀 영역과 리뷰 폼 사이 간격 증가

* [FE] design : body에 단어 단위로 줄 바꿈 되는 속성 추가  (#635)

* design: body에 word-break:kepp-all 적용

* design : body에 단어 단위 줄 넘기 추가로 인해 이전에 적용된 word-break 삭제

* design:ReviewZoneURLModal data에 word-break: break-all 적용

* [FE] fix: 리뷰 제출 확인 모달 border, border-radius 복원 (#647)

* design: ReviewWritingCardLayout 에 border 속성 적용

* design : CardSlider에 border 속성 삭제

* refactor: ReviewWritingCard에 children props 추가

- ReviewWritingCardLayout에 적용한 border를 리뷰 작성 폼에 맞추어서 넣기 위해서, 이전/다음/제출/제출전 확인 버튼을 담은 ButtonContainer를 ReviewWritingCard의 children으로 주어야함

* [FE] feature: Breadcrumb 컴포넌트에 반응형 추가 (#645)

* feat: Breadcrumb 컴포넌트에 반응형 코드 추가

* chore: 폰트 크기에 theme 반영

* [BE] refactor: DB 접근을 최소화 하도록 개선 (#617)

* refactor: ReviewDetailMapper DB 쿼리 접근을 줄일 수 있도록 리팩토링

* refactor: ReviewListMapper DB 쿼리 접근을 줄일 수 있도록 리팩토링

* refactor: ReviewListMapper stream 연산 개선

* refactor: ReviewDetailMapper 불필요한 검증 로직 제거

* refactor: 사용하지 않는 쿼리 삭제 및 left join 제거

* refactor: optionGroup -> optionGroup 대신 Function::identity 사용

* test: 네이티브 쿼리 테스트 작성 및 사용하지 않는 쿼리 테스트 삭제

* style: 주석 제거

* Revert "refactor: ReviewListMapper stream 연산 개선"

This reverts commit d472d1f.

* refactor: ReviewCategoryResponse 매핑 구조 변경

* [FE] fix : 리뷰 제출 페이지에서 리뷰 대상(프로젝트,리뷰이)사라지는 오류 해결 (#651)

* fix: CardFormWrapper 스타일을 만들어서 CardForm overflow로 인한 스타일 오류를 수정

* design: 320px에서 리뷰 제출 버튼 폰트 사이즈 수정

* design: 리뷰 작성 폼 버튼 반응형 스타일 변경

* fix: 리뷰 카드 border가 사라지는 오류 수정

* fix: 320px 에서 마지막 카드에 대한 캐러셀 오류 수정

- 오류: 마지막 카드로 넘길 때,  320px 뷰포트에서 카드가 다 넘어가지 않는 오류
- 오류 원인: 마지막 카드 순서에서 캐러셀의 카드 width가 CardForm의 width보다 작아짐
- 해결: Slide 스타일 컴포넌트에 width를 부모의 100%로 지정

* style: styelint 적용되지 않은 코드에 이를 적용 (#657)

* [FE] fix : 반응형 오류 및 디자인 수정, 리뷰 목록 페이지 Description border-radius 오류 수정 (#655)

* fix: ContentModal min-height 단위를 vh에서 %로 수정

- 모바일 브라우저 네이티브 바에 의해 동적으로 변하는 뷰포트 높이에 맞추기 위해  vh가 아닌 %를 사용

* fix: 리뷰 상세 페이지  Description 스타일 컴포넌트의 border radius 오류 수정

* [FE] feat: 리뷰 목록 페이지에서, 받은 리뷰가 없을 때 보여주는 널 페이지에 반응형 적용 및 그에 따른 기존 스타일 일부 수정 (#653)

* feat: 리뷰 목록 페이지에서, 받은 리뷰가 없을 때 보여주는 널 페이지에 반응형 적용 및 그에 따른 기존 스타일 일부 수정

* fix: min-height을 상속받도록 변경

* [FE] feat: 모바일 환경에서 홈 페이지 캐러셀 드래그 기능 구현 (#658)

* feat: 모바일 환경에서 캐러셀 드래그 기능 구현

* refactor: 이전, 다음 화살표 이미지 추가 후 적용

* refactor: MouseEvent 제거

* chore: 설명이 필요한 구간 주석 추가

* refactor: translate3d px을 rem으로 단위 변경

* refactor: 캐러셀 버튼에 대한 이미지 내용임을 알려주기 위해 alt 수정

* [FE] fix : ErrorAlertModal 가운데 정렬 오류 수정 (#662)

* style: styelint 적용되지 않은 코드에 이를 적용

* fix: ErrorAlertModal의 가운데 정렬 오류 수정

- Contents에 width를 부모 너비로 설정하지 않아 오류가 발생

* design: SubmitErrorModal의 Message width 지정

* design: 425px이하에서 ErrorAlerModal 느낌표 아이콘 사이즈 조정

* chore: CardForm 모바일에서 margin:0 auto 삭제

- 부모에서 flex로 가운데 정렬하고 있어서 필요 없음

* fix: SubmitCheckModal에서 줄넘김 되도록 width 설정 변경

* [FE] refactor: Footer 반응형 경계값을 small(태블릿 세로 모드)로 수정 (#660)

* refactor: Footer 반응형 경계값을 small(태블릿 세로 모드)로 수정

* refactor: Footer 반응형 경계를 xSmall(모바일)로 수정

* chore: stylelint 적용

* [FE] feat: 리뷰 작성 완료 페이지 반응형 구현 (#672)

* feat: 작성 완료 페이지에 사용될 스마일 이미지 추가

* feat: 리뷰 작성 완료 페이지에 스마일 이미지 적용 및 반응형 구현

* feat: 리뷰 작성 완료 페이지 반응형 max-width 425px 기준으로 적용

* chore: 불필요한 코드 제거

* [FE] feat: Brotli 압축 적용 (#680)

* ci: brotli-webpack-plugin 설치

* fix: 웹팩 설정에 중복된 sentry 속성 삭제

* feat: Brotli 압축 적용

- Brotli를 지원하지 않는 브라우저를 대비 해, 원본 파일을 삭제하지 않도록 함

* feat: 파비콘도 Brotli로 압축

* fix: Brotli threshold 수정

* [BE] fix: `Internal server error` 오타 수정 (#648)

* design: 체크 선택 시, AlertModal 내 버튼 색상을 primary 색상으로 변경 (#678)

* [BE] infra: 어플리케이션 도커로 배포 (#673)

* infra: 어플리케이션 도커로 배포

Co-authored-by: Kimprodp <145949635+kimprodp@users.noreply.github.com>

* infra: APPLICATION_DIRECTORY 경로 수정

* infra: 오타 수정

---------

Co-authored-by: Kimprodp <145949635+kimprodp@users.noreply.github.com>
Co-authored-by: KIMGYUTAE <kiimwf0819@gmail.com>

* [BE] fix: CD 스크립트 수정 (#688)

* [BE] chore: remove swagger-related files (#686)

* [BE] fix: remove unintended character in configuration file (#689)

* infra: matrix 설정을 통해 다중 runner 적용 (#694)

* infra: prod cd 스크립트를 도커 활용하도록 변경 (#696)

* [BE] infra: 운영 환경 DB에 Replication 적용 (#687)

* feat: replication을 위한 config 추가

* refactor: read, write 요청 분리를 위한 readOnly 적용

* refactor: profile 적용

* style: 개행 추가

* refactor: readOnly 변수명 변경

* refactor: dataSourceType enum 적용 및 상수화

* chore: osiv 해제

* infra: 테스트 환경에서 flyway 적용하지 않도록 변경

* [BE] feat: 세션을 활용해 리뷰 조회 (#666)

* feat: 뼈대 코드 추가, deprecation 어노테이션 추가

* feat: 세션을 활용하도록 기반 코드 작성

* feat: 세션쿠키 필터 추가

* feat: 가짜 세션 Mockmvc에 주입

* refactor: 세션을 적용하도록 API 수정 및 API 문서 적용

* style: 개행

* docs: 사용되지 않는 문서 부분 삭제

* fix: 쿠키 전달을 위한 `allowCredentials` 설정

* refactor: v2로 변경 및 테스트 수정

* refactor: 사용하지 않는 메서드/테스트 제거

* chore: 쿠키 명시적으로 설정, 보안 설정

* test: CORS 테스트 작성

* chore: remove unused files

* refactor: 주소 외부에서 관리

* refactor: 메시지 수정

* chore: 예외 주석 수정

* [BE] infra: flyway를 통한 인덱스 적용 (#690)

* infra: 리뷰, 리뷰 그룹 테이블에 인덱스 추가

* infra: 테스트 환경에서 flyway 적용하지 않도록 변경

* infra: 변경 사항 설명을 위한 링크 주석 추가

* infra: 주석 기호 오류 수정

* [FE] fix: threshold 오타 수정 (#685)

* ci: brotli-webpack-plugin 설치

* fix: 웹팩 설정에 중복된 sentry 속성 삭제

* feat: Brotli 압축 적용

- Brotli를 지원하지 않는 브라우저를 대비 해, 원본 파일을 삭제하지 않도록 함

* feat: 파비콘도 Brotli로 압축

* fix: Brotli threshold 수정

* fix: threshold 오타 수정

* [FE] feat: 프로그레스 바 반응형으로 구현 (#642)

* design: medium 이상의 프로그레스 바를 container로 감싸서 화면 중앙 정렬

* feat: 모바일 프로그레스 바 컴포넌트 작성

* feat: 작성 폼 카드를 이동할 때마다 모바일 프로그레스 바도 함께 이동하도록 구현

* feat: 리뷰 작성 페이지의 해상도에 따라 다른 프로그레스 바를 보여주도록 구현

* design: 모바일에서 아직 완료되지 않고, 현재 위치가 아닌 stepButton에 border 설정

* fix: 스크롤이 작동하지 않는 문제 수정

* chore: alt 속성 한국어로 작성

* refactor: 자동 스크롤 로직에 requestAnimationFrame 적용

* chore: map으로 반복되는 요소의 최상단에 key prop 설정

* fix: 중복되는 UI 제거

* fix: 모바일 환경에서 프로그레스 바가 넘어가지 않는 문제 수정

* fix: 카드 이동 시 프로그레스 바 애니메이션과 충돌하는 문제 완화

* chore: 꾸미는 용도의 이미지에서 alt 속성 제거

* design: 불필요한 margin 제거

* chore: 프로그레스 바 연결선 변경

* design: stepButton min-width, max-width 수정

* [FE] refactor: 비밀번호 확인, 리뷰 목록 및 리뷰 상세 정보 요청 API 변경에 따른 리팩토링 (#695)

* refactor: 리뷰 목록 페이지 및 상세 리뷰 페이지 url에 reviewRequestCode 추가

* refactor: 비밀번호 검증, 리뷰 목록 요청, 상세 리뷰 요청 API 변경에 따른 api 호출 함수 및 리액트 쿼리 훅 변경

* refactor: 비밀번호 검증, 리뷰 목록 요청, 상세 리뷰 요청 API 변경에 따른 리액트 쿼리 훅 테스트 변경

* refactor: 비밀번호 검증, 리뷰 목록 요청, 상세 리뷰 요청 API 변경에 따른 mocking handler 변경

* refactor: 리뷰 목록, 상세 리뷰 페이지 URL 변경에 따른 breadCrumb Path 수정

* refactor: ErrorSuspenseContainer가 fallback을 optional 매개변수로 받을 수 있게 변경 및 네비게이션 함수의 이름을 보다 일반적으로 수정

* feat: 리뷰 목록, 리뷰 상세 페이지를 위한 AuthAndServerErrorFallback 및 section 작성

* refactor: 리뷰 목록, 상세 리뷰 페이지에 새 ErrorSuspenseContainer와 API 호출 함수 반영

* refactor: ErrorSuspenseContainer의 기본 인자로 기본 fallback 할당

* chore: 불필요한 훅과 atom 삭제

* chore: LoginRedirectModal 삭제

* chore: 삭제 파일에서 누락된 파일 삭제

* test: 간헐적으로 실패하는 테스트의 expect 함수를 waitFor 내부로 이동

* [FE] feat : 목 서버에서 세션 쿠키 사용하는 추가 및 확인하는 기능 추가 (#698)

* refactor: 리뷰 목록 페이지 및 상세 리뷰 페이지 url에 reviewRequestCode 추가

* refactor: 비밀번호 검증, 리뷰 목록 요청, 상세 리뷰 요청 API 변경에 따른 api 호출 함수 및 리액트 쿼리 훅 변경

* refactor: 비밀번호 검증, 리뷰 목록 요청, 상세 리뷰 요청 API 변경에 따른 리액트 쿼리 훅 테스트 변경

* refactor: 비밀번호 검증, 리뷰 목록 요청, 상세 리뷰 요청 API 변경에 따른 mocking handler 변경

* refactor: 리뷰 목록, 상세 리뷰 페이지 URL 변경에 따른 breadCrumb Path 수정

* refactor: ErrorSuspenseContainer가 fallback을 optional 매개변수로 받을 수 있게 변경 및 네비게이션 함수의 이름을 보다 일반적으로 수정

* feat: 리뷰 목록, 리뷰 상세 페이지를 위한 AuthAndServerErrorFallback 및 section 작성

* refactor: 리뷰 목록, 상세 리뷰 페이지에 새 ErrorSuspenseContainer와 API 호출 함수 반영

* refactor: ErrorSuspenseContainer의 기본 인자로 기본 fallback 할당

* chore: 불필요한 훅과 atom 삭제

* chore: LoginRedirectModal 삭제

* chore: 삭제 파일에서 누락된 파일 삭제

* test: 간헐적으로 실패하는 테스트의 expect 함수를 waitFor 내부로 이동

* feat: 비밀번호 조회 목 핸들러에 mockAuthToken 생성하는 기능 추가

* feat: 목록, 상세 페이지 목 핸들러에 쿠키 확인하는 기능 추가

* fix: 리뷰 목록 목 데이터에서 reviewId 중복 수정

* fix: 목 핸들러에서 쿠키 없을 때 response status 변경

* fix: 리뷰 목록/상세 페이지 테스트에 쿠키 설정 추가해 테스트 오류 수정

* refactor: useGetDetailedReview에서 불필요한 코드 삭제

* refactor: review 목 핸들러 if문 코드 개선

---------

Co-authored-by: ImxYJL <allensain14@gmail.com>

* refactor: 서술형, 객관식 질문의 빈값 검증 수정

* style: 괄호 위치 및 개행 수정

* refactor: 리뷰의 답변 매핑 시, 필수가 아닌 질문 중 작성되지 않은 질문을 매핑하지 않도록 변경

* refactor: 사용하지 않는 상수 제거

* test: 필수가 아닌 질문이 답변되지 않을 경우 매핑 로직에 대한 테스트 작성

* refactor: 서술형, 객관식 질문의 빈값 검증 수정

* style: 괄호 위치 및 개행 수정

---------

Co-authored-by: ImxYJL <111052302+ImxYJL@users.noreply.github.com>
Co-authored-by: badahertz52 <badahertz52@gmail.com>
Co-authored-by: Donghoon Lee <aru0504@naver.com>
Co-authored-by: sooyeon <lllllh00@naver.com>
Co-authored-by: Hyeonji <110809927+skylar1220@users.noreply.github.com>
Co-authored-by: Fe <64690761+chysis@users.noreply.github.com>
Co-authored-by: ImxYJL <allensain14@gmail.com>
Co-authored-by: hyeonjilee <skylar12200@gmail.com>
  • Loading branch information
9 people authored Sep 26, 2024
1 parent 1d1aaf2 commit a995093
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,11 @@ public record ReviewAnswerRequest(
@Nullable
String text
) {
public boolean hasTextAnswer() {
return text != null && !text.isEmpty();
}

public boolean hasCheckboxAnswer() {
return selectedOptionIds != null && !selectedOptionIds.isEmpty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
import reviewme.review.domain.CheckboxAnswer;
import reviewme.review.domain.Review;
import reviewme.review.domain.TextAnswer;
import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException;
import reviewme.review.service.dto.request.ReviewAnswerRequest;
import reviewme.review.service.dto.request.ReviewRegisterRequest;
import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException;
import reviewme.reviewgroup.domain.ReviewGroup;
import reviewme.reviewgroup.repository.ReviewGroupRepository;
import reviewme.template.domain.Template;
import reviewme.template.service.exception.TemplateNotFoundByReviewGroupException;
import reviewme.template.repository.TemplateRepository;
import reviewme.template.service.exception.TemplateNotFoundByReviewGroupException;

@Component
@RequiredArgsConstructor
Expand Down Expand Up @@ -67,14 +67,30 @@ private void addAnswersByQuestionType(ReviewRegisterRequest request,
Question question = questionMap.get(answerRequest.questionId());

if (question.getQuestionType() == QuestionType.TEXT) {
TextAnswer textAnswer = answerMapper.mapToTextAnswer(answerRequest);
textAnswers.add(textAnswer);
addIfTextAnswerExists(answerRequest, question, textAnswers);
}

if (question.getQuestionType() == QuestionType.CHECKBOX) {
CheckboxAnswer checkboxAnswer = answerMapper.mapToCheckBoxAnswer(answerRequest);
checkboxAnswers.add(checkboxAnswer);
addIfCheckBoxAnswerExists(answerRequest, question, checkboxAnswers);
}
}
}

private void addIfTextAnswerExists(ReviewAnswerRequest answerRequest,
Question question,
List<TextAnswer> textAnswers) {
if (question.isRequired() || answerRequest.hasTextAnswer()) {
TextAnswer textAnswer = answerMapper.mapToTextAnswer(answerRequest);
textAnswers.add(textAnswer);
}
}

private void addIfCheckBoxAnswerExists(ReviewAnswerRequest answerRequest,
Question question,
List<CheckboxAnswer> checkboxAnswers) {
if (question.isRequired() || answerRequest.hasCheckboxAnswer()) {
CheckboxAnswer checkboxAnswer = answerMapper.mapToCheckBoxAnswer(answerRequest);
checkboxAnswers.add(checkboxAnswer);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
@RequiredArgsConstructor
public class TextAnswerValidator {

private static final int ZERO_LENGTH = 0;
private static final int MIN_LENGTH = 20;
private static final int MAX_LENGTH = 1_000;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static org.junit.jupiter.api.Assertions.assertAll;
import static reviewme.fixture.OptionGroupFixture.선택지_그룹;
import static reviewme.fixture.OptionItemFixture.선택지;
import static reviewme.fixture.QuestionFixture.서술형_옵션_질문;
import static reviewme.fixture.QuestionFixture.서술형_필수_질문;
import static reviewme.fixture.QuestionFixture.선택형_필수_질문;
import static reviewme.fixture.ReviewGroupFixture.리뷰_그룹;
Expand Down Expand Up @@ -82,16 +83,25 @@ class ReviewRegisterServiceTest {
requiredOptionItem1.getId(), 2)
);

Template template = templateRepository.save(템플릿(List.of(visibleSection.getId(), conditionalSection.getId())));
Question optionalTextQuestion = questionRepository.save(서술형_옵션_질문());
Section visibleOptionalSection = sectionRepository.save(항상_보이는_섹션(
List.of(optionalTextQuestion.getId()), 3)
);

Template template = templateRepository.save(템플릿(
List.of(visibleSection.getId(), conditionalSection.getId(), visibleOptionalSection.getId())));

ReviewAnswerRequest requiredCheckQuestionAnswer = new ReviewAnswerRequest(
requiredCheckQuestion.getId(), List.of(requiredOptionItem1.getId()), null);
ReviewAnswerRequest requiredTextQuestionAnswer = new ReviewAnswerRequest(
requiredTextQuestion.getId(), null, "답변".repeat(30));
ReviewAnswerRequest conditionalCheckQuestionAnswer = new ReviewAnswerRequest(
conditionalCheckQuestion.getId(), List.of(conditionalOptionItem1.getId()), null);
ReviewAnswerRequest optionalTextQuestionAnswer = new ReviewAnswerRequest(
optionalTextQuestion.getId(), null, "");
ReviewRegisterRequest reviewRegisterRequest = new ReviewRegisterRequest(reviewGroup.getReviewRequestCode(),
List.of(requiredCheckQuestionAnswer, requiredTextQuestionAnswer, conditionalCheckQuestionAnswer));
List.of(requiredCheckQuestionAnswer, requiredTextQuestionAnswer, conditionalCheckQuestionAnswer,
optionalTextQuestionAnswer));

// when
long registeredReviewId = reviewRegisterService.registerReview(reviewRegisterRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertAll;
import static reviewme.fixture.OptionGroupFixture.선택지_그룹;
import static reviewme.fixture.OptionItemFixture.선택지;
import static reviewme.fixture.QuestionFixture.서술형_옵션_질문;
import static reviewme.fixture.QuestionFixture.서술형_필수_질문;
import static reviewme.fixture.QuestionFixture.선택형_옵션_질문;
import static reviewme.fixture.QuestionFixture.선택형_필수_질문;
import static reviewme.fixture.ReviewGroupFixture.리뷰_그룹;
import static reviewme.fixture.SectionFixture.항상_보이는_섹션;
Expand All @@ -19,10 +22,12 @@
import reviewme.question.repository.OptionGroupRepository;
import reviewme.question.repository.OptionItemRepository;
import reviewme.question.repository.QuestionRepository;
import reviewme.review.domain.CheckboxAnswer;
import reviewme.review.domain.Review;
import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException;
import reviewme.review.domain.TextAnswer;
import reviewme.review.service.dto.request.ReviewAnswerRequest;
import reviewme.review.service.dto.request.ReviewRegisterRequest;
import reviewme.review.service.exception.ReviewGroupNotFoundByReviewRequestCodeException;
import reviewme.reviewgroup.domain.ReviewGroup;
import reviewme.reviewgroup.repository.ReviewGroupRepository;
import reviewme.support.ServiceTest;
Expand Down Expand Up @@ -100,6 +105,56 @@ class ReviewMapperTest {
assertThat(review.getCheckboxAnswers()).hasSize(1);
}

@Test
void 필수가_아닌_질문에_답변이_없을_경우_답변을_생성하지_않는다() {
// given
ReviewGroup reviewGroup = reviewGroupRepository.save(리뷰_그룹());

Question requiredTextQuestion = questionRepository.save(서술형_필수_질문());
Question optionalTextQuestion = questionRepository.save(서술형_옵션_질문());

Question requeiredCheckBoxQuestion = questionRepository.save(선택형_필수_질문());
OptionGroup optionGroup1 = optionGroupRepository.save(선택지_그룹(requeiredCheckBoxQuestion.getId()));
OptionItem optionItem1 = optionItemRepository.save(선택지(optionGroup1.getId()));
OptionItem optionItem2 = optionItemRepository.save(선택지(optionGroup1.getId()));

Question optionalCheckBoxQuestion = questionRepository.save(선택형_옵션_질문());
OptionGroup optionGroup2 = optionGroupRepository.save(선택지_그룹(optionalCheckBoxQuestion.getId()));
OptionItem optionItem3 = optionItemRepository.save(선택지(optionGroup2.getId()));
OptionItem optionItem4 = optionItemRepository.save(선택지(optionGroup2.getId()));

Section section = sectionRepository.save(항상_보이는_섹션(
List.of(requiredTextQuestion.getId(), optionalTextQuestion.getId(),
requeiredCheckBoxQuestion.getId(), optionalCheckBoxQuestion.getId())));
templateRepository.save(템플릿(List.of(section.getId())));

String textAnswer = "답".repeat(20);
ReviewAnswerRequest requiredTextAnswerRequest = new ReviewAnswerRequest(
requiredTextQuestion.getId(), null, textAnswer);
ReviewAnswerRequest optionalTextAnswerRequest = new ReviewAnswerRequest(
optionalTextQuestion.getId(), null, "");
ReviewAnswerRequest requiredCheckBoxAnswerRequest = new ReviewAnswerRequest(
requeiredCheckBoxQuestion.getId(), List.of(optionItem1.getId()), null);
ReviewAnswerRequest optionalCheckBoxAnswerRequest = new ReviewAnswerRequest(
optionalCheckBoxQuestion.getId(), List.of(), null);
ReviewRegisterRequest reviewRegisterRequest = new ReviewRegisterRequest(reviewGroup.getReviewRequestCode(),
List.of(requiredTextAnswerRequest, optionalTextAnswerRequest,
requiredCheckBoxAnswerRequest, optionalCheckBoxAnswerRequest));

// when
Review review = reviewMapper.mapToReview(reviewRegisterRequest);

// then
assertAll(
() -> assertThat(review.getTextAnswers())
.extracting(TextAnswer::getQuestionId)
.containsExactly(requiredTextQuestion.getId()),
() -> assertThat(review.getCheckboxAnswers())
.extracting(CheckboxAnswer::getQuestionId)
.containsExactly(requeiredCheckBoxQuestion.getId())
);
}

@Test
void 잘못된_리뷰_요청_코드로_리뷰를_생성할_경우_예외가_발생한다() {
// given
Expand Down

0 comments on commit a995093

Please sign in to comment.