From a4dfac507b130b986460ff9848610fbe6052e429 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 19 Aug 2020 14:57:59 +0530 Subject: [PATCH 1/2] fix(minor): use get_list in client.get_value for tighter checks --- frappe/client.py | 12 +++++++++--- frappe/tests/test_api.py | 32 ++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/frappe/client.py b/frappe/client.py index 045e28dd8f..a813e3ec55 100644 --- a/frappe/client.py +++ b/frappe/client.py @@ -75,17 +75,23 @@ def get_value(doctype, fieldname, filters=None, as_dict=True, debug=False, paren filters = get_safe_filters(filters) try: - fieldname = json.loads(fieldname) + fields = json.loads(fieldname) except (TypeError, ValueError): # name passed, not json - pass + fields = [fieldname] # check whether the used filters were really parseable and usable # and did not just result in an empty string or dict if not filters: filters = None - return frappe.db.get_value(doctype, filters, fieldname, as_dict=as_dict, debug=debug) + value = frappe.get_list(doctype, filters=filters, fields=fields, debug=debug, limit=1) + if as_dict: + value = value[0] if value else {} + else: + value = value[0].fieldname + + return value @frappe.whitelist() def get_single_value(doctype, field): diff --git a/frappe/tests/test_api.py b/frappe/tests/test_api.py index 2472f3191d..0edc1d4759 100644 --- a/frappe/tests/test_api.py +++ b/frappe/tests/test_api.py @@ -4,18 +4,14 @@ from __future__ import unicode_literals import unittest, frappe, os from frappe.core.doctype.user.user import generate_keys -from frappe.frappeclient import FrappeClient +from frappe.frappeclient import FrappeClient, FrappeException from frappe.utils.data import get_url import requests import base64 class TestAPI(unittest.TestCase): - def test_insert_many(self): - server = FrappeClient(get_url(), "Administrator", "admin", verify=False) - frappe.db.sql("delete from `tabNote` where title in ('Sing','a','song','of','sixpence')") - frappe.db.commit() - + def insert_docs(self): server.insert_many([ {"doctype": "Note", "public": True, "title": "Sing"}, {"doctype": "Note", "public": True, "title": "a"}, @@ -24,6 +20,13 @@ class TestAPI(unittest.TestCase): {"doctype": "Note", "public": True, "title": "sixpence"}, ]) + def test_insert_many(self, server): + server = FrappeClient(get_url(), "Administrator", "admin", verify=False) + frappe.db.sql("delete from `tabNote` where title in ('Sing','a','song','of','sixpence')") + frappe.db.commit() + + self.insert_docs(server) + 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'})) @@ -41,6 +44,8 @@ class TestAPI(unittest.TestCase): def test_list_docs(self): server = FrappeClient(get_url(), "Administrator", "admin", verify=False) + self.insert_docs(server) + doc_list = server.get_list("Note") self.assertTrue(len(doc_list)) @@ -56,6 +61,21 @@ class TestAPI(unittest.TestCase): doc = server.get_doc("Note", "get_this") self.assertTrue(doc) + def test_get_value(self): + server = FrappeClient(get_url(), "Administrator", "admin", verify=False) + frappe.db.sql("delete from `tabNote` where 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) + + self.assertRaises(FrappeException, server.get_value, "Note", "(select (password) from(__Auth) order by name desc limit 1)", {"title": "get_value"}) + + def test_update_doc(self): server = FrappeClient(get_url(), "Administrator", "admin", verify=False) frappe.db.sql("delete from `tabNote` where title in ('Sing','sing')") From 89717b00606d8efbccef6b7ad0cbd540f827e7b2 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 19 Aug 2020 15:03:17 +0530 Subject: [PATCH 2/2] fix(tests): test_insert_many --- frappe/tests/test_api.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/frappe/tests/test_api.py b/frappe/tests/test_api.py index 0edc1d4759..3e559ac0f3 100644 --- a/frappe/tests/test_api.py +++ b/frappe/tests/test_api.py @@ -11,7 +11,11 @@ import requests import base64 class TestAPI(unittest.TestCase): - def insert_docs(self): + def test_insert_many(self): + server = FrappeClient(get_url(), "Administrator", "admin", verify=False) + frappe.db.sql("delete from `tabNote` where 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"}, @@ -20,13 +24,6 @@ class TestAPI(unittest.TestCase): {"doctype": "Note", "public": True, "title": "sixpence"}, ]) - def test_insert_many(self, server): - server = FrappeClient(get_url(), "Administrator", "admin", verify=False) - frappe.db.sql("delete from `tabNote` where title in ('Sing','a','song','of','sixpence')") - frappe.db.commit() - - self.insert_docs(server) - 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'})) @@ -44,8 +41,6 @@ class TestAPI(unittest.TestCase): def test_list_docs(self): server = FrappeClient(get_url(), "Administrator", "admin", verify=False) - self.insert_docs(server) - doc_list = server.get_list("Note") self.assertTrue(len(doc_list))