公開前の確認用サイト
日常訳NICHIJOYAKUEnglish ↗

OPEN SOURCE

software/tests/test_input_validation.py

このサイトで読み、必要なファイルを保存できます。

日常訳はAIを用いて作成された翻訳です。人間の聖書学・原語の専門家による全訳の検証は確認されていません。既存の翻訳や原語資料と照らし合わせてお読みください。

← オープンソースの案内へ

software/tests/test_input_validation.py279 行このファイルを保存 ↓

ZIPに含まれるものと同じ公開ソースです。行番号から、その行へのリンクを保存できます。

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