seitime-frappe/frappe/tests/test_form_load.py
Ankush Menat 21442f5cba perf: disable creating version for new docs
Each new doc inserts a version, this contains nothing but creator and
creation time.. which is already immutable information on the original
document.

This was added for cases like data import to track from where document
got created, ref: b7dfe7969d

Fix: only add a version on creation IF creation info is present on flags
2022-06-12 18:07:55 +05:30

200 lines
5.6 KiB
Python

# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
import unittest
import frappe
from frappe.core.page.permission_manager.permission_manager import add, reset, update
from frappe.custom.doctype.property_setter.property_setter import make_property_setter
from frappe.desk.form.load import get_docinfo, getdoc, getdoctype
from frappe.utils.file_manager import save_file
test_dependencies = ["Blog Category", "Blogger"]
class TestFormLoad(unittest.TestCase):
def test_load(self):
getdoctype("DocType")
meta = list(filter(lambda d: d.name == "DocType", frappe.response.docs))[0]
self.assertEqual(meta.name, "DocType")
self.assertTrue(meta.get("__js"))
frappe.response.docs = []
getdoctype("Event")
meta = list(filter(lambda d: d.name == "Event", frappe.response.docs))[0]
self.assertTrue(meta.get("__calendar_js"))
def test_fieldlevel_permissions_in_load(self):
blog = frappe.get_doc(
{
"doctype": "Blog Post",
"blog_category": "-test-blog-category-1",
"blog_intro": "Test Blog Intro",
"blogger": "_Test Blogger 1",
"content": "Test Blog Content",
"title": "_Test Blog Post {}".format(frappe.utils.now()),
"published": 0,
}
)
blog.insert()
user = frappe.get_doc("User", "test@example.com")
user_roles = frappe.get_roles()
user.remove_roles(*user_roles)
user.add_roles("Blogger")
blog_post_property_setter = make_property_setter("Blog Post", "published", "permlevel", 1, "Int")
reset("Blog Post")
# test field level permission before role level permissions are defined
frappe.set_user(user.name)
blog_doc = get_blog(blog.name)
self.assertEqual(blog_doc.published, None)
# this will be ignored because user does not
# have write access on `published` field (or on permlevel 1 fields)
blog_doc.published = 1
blog_doc.save()
# since published field has higher permlevel
self.assertEqual(blog_doc.published, 0)
# test field level permission after role level permissions are defined
frappe.set_user("Administrator")
add("Blog Post", "Website Manager", 1)
update("Blog Post", "Website Manager", 1, "write", 1)
frappe.set_user(user.name)
blog_doc = get_blog(blog.name)
self.assertEqual(blog_doc.name, blog.name)
# since published field has higher permlevel
self.assertEqual(blog_doc.published, None)
# this will be ignored because user does not
# have write access on `published` field (or on permlevel 1 fields)
blog_doc.published = 1
blog_doc.save()
# since published field has higher permlevel
self.assertEqual(blog_doc.published, 0)
frappe.set_user("Administrator")
user.add_roles("Website Manager")
frappe.set_user(user.name)
doc = frappe.get_doc("Blog Post", blog.name)
doc.published = 1
doc.save()
blog_doc = get_blog(blog.name)
# now user should be allowed to read field with higher permlevel
# (after adding Website Manager role)
self.assertEqual(blog_doc.published, 1)
frappe.set_user("Administrator")
# reset user roles
user.remove_roles("Blogger", "Website Manager")
user.add_roles(*user_roles)
blog_doc.delete()
frappe.delete_doc(blog_post_property_setter.doctype, blog_post_property_setter.name)
def test_fieldlevel_permissions_in_load_for_child_table(self):
contact = frappe.new_doc("Contact")
contact.first_name = "_Test Contact 1"
contact.append("phone_nos", {"phone": "123456"})
contact.insert()
user = frappe.get_doc("User", "test@example.com")
user_roles = frappe.get_roles()
user.remove_roles(*user_roles)
user.add_roles("Accounts User")
make_property_setter("Contact Phone", "phone", "permlevel", 1, "Int")
reset("Contact Phone")
add("Contact", "Sales User", 1)
update("Contact", "Sales User", 1, "write", 1)
frappe.set_user(user.name)
contact = frappe.get_doc("Contact", "_Test Contact 1")
contact.phone_nos[0].phone = "654321"
contact.save()
self.assertEqual(contact.phone_nos[0].phone, "123456")
frappe.set_user("Administrator")
user.add_roles("Sales User")
frappe.set_user(user.name)
contact.phone_nos[0].phone = "654321"
contact.save()
contact = frappe.get_doc("Contact", "_Test Contact 1")
self.assertEqual(contact.phone_nos[0].phone, "654321")
frappe.set_user("Administrator")
# reset user roles
user.remove_roles("Accounts User", "Sales User")
user.add_roles(*user_roles)
contact.delete()
def test_get_doc_info(self):
note = frappe.new_doc("Note")
note.content = "some content"
note.title = frappe.generate_hash(length=20)
note.insert()
note.content = "new content"
# trigger a version
note.save(ignore_version=False)
note.add_comment(text="test")
note.add_tag("test_tag")
note.add_tag("more_tag")
# empty attachment
save_file("test_file", b"", note.doctype, note.name, decode=True)
frappe.get_doc(
{
"doctype": "Communication",
"communication_type": "Communication",
"content": "test email",
"reference_doctype": note.doctype,
"reference_name": note.name,
}
).insert()
get_docinfo(note)
docinfo = frappe.response["docinfo"]
self.assertEqual(len(docinfo.comments), 1)
self.assertIn("test", docinfo.comments[0].content)
self.assertGreaterEqual(len(docinfo.versions), 1)
self.assertEqual(set(docinfo.tags.split(",")), {"more_tag", "test_tag"})
self.assertEqual(len(docinfo.attachments), 1)
self.assertIn("test_file", docinfo.attachments[0].file_name)
self.assertEqual(len(docinfo.communications), 1)
self.assertIn("email", docinfo.communications[0].content)
note.delete()
def get_blog(blog_name):
frappe.response.docs = []
getdoc("Blog Post", blog_name)
doc = frappe.response.docs[0]
return doc