1import pytest 2 3from backend.config import Settings 4 5 6@pytest.fixture(autouse=True) 7def clear_settings_env(monkeypatch): 8 env_vars = [ 9 "PORT", 10 "FRONTEND_URL", 11 "BACKGROUND_TASK_INTERVAL_SECONDS", 12 "DATABASE_URL", 13 "R2_BUCKET", 14 "AWS_ACCESS_KEY_ID", 15 "AWS_SECRET_ACCESS_KEY", 16 "R2_ENDPOINT_URL", 17 "R2_PUBLIC_BUCKET_URL", 18 "ATPROTO_CLIENT_ID", 19 "ATPROTO_SCOPE_OVERRIDE", 20 "ATPROTO_REDIRECT_URI", 21 "OAUTH_ENCRYPTION_KEY", 22 "LOGFIRE_ENABLED", 23 "LOGFIRE_WRITE_TOKEN", 24 "NOTIFY_ENABLED", 25 "NOTIFY_RECIPIENT_HANDLE", 26 "NOTIFY_BOT_HANDLE", 27 "NOTIFY_BOT_PASSWORD", 28 "BROADCAST_CHANNEL_PREFIX", 29 ] 30 31 for var in env_vars: 32 monkeypatch.delenv(var, raising=False) 33 34 35def test_settings_loads_env(monkeypatch): 36 monkeypatch.setenv("PORT", "9100") 37 monkeypatch.setenv("FRONTEND_URL", "https://relay.example.com") 38 monkeypatch.setenv("DATABASE_URL", "postgresql+psycopg://user:pass@host/db") 39 monkeypatch.setenv("R2_BUCKET", "media") 40 monkeypatch.setenv("AWS_ACCESS_KEY_ID", "key123") 41 monkeypatch.setenv("ATPROTO_CLIENT_ID", "https://client/meta.json") 42 monkeypatch.setenv("ATPROTO_REDIRECT_URI", "https://relay.example.com/callback") 43 monkeypatch.setenv("OAUTH_ENCRYPTION_KEY", "Z2V0LXlvdXItb3duLWRhbS1rZXk=") 44 monkeypatch.setenv("LOGFIRE_ENABLED", "true") 45 monkeypatch.setenv("LOGFIRE_WRITE_TOKEN", "pylf_token") 46 monkeypatch.setenv("NOTIFY_ENABLED", "true") 47 monkeypatch.setenv("NOTIFY_RECIPIENT_HANDLE", "relay.example") 48 monkeypatch.setenv("NOTIFY_BOT_HANDLE", "bot.handle") 49 monkeypatch.setenv("NOTIFY_BOT_PASSWORD", "secret") 50 51 settings = Settings() 52 53 assert settings.app.port == 9100 54 assert settings.frontend.url == "https://relay.example.com" 55 assert settings.database.url == "postgresql+psycopg://user:pass@host/db" 56 assert settings.storage.r2_bucket == "media" 57 assert settings.storage.aws_access_key_id == "key123" 58 assert settings.atproto.client_id == "https://client/meta.json" 59 assert settings.atproto.redirect_uri == "https://relay.example.com/callback" 60 assert settings.atproto.oauth_encryption_key == "Z2V0LXlvdXItb3duLWRhbS1rZXk=" 61 assert settings.observability.enabled is True 62 assert settings.observability.write_token == "pylf_token" 63 assert settings.notify.enabled is True 64 assert settings.notify.recipient_handle == "relay.example" 65 assert settings.notify.bot.handle == "bot.handle" 66 assert settings.notify.bot.password == "secret" 67 68 69def test_settings_supports_nested_env(monkeypatch): 70 monkeypatch.setenv("PORT", "9300") 71 monkeypatch.setenv("BROADCAST_CHANNEL_PREFIX", "newprefix") 72 monkeypatch.setenv("FRONTEND_URL", "https://cdn.example.com") 73 monkeypatch.setenv("ATPROTO_CLIENT_ID", "https://new/meta.json") 74 monkeypatch.setenv("ATPROTO_SCOPE_OVERRIDE", "custom scope") 75 76 settings = Settings() 77 78 assert settings.app.port == 9300 79 assert settings.app.broadcast_channel_prefix == "newprefix" 80 assert settings.frontend.url == "https://cdn.example.com" 81 assert settings.atproto.client_id == "https://new/meta.json" 82 assert settings.atproto.scope_override == "custom scope"