add partner_email_sync_portal_login
This commit is contained in:
parent
3c5809774f
commit
3be3de173e
11 changed files with 388 additions and 0 deletions
1
partner_email_sync_portal_login/tests/__init__.py
Normal file
1
partner_email_sync_portal_login/tests/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
|||
from . import test_partner_email_sync_portal_login
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
# Copyright 2026 Criptomart
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
from odoo.exceptions import UserError
|
||||
from odoo.tests import TransactionCase, tagged
|
||||
|
||||
from odoo.addons.auth_signup.models.res_users import ResUsers
|
||||
|
||||
RESET_PASSWORD = "action_reset_password"
|
||||
|
||||
|
||||
@tagged("post_install", "-at_install")
|
||||
class TestPartnerEmailSyncPortalLogin(TransactionCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
|
||||
Users = cls.env["res.users"].with_context(no_reset_password=True)
|
||||
cls.portal_user = Users.create(
|
||||
{
|
||||
"name": "Portal Member",
|
||||
"login": "member@example.com",
|
||||
"email": "member@example.com",
|
||||
"groups_id": [(6, 0, [cls.env.ref("base.group_portal").id])],
|
||||
}
|
||||
)
|
||||
cls.internal_user = Users.create(
|
||||
{
|
||||
"name": "Internal Member",
|
||||
"login": "internal@example.com",
|
||||
"email": "internal@example.com",
|
||||
"groups_id": [(6, 0, [cls.env.ref("base.group_user").id])],
|
||||
}
|
||||
)
|
||||
|
||||
def test_portal_user_login_synced_and_reset_sent(self):
|
||||
with patch.object(ResUsers, RESET_PASSWORD, autospec=True) as reset:
|
||||
self.portal_user.partner_id.email = "New.Member@Example.com"
|
||||
self.assertEqual(self.portal_user.login, "new.member@example.com")
|
||||
reset.assert_called_once()
|
||||
self.assertEqual(reset.call_args.args[0], self.portal_user)
|
||||
|
||||
def test_internal_user_not_synced(self):
|
||||
with patch.object(ResUsers, RESET_PASSWORD, autospec=True) as reset:
|
||||
self.internal_user.partner_id.email = "other@example.com"
|
||||
self.assertEqual(self.internal_user.login, "internal@example.com")
|
||||
reset.assert_not_called()
|
||||
|
||||
def test_partner_without_user(self):
|
||||
partner = self.env["res.partner"].create(
|
||||
{"name": "No User", "email": "nouser@example.com"}
|
||||
)
|
||||
with patch.object(ResUsers, RESET_PASSWORD, autospec=True) as reset:
|
||||
partner.email = "nouser2@example.com"
|
||||
reset.assert_not_called()
|
||||
|
||||
def test_invalid_or_empty_email_keeps_login(self):
|
||||
with patch.object(ResUsers, RESET_PASSWORD, autospec=True) as reset:
|
||||
self.portal_user.partner_id.email = False
|
||||
self.portal_user.partner_id.email = "not-an-email"
|
||||
self.assertEqual(self.portal_user.login, "member@example.com")
|
||||
reset.assert_not_called()
|
||||
|
||||
def test_same_email_different_case_not_resent(self):
|
||||
with patch.object(ResUsers, RESET_PASSWORD, autospec=True) as reset:
|
||||
self.portal_user.partner_id.email = "MEMBER@example.com"
|
||||
self.assertEqual(self.portal_user.login, "member@example.com")
|
||||
reset.assert_not_called()
|
||||
|
||||
def test_login_already_used(self):
|
||||
with self.assertRaises(UserError):
|
||||
self.portal_user.partner_id.email = "internal@example.com"
|
||||
|
||||
def test_reset_email_failure_does_not_block(self):
|
||||
with patch.object(
|
||||
ResUsers, RESET_PASSWORD, autospec=True, side_effect=UserError("boom")
|
||||
):
|
||||
self.portal_user.partner_id.email = "fail@example.com"
|
||||
self.assertEqual(self.portal_user.login, "fail@example.com")
|
||||
|
||||
def test_skip_context(self):
|
||||
partner = self.portal_user.partner_id.with_context(
|
||||
skip_portal_login_sync=True
|
||||
)
|
||||
with patch.object(ResUsers, RESET_PASSWORD, autospec=True) as reset:
|
||||
partner.email = "skip@example.com"
|
||||
self.assertEqual(self.portal_user.login, "member@example.com")
|
||||
reset.assert_not_called()
|
||||
|
||||
def test_no_mail_context_syncs_login_only(self):
|
||||
partner = self.portal_user.partner_id.with_context(
|
||||
portal_login_sync_no_mail=True
|
||||
)
|
||||
with patch.object(ResUsers, RESET_PASSWORD, autospec=True) as reset:
|
||||
partner.email = "wizard@example.com"
|
||||
self.assertEqual(self.portal_user.login, "wizard@example.com")
|
||||
reset.assert_not_called()
|
||||
Loading…
Add table
Add a link
Reference in a new issue