Build 060.27: implement Persistent Market Data Storage
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user