|
- # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
- # License: MIT. See LICENSE
-
- import unittest, frappe
- from frappe.core.doctype.user.user import generate_keys
- from frappe.frappeclient import FrappeClient, FrappeException
- from frappe.utils.data import get_url
-
- import requests
- import base64
-
- class TestFrappeClient(unittest.TestCase):
- PASSWORD = frappe.conf.admin_password or "admin"
-
- def test_insert_many(self):
- server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
- frappe.db.delete("Note", {"title": ("in", ('Sing','a','song','of','sixpence'))})
- frappe.db.commit()
-
- server.insert_many([
- {"doctype": "Note", "public": True, "title": "Sing"},
- {"doctype": "Note", "public": True, "title": "a"},
- {"doctype": "Note", "public": True, "title": "song"},
- {"doctype": "Note", "public": True, "title": "of"},
- {"doctype": "Note", "public": True, "title": "sixpence"},
- ])
-
- self.assertTrue(frappe.db.get_value('Note', {'title': 'Sing'}))
- self.assertTrue(frappe.db.get_value('Note', {'title': 'a'}))
- self.assertTrue(frappe.db.get_value('Note', {'title': 'song'}))
- self.assertTrue(frappe.db.get_value('Note', {'title': 'of'}))
- self.assertTrue(frappe.db.get_value('Note', {'title': 'sixpence'}))
-
- def test_create_doc(self):
- server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
- frappe.db.delete("Note", {"title": "test_create"})
- frappe.db.commit()
-
- server.insert({"doctype": "Note", "public": True, "title": "test_create"})
-
- self.assertTrue(frappe.db.get_value('Note', {'title': 'test_create'}))
-
- def test_list_docs(self):
- server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
- doc_list = server.get_list("Note")
-
- self.assertTrue(len(doc_list))
-
- def test_get_doc(self):
- server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
- frappe.db.delete("Note", {"title": "get_this"})
- frappe.db.commit()
-
- server.insert_many([
- {"doctype": "Note", "public": True, "title": "get_this"},
- ])
- doc = server.get_doc("Note", "get_this")
- self.assertTrue(doc)
-
- def test_get_value(self):
- server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
- frappe.db.delete("Note", {"title": "get_value"})
- frappe.db.commit()
-
- test_content = "test get value"
-
- server.insert_many([
- {"doctype": "Note", "public": True, "title": "get_value", "content": test_content},
- ])
- self.assertEqual(server.get_value("Note", "content", {"title": "get_value"}).get('content'), test_content)
- name = server.get_value("Note", "name", {"title": "get_value"}).get('name')
-
- # test by name
- self.assertEqual(server.get_value("Note", "content", name).get('content'), test_content)
-
- self.assertRaises(FrappeException, server.get_value, "Note", "(select (password) from(__Auth) order by name desc limit 1)", {"title": "get_value"})
-
- def test_get_single(self):
- server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
- server.set_value('Website Settings', 'Website Settings', 'title_prefix', 'test-prefix')
- self.assertEqual(server.get_value('Website Settings', 'title_prefix', 'Website Settings').get('title_prefix'), 'test-prefix')
- self.assertEqual(server.get_value('Website Settings', 'title_prefix').get('title_prefix'), 'test-prefix')
- frappe.db.set_value('Website Settings', None, 'title_prefix', '')
-
- def test_update_doc(self):
- server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
- frappe.db.delete("Note", {"title": ("in", ("Sing", "sing"))})
- frappe.db.commit()
-
- server.insert({"doctype":"Note", "public": True, "title": "Sing"})
- doc = server.get_doc("Note", 'Sing')
- changed_title = "sing"
- doc["title"] = changed_title
- doc = server.update(doc)
- self.assertTrue(doc["title"] == changed_title)
-
- def test_update_child_doc(self):
- server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
- frappe.db.delete("Contact", {"first_name": "George", "last_name": "Steevens"})
- frappe.db.delete("Contact", {"first_name": "William", "last_name": "Shakespeare"})
- frappe.db.delete("Communication", {"reference_doctype": "Event"})
- frappe.db.delete("Communication Link", {"link_doctype": "Contact"})
- frappe.db.delete("Event", {"subject": "Sing a song of sixpence"})
- frappe.db.delete("Event Participants", {"reference_doctype": "Contact"})
- frappe.db.commit()
-
- # create multiple contacts
- server.insert_many([
- {"doctype": "Contact", "first_name": "George", "last_name": "Steevens"},
- {"doctype": "Contact", "first_name": "William", "last_name": "Shakespeare"}
- ])
-
- # create an event with one of the created contacts
- event = server.insert({
- "doctype": "Event",
- "subject": "Sing a song of sixpence",
- "event_participants": [{
- "reference_doctype": "Contact",
- "reference_docname": "George Steevens"
- }]
- })
-
- # update the event's contact to the second contact
- server.update({
- "doctype": "Event Participants",
- "name": event.get("event_participants")[0].get("name"),
- "reference_docname": "William Shakespeare"
- })
-
- # the change should run the parent document's validations and
- # create a Communication record with the new contact
- self.assertTrue(frappe.db.exists("Communication Link", {"link_name": "William Shakespeare"}))
-
- def test_delete_doc(self):
- server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
- frappe.db.delete("Note", {"title": "delete"})
- frappe.db.commit()
-
- server.insert_many([
- {"doctype": "Note", "public": True, "title": "delete"},
- ])
- server.delete("Note", "delete")
-
- self.assertFalse(frappe.db.get_value('Note', {'title': 'delete'}))
-
- def test_auth_via_api_key_secret(self):
- # generate API key and API secret for administrator
- keys = generate_keys("Administrator")
- frappe.db.commit()
- generated_secret = frappe.utils.password.get_decrypted_password(
- "User", "Administrator", fieldname='api_secret'
- )
-
- api_key = frappe.db.get_value("User", "Administrator", "api_key")
- header = {"Authorization": "token {}:{}".format(api_key, generated_secret)}
- res = requests.post(get_url() + "/api/method/frappe.auth.get_logged_user", headers=header)
-
- self.assertEqual(res.status_code, 200)
- self.assertEqual("Administrator", res.json()["message"])
- self.assertEqual(keys['api_secret'], generated_secret)
-
- header = {"Authorization": "Basic {}".format(base64.b64encode(frappe.safe_encode("{}:{}".format(api_key, generated_secret))).decode())}
- res = requests.post(get_url() + "/api/method/frappe.auth.get_logged_user", headers=header)
- self.assertEqual(res.status_code, 200)
- self.assertEqual("Administrator", res.json()["message"])
-
- # Valid api key, invalid api secret
- api_secret = "ksk&93nxoe3os"
- header = {"Authorization": "token {}:{}".format(api_key, api_secret)}
- res = requests.post(get_url() + "/api/method/frappe.auth.get_logged_user", headers=header)
- self.assertEqual(res.status_code, 403)
-
- # random api key and api secret
- api_key = "@3djdk3kld"
- api_secret = "ksk&93nxoe3os"
- header = {"Authorization": "token {}:{}".format(api_key, api_secret)}
- res = requests.post(get_url() + "/api/method/frappe.auth.get_logged_user", headers=header)
- self.assertEqual(res.status_code, 401)
|