# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE import frappe from frappe.cache_manager import clear_controller_cache from frappe.desk.doctype.todo.todo import ToDo from frappe.tests.utils import FrappeTestCase class TestHooks(FrappeTestCase): def test_hooks(self): hooks = frappe.get_hooks() self.assertTrue(isinstance(hooks.get("app_name"), list)) self.assertTrue(isinstance(hooks.get("doc_events"), dict)) self.assertTrue(isinstance(hooks.get("doc_events").get("*"), dict)) self.assertTrue(isinstance(hooks.get("doc_events").get("*"), dict)) self.assertTrue( "frappe.desk.notifications.clear_doctype_notifications" in hooks.get("doc_events").get("*").get("on_update") ) def test_override_doctype_class(self): from frappe import hooks # Set hook hooks.override_doctype_class = {"ToDo": ["frappe.tests.test_hooks.CustomToDo"]} # Clear cache frappe.cache().delete_value("app_hooks") clear_controller_cache("ToDo") todo = frappe.get_doc(doctype="ToDo", description="asdf") self.assertTrue(isinstance(todo, CustomToDo)) def test_has_permission(self): from frappe import hooks # Set hook address_has_permission_hook = hooks.has_permission.get("Address", []) if isinstance(address_has_permission_hook, str): address_has_permission_hook = [address_has_permission_hook] address_has_permission_hook.append("frappe.tests.test_hooks.custom_has_permission") hooks.has_permission["Address"] = address_has_permission_hook # Clear cache frappe.cache().delete_value("app_hooks") # Init User and Address username = "test@example.com" user = frappe.get_doc("User", username) user.add_roles("System Manager") address = frappe.new_doc("Address") # Test! self.assertTrue(frappe.has_permission("Address", doc=address, user=username)) address.flags.dont_touch_me = True self.assertFalse(frappe.has_permission("Address", doc=address, user=username)) def custom_has_permission(doc, ptype, user): if doc.flags.dont_touch_me: return False class CustomToDo(ToDo): pass