62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
|
|
# 审计锚定端点 API 黄金测试(§3.6)
|
|||
|
|
# ============================================================
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
import pytest
|
|||
|
|
from fastapi.testclient import TestClient
|
|||
|
|
|
|||
|
|
|
|||
|
|
class _Store:
|
|||
|
|
def __init__(self):
|
|||
|
|
self.tenant_uuid = "platform"
|
|||
|
|
self.world_key = "default"
|
|||
|
|
self.data = {"auditEvents": [
|
|||
|
|
{"id": 1, "at": "2026-08-01T00:00:00+08:00", "ts": "2026-08-01T00:00:00+08:00",
|
|||
|
|
"actor": "tester", "category": "TEST", "action": "test.one",
|
|||
|
|
"target": {"type": "TEST"}, "power": "P0", "rationale": {},
|
|||
|
|
"prevHash": "GENESIS", "hash": "0" * 64},
|
|||
|
|
]}
|
|||
|
|
|
|||
|
|
def next_id(self, _kind: str) -> int:
|
|||
|
|
return 2
|
|||
|
|
|
|||
|
|
def save(self) -> None:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.fixture
|
|||
|
|
def client(monkeypatch, tmp_path):
|
|||
|
|
import server.gateway.app as gateway_module
|
|||
|
|
from tests.auth_provider import install_test_auth
|
|||
|
|
install_test_auth(monkeypatch, "tenant-anchor-api")
|
|||
|
|
store = _Store()
|
|||
|
|
monkeypatch.setattr(gateway_module, "get_store", lambda: store)
|
|||
|
|
c = TestClient(gateway_module.create_app())
|
|||
|
|
login = c.post("/api/auth/login", json={"username": "planner", "password": "test"})
|
|||
|
|
assert login.status_code == 200, login.text
|
|||
|
|
return c, store
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_audit_get_reports_unanchored_then_anchor(client, tmp_path):
|
|||
|
|
c, store = client
|
|||
|
|
# 隔离账本目录:通过环境变量注入(在调用端点前设置)
|
|||
|
|
import os
|
|||
|
|
os.environ["APS_AUDIT_LEDGER_DIR"] = str(tmp_path / "ledger")
|
|||
|
|
try:
|
|||
|
|
g = c.get("/api/gov/audit")
|
|||
|
|
assert g.status_code == 200, g.text
|
|||
|
|
anchor = g.json()["anchor"]
|
|||
|
|
assert anchor["anchored"] is False
|
|||
|
|
assert anchor["reason"] == "not-anchored"
|
|||
|
|
|
|||
|
|
a = c.post("/api/gov/audit/anchor")
|
|||
|
|
assert a.status_code == 200, a.text
|
|||
|
|
assert a.json()["anchored"] is True
|
|||
|
|
assert a.json()["status"]["ok"] is True
|
|||
|
|
|
|||
|
|
g2 = c.get("/api/gov/audit")
|
|||
|
|
assert g2.json()["anchor"]["anchored"] is True
|
|||
|
|
assert g2.json()["anchor"]["ok"] is True
|
|||
|
|
finally:
|
|||
|
|
os.environ.pop("APS_AUDIT_LEDGER_DIR", None)
|