[MERGE][REF] (test_)mass_mailing: move/improve tests and fix link shortener
Purpose of this merge is to move some mass mailing tests into test_mass_mailing module. Some tests were duplicated when merging new mass mailing tests at https://github.com/odoo/odoo/commit/0c37eb272fba1063444f0ec91db1fe543c1beebf . This merge moves some tests to the specific test module for mass mailing. Performance tests are also added to have some counters for future mass mailing improvements. A tool method to create new test users is also added in order to reduce duplicated code present in a lot of tests. It allows to quickly create tests users given a login and access rights groups. See sub commits for more details. This merge is linked to task ID 1889703 closes odoo/odoo#27526
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.tests import common
|
||||
|
||||
|
||||
@@ -9,17 +10,4 @@ class TestHrCommon(common.TransactionCase):
|
||||
def setUp(self):
|
||||
super(TestHrCommon, self).setUp()
|
||||
|
||||
self._quick_create_ctx = {
|
||||
'mail_create_nolog': True,
|
||||
'mail_create_nosubscribe': True,
|
||||
'mail_notrack': True,
|
||||
}
|
||||
self._quick_create_user_ctx = dict(self._quick_create_ctx, no_reset_password=True)
|
||||
|
||||
self.res_users_hr_officer = self.env['res.users'].with_context(self._quick_create_user_ctx).create({
|
||||
'name': 'HR Officer',
|
||||
'login': 'hro',
|
||||
'email': 'hro@example.com',
|
||||
'company_id': self.ref('base.main_company'),
|
||||
'groups_id': [(6, 0, [self.ref('base.group_user'), self.ref('hr.group_hr_user')])]
|
||||
})
|
||||
self.res_users_hr_officer = mail_new_test_user(self.env, login='hro', groups='base.group_user,hr.group_hr_user', name='HR Officer', email='hro@example.com')
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.tests import common
|
||||
|
||||
|
||||
@@ -9,42 +10,18 @@ class TestHrHolidaysBase(common.TransactionCase):
|
||||
def setUp(self):
|
||||
super(TestHrHolidaysBase, self).setUp()
|
||||
|
||||
self._quick_create_ctx = {
|
||||
'mail_create_nolog': True,
|
||||
'mail_create_nosubscribe': True,
|
||||
'mail_notrack': True,
|
||||
}
|
||||
self._quick_create_user_ctx = dict(self._quick_create_ctx, no_reset_password=True)
|
||||
|
||||
# Test users to use through the various tests
|
||||
Users = self.env['res.users'].with_context(self._quick_create_user_ctx)
|
||||
self.user_hruser = Users.create({
|
||||
'name': 'Armande HrUser',
|
||||
'login': 'Armande',
|
||||
'email': 'armande.hruser@example.com',
|
||||
'groups_id': [(6, 0, [self.ref('base.group_user'), self.ref('hr_holidays.group_hr_holidays_user')])]
|
||||
})
|
||||
self.user_hruser = mail_new_test_user(self.env, login='armande', groups='base.group_user,hr_holidays.group_hr_holidays_user')
|
||||
self.user_hruser_id = self.user_hruser.id
|
||||
self.user_hrmanager = Users.create({
|
||||
'name': 'Bastien HrManager',
|
||||
'login': 'bastien',
|
||||
'email': 'bastien.hrmanager@example.com',
|
||||
'groups_id': [(6, 0, [self.ref('base.group_user'), self.ref('hr_holidays.group_hr_holidays_manager')])]
|
||||
}).id
|
||||
self.user_hrmanager_id = self.user_hrmanager
|
||||
self.user_employee = Users.create({
|
||||
'name': 'David Employee',
|
||||
'login': 'david',
|
||||
'email': 'david.employee@example.com',
|
||||
'groups_id': [(6, 0, [self.ref('base.group_user')])]
|
||||
})
|
||||
|
||||
self.user_hrmanager = mail_new_test_user(self.env, login='bastien', groups='base.group_user,hr_holidays.group_hr_holidays_manager')
|
||||
self.user_hrmanager_id = self.user_hrmanager.id
|
||||
|
||||
self.user_employee = mail_new_test_user(self.env, login='david', groups='base.group_user')
|
||||
self.user_employee_id = self.user_employee.id
|
||||
self.user_hrmanager_2_id = Users.create({
|
||||
'name': 'Florence HrManager',
|
||||
'login': 'florence',
|
||||
'email': 'florence.hrmanager@example.com',
|
||||
'groups_id': [(6, 0, [self.ref('base.group_user'), self.ref('hr_holidays.group_hr_holidays_manager')])]
|
||||
}).id
|
||||
|
||||
self.user_hrmanager_2 = mail_new_test_user(self.env, login='florence', groups='base.group_user,hr_holidays.group_hr_holidays_manager')
|
||||
self.user_hrmanager_2_id = self.user_hrmanager_2.id
|
||||
|
||||
# Hr Data
|
||||
Department = self.env['hr.department'].with_context(tracking_disable=True)
|
||||
|
||||
@@ -185,7 +185,7 @@ class link_tracker(models.Model):
|
||||
link = super(link_tracker, self).create(create_vals)
|
||||
|
||||
code = self.env['link.tracker.code'].get_random_code_string()
|
||||
self.env['link.tracker.code'].create({'code': code, 'link_id': link.id})
|
||||
self.env['link.tracker.code'].sudo().create({'code': code, 'link_id': link.id})
|
||||
|
||||
return link
|
||||
|
||||
|
||||
@@ -14,3 +14,4 @@ access_utm_source,access_utm_source,utm.model_utm_source,mass_mailing.group_mass
|
||||
access_ir_mail_server,access_ir_mail_server,base.model_ir_mail_server,mass_mailing.group_mass_mailing_user,1,0,0,0
|
||||
access_mail_blacklist_mass_mailing_user,access.mail.blacklist.mass_mailing_user,mail.model_mail_blacklist,mass_mailing.group_mass_mailing_user,1,1,1,1
|
||||
access_mail_mass_mailing_list_contact_rel,access.mail.mass_mailing_list_contact_rel,model_mail_mass_mailing_list_contact_rel,mass_mailing.group_mass_mailing_user,1,1,1,1
|
||||
access_link_tracker_mailing,access.link.tracker.mailing,link_tracker.model_link_tracker,mass_mailing.group_mass_mailing_user,1,1,1,1
|
||||
|
@@ -2,8 +2,3 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import test_mass_mailing_list_merge
|
||||
from . import test_mass_mailing_content
|
||||
from . import test_mail_auto_blacklist
|
||||
from . import test_blacklist_access_rights
|
||||
from . import test_mass_mailing
|
||||
from . import test_blacklisted_channel_partner
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.exceptions import AccessError
|
||||
from odoo.tests import common
|
||||
|
||||
|
||||
class TestAccessRights(common.TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestAccessRights, self).setUp()
|
||||
|
||||
users = self.env['res.users'].with_context(no_reset_password=True)
|
||||
partners = self.env['res.partner'].with_context(no_reset_password=True)
|
||||
mass_mailing_contacts = self.env['mail.mass_mailing.contact'].with_context(no_reset_password=True)
|
||||
|
||||
group_user = self.env.ref('mass_mailing.group_mass_mailing_user')
|
||||
|
||||
# Clear blacklist
|
||||
blacklist = self.env['mail.blacklist'].sudo().search([])
|
||||
i = len(blacklist)
|
||||
while i != 0:
|
||||
blacklist[i-1].sudo().unlink()
|
||||
i -= 1
|
||||
|
||||
# Create users
|
||||
self.user_mm_user = users.create({
|
||||
'name': 'Andrew User',
|
||||
'login': 'user',
|
||||
'email': 'a.m@example.com',
|
||||
'groups_id': [(6, 0, [group_user.id])]
|
||||
})
|
||||
self.user_employee = users.create({
|
||||
'name': 'Bert Tartignole',
|
||||
'login': 'bert',
|
||||
'email': 'b.t@example.com',
|
||||
'groups_id': [(6, 0, [self.env.ref('base.group_user').id])]
|
||||
})
|
||||
self.user_portal = users.create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])]
|
||||
})
|
||||
self.contact_blacklisted = mass_mailing_contacts.create({
|
||||
'name': 'Jack Black',
|
||||
'email': 'contact@black.list'
|
||||
})
|
||||
self.partner_blacklisted = partners.create({
|
||||
'name': 'Joe Black',
|
||||
'email': 'test@black.list'
|
||||
})
|
||||
|
||||
# Create a blacklist entry
|
||||
self.blacklist_entry = self.env['mail.blacklist'].create({
|
||||
'email': 'test@black.list',
|
||||
})
|
||||
self.blacklist_contact_entry = self.env['mail.blacklist'].create({
|
||||
'email': 'contact@black.list',
|
||||
})
|
||||
|
||||
def test_access_mass_mailing_user(self):
|
||||
""" Test Mass Mailing user's access rights """
|
||||
# ===================
|
||||
# Test on res_partner
|
||||
# ===================
|
||||
# mass mailing user can see a blacklist entry
|
||||
self.blacklist_entry.sudo(self.user_mm_user).read()
|
||||
# mass mailing user can edit a blacklist entry
|
||||
self.blacklist_entry.sudo(self.user_mm_user).write({'email': 'edit@black.list'})
|
||||
# mass mailing user can create a blacklist entry
|
||||
self.env['mail.blacklist'].sudo(self.user_mm_user).create({
|
||||
'email': 'another@black.list',
|
||||
})
|
||||
self.assertTrue(len(self.env['mail.blacklist'].search([])) == 3,
|
||||
'Number of blacklisted address incorrect, should be equals to 3')
|
||||
# mass mailing user can delete a blacklist entry
|
||||
self.blacklist_entry.sudo(self.user_mm_user).unlink()
|
||||
self.assertTrue(len(self.env['mail.blacklist'].search([])) == 2,
|
||||
'Number of blacklisted address incorrect, should be equals to 2')
|
||||
|
||||
# mass mailing user can see if user is balcklisted using mixin
|
||||
self.assertFalse(self.partner_blacklisted.sudo(self.user_mm_user).is_blacklisted,
|
||||
'Blacklist state incorrect. Should not be blacklisted.')
|
||||
|
||||
# ============================
|
||||
# Test on mass mailing contact
|
||||
# ============================
|
||||
self.blacklist_contact_entry.sudo(self.user_mm_user).read()
|
||||
self.blacklist_contact_entry.sudo(self.user_mm_user).write({'email': 'edit@black.list'})
|
||||
self.env['mail.blacklist'].sudo(self.user_mm_user).create({
|
||||
'email': 'again_another@black.list',
|
||||
})
|
||||
self.assertTrue(len(self.env['mail.blacklist'].search([])) == 3,
|
||||
'Number of blacklisted address incorrect, should be equals to 3')
|
||||
self.blacklist_contact_entry.sudo(self.user_mm_user).unlink()
|
||||
self.assertTrue(len(self.env['mail.blacklist'].search([])) == 2,
|
||||
'Number of blacklisted address incorrect, should be equals to 2')
|
||||
|
||||
def test_access_portal_user(self):
|
||||
""" Test portal user's access rights """
|
||||
# Portal user can't see blacklist entries
|
||||
with self.assertRaises(AccessError):
|
||||
self.blacklist_entry.sudo(self.user_portal).read()
|
||||
# Portal user can't edit a blacklist entry
|
||||
with self.assertRaises(AccessError):
|
||||
self.blacklist_entry.sudo(self.user_portal).write({'email': 'test@edit.be'})
|
||||
# Portal user can't create a blacklist entry
|
||||
with self.assertRaises(AccessError):
|
||||
self.env['mail.blacklist'].sudo(self.user_portal).create({
|
||||
'email': 'another@black.list',
|
||||
})
|
||||
# Portal user can't delete a blacklist entry
|
||||
with self.assertRaises(AccessError):
|
||||
self.blacklist_entry.sudo(self.user_portal).unlink()
|
||||
|
||||
# Portal user can't see if user is balcklisted using mixin
|
||||
with self.assertRaises(AccessError):
|
||||
self.partner_blacklisted.sudo(self.user_portal).is_blacklisted()
|
||||
self.assertTrue(len(self.env['mail.blacklist'].search([])) == 2,
|
||||
'Number of blacklisted address incorrect, should be equals to 2')
|
||||
|
||||
def test_access_employee(self):
|
||||
""" Test classic employee's access rights """
|
||||
# Employee can't see blacklist entries
|
||||
with self.assertRaises(AccessError):
|
||||
self.blacklist_entry.sudo(self.user_employee).read()
|
||||
# Employee can't edit a blacklist entry
|
||||
with self.assertRaises(AccessError):
|
||||
self.blacklist_entry.sudo(self.user_employee).write({'email': 'test@edit.be'})
|
||||
# Employee can't create a blacklist entry
|
||||
with self.assertRaises(AccessError):
|
||||
self.env['mail.blacklist'].sudo(self.user_employee).create({
|
||||
'email': 'another@black.list',
|
||||
})
|
||||
# Employee can't delete a blacklist entry
|
||||
with self.assertRaises(AccessError):
|
||||
self.blacklist_entry.sudo(self.user_employee).unlink()
|
||||
|
||||
# Employee can see if user is balcklisted using mixin
|
||||
self.assertTrue(self.partner_blacklisted.sudo(self.user_employee).is_blacklisted,
|
||||
'Blacklist state incorrect. Should be blacklisted.')
|
||||
@@ -4,39 +4,37 @@ import json
|
||||
|
||||
from contextlib import contextmanager
|
||||
from email.utils import formataddr
|
||||
from functools import partial
|
||||
|
||||
from odoo import api
|
||||
from odoo.addons.bus.models.bus import json_dump
|
||||
from odoo.tests import common, tagged
|
||||
from odoo.tests import common, tagged, new_test_user
|
||||
|
||||
mail_new_test_user = partial(new_test_user, context={'mail_create_nolog': True, 'mail_create_nosubscribe': True, 'mail_notrack': True, 'no_reset_password': True})
|
||||
|
||||
|
||||
class BaseFunctionalTest(common.SavepointCase):
|
||||
|
||||
_test_context = {
|
||||
'mail_create_nolog': True,
|
||||
'mail_create_nosubscribe': True,
|
||||
'mail_notrack': True,
|
||||
'no_reset_password': True
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(BaseFunctionalTest, cls).setUpClass()
|
||||
cls._quick_create_ctx = {
|
||||
'mail_create_nolog': True,
|
||||
'mail_create_nosubscribe': True,
|
||||
'mail_notrack': True,
|
||||
}
|
||||
cls._quick_create_user_ctx = dict(cls._quick_create_ctx, no_reset_password=True)
|
||||
|
||||
user_group_employee = cls.env.ref('base.group_user')
|
||||
cls.user_employee = cls.env['res.users'].with_context(cls._quick_create_user_ctx).create({
|
||||
'name': 'Ernest Employee',
|
||||
'login': 'ernest',
|
||||
'email': 'e.e@example.com',
|
||||
'signature': '--\nErnest',
|
||||
'notification_type': 'email',
|
||||
'groups_id': [(6, 0, [user_group_employee.id])]})
|
||||
cls.user_employee = mail_new_test_user(cls.env, login='ernest', groups='base.group_user', signature='--\nErnest', name='Ernest Employee')
|
||||
cls.partner_employee = cls.user_employee.partner_id
|
||||
|
||||
cls.user_admin = cls.env.ref('base.user_admin')
|
||||
cls.partner_admin = cls.env.ref('base.partner_admin')
|
||||
|
||||
cls.channel_listen = cls.env['mail.channel'].with_context(cls._quick_create_ctx).create({'name': 'Listener'})
|
||||
cls.channel_listen = cls.env['mail.channel'].with_context(cls._test_context).create({'name': 'Listener'})
|
||||
|
||||
cls.test_record = cls.env['mail.test.simple'].with_context(cls._quick_create_ctx).create({'name': 'Test', 'email_from': 'ignasse@example.com'})
|
||||
cls.test_record = cls.env['mail.test.simple'].with_context(cls._test_context).create({'name': 'Test', 'email_from': 'ignasse@example.com'})
|
||||
|
||||
@contextmanager
|
||||
def assertNotifications(self, **counters):
|
||||
@@ -273,7 +271,6 @@ class Moderation(MockEmails, BaseFunctionalTest):
|
||||
def setUpClass(cls):
|
||||
super(Moderation, cls).setUpClass()
|
||||
Channel = cls.env['mail.channel']
|
||||
Users = cls.env['res.users'].with_context(cls._quick_create_user_ctx)
|
||||
|
||||
cls.channel_moderation_1 = Channel.create({
|
||||
'name': 'Moderation_1',
|
||||
@@ -290,13 +287,7 @@ class Moderation(MockEmails, BaseFunctionalTest):
|
||||
|
||||
cls.user_employee.write({'moderation_channel_ids': [(6, 0, [cls.channel_1.id])]})
|
||||
|
||||
cls.user_employee_2 = Users.create({
|
||||
'name': 'Roboute',
|
||||
'login': 'roboute',
|
||||
'email': 'roboute@guilliman.com',
|
||||
'groups_id': [(6, 0, [cls.env.ref('base.group_user').id])],
|
||||
'moderation_channel_ids': [(6, 0, [cls.channel_2.id])]
|
||||
})
|
||||
cls.user_employee_2 = mail_new_test_user(cls.env, login='roboute', groups='base.group_user', moderation_channel_ids=[(6, 0, [cls.channel_2.id])])
|
||||
cls.partner_employee_2 = cls.user_employee_2.partner_id
|
||||
|
||||
cls.channel_moderation_1.write({'channel_last_seen_partner_ids': [(0, 0, {'partner_id': cls.partner_employee.id})]})
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.addons.test_mail.tests.common import BaseFunctionalTest, TestRecipients, MockEmails
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
|
||||
|
||||
class TestChatterTweaks(BaseFunctionalTest, TestRecipients):
|
||||
@@ -77,7 +78,7 @@ class TestNotifications(BaseFunctionalTest, MockEmails):
|
||||
|
||||
def setUp(self):
|
||||
super(TestNotifications, self).setUp()
|
||||
self.partner_1 = self.env['res.partner'].with_context(self._quick_create_ctx).create({
|
||||
self.partner_1 = self.env['res.partner'].with_context(BaseFunctionalTest._test_context).create({
|
||||
'name': 'Valid Lelitre',
|
||||
'email': 'valid.lelitre@agrolait.com'})
|
||||
|
||||
@@ -103,13 +104,7 @@ class TestNotifications(BaseFunctionalTest, MockEmails):
|
||||
message.sudo(self.user_employee).set_message_done()
|
||||
|
||||
def test_set_message_done_portal(self):
|
||||
user_portal = self.env['res.users'].with_context(self._quick_create_user_ctx).create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'notification_type': 'inbox',
|
||||
'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])],
|
||||
})
|
||||
user_portal = mail_new_test_user(self.env, login='chell', groups='base.group_portal', name='Chell Gladys', notification_type='inbox')
|
||||
self.partner_portal = user_portal.partner_id
|
||||
|
||||
with self.assertNotifications(partner_employee=(1, 'inbox', 'unread'), partner_portal=(1, 'inbox', 'read')):
|
||||
|
||||
@@ -9,7 +9,7 @@ class TestInvite(common.BaseFunctionalTest, common.MockEmails):
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_invite_email(self):
|
||||
test_partner = self.env['res.partner'].with_context(self._quick_create_ctx).create({
|
||||
test_partner = self.env['res.partner'].with_context(common.BaseFunctionalTest._test_context).create({
|
||||
'name': 'Valid Lelitre',
|
||||
'email': 'valid.lelitre@agrolait.com'})
|
||||
|
||||
|
||||
@@ -10,8 +10,8 @@ import pytz
|
||||
|
||||
from odoo import exceptions, tests
|
||||
from odoo.addons.test_mail.tests.common import BaseFunctionalTest
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.addons.test_mail.models.test_mail_models import MailTestActivity
|
||||
from odoo.tools import mute_logger
|
||||
|
||||
|
||||
class TestActivityCommon(BaseFunctionalTest):
|
||||
@@ -19,7 +19,7 @@ class TestActivityCommon(BaseFunctionalTest):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(TestActivityCommon, cls).setUpClass()
|
||||
cls.test_record = cls.env['mail.test.activity'].with_context(cls._quick_create_ctx).create({'name': 'Test'})
|
||||
cls.test_record = cls.env['mail.test.activity'].with_context(BaseFunctionalTest._test_context).create({'name': 'Test'})
|
||||
# reset ctx
|
||||
cls.test_record = cls.test_record.with_context(
|
||||
mail_create_nolog=False,
|
||||
@@ -92,12 +92,7 @@ class TestActivityFlow(TestActivityCommon):
|
||||
self.assertEqual(test_record.message_ids[0].subtype_id, self.env.ref('mail.mt_activities'))
|
||||
|
||||
def test_activity_flow_portal(self):
|
||||
portal_user = self.env['res.users'].with_context(self._quick_create_user_ctx).create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])],
|
||||
})
|
||||
portal_user = mail_new_test_user(self.env, login='chell', groups='base.group_portal', name='Chell Gladys')
|
||||
|
||||
with self.sudoAs('chell'):
|
||||
test_record = self.env['mail.test.activity'].browse(self.test_record.id)
|
||||
|
||||
@@ -3,6 +3,7 @@ from email.utils import formataddr
|
||||
|
||||
from odoo.tests import tagged
|
||||
from odoo.addons.test_mail.tests import common
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.exceptions import AccessError, except_orm, ValidationError, UserError
|
||||
from odoo.tools import mute_logger
|
||||
|
||||
@@ -12,19 +13,10 @@ class TestChannelAccessRights(common.BaseFunctionalTest, common.MockEmails):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(TestChannelAccessRights, cls).setUpClass()
|
||||
Channel = cls.env['mail.channel'].with_context(cls._quick_create_ctx)
|
||||
Channel = cls.env['mail.channel'].with_context(common.BaseFunctionalTest._test_context)
|
||||
|
||||
Users = cls.env['res.users'].with_context(cls._quick_create_user_ctx)
|
||||
cls.user_public = Users.create({
|
||||
'name': 'Bert Tartignole',
|
||||
'login': 'bert',
|
||||
'email': 'b.t@example.com',
|
||||
'groups_id': [(6, 0, [cls.env.ref('base.group_public').id])]})
|
||||
cls.user_portal = Users.create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'groups_id': [(6, 0, [cls.env.ref('base.group_portal').id])]})
|
||||
cls.user_public = mail_new_test_user(cls.env, login='bert', groups='base.group_public', name='Bert Tartignole')
|
||||
cls.user_portal = mail_new_test_user(cls.env, login='chell', groups='base.group_portal', name='Chell Gladys')
|
||||
|
||||
# Pigs: base group for tests
|
||||
cls.group_pigs = Channel.create({
|
||||
@@ -118,13 +110,13 @@ class TestChannelFeatures(common.BaseFunctionalTest, common.MockEmails):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(TestChannelFeatures, cls).setUpClass()
|
||||
cls.test_channel = cls.env['mail.channel'].with_context(cls._quick_create_ctx).create({
|
||||
cls.test_channel = cls.env['mail.channel'].with_context(common.BaseFunctionalTest._test_context).create({
|
||||
'name': 'Test',
|
||||
'description': 'Description',
|
||||
'alias_name': 'test',
|
||||
'public': 'public',
|
||||
})
|
||||
cls.test_partner = cls.env['res.partner'].with_context(cls._quick_create_ctx).create({
|
||||
cls.test_partner = cls.env['res.partner'].with_context(common.BaseFunctionalTest._test_context).create({
|
||||
'name': 'Test Partner',
|
||||
'email': 'test@example.com',
|
||||
})
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
from psycopg2 import IntegrityError
|
||||
|
||||
from odoo.addons.test_mail.tests import common
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.tools.misc import mute_logger
|
||||
|
||||
|
||||
@@ -53,12 +54,7 @@ class BaseFollowersTest(common.BaseFunctionalTest):
|
||||
self.assertEqual(follower.subtype_ids, self.default_group_subtypes)
|
||||
|
||||
def test_followers_subtypes_default_internal(self):
|
||||
user_portal = self.env['res.users'].with_context(self._quick_create_user_ctx).create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])]
|
||||
})
|
||||
user_portal = mail_new_test_user(self.env, login='chell', groups='base.group_portal', name='Chell Gladys')
|
||||
|
||||
test_record = self.test_record.sudo(self.user_employee)
|
||||
test_record.message_subscribe(partner_ids=[user_portal.partner_id.id])
|
||||
@@ -125,12 +121,7 @@ class AdvancedFollowersTest(common.BaseFunctionalTest):
|
||||
def setUpClass(cls):
|
||||
super(AdvancedFollowersTest, cls).setUpClass()
|
||||
|
||||
cls.user_portal = cls.env['res.users'].with_context(cls._quick_create_user_ctx).create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'groups_id': [(6, 0, [cls.env.ref('base.group_portal').id])],
|
||||
})
|
||||
cls.user_portal = mail_new_test_user(cls.env, login='chell', groups='base.group_portal', name='Chell Gladys')
|
||||
|
||||
cls.test_track = cls.env['mail.test.track'].sudo(cls.user_employee).create({
|
||||
'name': 'Test',
|
||||
@@ -192,7 +183,7 @@ class AdvancedFollowersTest(common.BaseFunctionalTest):
|
||||
* subscribing to a sub-record as creator applies default subtype values
|
||||
* portal user should not have access to internal subtypes
|
||||
"""
|
||||
umbrella = self.env['mail.test'].with_context(self._quick_create_ctx).create({
|
||||
umbrella = self.env['mail.test'].with_context(common.BaseFunctionalTest._test_context).create({
|
||||
'name': 'Project-Like',
|
||||
})
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ from odoo.addons.test_mail.data.test_mail_data import \
|
||||
MAIL_TEMPLATE, MAIL_TEMPLATE_PLAINTEXT, MAIL_MULTIPART_MIXED, MAIL_MULTIPART_MIXED_TWO, \
|
||||
MAIL_MULTIPART_IMAGE, MAIL_SINGLE_BINARY, MAIL_EML_ATTACHMENT, MAIL_XHTML
|
||||
from odoo.addons.test_mail.tests.common import BaseFunctionalTest, MockEmails
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.tools import mute_logger
|
||||
|
||||
|
||||
@@ -57,7 +58,7 @@ class TestMailgateway(BaseFunctionalTest, MockEmails):
|
||||
super(TestMailgateway, cls).setUpClass()
|
||||
mail_test_simple_model = cls.env['ir.model']._get('mail.test.simple')
|
||||
|
||||
cls.partner_1 = cls.env['res.partner'].with_context(cls._quick_create_ctx).create({
|
||||
cls.partner_1 = cls.env['res.partner'].with_context(BaseFunctionalTest._test_context).create({
|
||||
'name': 'Valid Lelitre',
|
||||
'email': 'valid.lelitre@agrolait.com',
|
||||
})
|
||||
@@ -431,7 +432,7 @@ class TestMailgateway(BaseFunctionalTest, MockEmails):
|
||||
self.assertEqual(self.test_record.message_ids[0].author_id, from_1)
|
||||
self.test_record.message_unsubscribe([from_1.id])
|
||||
|
||||
from_2 = self.env['res.users'].with_context(self._quick_create_user_ctx).create({'name': 'Brice Denisse', 'login': 'B', 'email': 'from.test@example.com'})
|
||||
from_2 = mail_new_test_user(self.env, login='B', groups='base.group_user', name='Brice Denisse', email='from.test@example.com')
|
||||
|
||||
self.format_and_process(MAIL_TEMPLATE, msg_id='<2>', email_from='Brice Denisse <from.test@example.com>')
|
||||
self.assertEqual(self.test_record.message_ids[0].author_id, from_2.partner_id)
|
||||
|
||||
@@ -15,12 +15,7 @@ class TestMail(common.SavepointCase, mail_common.MockEmails):
|
||||
def setUpClass(cls):
|
||||
super(TestMail, cls).setUpClass()
|
||||
|
||||
cls.user_employee = cls.env['res.users'].with_context({
|
||||
'no_reset_password': True,
|
||||
'mail_create_nolog': True,
|
||||
'mail_create_nosubscribe': True,
|
||||
'mail_notrack': True,
|
||||
}).create({
|
||||
cls.user_employee = cls.env['res.users'].with_context(mail_common.BaseFunctionalTest._test_context).create({
|
||||
'name': 'Ernest Employee',
|
||||
'login': 'ernest',
|
||||
'email': 'e.e@example.com',
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import base64
|
||||
|
||||
from odoo.addons.test_mail.tests import common
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.exceptions import AccessError, except_orm
|
||||
from odoo.tools import mute_logger
|
||||
from odoo.tests import tagged
|
||||
@@ -14,7 +15,7 @@ class TestMessageValues(common.BaseFunctionalTest, common.MockEmails):
|
||||
def setUpClass(cls):
|
||||
super(TestMessageValues, cls).setUpClass()
|
||||
|
||||
cls.alias_record = cls.env['mail.test'].with_context(cls._quick_create_ctx).create({
|
||||
cls.alias_record = cls.env['mail.test'].with_context(common.BaseFunctionalTest._test_context).create({
|
||||
'name': 'Pigs',
|
||||
'alias_name': 'pigs',
|
||||
'alias_contact': 'followers',
|
||||
@@ -128,19 +129,10 @@ class TestMessageAccess(common.BaseFunctionalTest, common.MockEmails):
|
||||
def setUpClass(cls):
|
||||
super(TestMessageAccess, cls).setUpClass()
|
||||
|
||||
Users = cls.env['res.users'].with_context(cls._quick_create_user_ctx)
|
||||
cls.user_public = Users.create({
|
||||
'name': 'Bert Tartignole',
|
||||
'login': 'bert',
|
||||
'email': 'b.t@example.com',
|
||||
'groups_id': [(6, 0, [cls.env.ref('base.group_public').id])]})
|
||||
cls.user_portal = Users.create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'groups_id': [(6, 0, [cls.env.ref('base.group_portal').id])]})
|
||||
cls.user_public = mail_new_test_user(cls.env, login='bert', groups='base.group_public', name='Bert Tartignole')
|
||||
cls.user_portal = mail_new_test_user(cls.env, login='chell', groups='base.group_portal', name='Chell Gladys')
|
||||
|
||||
Channel = cls.env['mail.channel'].with_context(cls._quick_create_ctx)
|
||||
Channel = cls.env['mail.channel'].with_context(common.BaseFunctionalTest._test_context)
|
||||
# Pigs: base group for tests
|
||||
cls.group_pigs = Channel.create({
|
||||
'name': 'Pigs',
|
||||
|
||||
@@ -4,11 +4,12 @@
|
||||
import itertools
|
||||
from unittest.mock import patch
|
||||
|
||||
from odoo.addons.test_mail.tests import common
|
||||
from odoo.tests import tagged
|
||||
from odoo.tools import mute_logger
|
||||
from odoo import api
|
||||
from odoo.addons.base.models.ir_mail_server import IrMailServer
|
||||
from odoo.addons.test_mail.tests import common
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.tests import tagged
|
||||
from odoo.tools import mute_logger
|
||||
|
||||
|
||||
@tagged('resend_test')
|
||||
@@ -18,26 +19,14 @@ class TestMailResend(common.BaseFunctionalTest, common.MockEmails):
|
||||
def setUpClass(cls):
|
||||
super(TestMailResend, cls).setUpClass()
|
||||
#Two users
|
||||
cls.user1 = cls.env['res.users'].with_context(cls._quick_create_user_ctx).create({
|
||||
'name': 'Employee 1',
|
||||
'login': 'e1',
|
||||
'email': 'e1', # invalid email
|
||||
'notification_type': 'email',
|
||||
'groups_id': [(6, 0, [cls.env.ref('base.group_user').id])]
|
||||
})
|
||||
cls.user2 = cls.env['res.users'].with_context(cls._quick_create_user_ctx).create({
|
||||
'name': 'Employee 2',
|
||||
'login': 'e2',
|
||||
'email': 'e2@example.com',
|
||||
'notification_type': 'email',
|
||||
'groups_id': [(6, 0, [cls.env.ref('base.group_user').id])]
|
||||
})
|
||||
cls.user1 = mail_new_test_user(cls.env, login='e1', groups='base.group_public', name='Employee 1', email='e1') # invalid email
|
||||
cls.user2 = mail_new_test_user(cls.env, login='e2', groups='base.group_portal', name='Employee 2', email='e2@example.com')
|
||||
#Two partner
|
||||
cls.partner1 = cls.env['res.partner'].with_context(cls._quick_create_user_ctx).create({
|
||||
cls.partner1 = cls.env['res.partner'].with_context(common.BaseFunctionalTest._test_context).create({
|
||||
'name': 'Partner 1',
|
||||
'email': 'p1' # invalid email
|
||||
})
|
||||
cls.partner2 = cls.env['res.partner'].with_context(cls._quick_create_user_ctx).create({
|
||||
cls.partner2 = cls.env['res.partner'].with_context(common.BaseFunctionalTest._test_context).create({
|
||||
'name': 'Partner 2',
|
||||
'email': 'p2@example.com'
|
||||
})
|
||||
|
||||
@@ -5,6 +5,7 @@ import base64
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from odoo.addons.test_mail.tests.common import BaseFunctionalTest, MockEmails, TestRecipients
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.tools import mute_logger, DEFAULT_SERVER_DATETIME_FORMAT
|
||||
|
||||
|
||||
@@ -84,7 +85,7 @@ class TestMailTemplate(BaseFunctionalTest, MockEmails, TestRecipients):
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_composer_w_template_mass_mailing(self):
|
||||
test_record_2 = self.env['mail.test.simple'].with_context(self._quick_create_ctx).create({'name': 'Test2', 'email_from': 'laurie.poiret@example.com'})
|
||||
test_record_2 = self.env['mail.test.simple'].with_context(BaseFunctionalTest._test_context).create({'name': 'Test2', 'email_from': 'laurie.poiret@example.com'})
|
||||
|
||||
composer = self.env['mail.compose.message'].sudo(self.user_employee).with_context({
|
||||
'default_composition_mode': 'mass_mail',
|
||||
|
||||
@@ -7,6 +7,7 @@ from email.utils import formataddr
|
||||
from unittest.mock import patch
|
||||
|
||||
from odoo.addons.test_mail.tests.common import BaseFunctionalTest, MockEmails, TestRecipients
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.addons.test_mail.data.test_mail_data import MAIL_TEMPLATE_PLAINTEXT
|
||||
from odoo.addons.test_mail.models.test_mail_models import MailTestSimple
|
||||
from odoo.exceptions import AccessError
|
||||
@@ -152,12 +153,7 @@ class TestMessagePost(BaseFunctionalTest, MockEmails, TestRecipients):
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_post_portal_ok(self):
|
||||
portal_user = self.env['res.users'].with_context(self._quick_create_user_ctx).create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])],
|
||||
})
|
||||
portal_user = mail_new_test_user(self.env, login='chell', groups='base.group_portal', name='Chell Gladys')
|
||||
|
||||
with patch.object(MailTestSimple, 'check_access_rights', return_value=True):
|
||||
self.test_record.message_subscribe((self.partner_1 | self.user_employee.partner_id).ids)
|
||||
@@ -169,12 +165,7 @@ class TestMessagePost(BaseFunctionalTest, MockEmails, TestRecipients):
|
||||
self.assertEmails(portal_user.partner_id, [[self.partner_1], [self.user_employee.partner_id]])
|
||||
|
||||
def test_post_portal_crash(self):
|
||||
portal_user = self.env['res.users'].with_context(self._quick_create_user_ctx).create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])],
|
||||
})
|
||||
portal_user = mail_new_test_user(self.env, login='chell', groups='base.group_portal', name='Chell Gladys')
|
||||
|
||||
with self.assertRaises(AccessError):
|
||||
self.test_record.sudo(portal_user).message_post(
|
||||
@@ -278,7 +269,7 @@ class TestComposer(BaseFunctionalTest, MockEmails, TestRecipients):
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_composer_mass_mail(self):
|
||||
test_record_2 = self.env['mail.test.simple'].with_context(self._quick_create_ctx).create({'name': 'Test2'})
|
||||
test_record_2 = self.env['mail.test.simple'].with_context(BaseFunctionalTest._test_context).create({'name': 'Test2'})
|
||||
|
||||
composer = self.env['mail.compose.message'].with_context({
|
||||
'default_composition_mode': 'mass_mail',
|
||||
@@ -313,7 +304,7 @@ class TestComposer(BaseFunctionalTest, MockEmails, TestRecipients):
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_composer_mass_mail_active_domain(self):
|
||||
test_record_2 = self.env['mail.test.simple'].with_context(self._quick_create_ctx).create({'name': 'Test2'})
|
||||
test_record_2 = self.env['mail.test.simple'].with_context(BaseFunctionalTest._test_context).create({'name': 'Test2'})
|
||||
|
||||
self.env['mail.compose.message'].with_context({
|
||||
'default_composition_mode': 'mass_mail',
|
||||
@@ -331,7 +322,7 @@ class TestComposer(BaseFunctionalTest, MockEmails, TestRecipients):
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_message_compose_mass_mail_no_active_domain(self):
|
||||
test_record_2 = self.env['mail.test.simple'].with_context(self._quick_create_ctx).create({'name': 'Test2'})
|
||||
test_record_2 = self.env['mail.test.simple'].with_context(BaseFunctionalTest._test_context).create({'name': 'Test2'})
|
||||
|
||||
self.env['mail.compose.message'].with_context({
|
||||
'default_composition_mode': 'mass_mail',
|
||||
@@ -349,12 +340,7 @@ class TestComposer(BaseFunctionalTest, MockEmails, TestRecipients):
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_message_compose_portal_ok(self):
|
||||
portal_user = self.env['res.users'].with_context(self._quick_create_ctx).create({
|
||||
'name': 'Chell Gladys',
|
||||
'login': 'chell',
|
||||
'email': 'chell@gladys.portal',
|
||||
'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])],
|
||||
})
|
||||
portal_user = mail_new_test_user(self.env, login='chell', groups='base.group_portal', name='Chell Gladys')
|
||||
|
||||
with patch.object(MailTestSimple, 'check_access_rights', return_value=True):
|
||||
ComposerPortal = self.env['mail.compose.message'].sudo(portal_user)
|
||||
|
||||
@@ -26,7 +26,7 @@ class TestTracking(common.BaseFunctionalTest, common.MockEmails):
|
||||
def setUp(self):
|
||||
super(TestTracking, self).setUp()
|
||||
|
||||
record = self.env['mail.test.full'].sudo(self.user_employee).with_context(self._quick_create_ctx).create({
|
||||
record = self.env['mail.test.full'].sudo(self.user_employee).with_context(common.BaseFunctionalTest._test_context).create({
|
||||
'name': 'Test',
|
||||
})
|
||||
self.record = record.with_context(mail_notrack=False)
|
||||
|
||||
@@ -3,3 +3,8 @@
|
||||
|
||||
from . import test_blacklist
|
||||
from . import test_blacklist_mixin
|
||||
from . import test_composer
|
||||
from . import test_mail_auto_blacklist
|
||||
from . import test_mail_channel
|
||||
from . import test_mass_mailing
|
||||
from . import test_performance
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.addons.test_mail.tests import common
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.tests import tagged
|
||||
|
||||
|
||||
@@ -17,14 +18,7 @@ class MassMailingCase(common.MockEmails, common.BaseFunctionalTest):
|
||||
'login': 'emp',
|
||||
})
|
||||
|
||||
cls.user_marketing = cls.env['res.users'].with_context(cls._quick_create_user_ctx).create({
|
||||
'name': 'Ernest Employee',
|
||||
'login': 'marketing',
|
||||
'email': 'e.e@example.com',
|
||||
'signature': '--\nErnest',
|
||||
'notification_type': 'email',
|
||||
'groups_id': [
|
||||
(6, 0, [cls.env.ref('base.group_user').id]),
|
||||
(6, 0, [cls.env.ref('mass_mailing.group_mass_mailing_user').id])
|
||||
],
|
||||
})
|
||||
cls.user_marketing = mail_new_test_user(
|
||||
cls.env, login='marketing',
|
||||
groups='base.group_user,mass_mailing.group_mass_mailing_user',
|
||||
name='Martial Marketing', signature='--\nMartial')
|
||||
|
||||
@@ -2,21 +2,63 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.tests.common import users
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.addons.test_mass_mailing.tests import common
|
||||
from odoo.exceptions import AccessError
|
||||
|
||||
|
||||
class TestBLAccessRights(common.MassMailingCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestBLAccessRights, self).setUp()
|
||||
self.bl_rec = self.env['mail.blacklist'].create([
|
||||
{'email': 'Not A Stark <john.snow@example.com>'},
|
||||
])
|
||||
|
||||
self.user_portal = mail_new_test_user(self.env, login='port', groups='base.group_portal')
|
||||
|
||||
self.bl_previous = self.env['mail.blacklist'].search([])
|
||||
|
||||
@users('emp')
|
||||
def test_bl_create_employee(self):
|
||||
def test_bl_crud_employee(self):
|
||||
with self.assertRaises(AccessError):
|
||||
self.env['mail.blacklist'].create([{'email': 'Arya.Stark@example.com'}])
|
||||
|
||||
with self.assertRaises(AccessError):
|
||||
self.bl_rec.sudo(self.env.user).read([])
|
||||
|
||||
with self.assertRaises(AccessError):
|
||||
self.bl_rec.sudo(self.env.user).write({'email': 'jaimie.lannister@example.com'})
|
||||
|
||||
with self.assertRaises(AccessError):
|
||||
self.bl_rec.sudo(self.env.user).unlink()
|
||||
|
||||
@users('port')
|
||||
def test_bl_crud_portal(self):
|
||||
with self.assertRaises(AccessError):
|
||||
self.env['mail.blacklist'].create([{'email': 'Arya.Stark@example.com'}])
|
||||
|
||||
with self.assertRaises(AccessError):
|
||||
self.bl_rec.sudo(self.env.user).read([])
|
||||
|
||||
with self.assertRaises(AccessError):
|
||||
self.bl_rec.sudo(self.env.user).write({'email': 'jaimie.lannister@example.com'})
|
||||
|
||||
with self.assertRaises(AccessError):
|
||||
self.bl_rec.sudo(self.env.user).unlink()
|
||||
|
||||
@users('marketing')
|
||||
def test_bl_create_marketing(self):
|
||||
def test_bl_crud_marketing(self):
|
||||
self.env['mail.blacklist'].create([{'email': 'Arya.Stark@example.com'}])
|
||||
|
||||
read_res = self.bl_rec.sudo(self.env.user).read([])
|
||||
self.assertEqual(read_res[0]['id'], self.bl_rec.id)
|
||||
|
||||
self.bl_rec.sudo(self.env.user).write({'email': 'jaimie.lannister@example.com'})
|
||||
self.assertEqual(self.bl_rec.email, 'jaimie.lannister@example.com')
|
||||
|
||||
self.bl_rec.sudo(self.env.user).unlink()
|
||||
|
||||
|
||||
class TestBLConsistency(common.MassMailingCase):
|
||||
_base_list = ['Arya.Stark@example.com', 'ned.stark@example.com']
|
||||
@@ -101,6 +143,15 @@ class TestBLConsistency(common.MassMailingCase):
|
||||
search_res = self.env['mail.blacklist'].search([('email', '=', 'Not A Stark <john.snow@example.com>')])
|
||||
self.assertEqual(search_res, self.bl_rec)
|
||||
|
||||
search_res = self.env['mail.blacklist'].search([('email', '=', '"John J. Snow" <john.snow@example.com>')])
|
||||
self.assertEqual(search_res, self.bl_rec)
|
||||
|
||||
search_res = self.env['mail.blacklist'].search([('email', '=', 'Aegon? <john.snow@example.com>')])
|
||||
self.assertEqual(search_res, self.bl_rec)
|
||||
|
||||
search_res = self.env['mail.blacklist'].search([('email', '=', '"John; \"You know Nothing\" Snow" <john.snow@example.com>')])
|
||||
self.assertEqual(search_res, self.bl_rec)
|
||||
|
||||
@users('marketing')
|
||||
def test_bl_search_case(self):
|
||||
search_res = self.env['mail.blacklist'].search([('email', '=', 'john.SNOW@example.COM>')])
|
||||
|
||||
+9
-18
@@ -1,36 +1,27 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.addons.test_mail.tests.common import mail_new_test_user
|
||||
from odoo.tests import common
|
||||
|
||||
|
||||
class TestResponsiveMail(common.SavepointCase):
|
||||
class TestComposer(common.SavepointCase):
|
||||
|
||||
def test_responsive_mail(self):
|
||||
def test_body_responsive(self):
|
||||
""" Testing mail mailing responsive mail body """
|
||||
self.user_employee = self.env['res.users'].with_context({
|
||||
'mail_create_nolog': True,
|
||||
'mail_create_nosubscribe': True,
|
||||
'mail_notrack': True,
|
||||
'no_reset_password': True,
|
||||
}).create({
|
||||
'name': 'Geraldine Mass Mailing User',
|
||||
'login': 'geraldine',
|
||||
'email': 'g.g@example.com',
|
||||
'groups_id': [(6, 0, [
|
||||
self.env.ref('mass_mailing.group_mass_mailing_user').id,
|
||||
self.env.ref('base.group_partner_manager').id, # TDE FIXME: check if really necessary for mass mailing
|
||||
])],
|
||||
})
|
||||
test_user = mail_new_test_user(
|
||||
self.env, login='geraldine',
|
||||
groups='mass_mailing.group_mass_mailing_user,base.group_partner_manager' # TDE FIXME: check if really necessary for mass mailing
|
||||
)
|
||||
|
||||
test_record = self.env['res.partner'].create({'name': 'Mass Mail Partner'})
|
||||
mass_mail_record = self.env['mail.mass_mailing'].sudo(self.user_employee).create({
|
||||
mass_mail_record = self.env['mail.mass_mailing'].sudo(test_user).create({
|
||||
'name': 'Test',
|
||||
'state': 'draft',
|
||||
'mailing_model_id': self.env.ref('base.model_res_partner').id,
|
||||
})
|
||||
|
||||
composer = self.env['mail.compose.message'].sudo(self.user_employee).with_context({
|
||||
composer = self.env['mail.compose.message'].sudo(test_user).with_context({
|
||||
'default_composition_mode': 'mass_mail',
|
||||
'default_model': 'res.partner',
|
||||
'default_res_id': test_record.id,
|
||||
+64
-3
@@ -1,9 +1,70 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
from odoo.tests import common
|
||||
|
||||
from unittest.mock import patch
|
||||
from werkzeug import urls
|
||||
|
||||
from odoo.addons.test_mass_mailing.tests.common import MassMailingCase
|
||||
from odoo.addons.base.models.ir_config_parameter import IrConfigParameter
|
||||
from odoo.tests.common import TransactionCase, users
|
||||
from odoo.tools import mute_logger
|
||||
|
||||
|
||||
class TestAccessRights(common.TransactionCase):
|
||||
class TestMassMail(MassMailingCase):
|
||||
|
||||
def setUp(self):
|
||||
""" In this setup we prepare 20 blacklist entries. We therefore add
|
||||
20 recipients compared to first test in order to have comparable results. """
|
||||
super(TestMassMail, self).setUp()
|
||||
values = [{
|
||||
'name': 'Recipient %s' % x,
|
||||
'email_from': 'Recipient <rec.%s@example.com>' % x,
|
||||
} for x in range(0, 6)]
|
||||
self.mm_recs = self.env['mass.mail.test.bl'].create(values)
|
||||
|
||||
self.env['mail.blacklist'].create({
|
||||
'email': 'rec.2@example.com'
|
||||
})
|
||||
|
||||
self.test_medium = self.env['utm.medium'].create({'name': 'TestMedium'})
|
||||
|
||||
@users('marketing')
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
|
||||
def test_link_tracker(self):
|
||||
_url = 'https://www.example.com/foo/bar?baz=qux'
|
||||
mailing = self.env['mail.mass_mailing'].create({
|
||||
'name': 'TestMailing',
|
||||
'medium_id': self.test_medium.id,
|
||||
'body_html': '<p>Hello <a role="button" href="%s">${object.name}</a><a role="button" href="/unsubscribe_from_list">Unsubscribe</a></p>' % _url,
|
||||
'reply_to_mode': 'email',
|
||||
'mailing_model_id': self.ref('test_mass_mailing.model_mass_mail_test_bl'),
|
||||
'mailing_domain': [('id', 'in', self.mm_recs.ids)],
|
||||
})
|
||||
|
||||
mailing.send_mail()
|
||||
|
||||
# basic test emails are sent
|
||||
self.assertEqual(mailing.sent, 5)
|
||||
self.assertEqual(mailing.delivered, 5)
|
||||
|
||||
# link trackers
|
||||
links = self.env['link.tracker'].sudo().search([('mass_mailing_id', '=', mailing.id)])
|
||||
self.assertEqual(len(links), 1)
|
||||
self.assertEqual(links.mapped('url'), [_url])
|
||||
# check UTMS are correctly set on redirect URL
|
||||
redirect_url = urls.url_parse(links.redirected_url)
|
||||
redirect_params = redirect_url.decode_query().to_dict(flat=True)
|
||||
self.assertEqual(redirect_url.scheme, 'https')
|
||||
self.assertEqual(redirect_url.decode_netloc(), 'www.example.com')
|
||||
self.assertEqual(redirect_url.path, '/foo/bar')
|
||||
self.assertEqual(redirect_params, {
|
||||
'utm_source': mailing.name,
|
||||
'utm_medium': self.test_medium.name,
|
||||
'baz': 'qux',
|
||||
})
|
||||
|
||||
|
||||
class TestAccessRights(TransactionCase):
|
||||
|
||||
def test_01_mass_mail_blacklist(self):
|
||||
mass_mailing_contacts = self.env['mail.mass_mailing.contact']
|
||||
@@ -204,7 +265,7 @@ class TestAccessRights(common.TransactionCase):
|
||||
'Opt Out ignored email number incorrect, should be equals to 1')
|
||||
|
||||
|
||||
class TestOnResPartner(common.TransactionCase):
|
||||
class TestOnResPartner(TransactionCase):
|
||||
|
||||
def test_mass_mail_on_res_partner(self):
|
||||
partners = self.env['res.partner']
|
||||
@@ -0,0 +1,74 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.addons.test_mass_mailing.tests import common
|
||||
from odoo.tests.common import users, warmup
|
||||
from odoo.tests import tagged
|
||||
from odoo.tools import mute_logger
|
||||
|
||||
|
||||
@tagged('mail_performance')
|
||||
class TestMassMailPerformance(common.MassMailingCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestMassMailPerformance, self).setUp()
|
||||
values = [{
|
||||
'name': 'Recipient %s' % x,
|
||||
'email_from': 'Recipient <rec.%s@example.com>' % x,
|
||||
} for x in range(0, 50)]
|
||||
self.mm_recs = self.env['mass.mail.test'].create(values)
|
||||
|
||||
@users('__system__', 'marketing')
|
||||
@warmup
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
|
||||
def test_send_mailing(self):
|
||||
mailing = self.env['mail.mass_mailing'].create({
|
||||
'name': 'Test',
|
||||
'body_html': '<p>Hello <a role="button" href="https://www.example.com/foo/bar?baz=qux">quux</a><a role="button" href="/unsubscribe_from_list">Unsubscribe</a></p>',
|
||||
'reply_to_mode': 'email',
|
||||
'mailing_model_id': self.ref('test_mass_mailing.model_mass_mail_test'),
|
||||
'mailing_domain': [('id', 'in', self.mm_recs.ids)],
|
||||
})
|
||||
|
||||
with self.assertQueryCount(__system__=2382, marketing=3038):
|
||||
mailing.send_mail()
|
||||
|
||||
self.assertEqual(mailing.sent, 50)
|
||||
self.assertEqual(mailing.delivered, 50)
|
||||
|
||||
|
||||
@tagged('mail_performance')
|
||||
class TestMassMailBlPerformance(common.MassMailingCase):
|
||||
|
||||
def setUp(self):
|
||||
""" In this setup we prepare 20 blacklist entries. We therefore add
|
||||
20 recipients compared to first test in order to have comparable results. """
|
||||
super(TestMassMailBlPerformance, self).setUp()
|
||||
values = [{
|
||||
'name': 'Recipient %s' % x,
|
||||
'email_from': 'Recipient <rec.%s@example.com>' % x,
|
||||
} for x in range(0, 62)]
|
||||
self.mm_recs = self.env['mass.mail.test.bl'].create(values)
|
||||
|
||||
for x in range(1, 13):
|
||||
self.env['mail.blacklist'].create({
|
||||
'email': 'rec.%s@example.com' % (x * 5)
|
||||
})
|
||||
|
||||
@users('__system__', 'marketing')
|
||||
@warmup
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
|
||||
def test_send_mailing_w_bl(self):
|
||||
mailing = self.env['mail.mass_mailing'].create({
|
||||
'name': 'Test',
|
||||
'body_html': '<p>Hello <a role="button" href="https://www.example.com/foo/bar?baz=qux">quux</a><a role="button" href="/unsubscribe_from_list">Unsubscribe</a></p>',
|
||||
'reply_to_mode': 'email',
|
||||
'mailing_model_id': self.ref('test_mass_mailing.model_mass_mail_test_bl'),
|
||||
'mailing_domain': [('id', 'in', self.mm_recs.ids)],
|
||||
})
|
||||
|
||||
with self.assertQueryCount(__system__=2757, marketing=3509):
|
||||
mailing.send_mail()
|
||||
|
||||
self.assertEqual(mailing.sent, 50)
|
||||
self.assertEqual(mailing.delivered, 50)
|
||||
@@ -34,6 +34,7 @@ from lxml import etree, html
|
||||
from odoo.models import BaseModel
|
||||
from odoo.osv.expression import normalize_domain
|
||||
from odoo.tools import pycompat
|
||||
from odoo.tools import single_email_re
|
||||
from odoo.tools.misc import find_in_path
|
||||
from odoo.tools.safe_eval import safe_eval
|
||||
|
||||
@@ -116,6 +117,50 @@ def post_install(flag):
|
||||
"""
|
||||
return tagged('post_install' if flag else '-post_install')
|
||||
|
||||
|
||||
def new_test_user(env, login='', groups='base.group_user', context=None, **kwargs):
|
||||
""" Helper function to create a new test user. It allows to quickly create
|
||||
users given its login and groups (being a comma separated list of xml ids).
|
||||
Kwargs are directly propagated to the create to further customize the
|
||||
created user.
|
||||
|
||||
User creation uses a potentially customized environment using the context
|
||||
parameter allowing to specify a custom context. It can be used to force a
|
||||
specific behavior and/or simplify record creation. An example is to use
|
||||
mail-related context keys in mail tests to speedup record creation.
|
||||
|
||||
Some specific fields are automatically filled to avoid issues
|
||||
|
||||
* groups_id: it is filled using groups function parameter;
|
||||
* name: "login (groups)" by default as it is required;
|
||||
* email: it is either the login (if it is a valid email) or a generated
|
||||
string 'x.x@example.com' (x being the first login letter). This is due
|
||||
to email being required for most odoo operations;
|
||||
"""
|
||||
if not login:
|
||||
raise ValueError('New users require at least a login')
|
||||
if not groups:
|
||||
raise ValueError('New users require at least user groups')
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
groups_id = [(6, 0, [env.ref(g).id for g in groups.split(',')])]
|
||||
create_values = dict(kwargs, login=login, groups_id=groups_id)
|
||||
if not create_values.get('name'):
|
||||
create_values['name'] = '%s (%s)' % (login, groups)
|
||||
if not create_values.get('email'):
|
||||
if single_email_re.match(login):
|
||||
create_values['email'] = login
|
||||
else:
|
||||
create_values['email'] = '%s.%s@example.com' % (login[0], login[0])
|
||||
|
||||
return env['res.users'].with_context(**context).create(create_values)
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Main classes
|
||||
# ------------------------------------------------------------
|
||||
|
||||
|
||||
class TreeCase(unittest.TestCase):
|
||||
def __init__(self, methodName='runTest'):
|
||||
super(TreeCase, self).__init__(methodName)
|
||||
@@ -315,6 +360,7 @@ class BaseCase(TreeCase, MetaCase('DummyCase', (object,), {})):
|
||||
def assertItemsEqual(self, a, b, msg=None):
|
||||
self.assertCountEqual(a, b, msg=None)
|
||||
|
||||
|
||||
class TransactionCase(BaseCase):
|
||||
""" TestCase in which each test method is run in its own transaction,
|
||||
and with its own cursor. The transaction is rolled back and the cursor
|
||||
|
||||
Reference in New Issue
Block a user