diff --git a/tests/test_keygen.py b/tests/test_keygen.py new file mode 100644 index 0000000..e2ec4ec --- /dev/null +++ b/tests/test_keygen.py @@ -0,0 +1,127 @@ +"""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 == []