mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
fix(subscribe): clean deleted rule group references
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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"]
|
||||
|
||||
Reference in New Issue
Block a user