"""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 == []