From e38078a69f07e71422697b8730735940c0677dc0 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 17 Jul 2023 12:41:27 +0530 Subject: [PATCH] test: Patch hooks for testing (#21702) * test: Patch hooks for testing * test: hooks patcher --------- Co-authored-by: Ankush Menat --- frappe/hooks.py | 4 ---- frappe/tests/test_api.py | 13 ++++--------- frappe/tests/test_naming.py | 19 +++++++++++++++---- frappe/tests/test_website.py | 22 +++++++++++----------- frappe/tests/utils.py | 14 ++++++++++++++ 5 files changed, 44 insertions(+), 28 deletions(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index b1d8478966..af801e9e7b 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -429,7 +429,3 @@ extend_bootinfo = [ "frappe.utils.telemetry.add_bootinfo", "frappe.core.doctype.user_permission.user_permission.send_user_permissions", ] - -naming_series_variables = { - "PM": "frappe.tests.test_naming.parse_naming_series_variable", -} diff --git a/frappe/tests/test_api.py b/frappe/tests/test_api.py index c345d8fbcf..34f17c3e36 100644 --- a/frappe/tests/test_api.py +++ b/frappe/tests/test_api.py @@ -11,7 +11,7 @@ from werkzeug.test import TestResponse import frappe from frappe.installer import update_site_config -from frappe.tests.utils import FrappeTestCase +from frappe.tests.utils import FrappeTestCase, patch_hooks from frappe.utils import get_site_url, get_test_client try: @@ -312,18 +312,13 @@ class TestReadOnlyMode(FrappeAPITestCase): class TestWSGIApp(FrappeAPITestCase): def test_request_hooks(self): self.addCleanup(lambda: _test_REQ_HOOK.clear()) - get_hooks = frappe.get_hooks - def patch_request_hooks(event: str, *args, **kwargs): - patched_hooks = { + with patch_hooks( + { "before_request": ["frappe.tests.test_api.before_request"], "after_request": ["frappe.tests.test_api.after_request"], } - if event not in patched_hooks: - return get_hooks(event, *args, **kwargs) - return patched_hooks[event] - - with patch("frappe.get_hooks", patch_request_hooks): + ): self.assertIsNone(_test_REQ_HOOK.get("before_request")) self.assertIsNone(_test_REQ_HOOK.get("after_request")) res = self.get("/api/method/ping") diff --git a/frappe/tests/test_naming.py b/frappe/tests/test_naming.py index 25265eca1f..721cfa42fc 100644 --- a/frappe/tests/test_naming.py +++ b/frappe/tests/test_naming.py @@ -1,6 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE +from unittest.mock import patch + import frappe from frappe.core.doctype.doctype.test_doctype import new_doctype from frappe.model.naming import ( @@ -12,7 +14,7 @@ from frappe.model.naming import ( parse_naming_series, revert_series_if_last, ) -from frappe.tests.utils import FrappeTestCase +from frappe.tests.utils import FrappeTestCase, patch_hooks from frappe.utils import now_datetime, nowdate, nowtime @@ -379,9 +381,18 @@ class TestNaming(FrappeTestCase): # check naming with custom parser todo = frappe.new_doc("ToDo") series = "TODO-.PM.-.####" - name = parse_naming_series(series, doc=todo) - expected_name = "TODO-" + nowdate().split("-")[1] + "-" + "0001" - self.assertEqual(name, expected_name) + + frappe.clear_cache() + with patch_hooks( + { + "naming_series_variables": { + "PM": ["frappe.tests.test_naming.parse_naming_series_variable"], + }, + }, + ): + name = parse_naming_series(series, doc=todo) + expected_name = "TODO-" + nowdate().split("-")[1] + "-" + "0001" + self.assertEqual(name, expected_name) def parse_naming_series_variable(doc, variable): diff --git a/frappe/tests/test_website.py b/frappe/tests/test_website.py index 16e82850de..b7b33b3531 100644 --- a/frappe/tests/test_website.py +++ b/frappe/tests/test_website.py @@ -1,6 +1,7 @@ from unittest.mock import patch import frappe +from frappe import get_hooks from frappe.tests.utils import FrappeTestCase from frappe.utils import set_request from frappe.website.page_renderers.static_page import StaticPage @@ -73,17 +74,6 @@ class TestWebsite(FrappeTestCase): self.assertEqual(get_home_page(), "login") frappe.set_user("Administrator") - from frappe import get_hooks - - def patched_get_hooks(hook, value): - def wrapper(*args, **kwargs): - return_value = get_hooks(*args, **kwargs) - if args[0] == hook: - return_value = value - return return_value - - return wrapper - # test homepage via hooks clear_website_cache() with patch.object( @@ -402,6 +392,16 @@ class TestWebsite(FrappeTestCase): frappe.set_user("Guest") +def patched_get_hooks(hook, value): + def wrapper(*args, **kwargs): + return_value = get_hooks(*args, **kwargs) + if args[0] == hook: + return_value = value + return return_value + + return wrapper + + class CustomPageRenderer: def __init__(self, path, status_code=None): self.path = path diff --git a/frappe/tests/utils.py b/frappe/tests/utils.py index 2c10a6fc14..c6c53e6bf5 100644 --- a/frappe/tests/utils.py +++ b/frappe/tests/utils.py @@ -4,6 +4,7 @@ import signal import unittest from collections.abc import Sequence from contextlib import contextmanager +from unittest.mock import patch import frappe from frappe.model.base_document import BaseDocument @@ -207,3 +208,16 @@ def timeout(seconds=30, error_message="Test timed out."): return wrapper return decorator + + +@contextmanager +def patch_hooks(overridden_hoooks): + get_hooks = frappe.get_hooks + + def patched_hooks(hook=None, default="_KEEP_DEFAULT_LIST", app_name=None): + if hook in overridden_hoooks: + return overridden_hoooks[hook] + return get_hooks(hook, default, app_name) + + with patch.object(frappe, "get_hooks", patched_hooks): + yield