{{ header }}"""Pytest configuration for e2e tests."""
{% if has_http_fixtures %}from __future__ import annotations

import os
import subprocess
import threading
from pathlib import Path
from typing import Generator

import pytest

# Ensure the package is importable.
# The {{ module }} package is expected to be installed in the current environment.

_HERE = Path(__file__).parent
_E2E_DIR = _HERE.parent
_MOCK_SERVER_BIN = _E2E_DIR / "rust" / "target" / "release" / "mock-server"
_FIXTURES_DIR = _E2E_DIR.parent / "fixtures"


@pytest.fixture(scope="session", autouse=True)
def mock_server() -> Generator[str, None, None]:
    """Spawn the mock HTTP server binary and set MOCK_SERVER_URL."""
    proc = subprocess.Popen(  # noqa: S603
        [str(_MOCK_SERVER_BIN), str(_FIXTURES_DIR)],
        stdout=subprocess.PIPE,
        stderr=None,
        stdin=subprocess.PIPE,
    )
    url = ""
    assert proc.stdout is not None
    for raw_line in proc.stdout:
        line = raw_line.decode().strip()
        if line.startswith("MOCK_SERVER_URL="):
            url = line.split("=", 1)[1]
            break
    os.environ["MOCK_SERVER_URL"] = url
    # Drain stdout in background so the server never blocks.
    threading.Thread(target=proc.stdout.read, daemon=True).start()
    yield url
    if proc.stdin:
        proc.stdin.close()
    proc.terminate()
    proc.wait()


def _make_request(method: str, path: str, **kwargs: object) -> object:
    """Make an HTTP request to the mock server."""
    import urllib.request  # noqa: PLC0415

    base_url = os.environ.get("MOCK_SERVER_URL", "http://localhost:8080")
    url = f"{base_url}{path}"
    data = kwargs.pop("json", None)
    if data is not None:
        import json  # noqa: PLC0415

        body = json.dumps(data).encode()
        headers = dict(kwargs.pop("headers", {}))
        headers.setdefault("Content-Type", "application/json")
        req = urllib.request.Request(url, data=body, headers=headers, method=method.upper())
    else:
        headers = dict(kwargs.pop("headers", {}))
        req = urllib.request.Request(url, headers=headers, method=method.upper())
    try:
        with urllib.request.urlopen(req) as resp:  # noqa: S310
            return resp
    except urllib.error.HTTPError as exc:
        return exc


@pytest.fixture(scope="session")
def app(mock_server: str) -> object:  # noqa: ARG001
    """Return a simple HTTP helper bound to the mock server URL."""

    class _App:
        def request(self, path: str, **kwargs: object) -> object:
            method = str(kwargs.pop("method", "GET"))
            return _make_request(method, path, **kwargs)

    return _App()
{% elif has_file_fixtures %}import os
from pathlib import Path

# Ensure the package is importable.
# The {{ module }} package is expected to be installed in the current environment.

# Change to the test_documents directory so that fixture file paths like
# "pdf/fake_memo.pdf" resolve correctly when running pytest from e2e/python/.
_TEST_DOCUMENTS = Path(__file__).parent.parent.parent / "test_documents"
if _TEST_DOCUMENTS.is_dir():
    os.chdir(_TEST_DOCUMENTS)

# On macOS, Pdfium is a separate dylib not on the default library path in dev builds.
# Search common locations (Cargo build output, staged target/release) and extend
# DYLD_LIBRARY_PATH / LD_LIBRARY_PATH so the extension can load the library.
_REPO_ROOT = Path(__file__).parent.parent.parent


def _find_pdfium_dir() -> str | None:
    """Find the directory containing libpdfium, searching Cargo build outputs."""
    for _candidate in sorted(_REPO_ROOT.glob("target/*/release/build/*/out/libpdfium*")):
        return str(_candidate.parent)
    for _candidate in sorted(_REPO_ROOT.glob("target/release/build/*/out/libpdfium*")):
        return str(_candidate.parent)
    return None


_pdfium_dir = _find_pdfium_dir()
if _pdfium_dir is not None:
    for _var in ("DYLD_LIBRARY_PATH", "LD_LIBRARY_PATH"):
        _existing = os.environ.get(_var, "")
        if _pdfium_dir not in _existing:
            os.environ[_var] = f"{_pdfium_dir}:{_existing}" if _existing else _pdfium_dir
{% else %}# Ensure the package is importable.
# The {{ module }} package is expected to be installed in the current environment.
{% endif %}
