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('

可以先了解的支持

', html) self.assertIn('职业培训', html) self.assertIn('
    ', html) def test_summary_failure_uses_existing_cited_answer_as_opening(self): result = Recommender(lambda *args: good_analysis()).answer(handoff(), retrieval()) self.assertEqual(result['summary']['status'], 'fallback') self.assertEqual(result['overview'], good_analysis()['answer']) self.assertIn('### 可以先了解的支持', result['summary']['text']) def test_exact_qa_answer_without_source_appendix_or_rewriting(self): answer = '可以线上提交;特殊事项除外。' result = reference_summary([{'source_id': 'qa', 'title': '合成材料问题', 'answer': answer, 'citations': [{'path': '/data/answer', 'quote': answer}], 'exact_qa': True}]) self.assertTrue(result['text'].startswith('> ' + answer)) self.assertEqual(result['citations'][0]['quote'], answer) self.assertEqual(result['text'], '> ' + answer) def test_markdown_does_not_activate_html_images_or_links(self): html = markdown('### 标题\n\n\n\n![图片](https://example.invalid/a.png)\n\n[链接](javascript:bad())') self.assertIn('

    标题

    ', html) self.assertNotIn('