11package com .jobdri .jobdri_api .domain .mockapply .service ;
22
33import com .jobdri .jobdri_api .domain .analysis .entity .Analysis ;
4+ import com .jobdri .jobdri_api .domain .analysis .entity .Question ;
45import com .jobdri .jobdri_api .domain .analysis .repository .AnalysisRepository ;
6+ import com .jobdri .jobdri_api .domain .analysis .repository .QuestionRepository ;
57import com .jobdri .jobdri_api .domain .classification .entity .Classification ;
68import com .jobdri .jobdri_api .domain .classification .entity .DetailClassification ;
79import com .jobdri .jobdri_api .domain .classification .entity .MiddleClassification ;
1719import com .jobdri .jobdri_api .domain .mockapply .dto .request .MockApplyCreateMockRequest ;
1820import com .jobdri .jobdri_api .domain .mockapply .dto .response .MockApplyCreateResponse ;
1921import com .jobdri .jobdri_api .domain .mockapply .dto .response .MockApplyHomeResponse ;
22+ import com .jobdri .jobdri_api .domain .mockapply .dto .response .MockApplyRetryResponse ;
2023import com .jobdri .jobdri_api .domain .mockapply .dto .response .MockApplySequenceResponse ;
2124import com .jobdri .jobdri_api .domain .mockapply .entity .ApplyType ;
2225import com .jobdri .jobdri_api .domain .mockapply .entity .MockApply ;
@@ -62,6 +65,9 @@ class MockApplyServiceTest {
6265 @ Autowired
6366 private AnalysisRepository analysisRepository ;
6467
68+ @ Autowired
69+ private QuestionRepository questionRepository ;
70+
6571 @ Autowired
6672 private JobPostingRepository jobPostingRepository ;
6773
@@ -229,6 +235,42 @@ void createMockApplyFromJobPosting() {
229235 assertThat (mockApply .getSequence ()).isEqualTo (1 );
230236 }
231237
238+ @ Test
239+ @ DisplayName ("기존 지원의 공고와 문항을 복사해 재도전 지원을 생성한다" )
240+ void retryMockApply () {
241+ User user = saveUser ("retry-mock-apply@example.com" );
242+ JobPosting jobPosting = saveJobPosting (user , "백엔드 개발" );
243+ MockApply sourceMockApply = saveMockApply (user , jobPosting , ApplyType .MOCK , 1 );
244+ saveQuestion (sourceMockApply , "지원 동기와 입사 후 목표를 작성해주세요." , 700 , "기존 답변" );
245+ saveQuestion (sourceMockApply , "직접 추가한 문항입니다." , 1000 , "기존 직접 추가 답변" );
246+
247+ MockApplyRetryResponse response = mockApplyService .retryMockApply (user , sourceMockApply .getId ());
248+
249+ MockApply retryMockApply = mockApplyRepository .findById (response .mockApplyId ()).orElseThrow ();
250+ JobPosting retryJobPosting = jobPostingRepository .findById (response .jobPostingId ()).orElseThrow ();
251+ List <Question > retryQuestions = questionRepository .findAllByMockApplyIdOrderByIdAsc (response .mockApplyId ());
252+ assertThat (response .sourceMockApplyId ()).isEqualTo (sourceMockApply .getId ());
253+ assertThat (response .sequence ()).isEqualTo (2 );
254+ assertThat (response .status ()).isEqualTo (MockApplyStatus .ANSWER_WRITE );
255+ assertThat (retryMockApply .getApplyType ()).isEqualTo (ApplyType .MOCK );
256+ assertThat (retryMockApply .getSequence ()).isEqualTo (2 );
257+ assertThat (retryMockApply .getStatus ()).isEqualTo (MockApplyStatus .ANSWER_WRITE );
258+ assertThat (retryJobPosting .getId ()).isNotEqualTo (jobPosting .getId ());
259+ assertThat (retryJobPosting .getCompany ().getId ()).isEqualTo (jobPosting .getCompany ().getId ());
260+ assertThat (retryJobPosting .getDetailClassification ().getId ()).isEqualTo (jobPosting .getDetailClassification ().getId ());
261+ assertThat (retryJobPosting .getTask ()).isEqualTo (jobPosting .getTask ());
262+ assertThat (retryQuestions ).hasSize (2 );
263+ assertThat (retryQuestions )
264+ .extracting (Question ::getContent )
265+ .containsExactly (
266+ "지원 동기와 입사 후 목표를 작성해주세요." ,
267+ "직접 추가한 문항입니다."
268+ );
269+ assertThat (retryQuestions )
270+ .extracting (Question ::getAnswer )
271+ .containsExactly ("" , "" );
272+ }
273+
232274 @ Test
233275 @ DisplayName ("mockApplyId로 생성된 모의 공고를 조회한다" )
234276 void getMockApplyJobPosting () {
@@ -290,6 +332,7 @@ void getMyMockApplies() {
290332 assertThat (response .completed ()).hasSize (1 );
291333 assertThat (response .inProgress ().get (0 ).mockApplyId ()).isEqualTo (inProgress .getId ());
292334 assertThat (response .inProgress ().get (0 ).jobPostingId ()).isEqualTo (backendPosting .getId ());
335+ assertThat (response .inProgress ().get (0 ).sequence ()).isEqualTo (1 );
293336 assertThat (response .inProgress ().get (0 ).status ()).isEqualTo (MockApplyStatus .ANSWER_WRITE );
294337 assertThat (response .inProgress ().get (0 ).companyName ()).isEqualTo ("테스트 기업" );
295338 assertThat (response .inProgress ().get (0 ).detailClassificationName ()).isEqualTo ("백엔드 개발" );
@@ -298,6 +341,7 @@ void getMyMockApplies() {
298341 assertThat (response .inProgress ().get (0 ).score ()).isNull ();
299342 assertThat (response .inProgress ().get (0 ).resumePath ()).isEqualTo ("/mock-applies/" + inProgress .getId () + "/answers" );
300343 assertThat (response .completed ().get (0 ).mockApplyId ()).isEqualTo (completed .getId ());
344+ assertThat (response .completed ().get (0 ).sequence ()).isEqualTo (1 );
301345 assertThat (response .completed ().get (0 ).score ()).isEqualTo (71 );
302346 assertThat (response .completed ().get (0 ).applyType ()).isEqualTo (ApplyType .MOCK );
303347 assertThat (response .completed ().get (0 ).resumePath ()).isEqualTo ("/mock-applies/" + completed .getId () + "/analysis" );
@@ -447,6 +491,15 @@ private MockApply saveMockApply(User user, JobPosting jobPosting, ApplyType appl
447491 ));
448492 }
449493
494+ private Question saveQuestion (MockApply mockApply , String content , int limit , String answer ) {
495+ return inNewTransaction (() -> questionRepository .save (Question .create (
496+ mockApplyRepository .findById (mockApply .getId ()).orElseThrow (),
497+ content ,
498+ limit ,
499+ answer
500+ )));
501+ }
502+
450503 private <T > T inNewTransaction (Supplier <T > action ) {
451504 TransactionTemplate transactionTemplate = new TransactionTemplate (transactionManager );
452505 transactionTemplate .setPropagationBehavior (TransactionDefinition .PROPAGATION_REQUIRES_NEW );
0 commit comments