No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

179 líneas
7.1 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # License: MIT. See LICENSE
  3. import unittest, frappe
  4. from frappe.core.doctype.user.user import generate_keys
  5. from frappe.frappeclient import FrappeClient, FrappeException
  6. from frappe.utils.data import get_url
  7. import requests
  8. import base64
  9. class TestFrappeClient(unittest.TestCase):
  10. PASSWORD = frappe.conf.admin_password or "admin"
  11. def test_insert_many(self):
  12. server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
  13. frappe.db.delete("Note", {"title": ("in", ('Sing','a','song','of','sixpence'))})
  14. frappe.db.commit()
  15. server.insert_many([
  16. {"doctype": "Note", "public": True, "title": "Sing"},
  17. {"doctype": "Note", "public": True, "title": "a"},
  18. {"doctype": "Note", "public": True, "title": "song"},
  19. {"doctype": "Note", "public": True, "title": "of"},
  20. {"doctype": "Note", "public": True, "title": "sixpence"},
  21. ])
  22. self.assertTrue(frappe.db.get_value('Note', {'title': 'Sing'}))
  23. self.assertTrue(frappe.db.get_value('Note', {'title': 'a'}))
  24. self.assertTrue(frappe.db.get_value('Note', {'title': 'song'}))
  25. self.assertTrue(frappe.db.get_value('Note', {'title': 'of'}))
  26. self.assertTrue(frappe.db.get_value('Note', {'title': 'sixpence'}))
  27. def test_create_doc(self):
  28. server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
  29. frappe.db.delete("Note", {"title": "test_create"})
  30. frappe.db.commit()
  31. server.insert({"doctype": "Note", "public": True, "title": "test_create"})
  32. self.assertTrue(frappe.db.get_value('Note', {'title': 'test_create'}))
  33. def test_list_docs(self):
  34. server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
  35. doc_list = server.get_list("Note")
  36. self.assertTrue(len(doc_list))
  37. def test_get_doc(self):
  38. server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
  39. frappe.db.delete("Note", {"title": "get_this"})
  40. frappe.db.commit()
  41. server.insert_many([
  42. {"doctype": "Note", "public": True, "title": "get_this"},
  43. ])
  44. doc = server.get_doc("Note", "get_this")
  45. self.assertTrue(doc)
  46. def test_get_value(self):
  47. server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
  48. frappe.db.delete("Note", {"title": "get_value"})
  49. frappe.db.commit()
  50. test_content = "test get value"
  51. server.insert_many([
  52. {"doctype": "Note", "public": True, "title": "get_value", "content": test_content},
  53. ])
  54. self.assertEqual(server.get_value("Note", "content", {"title": "get_value"}).get('content'), test_content)
  55. name = server.get_value("Note", "name", {"title": "get_value"}).get('name')
  56. # test by name
  57. self.assertEqual(server.get_value("Note", "content", name).get('content'), test_content)
  58. self.assertRaises(FrappeException, server.get_value, "Note", "(select (password) from(__Auth) order by name desc limit 1)", {"title": "get_value"})
  59. def test_get_single(self):
  60. server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
  61. server.set_value('Website Settings', 'Website Settings', 'title_prefix', 'test-prefix')
  62. self.assertEqual(server.get_value('Website Settings', 'title_prefix', 'Website Settings').get('title_prefix'), 'test-prefix')
  63. self.assertEqual(server.get_value('Website Settings', 'title_prefix').get('title_prefix'), 'test-prefix')
  64. frappe.db.set_value('Website Settings', None, 'title_prefix', '')
  65. def test_update_doc(self):
  66. server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
  67. frappe.db.delete("Note", {"title": ("in", ("Sing", "sing"))})
  68. frappe.db.commit()
  69. server.insert({"doctype":"Note", "public": True, "title": "Sing"})
  70. doc = server.get_doc("Note", 'Sing')
  71. changed_title = "sing"
  72. doc["title"] = changed_title
  73. doc = server.update(doc)
  74. self.assertTrue(doc["title"] == changed_title)
  75. def test_update_child_doc(self):
  76. server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
  77. frappe.db.delete("Contact", {"first_name": "George", "last_name": "Steevens"})
  78. frappe.db.delete("Contact", {"first_name": "William", "last_name": "Shakespeare"})
  79. frappe.db.delete("Communication", {"reference_doctype": "Event"})
  80. frappe.db.delete("Communication Link", {"link_doctype": "Contact"})
  81. frappe.db.delete("Event", {"subject": "Sing a song of sixpence"})
  82. frappe.db.delete("Event Participants", {"reference_doctype": "Contact"})
  83. frappe.db.commit()
  84. # create multiple contacts
  85. server.insert_many([
  86. {"doctype": "Contact", "first_name": "George", "last_name": "Steevens"},
  87. {"doctype": "Contact", "first_name": "William", "last_name": "Shakespeare"}
  88. ])
  89. # create an event with one of the created contacts
  90. event = server.insert({
  91. "doctype": "Event",
  92. "subject": "Sing a song of sixpence",
  93. "event_participants": [{
  94. "reference_doctype": "Contact",
  95. "reference_docname": "George Steevens"
  96. }]
  97. })
  98. # update the event's contact to the second contact
  99. server.update({
  100. "doctype": "Event Participants",
  101. "name": event.get("event_participants")[0].get("name"),
  102. "reference_docname": "William Shakespeare"
  103. })
  104. # the change should run the parent document's validations and
  105. # create a Communication record with the new contact
  106. self.assertTrue(frappe.db.exists("Communication Link", {"link_name": "William Shakespeare"}))
  107. def test_delete_doc(self):
  108. server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
  109. frappe.db.delete("Note", {"title": "delete"})
  110. frappe.db.commit()
  111. server.insert_many([
  112. {"doctype": "Note", "public": True, "title": "delete"},
  113. ])
  114. server.delete("Note", "delete")
  115. self.assertFalse(frappe.db.get_value('Note', {'title': 'delete'}))
  116. def test_auth_via_api_key_secret(self):
  117. # generate API key and API secret for administrator
  118. keys = generate_keys("Administrator")
  119. frappe.db.commit()
  120. generated_secret = frappe.utils.password.get_decrypted_password(
  121. "User", "Administrator", fieldname='api_secret'
  122. )
  123. api_key = frappe.db.get_value("User", "Administrator", "api_key")
  124. header = {"Authorization": "token {}:{}".format(api_key, generated_secret)}
  125. res = requests.post(get_url() + "/api/method/frappe.auth.get_logged_user", headers=header)
  126. self.assertEqual(res.status_code, 200)
  127. self.assertEqual("Administrator", res.json()["message"])
  128. self.assertEqual(keys['api_secret'], generated_secret)
  129. header = {"Authorization": "Basic {}".format(base64.b64encode(frappe.safe_encode("{}:{}".format(api_key, generated_secret))).decode())}
  130. res = requests.post(get_url() + "/api/method/frappe.auth.get_logged_user", headers=header)
  131. self.assertEqual(res.status_code, 200)
  132. self.assertEqual("Administrator", res.json()["message"])
  133. # Valid api key, invalid api secret
  134. api_secret = "ksk&93nxoe3os"
  135. header = {"Authorization": "token {}:{}".format(api_key, api_secret)}
  136. res = requests.post(get_url() + "/api/method/frappe.auth.get_logged_user", headers=header)
  137. self.assertEqual(res.status_code, 403)
  138. # random api key and api secret
  139. api_key = "@3djdk3kld"
  140. api_secret = "ksk&93nxoe3os"
  141. header = {"Authorization": "token {}:{}".format(api_key, api_secret)}
  142. res = requests.post(get_url() + "/api/method/frappe.auth.get_logged_user", headers=header)
  143. self.assertEqual(res.status_code, 401)