66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
"""
|
|
T-API: Demo Config API endpoint verification.
|
|
|
|
Tests the admin API endpoints for listing, loading, and removing demo configs.
|
|
Uses FastAPI TestClient (no running server needed).
|
|
|
|
Note: Login requires CSRF + form-data + httpOnly cookies, so we test
|
|
unauthenticated rejection and the discovery module directly.
|
|
"""
|
|
|
|
import pytest
|
|
|
|
|
|
class TestDemoConfigDiscovery:
|
|
"""Test the auto-discovery module (no HTTP needed)."""
|
|
|
|
def test_discoveryFindsInvestorConfig(self):
|
|
from modules.demoConfigs import getAvailableDemoConfigs
|
|
configs = getAvailableDemoConfigs()
|
|
assert "investor-demo-2026" in configs, f"Available configs: {list(configs.keys())}"
|
|
|
|
def test_getByCodeReturnsInstance(self):
|
|
from modules.demoConfigs import getDemoConfigByCode
|
|
cfg = getDemoConfigByCode("investor-demo-2026")
|
|
assert cfg is not None
|
|
assert cfg.code == "investor-demo-2026"
|
|
assert cfg.label == "Investor Demo April 2026"
|
|
|
|
def test_getByCodeReturnsNoneForUnknown(self):
|
|
from modules.demoConfigs import getDemoConfigByCode
|
|
cfg = getDemoConfigByCode("nonexistent-config")
|
|
assert cfg is None
|
|
|
|
def test_toDictHasRequiredFields(self):
|
|
from modules.demoConfigs import getDemoConfigByCode
|
|
cfg = getDemoConfigByCode("investor-demo-2026")
|
|
d = cfg.toDict()
|
|
assert "code" in d
|
|
assert "label" in d
|
|
assert "description" in d
|
|
assert d["code"] == "investor-demo-2026"
|
|
|
|
|
|
class TestDemoConfigApiEndpoints:
|
|
"""Test API endpoints via TestClient."""
|
|
|
|
@pytest.fixture(scope="class")
|
|
def client(self):
|
|
try:
|
|
from app import app
|
|
from fastapi.testclient import TestClient
|
|
return TestClient(app)
|
|
except Exception as e:
|
|
pytest.skip(f"Cannot create TestClient: {e}")
|
|
|
|
def test_listEndpointRejectsUnauthenticated(self, client):
|
|
response = client.get("/api/admin/demo-config")
|
|
assert response.status_code in (401, 403)
|
|
|
|
def test_loadEndpointRejectsUnauthenticated(self, client):
|
|
response = client.post("/api/admin/demo-config/investor-demo-2026/load")
|
|
assert response.status_code in (401, 403)
|
|
|
|
def test_removeEndpointRejectsUnauthenticated(self, client):
|
|
response = client.post("/api/admin/demo-config/investor-demo-2026/remove")
|
|
assert response.status_code in (401, 403)
|