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