"""Тесты для `PdfRenderer` и его HTML-вывода.""" import logging from typing import Any, cast import pytest from cv.models import Profile from cv.services.dowload.pdf import PdfRenderer from resume.utils.logging import configure_root_logger logger = logging.getLogger(__name__) configure_root_logger() @pytest.fixture def profile() -> object: """Минимальный fake-профиль для тестов. Returns: object: Объект с обязательными атрибутами. """ class P: def __init__(self) -> None: self.full_name = "Jane Doe" self.experience = type("Q", (), {"all": lambda self: []})() self.skills_map = type("Q", (), {"all": lambda self: []})() return P() def test_render_success(monkeypatch: pytest.MonkeyPatch, profile: object) -> None: """Юнит: валидируем HTML и что write_pdf вызван ровно один раз.""" logger.info("Проверяем успешный рендер PDF (валидация HTML)") fake_serialized = { "full_name": "Jane Doe", "role": "Dev", "summary": "Summary", "location": "Earth", "languages": ["EN"], "contacts": {"email": "jane@example.com", "phone": "", "telegram": ""}, "experience": [], "skills_map": [], } def fake_serialize(_self: object, _p: object) -> dict: return fake_serialized captured: dict[str, Any] = {"html": "", "calls": 0} class RecordingHTML: def __init__(self, string: str) -> None: captured["html"] = string def write_pdf(self) -> bytes: captured["calls"] += 1 return b"%PDF-FAKE" monkeypatch.setattr("cv.services.dowload.pdf.ProfileSerializer.serialize", fake_serialize) monkeypatch.setattr("cv.services.dowload.pdf.HTML", RecordingHTML) out = PdfRenderer().render(cast(Profile, profile)) assert captured["calls"] == 1 assert isinstance(out.getvalue(), bytes) html: str = captured["html"] assert "" in html assert "