forked from Ponysearch/Ponysearch
8b6a3f3e11
Improve region and language detection / all locale Testing has shown the following behaviour for the different default and empty values of Mojeeks parameters: | param | idx | value | behaviour | | -------- | --- | ------ | ------------------------- | | region | 0 | '' | detect region based on IP | | region | 1 | 'none' | all regions | | language | 0 | '' | all languages |
116 lines
4.5 KiB
Python
116 lines
4.5 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
# pylint: disable=missing-module-docstring
|
|
"""Test some code from module :py:obj:`searx.locales`"""
|
|
|
|
from __future__ import annotations
|
|
from parameterized import parameterized
|
|
from searx import locales
|
|
from searx.sxng_locales import sxng_locales
|
|
from tests import SearxTestCase
|
|
|
|
|
|
class TestLocales(SearxTestCase):
|
|
"""Implemented tests:
|
|
|
|
- :py:obj:`searx.locales.match_locale`
|
|
"""
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.locale_tag_list = [x[0] for x in sxng_locales]
|
|
|
|
@parameterized.expand(
|
|
[
|
|
'de',
|
|
'fr',
|
|
'zh',
|
|
]
|
|
)
|
|
def test_locale_languages(self, locale: str):
|
|
# Test SearXNG search languages
|
|
self.assertEqual(locales.match_locale(locale, self.locale_tag_list), locale)
|
|
|
|
@parameterized.expand(
|
|
[
|
|
('de-at', 'de-AT'),
|
|
('de-de', 'de-DE'),
|
|
('en-UK', 'en-GB'),
|
|
('fr-be', 'fr-BE'),
|
|
('fr-ca', 'fr-CA'),
|
|
('fr-ch', 'fr-CH'),
|
|
('zh-cn', 'zh-CN'),
|
|
('zh-tw', 'zh-TW'),
|
|
('zh-hk', 'zh-HK'),
|
|
]
|
|
)
|
|
def test_match_region(self, locale: str, expected_locale: str):
|
|
# Test SearXNG search regions
|
|
self.assertEqual(locales.match_locale(locale, self.locale_tag_list), expected_locale)
|
|
|
|
@parameterized.expand(
|
|
[
|
|
('zh-hans', 'zh-CN'),
|
|
('zh-hans-cn', 'zh-CN'),
|
|
('zh-hant', 'zh-TW'),
|
|
('zh-hant-tw', 'zh-TW'),
|
|
]
|
|
)
|
|
def test_match_lang_script_code(self, locale: str, expected_locale: str):
|
|
# Test language script code
|
|
self.assertEqual(locales.match_locale(locale, self.locale_tag_list), expected_locale)
|
|
|
|
def test_locale_de(self):
|
|
self.assertEqual(locales.match_locale('de', ['de-CH', 'de-DE']), 'de-DE')
|
|
self.assertEqual(locales.match_locale('de', ['de-CH', 'de-DE']), 'de-DE')
|
|
|
|
def test_locale_es(self):
|
|
self.assertEqual(locales.match_locale('es', [], fallback='fallback'), 'fallback')
|
|
self.assertEqual(locales.match_locale('es', ['ES']), 'ES')
|
|
self.assertEqual(locales.match_locale('es', ['es-AR', 'es-ES', 'es-MX']), 'es-ES')
|
|
self.assertEqual(locales.match_locale('es-AR', ['es-AR', 'es-ES', 'es-MX']), 'es-AR')
|
|
self.assertEqual(locales.match_locale('es-CO', ['es-AR', 'es-ES']), 'es-ES')
|
|
self.assertEqual(locales.match_locale('es-CO', ['es-AR']), 'es-AR')
|
|
|
|
@parameterized.expand(
|
|
[
|
|
('zh-TW', ['zh-HK'], 'zh-HK'), # A user selects region 'zh-TW' which should end in zh_HK.
|
|
# hint: CN is 'Hans' and HK ('Hant') fits better to TW ('Hant')
|
|
('zh', ['zh-CN'], 'zh-CN'), # A user selects only the language 'zh' which should end in CN
|
|
('fr', ['fr-CA'], 'fr-CA'), # A user selects only the language 'fr' which should end in fr_CA
|
|
('nl', ['nl-BE'], 'nl-BE'), # A user selects only the language 'fr' which should end in fr_CA
|
|
# Territory tests
|
|
('en', ['en-GB'], 'en-GB'), # A user selects only a language
|
|
(
|
|
'fr',
|
|
['fr-FR', 'fr-CA'],
|
|
'fr-FR',
|
|
), # the engine supports fr_FR and fr_CA since no territory is given, fr_FR takes priority
|
|
]
|
|
)
|
|
def test_locale_optimized_selected(self, locale: str, locale_list: list[str], expected_locale: str):
|
|
"""
|
|
Tests from the commit message of 9ae409a05a
|
|
|
|
Assumption:
|
|
A. When a user selects a language the results should be optimized according to
|
|
the selected language.
|
|
"""
|
|
self.assertEqual(locales.match_locale(locale, locale_list), expected_locale)
|
|
|
|
@parameterized.expand(
|
|
[
|
|
('fr-BE', ['fr-FR', 'fr-CA', 'nl-BE'], 'nl-BE'), # A user selects region 'fr-BE' which should end in nl-BE
|
|
('fr', ['fr-BE', 'fr-CH'], 'fr-BE'), # A user selects fr with 2 locales,
|
|
# the get_engine_locale selects the locale by looking at the "population
|
|
# percent" and this percentage has an higher amount in BE (68.%)
|
|
# compared to CH (21%)
|
|
]
|
|
)
|
|
def test_locale_optimized_territory(self, locale: str, locale_list: list[str], expected_locale: str):
|
|
"""
|
|
Tests from the commit message of 9ae409a05a
|
|
|
|
B. When user selects a language and a territory the results should be
|
|
optimized with first priority on territory and second on language.
|
|
"""
|
|
self.assertEqual(locales.match_locale(locale, locale_list), expected_locale)
|