feat(5.1): add API audit document covering all 158 UI functions across 24 categories

- Create docs/api-audit.md with systematic mapping of UI functions to API endpoints
- Audit covers: Contacts, Calendar, DMS, Mail, Notifications, Users/Roles, Groups,
  Tags, Workflows, Automation/Agents, AI Assistant, AI Proactive, AI UI Control,
  Communication, Unified Search, Plugins, Settings, Import/Export, Entity History,
  Audit Log, Attachments, Addresses, UI State (sidebar/tab/filter)
- All 158 UI functions have corresponding API endpoints (0 missing)
- UI state persistence (sidebar, theme, locale, active tab, sort) covered by Task 5.2
- Frontend API module coverage table maps all 25 frontend modules to backend routes
- RBAC coverage documented for all endpoints
- Add 9 tests verifying audit document structure and endpoint reachability
This commit is contained in:
Agent Zero
2026-07-23 20:41:45 +02:00
parent 75a7063bff
commit f137acb805
2 changed files with 470 additions and 0 deletions
+107
View File
@@ -0,0 +1,107 @@
"""Test for API Audit (Task 5.1) — verifies audit document exists and key endpoints are reachable."""
from __future__ import annotations
import os
from pathlib import Path
import pytest
from httpx import AsyncClient
from tests.conftest import ORIGIN_HEADER, login_client, seed_tenant_and_users
AUDIT_FILE = Path(__file__).parent.parent / "docs" / "api-audit.md"
def test_api_audit_document_exists():
"""Audit document docs/api-audit.md exists and has content."""
assert AUDIT_FILE.exists(), f"API audit document not found at {AUDIT_FILE}"
content = AUDIT_FILE.read_text()
assert len(content) > 1000, "API audit document is too short"
assert "# API Audit" in content, "Missing title"
assert "Summary" in content, "Missing summary section"
assert "Missing Endpoints" in content, "Missing missing endpoints section"
def test_api_audit_covers_all_categories():
"""Audit document covers all major UI categories."""
content = AUDIT_FILE.read_text()
required_categories = [
"Contacts",
"Calendar",
"DMS",
"Mail",
"Notifications",
"Workflows",
"Automation",
"AI Assistant",
"AI Proactive",
"Communication",
"Unified Search",
"Plugins",
"Settings",
"UI State",
]
for category in required_categories:
assert category in content, f"Missing category '{category}' in audit document"
def test_api_audit_covers_user_preferences():
"""Audit document covers the user preferences API (Task 5.2)."""
content = AUDIT_FILE.read_text()
assert "user/preferences" in content, "Missing user preferences endpoint in audit"
assert "sidebar" in content.lower(), "Missing sidebar state in audit"
assert "theme" in content.lower(), "Missing theme in audit"
assert "active_tab" in content or "active tab" in content.lower(), "Missing active tab in audit"
def test_api_audit_covers_workflows():
"""Audit document covers the workflow API (Task 5.3)."""
content = AUDIT_FILE.read_text()
assert "/api/v1/workflows" in content, "Missing workflow endpoint in audit"
assert "instances" in content, "Missing workflow instances in audit"
assert "advance" in content, "Missing workflow advance in audit"
def test_api_audit_no_missing_endpoints():
"""Audit document reports zero missing endpoints."""
content = AUDIT_FILE.read_text()
# Check that the summary shows 0 missing
assert "| 0 |" in content or "Missing Endpoints — None" in content, \
"Audit should report no missing endpoints"
def test_api_audit_covers_rbac():
"""Audit document covers RBAC enforcement."""
content = AUDIT_FILE.read_text()
assert "RBAC" in content, "Missing RBAC section in audit"
assert "require_permission" in content, "Missing require_permission mention in audit"
def test_api_audit_covers_frontend_modules():
"""Audit document maps frontend API modules to backend routes."""
content = AUDIT_FILE.read_text()
assert "Frontend API Module Coverage" in content, "Missing frontend module coverage section"
assert "api/workflows.ts" in content, "Missing workflows.ts in frontend coverage"
assert "api/userPreferences.ts" in content, "Missing userPreferences.ts in frontend coverage"
@pytest.mark.asyncio
async def test_user_preferences_endpoint_reachable(client: AsyncClient, db_session):
"""Verify the user preferences API endpoint (from Task 5.2) is reachable — covers sidebar/tab/filter state."""
await seed_tenant_and_users(db_session)
await login_client(client, "admin@tenanta.com")
resp = await client.get("/api/v1/user/preferences", headers=ORIGIN_HEADER)
assert resp.status_code == 200
assert "preferences" in resp.json()
@pytest.mark.asyncio
async def test_workflow_endpoints_reachable(client: AsyncClient, db_session):
"""Verify the workflow API endpoints (from Task 5.3) are reachable."""
await seed_tenant_and_users(db_session)
await login_client(client, "admin@tenanta.com")
resp = await client.get("/api/v1/workflows", headers=ORIGIN_HEADER)
assert resp.status_code == 200
assert "items" in resp.json()