fix(subscribe): clean deleted rule group references

This commit is contained in:
jxxghp
2026-08-26 20:58:15 +08:00
parent 1933887472
commit 88703d645a
7 changed files with 311 additions and 101 deletions
+5 -1
View File
@@ -1965,7 +1965,7 @@
}
},
"events": {
"consumer_count": 15,
"consumer_count": 16,
"dynamic_consumers": [
{
"caller": "app.adapters.system.fsproxy",
@@ -2293,6 +2293,10 @@
},
"EventType.ConfigChanged": {
"consumers": [
{
"caller": "app.chain.subscribe",
"count": 1
},
{
"caller": "app.runtime.extensions.module_manager",
"count": 1
@@ -227,6 +227,35 @@ async def test_non_plugin_system_config_does_not_resolve_plugin_runtime(
config.async_set.assert_awaited_once_with(SystemConfigKey.Directories.value, None)
@pytest.mark.asyncio
async def test_rule_group_setting_reconciles_stale_references_when_unchanged(
monkeypatch,
) -> None:
"""重复保存规则组也应按有效名称对账,修复旧版本遗留的悬空订阅引用。"""
config = MagicMock()
config.async_set = AsyncMock(return_value=None)
monkeypatch.setattr(
system_endpoint,
"get_runtime_settings",
lambda: SimpleNamespace(contains=lambda _key: False),
)
monkeypatch.setattr(
system_endpoint,
"get_configured_system_config",
lambda: config,
)
monkeypatch.setattr(system_endpoint.eventmanager, "async_send_event", AsyncMock())
response = await system_endpoint.set_setting(
SystemConfigKey.UserFilterRuleGroups.value,
[{"name": "keep", "rule_string": "4K"}],
None,
)
assert response.success is True
system_endpoint.eventmanager.async_send_event.assert_awaited_once()
@pytest.mark.asyncio
async def test_agent_non_plugin_config_does_not_resolve_plugin_runtime(
monkeypatch,
+78 -1
View File
@@ -1,9 +1,15 @@
from types import SimpleNamespace
from app.chain import subscribe as subscribe_module
from app.chain.subscribe import SubscribeChain
from app.agent.tools.impl._filter_rule_utils import normalize_media_type
from app.application.rules import RuleHelper
from app.domain.context import MediaInfo, MusicInfo, TorrentInfo
from app.modules.filter import FilterModule
from app.runtime.events import Event
from app.schemas.event import ConfigChangeEventData
from app.schemas.rule import FilterRuleGroup
from app.schemas.types import MediaType
from app.schemas.types import EventType, MediaType, SystemConfigKey
def test_agent_rule_group_media_type_accepts_music_aliases():
@@ -66,3 +72,74 @@ def test_rule_group_category_cannot_cross_media_types(monkeypatch):
media = MediaInfo(type=MediaType.TV, category="shared")
assert helper.get_rule_group_by_media(media=media, group_names=["movie-category"]) == []
def test_reconcile_rule_group_references_removes_all_dangling_bindings(monkeypatch):
"""规则组设置保存后应清理全局默认项、订阅默认值和已有订阅中的悬空名称。"""
values = {
SystemConfigKey.SearchFilterRuleGroups: ["keep", "deleted"],
SystemConfigKey.SubscribeFilterRuleGroups: ["deleted"],
SystemConfigKey.BestVersionFilterRuleGroups: ["keep"],
SystemConfigKey.DefaultMovieSubscribeConfig: {
"quality": "WEB-DL",
"filter_groups": ["deleted", "keep"],
},
SystemConfigKey.DefaultTvSubscribeConfig: {"filter_groups": ["deleted"]},
SystemConfigKey.DefaultMusicSubscribeConfig: {},
}
class Config:
"""记录规则引用对账产生的系统配置更新。"""
def get(self, key):
"""读取当前测试配置。"""
return values.get(key)
def set(self, key, value):
"""保存配置并更新测试快照。"""
values[key] = value
return True
subscribes = [
SimpleNamespace(
id=1,
name="Example",
season=1,
filter_groups=["deleted", "keep"],
)
]
updates = []
subscribe_port = SimpleNamespace(
list=lambda: subscribes,
update=lambda subscribe_id, payload: updates.append((subscribe_id, payload)),
)
monkeypatch.setattr(subscribe_module, "_system_config", lambda: Config())
monkeypatch.setattr(
subscribe_module,
"get_chain_subscribe_port",
lambda: subscribe_port,
)
SubscribeChain.reconcile_rule_group_references(
object.__new__(SubscribeChain),
Event(
EventType.ConfigChanged,
ConfigChangeEventData(
key=SystemConfigKey.UserFilterRuleGroups,
value=[{"name": "keep", "rule_string": "4K"}],
),
),
)
assert values[SystemConfigKey.SearchFilterRuleGroups] == ["keep"]
assert values[SystemConfigKey.SubscribeFilterRuleGroups] == []
assert values[SystemConfigKey.BestVersionFilterRuleGroups] == ["keep"]
assert values[SystemConfigKey.DefaultMovieSubscribeConfig] == {
"quality": "WEB-DL",
"filter_groups": ["keep"],
}
assert values[SystemConfigKey.DefaultTvSubscribeConfig] == {
"filter_groups": [],
}
assert updates == [(1, {"filter_groups": ["keep"]})]
assert subscribes[0].filter_groups == ["keep"]