test: Patch hooks for testing (#21702)

* test: Patch hooks for testing

* test: hooks patcher

---------

Co-authored-by: Ankush Menat <ankush@frappe.io>
This commit is contained in:
Deepesh Garg 2023-07-17 12:41:27 +05:30 committed by GitHub
parent b6cd6535db
commit e38078a69f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 28 deletions

View file

@ -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",
}

View file

@ -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")

View file

@ -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):

View file

@ -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

View file

@ -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