@ -42,7 +42,16 @@ class AiTrainingEvaluationServiceImplTest {
void rejectsBlankAllStepAnswers ( ) {
void rejectsBlankAllStepAnswers ( ) {
AiTrainingEvaluationServiceImpl service = serviceWithContext ( answer ( null , " " , "" , "\t" , null ) ) ;
AiTrainingEvaluationServiceImpl service = serviceWithContext ( answer ( null , " " , "" , "\t" , null ) ) ;
assertThrows ( ServiceException . class , ( ) - > service . generateHelp ( "new-product-survey" , student ( ) ) ) ;
assertThrows ( ServiceException . class , ( ) - > service . generateHelp ( "new-product-survey" , student ( ) , "请给我建议" ) ) ;
verify ( service . qwenChatClient , never ( ) ) . completeJson ( any ( ) , any ( ) ) ;
}
@Test
void rejectsBlankHelpQuestionBeforeCallingQwen ( ) {
AiTrainingEvaluationServiceImpl service = serviceWithContext ( answer ( "answer-1" , "step one" , null , null , null ) ) ;
assertThrows ( ServiceException . class , ( ) - > service . generateHelp ( "new-product-survey" , student ( ) , " " ) ) ;
verify ( service . qwenChatClient , never ( ) ) . completeJson ( any ( ) , any ( ) ) ;
verify ( service . qwenChatClient , never ( ) ) . completeJson ( any ( ) , any ( ) ) ;
}
}
@ -56,7 +65,7 @@ class AiTrainingEvaluationServiceImplTest {
when ( service . aiTrainingEvaluationMapper . claimHelp ( eq ( "evaluation-1" ) , any ( Date . class ) ) ) . thenReturn ( 1 ) ;
when ( service . aiTrainingEvaluationMapper . claimHelp ( eq ( "evaluation-1" ) , any ( Date . class ) ) ) . thenReturn ( 1 ) ;
when ( service . qwenChatClient . completeJson ( any ( ) , any ( ) ) ) . thenReturn ( helpJson ( ) ) ;
when ( service . qwenChatClient . completeJson ( any ( ) , any ( ) ) ) . thenReturn ( helpJson ( ) ) ;
AiTrainingEvaluationView view = service . generateHelp ( "new-product-survey" , student ( ) );
AiTrainingEvaluationView view = service . generateHelp ( "new-product-survey" , student ( ) , "如何完善调研证据?" );
ArgumentCaptor < AiTrainingEvaluation > saved = ArgumentCaptor . forClass ( AiTrainingEvaluation . class ) ;
ArgumentCaptor < AiTrainingEvaluation > saved = ArgumentCaptor . forClass ( AiTrainingEvaluation . class ) ;
verify ( service . aiTrainingEvaluationMapper ) . completeHelp ( saved . capture ( ) ) ;
verify ( service . aiTrainingEvaluationMapper ) . completeHelp ( saved . capture ( ) ) ;
@ -65,9 +74,26 @@ class AiTrainingEvaluationServiceImplTest {
assertTrue ( saved . getValue ( ) . getHelpTaskSnapshot ( ) . contains ( "objective one" ) ) ;
assertTrue ( saved . getValue ( ) . getHelpTaskSnapshot ( ) . contains ( "objective one" ) ) ;
assertTrue ( saved . getValue ( ) . getHelpTaskSnapshot ( ) . contains ( "task requirement" ) ) ;
assertTrue ( saved . getValue ( ) . getHelpTaskSnapshot ( ) . contains ( "task requirement" ) ) ;
assertTrue ( saved . getValue ( ) . getHelpAnswerSnapshot ( ) . contains ( "step four" ) ) ;
assertTrue ( saved . getValue ( ) . getHelpAnswerSnapshot ( ) . contains ( "step four" ) ) ;
assertTrue ( saved . getValue ( ) . getHelpAnswerSnapshot ( ) . contains ( "如何完善调研证据?" ) ) ;
assertEquals ( helpJson ( ) , saved . getValue ( ) . getHelpReportJson ( ) ) ;
assertEquals ( helpJson ( ) , saved . getValue ( ) . getHelpReportJson ( ) ) ;
}
}
@Test
void helpPromptIncludesStudentQuestion ( ) {
AiTrainingEvaluationServiceImpl service = serviceWithContext ( answer ( "answer-1" , "step one" , null , null , null ) ) ;
AiTrainingEvaluation evaluation = evaluation ( "NOT_STARTED" , "NOT_STARTED" ) ;
when ( service . aiTrainingEvaluationMapper . findByStudentClassAndTask ( "stu-1" , "class-1" , "task-1" ) )
. thenReturn ( null , evaluation ) ;
when ( service . aiTrainingEvaluationMapper . claimHelp ( eq ( "evaluation-1" ) , any ( Date . class ) ) ) . thenReturn ( 1 ) ;
when ( service . qwenChatClient . completeJson ( any ( ) , any ( ) ) ) . thenReturn ( helpJson ( ) ) ;
service . generateHelp ( "new-product-survey" , student ( ) , "如何区分核心层和有形层?" ) ;
ArgumentCaptor < String > userPrompt = ArgumentCaptor . forClass ( String . class ) ;
verify ( service . qwenChatClient ) . completeJson ( any ( ) , userPrompt . capture ( ) ) ;
assertTrue ( userPrompt . getValue ( ) . contains ( "Student question: 如何区分核心层和有形层?" ) ) ;
}
@Test
@Test
void assessmentSuccessWritesScoreToAnswer ( ) {
void assessmentSuccessWritesScoreToAnswer ( ) {
AiTrainingEvaluationServiceImpl service = serviceWithContext ( answer ( "answer-1" , "step one" , null , null , null ) ) ;
AiTrainingEvaluationServiceImpl service = serviceWithContext ( answer ( "answer-1" , "step one" , null , null , null ) ) ;
@ -138,17 +164,20 @@ class AiTrainingEvaluationServiceImplTest {
}
}
@Test
@Test
void succeededHelp ReturnsStoredReportWithoutCallingQwenAgai n( ) {
void succeededHelp CanBeRegeneratedForANewQuestio n( ) {
AiTrainingEvaluationServiceImpl service = serviceWithContext ( answer ( "answer-1" , "step one" , null , null , null ) ) ;
AiTrainingEvaluationServiceImpl service = serviceWithContext ( answer ( "answer-1" , "step one" , null , null , null ) ) ;
AiTrainingEvaluation evaluation = evaluation ( "SUCCEEDED" , "NOT_STARTED" ) ;
AiTrainingEvaluation evaluation = evaluation ( "SUCCEEDED" , "NOT_STARTED" ) ;
evaluation . setHelpReportJson ( helpJson ( ) ) ;
evaluation . setHelpReportJson ( helpJson ( ) ) ;
when ( service . aiTrainingEvaluationMapper . findByStudentClassAndTask ( "stu-1" , "class-1" , "task-1" ) ) . thenReturn ( evaluation ) ;
when ( service . aiTrainingEvaluationMapper . findByStudentClassAndTask ( "stu-1" , "class-1" , "task-1" ) ) . thenReturn ( evaluation ) ;
AiTrainingEvaluationView view = service . generateHelp ( "new-product-survey" , student ( ) ) ;
when ( service . aiTrainingEvaluationMapper . claimHelp ( eq ( "evaluation-1" ) , any ( Date . class ) ) ) . thenReturn ( 1 ) ;
when ( service . qwenChatClient . completeJson ( any ( ) , any ( ) ) ) . thenReturn ( helpJson ( ) ) ;
AiTrainingEvaluationView view = service . generateHelp ( "new-product-survey" , student ( ) , "请根据新问题给建议" ) ;
assertEquals ( "SUCCEEDED" , view . getHelpStatus ( ) ) ;
assertEquals ( "SUCCEEDED" , view . getHelpStatus ( ) ) ;
assertEquals ( helpJson ( ) , view . getHelpReportJson ( ) ) ;
verify( service . qwenChatClient ) . completeJson ( any ( ) , any ( ) ) ;
verify ( service . qwenChatClient, never ( ) ) . completeJson ( any ( ) , any ( ) ) ;
verify ( service . aiTrainingEvaluationMapper) . completeHelp ( any ( AiTrainingEvaluation . class ) ) ;
}
}
@Test
@Test
@ -159,7 +188,7 @@ class AiTrainingEvaluationServiceImplTest {
when ( service . aiTrainingEvaluationMapper . claimHelp ( eq ( "evaluation-1" ) , any ( Date . class ) ) ) . thenReturn ( 1 ) ;
when ( service . aiTrainingEvaluationMapper . claimHelp ( eq ( "evaluation-1" ) , any ( Date . class ) ) ) . thenReturn ( 1 ) ;
when ( service . qwenChatClient . completeJson ( any ( ) , any ( ) ) ) . thenReturn ( helpJson ( ) ) ;
when ( service . qwenChatClient . completeJson ( any ( ) , any ( ) ) ) . thenReturn ( helpJson ( ) ) ;
service . generateHelp ( "new-product-survey" , student ( ) );
service . generateHelp ( "new-product-survey" , student ( ) , "请给出改进建议" );
verify ( service . qwenChatClient ) . completeJson ( any ( ) , any ( ) ) ;
verify ( service . qwenChatClient ) . completeJson ( any ( ) , any ( ) ) ;
verify ( service . aiTrainingEvaluationMapper ) . completeHelp ( any ( AiTrainingEvaluation . class ) ) ;
verify ( service . aiTrainingEvaluationMapper ) . completeHelp ( any ( AiTrainingEvaluation . class ) ) ;
@ -195,7 +224,7 @@ class AiTrainingEvaluationServiceImplTest {
demo . setDemoMode ( true ) ;
demo . setDemoMode ( true ) ;
demo . setDemoTeachingClassId ( "class-1" ) ;
demo . setDemoTeachingClassId ( "class-1" ) ;
assertThrows ( ServiceException . class , ( ) - > service . generateHelp ( "new-product-survey" , demo )) ;
assertThrows ( ServiceException . class , ( ) - > service . generateHelp ( "new-product-survey" , demo , "请给建议" )) ;
verify ( service . qwenChatClient , never ( ) ) . completeJson ( any ( ) , any ( ) ) ;
verify ( service . qwenChatClient , never ( ) ) . completeJson ( any ( ) , any ( ) ) ;
verify ( service . aiTrainingEvaluationMapper , never ( ) ) . insertIgnore ( any ( ) ) ;
verify ( service . aiTrainingEvaluationMapper , never ( ) ) . insertIgnore ( any ( ) ) ;
@ -248,7 +277,7 @@ class AiTrainingEvaluationServiceImplTest {
String xml = readResource ( "src/main/resources/mappers/AiTrainingEvaluationMapper.xml" ) ;
String xml = readResource ( "src/main/resources/mappers/AiTrainingEvaluationMapper.xml" ) ;
assertTrue ( xml . contains ( "INSERT IGNORE INTO ai_training_evaluation" ) ) ;
assertTrue ( xml . contains ( "INSERT IGNORE INTO ai_training_evaluation" ) ) ;
assertTrue ( xml . contains ( "help_status IN ('NOT_STARTED', 'FAILED' )") ) ;
assertTrue ( xml . contains ( "help_status IN ('NOT_STARTED', 'FAILED' , 'SUCCEEDED' )") ) ;
assertTrue ( xml . contains ( "assessment_status IN ('NOT_STARTED', 'FAILED')" ) ) ;
assertTrue ( xml . contains ( "assessment_status IN ('NOT_STARTED', 'FAILED')" ) ) ;
assertTrue ( xml . contains ( "help_status = 'SUCCEEDED'" ) ) ;
assertTrue ( xml . contains ( "help_status = 'SUCCEEDED'" ) ) ;
assertTrue ( xml . contains ( "assessment_status = 'SUCCEEDED'" ) ) ;
assertTrue ( xml . contains ( "assessment_status = 'SUCCEEDED'" ) ) ;