Skip to content
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
0323775
feat: QnaSetIntegrationTest 생성
zxc534 Feb 11, 2026
fa6d3c1
Merge remote-tracking branch 'origin/dev' into DEV-176/test/qna-set-c…
zxc534 Feb 12, 2026
69fb4cd
test: 질답_세트_생성에_성공한다 작성
zxc534 Feb 13, 2026
19674de
feat: 질답 세트 생성 시 interview가 qnaSetDraft 상태인지 검증 로직 추가
zxc534 Feb 13, 2026
90c60c3
test: 인터뷰 상태에 검증 추가로 테스트 로직 수정
zxc534 Feb 13, 2026
0fd411b
chore: 프롬프트 파일 삭제
zxc534 Feb 13, 2026
c2c6785
test: 어려웠던 질문 마킹 등록/해제 테스트 작성
zxc534 Feb 13, 2026
3176285
feat: 인터뷰 상태 검증 로직 추가
zxc534 Feb 13, 2026
572fdae
test: 질답 세트 수정 테스트 작성
zxc534 Feb 13, 2026
8795868
Merge remote-tracking branch 'origin/dev' into DEV-176/test/qna-set-c…
zxc534 Feb 13, 2026
d2c39a2
merge origin/dev
zxc534 Feb 13, 2026
5e18714
test: 면접 생성을 메소드 사용하여 간소화
zxc534 Feb 13, 2026
3a67be1
test: 질답 세트 수정 테스트 추가
zxc534 Feb 13, 2026
6b70636
test: 질문 답변 세트 삭제 테스트 작성
zxc534 Feb 13, 2026
80090dc
docs: 하이라이팅 등록/수정 API swagger 작성
zxc534 Feb 13, 2026
4f2558b
feat: PDF 하이라이팅 업데이트 시 면접 상태 검증 로직 추가
zxc534 Feb 13, 2026
3071b23
test: PDF 하이라이팅 등록 테스트 작성
zxc534 Feb 13, 2026
cad5846
test: createAndSavePdfHighlighting 메소드 구현
zxc534 Feb 13, 2026
20b1437
test: PDF 하이라이팅 조회 테스트 작성
zxc534 Feb 13, 2026
3240dd8
chore: spotless 적용
zxc534 Feb 13, 2026
35f8050
test: 실제 값 검증 로직을 추가
zxc534 Feb 13, 2026
82e3ced
fix: unmark 메소드가 값을 false로 설정하도록 수정
zxc534 Feb 13, 2026
9c8e3ec
chore: 잘못된 테스트 이름 수정
zxc534 Feb 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public class QnaSetController {
private final QnaSetService qnaSetService;
private final StarAnalysisAsyncService starAnalysisAsyncService;

// TODO 통합 테스트 작성
@Operation(
summary = "지정한 산업군 / 직무의 빈출 질문 답변 세트를 조회합니다.",
description = "지정한 산업군 / 직무의 빈출 질문 답변 세트를 조회합니다. 지정하지 않은 필드에 대해서는 전체를 대상으로 조회합니다.")
Expand Down Expand Up @@ -71,11 +72,10 @@ public ResponseEntity<ApiResponse<Void>> unmarkDifficultQuestion(@PathVariable L
return ResponseEntity.ok(response);
}

@Operation(summary = "지정한 질문 답변 세트의 질문 답변 내용을 수정합니다.", description = "질문 답변 내용 수정은 '기록중' 상태에서만 가능합니다.")
@Operation(summary = "지정한 질문 답변 세트의 질문 답변 내용을 수정합니다.", description = "질문 답변 내용 수정은 'QnaSetDraft' 상태에서만 가능합니다.")
@PutMapping("/{qnaSetId}")
public ResponseEntity<ApiResponse<Void>> updateQnaSet(
@PathVariable Long qnaSetId, @Valid @RequestBody QnaSetUpdateRequest request) {
// TODO : 질문 답변 내용 수정이 '기록중' 상태에서만 가능하도록 검증 추가
qnaSetService.updateQnaSet(qnaSetId, request);
var response = ApiResponse.success(COMMON200);
return ResponseEntity.ok(response);
Expand All @@ -89,7 +89,9 @@ public ResponseEntity<ApiResponse<Void>> deleteQnaSet(@PathVariable Long qnaSetI
return ResponseEntity.ok(resposne);
}

@Operation(summary = "지정한 질문 답변 세트에 대해 PDF 하이라이팅 정보를 등록/수정합니다.")
@Operation(
summary = "지정한 질문 답변 세트에 대해 PDF 하이라이팅 정보를 등록/수정합니다.",
description = "PDF 하이라이팅 정보 등록/수정은 'QnaSetDraft' 상태에서만 가능합니다.")
@PutMapping("/{qnaSetId}/pdf-highlightings")
public ResponseEntity<ApiResponse<Void>> updatePdfHighlighting(
@PathVariable Long qnaSetId, @Valid @RequestBody List<PdfHighlightingUpdateRequest> request) {
Expand All @@ -106,6 +108,7 @@ public ResponseEntity<ApiResponse<List<PdfHighlightingDto>>> getPdfHighlightings
return ResponseEntity.ok(response);
}

// TODO 통합 테스트 작성 (E2E 테스트는 일단 보류)
@Operation(summary = "지정한 질문 답변 세트에 대해 스타 분석 생성을 요청합니다.", description = "Gemini 요청을 수행하고 10~20초 뒤에 응답이 반환됩니다.")
@PostMapping("/{qnaSetId}/star-analysis")
public CompletableFuture<ResponseEntity<ApiResponse<StarAnalysisDto>>> createStarAnalysis(
Expand All @@ -115,6 +118,7 @@ public CompletableFuture<ResponseEntity<ApiResponse<StarAnalysisDto>>> createSta
.thenApply(rsp -> ResponseEntity.ok(ApiResponse.success(COMMON200, rsp)));
}

// TODO 통합 테스트 작성
@Operation(summary = "지정한 질문 답변 세트가 스크랩 폴더에 포함되어 있는 지 여부가 포함된 스크랩 폴더 리스트를 조회합니다.")
@GetMapping("/{qnaSetId}/scrap-folder")
public ResponseEntity<ApiResponse<Page<QnaSetScrapFolderResponse>>> getScrapFoldersContainingQnaSet(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public void unmarkDifficultQuestion(Long qnaSetId) {
@Transactional
public void updateQnaSet(Long qnaSetId, QnaSetUpdateRequest request) {
QnaSet qnaSet = getValidatedQnaSet(qnaSetId);
interviewValidator.validateInterviewReviewStatus(qnaSet.getInterview(), InterviewReviewStatus.QNA_SET_DRAFT);
qnaSet.updateQuestionText(request.questionText());
qnaSet.updateAnswerText(request.answerText());
updateOrCreateSelfReview(qnaSet, request.selfReviewText());
Expand All @@ -90,6 +91,7 @@ public void deleteQnaSet(Long qnaSetId) {
@Transactional
public void updatePdfHighlighting(Long qnaSetId, List<PdfHighlightingUpdateRequest> request) {
QnaSet qnaSet = getValidatedQnaSet(qnaSetId);
interviewValidator.validateInterviewReviewStatus(qnaSet.getInterview(), InterviewReviewStatus.QNA_SET_DRAFT);
deleteAllHighlightingsAndRects(qnaSet);
saveAllHighlightings(qnaSet, request);
}
Expand Down Expand Up @@ -135,13 +137,6 @@ public Page<QnaSetScrapFolderResponse> getMyScrapFoldersWithQnaSetContainingInfo
return qnaSetScrapFolderRepository.findAllScrapFoldersWithQnaSetContainingInfo(requestUser, qnaSet, pageable);
}

private List<Long> removeDuplicatedIds(List<Long> list) {
if (list == null) {
return null;
}
return list.stream().distinct().toList();
}

private QnaSet getValidatedQnaSet(Long qnaSetId) {
QnaSet qnaSet = qnaSetRepository.findById(qnaSetId).orElseThrow(() -> new CustomException(QNA_SET_NOT_FOUND));
User requestUser = requestUserContext.getRequestUser();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,19 @@
import com.shyashyashya.refit.domain.industry.model.Industry;
import com.shyashyashya.refit.domain.industry.repository.IndustryRepository;
import com.shyashyashya.refit.domain.interview.dto.request.InterviewCreateRequest;
import com.shyashyashya.refit.domain.interview.dto.request.QnaSetCreateRequest;
import com.shyashyashya.refit.domain.interview.model.Interview;
import com.shyashyashya.refit.domain.interview.model.InterviewReviewStatus;
import com.shyashyashya.refit.domain.interview.repository.InterviewRepository;
import com.shyashyashya.refit.domain.jobcategory.model.JobCategory;
import com.shyashyashya.refit.domain.jobcategory.repository.JobCategoryRepository;
import com.shyashyashya.refit.domain.qnaset.dto.request.PdfHighlightingUpdateRequest;
import com.shyashyashya.refit.domain.qnaset.model.PdfHighlighting;
import com.shyashyashya.refit.domain.qnaset.model.PdfHighlightingRect;
import com.shyashyashya.refit.domain.qnaset.model.QnaSet;
import com.shyashyashya.refit.domain.qnaset.repository.PdfHighlightingRectRepository;
import com.shyashyashya.refit.domain.qnaset.repository.PdfHighlightingRepository;
import com.shyashyashya.refit.domain.qnaset.repository.QnaSetRepository;
import com.shyashyashya.refit.domain.user.model.User;
import com.shyashyashya.refit.domain.user.repository.UserRepository;
import com.shyashyashya.refit.global.auth.service.JwtEncoder;
Expand Down Expand Up @@ -80,6 +88,15 @@ public abstract class IntegrationTest {
@Autowired
private CompanyRepository companyRepository;

@Autowired
private QnaSetRepository qnaSetRepository;

@Autowired
private PdfHighlightingRepository pdfHighlightingRepository;

@Autowired
private PdfHighlightingRectRepository pdfHighlightingRectRepository;

@BeforeEach
void restAssuredSetUp() {
clearDatabase();
Expand Down Expand Up @@ -188,4 +205,41 @@ protected Company createAndSaveCompany(String companyName) {
Company company = Company.create(companyName, "logo.url", true);
return companyRepository.save(company);
}

protected QnaSet createQnaSet(QnaSetCreateRequest request, Interview interview, boolean isMarkedDifficult) {
QnaSet qnaSet = QnaSet.create(
request.questionText(),
request.answerText(),
isMarkedDifficult,
interview,
null
);

return qnaSetRepository.save(qnaSet);
}

protected List<PdfHighlighting> createAndSavePdfHighlighting(List<PdfHighlightingUpdateRequest> requests, QnaSet qnaSet) {
List<PdfHighlighting> result = new ArrayList<>();

requests.forEach(request -> {
PdfHighlighting pdfHighlighting = PdfHighlighting.create(request.highlightingText(), qnaSet);
result.add(pdfHighlightingRepository.save(pdfHighlighting));

request.rects().forEach(
rectDto -> {
PdfHighlightingRect rect = PdfHighlightingRect.create(
rectDto.x(),
rectDto.y(),
rectDto.width(),
rectDto.height(),
rectDto.pageNumber(),
pdfHighlighting);

pdfHighlightingRectRepository.save(rect);
}
);
});

return result;
}
}
Loading
Loading