""" 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 "love" 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("") == 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 "
    " not in result or "
      " 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.

      Second paragraph." result = split_paragraphs(text) assert "

      " 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')