[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:
Robot Odoo
2018-10-18 17:30:06 +02:00
committed by GitHub
28 changed files with 330 additions and 361 deletions
+2 -14
View File
@@ -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')
+10 -33
View File
@@ -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)
+1 -1
View File
@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
14 access_ir_mail_server access_ir_mail_server base.model_ir_mail_server mass_mailing.group_mass_mailing_user 1 0 0 0
15 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
16 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
17 access_link_tracker_mailing access.link.tracker.mailing link_tracker.model_link_tracker mass_mailing.group_mass_mailing_user 1 1 1 1
-5
View File
@@ -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.')
+16 -25
View File
@@ -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})]})
+3 -8
View File
@@ -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')):
+1 -1
View File
@@ -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'})
+3 -8
View File
@@ -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)
+6 -14
View File
@@ -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 -13
View File
@@ -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',
})
+3 -2
View File
@@ -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)
+1 -6
View File
@@ -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',
+5 -13
View File
@@ -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',
+8 -19
View File
@@ -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'
})
+2 -1
View File
@@ -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 -21
View File
@@ -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)
+1 -1
View File
@@ -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
+5 -11
View File
@@ -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>')])
@@ -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,
@@ -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)
+46
View File
@@ -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