# #region Test.DictionaryValidation [C:2] [TYPE Module] [SEMANTICS test, translate, validation, bcp47] # @BRIEF Tests for dictionary_validation.py — _validate_bcp47. # @RELATION BINDS_TO -> [_validate_bcp47] # @TEST_CONTRACT: _validate_bcp47 -> None | raises ValueError on invalid tag # @TEST_EDGE: empty_tag -> ValueError # @TEST_EDGE: invalid_format -> ValueError # @TEST_EDGE: valid_format -> None import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / "src")) import os os.environ.setdefault("SECRET_KEY", "test-secret-key-for-testing") os.environ.setdefault("DATABASE_URL", "sqlite:///:memory:") os.environ.setdefault("AUTH_DATABASE_URL", "sqlite:///:memory:") import pytest from src.plugins.translate.dictionary_validation import _validate_bcp47 class TestValidateBcp47: """_validate_bcp47 — BCP-47 language tag validation.""" def test_valid_basic_tag(self): """Simple language code like 'en' passes.""" _validate_bcp47("en", "language") # no error def test_valid_region_tag(self): """Tag with region like 'zh-CN' passes.""" _validate_bcp47("zh-CN", "language") def test_valid_script_tag(self): """Tag with script like 'zh-Hans' passes.""" _validate_bcp47("zh-Hans", "language") def test_valid_multi_subtag(self): """Complex tag like 'sr-Latn-RS' passes.""" _validate_bcp47("sr-Latn-RS", "language") def test_empty_string_raises(self): """Empty tag raises ValueError.""" with pytest.raises(ValueError, match="must be a non-empty"): _validate_bcp47("", "language") def test_whitespace_only_raises(self): """Whitespace-only tag raises ValueError.""" with pytest.raises(ValueError, match="must be a non-empty"): _validate_bcp47(" ", "language") def test_none_raises(self): """None tag raises ValueError.""" with pytest.raises(ValueError, match="must be a non-empty"): _validate_bcp47(None, "language") # type: ignore[arg-type] def test_invalid_format_raises(self): """Tag with invalid characters raises ValueError.""" with pytest.raises(ValueError, match="not a valid BCP-47"): _validate_bcp47("en@utf8", "language") def test_invalid_numeric_start_raises(self): """Tag starting with a number raises ValueError.""" with pytest.raises(ValueError, match="not a valid BCP-47"): _validate_bcp47("123", "language") def test_error_message_includes_field_name(self): """Error message includes the field_name parameter.""" with pytest.raises(ValueError, match="source_language"): _validate_bcp47("", "source_language") def test_strips_whitespace(self): """Whitespace around tag is stripped.""" _validate_bcp47(" en ", "language") # no error after strip # #endregion Test.DictionaryValidation