add partner_email_sync_portal_login

This commit is contained in:
Luis 2026-10-06 12:10:26 +02:00
parent 3c5809774f
commit 3be3de173e
11 changed files with 388 additions and 0 deletions

View file

@ -0,0 +1 @@
from . import test_partner_email_sync_portal_login

View file

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