OPEN SOURCE
software/tests/test_input_validation.py
このサイトで読み、必要なファイルを保存できます。
日常訳はAIを用いて作成された翻訳です。人間の聖書学・原語の専門家による全訳の検証は確認されていません。既存の翻訳や原語資料と照らし合わせてお読みください。
1"""Tests for input validation utilities."""23import pytest45from src.exceptions import InvalidReferenceError, VerseNotFoundError6from src.utils.validation import (7ALL_BOOKS,8BOOK_ALIASES,9NT_BOOKS,10OT_BOOKS,11is_valid_book,12normalize_book_name,13parse_reference_string,14sanitize_book_name_for_path,15validate_chapter,16validate_reference,17validate_verse,18)192021class TestNormalizeBookName:22"""Tests for normalize_book_name."""2324def test_canonical_name_lowercase(self):25"""Test canonical name passes through lowercase."""26assert normalize_book_name("john") == "john"27assert normalize_book_name("genesis") == "genesis"2829def test_canonical_name_mixed_case(self):30"""Test canonical name normalizes case."""31assert normalize_book_name("John") == "john"32assert normalize_book_name("GENESIS") == "genesis"33assert normalize_book_name("Matthew") == "matthew"3435def test_alias_resolution(self):36"""Test alias names are resolved."""37assert normalize_book_name("jn") == "john"38assert normalize_book_name("gen") == "genesis"39assert normalize_book_name("matt") == "matthew"40assert normalize_book_name("rev") == "revelation"4142def test_numbered_books(self):43"""Test numbered books."""44assert normalize_book_name("1john") == "1john"45assert normalize_book_name("1jn") == "1john"46assert normalize_book_name("2corinthians") == "2corinthians"47assert normalize_book_name("2cor") == "2corinthians"4849def test_removes_separators(self):50"""Test separators are removed."""51assert normalize_book_name("song of solomon") == "songofsolomon"52assert normalize_book_name("song-of-solomon") == "songofsolomon"53assert normalize_book_name("song_of_solomon") == "songofsolomon"5455def test_unknown_book_raises(self):56"""Test unknown book raises InvalidReferenceError."""57with pytest.raises(InvalidReferenceError) as exc_info:58normalize_book_name("notabook")59assert "Unknown book name" in str(exc_info.value)6061def test_whitespace_handling(self):62"""Test whitespace is handled."""63assert normalize_book_name(" john ") == "john"64assert normalize_book_name("1 john") == "1john"656667class TestValidateChapter:68"""Tests for validate_chapter."""6970def test_valid_chapters(self):71"""Test valid chapter numbers pass."""72validate_chapter("john", 1)73validate_chapter("john", 21)74validate_chapter("genesis", 50)7576def test_zero_chapter_raises(self):77"""Test chapter 0 raises error."""78with pytest.raises(InvalidReferenceError) as exc_info:79validate_chapter("john", 0)80assert "must be positive" in str(exc_info.value)8182def test_negative_chapter_raises(self):83"""Test negative chapter raises error."""84with pytest.raises(InvalidReferenceError):85validate_chapter("john", -1)8687def test_chapter_exceeds_max_raises(self):88"""Test chapter exceeding max raises error."""89with pytest.raises(InvalidReferenceError) as exc_info:90validate_chapter("john", 100)91assert "only has" in str(exc_info.value)929394class TestValidateVerse:95"""Tests for validate_verse."""9697def test_valid_verses(self):98"""Test valid verse numbers pass."""99validate_verse("john", 1, 1)100validate_verse("john", 1, 51)101validate_verse("psalms", 119, 176)102103def test_zero_verse_raises(self):104"""Test verse 0 raises error."""105with pytest.raises(InvalidReferenceError) as exc_info:106validate_verse("john", 1, 0)107assert "must be positive" in str(exc_info.value)108109def test_negative_verse_raises(self):110"""Test negative verse raises error."""111with pytest.raises(InvalidReferenceError):112validate_verse("john", 1, -1)113114def test_implausibly_high_verse_raises(self):115"""Test implausibly high verse raises error."""116with pytest.raises(InvalidReferenceError) as exc_info:117validate_verse("john", 1, 500)118assert "implausibly high" in str(exc_info.value)119120121class TestValidateReference:122"""Tests for validate_reference."""123124def test_valid_reference(self):125"""Test valid reference returns canonical book name."""126result = validate_reference("jn", 1, 1)127assert result == "john"128129def test_normalizes_book(self):130"""Test book name is normalized."""131result = validate_reference("Matt", 1, 1)132assert result == "matthew"133134def test_invalid_book_raises(self):135"""Test invalid book raises error."""136with pytest.raises(InvalidReferenceError):137validate_reference("invalid", 1, 1)138139def test_invalid_chapter_raises(self):140"""Test invalid chapter raises error."""141with pytest.raises(InvalidReferenceError):142validate_reference("john", 0, 1)143144def test_invalid_verse_raises(self):145"""Test invalid verse raises error."""146with pytest.raises(InvalidReferenceError):147validate_reference("john", 1, 0)148149150class TestParseReferenceString:151"""Tests for parse_reference_string."""152153def test_standard_format(self):154"""Test standard 'Book chapter:verse' format."""155book, chapter, verse = parse_reference_string("John 3:16")156assert book == "john"157assert chapter == 3158assert verse == 16159160def test_lowercase_format(self):161"""Test lowercase format."""162book, chapter, verse = parse_reference_string("john 3:16")163assert book == "john"164assert chapter == 3165assert verse == 16166167def test_alias_format(self):168"""Test alias format."""169book, chapter, verse = parse_reference_string("jn 3:16")170assert book == "john"171assert chapter == 3172assert verse == 16173174def test_numbered_book_format(self):175"""Test numbered book format."""176book, chapter, verse = parse_reference_string("1 John 1:1")177assert book == "1john"178assert chapter == 1179assert verse == 1180181def test_colon_separated_format(self):182"""Test 'book:chapter:verse' format."""183book, chapter, verse = parse_reference_string("john:3:16")184assert book == "john"185assert chapter == 3186assert verse == 16187188def test_invalid_format_raises(self):189"""Test invalid format raises error."""190with pytest.raises(InvalidReferenceError) as exc_info:191parse_reference_string("invalid")192assert "Expected format" in str(exc_info.value)193194def test_whitespace_handling(self):195"""Test whitespace is handled."""196book, chapter, verse = parse_reference_string(" John 3:16 ")197assert book == "john"198199200class TestSanitizeBookNameForPath:201"""Tests for sanitize_book_name_for_path."""202203def test_valid_book_passes(self):204"""Test valid book name passes."""205result = sanitize_book_name_for_path("john")206assert result == "john"207208def test_alias_is_normalized(self):209"""Test alias is normalized."""210result = sanitize_book_name_for_path("jn")211assert result == "john"212213def test_invalid_book_raises(self):214"""Test invalid book raises error."""215with pytest.raises(InvalidReferenceError):216sanitize_book_name_for_path("notabook")217218219class TestIsValidBook:220"""Tests for is_valid_book."""221222def test_valid_books_return_true(self):223"""Test valid books return True."""224assert is_valid_book("john") is True225assert is_valid_book("jn") is True226assert is_valid_book("Matthew") is True227assert is_valid_book("1john") is True228229def test_invalid_books_return_false(self):230"""Test invalid books return False."""231assert is_valid_book("notabook") is False232assert is_valid_book("xyz") is False233assert is_valid_book("") is False234235236class TestBookLists:237"""Tests for book list constants."""238239def test_nt_books_count(self):240"""Test NT has 27 books."""241assert len(NT_BOOKS) == 27242243def test_ot_books_count(self):244"""Test OT has 39 books."""245assert len(OT_BOOKS) == 39246247def test_all_books_combined(self):248"""Test ALL_BOOKS is OT + NT."""249assert len(ALL_BOOKS) == 66250assert ALL_BOOKS == OT_BOOKS + NT_BOOKS251252def test_no_duplicates(self):253"""Test no duplicate book names."""254assert len(set(ALL_BOOKS)) == len(ALL_BOOKS)255256def test_john_in_nt(self):257"""Test John is in NT books."""258assert "john" in NT_BOOKS259260def test_genesis_in_ot(self):261"""Test Genesis is in OT books."""262assert "genesis" in OT_BOOKS263264265class TestBookAliases:266"""Tests for book aliases."""267268def test_common_aliases_exist(self):269"""Test common aliases exist."""270assert "jn" in BOOK_ALIASES271assert "gen" in BOOK_ALIASES272assert "matt" in BOOK_ALIASES273assert "rev" in BOOK_ALIASES274275def test_aliases_map_to_valid_books(self):276"""Test all aliases map to valid books."""277for alias, book in BOOK_ALIASES.items():278assert book in ALL_BOOKS, f"Alias '{alias}' maps to invalid book '{book}'"279