diff --git a/tests/test_detectors.py b/tests/test_detectors.py new file mode 100644 index 0000000..9ce0a95 --- /dev/null +++ b/tests/test_detectors.py @@ -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