| """Tests for security-critical config behavior.""" |
|
|
| from __future__ import annotations |
|
|
| import os |
|
|
| import pytest |
|
|
|
|
| def test_jwt_secret_autogenerated_in_dev(): |
| """In non-production, an empty JWT_SECRET should auto-generate.""" |
| os.environ["ENVIRONMENT"] = "development" |
| os.environ["JWT_SECRET"] = "" |
| os.environ.setdefault("DATABASE_URL", "sqlite:///:memory:") |
|
|
| from app.core.config import Settings |
|
|
| settings = Settings() |
| assert settings.jwt_secret != "" |
| assert len(settings.jwt_secret) == 64 |
|
|
|
|
| def test_jwt_secret_fails_in_production_when_empty(): |
| """In production, an empty JWT_SECRET must raise, not silently generate.""" |
| os.environ["ENVIRONMENT"] = "production" |
| os.environ["JWT_SECRET"] = "" |
| os.environ.setdefault("DATABASE_URL", "sqlite:///:memory:") |
|
|
| from app.core.config import Settings |
|
|
| with pytest.raises(ValueError, match="JWT_SECRET must be explicitly set"): |
| Settings() |
|
|
|
|
| def test_jwt_secret_fails_in_production_with_known_default(): |
| """Known defaults like the old docker-compose fallback must also fail.""" |
| os.environ["ENVIRONMENT"] = "production" |
| os.environ["JWT_SECRET"] = "depscreen-docker-secret" |
| os.environ.setdefault("DATABASE_URL", "sqlite:///:memory:") |
|
|
| from app.core.config import Settings |
|
|
| with pytest.raises(ValueError, match="JWT_SECRET must be explicitly set"): |
| Settings() |
|
|
|
|
| def test_jwt_secret_accepted_in_production_when_explicit(): |
| """A real secret in production should be accepted as-is.""" |
| os.environ["ENVIRONMENT"] = "production" |
| os.environ["JWT_SECRET"] = "a" * 64 |
| |
| |
| os.environ["DATABASE_URL"] = "postgresql://user:pass@db.example.com:5432/depscreen" |
|
|
| from app.core.config import Settings |
|
|
| settings = Settings() |
| assert settings.jwt_secret == "a" * 64 |
|
|