File size: 8,003 Bytes
ec90eae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
"""
测试:Loop 插件
===============
测试所有内置插件的注册和执行
"""

import sys
sys.path.insert(0, '.')

import asyncio
from plugins.base import LoopPlugin, PluginRegistry, LoopStage, LoopContext, PluginResult


class DummyPlugin(LoopPlugin):
    """用于测试的虚拟插件"""

    def stage(self) -> LoopStage:
        return LoopStage.SUMMARIZE

    def name(self) -> str:
        return "dummy"

    async def run(self, ctx: LoopContext) -> PluginResult:
        return PluginResult(success=True, data={"dummy": True}, message="dummy ok")


class TestPluginBase:
    """测试插件基类"""

    def test_plugin_registry_init(self):
        """注册中心初始化应为空"""
        registry = PluginRegistry()
        assert registry.get_all() == []

    def test_register_plugin(self):
        """注册插件"""
        registry = PluginRegistry()
        plugin = DummyPlugin()
        registry.register(plugin)
        assert len(registry.get_all()) == 1

    def test_get_plugins_by_stage(self):
        """按阶段获取插件"""
        registry = PluginRegistry()
        registry.register(DummyPlugin())
        plugins = registry.get_plugins(LoopStage.SUMMARIZE)
        assert len(plugins) == 1

    def test_unregister_plugin(self):
        """注销插件"""
        registry = PluginRegistry()
        registry.register(DummyPlugin())
        registry.unregister("dummy")
        assert len(registry.get_all()) == 0

    def test_plugin_result_defaults(self):
        """PluginResult 默认值"""
        result = PluginResult()
        assert result.success is True
        assert result.data == {}
        assert result.message == ""

    def test_plugin_result_custom(self):
        """PluginResult 自定义值"""
        result = PluginResult(success=False, data={"key": "val"}, message="error")
        assert result.success is False
        assert result.data["key"] == "val"
        assert result.message == "error"

    def test_loop_context_defaults(self):
        """LoopContext 默认值"""
        ctx = LoopContext()
        assert ctx.briefing == {}
        assert ctx.diet_records == []
        assert ctx.errors == []


class TestFamilyQuizPlugins:
    """测试家庭问卷插件"""

    def test_family_recipe_quiz_plugin(self):
        """家庭菜谱检查插件"""
        from plugins.family_quiz import FamilyRecipeQuizPlugin
        plugin = FamilyRecipeQuizPlugin()
        assert plugin.stage() == LoopStage.FAMILY_QUIZ
        assert plugin.name() == "family_recipe_quiz"

    def test_weight_quiz_plugin(self):
        """体重询问检查插件"""
        from plugins.family_quiz import WeightQuizPlugin
        plugin = WeightQuizPlugin()
        assert plugin.stage() == LoopStage.FAMILY_QUIZ
        assert plugin.name() == "weight_quiz"


class TestSummarizePlugins:
    """测试总结阶段插件"""

    def test_diet_summary_plugin(self):
        """饮食总结插件"""
        from plugins.diet_summary import DietSummaryPlugin
        plugin = DietSummaryPlugin()
        assert plugin.stage() == LoopStage.SUMMARIZE
        assert plugin.name() == "diet_summary"

    def test_weight_check_plugin(self):
        """体重检查插件"""
        from plugins.weight_check import WeightCheckPlugin
        plugin = WeightCheckPlugin()
        assert plugin.stage() == LoopStage.SUMMARIZE
        assert plugin.name() == "weight_check"

    def test_family_memory_plugin(self):
        """家庭记忆插件"""
        from plugins.family_memory import FamilyMemoryPlugin
        plugin = FamilyMemoryPlugin()
        assert plugin.stage() == LoopStage.SUMMARIZE
        assert plugin.name() == "family_memory"


class TestAnalyzePlugins:
    """测试分析阶段插件"""

    def test_dri_analysis_plugin(self):
        """DRIs 分析插件"""
        from plugins.dri_analysis import DRIAnalysisPlugin
        plugin = DRIAnalysisPlugin()
        assert plugin.stage() == LoopStage.ANALYZE
        assert plugin.name() == "dri_analysis"


class TestBriefPlugins:
    """测试简报阶段插件"""

    def test_briefing_generator_plugin(self):
        """简报生成插件"""
        from plugins.briefing_generator import BriefingGeneratorPlugin
        plugin = BriefingGeneratorPlugin()
        assert plugin.stage() == LoopStage.BRIEF
        assert plugin.name() == "briefing_generator"


class TestThreeDayPlugins:
    """测试三天总结插件"""

    def test_three_day_summary_plugin(self):
        """三天总结插件"""
        from plugins.three_day_summary import ThreeDaySummaryPlugin
        plugin = ThreeDaySummaryPlugin()
        assert plugin.stage() == LoopStage.THREE_DAY
        assert plugin.name() == "three_day_summary"


class TestConsolidatePlugins:
    """测试整理阶段插件"""

    def test_preset_writer_plugin(self):
        """预设写入插件"""
        from plugins.preset_writer import PresetWriterPlugin
        plugin = PresetWriterPlugin()
        assert plugin.stage() == LoopStage.CONSOLIDATE
        assert plugin.name() == "preset_writer"


class TestPluginExecution:
    """测试插件执行"""

    def test_dummy_plugin_execution(self):
        """虚拟插件执行"""
        plugin = DummyPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True

    def test_family_recipe_quiz_execution(self):
        """家庭菜谱检查执行"""
        from plugins.family_quiz import FamilyRecipeQuizPlugin
        plugin = FamilyRecipeQuizPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True

    def test_weight_quiz_execution(self):
        """体重询问检查执行"""
        from plugins.family_quiz import WeightQuizPlugin
        plugin = WeightQuizPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True

    def test_diet_summary_execution(self):
        """饮食总结执行"""
        from plugins.diet_summary import DietSummaryPlugin
        plugin = DietSummaryPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True

    def test_weight_check_execution(self):
        """体重检查执行"""
        from plugins.weight_check import WeightCheckPlugin
        plugin = WeightCheckPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True

    def test_family_memory_execution(self):
        """家庭记忆执行"""
        from plugins.family_memory import FamilyMemoryPlugin
        plugin = FamilyMemoryPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True

    def test_dri_analysis_execution(self):
        """DRIs 分析执行"""
        from plugins.dri_analysis import DRIAnalysisPlugin
        plugin = DRIAnalysisPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True

    def test_briefing_generator_execution(self):
        """简报生成执行"""
        from plugins.briefing_generator import BriefingGeneratorPlugin
        plugin = BriefingGeneratorPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True

    def test_three_day_summary_execution(self):
        """三天总结执行"""
        from plugins.three_day_summary import ThreeDaySummaryPlugin
        plugin = ThreeDaySummaryPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True

    def test_preset_writer_execution(self):
        """预设写入执行"""
        from plugins.preset_writer import PresetWriterPlugin
        plugin = PresetWriterPlugin()
        ctx = LoopContext()
        result = asyncio.run(plugin.run(ctx))
        assert result.success is True