Files
resolutionflow/backend/tests/test_pdf_export.py
2026-03-17 00:28:22 -04:00

97 lines
3.4 KiB
Python

"""Tests for PDF export via WeasyPrint."""
import pytest
from httpx import AsyncClient
@pytest.mark.asyncio
class TestPDFExport:
"""Test PDF export endpoint."""
async def test_export_pdf_returns_pdf_content(
self, client: AsyncClient, auth_headers: dict, test_tree: dict
):
"""Test that PDF export returns application/pdf content starting with %PDF."""
# Create a session
create_response = await client.post(
"/api/v1/sessions",
json={"tree_id": test_tree["id"], "ticket_number": "PDF-001"},
headers=auth_headers,
)
assert create_response.status_code in (200, 201)
session_id = create_response.json()["id"]
# Add a decision so there's content
await client.put(
f"/api/v1/sessions/{session_id}",
json={
"decisions": [
{
"node_id": "root",
"question": "Is this a test?",
"answer": "Yes",
"notes": "PDF export test",
"timestamp": "2026-03-17T10:00:00Z",
}
]
},
headers=auth_headers,
)
# Export as PDF
response = await client.post(
f"/api/v1/sessions/{session_id}/export",
json={"format": "pdf", "include_tree_info": True},
headers=auth_headers,
)
assert response.status_code == 200
assert response.headers["content-type"] == "application/pdf"
assert "session-export-" in response.headers.get("content-disposition", "")
# PDF files start with %PDF
assert response.content[:5] == b"%PDF-"
async def test_export_pdf_with_no_supporting_data(
self, client: AsyncClient, auth_headers: dict, test_tree: dict
):
"""Test PDF export works when session has no supporting data."""
create_response = await client.post(
"/api/v1/sessions",
json={"tree_id": test_tree["id"]},
headers=auth_headers,
)
assert create_response.status_code in (200, 201)
session_id = create_response.json()["id"]
response = await client.post(
f"/api/v1/sessions/{session_id}/export",
json={"format": "pdf"},
headers=auth_headers,
)
assert response.status_code == 200
assert response.headers["content-type"] == "application/pdf"
assert response.content[:5] == b"%PDF-"
async def test_existing_markdown_export_still_works(
self, client: AsyncClient, auth_headers: dict, test_tree: dict
):
"""Verify markdown export is unaffected by PDF addition."""
create_response = await client.post(
"/api/v1/sessions",
json={"tree_id": test_tree["id"], "ticket_number": "MD-001"},
headers=auth_headers,
)
assert create_response.status_code in (200, 201)
session_id = create_response.json()["id"]
response = await client.post(
f"/api/v1/sessions/{session_id}/export",
json={"format": "markdown", "include_tree_info": True},
headers=auth_headers,
)
assert response.status_code == 200
assert "text/markdown" in response.headers["content-type"]
assert "MD-001" in response.text