mirror of
https://github.com/kennethreitz/kjvstudy.org.git
synced 2026-06-05 23:00:16 +00:00
01bd78b9cb
The verse_collections module is not tracked in git and unused. Removes tests that were failing in CI due to missing module. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
486 lines
18 KiB
Python
486 lines
18 KiB
Python
"""
|
|
Additional tests to improve coverage - Part 4.
|
|
|
|
Targeting modules with lowest coverage:
|
|
- reading_plans routes helper functions
|
|
- search_index module
|
|
- interlinear_loader module
|
|
- various uncovered code paths
|
|
"""
|
|
import pytest
|
|
|
|
|
|
class TestReadingPlanHelperFunctions:
|
|
"""Tests for reading plan helper functions."""
|
|
|
|
def test_parse_reading_reference_single_chapter(self):
|
|
"""Test parsing single chapter reference."""
|
|
from kjvstudy_org.routes.reading_plans import parse_reading_reference
|
|
result = parse_reading_reference("Genesis 1")
|
|
assert result == [("Genesis", 1)]
|
|
|
|
def test_parse_reading_reference_chapter_range(self):
|
|
"""Test parsing chapter range reference."""
|
|
from kjvstudy_org.routes.reading_plans import parse_reading_reference
|
|
result = parse_reading_reference("Genesis 1-3")
|
|
assert result == [("Genesis", 1), ("Genesis", 2), ("Genesis", 3)]
|
|
|
|
def test_parse_reading_reference_numbered_book(self):
|
|
"""Test parsing numbered book reference."""
|
|
from kjvstudy_org.routes.reading_plans import parse_reading_reference
|
|
result = parse_reading_reference("1 John 2-3")
|
|
assert len(result) == 2
|
|
assert result[0][0] == "1 John"
|
|
|
|
def test_parse_reading_reference_invalid(self):
|
|
"""Test parsing invalid reference."""
|
|
from kjvstudy_org.routes.reading_plans import parse_reading_reference
|
|
result = parse_reading_reference("not a valid reference")
|
|
assert result == []
|
|
|
|
def test_parse_reading_reference_invalid_book(self):
|
|
"""Test parsing reference with invalid book name."""
|
|
from kjvstudy_org.routes.reading_plans import parse_reading_reference
|
|
result = parse_reading_reference("NotABook 1-3")
|
|
assert result == []
|
|
|
|
def test_parse_reading_reference_matthew(self):
|
|
"""Test parsing Matthew reference."""
|
|
from kjvstudy_org.routes.reading_plans import parse_reading_reference
|
|
result = parse_reading_reference("Matthew 5")
|
|
assert result == [("Matthew", 5)]
|
|
|
|
def test_get_reading_text_single(self):
|
|
"""Test getting reading text for single reference."""
|
|
from kjvstudy_org.routes.reading_plans import get_reading_text
|
|
result = get_reading_text(["Genesis 1"])
|
|
assert len(result) >= 1
|
|
assert result[0]["book"] == "Genesis"
|
|
assert result[0]["chapter"] == 1
|
|
assert "verses" in result[0]
|
|
|
|
def test_get_reading_text_multiple(self):
|
|
"""Test getting reading text for multiple references."""
|
|
from kjvstudy_org.routes.reading_plans import get_reading_text
|
|
result = get_reading_text(["Genesis 1", "John 1"])
|
|
assert len(result) >= 2
|
|
|
|
def test_get_reading_text_range(self):
|
|
"""Test getting reading text for chapter range."""
|
|
from kjvstudy_org.routes.reading_plans import get_reading_text
|
|
result = get_reading_text(["Psalms 1-3"])
|
|
assert len(result) == 3
|
|
|
|
def test_get_reading_text_invalid(self):
|
|
"""Test getting reading text for invalid reference."""
|
|
from kjvstudy_org.routes.reading_plans import get_reading_text
|
|
result = get_reading_text(["InvalidBook 1"])
|
|
assert result == []
|
|
|
|
|
|
class TestSearchIndexDirect:
|
|
"""Direct tests for search_index module functions."""
|
|
|
|
def test_search_verses_basic(self):
|
|
"""Test basic verse search."""
|
|
from kjvstudy_org.utils.search_index import search_verses, DB_PATH
|
|
if DB_PATH.exists():
|
|
results = search_verses("love")
|
|
assert isinstance(results, list)
|
|
if results:
|
|
assert "book" in results[0]
|
|
assert "text" in results[0]
|
|
|
|
def test_search_verses_with_limit(self):
|
|
"""Test verse search with limit."""
|
|
from kjvstudy_org.utils.search_index import search_verses, DB_PATH
|
|
if DB_PATH.exists():
|
|
results = search_verses("God", limit=5)
|
|
assert len(results) <= 5
|
|
|
|
def test_search_verses_empty_query(self):
|
|
"""Test verse search with empty query."""
|
|
from kjvstudy_org.utils.search_index import search_verses, DB_PATH
|
|
if DB_PATH.exists():
|
|
results = search_verses("")
|
|
assert results == []
|
|
|
|
def test_search_verses_with_book_filter(self):
|
|
"""Test verse search with book filter."""
|
|
from kjvstudy_org.utils.search_index import search_verses, DB_PATH
|
|
if DB_PATH.exists():
|
|
results = search_verses("Jesus", book_filter="John")
|
|
for r in results:
|
|
assert r["book"] == "John"
|
|
|
|
def test_search_verses_old_testament_filter(self):
|
|
"""Test verse search with OT filter."""
|
|
from kjvstudy_org.utils.search_index import search_verses, DB_PATH
|
|
if DB_PATH.exists():
|
|
results = search_verses("LORD", testament_filter="old", limit=10)
|
|
nt_books = ["Matthew", "Mark", "Luke", "John", "Acts"]
|
|
for r in results:
|
|
assert r["book"] not in nt_books
|
|
|
|
def test_search_verses_new_testament_filter(self):
|
|
"""Test verse search with NT filter."""
|
|
from kjvstudy_org.utils.search_index import search_verses, DB_PATH
|
|
if DB_PATH.exists():
|
|
results = search_verses("Jesus", testament_filter="new", limit=10)
|
|
ot_books = ["Genesis", "Exodus", "Psalms"]
|
|
for r in results:
|
|
assert r["book"] not in ot_books
|
|
|
|
def test_get_search_stats(self):
|
|
"""Test getting search statistics."""
|
|
from kjvstudy_org.utils.search_index import get_search_stats
|
|
stats = get_search_stats()
|
|
assert isinstance(stats, dict)
|
|
assert "indexed" in stats
|
|
if stats["indexed"]:
|
|
assert "verses" in stats
|
|
assert stats["verses"] > 0
|
|
|
|
def test_highlight_matches_single_term(self):
|
|
"""Test highlighting single term."""
|
|
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_terms(self):
|
|
"""Test highlighting multiple terms."""
|
|
from kjvstudy_org.utils.search_index import highlight_matches
|
|
result = highlight_matches("God is love and love is eternal", "love")
|
|
assert result.count("<mark>") == 2
|
|
|
|
def test_get_connection(self):
|
|
"""Test database connection context manager."""
|
|
from kjvstudy_org.utils.search_index import get_connection, DB_PATH
|
|
if DB_PATH.exists():
|
|
with get_connection() as conn:
|
|
cursor = conn.cursor()
|
|
cursor.execute("SELECT 1")
|
|
assert cursor.fetchone()[0] == 1
|
|
|
|
|
|
class TestInterlinearLoaderDirect:
|
|
"""Direct tests for interlinear_loader module."""
|
|
|
|
def test_get_interlinear_data_genesis(self):
|
|
"""Test getting interlinear data for Genesis 1:1."""
|
|
from kjvstudy_org.interlinear_loader import get_interlinear_data
|
|
result = get_interlinear_data("Genesis", 1, 1)
|
|
# May or may not have data
|
|
assert result is None or isinstance(result, list)
|
|
|
|
def test_has_interlinear_data_true(self):
|
|
"""Test checking for existing interlinear data."""
|
|
from kjvstudy_org.interlinear_loader import has_interlinear_data
|
|
result = has_interlinear_data("Genesis", 1, 1)
|
|
assert isinstance(result, bool)
|
|
|
|
def test_has_interlinear_data_false(self):
|
|
"""Test checking for non-existing interlinear data."""
|
|
from kjvstudy_org.interlinear_loader import has_interlinear_data
|
|
result = has_interlinear_data("InvalidBook", 999, 999)
|
|
assert result is False
|
|
|
|
def test_get_all_interlinear_verses(self):
|
|
"""Test getting all verses with interlinear data."""
|
|
from kjvstudy_org.interlinear_loader import get_all_interlinear_verses
|
|
result = get_all_interlinear_verses()
|
|
assert isinstance(result, list)
|
|
if result:
|
|
assert "book" in result[0]
|
|
assert "chapter" in result[0]
|
|
assert "verse" in result[0]
|
|
|
|
def test_find_verses_by_strongs_hebrew(self):
|
|
"""Test finding verses by Hebrew Strong's number."""
|
|
from kjvstudy_org.interlinear_loader import find_verses_by_strongs
|
|
result = find_verses_by_strongs("H430", limit=5)
|
|
assert isinstance(result, list)
|
|
assert len(result) <= 5
|
|
|
|
def test_find_verses_by_strongs_greek(self):
|
|
"""Test finding verses by Greek Strong's number."""
|
|
from kjvstudy_org.interlinear_loader import find_verses_by_strongs
|
|
result = find_verses_by_strongs("G2316", limit=5)
|
|
assert isinstance(result, list)
|
|
|
|
def test_find_verses_by_strongs_invalid(self):
|
|
"""Test finding verses by invalid Strong's number."""
|
|
from kjvstudy_org.interlinear_loader import find_verses_by_strongs
|
|
result = find_verses_by_strongs("X99999")
|
|
assert result == [] or isinstance(result, list)
|
|
|
|
def test_count_strongs_occurrences(self):
|
|
"""Test counting Strong's occurrences."""
|
|
from kjvstudy_org.interlinear_loader import count_strongs_occurrences
|
|
count = count_strongs_occurrences("H430")
|
|
assert isinstance(count, int)
|
|
assert count >= 0
|
|
|
|
def test_count_strongs_occurrences_invalid(self):
|
|
"""Test counting invalid Strong's number."""
|
|
from kjvstudy_org.interlinear_loader import count_strongs_occurrences
|
|
count = count_strongs_occurrences("X99999")
|
|
assert count == 0
|
|
|
|
def test_preload_data(self):
|
|
"""Test preloading interlinear data."""
|
|
from kjvstudy_org.interlinear_loader import preload_data
|
|
# Should not raise
|
|
preload_data()
|
|
|
|
|
|
class TestKJVModuleExtended:
|
|
"""Extended tests for kjv module uncovered lines."""
|
|
|
|
def test_get_verse_invalid_book(self):
|
|
"""Test getting verse from invalid book."""
|
|
from kjvstudy_org.kjv import bible
|
|
result = bible.get_verse_text("InvalidBook", 1, 1)
|
|
assert result is None or result == ""
|
|
|
|
def test_get_verse_invalid_chapter(self):
|
|
"""Test getting verse from invalid chapter."""
|
|
from kjvstudy_org.kjv import bible
|
|
result = bible.get_verse_text("Genesis", 999, 1)
|
|
assert result is None or result == ""
|
|
|
|
def test_get_chapters_invalid_book(self):
|
|
"""Test getting chapters from invalid book."""
|
|
from kjvstudy_org.kjv import bible
|
|
result = bible.get_chapters_for_book("InvalidBook")
|
|
assert result == [] or result is None
|
|
|
|
def test_get_verses_invalid_book_chapter(self):
|
|
"""Test getting verses from invalid book/chapter."""
|
|
from kjvstudy_org.kjv import bible
|
|
result = bible.get_verses_by_book_chapter("InvalidBook", 1)
|
|
assert result == [] or result is None
|
|
|
|
|
|
class TestCrossReferencesExtended:
|
|
"""Extended tests for cross_references module."""
|
|
|
|
def test_parse_reference_three_john(self):
|
|
"""Test parsing 3 John reference."""
|
|
from kjvstudy_org.cross_references import parse_reference
|
|
result = parse_reference("3 John 1:4")
|
|
assert result is not None
|
|
assert result["book"] == "3 John"
|
|
|
|
def test_get_cross_references_psalms(self):
|
|
"""Test getting cross references for Psalms."""
|
|
from kjvstudy_org.cross_references import get_cross_references
|
|
result = get_cross_references("Psalms", 23, 1)
|
|
assert isinstance(result, list)
|
|
|
|
|
|
class TestTopicsExtended:
|
|
"""Extended tests for topics module uncovered lines."""
|
|
|
|
def test_search_topics_partial(self):
|
|
"""Test searching topics with partial match."""
|
|
from kjvstudy_org.topics import search_topics
|
|
results = search_topics("god")
|
|
assert isinstance(results, list)
|
|
|
|
def test_get_verse_text_for_invalid(self):
|
|
"""Test internal function with invalid reference."""
|
|
from kjvstudy_org.topics import _get_verse_text_for_reference
|
|
result = _get_verse_text_for_reference("")
|
|
assert result == ""
|
|
|
|
def test_get_verse_text_for_no_colon(self):
|
|
"""Test internal function with reference without colon."""
|
|
from kjvstudy_org.topics import _get_verse_text_for_reference
|
|
result = _get_verse_text_for_reference("Genesis 1")
|
|
assert result == ""
|
|
|
|
def test_get_verse_text_for_valid(self):
|
|
"""Test internal function with valid reference."""
|
|
from kjvstudy_org.topics import _get_verse_text_for_reference
|
|
result = _get_verse_text_for_reference("John 3:16")
|
|
assert isinstance(result, str)
|
|
|
|
|
|
class TestStoriesExtended:
|
|
"""Extended tests for stories module."""
|
|
|
|
def test_get_story_by_valid_slug(self):
|
|
"""Test getting story by valid slug."""
|
|
from kjvstudy_org.stories import get_all_stories_flat, get_story_by_slug
|
|
stories = get_all_stories_flat()
|
|
if stories:
|
|
slug = stories[0].get("slug")
|
|
if slug:
|
|
result = get_story_by_slug(slug)
|
|
assert result is not None
|
|
|
|
def test_refresh_stories(self):
|
|
"""Test refreshing story cache."""
|
|
from kjvstudy_org.stories import refresh_stories
|
|
# Should not raise
|
|
refresh_stories()
|
|
|
|
|
|
class TestBooksModuleExtended:
|
|
"""Extended tests for books module."""
|
|
|
|
def test_get_book_data_all_books(self):
|
|
"""Test getting book data for various books."""
|
|
from kjvstudy_org.books import get_book_data, has_book_data
|
|
books = ["Genesis", "Psalms", "Matthew", "Revelation"]
|
|
for book in books:
|
|
if has_book_data(book):
|
|
data = get_book_data(book)
|
|
assert data is not None or data == {}
|
|
|
|
|
|
class TestUtilsBooksExtended:
|
|
"""Extended tests for utils/books module."""
|
|
|
|
def test_normalize_various_abbreviations(self):
|
|
"""Test normalizing various book abbreviations."""
|
|
from kjvstudy_org.utils.books import normalize_book_name
|
|
# Test common abbreviations
|
|
assert normalize_book_name("Gen") == "Genesis"
|
|
assert normalize_book_name("Exod") == "Exodus" or normalize_book_name("Exod") is None
|
|
assert normalize_book_name("Ps") == "Psalms" or normalize_book_name("Ps") is None
|
|
|
|
def test_book_lists(self):
|
|
"""Test OT and NT book lists."""
|
|
from kjvstudy_org.utils.books import OT_BOOKS, NT_BOOKS
|
|
assert "Genesis" in OT_BOOKS
|
|
assert "Matthew" in NT_BOOKS
|
|
assert len(OT_BOOKS) + len(NT_BOOKS) == 66
|
|
|
|
|
|
class TestJinjaFiltersExtended:
|
|
"""Extended tests for jinja_filters module."""
|
|
|
|
def test_format_numbered_lists_single(self):
|
|
"""Test formatting text with single numbered item."""
|
|
from kjvstudy_org.jinja_filters import format_numbered_lists
|
|
text = "Just (1) one item here."
|
|
result = format_numbered_lists(text)
|
|
# Should not create list with single item
|
|
assert "<ol>" not in result or "<ol>" in result
|
|
|
|
def test_format_numbered_lists_fallback(self):
|
|
"""Test formatting with fallback pattern."""
|
|
from kjvstudy_org.jinja_filters import format_numbered_lists
|
|
text = "Items: 1) first 2) second 3) third"
|
|
result = format_numbered_lists(text)
|
|
assert isinstance(result, str)
|
|
|
|
def test_split_paragraphs_br(self):
|
|
"""Test splitting paragraphs with br tags."""
|
|
from kjvstudy_org.jinja_filters import split_paragraphs
|
|
text = "First paragraph.<br><br>Second paragraph."
|
|
result = split_paragraphs(text)
|
|
assert "<p>" in result
|
|
|
|
|
|
class TestMiscAPIEndpoints:
|
|
"""Tests for misc API endpoints."""
|
|
|
|
def test_api_bible_full(self, client):
|
|
"""Test full Bible API endpoint."""
|
|
response = client.get("/api/bible")
|
|
assert response.status_code == 200
|
|
|
|
def test_api_random_verse(self, client):
|
|
"""Test random verse API."""
|
|
response = client.get("/api/verse-of-the-day")
|
|
assert response.status_code == 200
|
|
|
|
def test_api_verse_single(self, client):
|
|
"""Test single verse API."""
|
|
response = client.get("/api/verse/Genesis/1/1")
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert "text" in data
|
|
|
|
def test_api_verse_invalid(self, client):
|
|
"""Test invalid verse API."""
|
|
response = client.get("/api/verse/InvalidBook/1/1")
|
|
assert response.status_code == 404
|
|
|
|
|
|
class TestMoreRoutes:
|
|
"""Tests for additional route coverage."""
|
|
|
|
def test_verse_page_with_interlinear(self, client):
|
|
"""Test verse page that may have interlinear."""
|
|
response = client.get("/book/Genesis/chapter/1/verse/1")
|
|
assert response.status_code == 200
|
|
|
|
def test_chapter_with_many_verses(self, client):
|
|
"""Test chapter with many verses (Psalm 119)."""
|
|
response = client.get("/book/Psalms/chapter/119")
|
|
assert response.status_code == 200
|
|
|
|
def test_small_book_page(self, client):
|
|
"""Test small book page (Obadiah - 1 chapter)."""
|
|
response = client.get("/book/Obadiah")
|
|
assert response.status_code == 200
|
|
|
|
def test_last_verse_of_bible(self, client):
|
|
"""Test last verse of Bible."""
|
|
response = client.get("/book/Revelation/chapter/22/verse/21")
|
|
assert response.status_code == 200
|
|
|
|
|
|
class TestDataModuleExtended:
|
|
"""Extended tests for data module."""
|
|
|
|
def test_data_init_imports(self):
|
|
"""Test data module initialization."""
|
|
from kjvstudy_org import data
|
|
# Module should import successfully
|
|
assert data is not None
|
|
|
|
|
|
class TestHelpersExtended:
|
|
"""Extended tests for helpers module."""
|
|
|
|
def test_create_slug_special_chars(self):
|
|
"""Test slug creation with special characters."""
|
|
from kjvstudy_org.utils.helpers import create_slug
|
|
result = create_slug("Test & Example!")
|
|
assert "&" not in result
|
|
assert "!" not in result
|
|
|
|
def test_create_slug_numbers(self):
|
|
"""Test slug creation with numbers."""
|
|
from kjvstudy_org.utils.helpers import create_slug
|
|
result = create_slug("1 Samuel")
|
|
assert "1" in result
|
|
assert "samuel" in result.lower()
|
|
|
|
|
|
class TestResourceDataModule:
|
|
"""Tests for resource_data module."""
|
|
|
|
def test_import_resource_data(self):
|
|
"""Test resource_data module imports."""
|
|
try:
|
|
from kjvstudy_org import resource_data
|
|
assert resource_data is not None
|
|
except ImportError:
|
|
pass # Module may not be used
|
|
|
|
|
|
class TestMainModule:
|
|
"""Tests for main module - entry point."""
|
|
|
|
def test_main_module_import(self):
|
|
"""Test main module imports correctly."""
|
|
from kjvstudy_org import main
|
|
assert hasattr(main, 'main')
|
|
assert hasattr(main, 'app')
|