test_plugins.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # pylint: disable=missing-module-docstring,disable=missing-class-docstring,invalid-name
  3. import babel
  4. from mock import Mock
  5. import searx
  6. import searx.plugins
  7. import searx.preferences
  8. import searx.results
  9. from searx.result_types import Result
  10. from searx.extended_types import sxng_request
  11. from tests import SearxTestCase
  12. plg_store = searx.plugins.PluginStorage()
  13. plg_store.load_settings(searx.get_setting("plugins"))
  14. def get_search_mock(query, **kwargs):
  15. lang = kwargs.get("lang", "en-US")
  16. kwargs["pageno"] = kwargs.get("pageno", 1)
  17. kwargs["locale"] = babel.Locale.parse(lang, sep="-")
  18. user_plugins = kwargs.pop("user_plugins", [x.id for x in plg_store])
  19. return Mock(
  20. search_query=Mock(query=query, **kwargs),
  21. user_plugins=user_plugins,
  22. result_container=searx.results.ResultContainer(),
  23. )
  24. def do_pre_search(query, storage, **kwargs) -> bool:
  25. search = get_search_mock(query, **kwargs)
  26. ret = storage.pre_search(sxng_request, search)
  27. return ret
  28. def do_post_search(query, storage, **kwargs) -> Mock:
  29. search = get_search_mock(query, **kwargs)
  30. storage.post_search(sxng_request, search)
  31. return search
  32. class PluginMock(searx.plugins.Plugin):
  33. def __init__(self, _id: str, name: str, active: bool):
  34. plg_cfg = searx.plugins.PluginCfg(active=active)
  35. self.id = _id
  36. self._name = name
  37. super().__init__(plg_cfg)
  38. # pylint: disable= unused-argument
  39. def pre_search(self, request, search) -> bool:
  40. return True
  41. def post_search(self, request, search) -> None:
  42. return None
  43. def on_result(self, request, search, result) -> bool:
  44. return False
  45. def info(self):
  46. return searx.plugins.PluginInfo(
  47. id=self.id,
  48. name=self._name,
  49. description=f"Dummy plugin: {self.id}",
  50. preference_section="general",
  51. )
  52. class PluginStorage(SearxTestCase):
  53. def setUp(self):
  54. super().setUp()
  55. engines = {}
  56. self.storage = searx.plugins.PluginStorage()
  57. self.storage.register(PluginMock("plg001", "first plugin", True))
  58. self.storage.register(PluginMock("plg002", "second plugin", True))
  59. self.storage.init(self.app)
  60. self.pref = searx.preferences.Preferences(["simple"], ["general"], engines, self.storage)
  61. self.pref.parse_dict({"locale": "en"})
  62. def test_init(self):
  63. self.assertEqual(2, len(self.storage))
  64. def test_hooks(self):
  65. with self.app.test_request_context():
  66. sxng_request.preferences = self.pref
  67. query = ""
  68. ret = do_pre_search(query, self.storage, pageno=1)
  69. self.assertTrue(ret is True)
  70. ret = self.storage.on_result(
  71. sxng_request,
  72. get_search_mock("lorem ipsum", user_plugins=["plg001", "plg002"]),
  73. Result(),
  74. )
  75. self.assertFalse(ret)