test_config_budget.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from __future__ import annotations
  2. import pytest
  3. from pydantic import ValidationError
  4. from supply_infra.config import InfraSettings
  5. def _settings(**overrides: object) -> InfraSettings:
  6. values: dict[str, object] = {
  7. "PROCESS_ROLE": "api",
  8. "MYSQL_CONNECTION_BUDGET": 40,
  9. "MYSQL_POOL_SIZE_API": 6,
  10. "MYSQL_POOL_SIZE_CONTROL": 1,
  11. "MYSQL_OPERATIONAL_RESERVE": 4,
  12. "MYSQL_MAX_OVERFLOW": 0,
  13. "PIPELINE_WORKER_PROCESSES": 4,
  14. "PIPELINE_MAX_ACTIVE_STEPS": 4,
  15. }
  16. values.update(overrides)
  17. return InfraSettings(_env_file=None, **values)
  18. def test_standard_connection_profile_uses_twenty_of_forty() -> None:
  19. settings = _settings()
  20. assert settings.pipeline_required_connections == 20
  21. assert settings.mysql_connection_budget == 40
  22. def test_high_concurrency_profile_stays_within_fifty() -> None:
  23. settings = _settings(
  24. MYSQL_CONNECTION_BUDGET=50,
  25. PIPELINE_WORKER_PROCESSES=20,
  26. PIPELINE_MAX_ACTIVE_STEPS=10,
  27. )
  28. assert settings.pipeline_required_connections == 42
  29. def test_connection_budget_rejects_unbounded_twenty_by_twenty() -> None:
  30. with pytest.raises(ValidationError, match="connection budget exceeded"):
  31. _settings(
  32. MYSQL_CONNECTION_BUDGET=50,
  33. PIPELINE_WORKER_PROCESSES=20,
  34. PIPELINE_MAX_ACTIVE_STEPS=20,
  35. )
  36. def test_pool_overflow_must_remain_zero() -> None:
  37. with pytest.raises(ValidationError, match="MYSQL_MAX_OVERFLOW"):
  38. _settings(MYSQL_MAX_OVERFLOW=1)