test_config_access.py 2.52 KB
from __future__ import annotations

from pathlib import Path
from types import SimpleNamespace

import services.shared.config.access as access
from services.shared.config.access import DatabaseRuntimeSettings


def test_read_settings_values_returns_stringified_payload(monkeypatch):
    monkeypatch.setattr(
        access,
        "get_settings",
        lambda reload=False: SimpleNamespace(HOST="127.0.0.1", PORT=5001, EMPTY=None),
    )

    payload = access.read_settings_values(["HOST", "PORT", "EMPTY", "MISSING"], reload=True)

    assert payload == {
        "HOST": "127.0.0.1",
        "PORT": "5001",
        "EMPTY": "",
        "MISSING": "",
    }


def test_resolve_settings_write_env_file_prefers_cwd_env(monkeypatch):
    project_root = Path("D:/repo")
    cwd = project_root / "apps" / "web_api"
    cwd_env = cwd / ".env"

    original_exists = Path.exists

    def _fake_exists(self: Path) -> bool:
        if self == cwd_env:
            return True
        return original_exists(self)

    monkeypatch.setattr(access.Path, "exists", _fake_exists)

    assert access.resolve_settings_write_env_file(cwd=cwd, project_root=project_root) == cwd / ".env"


def test_get_database_runtime_settings_normalizes_defaults(monkeypatch):
    monkeypatch.setattr(
        access,
        "get_settings",
        lambda reload=False: SimpleNamespace(
            DB_DIALECT="postgresql+psycopg",
            DB_HOST="db.internal",
            DB_PORT=6432,
            DB_USER="worker",
            DB_PASSWORD="secret",
            DB_NAME="bettafish_prod",
            DB_CHARSET="utf8",
        ),
    )

    settings_obj = access.get_database_runtime_settings(reload=True)

    assert settings_obj == DatabaseRuntimeSettings(
        dialect="postgresql+psycopg",
        host="db.internal",
        port="6432",
        user="worker",
        password="secret",
        name="bettafish_prod",
        charset="utf8",
    )
    assert settings_obj.uses_postgres is True
    assert settings_obj.crawler_save_option == "postgres"
    assert settings_obj.as_crawler_runtime_env()["POSTGRES_DB_PORT"] == "6432"


def test_database_runtime_settings_falls_back_to_db_defaults():
    settings_obj = DatabaseRuntimeSettings.from_settings(SimpleNamespace())

    assert settings_obj.host == "db"
    assert settings_obj.port == "5432"
    assert settings_obj.user == "bettafish"
    assert settings_obj.password == "bettafish"
    assert settings_obj.name == "bettafish"
    assert settings_obj.charset == "utf8mb4"
    assert settings_obj.crawler_save_option == "postgres"