Files
epub2pdf/tests/conftest.py
T

63 lines
1.8 KiB
Python

"""Hermetic fixtures for the EPUB -> PDF converter suite.
Isolation contract
------------------
- ``DATA_DIR`` is redirected to a fresh temp dir BEFORE ``app`` is imported
(app.py reads the env var at import time, app.py:36).
- The Flask test client is used: no live server, no port conflicts, while
conversion worker threads still run in-process.
- The module-global ``JOBS`` registry is cleared before and after every test.
"""
import io
import os
import sys
import tempfile
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
# Must happen before importing app — app.py bakes DATA_DIR in at import time.
os.environ["DATA_DIR"] = tempfile.mkdtemp(prefix="epub2pdf-tests-")
import app # noqa: E402
FIXTURE_EBOOK = ROOT / "test_book.epub"
@pytest.fixture(scope="module")
def client():
"""Flask test client for the module-level app instance."""
app.app.config["TESTING"] = True
with app.app.test_client() as c:
yield c
@pytest.fixture(autouse=True)
def _isolate_jobs():
"""Every test starts with (and leaves) an empty job registry."""
app.JOBS.clear()
yield
app.JOBS.clear()
@pytest.fixture(scope="module")
def fixture_epub_bytes():
"""Raw bytes of the checked-in test book (em dashes + CJK)."""
return FIXTURE_EBOOK.read_bytes()
@pytest.fixture(scope="module")
def submit_epub(client, fixture_epub_bytes):
"""Factory: POST an upload to /api/convert; returns the response."""
def _submit(filename="book.epub", content=None):
if content is None:
content = fixture_epub_bytes
files = {"file": (io.BytesIO(content), filename)}
return client.post(
"/api/convert", data=files, content_type="multipart/form-data"
)
return _submit