#!/usr/bin/env python3 """ Annotation Skill Tests - 功能注释技能测试 """ import json import os import sys import tempfile import unittest from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from run import AnnotationSkill class TestAnnotationSkill(unittest.TestCase): """测试功能注释技能""" def setUp(self): self.skill = AnnotationSkill() self.temp_dir = Path(tempfile.mkdtemp()) def tearDown(self): import shutil if self.temp_dir.exists(): shutil.rmtree(self.temp_dir) def test_find_emapper(self): """测试查找emapper.py""" try: python_path, emapper_path = self.skill._find_emapper() self.assertTrue(Path(python_path).exists()) self.assertTrue(Path(emapper_path).exists()) except RuntimeError: self.skipTest("emapper.py not installed") def test_parse_annotations(self): """测试解析annotations文件""" annot_file = self.temp_dir / "test.emapper.annotations" annot_file.write_text("""## emapper-version: 2.1.12 #query\tseed_ortholog\tevalue\tscore\teggnog_OGs\tmax_annot_lvl\tCOG_category\tDescription\tPreferred_name\tGOs\tEC\tKEGG_ko\tKEGG_Pathway\tKEGG_Module\tKEGG_Reaction\tKEGG_rclass\tBRITE\tKEGG_TC\tCAZy\tBiGG_Reaction\tPFAMs Gene001\t10090.1\t1e-50\t200.0\tCOG0001@1|root\tEukaryota\tJ\tDesc\tGENE1\tGO:0005524\t-\tko:K00001\t-\t-\t-\t-\t-\t-\t-\t-\tPF00001 Gene002\t10090.2\t2e-45\t180.0\tCOG0002@1|root\tEukaryota\tK\tDesc\tGENE2\tGO:0003677\t-\tko:K00002\t-\t-\t-\t-\t-\t-\t-\t-\tPF00002 Gene003\t10090.3\t5e-40\t160.0\tCOG0003@1|root\tEukaryota\tL\tDesc\tGENE3\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\tPF00003 """) stats = self.skill._parse_annotations(annot_file) self.assertEqual(stats["total_genes"], 3) self.assertEqual(stats["with_go"], 2) self.assertEqual(stats["with_kegg"], 2) self.assertEqual(stats["with_cog"], 3) self.assertEqual(stats["with_pfam"], 3) self.assertEqual(stats["go_count"], 2) self.assertEqual(stats["kegg_count"], 2) def test_demo_mode(self): """测试Demo模式""" result = self.skill.run_demo(self.temp_dir) self.assertEqual(result["status"], "success") self.assertTrue(Path(result["annotations"]).exists()) self.assertTrue(Path(result["report"]).exists()) # 检查输出文件 annot_file = Path(result["annotations"]) self.assertTrue(annot_file.exists()) # 检查统计 self.assertEqual(result["stats"]["total_genes"], 3) def test_config_loading(self): """测试配置加载""" config = self.skill.config self.assertIn("skill", config) self.assertIn("parameters", config) self.assertIn("emapper", config["parameters"]) emapper_params = config["parameters"]["emapper"] self.assertIn("mode", emapper_params) self.assertIn("evalue", emapper_params) self.assertIn("cpu", emapper_params) if __name__ == "__main__": unittest.main()