import unittest from app.utils.guidance_analysis import GuidanceAnalyzer class GuidanceAnalyzerTest(unittest.TestCase): def test_selects_domain_related_debt_sentences(self): analyzer = GuidanceAnalyzer() paragraphs = [ "新华社北京消息。相关国有资产管理部门要建立以资产负债率为核心的监测与预警体系。", "对资产负债率超过预警线的国有企业,应综合分析有息负债、短期负债和经营活动现金净流量等指标。", ] sentences = analyzer.split_sentences(paragraphs) candidates = analyzer.select_candidates("过度负债", "", sentences) self.assertGreaterEqual(len(candidates), 2) self.assertIn("资产负债率", candidates[0]["text"]) self.assertTrue(candidates[0]["matched_keywords"]) def test_extracts_regulation_refs(self): analyzer = GuidanceAnalyzer() text = "核心法规包括《中央企业投资监督管理办法》和《关于加强国有企业资产负债约束的指导意见》。" refs = analyzer.extract_regulation_refs(text) self.assertIn("《中央企业投资监督管理办法》", refs) self.assertIn("《关于加强国有企业资产负债约束的指导意见》", refs) def test_penetration_dimension_prefers_chain_and_control_clues(self): analyzer = GuidanceAnalyzer() paragraphs = [ "企业要加强管理。", "要穿透识别实际控制人、最终受益人以及账户资金流向,核查交易对手和资金闭环。", ] candidates = analyzer.select_candidates("财务金融风险", "", analyzer.split_sentences(paragraphs), "high") self.assertIn("实际控制人", candidates[0]["text"]) self.assertIn(candidates[0]["supervision_dimension"], {"主体穿透", "资金穿透"}) def test_analyze_generates_basis_text(self): analyzer = GuidanceAnalyzer() content = ( "《关于加强国有企业资产负债约束的指导意见》明确要求。\n" "对资产负债率超过预警线的国有企业,应综合分析有息负债和偿债能力指标。" ).encode("utf-8") result = analyzer.analyze({"domain": "过度负债", "note": ""}, content, "guidance.txt") self.assertEqual(result["status"], "done") self.assertEqual(result["description_patterns"][0]["id"], "pattern-001") self.assertIn("description_pattern", result["description_patterns"][0]) self.assertIn("basis_text", result["description_patterns"][0]) self.assertIn("source_sentence", result["description_patterns"][0]) self.assertIn("supervision_dimension", result["description_patterns"][0]) self.assertEqual(result["policy_focus"], "穿透式监管") self.assertNotEqual( result["description_patterns"][0]["basis_text"], result["description_patterns"][0]["source_sentence"], ) self.assertNotEqual( result["description_patterns"][0]["basis_text"], result["description_patterns"][0]["description_pattern"], ) self.assertTrue(result["description_patterns"][0]["description_pattern"].startswith("核心法规:")) self.assertIn("条款要点:", result["description_patterns"][0]["description_pattern"]) self.assertEqual(result["description_patterns"][0]["description_pattern"].count("条款要点:"), 1) def test_analyze_honors_low_granularity_limits(self): analyzer = GuidanceAnalyzer() content = ( "相关国有资产管理部门要建立以资产负债率为核心的企业资产负债监测与预警体系。\n\n" "对资产负债率超过预警线的国有企业,应综合分析有息负债和偿债能力指标。" ).encode("utf-8") result = analyzer.analyze( {"domain": "过度负债", "note": ""}, content, "guidance.txt", granularity="low", ) self.assertEqual(result["status"], "done") self.assertEqual(result["granularity"], "low") self.assertLessEqual(len(result["description_patterns"]), 12) self.assertTrue(result["core_regulations"] == []) def test_high_granularity_caps_core_patterns_at_30(self): analyzer = GuidanceAnalyzer() lines = ["General management should be improved."] lines.extend( f"Debt rule {index}: monitor Debt ratio and trigger warning when indicator exceeds {index}%." for index in range(1, 41) ) content = "\n".join(lines).encode("utf-8") result = analyzer.analyze( {"domain": "Debt", "note": ""}, content, "guidance.txt", granularity="high", ) self.assertEqual(result["status"], "done") self.assertEqual(result["granularity"], "high") self.assertLessEqual(len(result["description_patterns"]), 30) self.assertGreater(len(result["description_patterns"]), 20) self.assertEqual( [item["id"] for item in result["description_patterns"]], [f"pattern-{index:03d}" for index in range(1, len(result["description_patterns"]) + 1)], ) self.assertNotIn("General management", "\n".join( item["source_sentence"] for item in result["description_patterns"] )) def test_legacy_granularity_values_are_normalized(self): analyzer = GuidanceAnalyzer() self.assertEqual(analyzer.normalize_granularity("coarse"), "low") self.assertEqual(analyzer.normalize_granularity("medium"), "high") self.assertEqual(analyzer.normalize_granularity("fine"), "high") self.assertTrue(analyzer.is_supported_granularity("coarse")) self.assertTrue(analyzer.is_supported_granularity("high")) self.assertFalse(analyzer.is_supported_granularity("unknown")) def test_literal_patterns_add_penetration_usage(self): analyzer = GuidanceAnalyzer() content = "要穿透识别实际控制人、最终受益人和资金流向,压实责任主体。".encode("utf-8") result = analyzer.analyze( {"domain": "财务金融风险", "note": ""}, content, "guidance.txt", ) self.assertEqual(result["policy_focus"], "穿透式监管") self.assertIn("穿透", result["description_patterns"][0]["usage"]) self.assertTrue(result["description_patterns"][0]["basis_text"].endswith("。")) self.assertNotEqual( result["description_patterns"][0]["basis_text"], result["description_patterns"][0]["source_sentence"], ) self.assertNotEqual( result["description_patterns"][0]["basis_text"], result["description_patterns"][0]["description_pattern"], ) self.assertTrue(result["description_patterns"][0]["description_pattern"].startswith("条款要点:")) self.assertEqual(result["description_patterns"][0]["description_pattern"].count("条款要点:"), 1) if __name__ == "__main__": unittest.main()