feat: Implement environment variable fallback for configuration settings
This commit is contained in:
@@ -15,6 +15,15 @@ def _parse_csv_env(name: str) -> tuple[str, ...]:
|
|||||||
return tuple(item.strip().lower() for item in raw_value.split(",") if item.strip())
|
return tuple(item.strip().lower() for item in raw_value.split(",") if item.strip())
|
||||||
|
|
||||||
|
|
||||||
|
def _env_or_default(name: str, default: str) -> str:
|
||||||
|
raw_value = os.getenv(name)
|
||||||
|
if raw_value is None:
|
||||||
|
return default
|
||||||
|
|
||||||
|
normalized = raw_value.strip()
|
||||||
|
return normalized or default
|
||||||
|
|
||||||
|
|
||||||
class BaseConfig:
|
class BaseConfig:
|
||||||
"""Base configuration."""
|
"""Base configuration."""
|
||||||
SECRET_KEY = os.getenv("SECRET_KEY", "change-me-in-production")
|
SECRET_KEY = os.getenv("SECRET_KEY", "change-me-in-production")
|
||||||
@@ -25,10 +34,10 @@ class BaseConfig:
|
|||||||
MAX_CONTENT_LENGTH = int(
|
MAX_CONTENT_LENGTH = int(
|
||||||
os.getenv("ABSOLUTE_MAX_CONTENT_LENGTH_MB", 100)
|
os.getenv("ABSOLUTE_MAX_CONTENT_LENGTH_MB", 100)
|
||||||
) * 1024 * 1024
|
) * 1024 * 1024
|
||||||
UPLOAD_FOLDER = os.getenv("UPLOAD_FOLDER", "/tmp/uploads")
|
UPLOAD_FOLDER = _env_or_default("UPLOAD_FOLDER", "/tmp/uploads")
|
||||||
OUTPUT_FOLDER = os.getenv("OUTPUT_FOLDER", "/tmp/outputs")
|
OUTPUT_FOLDER = _env_or_default("OUTPUT_FOLDER", "/tmp/outputs")
|
||||||
FILE_EXPIRY_SECONDS = int(os.getenv("FILE_EXPIRY_SECONDS", 1800))
|
FILE_EXPIRY_SECONDS = int(os.getenv("FILE_EXPIRY_SECONDS", 1800))
|
||||||
DATABASE_PATH = os.getenv(
|
DATABASE_PATH = _env_or_default(
|
||||||
"DATABASE_PATH", os.path.join(BASE_DIR, "data", "dociva.db")
|
"DATABASE_PATH", os.path.join(BASE_DIR, "data", "dociva.db")
|
||||||
)
|
)
|
||||||
PERMANENT_SESSION_LIFETIME = timedelta(days=30)
|
PERMANENT_SESSION_LIFETIME = timedelta(days=30)
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
"""Tests for GET /api/config — dynamic upload limits."""
|
"""Tests for GET /api/config — dynamic upload limits."""
|
||||||
|
import importlib
|
||||||
|
import os
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
@@ -51,3 +54,22 @@ class TestConfigEndpoint:
|
|||||||
data = resp.get_json()
|
data = resp.get_json()
|
||||||
limits = data["file_limits_mb"]
|
limits = data["file_limits_mb"]
|
||||||
assert data["max_upload_mb"] == max(limits.values())
|
assert data["max_upload_mb"] == max(limits.values())
|
||||||
|
|
||||||
|
|
||||||
|
class TestConfigEnvironmentFallbacks:
|
||||||
|
"""Tests for environment values that should not accept blank strings."""
|
||||||
|
|
||||||
|
def test_blank_database_path_falls_back_to_default(self, monkeypatch):
|
||||||
|
"""A blank DATABASE_PATH must not create a temporary per-connection SQLite DB."""
|
||||||
|
monkeypatch.setenv("DATABASE_PATH", "")
|
||||||
|
|
||||||
|
import config as config_module
|
||||||
|
|
||||||
|
reloaded = importlib.reload(config_module)
|
||||||
|
try:
|
||||||
|
expected = os.path.join(reloaded.BASE_DIR, "data", "dociva.db")
|
||||||
|
assert reloaded.BaseConfig.DATABASE_PATH == expected
|
||||||
|
assert reloaded.ProductionConfig.DATABASE_PATH == expected
|
||||||
|
finally:
|
||||||
|
monkeypatch.delenv("DATABASE_PATH", raising=False)
|
||||||
|
importlib.reload(config_module)
|
||||||
|
|||||||
Reference in New Issue
Block a user