forked from zaclys/searxng
16f0db4493
This patch replaces the *full of magic* ``utils.match_language`` function by a ``locales.match_locale``. The ``locales.match_locale`` function is based on the ``locales.build_engine_locales`` introduced in9ae409a0
[1]. In the past SearXNG did only support a search by a language but not in a region. This has been changed a long time ago and regions have been added to SearXNG core but not to the engines. The ``utils.match_language`` was the function to handle the different aspects of language/regions in SearXNG core and the supported *languages* in the engine. The ``utils.match_language`` did it with some magic and works good for most use cases but fails in some edge case. To replace the concurrence of languages and regions in the SearXNG core the ``locales.build_engine_locales`` was introduced in9ae409a0
[1]. With the last patches all engines has been migrated to a ``fetch_traits`` and a language/region concept that is based on ``locales.build_engine_locales``. To summarize: there is no longer a need for the ``locales.match_language``. [1] https://github.com/searxng/searxng/pull/1652 Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
112 lines
4.9 KiB
Python
112 lines
4.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
# lint: pylint
|
|
"""Test some code from module :py:obj:`searx.locales`"""
|
|
|
|
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`
|
|
"""
|
|
|
|
def test_match_locale(self):
|
|
|
|
locale_tag_list = [x[0] for x in sxng_locales]
|
|
|
|
# Test SearXNG search languages
|
|
|
|
self.assertEqual(locales.match_locale('de', locale_tag_list), 'de')
|
|
self.assertEqual(locales.match_locale('fr', locale_tag_list), 'fr')
|
|
self.assertEqual(locales.match_locale('zh', locale_tag_list), 'zh')
|
|
|
|
# Test SearXNG search regions
|
|
|
|
self.assertEqual(locales.match_locale('ca-es', locale_tag_list), 'ca-ES')
|
|
self.assertEqual(locales.match_locale('de-at', locale_tag_list), 'de-AT')
|
|
self.assertEqual(locales.match_locale('de-de', locale_tag_list), 'de-DE')
|
|
self.assertEqual(locales.match_locale('en-UK', locale_tag_list), 'en-GB')
|
|
self.assertEqual(locales.match_locale('fr-be', locale_tag_list), 'fr-BE')
|
|
self.assertEqual(locales.match_locale('fr-be', locale_tag_list), 'fr-BE')
|
|
self.assertEqual(locales.match_locale('fr-ca', locale_tag_list), 'fr-CA')
|
|
self.assertEqual(locales.match_locale('fr-ch', locale_tag_list), 'fr-CH')
|
|
self.assertEqual(locales.match_locale('zh-cn', locale_tag_list), 'zh-CN')
|
|
self.assertEqual(locales.match_locale('zh-tw', locale_tag_list), 'zh-TW')
|
|
self.assertEqual(locales.match_locale('zh-hk', locale_tag_list), 'zh-HK')
|
|
|
|
# Test language script code
|
|
|
|
self.assertEqual(locales.match_locale('zh-hans', locale_tag_list), 'zh-CN')
|
|
self.assertEqual(locales.match_locale('zh-hans-cn', locale_tag_list), 'zh-CN')
|
|
self.assertEqual(locales.match_locale('zh-hant', locale_tag_list), 'zh-TW')
|
|
self.assertEqual(locales.match_locale('zh-hant-tw', locale_tag_list), 'zh-TW')
|
|
|
|
# Test individual locale lists
|
|
|
|
self.assertEqual(locales.match_locale('es', [], fallback='fallback'), 'fallback')
|
|
|
|
self.assertEqual(locales.match_locale('de', ['de-CH', 'de-DE']), 'de-DE')
|
|
self.assertEqual(locales.match_locale('de', ['de-CH', 'de-DE']), 'de-DE')
|
|
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')
|
|
|
|
# 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.
|
|
#
|
|
# B. When user selects a language and a territory the results should be
|
|
# optimized with first priority on territory and second on language.
|
|
|
|
# Assume we have an engine that supports the follwoing locales:
|
|
locale_tag_list = ['zh-CN', 'zh-HK', 'nl-BE', 'fr-CA']
|
|
|
|
# Examples (Assumption A.)
|
|
# ------------------------
|
|
|
|
# A user selects region 'zh-TW' which should end in zh_HK.
|
|
# hint: CN is 'Hans' and HK ('Hant') fits better to TW ('Hant')
|
|
self.assertEqual(locales.match_locale('zh-TW', locale_tag_list), 'zh-HK')
|
|
|
|
# A user selects only the language 'zh' which should end in CN
|
|
self.assertEqual(locales.match_locale('zh', locale_tag_list), 'zh-CN')
|
|
|
|
# A user selects only the language 'fr' which should end in fr_CA
|
|
self.assertEqual(locales.match_locale('fr', locale_tag_list), 'fr-CA')
|
|
|
|
# The difference in priority on the territory is best shown with a
|
|
# engine that supports the following locales:
|
|
locale_tag_list = ['fr-FR', 'fr-CA', 'en-GB', 'nl-BE']
|
|
|
|
# A user selects only a language
|
|
self.assertEqual(locales.match_locale('en', locale_tag_list), 'en-GB')
|
|
|
|
# hint: the engine supports fr_FR and fr_CA since no territory is given,
|
|
# fr_FR takes priority ..
|
|
self.assertEqual(locales.match_locale('fr', locale_tag_list), 'fr-FR')
|
|
|
|
# Examples (Assumption B.)
|
|
# ------------------------
|
|
|
|
# A user selects region 'fr-BE' which should end in nl-BE
|
|
self.assertEqual(locales.match_locale('fr-BE', locale_tag_list), 'nl-BE')
|
|
|
|
# If the user selects a language and there are two locales like the
|
|
# following:
|
|
|
|
locale_tag_list = ['fr-BE', 'fr-CH']
|
|
|
|
# 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%)
|
|
|
|
self.assertEqual(locales.match_locale('fr', locale_tag_list), 'fr-BE')
|