mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-29 03:56:43 +08:00
61 lines
2.1 KiB
Python
61 lines
2.1 KiB
Python
"""插件持久化数据删除的事务所有权测试。"""
|
|
|
|
from unittest.mock import Mock
|
|
|
|
import pytest
|
|
|
|
from app.application.plugin.data import DeletePluginDataCommand
|
|
from app.db.models.plugindata import PluginData
|
|
from app.db.oper.plugindata import PluginDataOper
|
|
|
|
|
|
def test_delete_plugin_data_stages_then_commits() -> None:
|
|
"""插件重置必须在仓储暂存完成后由 Application Command 提交。"""
|
|
calls: list[str] = []
|
|
repository = Mock()
|
|
repository.stage_delete.side_effect = lambda _plugin_id: calls.append("stage")
|
|
unit_of_work = Mock()
|
|
unit_of_work.commit.side_effect = lambda: calls.append("commit")
|
|
command = DeletePluginDataCommand(repository, unit_of_work)
|
|
|
|
command.execute("Demo")
|
|
|
|
assert calls == ["stage", "commit"]
|
|
repository.stage_delete.assert_called_once_with("Demo")
|
|
unit_of_work.rollback.assert_not_called()
|
|
|
|
|
|
def test_delete_plugin_data_rolls_back_commit_failure() -> None:
|
|
"""插件数据删除提交失败必须回滚并保留原异常。"""
|
|
error = RuntimeError("commit failed")
|
|
repository = Mock()
|
|
unit_of_work = Mock()
|
|
unit_of_work.commit.side_effect = error
|
|
command = DeletePluginDataCommand(repository, unit_of_work)
|
|
|
|
with pytest.raises(RuntimeError) as raised:
|
|
command.execute("Demo")
|
|
|
|
assert raised.value is error
|
|
unit_of_work.rollback.assert_called_once_with()
|
|
|
|
|
|
def test_plugin_data_oper_stage_delete_does_not_commit(db, monkeypatch) -> None:
|
|
"""Oper 只暂存目标插件删除,其他插件数据与提交权均不受影响。"""
|
|
db.add(
|
|
PluginData(plugin_id="Target", key="one", value=1),
|
|
PluginData(plugin_id="Other", key="two", value=2),
|
|
)
|
|
commit = Mock(wraps=db.session.commit)
|
|
monkeypatch.setattr(db.session, "commit", commit)
|
|
oper = PluginDataOper(db.session)
|
|
|
|
oper.stage_delete("Target")
|
|
|
|
remaining = PluginData.get_plugin_data(db.session, "Other")
|
|
deleted = PluginData.get_plugin_data(db.session, "Target")
|
|
assert [item.key for item in remaining] == ["two"]
|
|
assert deleted == []
|
|
commit.assert_not_called()
|
|
db.session.rollback()
|