42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""Config parses env and never leaks secrets."""
|
|
|
|
from pathlib import Path
|
|
|
|
from photo_pipeline.config import Config
|
|
|
|
|
|
def test_from_env_reads_prefixed_values():
|
|
config = Config.from_env(
|
|
{
|
|
"PHOTO_PIPELINE_DATA_DIR": "/tmp/pp",
|
|
"PHOTO_PIPELINE_PORT": "9123",
|
|
"PHOTO_PIPELINE_LOG_FORMAT": "text",
|
|
"UNRELATED": "ignored",
|
|
}
|
|
)
|
|
assert config.data_dir == Path("/tmp/pp")
|
|
assert config.port == 9123
|
|
assert config.log_format == "text"
|
|
|
|
|
|
def test_defaults_and_derived_paths():
|
|
config = Config.from_env({})
|
|
assert config.host == "127.0.0.1"
|
|
assert config.database_path == Path("data") / "photo_pipeline.db"
|
|
assert config.database_url == f"sqlite:///{config.database_path}"
|
|
|
|
|
|
def test_secrets_are_masked_everywhere_but_get_secret_value():
|
|
config = Config.from_env({"PHOTO_PIPELINE_VISION_API_KEY": "super-secret-key"})
|
|
assert config.vision_api_key.get_secret_value() == "super-secret-key"
|
|
# Masked in repr, str, and serialized output.
|
|
assert "super-secret-key" not in repr(config)
|
|
assert "super-secret-key" not in str(config)
|
|
assert "super-secret-key" not in config.model_dump_json()
|
|
|
|
|
|
def test_missing_secret_is_none():
|
|
config = Config.from_env({})
|
|
assert config.vision_api_key is None
|
|
assert config.immich_api_key is None
|