import unittest from src.step3_question_answer.recommendation import Recommender from src.step3_question_answer.knowledge_answers import reference_summary from src.step3_question_answer.report import markdown, render from test_recommendation import good_analysis, handoff, retrieval class ServiceVoiceTests(unittest.TestCase): def test_policy_summary_has_no_character_rejection(self): from src.step3_question_answer.cards import summarize from unittest.mock import Mock item = Recommender(lambda *args: good_analysis()).answer(handoff(), retrieval())['items'][0] text = '有效说明。' * 500 model = Mock(return_value={'text': text, 'source_ids': [item['source_id']]}) summary = summarize(model, '政策内容', [item], [], conversation_kind='policy_overview') self.assertEqual(summary['status'], 'generated') self.assertEqual(summary['text'], text) model.assert_called_once() def test_grounded_summary_leads_answer_and_markdown_actions_stay_last(self): lead = '您想学技能,可以先了解职业培训支持。' def model(instruction, data): if 'cards' in data: return {'text': lead + '\n\n### 可以先了解的支持\n\n- **职业培训**:提供培训服务。', 'source_ids': [data['cards'][0]['source_id']]} return good_analysis() result = Recommender(model).answer(handoff(), retrieval()) self.assertEqual(result['overview'], lead) self.assertTrue(result['summary']['text'].startswith(lead)) self.assertEqual(result['summary']['text'].count('### 下一步建议'), 1) self.assertLess(result['summary']['text'].index('### 可以先了解'), result['summary']['text'].index('### 下一步建议')) self.assertNotIn('由模型', result['overview']) self.assertEqual(result['items'][0]['is_policy_library'], True) html = render(result) self.assertIn('