1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
import re
from string import printable
import pycountry
import pytest
from pydantic import BaseModel, ValidationError
from pydantic_extra_types import language_code
from pydantic_extra_types.language_code import (
LanguageAlpha2,
LanguageInfo,
LanguageName,
_index_by_alpha2,
_index_by_alpha3,
_index_by_name,
)
PARAMS_AMOUNT = 20
@pytest.fixture(scope='module', name='MovieAlpha2')
def movie_alpha2_fixture():
class Movie(BaseModel):
audio_lang: LanguageAlpha2
return Movie
@pytest.fixture(scope='module', name='MovieName')
def movie_name_fixture():
class Movie(BaseModel):
audio_lang: LanguageName
return Movie
class ISO3CheckingModel(BaseModel):
lang: language_code.ISO639_3
class ISO5CheckingModel(BaseModel):
lang: language_code.ISO639_5
@pytest.mark.parametrize('alpha2, language_data', list(_index_by_alpha2().items()))
def test_valid_alpha2(alpha2: str, language_data: LanguageInfo, MovieAlpha2):
the_godfather = MovieAlpha2(audio_lang=alpha2)
assert the_godfather.audio_lang == language_data.alpha2
assert the_godfather.audio_lang.alpha3 == language_data.alpha3
assert the_godfather.audio_lang.name == language_data.name
@pytest.mark.parametrize('alpha2', list(printable) + list(_index_by_alpha3().keys())[:PARAMS_AMOUNT])
def test_invalid_alpha2(alpha2: str, MovieAlpha2):
with pytest.raises(ValidationError, match='Invalid language alpha2 code'):
MovieAlpha2(audio_lang=alpha2)
@pytest.mark.parametrize('name, language_data', list(_index_by_name().items())[:PARAMS_AMOUNT])
def test_valid_name(name: str, language_data: LanguageInfo, MovieName):
the_godfather = MovieName(audio_lang=name)
assert the_godfather.audio_lang == language_data.name
assert the_godfather.audio_lang.alpha2 == language_data.alpha2
assert the_godfather.audio_lang.alpha3 == language_data.alpha3
@pytest.mark.parametrize('name', set(printable) - {'E', 'U'}) # E and U are valid language codes
def test_invalid_name(name: str, MovieName):
with pytest.raises(ValidationError, match='Invalid language name'):
MovieName(audio_lang=name)
@pytest.mark.parametrize('lang', map(lambda lang: lang.alpha_3, pycountry.languages))
def test_iso_ISO639_3_code_ok(lang: str):
model = ISO3CheckingModel(lang=lang)
assert model.lang == lang
assert model.model_dump() == {'lang': lang} # test serialization
@pytest.mark.parametrize('lang', map(lambda lang: lang.alpha_3, pycountry.language_families))
def test_iso_639_5_code_ok(lang: str):
model = ISO5CheckingModel(lang=lang)
assert model.lang == lang
assert model.model_dump() == {'lang': lang} # test serialization
def test_iso3_language_fail():
with pytest.raises(
ValidationError,
match=re.escape(
'1 validation error for ISO3CheckingModel\nlang\n '
'Invalid ISO 639-3 language code. '
"See https://en.wikipedia.org/wiki/ISO_639-3 [type=ISO649_3, input_value='LOL', input_type=str]"
),
):
ISO3CheckingModel(lang='LOL')
def test_iso5_language_fail():
with pytest.raises(
ValidationError,
match=re.escape(
'1 validation error for ISO5CheckingModel\nlang\n '
'Invalid ISO 639-5 language code. '
"See https://en.wikipedia.org/wiki/ISO_639-5 [type=ISO649_5, input_value='LOL', input_type=str]"
),
):
ISO5CheckingModel(lang='LOL')
|