test: redo reset password tests
This commit is contained in:
parent
4c925e0325
commit
38565a80e3
2 changed files with 23 additions and 17 deletions
|
|
@ -3,6 +3,7 @@
|
|||
import json
|
||||
import time
|
||||
from unittest.mock import patch
|
||||
from urllib.parse import parse_qs, urlparse
|
||||
|
||||
import frappe
|
||||
import frappe.exceptions
|
||||
|
|
@ -17,7 +18,7 @@ from frappe.core.doctype.user.user import (
|
|||
from frappe.desk.notifications import extract_mentions
|
||||
from frappe.frappeclient import FrappeClient
|
||||
from frappe.model.delete_doc import delete_doc
|
||||
from frappe.tests.utils import FrappeTestCase
|
||||
from frappe.tests.utils import FrappeTestCase, change_settings
|
||||
from frappe.utils import get_url
|
||||
|
||||
user_module = frappe.core.doctype.user.user
|
||||
|
|
@ -32,10 +33,14 @@ class TestUser(FrappeTestCase):
|
|||
frappe.db.set_single_value("System Settings", "password_reset_limit", 3)
|
||||
frappe.set_user("Administrator")
|
||||
|
||||
@staticmethod
|
||||
def reset_password(user) -> str:
|
||||
link = user.reset_password()
|
||||
return parse_qs(urlparse(link).query)["key"][0]
|
||||
|
||||
def test_user_type(self):
|
||||
new_user = frappe.get_doc(
|
||||
doctype="User", email="test-for-type@example.com", first_name="Tester"
|
||||
).insert(ignore_if_duplicate=True)
|
||||
user_id = frappe.generate_hash() + "@example.com"
|
||||
new_user = frappe.get_doc(doctype="User", email=user_id, first_name="Tester").insert()
|
||||
self.assertEqual(new_user.user_type, "Website User")
|
||||
|
||||
# social login userid for frappe
|
||||
|
|
@ -269,11 +274,8 @@ class TestUser(FrappeTestCase):
|
|||
"""
|
||||
self.assertListEqual(extract_mentions(comment), ["test@example.com", "test1@example.com"])
|
||||
|
||||
@change_settings("System Settings", commit=True, password_reset_limit=1)
|
||||
def test_rate_limiting_for_reset_password(self):
|
||||
# Allow only one reset request for a day
|
||||
frappe.db.set_single_value("System Settings", "password_reset_limit", 1)
|
||||
frappe.db.commit()
|
||||
|
||||
url = get_url()
|
||||
data = {"cmd": "frappe.core.doctype.user.user.reset_password", "user": "test@test.com"}
|
||||
|
||||
|
|
@ -351,6 +353,7 @@ class TestUser(FrappeTestCase):
|
|||
"/signup",
|
||||
)
|
||||
|
||||
@change_settings("System Settings", password_reset_limit=6)
|
||||
def test_reset_password(self):
|
||||
from frappe.auth import CookieManager, LoginManager
|
||||
from frappe.utils import set_request
|
||||
|
|
@ -363,12 +366,11 @@ class TestUser(FrappeTestCase):
|
|||
frappe.local.login_manager = LoginManager()
|
||||
# used by rate limiter when calling reset_password
|
||||
frappe.local.request_ip = "127.0.0.69"
|
||||
frappe.db.set_single_value("System Settings", "password_reset_limit", 6)
|
||||
|
||||
frappe.set_user("testpassword@example.com")
|
||||
test_user = frappe.get_doc("User", "testpassword@example.com")
|
||||
test_user.reset_password()
|
||||
self.assertEqual(update_password(new_password, key=test_user.reset_password_key), "/app")
|
||||
key = self.reset_password(test_user)
|
||||
self.assertEqual(update_password(new_password, key=key), "/app")
|
||||
self.assertEqual(
|
||||
update_password(new_password, key="wrong_key"),
|
||||
"The reset password link has either been used before or is invalid",
|
||||
|
|
@ -435,16 +437,16 @@ class TestUser(FrappeTestCase):
|
|||
sorted(m.get("module_name") for m in get_modules_from_all_apps()),
|
||||
)
|
||||
|
||||
@change_settings("System Settings", reset_password_link_expiry_duration=1)
|
||||
def test_reset_password_link_expiry(self):
|
||||
new_password = "new_password"
|
||||
# set the reset password expiry to 1 second
|
||||
frappe.db.set_single_value("System Settings", "reset_password_link_expiry_duration", 1)
|
||||
frappe.set_user("testpassword@example.com")
|
||||
test_user = frappe.get_doc("User", "testpassword@example.com")
|
||||
test_user.reset_password()
|
||||
time.sleep(1) # sleep for 1 sec to expire the reset link
|
||||
key = self.reset_password(test_user)
|
||||
time.sleep(1)
|
||||
|
||||
self.assertEqual(
|
||||
update_password(new_password, key=test_user.reset_password_key),
|
||||
update_password(new_password, key=key),
|
||||
"The reset password link has been expired",
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@ def _restore_thread_locals(flags):
|
|||
|
||||
|
||||
@contextmanager
|
||||
def change_settings(doctype, settings_dict=None, /, **settings):
|
||||
def change_settings(doctype, settings_dict=None, /, commit=False, **settings):
|
||||
"""A context manager to ensure that settings are changed before running
|
||||
function and restored after running it regardless of exceptions occurred.
|
||||
This is useful in tests where you want to make changes in a function but
|
||||
|
|
@ -255,6 +255,8 @@ def change_settings(doctype, settings_dict=None, /, **settings):
|
|||
settings.save(ignore_permissions=True)
|
||||
# singles are cached by default, clear to avoid flake
|
||||
frappe.db.value_cache[settings] = {}
|
||||
if commit:
|
||||
frappe.db.commit()
|
||||
yield # yield control to calling function
|
||||
|
||||
finally:
|
||||
|
|
@ -263,6 +265,8 @@ def change_settings(doctype, settings_dict=None, /, **settings):
|
|||
for key, value in previous_settings.items():
|
||||
setattr(settings, key, value)
|
||||
settings.save(ignore_permissions=True)
|
||||
if commit:
|
||||
frappe.db.commit()
|
||||
|
||||
|
||||
def timeout(seconds=30, error_message="Test timed out."):
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue