69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
import io
|
|
import json
|
|
import pytest
|
|
from pypdf import PdfWriter, PdfReader
|
|
from fastapi.testclient import TestClient
|
|
from app.services.pdf_merge import parse_page_selection, merge_pdf_files
|
|
from app.services import engine
|
|
|
|
|
|
def _create_sample_pdf(page_count: int = 1) -> bytes:
|
|
writer = PdfWriter()
|
|
for _ in range(page_count):
|
|
writer.add_blank_page(width=612, height=792)
|
|
stream = io.BytesIO()
|
|
writer.write(stream)
|
|
return stream.getvalue()
|
|
|
|
|
|
def test_parse_page_selection():
|
|
assert parse_page_selection("all", 5) == [0, 1, 2, 3, 4]
|
|
assert parse_page_selection("", 3) == [0, 1, 2]
|
|
assert parse_page_selection("1, 3", 5) == [0, 2]
|
|
assert parse_page_selection("1-3", 5) == [0, 1, 2]
|
|
assert parse_page_selection("1-2, 4-5", 5) == [0, 1, 3, 4]
|
|
assert parse_page_selection("10", 3) == [] # out of bounds
|
|
|
|
|
|
def test_merge_pdf_files_service():
|
|
pdf1 = _create_sample_pdf(2)
|
|
pdf2 = _create_sample_pdf(3)
|
|
|
|
items = [
|
|
{"fileIndex": 0, "pages": "1-2"},
|
|
{"fileIndex": 1, "pages": "1, 3"},
|
|
]
|
|
|
|
merged_bytes = merge_pdf_files([pdf1, pdf2], items)
|
|
reader = PdfReader(io.BytesIO(merged_bytes))
|
|
assert len(reader.pages) == 4
|
|
|
|
|
|
def test_merge_documents_api_endpoint(client: TestClient):
|
|
if not engine.is_available():
|
|
pytest.skip("PDF Engine binary binding not available in test environment.")
|
|
|
|
pdf1 = _create_sample_pdf(2)
|
|
pdf2 = _create_sample_pdf(1)
|
|
|
|
manifest = json.dumps([
|
|
{"fileIndex": 0, "pages": "1"},
|
|
{"fileIndex": 1, "pages": "all"},
|
|
])
|
|
|
|
files = [
|
|
("files", ("doc1.pdf", pdf1, "application/pdf")),
|
|
("files", ("doc2.pdf", pdf2, "application/pdf")),
|
|
]
|
|
data = {
|
|
"manifest": manifest,
|
|
"output_filename": "final_merged.pdf",
|
|
}
|
|
|
|
res = client.post("/documents/merge", files=files, data=data)
|
|
assert res.status_code == 201
|
|
payload = res.json()
|
|
assert payload["filename"] == "final_merged.pdf"
|
|
assert payload["totalPages"] == 2
|
|
assert "id" in payload
|