60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
import json
|
|
import pytest
|
|
import httpx
|
|
from pathlib import Path
|
|
from jinja2 import Environment, BaseLoader
|
|
|
|
from omniread.core.content import ContentType
|
|
from omniread.html.scraper import HTMLScraper
|
|
|
|
|
|
MOCK_HTML_DIR = Path(__file__).parent / "mocks" / "html"
|
|
|
|
|
|
def render_html(template_path, data_path) -> bytes:
|
|
template_text = Path(template_path).read_text(encoding="utf-8")
|
|
data = json.loads(Path(data_path).read_text(encoding="utf-8"))
|
|
|
|
env = Environment(
|
|
loader=BaseLoader(),
|
|
autoescape=False,
|
|
)
|
|
template = env.from_string(template_text)
|
|
|
|
rendered = template.render(**data)
|
|
return rendered.encode("utf-8")
|
|
|
|
|
|
def mock_transport(request: httpx.Request) -> httpx.Response:
|
|
"""
|
|
httpx MockTransport handler.
|
|
"""
|
|
path = request.url.path
|
|
if path not in ['/simple', '/table']:
|
|
return httpx.Response(
|
|
status_code=404,
|
|
content=b"Not Found",
|
|
request=request,
|
|
)
|
|
endpoint = path.split("/")[-1]
|
|
content = render_html(
|
|
MOCK_HTML_DIR / f"{endpoint}.html.jinja",
|
|
MOCK_HTML_DIR / f"{endpoint}.json",
|
|
)
|
|
|
|
return httpx.Response(
|
|
status_code=200,
|
|
headers={"Content-Type": ContentType.HTML.value},
|
|
content=content,
|
|
request=request,
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def http_scraper() -> HTMLScraper:
|
|
transport = httpx.MockTransport(mock_transport)
|
|
|
|
client = httpx.Client(transport=transport)
|
|
|
|
return HTMLScraper(client=client)
|