from pathlib import Path
from unittest.mock import patch
from urllib.error import HTTPError
import pytest
from nodes import web_novel_loader as web
URL = "https://novelfull.net/example-book.html"
def index_page(numbers, pages=1):
links = "".join(
f'
'
f'
Chapter {n}: Different title
Translator: Someone
'
'
Editor: Someone
'
f'
Body {n} begins.
freёReadNovelFull.com
'
'
Body continues with emphasis.
'
'Chapter 1
First story paragraph.
Second paragraph.
Ad
Translator: a character's job, inside the story.
Before freeReadNovelFull.com after.
'''
result = web._parse_chapter(html, {"title": "Chapter 1", "url": URL})
assert result["text"] == (
"First story paragraph.\n\nSecond paragraph.\n\n"
"Translator: a character's job, inside the story.\n\nBefore after."
)
def test_http_block_is_actionable_and_not_retried():
with patch.object(web, "urlopen", side_effect=HTTPError(URL, 403, "Forbidden", {}, None)) as request:
with pytest.raises(RuntimeError, match="HTTP 403"):
web._fetch_html(URL)
assert request.call_count == 1
def test_transient_http_error_is_retried(monkeypatch):
monkeypatch.setattr(web.time, "sleep", lambda _: None)
with patch.object(web, "urlopen") as request:
response = request.return_value.__enter__.return_value
response.geturl.return_value = URL
response.read.return_value = b"Success"
request.side_effect = [HTTPError(URL, 503, "Unavailable", {}, None), request.return_value]
assert web._fetch_html(URL) == "Success"
assert request.call_count == 2