mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-09 23:44:20 +08:00
52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
import threading
|
|
from concurrent.futures import ThreadPoolExecutor
|
|
|
|
from app.db.systemconfig_oper import SystemConfigOper
|
|
from app.schemas.types import SystemConfigKey
|
|
|
|
|
|
def test_increment_serializes_concurrent_counter_updates(monkeypatch):
|
|
"""并发递增系统计数时不应丢失更新。"""
|
|
oper = object.__new__(SystemConfigOper)
|
|
oper._rlock = threading.RLock()
|
|
stored_value = {"value": 0}
|
|
|
|
monkeypatch.setattr(oper, "get", lambda _key: stored_value["value"])
|
|
monkeypatch.setattr(
|
|
oper,
|
|
"set",
|
|
lambda _key, value: stored_value.update(value=value),
|
|
)
|
|
|
|
with ThreadPoolExecutor(max_workers=8) as executor:
|
|
results = list(
|
|
executor.map(
|
|
lambda _index: oper.increment(
|
|
SystemConfigKey.MediaRecognizeShareCount
|
|
),
|
|
range(100),
|
|
)
|
|
)
|
|
|
|
assert sorted(results) == list(range(1, 101))
|
|
assert stored_value["value"] == 100
|
|
|
|
|
|
def test_increment_supports_custom_step(monkeypatch):
|
|
"""整数系统计数应支持指定递增步长。"""
|
|
oper = object.__new__(SystemConfigOper)
|
|
oper._rlock = threading.RLock()
|
|
stored_value = {"value": 4}
|
|
|
|
monkeypatch.setattr(oper, "get", lambda _key: stored_value["value"])
|
|
monkeypatch.setattr(
|
|
oper,
|
|
"set",
|
|
lambda _key, value: stored_value.update(value=value),
|
|
)
|
|
|
|
result = oper.increment(SystemConfigKey.MediaRecognizeShareCount, step=3)
|
|
|
|
assert result == 7
|
|
assert stored_value["value"] == 7
|