97 lines
3.4 KiB
Python
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
|