diff options
| author | Grant Lanham <contact@grantlanham.com> | 2024-09-23 23:37:30 -0400 |
|---|---|---|
| committer | Markus Heiser <markus.heiser@darmarIT.de> | 2024-10-03 13:20:32 +0200 |
| commit | 44a06190bbb1b412f0ed16a76b0a4aeef80975b7 (patch) | |
| tree | dd6e94d656fe4b11918e6cb5bd6183535dcc7254 /tests/unit/test_locales.py | |
| parent | 042c7190e6fe092a8a85997713a2511fffb09625 (diff) | |
[refactor] unit tests to utilize paramaterized and break down monolithic tests
- for tests which perform the same arrange/act/assert pattern but with different
data, the data portion has been moved to the ``paramaterized.expand`` fields
- for monolithic tests which performed multiple arrange/act/asserts,
they have been broken up into different unit tests.
- when possible, change generic assert statements to more concise
asserts (i.e. ``assertIsNone``)
This work ultimately is focused on creating smaller and more concise tests.
While paramaterized may make adding new configurations for existing tests
easier, that is just a beneficial side effect. The main benefit is that smaller
tests are easier to reason about, meaning they are easier to debug when they
start failing. This improves the developer experience in debugging what went
wrong when refactoring the project.
Total number of tests went from 192 -> 259; or, broke apart larger tests into 69
more concise ones.
Diffstat (limited to 'tests/unit/test_locales.py')
| -rw-r--r-- | tests/unit/test_locales.py | 174 |
1 files changed, 91 insertions, 83 deletions
diff --git a/tests/unit/test_locales.py b/tests/unit/test_locales.py index 6407a5761..37cc187da 100644 --- a/tests/unit/test_locales.py +++ b/tests/unit/test_locales.py @@ -2,6 +2,8 @@ # 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 @@ -13,98 +15,104 @@ class TestLocales(SearxTestCase): - :py:obj:`searx.locales.match_locale` """ - def test_match_locale(self): - - locale_tag_list = [x[0] for x in sxng_locales] - + @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('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') - + 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): # 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') - + 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) - 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') - + 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') - # 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 following 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') + @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) |