From b09fe890d817cc041680cc0060f9e108629bfc90 Mon Sep 17 00:00:00 2001 From: Your Name <119736744+aborayan2022@users.noreply.github.com> Date: Thu, 19 Mar 2026 06:04:15 +0200 Subject: [PATCH] feat: Implement environment variable fallback for configuration settings --- backend/config/__init__.py | 15 ++++++++++++--- backend/tests/test_config.py | 22 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/backend/config/__init__.py b/backend/config/__init__.py index 8cbe8cb..fcfd80f 100644 --- a/backend/config/__init__.py +++ b/backend/config/__init__.py @@ -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()) +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: """Base configuration.""" SECRET_KEY = os.getenv("SECRET_KEY", "change-me-in-production") @@ -25,10 +34,10 @@ class BaseConfig: MAX_CONTENT_LENGTH = int( os.getenv("ABSOLUTE_MAX_CONTENT_LENGTH_MB", 100) ) * 1024 * 1024 - UPLOAD_FOLDER = os.getenv("UPLOAD_FOLDER", "/tmp/uploads") - OUTPUT_FOLDER = os.getenv("OUTPUT_FOLDER", "/tmp/outputs") + UPLOAD_FOLDER = _env_or_default("UPLOAD_FOLDER", "/tmp/uploads") + OUTPUT_FOLDER = _env_or_default("OUTPUT_FOLDER", "/tmp/outputs") 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") ) PERMANENT_SESSION_LIFETIME = timedelta(days=30) diff --git a/backend/tests/test_config.py b/backend/tests/test_config.py index 3e86a5a..408bbdb 100644 --- a/backend/tests/test_config.py +++ b/backend/tests/test_config.py @@ -1,4 +1,7 @@ """Tests for GET /api/config — dynamic upload limits.""" +import importlib +import os + import pytest @@ -51,3 +54,22 @@ class TestConfigEndpoint: data = resp.get_json() limits = data["file_limits_mb"] 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)