128 lines
4.4 KiB
Python
128 lines
4.4 KiB
Python
"""Tests for key generation."""
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
from i18n_guardian.keygen.key_generator import KeyGenerator, analyze_existing_keys
|
|
|
|
|
|
class TestKeyGenerator:
|
|
"""Tests for KeyGenerator."""
|
|
|
|
def test_snake_case_conversion(self):
|
|
"""Test snake_case key generation."""
|
|
generator = KeyGenerator(style="snake_case")
|
|
key = generator.generate_key("Hello World")
|
|
assert key == "hello_world"
|
|
|
|
def test_kebab_case_conversion(self):
|
|
"""Test kebab-case key generation."""
|
|
generator = KeyGenerator(style="kebab-case")
|
|
key = generator.generate_key("Hello World")
|
|
assert key == "hello-world"
|
|
|
|
def test_camel_case_conversion(self):
|
|
"""Test camelCase key generation."""
|
|
generator = KeyGenerator(style="camelCase")
|
|
key = generator.generate_key("Hello World")
|
|
assert key == "helloWorld"
|
|
|
|
def test_pascal_case_conversion(self):
|
|
"""Test PascalCase key generation."""
|
|
generator = KeyGenerator(style="PascalCase")
|
|
key = generator.generate_key("hello world")
|
|
assert key == "HelloWorld"
|
|
|
|
def test_prefix_support(self):
|
|
"""Test key prefix."""
|
|
generator = KeyGenerator(prefix="common")
|
|
key = generator.generate_key("Hello")
|
|
assert key.startswith("common_")
|
|
|
|
def test_max_length(self):
|
|
"""Test max length constraint."""
|
|
generator = KeyGenerator(max_length=10)
|
|
key = generator.generate_key("This is a very long text that should be truncated")
|
|
assert len(key) <= 10
|
|
|
|
def test_special_characters(self):
|
|
"""Test handling of special characters."""
|
|
generator = KeyGenerator(style="snake_case")
|
|
key = generator.generate_key("Hello! @#$ World")
|
|
assert "!" not in key
|
|
assert "@" not in key
|
|
assert "#" not in key
|
|
assert "$" not in key
|
|
|
|
def test_duplicate_key_handling(self):
|
|
"""Test that duplicate keys get unique suffixes."""
|
|
generator = KeyGenerator(style="snake_case")
|
|
generator.set_existing_keys(["hello_world"])
|
|
|
|
key1 = generator.generate_key("Hello World")
|
|
key2 = generator.generate_key("Hello World")
|
|
|
|
assert key1 != key2
|
|
assert "hello_world" in key1 or "hello_world" in key2
|
|
|
|
def test_path_prefix(self, temp_dir):
|
|
"""Test path-based prefix generation."""
|
|
generator = KeyGenerator(style="snake_case")
|
|
file_path = temp_dir / "components" / "Button.tsx"
|
|
key = generator.generate_key("Submit", file_path=file_path)
|
|
assert "button" in key.lower() or "submit" in key.lower()
|
|
|
|
def test_context_adding(self):
|
|
"""Test context-based key generation."""
|
|
generator = KeyGenerator(style="snake_case")
|
|
key = generator.generate_key("Submit", context="button")
|
|
assert "submit" in key.lower()
|
|
assert "button" in key.lower()
|
|
|
|
def test_numeric_exclusion(self):
|
|
"""Test that numeric-only strings are handled."""
|
|
generator = KeyGenerator(style="snake_case")
|
|
key = generator.generate_key("12345")
|
|
assert key.isdigit() or key == ""
|
|
|
|
def test_whitespace_handling(self):
|
|
"""Test handling of whitespace."""
|
|
generator = KeyGenerator(style="snake_case")
|
|
key = generator.generate_key(" Hello World ")
|
|
assert " " not in key
|
|
assert key == "hello_world"
|
|
|
|
|
|
class TestAnalyzeExistingKeys:
|
|
"""Tests for analyzing existing translation keys."""
|
|
|
|
def test_analyze_json_keys(self, temp_dir):
|
|
"""Test analyzing JSON translation files."""
|
|
locales_dir = temp_dir / "locales"
|
|
locales_dir.mkdir()
|
|
|
|
en_json = locales_dir / "en.json"
|
|
en_json.write_text('{"greeting": "Hello", "farewell": "Goodbye"}', encoding="utf-8")
|
|
|
|
keys = analyze_existing_keys(en_json)
|
|
assert "greeting" in keys
|
|
assert "farewell" in keys
|
|
|
|
def test_analyze_nested_json_keys(self, temp_dir):
|
|
"""Test analyzing nested JSON translation files."""
|
|
locales_dir = temp_dir / "locales"
|
|
locales_dir.mkdir()
|
|
|
|
en_json = locales_dir / "en.json"
|
|
en_json.write_text(
|
|
'{"buttons": {"submit": "Submit", "cancel": "Cancel"}}', encoding="utf-8"
|
|
)
|
|
|
|
keys = analyze_existing_keys(en_json)
|
|
assert any("buttons" in k for k in keys)
|
|
|
|
def test_missing_file(self):
|
|
"""Test handling of missing files."""
|
|
keys = analyze_existing_keys(Path("/nonexistent/file.json"))
|
|
assert keys == []
|