test_plugin_calculator.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # pylint: disable=missing-module-docstring,disable=missing-class-docstring,invalid-name
  3. import warnings
  4. from parameterized.parameterized import parameterized
  5. import searx.plugins
  6. import searx.preferences
  7. from searx.extended_types import sxng_request
  8. from searx.result_types import Answer
  9. from tests import SearxTestCase
  10. from .test_utils import random_string
  11. from .test_plugins import do_post_search
  12. # Reporting the DeprecationWarning once should be sufficient when running tests
  13. warnings.filterwarnings("once", category=DeprecationWarning)
  14. class PluginCalculator(SearxTestCase):
  15. def setUp(self):
  16. super().setUp()
  17. engines = {}
  18. self.storage = searx.plugins.PluginStorage()
  19. self.storage.load_settings({"searx.plugins.calculator.SXNGPlugin": {"active": True}})
  20. self.storage.init(self.app)
  21. self.pref = searx.preferences.Preferences(["simple"], ["general"], engines, self.storage)
  22. self.pref.parse_dict({"locale": "en"})
  23. def test_plugin_store_init(self):
  24. self.assertEqual(1, len(self.storage))
  25. def test_pageno_1_2(self):
  26. with self.app.test_request_context():
  27. sxng_request.preferences = self.pref
  28. query = "1+1"
  29. answer = Answer(answer=f"{query} = {eval(query)}") # pylint: disable=eval-used
  30. search = do_post_search(query, self.storage, pageno=1)
  31. self.assertIn(answer, search.result_container.answers)
  32. search = do_post_search(query, self.storage, pageno=2)
  33. self.assertEqual(list(search.result_container.answers), [])
  34. def test_long_query_ignored(self):
  35. with self.app.test_request_context():
  36. sxng_request.preferences = self.pref
  37. query = f"1+1 {random_string(101)}"
  38. search = do_post_search(query, self.storage)
  39. self.assertEqual(list(search.result_container.answers), [])
  40. @parameterized.expand(
  41. [
  42. ("1+1", "2", "en"),
  43. ("1-1", "0", "en"),
  44. ("1*1", "1", "en"),
  45. ("1/1", "1", "en"),
  46. ("1**1", "1", "en"),
  47. ("1^1", "1", "en"),
  48. ("1,000.0+1,000.0", "2,000", "en"),
  49. ("1.0+1.0", "2", "en"),
  50. ("1.0-1.0", "0", "en"),
  51. ("1.0*1.0", "1", "en"),
  52. ("1.0/1.0", "1", "en"),
  53. ("1.0**1.0", "1", "en"),
  54. ("1.0^1.0", "1", "en"),
  55. ("1.000,0+1.000,0", "2.000", "de"),
  56. ("1,0+1,0", "2", "de"),
  57. ("1,0-1,0", "0", "de"),
  58. ("1,0*1,0", "1", "de"),
  59. ("1,0/1,0", "1", "de"),
  60. ("1,0**1,0", "1", "de"),
  61. ("1,0^1,0", "1", "de"),
  62. ]
  63. )
  64. def test_localized_query(self, query: str, res: str, lang: str):
  65. with self.app.test_request_context():
  66. self.pref.parse_dict({"locale": lang})
  67. sxng_request.preferences = self.pref
  68. answer = Answer(answer=f"{query} = {res}")
  69. search = do_post_search(query, self.storage)
  70. self.assertIn(answer, search.result_container.answers)
  71. @parameterized.expand(
  72. [
  73. "1/0",
  74. ]
  75. )
  76. def test_invalid_operations(self, query):
  77. with self.app.test_request_context():
  78. sxng_request.preferences = self.pref
  79. search = do_post_search(query, self.storage)
  80. self.assertEqual(list(search.result_container.answers), [])