dotb_ai-platform/tests/test_aihub_settings.py
hungtran24 d5e096b952 chore: simplify dev port lookup and isolate settings tests
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.
2026-10-02 11:58:19 +07:00

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",
)