From 16a78663f3cb6d5aa4e66e3183a10984df77ff5a Mon Sep 17 00:00:00 2001 From: Johan Lundberg Date: Thu, 12 Feb 2026 14:42:26 +0100 Subject: [PATCH] feat: add configuration module with env-based settings --- pyproject.toml | 3 ++- src/fastapi_oidc_op/config.py | 36 ++++++++++++++++++++++++++++++++++ tests/test_config.py | 37 +++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/fastapi_oidc_op/config.py create mode 100644 tests/test_config.py diff --git a/pyproject.toml b/pyproject.toml index ccdce23..38bd484 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,8 +55,9 @@ indent-style = "space" docstring-code-format = true [tool.ty] + +[tool.ty.environment] python-version = "3.13" -src = ["src"] [tool.ty.rules] possibly-unresolved-reference = "error" diff --git a/src/fastapi_oidc_op/config.py b/src/fastapi_oidc_op/config.py new file mode 100644 index 0000000..c29a0f2 --- /dev/null +++ b/src/fastapi_oidc_op/config.py @@ -0,0 +1,36 @@ +# src/fastapi_oidc_op/config.py +from enum import StrEnum + +from pydantic_settings import BaseSettings + + +class StorageBackend(StrEnum): + SQLITE = "sqlite" + MONGODB = "mongodb" + + +class Settings(BaseSettings): + model_config = {"env_prefix": "OIDC_OP_"} + + # Core + issuer: str + debug: bool = False + + # Storage + storage_backend: StorageBackend = StorageBackend.SQLITE + + # SQLite + sqlite_path: str = "data/oidc_op.db" + + # MongoDB + mongodb_uri: str = "mongodb://localhost:27017" + mongodb_database: str = "oidc_op" + + # Management RP + manage_client_id: str = "manage-app" + + # Magic links + invite_ttl: int = 86400 # seconds + + # Theme + theme: str = "default" diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..9fb5330 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,37 @@ +# tests/test_config.py +import pytest + +from fastapi_oidc_op.config import Settings, StorageBackend + + +def test_default_settings() -> None: + settings = Settings( + issuer="http://localhost:8000", + ) + assert settings.issuer == "http://localhost:8000" + assert settings.storage_backend == StorageBackend.SQLITE + assert settings.sqlite_path == "data/oidc_op.db" + assert settings.manage_client_id == "manage-app" + assert settings.invite_ttl == 86400 + assert settings.theme == "default" + + +def test_mongodb_settings() -> None: + settings = Settings( + issuer="http://localhost:8000", + storage_backend=StorageBackend.MONGODB, + mongodb_uri="mongodb://mongo:27017", + mongodb_database="test_db", + ) + assert settings.storage_backend == StorageBackend.MONGODB + assert settings.mongodb_uri == "mongodb://mongo:27017" + assert settings.mongodb_database == "test_db" + + +def test_settings_from_env(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("OIDC_OP_ISSUER", "https://op.example.org") + monkeypatch.setenv("OIDC_OP_STORAGE_BACKEND", "mongodb") + monkeypatch.setenv("OIDC_OP_MONGODB_URI", "mongodb://remote:27017") + settings = Settings() # type: ignore[call-arg] + assert settings.issuer == "https://op.example.org" + assert settings.storage_backend == StorageBackend.MONGODB