feat(platform): close AI expense value loop
Add tenant-safe value, telemetry, connector, commercial, and production-readiness foundations.
This commit is contained in:
@@ -9,7 +9,7 @@ from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.pool import StaticPool
|
||||
|
||||
from app.api.deps import get_db
|
||||
from app.api.deps import CurrentUserContext, get_current_user, get_db
|
||||
from app.db.base import Base
|
||||
from app.main import create_app
|
||||
from app.models.financial_record import ExpenseClaim
|
||||
@@ -299,6 +299,16 @@ def _create_steward_test_client_with_db():
|
||||
db.close()
|
||||
|
||||
app.dependency_overrides[get_db] = override_db
|
||||
app.dependency_overrides[get_current_user] = lambda: CurrentUserContext(
|
||||
username="zhang.xiaoqing",
|
||||
name="张小青",
|
||||
role_codes=["user"],
|
||||
is_admin=False,
|
||||
tenant_id="default",
|
||||
department_name="产品交付部",
|
||||
employee_no="E-STEW-001",
|
||||
employee_id="employee-steward-001",
|
||||
)
|
||||
return TestClient(app), TestingSessionLocal, app
|
||||
|
||||
|
||||
@@ -756,22 +766,25 @@ def test_steward_planner_builds_travel_attachment_group_with_exclusions() -> Non
|
||||
|
||||
def test_steward_stream_endpoint_emits_thinking_before_plan(monkeypatch) -> None:
|
||||
_patch_steward_endpoint_planner(monkeypatch)
|
||||
client = TestClient(create_app())
|
||||
client, _session_factory, app = _create_steward_test_client_with_db()
|
||||
|
||||
with client.stream(
|
||||
"POST",
|
||||
"/api/v1/steward/plans/stream",
|
||||
json={
|
||||
"message": "我要报销昨天的交通费",
|
||||
"client_now_iso": "2026-06-04T09:30:00+08:00",
|
||||
},
|
||||
) as response:
|
||||
assert response.status_code == 200
|
||||
events = [
|
||||
json.loads(line.decode("utf-8") if isinstance(line, bytes) else line)
|
||||
for line in response.iter_lines()
|
||||
if line
|
||||
]
|
||||
try:
|
||||
with client.stream(
|
||||
"POST",
|
||||
"/api/v1/steward/plans/stream",
|
||||
json={
|
||||
"message": "我要报销昨天的交通费",
|
||||
"client_now_iso": "2026-06-04T09:30:00+08:00",
|
||||
},
|
||||
) as response:
|
||||
assert response.status_code == 200
|
||||
events = [
|
||||
json.loads(line.decode("utf-8") if isinstance(line, bytes) else line)
|
||||
for line in response.iter_lines()
|
||||
if line
|
||||
]
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
assert [event["event"] for event in events][:2] == ["thinking", "thinking"]
|
||||
assert events[0]["data"]["stage"] == "stream_start"
|
||||
@@ -781,17 +794,20 @@ def test_steward_stream_endpoint_emits_thinking_before_plan(monkeypatch) -> None
|
||||
|
||||
def test_steward_plan_endpoint_persists_application_and_reimbursement_state(monkeypatch) -> None:
|
||||
_patch_steward_endpoint_planner(monkeypatch)
|
||||
client = TestClient(create_app())
|
||||
client, _session_factory, app = _create_steward_test_client_with_db()
|
||||
|
||||
response = client.post(
|
||||
"/api/v1/steward/plans",
|
||||
json={
|
||||
"message": "我想申请7月2日去北京出差,并且我要报销昨天的交通费",
|
||||
"user_id": "u-steward-state",
|
||||
"client_now_iso": "2026-06-04T09:30:00+08:00",
|
||||
"context_json": {"session_type": "steward", "entry_source": "personal_workbench"},
|
||||
},
|
||||
)
|
||||
try:
|
||||
response = client.post(
|
||||
"/api/v1/steward/plans",
|
||||
json={
|
||||
"message": "我想申请7月2日去北京出差,并且我要报销昨天的交通费",
|
||||
"user_id": "u-steward-state",
|
||||
"client_now_iso": "2026-06-04T09:30:00+08:00",
|
||||
"context_json": {"session_type": "steward", "entry_source": "personal_workbench"},
|
||||
},
|
||||
)
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
assert response.status_code == 200
|
||||
payload = response.json()
|
||||
|
||||
Reference in New Issue
Block a user