| 
									
										
										
										
											2023-02-07 14:11:58 +01:00
										 |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							| 
									
										
										
										
											2024-03-11 14:06:26 +01:00
										 |  |  | # pylint: disable=missing-module-docstring | 
					
						
							| 
									
										
										
										
											2023-02-07 14:11:58 +01:00
										 |  |  | """Test some code from module :py:obj:`searx.locales`""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 05:37:30 +02:00
										 |  |  | from __future__ import annotations | 
					
						
							|  |  |  | from parameterized import parameterized | 
					
						
							| 
									
										
										
										
											2023-02-07 14:11:58 +01:00
										 |  |  | 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` | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 05:37:30 +02:00
										 |  |  |     @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): | 
					
						
							| 
									
										
										
										
											2023-02-07 14:11:58 +01:00
										 |  |  |         # Test SearXNG search languages | 
					
						
							| 
									
										
										
										
											2024-09-24 05:37:30 +02:00
										 |  |  |         self.assertEqual(locales.match_locale(locale, self.locale_tag_list), locale) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @parameterized.expand( | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             ('ca-es', 'ca-ES'), | 
					
						
							|  |  |  |             ('de-at', 'de-AT'), | 
					
						
							|  |  |  |             ('de-de', 'de-DE'), | 
					
						
							|  |  |  |             ('en-UK', 'en-GB'), | 
					
						
							|  |  |  |             ('fr-be', 'fr-BE'), | 
					
						
							|  |  |  |             ('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): | 
					
						
							| 
									
										
										
										
											2023-02-07 14:11:58 +01:00
										 |  |  |         # Test SearXNG search regions | 
					
						
							| 
									
										
										
										
											2024-09-24 05:37:30 +02:00
										 |  |  |         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): | 
					
						
							| 
									
										
										
										
											2023-02-07 14:11:58 +01:00
										 |  |  |         # Test language script code | 
					
						
							| 
									
										
										
										
											2024-09-24 05:37:30 +02:00
										 |  |  |         self.assertEqual(locales.match_locale(locale, self.locale_tag_list), expected_locale) | 
					
						
							| 
									
										
										
										
											2023-02-07 14:11:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 05:37:30 +02:00
										 |  |  |     def test_locale_de(self): | 
					
						
							| 
									
										
										
										
											2023-02-07 14:11:58 +01:00
										 |  |  |         self.assertEqual(locales.match_locale('de', ['de-CH', 'de-DE']), 'de-DE') | 
					
						
							|  |  |  |         self.assertEqual(locales.match_locale('de', ['de-CH', 'de-DE']), 'de-DE') | 
					
						
							| 
									
										
										
										
											2024-09-24 05:37:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_locale_es(self): | 
					
						
							|  |  |  |         self.assertEqual(locales.match_locale('es', [], fallback='fallback'), 'fallback') | 
					
						
							| 
									
										
										
										
											2023-02-07 14:11:58 +01:00
										 |  |  |         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') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 05:37:30 +02:00
										 |  |  |     @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) |