Files
pdf/gateway/tests/test_merge.py
T
2026-08-22 11:28:05 +05:30

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