Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

175 linhas
5.9 KiB

  1. # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors
  2. # License: MIT. See LICENSE
  3. import unittest
  4. import frappe
  5. from frappe.desk.search import search_link, search_widget, get_names_for_mentions
  6. class TestSearch(unittest.TestCase):
  7. def setUp(self):
  8. if self._testMethodName == "test_link_field_order":
  9. setup_test_link_field_order(self)
  10. def tearDown(self):
  11. if self._testMethodName == "test_link_field_order":
  12. teardown_test_link_field_order(self)
  13. def test_search_field_sanitizer(self):
  14. # pass
  15. search_link('DocType', 'User', query=None, filters=None, page_length=20, searchfield='name')
  16. result = frappe.response['results'][0]
  17. self.assertTrue('User' in result['value'])
  18. #raise exception on injection
  19. self.assertRaises(frappe.DataError,
  20. search_link, 'DocType', 'Customer', query=None, filters=None,
  21. page_length=20, searchfield='1=1')
  22. self.assertRaises(frappe.DataError,
  23. search_link, 'DocType', 'Customer', query=None, filters=None,
  24. page_length=20, searchfield='select * from tabSessions) --')
  25. self.assertRaises(frappe.DataError,
  26. search_link, 'DocType', 'Customer', query=None, filters=None,
  27. page_length=20, searchfield='name or (select * from tabSessions)')
  28. self.assertRaises(frappe.DataError,
  29. search_link, 'DocType', 'Customer', query=None, filters=None,
  30. page_length=20, searchfield='*')
  31. self.assertRaises(frappe.DataError,
  32. search_link, 'DocType', 'Customer', query=None, filters=None,
  33. page_length=20, searchfield=';')
  34. self.assertRaises(frappe.DataError,
  35. search_link, 'DocType', 'Customer', query=None, filters=None,
  36. page_length=20, searchfield=';')
  37. def test_only_enabled_in_mention(self):
  38. email = 'test_disabled_user_in_mentions@example.com'
  39. frappe.delete_doc('User', email)
  40. if not frappe.db.exists('User', email):
  41. user = frappe.new_doc('User')
  42. user.update({
  43. 'email' : email,
  44. 'first_name' : email.split("@")[0],
  45. 'enabled' : False,
  46. 'allowed_in_mentions' : True,
  47. })
  48. # saved when roles are added
  49. user.add_roles('System Manager',)
  50. names_for_mention = [user.get('id') for user in get_names_for_mentions('')]
  51. self.assertNotIn(email, names_for_mention)
  52. def test_link_field_order(self):
  53. # Making a request to the search_link with the tree doctype
  54. search_link(doctype=self.tree_doctype_name, txt='all', query=None,
  55. filters=None, page_length=20, searchfield=None)
  56. result = frappe.response['results']
  57. # Check whether the result is sorted or not
  58. self.assertEqual(self.parent_doctype_name, result[0]['value'])
  59. # Check whether searching for parent also list out children
  60. self.assertEqual(len(result), len(self.child_doctypes_names) + 1)
  61. #Search for the word "pay", part of the word "pays" (country) in french.
  62. def test_link_search_in_foreign_language(self):
  63. try:
  64. frappe.local.lang = 'fr'
  65. search_widget(doctype="DocType", txt="pay", page_length=20)
  66. output = frappe.response["values"]
  67. result = [['found' for x in y if x=="Country"] for y in output]
  68. self.assertTrue(['found'] in result)
  69. finally:
  70. frappe.local.lang = 'en'
  71. def test_validate_and_sanitize_search_inputs(self):
  72. # should raise error if searchfield is injectable
  73. self.assertRaises(frappe.DataError,
  74. get_data, *('User', 'Random', 'select * from tabSessions) --', '1', '10', dict()))
  75. # page_len and start should be converted to int
  76. self.assertListEqual(get_data('User', 'Random', 'email', 'name or (select * from tabSessions)', '10', dict()),
  77. ['User', 'Random', 'email', 0, 10, {}])
  78. self.assertListEqual(get_data('User', 'Random', 'email', page_len='2', start='10', filters=dict()),
  79. ['User', 'Random', 'email', 10, 2, {}])
  80. # DocType can be passed as None which should be accepted
  81. self.assertListEqual(get_data(None, 'Random', 'email', '2', '10', dict()),
  82. [None, 'Random', 'email', 2, 10, {}])
  83. # return empty string if passed doctype is invalid
  84. self.assertListEqual(get_data("Random DocType", 'Random', 'email', '2', '10', dict()), [])
  85. # should not fail if function is called via frappe.call with extra arguments
  86. args = ("Random DocType", 'Random', 'email', '2', '10', dict())
  87. kwargs = {'as_dict': False}
  88. self.assertListEqual(frappe.call('frappe.tests.test_search.get_data', *args, **kwargs), [])
  89. # should not fail if query has @ symbol in it
  90. search_link('User', 'user@random', searchfield='name')
  91. self.assertListEqual(frappe.response['results'], [])
  92. @frappe.validate_and_sanitize_search_inputs
  93. def get_data(doctype, txt, searchfield, start, page_len, filters):
  94. return [doctype, txt, searchfield, start, page_len, filters]
  95. def setup_test_link_field_order(TestCase):
  96. TestCase.tree_doctype_name = 'Test Tree Order'
  97. TestCase.child_doctype_list = []
  98. TestCase.child_doctypes_names = ['USA', 'India', 'Russia', 'China']
  99. TestCase.parent_doctype_name = 'All Territories'
  100. # Create Tree doctype
  101. TestCase.tree_doc = frappe.get_doc({
  102. 'doctype': 'DocType',
  103. 'name': TestCase.tree_doctype_name,
  104. 'module': 'Custom',
  105. 'custom': 1,
  106. 'is_tree': 1,
  107. 'autoname': 'field:random',
  108. 'fields': [{
  109. 'fieldname': 'random',
  110. 'label': 'Random',
  111. 'fieldtype': 'Data'
  112. }]
  113. }).insert()
  114. TestCase.tree_doc.search_fields = 'parent_test_tree_order'
  115. TestCase.tree_doc.save()
  116. # Create root for the tree doctype
  117. frappe.get_doc({
  118. "doctype": TestCase.tree_doctype_name,
  119. "random": TestCase.parent_doctype_name,
  120. "is_group": 1
  121. }).insert()
  122. # Create children for the root
  123. for child_name in TestCase.child_doctypes_names:
  124. temp = frappe.get_doc({
  125. "doctype": TestCase.tree_doctype_name,
  126. "random": child_name,
  127. "parent_test_tree_order": TestCase.parent_doctype_name
  128. }).insert()
  129. TestCase.child_doctype_list.append(temp)
  130. def teardown_test_link_field_order(TestCase):
  131. # Deleting all the created doctype
  132. for child_doctype in TestCase.child_doctype_list:
  133. child_doctype.delete()
  134. frappe.delete_doc(
  135. TestCase.tree_doctype_name,
  136. TestCase.parent_doctype_name,
  137. ignore_permissions=True,
  138. force=True,
  139. for_reload=True,
  140. )
  141. TestCase.tree_doc.delete()