48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
"""MAX stays off without credentials; enabled deployments fail closed on incomplete settings."""
|
|
|
|
import pytest
|
|
from pydantic import ValidationError
|
|
|
|
from app.config import Settings
|
|
|
|
|
|
def configured(**overrides):
|
|
fields = {
|
|
"max_enabled": True,
|
|
"max_bot_token": "test-only-token",
|
|
"max_bot_username": "test_bot",
|
|
"max_webhook_secret": "test-only-secret-" * 3,
|
|
"max_webhook_url": "https://api.example.org/api/v1/webhooks/max",
|
|
"max_site_url": "https://patient.example.org/#/today",
|
|
}
|
|
return Settings(_env_file=None, **(fields | overrides))
|
|
|
|
|
|
def test_max_disabled_by_default():
|
|
assert not Settings(_env_file=None).max_enabled
|
|
|
|
|
|
def test_max_secrets_are_redacted():
|
|
settings = configured()
|
|
assert "test-only-token" not in repr(settings)
|
|
assert "test-only-secret" not in repr(settings)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"overrides",
|
|
[
|
|
{"max_bot_token": ""},
|
|
{"max_bot_username": "@test_bot"},
|
|
{"max_webhook_secret": "short"},
|
|
{"max_site_url": "http://patient.example.org"},
|
|
{"max_webhook_url": "http://api.example.org"},
|
|
{"max_webhook_url": "https://api.example.org:8443/hook"},
|
|
{"max_webhook_url": "https://user:password@api.example.org/hook"},
|
|
{"max_webhook_url": "https://api.example.org/hook#fragment"},
|
|
{"max_site_url": "https://patient.example.org?token=credential"},
|
|
],
|
|
)
|
|
def test_max_rejects_incomplete_or_unsafe_settings(overrides):
|
|
with pytest.raises(ValidationError):
|
|
configured(**overrides)
|