Build 060.27: implement Persistent Market Data Storage

This commit is contained in:
2026-08-01 03:22:25 +03:00
parent cb8acfe5fe
commit 58e5a12a4d
54 changed files with 10243 additions and 101 deletions

View File

@@ -17,6 +17,13 @@ _TRADE_STREAM_VARIABLES = (
"TRADE_STREAM_RECOVERY_WINDOW_MS",
)
_MARKET_DATA_STORAGE_VARIABLES = (
"MARKET_DATA_STORAGE_ENABLED",
"MARKET_DATA_STORAGE_POOL_MIN_SIZE",
"MARKET_DATA_STORAGE_POOL_MAX_SIZE",
"MARKET_DATA_STORAGE_POOL_TIMEOUT_SECONDS",
)
def prepare_environment(
monkeypatch: pytest.MonkeyPatch,
@@ -28,6 +35,9 @@ def prepare_environment(
for variable in _TRADE_STREAM_VARIABLES:
monkeypatch.delenv(variable, raising=False)
for variable in _MARKET_DATA_STORAGE_VARIABLES:
monkeypatch.delenv(variable, raising=False)
def enable_trade_stream(
monkeypatch: pytest.MonkeyPatch,
@@ -200,3 +210,142 @@ def test_symbols_must_not_contain_empty_items(
match="empty symbols",
):
load_settings()
def test_market_data_storage_is_disabled_by_default(
monkeypatch: pytest.MonkeyPatch,
) -> None:
prepare_environment(monkeypatch)
settings = load_settings()
assert settings.market_data_storage.enabled is False
assert settings.market_data_storage.pool_min_size == 1
assert settings.market_data_storage.pool_max_size == 4
assert settings.market_data_storage.pool_timeout_seconds == 10.0
def test_disabled_market_data_storage_ignores_dependent_values(
monkeypatch: pytest.MonkeyPatch,
) -> None:
prepare_environment(monkeypatch)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_POOL_MIN_SIZE",
"invalid",
)
settings = load_settings()
assert settings.market_data_storage.enabled is False
def test_market_data_storage_flag_is_strict(
monkeypatch: pytest.MonkeyPatch,
) -> None:
prepare_environment(monkeypatch)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_ENABLED",
"sometimes",
)
with pytest.raises(
ValueError,
match="MARKET_DATA_STORAGE_ENABLED",
):
load_settings()
def test_enabled_market_data_storage_requires_trade_stream(
monkeypatch: pytest.MonkeyPatch,
) -> None:
prepare_environment(monkeypatch)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_ENABLED",
"true",
)
with pytest.raises(
RuntimeError,
match="TRADE_STREAM_ENABLED",
):
load_settings()
def test_enabled_market_data_storage_parses_pool_settings(
monkeypatch: pytest.MonkeyPatch,
) -> None:
prepare_environment(monkeypatch)
enable_trade_stream(monkeypatch)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_ENABLED",
"true",
)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_POOL_MIN_SIZE",
"2",
)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_POOL_MAX_SIZE",
"7",
)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_POOL_TIMEOUT_SECONDS",
"12.5",
)
storage = load_settings().market_data_storage
assert storage.enabled is True
assert storage.pool_min_size == 2
assert storage.pool_max_size == 7
assert storage.pool_timeout_seconds == 12.5
@pytest.mark.parametrize(
("variable", "value"),
(
("MARKET_DATA_STORAGE_POOL_MIN_SIZE", "0"),
("MARKET_DATA_STORAGE_POOL_MAX_SIZE", "invalid"),
("MARKET_DATA_STORAGE_POOL_TIMEOUT_SECONDS", "nan"),
),
)
def test_enabled_market_data_storage_rejects_invalid_pool_settings(
monkeypatch: pytest.MonkeyPatch,
variable: str,
value: str,
) -> None:
prepare_environment(monkeypatch)
enable_trade_stream(monkeypatch)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_ENABLED",
"true",
)
monkeypatch.setenv(variable, value)
with pytest.raises(ValueError, match=variable):
load_settings()
def test_pool_max_size_must_not_be_smaller_than_min_size(
monkeypatch: pytest.MonkeyPatch,
) -> None:
prepare_environment(monkeypatch)
enable_trade_stream(monkeypatch)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_ENABLED",
"true",
)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_POOL_MIN_SIZE",
"5",
)
monkeypatch.setenv(
"MARKET_DATA_STORAGE_POOL_MAX_SIZE",
"4",
)
with pytest.raises(
ValueError,
match="POOL_MAX_SIZE",
):
load_settings()