Resolve the shared backend port once for make dev and reuse it in the child make. Keep pure configuration tests independent of local credentials and URLs without altering integration database settings.
98 lines
3.1 KiB
Python
98 lines
3.1 KiB
Python
import pytest
|
|
from pydantic import SecretStr, ValidationError
|
|
|
|
from ai_platform.infrastructure.config.settings import Settings
|
|
|
|
_TEST_DATABASE_URL = "postgresql+asyncpg://test:test@localhost/ai_platform_test"
|
|
pytestmark = pytest.mark.usefixtures("isolated_settings")
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"base_url",
|
|
["http://remote.example/v1", "http://localhost:8317/path", "https://user:pass@example.com"],
|
|
)
|
|
def test_openai_base_url_rejects_unsafe_url(base_url: str):
|
|
with pytest.raises(ValidationError):
|
|
Settings(database_url=_TEST_DATABASE_URL, openai_base_url=base_url)
|
|
|
|
|
|
def test_openai_local_http_allows_no_key_only_in_development():
|
|
settings = Settings(
|
|
database_url=_TEST_DATABASE_URL,
|
|
environment="development",
|
|
openai_base_url="http://127.0.0.1:8317",
|
|
)
|
|
assert settings.openai_api_key is None
|
|
with pytest.raises(ValidationError):
|
|
Settings(
|
|
database_url=_TEST_DATABASE_URL,
|
|
environment="production",
|
|
openai_base_url="http://127.0.0.1:8317",
|
|
openai_api_key=SecretStr("proxy-key"),
|
|
)
|
|
|
|
|
|
def test_openai_production_requires_https_and_key():
|
|
with pytest.raises(ValidationError):
|
|
Settings(
|
|
database_url=_TEST_DATABASE_URL,
|
|
environment="production",
|
|
openai_base_url="https://proxy.example",
|
|
)
|
|
settings = Settings(
|
|
database_url=_TEST_DATABASE_URL,
|
|
environment="production",
|
|
openai_base_url="https://proxy.example",
|
|
openai_api_key=SecretStr("proxy-key"),
|
|
)
|
|
assert settings.openai_base_url == "https://proxy.example"
|
|
assert "proxy-key" not in repr(settings)
|
|
|
|
|
|
def test_openai_rejects_key_without_url_and_header_injection():
|
|
with pytest.raises(ValidationError):
|
|
Settings(database_url=_TEST_DATABASE_URL, openai_api_key=SecretStr("key"))
|
|
with pytest.raises(ValidationError):
|
|
Settings(
|
|
database_url=_TEST_DATABASE_URL,
|
|
environment="development",
|
|
openai_base_url="http://localhost:8317",
|
|
openai_api_key=SecretStr("key\r\nX-Evil: test"),
|
|
)
|
|
|
|
|
|
def test_aihub_base_url_accepts_local_http():
|
|
settings = Settings(
|
|
database_url=_TEST_DATABASE_URL,
|
|
environment="development",
|
|
aihub_base_url="http://localhost:8080",
|
|
)
|
|
assert settings.aihub_base_url == "http://localhost:8080"
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"base_url",
|
|
[
|
|
"ftp://localhost:8080",
|
|
"http://user:password@localhost:8080",
|
|
"http://localhost:8080?token=secret",
|
|
"http://aihub:8080",
|
|
],
|
|
)
|
|
def test_aihub_base_url_rejects_invalid_or_nonlocal_http(base_url: str):
|
|
with pytest.raises(ValidationError):
|
|
Settings(
|
|
database_url=_TEST_DATABASE_URL,
|
|
environment="development",
|
|
aihub_base_url=base_url,
|
|
)
|
|
|
|
|
|
def test_aihub_base_url_requires_https_outside_development():
|
|
with pytest.raises(ValidationError):
|
|
Settings(
|
|
database_url=_TEST_DATABASE_URL,
|
|
environment="production",
|
|
aihub_base_url="http://localhost:8080",
|
|
)
|