Files
winnow/tests/test_config.py
T
flan 0afc9386c6 feat: dynamic Frigate score ceiling; consolidate quality replacement branches
FRIGATE_SCORE_CEILING now defaults to dynamic mode (unset): below-cap
candidates are skipped if their pre-upload Frigate score exceeds the
most-redundant tracked file's score. This catches conditions already
covered by manually-added Frigate images that winnow cannot track —
the embedding-based diversity selection has no visibility into those.
Set FRIGATE_SCORE_CEILING=0 to disable; a positive value (e.g. 0.85)
still acts as a fixed hard ceiling. First-run safety is unchanged
(pre_run_count==0 prevents recognize_face from being called).

The two quality replacement branches (Frigate-score and blur-score)
shared identical structure and are merged into a single code path
parameterised by score source and comparison direction.

Also raises MIN_FACE_COUNT default from 0 to 3 and updates the
config test to match.
2026-06-14 16:38:25 +00:00

82 lines
2.5 KiB
Python

"""Smoke tests for configuration loading."""
def test_config_loads_defaults(monkeypatch):
"""Config reads env vars and falls back to documented defaults."""
monkeypatch.setenv("IMMICH_URL", "http://test:2283")
monkeypatch.setenv("API_KEY", "test-key")
from winnow.config import _Config
_Config.reset()
cfg = _Config()
assert cfg.IMMICH_URL == "http://test:2283"
assert cfg.API_KEY == "test-key"
assert cfg.OUTPUT_DIR == "./frigate_train"
assert cfg.YEARS_FILTER == 10
assert cfg.MIN_FACE_WIDTH == 90
assert cfg.MIN_FACE_COUNT == 3
assert cfg.BLUR_THRESHOLD == 120.0
assert cfg.MIN_CONFIDENCE == 0.7
assert cfg.MAX_AUTO_IMAGES == 80
assert cfg.QUALITY_REPLACEMENT is True
assert cfg.FACE_MARGIN == 0.15
assert cfg.USE_FULL_RESOLUTION is True
assert cfg.ENABLE_FACE_ALIGNMENT is True
assert cfg.ENABLE_CACHE is True
_Config.reset()
def test_config_env_overrides(monkeypatch):
"""All quality settings are overridable via environment variables."""
monkeypatch.setenv("IMMICH_URL", "http://test:2283")
monkeypatch.setenv("API_KEY", "test-key")
monkeypatch.setenv("YEARS_FILTER", "5")
monkeypatch.setenv("MIN_FACE_WIDTH", "80")
monkeypatch.setenv("BLUR_THRESHOLD", "50.0")
monkeypatch.setenv("MIN_CONFIDENCE", "0.9")
monkeypatch.setenv("MAX_AUTO_IMAGES", "40")
monkeypatch.setenv("QUALITY_REPLACEMENT", "false")
monkeypatch.setenv("FACE_MARGIN", "0.2")
monkeypatch.setenv("USE_FULL_RESOLUTION", "false")
monkeypatch.setenv("ENABLE_FACE_ALIGNMENT", "false")
monkeypatch.setenv("ENABLE_CACHE", "true")
from winnow.config import _Config
_Config.reset()
cfg = _Config()
assert cfg.YEARS_FILTER == 5
assert cfg.MIN_FACE_WIDTH == 80
assert cfg.BLUR_THRESHOLD == 50.0
assert cfg.MIN_CONFIDENCE == 0.9
assert cfg.MAX_AUTO_IMAGES == 40
assert cfg.QUALITY_REPLACEMENT is False
assert cfg.FACE_MARGIN == 0.2
assert cfg.USE_FULL_RESOLUTION is False
assert cfg.ENABLE_FACE_ALIGNMENT is False
assert cfg.ENABLE_CACHE is True
_Config.reset()
def test_get_headers_returns_api_key(monkeypatch):
"""get_headers() returns the correct auth header dict."""
monkeypatch.setenv("IMMICH_URL", "http://test:2283")
monkeypatch.setenv("API_KEY", "my-secret-key")
from winnow.config import _Config, get_headers
_Config.reset()
headers = get_headers()
assert headers["x-api-key"] == "my-secret-key"
assert headers["Accept"] == "application/json"
_Config.reset()