[FIX] test_mail: fix some ordering issues in tests
In resend wizard tests In some cases tuple comparison of states seems to fail. Indeed order seems to change in some cases depending on installation order. With this commit we correctly check partner / notification status one by one, avoiding to rely on order / set length that is not guaranteed. In mail gateway tests Add a specific order on name to be clearer about what we mean when fetching users as a fallback, until better heuristic. Using name is sufficient as we have no need to rely on complex partner display_name. Task 2060220 (testing SMS integration)
This commit is contained in:
@@ -1507,8 +1507,7 @@ class MailThread(models.AbstractModel):
|
||||
domain = [('email_normalized', 'in', normalized_emails)]
|
||||
if extra_domain:
|
||||
domain = expression.AND(domain, extra_domain)
|
||||
Users = self.env['res.users'].sudo()
|
||||
partners = Users.search(domain).mapped('partner_id')
|
||||
partners = self.env['res.users'].sudo().search(domain, order='name ASC').mapped('partner_id')
|
||||
# return a search on partner to filter results current user should not see (multi company for example)
|
||||
return self.env['res.partner'].search([('id', 'in', partners.ids)])
|
||||
|
||||
@@ -1563,7 +1562,7 @@ class MailThread(models.AbstractModel):
|
||||
return matching_user
|
||||
|
||||
if not matching_user:
|
||||
std_users = self.env['res.users'].sudo().search([('email_normalized', '=', normalized_email)], limit=1)
|
||||
std_users = self.env['res.users'].sudo().search([('email_normalized', '=', normalized_email)], limit=1, order='name ASC')
|
||||
matching_user = std_users[0] if std_users else self.env['res.users']
|
||||
if matching_user:
|
||||
return matching_user
|
||||
|
||||
@@ -388,6 +388,7 @@ class TestMailgateway(BaseFunctionalTest, MockEmails):
|
||||
|
||||
# name order win
|
||||
self.test_record.message_unsubscribe(follower_user.partner_id.ids)
|
||||
self.test_record.flush()
|
||||
record = self.format_and_process(MAIL_TEMPLATE, self.user_employee.email_formatted, 'groups@test.com', subject='FirstFoundWinner')
|
||||
self.assertEqual(record.create_uid, self.user_employee)
|
||||
self.assertEqual(record.message_ids[0].subject, 'FirstFoundWinner')
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import itertools
|
||||
from unittest.mock import patch
|
||||
|
||||
from odoo import api
|
||||
@@ -12,7 +11,7 @@ from odoo.tests import tagged
|
||||
from odoo.tools import mute_logger
|
||||
|
||||
|
||||
@tagged('resend_test')
|
||||
@tagged('mail_wizards')
|
||||
class TestMailResend(common.BaseFunctionalTest, common.MockEmails):
|
||||
|
||||
@classmethod
|
||||
@@ -48,9 +47,13 @@ class TestMailResend(common.BaseFunctionalTest, common.MockEmails):
|
||||
super(TestMailResend, self).setUp()
|
||||
TestMailResend.bus_update_failure = []
|
||||
|
||||
def assertNotifStates(self, states, message):
|
||||
notif = self.env['mail.notification'].search([('mail_message_id', '=', message.id)], order="res_partner_id asc")
|
||||
self.assertEquals(tuple(notif.mapped('notification_status')), states)
|
||||
def assertPartnerNotif(self, partner, state, message):
|
||||
# TDE CLEANME: quick fix, should be cleaned and moved to mail testing tools
|
||||
notif = self.env['mail.notification'].search([
|
||||
('res_partner_id', '=', partner.id),
|
||||
('mail_message_id', '=', message.id)]
|
||||
)
|
||||
self.assertEquals(notif.notification_status, state)
|
||||
return notif
|
||||
|
||||
def assertBusMessage(self, partners):
|
||||
@@ -80,23 +83,34 @@ class TestMailResend(common.BaseFunctionalTest, common.MockEmails):
|
||||
message = self.test_record.with_user(self.user_admin).message_post(partner_ids=self.partners.ids, subtype='mail.mt_comment', message_type='notification')
|
||||
self.assertBusMessage([self.partner_admin])
|
||||
self.assertEmails(self.partner_admin, [])
|
||||
self.assertNotifStates(('exception', 'exception', 'exception', 'exception'), message)
|
||||
for partner in [self.user1.partner_id, self.user2.partner_id, self.partner1, self.partner2]:
|
||||
self.assertPartnerNotif(partner, 'exception', message)
|
||||
|
||||
wizard = self.env['mail.resend.message'].with_context({'mail_message_to_resend': message.id}).create({})
|
||||
self.assertEqual(wizard.notification_ids.mapped('res_partner_id'), self.partners, "wizard should manage notifications for each failed partner")
|
||||
wizard.resend_mail_action()
|
||||
self.assertBusMessage([self.partner_admin] * 3) # three more failure sent on bus, one for each mail in failure and one for resend
|
||||
self.assertEmails(self.partner_admin, self.partners)
|
||||
self.assertNotifStates(('exception', 'sent', 'exception', 'sent'), message)
|
||||
for partner in [self.user1.partner_id, self.partner1]:
|
||||
self.assertPartnerNotif(partner, 'exception', message)
|
||||
for partner in [self.user2.partner_id, self.partner2]:
|
||||
self.assertPartnerNotif(partner, 'sent', message)
|
||||
|
||||
self.user1.write({"email": 'u1@example.com'})
|
||||
self.env['mail.resend.message'].with_context({'mail_message_to_resend': message.id}).create({}).resend_mail_action()
|
||||
self.assertBusMessage([self.partner_admin] * 2) # two more failure update sent on bus, one for failed mail and one for resend
|
||||
self.assertEmails(self.partner_admin, self.invalid_email_partners)
|
||||
self.assertNotifStates(('sent', 'sent', 'exception', 'sent'), message)
|
||||
for partner in [self.partner1]:
|
||||
self.assertPartnerNotif(partner, 'exception', message)
|
||||
for partner in [self.user1.partner_id, self.user2.partner_id, self.partner2]:
|
||||
self.assertPartnerNotif(partner, 'sent', message)
|
||||
|
||||
self.partner1.write({"email": 'p1@example.com'})
|
||||
self.env['mail.resend.message'].with_context({'mail_message_to_resend': message.id}).create({}).resend_mail_action()
|
||||
self.assertBusMessage([self.partner_admin]) # A success update should be sent on bus once the email has no more failure
|
||||
self.assertEmails(self.partner_admin, self.partner1)
|
||||
self.assertNotifStates(('sent', 'sent', 'sent', 'sent'), message)
|
||||
for partner in [self.user1.partner_id, self.user2.partner_id, self.partner1, self.partner2]:
|
||||
self.assertPartnerNotif(partner, 'sent', message)
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_mail_send_no_failure(self):
|
||||
@@ -117,14 +131,25 @@ class TestMailResend(common.BaseFunctionalTest, common.MockEmails):
|
||||
wizard.resend_mail_action()
|
||||
self.assertEmails(self.partner_admin, self.user1)
|
||||
self.assertBusMessage([self.partner_admin] * 2) # two more failure sent on bus, one for failure, one for resend
|
||||
self.assertNotifStates(('exception', 'sent', 'canceled', 'sent'), message)
|
||||
for partner in [self.user1.partner_id]:
|
||||
self.assertPartnerNotif(partner, 'exception', message)
|
||||
for partner in [self.partner1]:
|
||||
self.assertPartnerNotif(partner, 'canceled', message)
|
||||
for partner in [self.user2.partner_id, self.partner2]:
|
||||
self.assertPartnerNotif(partner, 'sent', message)
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_cancel_all(self):
|
||||
message = self.test_record.with_user(self.user_admin).message_post(partner_ids=self.partners.ids, subtype='mail.mt_comment', message_type='notification')
|
||||
self.assertNotifStates(('exception', 'sent', 'exception', 'sent'), message)
|
||||
for partner in [self.user1.partner_id, self.partner1]:
|
||||
self.assertPartnerNotif(partner, 'exception', message)
|
||||
for partner in [self.user2.partner_id, self.partner2]:
|
||||
self.assertPartnerNotif(partner, 'sent', message)
|
||||
self.assertBusMessage([self.partner_admin] * 2)
|
||||
wizard = self.env['mail.resend.message'].with_context({'mail_message_to_resend': message.id}).create({})
|
||||
wizard.cancel_mail_action()
|
||||
self.assertNotifStates(('canceled', 'sent', 'canceled', 'sent'), message)
|
||||
for partner in [self.user1.partner_id, self.partner1]:
|
||||
self.assertPartnerNotif(partner, 'canceled', message)
|
||||
for partner in [self.user2.partner_id, self.partner2]:
|
||||
self.assertPartnerNotif(partner, 'sent', message)
|
||||
self.assertBusMessage([self.partner_admin]) # one update for cancell
|
||||
|
||||
Reference in New Issue
Block a user