|
|
|
|
@ -482,6 +482,40 @@ class TestSymbolTimestamp:
|
|
|
|
|
assert sqlite_record.last_refresh_at == refresh_time
|
|
|
|
|
assert sqlite_record.refresh_count == 1
|
|
|
|
|
|
|
|
|
|
def test_update_symbol_timestamp_falls_back_to_sqlite_when_storage_returns_false(self, db, storage_manager_mock):
|
|
|
|
|
"""StorageManager 可用但返回 False 时降级到 SQLite 写入合约时间戳。"""
|
|
|
|
|
storage_manager_mock.save_symbol_timestamp.return_value = False
|
|
|
|
|
refresh_time = datetime(2026, 7, 4, 10, 0, 0)
|
|
|
|
|
|
|
|
|
|
with patch("app.services.cache.get_storage_manager", return_value=storage_manager_mock):
|
|
|
|
|
from app.services import cache
|
|
|
|
|
|
|
|
|
|
cache.update_symbol_timestamp(db, "AG2606", "futures", refresh_time)
|
|
|
|
|
|
|
|
|
|
storage_manager_mock.save_symbol_timestamp.assert_called_once_with("AG2606", "futures", refresh_time)
|
|
|
|
|
sqlite_record = db.query(SymbolTimestamp).filter_by(symbol="AG2606").first()
|
|
|
|
|
assert sqlite_record is not None
|
|
|
|
|
assert sqlite_record.last_refresh_at == refresh_time
|
|
|
|
|
assert sqlite_record.refresh_count == 1
|
|
|
|
|
|
|
|
|
|
def test_update_symbol_timestamp_falls_back_to_sqlite_when_storage_raises(self, db, storage_manager_mock, caplog):
|
|
|
|
|
"""StorageManager 可用但写入异常时降级到 SQLite 写入合约时间戳并记录警告。"""
|
|
|
|
|
storage_manager_mock.save_symbol_timestamp.side_effect = Exception("mysql down")
|
|
|
|
|
refresh_time = datetime(2026, 7, 4, 10, 0, 0)
|
|
|
|
|
|
|
|
|
|
with patch("app.services.cache.get_storage_manager", return_value=storage_manager_mock):
|
|
|
|
|
from app.services import cache
|
|
|
|
|
|
|
|
|
|
with caplog.at_level(logging.WARNING, logger="app.services.cache"):
|
|
|
|
|
cache.update_symbol_timestamp(db, "AG2606", "futures", refresh_time)
|
|
|
|
|
|
|
|
|
|
storage_manager_mock.save_symbol_timestamp.assert_called_once_with("AG2606", "futures", refresh_time)
|
|
|
|
|
sqlite_record = db.query(SymbolTimestamp).filter_by(symbol="AG2606").first()
|
|
|
|
|
assert sqlite_record is not None
|
|
|
|
|
assert sqlite_record.last_refresh_at == refresh_time
|
|
|
|
|
assert sqlite_record.refresh_count == 1
|
|
|
|
|
assert "StorageManager 时间戳写入失败" in caplog.text
|
|
|
|
|
|
|
|
|
|
def test_get_symbol_timestamp_uses_storage_when_available(self, db, storage_manager_mock):
|
|
|
|
|
"""StorageManager 可用时优先读取合约时间戳。"""
|
|
|
|
|
storage_manager_mock.get_symbol_timestamp.return_value = {
|
|
|
|
|
|