[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:
Thibault Delavallée
2019-09-04 08:34:24 +00:00
parent eea560060a
commit 3d034dafc6
3 changed files with 40 additions and 15 deletions
+2 -3
View File
@@ -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')
+37 -12
View File
@@ -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