TorbatYar/backend/services/delivery/app/tests/test_api.py
Mortezakoohjani 5c6a2e78cf feat(platform): seed service registry, deploy all modules, and fix homepage catalog.
Register all active platform services and base features in core DB so admin can manage them, add delivery/hospitality/sports-center backend phases, update apps catalog and production deploy tooling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 12:39:51 +03:30

137 lines
4.3 KiB
Python

"""API, health, tenant isolation, and foundation flow tests."""
from __future__ import annotations
from app.events.publisher import get_event_publisher
from app.tests.conftest import TENANT_A, TENANT_B, tenant_headers
async def test_health_capabilities_metrics(client):
health = await client.get("/health")
assert health.status_code == 200
body = health.json()
assert body["status"] == "ok"
assert body["service"] == "delivery-service"
caps = await client.get("/capabilities")
assert caps.status_code == 200
c = caps.json()
assert c["phase"] == "10.1"
assert c["commercial_product"] == "Torbat Driver"
assert c["features"]["foundation"] is True
assert c["features"]["drivers"] is True
assert c["features"]["dispatch_engine"] is False
assert c["independence"]["integration_mode"] == "api_and_events_only"
metrics = await client.get("/metrics")
assert metrics.status_code == 200
assert metrics.json()["phase"] == "10.1"
async def test_foundation_flow_and_events(client):
headers = tenant_headers(TENANT_A)
org = await client.post(
"/api/v1/organizations",
headers=headers,
json={"code": "ORG1", "name": "Fleet Alpha", "status": "active"},
)
assert org.status_code == 201, org.text
org_id = org.json()["id"]
hub = await client.post(
"/api/v1/hubs",
headers=headers,
json={
"organization_id": org_id,
"code": "HUB1",
"name": "Central Hub",
},
)
assert hub.status_code == 201, hub.text
provider = await client.post(
"/api/v1/external-providers",
headers=headers,
json={
"organization_id": org_id,
"code": "FLEET_X",
"name": "External Fleet X",
"provider_kind": "fleet",
"adapter_key": "mock_fleet",
},
)
assert provider.status_code == 201, provider.text
engine = await client.post(
"/api/v1/routing-engines",
headers=headers,
json={
"organization_id": org_id,
"code": "ROUTE_A",
"name": "Future Engine A",
"adapter_key": "mock_router",
"status": "ready",
},
)
assert engine.status_code == 201, engine.text
cfg = await client.post(
"/api/v1/configurations",
headers=headers,
json={"organization_id": org_id, "code": "DEFAULT"},
)
assert cfg.status_code == 201, cfg.text
setting = await client.put(
"/api/v1/settings",
headers=headers,
json={
"organization_id": org_id,
"key": "default_currency",
"value": {"code": "IRR"},
},
)
assert setting.status_code == 200, setting.text
audit = await client.get(
"/api/v1/audit",
headers=headers,
params={"entity_type": "delivery_organization", "entity_id": org_id},
)
assert audit.status_code == 200
assert len(audit.json()) >= 1
published = [e.event_type for e in get_event_publisher().published]
assert "delivery.organization.created" in published
assert "delivery.hub.created" in published
assert "delivery.external_provider.registered" in published
assert "delivery.routing_engine.registered" in published
async def test_tenant_isolation(client):
headers_a = tenant_headers(TENANT_A)
headers_b = tenant_headers(TENANT_B)
created = await client.post(
"/api/v1/organizations",
headers=headers_a,
json={"code": "ISO1", "name": "Tenant A Org"},
)
assert created.status_code == 201
org_id = created.json()["id"]
denied = await client.get(f"/api/v1/organizations/{org_id}", headers=headers_b)
assert denied.status_code == 404
listed_b = await client.get("/api/v1/organizations", headers=headers_b)
assert listed_b.status_code == 200
assert listed_b.json() == []
listed_a = await client.get("/api/v1/organizations", headers=headers_a)
assert listed_a.status_code == 200
assert len(listed_a.json()) == 1
async def test_missing_tenant_header_rejected(client):
res = await client.get("/api/v1/organizations")
assert res.status_code in (400, 422)