Andrew Ridgway bec1eaac87
Some checks failed
Test / test (push) Has been cancelled
first pass at the newspaper builder
2026-09-14 11:57:22 +10:00

74 lines
2.8 KiB
Python

"""funnies unit tests (test-after, Standard strategy).
Covers: theme word derivation, find-a-word placement, crossword grid layout,
cartoon fallback, empty FunniesResult, self-contained output. Uses stubs for
the clue-drafter and cartoon source — no real network in CI.
"""
from __future__ import annotations
from newspaper.funnies import (
FunniesBrief,
FunniesBuilder,
StubXkcdCartoonSource,
derive_theme_words,
)
from newspaper.funnies.find_a_word import build_find_a_word
from newspaper.funnies.crossword import build_crossword
def test_theme_words_derived_from_content():
"""BR1.1: theme words extracted from content (drops stopwords/short)."""
content = "Sam and Alex married by the sea on Saturday with the family"
words = derive_theme_words(content, max_words=6)
assert words # some theme words present
assert "the" not in words # stopword dropped
def test_find_a_word_places_every_word():
"""BR1.3: every listed word appears in the grid."""
words = ["sam", "alex", "sea", "rings"]
faw = build_find_a_word(words)
grid_text = "".join("".join(row) for row in faw.grid)
for word in words:
assert word.upper() in grid_text
def test_crossword_builds_10x10_grid_with_clues():
"""BR1.2 / Q2=B: crossword is 10x10 with across/down clues."""
xw = build_crossword(["sam", "alex", "sea"], "wedding")
assert len(xw.grid) == 10
assert all(len(row) == 10 for row in xw.grid)
assert xw.clues_across
assert xw.clues_down
def test_cartoon_success_embedded_locally():
"""BR2.1: xkcd source found → cartoon art_ref is a local (non-remote) path."""
result = FunniesBuilder().build(FunniesBrief(theme_words=["sam"], context="wedding"))
cartoon = result.cartoons[0]
assert cartoon.source == "xkcd"
assert not cartoon.art_ref.startswith(("http://", "https://"))
def test_cartoon_failure_falls_back_to_tasteful_strip():
"""BR2.2: no cartoon found → tasteful fallback (not a remote URL)."""
builder = FunniesBuilder(cartoon_source=StubXkcdCartoonSource(found=False))
result = builder.build(FunniesBrief(theme_words=["sam"], context="wedding"))
assert result.cartoons[0].source == "generated"
assert result.status == "fallback"
assert result.is_self_contained()
def test_empty_funnies_result_on_no_content():
"""BR3.2 / Q5=A: no viable content → empty result + statusMessage, no throw."""
result = FunniesBuilder().build(FunniesBrief(theme_words=[], context=""))
assert result.status == "empty"
assert result.status_message
def test_funnies_output_self_contained():
"""BR4.1 / NFR4: no remote URL survives in any art_ref."""
result = FunniesBuilder().build(FunniesBrief(theme_words=["sam", "alex"], context="wedding"))
assert result.is_self_contained()