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:
@@ -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()
|
||||
Reference in New Issue
Block a user