import copy import unittest from unittest.mock import Mock from src.step3_question_answer.support_highlight import support_highlight from src.step3_question_answer.recommendation import Recommender from test_recommendation import RECORD, candidate, good_analysis, handoff, retrieval def card(quote): return {'support_methods_standards': {'text': '不应当作原文的模型摘要', 'citations': [{'path': '/data/support', 'quote': quote}]}} class SupportHighlightTests(unittest.TestCase): def test_label_is_model_output_and_receives_original_quote(self): quote = '合成支持:最高80万元,每年发放。' refs = [{'path': '/data/support', 'quote': quote}] model = Mock(return_value={'text': '最高80万元/年', 'citations': refs}) result = support_highlight(model, card(quote)) self.assertEqual(result, {'text': '最高80万元/年', 'citations': refs, 'status': 'generated'}) self.assertEqual(model.call_count, 1) self.assertEqual(model.call_args.args[1]['evidence'], refs) self.assertNotIn('不应当作原文', str(model.call_args)) def test_invalid_or_failed_model_does_not_trigger_rule_amount_fallback(self): for value, error in (({}, 'highlight_invalid_schema'), ({'text': '最高99万元', 'citations': [{'path': '/wrong', 'quote': '最高99万元'}]}, 'highlight_invalid_citation'), ({'text': '最高99万元', 'citations': []}, 'highlight_invalid_citation')): result = support_highlight(Mock(return_value=value), card('最高99万元')) self.assertEqual(result['status'], 'fallback') self.assertEqual(result['text'], '扶持标准见详情') self.assertEqual(result['error'], error) self.assertEqual(support_highlight(Mock(side_effect=RuntimeError('SECRET')), card('最高99万元'))['error'], 'highlight_generation_failed') model = Mock() self.assertEqual(support_highlight(model, {})['status'], 'unavailable') model.assert_not_called() def test_selected_status_uses_llm_label_and_keeps_eligibility(self): record = copy.deepcopy(RECORD) record['data']['support'] = '提供培训服务。最高奖励20万元。' refs = [{'path': '/data/support', 'quote': record['data']['support']}] def model(instruction, payload): if payload.get('task') == 'policy_support_highlight': return {'text': '最高20万元', 'citations': refs} if 'cards' in payload: return {'text': '合成总结', 'source_ids': [record['id']]} value = good_analysis() value['card']['support_methods_standards'] = {'text': '培训支持', 'citations': refs} return value result = Recommender(model).answer(handoff(), retrieval([candidate(record)])) item = result['items'][0] self.assertEqual(item['recommendation_status'], '最高20万元') self.assertEqual(item['eligibility_status'], '相关线索,资格待核验') self.assertEqual(result['support_highlight_errors'], [])