coming together

This commit is contained in:
HotSwapp
2025-08-13 18:53:35 -05:00
parent acc5155bf7
commit 5111079149
51 changed files with 14457 additions and 588 deletions

155
tests/test_documents_api.py Normal file
View File

@@ -0,0 +1,155 @@
import os
import uuid
from datetime import date
import pytest
from fastapi.testclient import TestClient
os.environ.setdefault("SECRET_KEY", "x" * 32)
os.environ.setdefault("DATABASE_URL", "sqlite:////tmp/delphi_test.sqlite")
from app.main import app # noqa: E402
from app.auth.security import get_current_user # noqa: E402
from tests.helpers import assert_validation_error, assert_http_error # noqa: E402
class _User:
def __init__(self):
self.id = 1
self.username = "tester"
self.is_admin = True
self.is_active = True
@pytest.fixture()
def client():
app.dependency_overrides[get_current_user] = lambda: _User()
try:
yield TestClient(app)
finally:
app.dependency_overrides.pop(get_current_user, None)
def _create_customer_and_file(client: TestClient):
cust_id = f"DOC-{uuid.uuid4().hex[:8]}"
resp = client.post("/api/customers/", json={"id": cust_id, "last": "Doc", "email": "d@example.com"})
assert resp.status_code == 200
file_no = f"D-{uuid.uuid4().hex[:6]}"
payload = {
"file_no": file_no,
"id": cust_id,
"regarding": "Doc matter",
"empl_num": "E01",
"file_type": "CIVIL",
"opened": date.today().isoformat(),
"status": "ACTIVE",
"rate_per_hour": 100.0,
}
resp = client.post("/api/files/", json=payload)
assert resp.status_code == 200
return cust_id, file_no
def test_qdro_schema_validation_and_404s(client: TestClient):
# Missing required: file_no
resp = client.post("/api/documents/qdros/", json={"version": "01"})
assert_validation_error(resp, "file_no")
# Bad dates type
resp = client.post(
"/api/documents/qdros/",
json={
"file_no": "NOFILE-1",
"created_date": "not-a-date",
"approved_date": "also-bad",
},
)
assert_validation_error(resp, "created_date")
# 404 get/update/delete for missing
resp = client.get("/api/documents/qdros/NOFILE-1/999999")
assert_http_error(resp, 404, "QDRO not found")
resp = client.put("/api/documents/qdros/NOFILE-1/999999", json={"status": "APPROVED"})
assert_http_error(resp, 404, "QDRO not found")
resp = client.delete("/api/documents/qdros/NOFILE-1/999999")
assert_http_error(resp, 404, "QDRO not found")
def test_qdro_end_to_end_crud(client: TestClient):
_, file_no = _create_customer_and_file(client)
# Create
create_payload = {
"file_no": file_no,
"version": "01",
"status": "DRAFT",
"created_date": date.today().isoformat(),
"plan_name": "Plan X",
"plan_administrator": "Admin",
}
resp = client.post("/api/documents/qdros/", json=create_payload)
assert resp.status_code == 200
qdro = resp.json()
qid = qdro["id"]
assert qdro["file_no"] == file_no
# List by file
resp = client.get(f"/api/documents/qdros/{file_no}")
assert resp.status_code == 200
assert any(item["id"] == qid for item in resp.json())
# Get by composite path
resp = client.get(f"/api/documents/qdros/{file_no}/{qid}")
assert resp.status_code == 200
assert resp.json()["id"] == qid
# Update
resp = client.put(f"/api/documents/qdros/{file_no}/{qid}", json={"status": "APPROVED"})
assert resp.status_code == 200
assert resp.json()["status"] == "APPROVED"
# Delete
resp = client.delete(f"/api/documents/qdros/{file_no}/{qid}")
assert resp.status_code == 200
def test_template_crud_and_generate_requires_file_and_shapes(client: TestClient):
# Create a template
tid = f"TMP-{uuid.uuid4().hex[:6]}"
tpl_payload = {
"form_id": tid,
"form_name": "Letter",
"category": "GENERAL",
"content": "Hello {{CLIENT_FULL}} on ^TODAY for file ^FILE_NO",
}
resp = client.post("/api/documents/templates/", json=tpl_payload)
assert resp.status_code == 200
# Get template
resp = client.get(f"/api/documents/templates/{tid}")
assert resp.status_code == 200
assert resp.json()["form_id"] == tid
# Update template
resp = client.put(f"/api/documents/templates/{tid}", json={"content": "Updated"})
assert resp.status_code == 200
assert "content" in resp.json()
# Generate requires an existing file
_, file_no = _create_customer_and_file(client)
resp = client.post(
f"/api/documents/generate/{tid}",
json={"template_id": tid, "file_no": file_no, "output_format": "HTML"},
)
assert resp.status_code == 200
gen = resp.json()
assert {"document_id", "file_name", "file_path", "size", "created_at"} <= set(gen.keys())
# 404 when file missing
resp = client.post(
f"/api/documents/generate/{tid}",
json={"template_id": tid, "file_no": "X-NOFILE", "output_format": "PDF"},
)
assert_http_error(resp, 404, "File not found")