Add tests - part 1
This commit is contained in:
139
tests/test_detectors.py
Normal file
139
tests/test_detectors.py
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
"""Tests for detectors."""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from i18n_guardian.detectors.base import get_default_registry
|
||||||
|
|
||||||
|
|
||||||
|
class TestReactIntlDetector:
|
||||||
|
"""Tests for React Intl detector."""
|
||||||
|
|
||||||
|
def test_detect_react_intl_in_package_json(self, temp_dir):
|
||||||
|
"""Test detection of react-intl in package.json."""
|
||||||
|
package_json = temp_dir / "package.json"
|
||||||
|
package_json.write_text('{"dependencies": {"react-intl": "^5.0.0"}}', encoding="utf-8")
|
||||||
|
|
||||||
|
registry = get_default_registry()
|
||||||
|
detector = registry.get("react-intl")
|
||||||
|
assert detector is not None
|
||||||
|
assert detector.detect(temp_dir) == "react-intl"
|
||||||
|
|
||||||
|
def test_detect_react_intl_in_imports(self, temp_dir):
|
||||||
|
"""Test detection of react-intl in source imports."""
|
||||||
|
js_file = temp_dir / "App.js"
|
||||||
|
js_file.write_text("import { defineMessages } from 'react-intl'", encoding="utf-8")
|
||||||
|
|
||||||
|
registry = get_default_registry()
|
||||||
|
detector = registry.get("react-intl")
|
||||||
|
assert detector is not None
|
||||||
|
assert detector.detect(temp_dir) == "react-intl"
|
||||||
|
|
||||||
|
def test_get_react_intl_functions(self, temp_dir):
|
||||||
|
"""Test getting react-intl function names."""
|
||||||
|
registry = get_default_registry()
|
||||||
|
detector = registry.get("react-intl")
|
||||||
|
assert detector is not None
|
||||||
|
functions = detector.get_i18n_functions()
|
||||||
|
assert "formatMessage" in functions
|
||||||
|
assert "defineMessages" in functions
|
||||||
|
|
||||||
|
|
||||||
|
class TestI18NextDetector:
|
||||||
|
"""Tests for i18next detector."""
|
||||||
|
|
||||||
|
def test_detect_i18next_in_package_json(self, temp_dir):
|
||||||
|
"""Test detection of i18next in package.json."""
|
||||||
|
package_json = temp_dir / "package.json"
|
||||||
|
package_json.write_text('{"dependencies": {"i18next": "^21.0.0"}}', encoding="utf-8")
|
||||||
|
|
||||||
|
registry = get_default_registry()
|
||||||
|
detector = registry.get("i18next")
|
||||||
|
assert detector is not None
|
||||||
|
assert detector.detect(temp_dir) == "i18next"
|
||||||
|
|
||||||
|
def test_detect_i18next_in_locales(self, temp_dir):
|
||||||
|
"""Test detection of i18next via locale files."""
|
||||||
|
locales_dir = temp_dir / "locales"
|
||||||
|
locales_dir.mkdir()
|
||||||
|
en_json = locales_dir / "en.json"
|
||||||
|
en_json.write_text('{"greeting": "Hello"}', encoding="utf-8")
|
||||||
|
|
||||||
|
registry = get_default_registry()
|
||||||
|
detector = registry.get("i18next")
|
||||||
|
assert detector is not None
|
||||||
|
result = detector.detect(temp_dir)
|
||||||
|
assert result == "i18next"
|
||||||
|
|
||||||
|
|
||||||
|
class TestVueI18nDetector:
|
||||||
|
"""Tests for Vue I18n detector."""
|
||||||
|
|
||||||
|
def test_detect_vue_i18n_in_package_json(self, temp_dir):
|
||||||
|
"""Test detection of vue-i18n in package.json."""
|
||||||
|
package_json = temp_dir / "package.json"
|
||||||
|
package_json.write_text('{"dependencies": {"vue-i18n": "^8.0.0"}}', encoding="utf-8")
|
||||||
|
|
||||||
|
registry = get_default_registry()
|
||||||
|
detector = registry.get("vue-i18n")
|
||||||
|
assert detector is not None
|
||||||
|
assert detector.detect(temp_dir) == "vue-i18n"
|
||||||
|
|
||||||
|
|
||||||
|
class TestGettextDetector:
|
||||||
|
"""Tests for Gettext detector."""
|
||||||
|
|
||||||
|
def test_detect_gettext_po_files(self, temp_dir):
|
||||||
|
"""Test detection of gettext via .po files."""
|
||||||
|
po_file = temp_dir / "messages.po"
|
||||||
|
po_file.write_text('msgid "Hello"\nmsgstr "Hallo"', encoding="utf-8")
|
||||||
|
|
||||||
|
registry = get_default_registry()
|
||||||
|
detector = registry.get("gettext")
|
||||||
|
assert detector is not None
|
||||||
|
assert detector.detect(temp_dir) == "gettext"
|
||||||
|
|
||||||
|
|
||||||
|
class TestPythonGettextDetector:
|
||||||
|
"""Tests for Python gettext detector."""
|
||||||
|
|
||||||
|
def test_detect_python_gettext_imports(self, temp_dir):
|
||||||
|
"""Test detection of Python gettext via imports."""
|
||||||
|
py_file = temp_dir / "app.py"
|
||||||
|
py_file.write_text("import gettext\n_ = gettext.gettext", encoding="utf-8")
|
||||||
|
|
||||||
|
registry = get_default_registry()
|
||||||
|
detector = registry.get("python-gettext")
|
||||||
|
assert detector is not None
|
||||||
|
assert detector.detect(temp_dir) == "python-gettext"
|
||||||
|
|
||||||
|
|
||||||
|
class TestDetectorRegistry:
|
||||||
|
"""Tests for detector registry."""
|
||||||
|
|
||||||
|
def test_list_detectors(self):
|
||||||
|
"""Test listing all detectors."""
|
||||||
|
registry = get_default_registry()
|
||||||
|
detectors = registry.list_detectors()
|
||||||
|
assert "react-intl" in detectors
|
||||||
|
assert "i18next" in detectors
|
||||||
|
assert "vue-i18n" in detectors
|
||||||
|
assert "gettext" in detectors
|
||||||
|
assert "python-gettext" in detectors
|
||||||
|
|
||||||
|
def test_detect_library_auto(self, temp_dir):
|
||||||
|
"""Test auto-detection of i18n library."""
|
||||||
|
package_json = temp_dir / "package.json"
|
||||||
|
package_json.write_text('{"dependencies": {"i18next": "^21.0.0"}}', encoding="utf-8")
|
||||||
|
|
||||||
|
registry = get_default_registry()
|
||||||
|
detected = registry.detect_library(temp_dir)
|
||||||
|
assert detected == "i18next"
|
||||||
|
|
||||||
|
def test_detect_no_library(self, temp_dir):
|
||||||
|
"""Test when no i18n library is found."""
|
||||||
|
py_file = temp_dir / "app.py"
|
||||||
|
py_file.write_text("print('Hello')", encoding="utf-8")
|
||||||
|
|
||||||
|
registry = get_default_registry()
|
||||||
|
detected = registry.detect_library(temp_dir)
|
||||||
|
assert detected is None
|
||||||
Reference in New Issue
Block a user