149
tests/test_extract.py
Normal file
149
tests/test_extract.py
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
"""Tests for key extraction module."""
|
||||||
|
import tempfile
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from i18n_key_sync.extract import ExtractKeys, extract_keys
|
||||||
|
|
||||||
|
|
||||||
|
class TestExtractKeys:
|
||||||
|
"""Tests for ExtractKeys class."""
|
||||||
|
|
||||||
|
def test_extract_simple_keys(self, sample_python_code):
|
||||||
|
"""Test extracting simple i18n keys from Python code."""
|
||||||
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
|
||||||
|
f.write(sample_python_code)
|
||||||
|
f.flush()
|
||||||
|
|
||||||
|
extractor = ExtractKeys(["_", "t"])
|
||||||
|
keys = extractor.extract_from_file(Path(f.name))
|
||||||
|
|
||||||
|
assert "hello" in keys
|
||||||
|
assert "goodbye" in keys
|
||||||
|
assert "welcome_message" in keys
|
||||||
|
assert "save" in keys
|
||||||
|
assert "cancel" in keys
|
||||||
|
|
||||||
|
Path(f.name).unlink()
|
||||||
|
|
||||||
|
def test_extract_js_keys(self, sample_js_code):
|
||||||
|
"""Test extracting keys from JavaScript code."""
|
||||||
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".js", delete=False) as f:
|
||||||
|
f.write(sample_js_code)
|
||||||
|
f.flush()
|
||||||
|
|
||||||
|
extractor = ExtractKeys(["_", "t", "i18n.t"])
|
||||||
|
keys = extractor.extract_from_file(Path(f.name))
|
||||||
|
|
||||||
|
assert "hello_world" in keys
|
||||||
|
assert "greeting" in keys
|
||||||
|
assert "welcome_message" in keys
|
||||||
|
assert "submit" in keys
|
||||||
|
|
||||||
|
Path(f.name).unlink()
|
||||||
|
|
||||||
|
def test_extract_multiple_patterns(self):
|
||||||
|
"""Test extracting keys using multiple patterns."""
|
||||||
|
code = '''
|
||||||
|
_("key1")
|
||||||
|
t("key2")
|
||||||
|
i18n.t("key3")
|
||||||
|
gettext("key4")
|
||||||
|
'''
|
||||||
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
|
||||||
|
f.write(code)
|
||||||
|
f.flush()
|
||||||
|
|
||||||
|
extractor = ExtractKeys(["_", "t", "i18n.t", "gettext"])
|
||||||
|
keys = extractor.extract_from_file(Path(f.name))
|
||||||
|
|
||||||
|
assert keys == {"key1", "key2", "key3", "key4"}
|
||||||
|
|
||||||
|
Path(f.name).unlink()
|
||||||
|
|
||||||
|
def test_extract_template_literals(self):
|
||||||
|
"""Test extracting keys from template literals."""
|
||||||
|
code = '''
|
||||||
|
const greeting = `Hello ${_("user_name")}, ${_("welcome_message")}`;
|
||||||
|
'''
|
||||||
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".js", delete=False) as f:
|
||||||
|
f.write(code)
|
||||||
|
f.flush()
|
||||||
|
|
||||||
|
extractor = ExtractKeys(["_"])
|
||||||
|
keys = extractor.extract_from_file(Path(f.name))
|
||||||
|
|
||||||
|
assert "user_name" in keys
|
||||||
|
assert "welcome_message" in keys
|
||||||
|
|
||||||
|
Path(f.name).unlink()
|
||||||
|
|
||||||
|
def test_extract_no_keys(self):
|
||||||
|
"""Test extracting from code with no i18n calls."""
|
||||||
|
code = '''
|
||||||
|
def hello(name):
|
||||||
|
return "Hello " + name
|
||||||
|
'''
|
||||||
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
|
||||||
|
f.write(code)
|
||||||
|
f.flush()
|
||||||
|
|
||||||
|
extractor = ExtractKeys(["_", "t"])
|
||||||
|
keys = extractor.extract_from_file(Path(f.name))
|
||||||
|
|
||||||
|
assert keys == set()
|
||||||
|
|
||||||
|
Path(f.name).unlink()
|
||||||
|
|
||||||
|
def test_extract_from_files(self):
|
||||||
|
"""Test extracting keys from multiple files."""
|
||||||
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f1:
|
||||||
|
f1.write('_("key1")\n_("key2")')
|
||||||
|
f1_path = Path(f1.name)
|
||||||
|
|
||||||
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".js", delete=False) as f2:
|
||||||
|
f2.write('t("key3")\nt("key4")')
|
||||||
|
f2_path = Path(f2.name)
|
||||||
|
|
||||||
|
try:
|
||||||
|
extractor = ExtractKeys(["_", "t"])
|
||||||
|
keys = extractor.extract_from_files([f1_path, f2_path])
|
||||||
|
|
||||||
|
assert keys == {"key1", "key2", "key3", "key4"}
|
||||||
|
finally:
|
||||||
|
f1_path.unlink()
|
||||||
|
f2_path.unlink()
|
||||||
|
|
||||||
|
|
||||||
|
class TestExtractKeysFunction:
|
||||||
|
"""Tests for the extract_keys function."""
|
||||||
|
|
||||||
|
def test_extract_keys_from_directory(self, temp_project_dir):
|
||||||
|
"""Test extracting keys from a directory."""
|
||||||
|
paths = (str(temp_project_dir / "src"),)
|
||||||
|
patterns = ["_", "t", "i18n.t"]
|
||||||
|
file_types = ["py", "js"]
|
||||||
|
|
||||||
|
keys = extract_keys(paths, patterns, file_types)
|
||||||
|
|
||||||
|
assert len(keys) > 0
|
||||||
|
assert "hello" in keys or "hello_world" in keys
|
||||||
|
|
||||||
|
def test_extract_keys_with_file_types_filter(self, temp_project_dir):
|
||||||
|
"""Test extracting keys with file type filtering."""
|
||||||
|
paths = (str(temp_project_dir / "src"),)
|
||||||
|
patterns = ["_", "t"]
|
||||||
|
file_types = ["py"]
|
||||||
|
|
||||||
|
keys = extract_keys(paths, patterns, file_types)
|
||||||
|
|
||||||
|
assert "goodbye" in keys
|
||||||
|
|
||||||
|
def test_extract_keys_nonexistent_path(self):
|
||||||
|
"""Test extracting from nonexistent path returns empty set."""
|
||||||
|
paths = ("/nonexistent/path",)
|
||||||
|
patterns = ["_", "t"]
|
||||||
|
file_types = ["py"]
|
||||||
|
|
||||||
|
keys = extract_keys(paths, patterns, file_types)
|
||||||
|
|
||||||
|
assert keys == set()
|
||||||
Reference in New Issue
Block a user