Files
kjvstudy.org/tests/test_coverage_part2.py
kennethreitz 45cca004f3 Improve test coverage from 76% to 81% with 213 new tests
- Add test_coverage_improvements.py (77 tests): reading plans, stories,
  bible routes, search, interlinear, topics, edge cases
- Add test_coverage_part2.py (77 tests): cross_references, jinja_filters,
  commentary_loader, topics, search_index, kjv, books, strongs modules
- Add test_coverage_part3.py (59 tests): API endpoints, web routes,
  Strong's, family tree, timeline, study guides, misc routes

Fix exodus.json commentary data:
- Fix 72 verses in chapters 29-31 with malformed questions arrays
- Questions were nested arrays [["q"]] instead of strings ["q"]

Test results: 710 passed, 1 skipped, 81% coverage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 13:47:28 -05:00

601 lines
23 KiB
Python

"""
Additional tests to improve coverage - Part 2.
Targets:
- cross_references.py (68% -> higher)
- jinja_filters.py (74% -> higher)
- commentary_loader.py (64% -> higher)
- topics.py (77% -> higher)
- search_index.py (48% -> higher)
"""
import pytest
class TestCrossReferencesModule:
"""Direct tests for cross_references module."""
def test_get_cross_references_john_3_16(self):
"""Test cross references for famous verse."""
from kjvstudy_org.cross_references import get_cross_references
refs = get_cross_references("John", 3, 16)
assert isinstance(refs, list)
def test_get_cross_references_genesis_1_1(self):
"""Test cross references for first verse."""
from kjvstudy_org.cross_references import get_cross_references
refs = get_cross_references("Genesis", 1, 1)
assert isinstance(refs, list)
def test_get_cross_references_nonexistent(self):
"""Test cross references for verse with no refs."""
from kjvstudy_org.cross_references import get_cross_references
refs = get_cross_references("Philemon", 1, 25)
assert isinstance(refs, list)
def test_parse_reference_valid(self):
"""Test parsing valid reference."""
from kjvstudy_org.cross_references import parse_reference
result = parse_reference("Genesis 1:1")
assert result is not None
assert result["book"] == "Genesis"
assert result["chapter"] == 1
assert result["verse"] == 1
def test_parse_reference_numbered_book(self):
"""Test parsing numbered book reference."""
from kjvstudy_org.cross_references import parse_reference
result = parse_reference("1 John 3:16")
assert result is not None
assert result["book"] == "1 John"
assert result["chapter"] == 3
assert result["verse"] == 16
def test_parse_reference_invalid_no_colon(self):
"""Test parsing invalid reference without colon."""
from kjvstudy_org.cross_references import parse_reference
result = parse_reference("Genesis 1")
assert result is None
def test_parse_reference_invalid_no_space(self):
"""Test parsing invalid reference without space."""
from kjvstudy_org.cross_references import parse_reference
result = parse_reference("Genesis1:1")
assert result is None
def test_parse_reference_invalid_non_numeric(self):
"""Test parsing invalid reference with non-numeric values."""
from kjvstudy_org.cross_references import parse_reference
result = parse_reference("Genesis abc:xyz")
assert result is None
def test_cross_references_with_text(self):
"""Test that cross references include verse text."""
from kjvstudy_org.cross_references import get_cross_references
refs = get_cross_references("John", 3, 16)
if refs:
# Should have text field (may be empty for some)
assert "text" in refs[0] or "ref" in refs[0]
class TestJinjaFilters:
"""Tests for Jinja2 template filters."""
def test_markdown_to_html_basic(self):
"""Test basic markdown conversion."""
from kjvstudy_org.jinja_filters import markdown_to_html
result = markdown_to_html("**bold** and *italic*")
assert "<strong>bold</strong>" in result
assert "<em>italic</em>" in result
def test_markdown_to_html_empty(self):
"""Test markdown with empty input."""
from kjvstudy_org.jinja_filters import markdown_to_html
assert markdown_to_html("") == ""
assert markdown_to_html(None) is None
def test_markdown_inline_basic(self):
"""Test inline markdown conversion."""
from kjvstudy_org.jinja_filters import markdown_inline
result = markdown_inline("**bold**")
assert "<strong>bold</strong>" in result
# Should not have paragraph wrapper
assert not result.startswith("<p>")
def test_markdown_inline_empty(self):
"""Test inline markdown with empty input."""
from kjvstudy_org.jinja_filters import markdown_inline
assert markdown_inline("") == ""
assert markdown_inline(None) is None
def test_link_verse_references(self):
"""Test verse reference linking."""
from kjvstudy_org.jinja_filters import link_verse_references_in_text
result = link_verse_references_in_text("Read John 3:16 for more.")
# The function links verse references
assert 'href="' in result
assert "John" in result
assert "3:16" in result
def test_link_verse_references_range(self):
"""Test verse range reference linking."""
from kjvstudy_org.jinja_filters import link_verse_references_in_text
result = link_verse_references_in_text("In Genesis 1:1-3 we see")
assert 'href="' in result
assert "Genesis" in result
def test_link_verse_references_numbered_book(self):
"""Test numbered book reference linking."""
from kjvstudy_org.jinja_filters import link_verse_references_in_text
result = link_verse_references_in_text("See 1 John 4:8")
assert 'href="/book/1 John/chapter/4#verse-8"' in result
def test_link_verse_references_empty(self):
"""Test verse reference linking with empty input."""
from kjvstudy_org.jinja_filters import link_verse_references_in_text
assert link_verse_references_in_text("") == ""
assert link_verse_references_in_text(None) is None
def test_inject_word_markers_basic(self):
"""Test word marker injection."""
from kjvstudy_org.jinja_filters import inject_word_markers
word_studies = [
{"word": "love", "term": "agape", "translit": "agapē", "note": "Divine love"}
]
result = inject_word_markers("God is love.", word_studies, 1)
assert "sidenote" in result
assert "agape" in result
def test_inject_word_markers_empty(self):
"""Test word marker injection with no studies."""
from kjvstudy_org.jinja_filters import inject_word_markers
result = inject_word_markers("God is love.", [], 1)
assert result == "God is love."
def test_format_numbered_lists_basic(self):
"""Test numbered list formatting."""
from kjvstudy_org.jinja_filters import format_numbered_lists
text = "The points are: (1) first point (2) second point (3) third point."
result = format_numbered_lists(text)
assert "<ol>" in result
assert "<li>" in result
def test_format_numbered_lists_no_list(self):
"""Test text without numbered list."""
from kjvstudy_org.jinja_filters import format_numbered_lists
text = "Just regular text."
result = format_numbered_lists(text)
assert result == text
def test_split_paragraphs_basic(self):
"""Test paragraph splitting."""
from kjvstudy_org.jinja_filters import split_paragraphs
text = "First paragraph.\n\nSecond paragraph."
result = split_paragraphs(text)
assert "<p>First paragraph.</p>" in result
assert "<p>Second paragraph.</p>" in result
def test_split_paragraphs_empty(self):
"""Test paragraph splitting with empty input."""
from kjvstudy_org.jinja_filters import split_paragraphs
assert split_paragraphs("") == ""
assert split_paragraphs(None) is None
def test_number_format(self):
"""Test number formatting."""
from kjvstudy_org.jinja_filters import number_format
assert number_format(31102) == "31,102"
assert number_format(1000000) == "1,000,000"
assert number_format(100) == "100"
def test_linkify_strongs_greek(self):
"""Test Strong's Greek number linking."""
from kjvstudy_org.jinja_filters import linkify_strongs
result = linkify_strongs("The word G26 means love.")
assert 'href="/strongs/G26"' in result
assert "strongs-ref" in result
def test_linkify_strongs_hebrew(self):
"""Test Strong's Hebrew number linking."""
from kjvstudy_org.jinja_filters import linkify_strongs
result = linkify_strongs("The word H157 means love.")
assert 'href="/strongs/H157"' in result
def test_linkify_strongs_empty(self):
"""Test Strong's linking with empty input."""
from kjvstudy_org.jinja_filters import linkify_strongs
assert linkify_strongs("") == ""
assert linkify_strongs(None) is None
class TestCommentaryLoader:
"""Tests for commentary loader module."""
def test_load_commentary(self):
"""Test loading commentary data."""
from kjvstudy_org.utils.commentary_loader import load_commentary
data = load_commentary()
assert isinstance(data, dict)
# Should have some books
assert len(data) > 0
def test_load_commentary_flat(self):
"""Test loading flat commentary data."""
from kjvstudy_org.utils.commentary_loader import load_commentary_flat
data = load_commentary_flat()
assert isinstance(data, dict)
# Keys should be in "Book Chapter:Verse" format
if data:
key = list(data.keys())[0]
assert ":" in key
def test_normalize_entry_valid(self):
"""Test normalizing valid entry."""
from kjvstudy_org.utils.commentary_loader import _normalize_entry
entry = {
"analysis": "Test analysis",
"historical": "Test historical",
"questions": ["Q1", "Q2"]
}
result = _normalize_entry(entry)
assert result["analysis"] == "Test analysis"
assert result["historical"] == "Test historical"
assert result["questions"] == ["Q1", "Q2"]
def test_normalize_entry_historical_context(self):
"""Test normalizing entry with historical_context key."""
from kjvstudy_org.utils.commentary_loader import _normalize_entry
entry = {
"analysis": "Test",
"historical_context": "Historical info"
}
result = _normalize_entry(entry)
assert result["historical"] == "Historical info"
def test_normalize_entry_non_dict(self):
"""Test normalizing non-dict entry."""
from kjvstudy_org.utils.commentary_loader import _normalize_entry
result = _normalize_entry("not a dict")
assert result["analysis"] == ""
assert result["historical"] == ""
assert result["questions"] == []
def test_normalize_entry_missing_fields(self):
"""Test normalizing entry with missing fields."""
from kjvstudy_org.utils.commentary_loader import _normalize_entry
result = _normalize_entry({})
assert result["analysis"] == ""
assert result["historical"] == ""
assert result["questions"] == []
def test_slugify(self):
"""Test book name slugification."""
from kjvstudy_org.utils.commentary_loader import _slugify
assert _slugify("Genesis") == "genesis"
assert _slugify("1 Samuel") == "1_samuel"
assert _slugify("Song of Solomon") == "song_of_solomon"
class TestTopicsModule:
"""Tests for topics module."""
def test_get_all_topics(self):
"""Test getting all topics."""
from kjvstudy_org.topics import get_all_topics
topics = get_all_topics()
assert isinstance(topics, dict)
def test_get_topic_valid(self):
"""Test getting a valid topic."""
from kjvstudy_org.topics import get_all_topics, get_topic
all_topics = get_all_topics()
if all_topics:
topic_name = list(all_topics.keys())[0]
topic = get_topic(topic_name)
assert topic is not None
def test_get_topic_invalid(self):
"""Test getting non-existent topic."""
from kjvstudy_org.topics import get_topic
result = get_topic("NonExistentTopic12345")
assert result is None
def test_get_topic_with_text(self):
"""Test getting topic with verse text."""
from kjvstudy_org.topics import get_all_topics, get_topic_with_text
all_topics = get_all_topics()
if all_topics:
topic_name = list(all_topics.keys())[0]
topic = get_topic_with_text(topic_name)
if topic:
assert "subtopics" in topic or isinstance(topic, dict)
def test_get_topic_with_text_invalid(self):
"""Test getting non-existent topic with text."""
from kjvstudy_org.topics import get_topic_with_text
result = get_topic_with_text("NonExistentTopic12345")
assert result is None
def test_search_topics(self):
"""Test searching topics."""
from kjvstudy_org.topics import search_topics
results = search_topics("love")
assert isinstance(results, list)
def test_search_topics_no_results(self):
"""Test searching topics with no results."""
from kjvstudy_org.topics import search_topics
results = search_topics("xyznonexistent12345")
assert isinstance(results, list)
assert len(results) == 0
class TestSearchIndexModule:
"""Tests for search index module."""
def test_get_search_stats(self):
"""Test getting search stats."""
from kjvstudy_org.utils.search_index import get_search_stats
stats = get_search_stats()
assert isinstance(stats, dict)
assert "indexed" in stats
def test_highlight_matches(self):
"""Test highlighting search matches."""
from kjvstudy_org.utils.search_index import highlight_matches
result = highlight_matches("God is love", "love")
assert "<mark>love</mark>" in result
def test_highlight_matches_multiple(self):
"""Test highlighting multiple matches."""
from kjvstudy_org.utils.search_index import highlight_matches
result = highlight_matches("God is love and love is God", "love")
assert result.count("<mark>love</mark>") == 2
def test_highlight_matches_case_insensitive(self):
"""Test case insensitive highlighting."""
from kjvstudy_org.utils.search_index import highlight_matches
result = highlight_matches("LOVE is love", "love")
assert "<mark>" in result
class TestReadingPlansModule:
"""Tests for reading plans module."""
def test_get_plan_valid(self):
"""Test getting a valid reading plan."""
from kjvstudy_org.reading_plans import get_plan
plan = get_plan("chronological")
if plan:
assert "name" in plan
def test_get_plan_invalid(self):
"""Test getting non-existent plan."""
from kjvstudy_org.reading_plans import get_plan
plan = get_plan("nonexistent-plan-xyz")
assert plan is None
def test_get_plan_summary(self):
"""Test getting plan summary."""
from kjvstudy_org.reading_plans import get_plan_summary
summary = get_plan_summary()
assert isinstance(summary, (list, dict))
class TestStoriesModule:
"""Tests for stories module."""
def test_load_all_stories(self):
"""Test loading all stories."""
from kjvstudy_org.stories import load_all_stories
stories = load_all_stories()
assert isinstance(stories, list)
def test_get_all_stories_flat(self):
"""Test getting flat stories list."""
from kjvstudy_org.stories import get_all_stories_flat
stories = get_all_stories_flat()
assert isinstance(stories, list)
def test_get_story_by_slug_invalid(self):
"""Test getting non-existent story."""
from kjvstudy_org.stories import get_story_by_slug
story = get_story_by_slug("nonexistent-story-xyz")
assert story is None
def test_get_stories_by_category(self):
"""Test getting stories by category."""
from kjvstudy_org.stories import get_stories_by_category, get_categories
categories = get_categories()
if categories:
cat_slug = categories[0].get("slug")
if cat_slug:
stories = get_stories_by_category(cat_slug)
assert isinstance(stories, list)
def test_get_stories_by_category_invalid(self):
"""Test getting stories from non-existent category."""
from kjvstudy_org.stories import get_stories_by_category
stories = get_stories_by_category("nonexistent-category")
assert stories == []
def test_get_category_by_slug(self):
"""Test getting category by slug."""
from kjvstudy_org.stories import get_category_by_slug, get_categories
categories = get_categories()
if categories:
cat_slug = categories[0].get("slug")
if cat_slug:
category = get_category_by_slug(cat_slug)
assert category is not None
def test_get_category_by_slug_invalid(self):
"""Test getting non-existent category."""
from kjvstudy_org.stories import get_category_by_slug
category = get_category_by_slug("nonexistent-category")
assert category is None
def test_get_story_count(self):
"""Test getting story count."""
from kjvstudy_org.stories import get_story_count
count = get_story_count()
assert isinstance(count, int)
assert count >= 0
def test_get_category_count(self):
"""Test getting category count."""
from kjvstudy_org.stories import get_category_count
count = get_category_count()
assert isinstance(count, int)
assert count >= 0
class TestKJVModule:
"""Tests for kjv module."""
def test_get_books(self):
"""Test getting all books."""
from kjvstudy_org.kjv import bible
books = bible.get_books()
assert len(books) == 66
def test_get_verse_text(self):
"""Test getting specific verse text."""
from kjvstudy_org.kjv import bible
text = bible.get_verse_text("Genesis", 1, 1)
assert "beginning" in text.lower()
def test_get_verse_text_invalid(self):
"""Test getting verse text for invalid reference."""
from kjvstudy_org.kjv import bible
text = bible.get_verse_text("NotABook", 1, 1)
assert text is None or text == ""
def test_get_chapters_for_book(self):
"""Test getting chapters for a book."""
from kjvstudy_org.kjv import bible
chapters = bible.get_chapters_for_book("Genesis")
assert len(chapters) == 50
def test_get_chapters_for_psalms(self):
"""Test getting chapters for Psalms."""
from kjvstudy_org.kjv import bible
chapters = bible.get_chapters_for_book("Psalms")
assert len(chapters) == 150
def test_get_verses_by_book_chapter(self):
"""Test getting verses for a chapter."""
from kjvstudy_org.kjv import bible
verses = bible.get_verses_by_book_chapter("Genesis", 1)
assert len(verses) == 31
def test_iter_verses(self):
"""Test iterating all verses."""
from kjvstudy_org.kjv import bible
count = 0
for verse in bible.iter_verses():
count += 1
if count >= 10:
break
assert count == 10
class TestBooksModule:
"""Tests for books module."""
def test_get_book_data_genesis(self):
"""Test getting Genesis book data."""
from kjvstudy_org.books import get_book_data, has_book_data
if has_book_data("Genesis"):
data = get_book_data("Genesis")
assert data is not None
def test_has_book_data(self):
"""Test checking for book data."""
from kjvstudy_org.books import has_book_data
# Should return boolean
result = has_book_data("Genesis")
assert isinstance(result, bool)
def test_has_book_data_invalid(self):
"""Test checking for non-existent book data."""
from kjvstudy_org.books import has_book_data
result = has_book_data("NotABook")
assert result is False
class TestUtilsBooks:
"""Tests for utils/books module."""
def test_normalize_book_name_abbreviation(self):
"""Test normalizing book abbreviations."""
from kjvstudy_org.utils.books import normalize_book_name
# Gen is a known abbreviation
result = normalize_book_name("Gen")
assert result == "Genesis"
# Some abbreviations may not be mapped
# Just verify the function handles various inputs
def test_normalize_book_name_canonical(self):
"""Test normalizing canonical names returns None."""
from kjvstudy_org.utils.books import normalize_book_name
# Canonical names should return None (no redirect needed)
assert normalize_book_name("Genesis") is None
def test_normalize_book_name_invalid(self):
"""Test normalizing invalid book name."""
from kjvstudy_org.utils.books import normalize_book_name
result = normalize_book_name("NotABook")
assert result is None
def test_ot_books_count(self):
"""Test Old Testament books count."""
from kjvstudy_org.utils.books import OT_BOOKS
assert len(OT_BOOKS) == 39
def test_nt_books_count(self):
"""Test New Testament books count."""
from kjvstudy_org.utils.books import NT_BOOKS
assert len(NT_BOOKS) == 27
class TestRedLetterModule:
"""Tests for red letter module."""
def test_wrap_red_letter_text_gospels(self):
"""Test red letter text in Gospels."""
from kjvstudy_org.red_letter import wrap_red_letter_text
# This verse contains words of Jesus
result = wrap_red_letter_text("For God so loved the world", "John", 3, 16)
# May or may not have red letter markup depending on verse
assert isinstance(result, str)
def test_wrap_red_letter_text_non_gospels(self):
"""Test red letter text outside Gospels."""
from kjvstudy_org.red_letter import wrap_red_letter_text
result = wrap_red_letter_text("In the beginning", "Genesis", 1, 1)
# Genesis should not have red letters
assert isinstance(result, str)
class TestInterlinearLoader:
"""Tests for interlinear loader module."""
def test_get_interlinear_data_genesis(self):
"""Test getting interlinear data for Genesis."""
from kjvstudy_org.interlinear_loader import get_interlinear_data
data = get_interlinear_data("Genesis", 1, 1)
# May or may not have data
assert data is None or isinstance(data, list)
def test_has_interlinear_data(self):
"""Test checking for interlinear data."""
from kjvstudy_org.interlinear_loader import has_interlinear_data
result = has_interlinear_data("Genesis", 1, 1)
assert isinstance(result, bool)
def test_get_interlinear_data_john(self):
"""Test getting interlinear data for John (Greek)."""
from kjvstudy_org.interlinear_loader import get_interlinear_data
data = get_interlinear_data("John", 1, 1)
assert data is None or isinstance(data, list)