[REF] event(_*): clean tests common files

Purpose is to have a common event class for users and useful stuff (customers,
products, ...) but lessen usage of common test data through sub modules.
Indeed having a "global event type" test data updated in various addons is
actually complicated to maintain.

Sub add-ons are updated to use mainly the ``EventCase`` test class holding
users and side data. Data specific to those modules (event type with some
specific configuration notably) is created and used in tests in the given
module only, and not through generic event_type_complex and event_0 test
data anymore.

With this commit tests are more localized to their add-on and modifying data
in a given add-on has less chances to have unwanted side effect in other event
submodules unit tests.

Task-2703285 (Event performance improvements)
Task-2703289 (Event testing and coverage)

Part-of: odoo/odoo#81068
This commit is contained in:
Thibault Delavallée
2021-12-16 17:33:47 +00:00
parent 62dbff18ca
commit db19463f25
21 changed files with 314 additions and 222 deletions
+51 -59
View File
@@ -1,52 +1,79 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime, timedelta
from odoo import fields
from odoo.addons.mail.tests.common import mail_new_test_user
from odoo.tests import common
class TestEventCommon(common.TransactionCase):
class EventCase(common.TransactionCase):
@classmethod
def setUpClass(cls):
super(TestEventCommon, cls).setUpClass()
super(EventCase, cls).setUpClass()
cls.admin_user = cls.env.ref('base.user_admin')
cls.admin_user.write({
'country_id': cls.env.ref('base.be').id,
'login': 'admin',
'notification_type': 'inbox',
})
cls.company_admin = cls.admin_user.company_id
# set country in order to format Belgian numbers
cls.company_admin.write({
'country_id': cls.env.ref('base.be').id,
})
# Test users to use through the various tests
cls.user_portal = mail_new_test_user(
cls.env, login='portal_test',
name='Patrick Portal', email='patrick.portal@test.example.com',
notification_type='email', company_id=cls.env.ref("base.main_company").id,
groups='base.group_portal')
cls.env,
company_id=cls.company_admin.id,
email='patrick.portal@test.example.com',
groups='base.group_portal',
login='portal_test',
name='Patrick Portal',
notification_type='email',
tz='Europe/Brussels',
)
cls.user_employee = mail_new_test_user(
cls.env, login='user_employee',
name='Eglantine Employee', email='eglantine.employee@test.example.com',
tz='Europe/Brussels', notification_type='inbox',
company_id=cls.env.ref("base.main_company").id,
cls.env,
company_id=cls.company_admin.id,
email='eglantine.employee@test.example.com',
groups='base.group_user',
login='user_employee',
name='Eglantine Employee',
notification_type='inbox',
tz='Europe/Brussels',
)
cls.user_eventregistrationdesk = mail_new_test_user(
cls.env, login='user_eventregistrationdesk',
name='Ursule EventRegistration', email='ursule.eventregistration@test.example.com',
tz='Europe/Brussels', notification_type='inbox',
company_id=cls.env.ref("base.main_company").id,
cls.env,
company_id=cls.company_admin.id,
email='ursule.eventregistration@test.example.com',
login='user_eventregistrationdesk',
groups='base.group_user,event.group_event_registration_desk',
name='Ursule EventRegistration',
notification_type='inbox',
tz='Europe/Brussels',
)
cls.user_eventuser = mail_new_test_user(
cls.env, login='user_eventuser',
name='Ursule EventUser', email='ursule.eventuser@test.example.com',
tz='Europe/Brussels', notification_type='inbox',
company_id=cls.env.ref("base.main_company").id,
cls.env,
company_id=cls.company_admin.id,
email='ursule.eventuser@test.example.com',
groups='base.group_user,event.group_event_user',
login='user_eventuser',
name='Ursule EventUser',
notification_type='inbox',
tz='Europe/Brussels',
)
cls.user_eventmanager = mail_new_test_user(
cls.env, login='user_eventmanager',
name='Martine EventManager', email='martine.eventmanager@test.example.com',
tz='Europe/Brussels', notification_type='inbox',
company_id=cls.env.ref("base.main_company").id,
cls.env,
company_id=cls.company_admin.id,
email='martine.eventmanager@test.example.com',
groups='base.group_user,event.group_event_manager',
login='user_eventmanager',
name='Martine EventManager',
notification_type='inbox',
tz='Europe/Brussels',
)
cls.event_customer = cls.env['res.partner'].create({
@@ -64,41 +91,6 @@ class TestEventCommon(common.TransactionCase):
'mobile': '0456654321',
})
cls.event_type_complex = cls.env['event.type'].create({
'name': 'Update Type',
'auto_confirm': True,
'has_seats_limitation': True,
'seats_max': 30,
'default_timezone': 'Europe/Paris',
'event_type_ticket_ids': [(0, 0, {
'name': 'First Ticket',
}), (0, 0, {
'name': 'Second Ticket',
})
],
'event_type_mail_ids': [
(0, 0, { # right at subscription
'interval_unit': 'now',
'interval_type': 'after_sub',
'template_ref': 'mail.template,%i' % cls.env['ir.model.data']._xmlid_to_res_id('event.event_subscription')}),
(0, 0, { # 1 days before event
'interval_nbr': 1,
'interval_unit': 'days',
'interval_type': 'before_event',
'template_ref': 'mail.template,%i' % cls.env['ir.model.data']._xmlid_to_res_id('event.event_reminder')}),
],
})
cls.event_0 = cls.env['event.event'].create({
'name': 'TestEvent',
'auto_confirm': True,
'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)),
'date_tz': 'Europe/Brussels',
})
# set country in order to format Belgian numbers
cls.event_0.company_id.write({'country_id': cls.env.ref('base.be').id})
@classmethod
def _create_registrations(cls, event, reg_count):
# create some registrations
+2 -2
View File
@@ -5,12 +5,12 @@ import datetime
from dateutil.relativedelta import relativedelta
from odoo.addons.event.tests.common import TestEventCommon
from odoo.addons.event.tests.common import EventCase
from odoo.exceptions import ValidationError
from odoo.tools import mute_logger
class TestEventFlow(TestEventCommon):
class TestEventFlow(EventCase):
@mute_logger('odoo.addons.base.models.ir_model', 'odoo.models')
def test_event_auto_confirm(self):
+73 -52
View File
@@ -1,63 +1,95 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import date, datetime, timedelta
from unittest.mock import patch
from datetime import datetime, timedelta
from freezegun import freeze_time
from odoo import Command
from odoo.addons.event.tests.common import TestEventCommon
from odoo.addons.event.tests.common import EventCase
from odoo import exceptions
from odoo.fields import Datetime as FieldsDatetime, Date as FieldsDate
from odoo.fields import Datetime as FieldsDatetime
from odoo.tests.common import users, Form
from odoo.tools import mute_logger
class TestEventData(TestEventCommon):
class TestEventInternalsCommon(EventCase):
@classmethod
def setUpClass(cls):
super(TestEventData, cls).setUpClass()
cls.patcher = patch('odoo.addons.event.models.event_event.fields.Datetime', wraps=FieldsDatetime)
cls.mock_datetime = cls.patcher.start()
cls.mock_datetime.now.return_value = datetime(2020, 1, 31, 10, 0, 0)
cls.addClassCleanup(cls.patcher.stop)
super(TestEventInternalsCommon, cls).setUpClass()
cls.event_0.write({
'date_begin': datetime(2020, 2, 1, 8, 30, 0),
'date_end': datetime(2020, 2, 4, 18, 45, 0),
cls.event_type_complex = cls.env['event.type'].create({
'name': 'Update Type',
'auto_confirm': True,
'has_seats_limitation': True,
'seats_max': 30,
'default_timezone': 'Europe/Paris',
'event_type_ticket_ids': [
(0, 0, {'name': 'First Ticket',}),
(0, 0, {'name': 'Second Ticket',}),
],
'event_type_mail_ids': [
(0, 0, { # right at subscription
'interval_unit': 'now',
'interval_type': 'after_sub',
'template_ref': 'mail.template,%i' % cls.env['ir.model.data']._xmlid_to_res_id('event.event_subscription')}),
(0, 0, { # 1 days before event
'interval_nbr': 1,
'interval_unit': 'days',
'interval_type': 'before_event',
'template_ref': 'mail.template,%i' % cls.env['ir.model.data']._xmlid_to_res_id('event.event_reminder')}),
],
})
# Mock dates to have reproducible computed fields based on time
cls.reference_now = datetime(2020, 1, 31, 10, 0, 0)
cls.reference_beg = datetime(2020, 2, 1, 8, 30, 0)
cls.reference_end = datetime(2020, 2, 4, 18, 45, 0)
cls.event_0 = cls.env['event.event'].create({
'auto_confirm': True,
'date_begin': cls.reference_beg,
'date_end': cls.reference_end,
'date_tz': 'Europe/Brussels',
'name': 'TestEvent',
})
class TestEventData(TestEventInternalsCommon):
@users('user_eventmanager')
def test_event_date_computation(self):
event = self.event_0.with_user(self.env.user)
event.write({
'registration_ids': [(0, 0, {'partner_id': self.event_customer.id, 'name': 'test_reg'})],
'date_begin': datetime(2020, 1, 31, 15, 0, 0),
'date_end': datetime(2020, 4, 5, 18, 0, 0),
})
registration = event.registration_ids[0]
self.assertEqual(registration.get_date_range_str(), u'today')
with freeze_time(self.reference_now):
event.write({
'registration_ids': [(0, 0, {'partner_id': self.event_customer.id, 'name': 'test_reg'})],
'date_begin': datetime(2020, 1, 31, 15, 0, 0),
'date_end': datetime(2020, 4, 5, 18, 0, 0),
})
registration = event.registration_ids[0]
self.assertEqual(registration.get_date_range_str(), u'today')
event.date_begin = datetime(2020, 2, 1, 15, 0, 0)
self.assertEqual(registration.get_date_range_str(), u'tomorrow')
event.date_begin = datetime(2020, 2, 1, 15, 0, 0)
self.assertEqual(registration.get_date_range_str(), u'tomorrow')
event.date_begin = datetime(2020, 2, 2, 6, 0, 0)
self.assertEqual(registration.get_date_range_str(), u'in 2 days')
event.date_begin = datetime(2020, 2, 2, 6, 0, 0)
self.assertEqual(registration.get_date_range_str(), u'in 2 days')
event.date_begin = datetime(2020, 2, 20, 17, 0, 0)
self.assertEqual(registration.get_date_range_str(), u'next month')
event.date_begin = datetime(2020, 2, 20, 17, 0, 0)
self.assertEqual(registration.get_date_range_str(), u'next month')
event.date_begin = datetime(2020, 3, 1, 10, 0, 0)
self.assertEqual(registration.get_date_range_str(), u'on Mar 1, 2020, 11:00:00 AM')
event.date_begin = datetime(2020, 3, 1, 10, 0, 0)
self.assertEqual(registration.get_date_range_str(), u'on Mar 1, 2020, 11:00:00 AM')
# Is actually 8:30 to 20:00 in Mexico
event.write({
'date_begin': datetime(2020, 1, 31, 14, 30, 0),
'date_end': datetime(2020, 2, 1, 2, 0, 0),
'date_tz': 'Mexico/General'
})
self.assertTrue(event.is_one_day)
# Is actually 8:30 to 20:00 in Mexico
event.write({
'date_begin': datetime(2020, 1, 31, 14, 30, 0),
'date_end': datetime(2020, 2, 1, 2, 0, 0),
'date_tz': 'Mexico/General'
})
self.assertTrue(event.is_one_day)
@freeze_time('2020-1-31 10:00:00')
@users('user_eventmanager')
def test_event_date_timezone(self):
event = self.event_0.with_user(self.env.user)
@@ -349,6 +381,7 @@ class TestEventData(TestEventCommon):
templates = self.env['mail.template'].with_context(filter_template_on_event=True).name_search('test template')
self.assertEqual(len(templates), 1, 'Should return only mail templates related to the event registration model')
@freeze_time('2020-1-31 10:00:00')
@users('user_eventmanager')
def test_event_registrable(self):
"""Test if `_compute_event_registrations_open` works properly."""
@@ -401,6 +434,7 @@ class TestEventData(TestEventCommon):
self.assertTrue(ticket.is_expired)
self.assertFalse(event.event_registrations_open)
@freeze_time('2020-1-31 10:00:00')
@users('user_eventmanager')
def test_event_ongoing(self):
event_1 = self.env['event.event'].create({
@@ -475,7 +509,7 @@ class TestEventData(TestEventCommon):
self.assertEqual(event.seats_expected, 7)
class TestEventRegistrationData(TestEventCommon):
class TestEventRegistrationData(TestEventInternalsCommon):
@users('user_eventmanager')
def test_registration_partner_sync(self):
@@ -569,22 +603,9 @@ class TestEventRegistrationData(TestEventCommon):
self.assertEqual(new_reg.phone, contact.phone)
class TestEventTicketData(TestEventCommon):
def setUp(self):
super(TestEventTicketData, self).setUp()
self.ticket_date_patcher = patch('odoo.addons.event.models.event_ticket.fields.Date', wraps=FieldsDate)
self.ticket_date_patcher_mock = self.ticket_date_patcher.start()
self.ticket_date_patcher_mock.context_today.return_value = date(2020, 1, 31)
self.ticket_datetime_patcher = patch('odoo.addons.event.models.event_ticket.fields.Datetime', wraps=FieldsDatetime)
self.ticket_datetime_patcher_mock = self.ticket_datetime_patcher.start()
self.ticket_datetime_patcher_mock.now.return_value = datetime(2020, 1, 31, 10, 0, 0)
def tearDown(self):
super(TestEventTicketData, self).tearDown()
self.ticket_date_patcher.stop()
self.ticket_datetime_patcher.stop()
class TestEventTicketData(TestEventInternalsCommon):
@freeze_time('2020-1-31 10:00:00')
@users('user_eventmanager')
def test_event_ticket_fields(self):
""" Test event ticket fields synchronization """
@@ -657,7 +678,7 @@ class TestEventTicketData(TestEventCommon):
self.assertTrue(second_ticket.is_expired)
class TestEventTypeData(TestEventCommon):
class TestEventTypeData(TestEventInternalsCommon):
@users('user_eventmanager')
def test_event_type_fields(self):
@@ -5,12 +5,12 @@ from datetime import datetime
from dateutil.relativedelta import relativedelta
from freezegun import freeze_time
from odoo.addons.event.tests.common import TestEventCommon
from odoo.addons.event.tests.common import EventCase
from odoo.addons.mail.tests.common import MockEmail
from odoo.tools import formataddr, mute_logger
class TestMailSchedule(TestEventCommon, MockEmail):
class TestMailSchedule(EventCase, MockEmail):
@mute_logger('odoo.addons.base.models.ir_model', 'odoo.models')
def test_event_mail_schedule(self):
+2 -12
View File
@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.event.tests.common import TestEventCommon
from odoo.addons.event.tests.common import EventCase
class TestEventBoothCommon(TestEventCommon):
class TestEventBoothCommon(EventCase):
@classmethod
def setUpClass(cls):
@@ -18,13 +18,3 @@ class TestEventBoothCommon(TestEventCommon):
'name': 'Premium',
'description': '<p>Premium</p>',
})
cls.event_type_complex.write({
'event_type_booth_ids': [
(5, 0),
(0, 0,
{'name': 'Standard 1', 'booth_category_id': cls.event_booth_category_1.id}),
(0, 0,
{'name': 'Premium 1', 'booth_category_id': cls.event_booth_category_2.id}),
],
})
+1 -2
View File
@@ -2,10 +2,9 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.event_booth.tests.common import TestEventBoothCommon
from odoo.addons.event_sale.tests.common import TestEventSaleCommon
class TestEventBoothSaleCommon(TestEventBoothCommon, TestEventSaleCommon):
class TestEventBoothSaleCommon(TestEventBoothCommon):
@classmethod
def setUpClass(cls):
+24 -6
View File
@@ -1,15 +1,18 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime, timedelta
from odoo import fields
from odoo.addons.crm.tests.common import TestCrmCommon
from odoo.addons.event.tests.common import TestEventCommon
from odoo.addons.event.tests.common import EventCase
class TestEventCrmCommon(TestCrmCommon, TestEventCommon):
class EventCrmCase(TestCrmCommon, EventCase):
@classmethod
def setUpClass(cls):
super(TestEventCrmCommon, cls).setUpClass()
super(EventCrmCase, cls).setUpClass()
# avoid clash with existing rules
cls.env['event.lead.rule'].search([]).write({'active': False})
@@ -20,7 +23,6 @@ class TestEventCrmCommon(TestCrmCommon, TestEventCommon):
'name': 'Rule Attendee',
'lead_creation_basis': 'attendee',
'lead_creation_trigger': 'create',
'event_id': cls.event_0.id,
'event_registration_filter': [['email', 'ilike', '@test.example.com']],
'lead_type': 'lead',
'lead_user_id': cls.user_sales_salesman.id,
@@ -31,7 +33,6 @@ class TestEventCrmCommon(TestCrmCommon, TestEventCommon):
'name': 'Rule Order',
'lead_creation_basis': 'order',
'lead_creation_trigger': 'create',
'event_id': cls.event_0.id,
'event_registration_filter': [['email', 'ilike', '@test.example.com']],
'lead_type': 'opportunity',
'lead_user_id': cls.user_sales_leads.id,
@@ -96,7 +97,6 @@ class TestEventCrmCommon(TestCrmCommon, TestEventCommon):
self.assertEqual(lead.partner_id, partner)
self.assertEqual(lead.name, '%s - %s' % (event.name, expected_reg_name))
self.assertNotIn('False', lead.name) # avoid a "Dear False" like construct ^^ (this assert is serious and intended)
self.assertEqual(lead.contact_name, expected_contact_name)
self.assertEqual(lead.partner_name, expected_partner_name)
self.assertEqual(lead.email_from, partner.email if partner else registrations._find_first_notnull('email'))
@@ -120,3 +120,21 @@ class TestEventCrmCommon(TestCrmCommon, TestEventCommon):
self.assertEqual(lead.user_id, rule.lead_user_id)
self.assertEqual(lead.team_id, rule.lead_sales_team_id)
self.assertEqual(lead.tag_ids, rule.lead_tag_ids)
class TestEventCrmCommon(EventCrmCase):
@classmethod
def setUpClass(cls):
super(TestEventCrmCommon, cls).setUpClass()
cls.event_0 = cls.env['event.event'].create({
'name': 'TestEvent',
'auto_confirm': True,
'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)),
'date_tz': 'Europe/Brussels',
})
cls.test_rule_attendee.event_id = cls.event_0.id
cls.test_rule_order.event_id = cls.event_0.id
+28 -2
View File
@@ -1,11 +1,14 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.event.tests.common import TestEventCommon
from datetime import datetime, timedelta
from odoo import fields
from odoo.addons.event.tests.common import EventCase
from odoo.addons.sales_team.tests.common import TestSalesCommon
class TestEventSaleCommon(TestEventCommon, TestSalesCommon):
class TestEventSaleCommon(EventCase, TestSalesCommon):
@classmethod
def setUpClass(cls):
@@ -18,3 +21,26 @@ class TestEventSaleCommon(TestEventCommon, TestSalesCommon):
'standard_price': 30.0,
'detailed_type': 'event',
})
cls.event_type_tickets = cls.env['event.type'].create({
'name': 'Update Type',
'auto_confirm': True,
'has_seats_limitation': True,
'seats_max': 30,
'default_timezone': 'Europe/Paris',
'event_type_ticket_ids': [
(0, 0, {'name': 'First Ticket',
'product_id': cls.event_product.id,
'seats_max': 5,
})
],
'event_type_mail_ids': [],
})
cls.event_0 = cls.env['event.event'].create({
'name': 'TestEvent',
'auto_confirm': True,
'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)),
'date_tz': 'Europe/Brussels',
})
@@ -15,7 +15,8 @@ class TestEventData(TestEventSaleCommon):
def test_event_configuration_from_type(self):
""" In addition to event test, also test tickets configuration coming
from event_sale capabilities. """
event_type = self.event_type_complex.with_user(self.env.user)
event_type = self.event_type_tickets.with_user(self.env.user)
self.assertEqual(event_type.event_type_ticket_ids.description, self.event_product.description_sale)
event = self.env['event.event'].create({
'name': 'Event Update Type',
@@ -23,14 +24,6 @@ class TestEventData(TestEventSaleCommon):
'date_begin': FieldsDatetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': FieldsDatetime.to_string(datetime.today() + timedelta(days=15)),
})
event_type.write({
'event_type_ticket_ids': [(5, 0), (0, 0, {
'name': 'First Ticket',
'product_id': self.event_product.id,
'seats_max': 5,
})]
})
self.assertEqual(event_type.event_type_ticket_ids.description, self.event_product.description_sale)
# synchronize event
event.write({'event_type_id': event_type.id})
+27 -17
View File
@@ -1,14 +1,16 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from dateutil.relativedelta import relativedelta
from datetime import datetime, timedelta
from odoo.addons.event.tests.common import TestEventCommon
from odoo import fields
from odoo.addons.event.tests.common import EventCase
from odoo.addons.phone_validation.tools import phone_validation
from odoo.addons.sms.tests.common import SMSCase
from odoo.tests import users
class TestSMSSchedule(TestEventCommon, SMSCase):
class TestSMSSchedule(EventCase, SMSCase):
@classmethod
def setUpClass(cls):
@@ -27,7 +29,11 @@ class TestSMSSchedule(TestEventCommon, SMSCase):
'lang': '{{ object.partner_id.lang }}'
})
cls.event_0.write({
cls.test_event = cls.env['event.event'].create({
'auto_confirm': True,
'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)),
'date_tz': 'Europe/Brussels',
'event_mail_ids': [
(5, 0),
(0, 0, { # right at subscription
@@ -41,51 +47,55 @@ class TestSMSSchedule(TestEventCommon, SMSCase):
'interval_type': 'before_event',
'notification_type': 'sms',
'template_ref': 'sms.template,%i' % cls.sms_template_rem.id}),
]
],
'name': 'TestEvent',
})
@users('user_eventmanager')
def test_sms_schedule(self):
test_event = self.env['event.event'].browse(self.test_event.ids)
with self.mockSMSGateway():
self._create_registrations(self.event_0, 3)
self._create_registrations(test_event, 3)
# check subscription scheduler
sub_scheduler = self.env['event.mail'].search([('event_id', '=', self.event_0.id), ('interval_type', '=', 'after_sub')])
sub_scheduler = self.env['event.mail'].search([('event_id', '=', test_event.id), ('interval_type', '=', 'after_sub')])
self.assertEqual(len(sub_scheduler), 1)
self.assertEqual(sub_scheduler.scheduled_date, self.event_0.create_date, 'event: incorrect scheduled date for checking controller')
self.assertEqual(sub_scheduler.scheduled_date, test_event.create_date, 'event: incorrect scheduled date for checking controller')
# verify that subscription scheduler was auto-executed after each registration
self.assertEqual(len(sub_scheduler.mail_registration_ids), 3)
self.assertTrue(all(m.mail_sent is True for m in sub_scheduler.mail_registration_ids))
self.assertEqual(sub_scheduler.mapped('mail_registration_ids.registration_id'), self.event_0.registration_ids)
self.assertEqual(sub_scheduler.mapped('mail_registration_ids.registration_id'), test_event.registration_ids)
sanitized_numbers = []
for registration in self.event_0.registration_ids:
for registration in test_event.registration_ids:
reg_sanitized_number = phone_validation.phone_format(registration.phone, 'BE', '32', force_format='E164')
sanitized_numbers.append(reg_sanitized_number)
self.assertSMSOutgoing(
self.env['res.partner'], reg_sanitized_number,
content='%s registration confirmation.' % self.event_0.organizer_id.name)
content='%s registration confirmation.' % test_event.organizer_id.name)
self.assertTrue(sub_scheduler.mail_done)
self.assertEqual(sub_scheduler.mail_count_done, 3)
# clear notification queue to avoid conflicts when checking next notifications
self.env['mail.notification'].search([('sms_number', 'in', sanitized_numbers)]).unlink()
self.env['sms.sms'].search([('number', 'in', sanitized_numbers)]).unlink()
self.env['mail.notification'].sudo().search([('sms_number', 'in', sanitized_numbers)]).unlink()
self.env['sms.sms'].sudo().search([('number', 'in', sanitized_numbers)]).unlink()
# check before event scheduler
before_scheduler = self.env['event.mail'].search([('event_id', '=', self.event_0.id), ('interval_type', '=', 'before_event')])
before_scheduler = self.env['event.mail'].search([('event_id', '=', test_event.id), ('interval_type', '=', 'before_event')])
self.assertEqual(len(before_scheduler), 1, 'event: wrong scheduler creation')
self.assertEqual(before_scheduler.scheduled_date, self.event_0.date_begin + relativedelta(days=-3))
self.assertEqual(before_scheduler.scheduled_date, test_event.date_begin + timedelta(days=-3))
# execute event reminder scheduler explicitly
with self.mockSMSGateway():
before_scheduler.execute()
# verify that subscription scheduler was auto-executed after each registration
for registration in self.event_0.registration_ids:
for registration in test_event.registration_ids:
reg_sanitized_number = phone_validation.phone_format(registration.phone, 'BE', '32', force_format='E164')
self.assertSMSOutgoing(
self.env['res.partner'], reg_sanitized_number,
content='%s reminder' % self.event_0.organizer_id.name)
content='%s reminder' % test_event.organizer_id.name)
self.assertTrue(before_scheduler.mail_done)
self.assertEqual(before_scheduler.mail_count_done, 3)
@@ -1,30 +1,46 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime
from dateutil.relativedelta import relativedelta
from datetime import datetime, timedelta
from odoo.addons.event.tests.common import TestEventCommon
from odoo import fields
from odoo.addons.event.tests.common import EventCase
from odoo.exceptions import AccessError
from odoo.tests.common import users
from odoo.tools import mute_logger
class TestEventSecurity(TestEventCommon):
class TestEventSecurity(EventCase):
@classmethod
def setUpClass(cls):
super(TestEventSecurity, cls).setUpClass()
cls.test_event = cls.env['event.event'].create({
'auto_confirm': True,
'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)),
'date_tz': 'Europe/Brussels',
'name': 'TestEvent',
})
cls.test_event_type = cls.env['event.type'].create({
'auto_confirm': True,
'name': 'Update Type',
})
@users('user_employee')
@mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model')
def test_event_access_employee(self):
# Event: read ok
event = self.event_0.with_user(self.env.user)
event = self.test_event.with_user(self.env.user)
event.read(['name'])
# Event: read only
with self.assertRaises(AccessError):
self.env['event.event'].create({
'name': 'TestEvent',
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
'date_begin': datetime.now() + timedelta(days=-1),
'date_end': datetime.now() + timedelta(days=1),
'seats_limited': True,
'seats_max': 10,
})
@@ -35,9 +51,9 @@ class TestEventSecurity(TestEventCommon):
# Event Type
with self.assertRaises(AccessError):
self.event_type_complex.with_user(self.env.user).read(['name'])
self.test_event_type.with_user(self.env.user).read(['name'])
with self.assertRaises(AccessError):
self.event_type_complex.with_user(self.env.user).write({'name': 'Test Write'})
self.test_event_type.with_user(self.env.user).write({'name': 'Test Write'})
# Event Stage
with self.assertRaises(AccessError):
@@ -53,7 +69,7 @@ class TestEventSecurity(TestEventCommon):
@mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model')
def test_event_access_event_registration(self):
# Event: read ok
event = self.event_0.with_user(self.env.user)
event = self.test_event.with_user(self.env.user)
event.read(['name', 'user_id', 'kanban_state_label'])
# Event: read only
@@ -64,9 +80,9 @@ class TestEventSecurity(TestEventCommon):
# Event Registration
registration = self.env['event.registration'].create({
'event_id': self.event_0.id,
'event_id': self.test_event.id,
})
self.assertEqual(registration.event_id.name, self.event_0.name, 'Registration users should be able to read')
self.assertEqual(registration.event_id.name, self.test_event.name, 'Registration users should be able to read')
registration.name = 'Test write'
with self.assertRaises(AccessError):
registration.unlink()
@@ -75,13 +91,13 @@ class TestEventSecurity(TestEventCommon):
@mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model')
def test_event_access_event_user(self):
# Event
event = self.event_0.with_user(self.env.user)
event = self.test_event.with_user(self.env.user)
event.read(['name', 'user_id', 'kanban_state_label'])
event.write({'name': 'New name'})
self.env['event.event'].create({
'name': 'Event',
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
'date_begin': datetime.now() + timedelta(days=-1),
'date_end': datetime.now() + timedelta(days=1),
})
# Event: cannot unlink
@@ -112,8 +128,8 @@ class TestEventSecurity(TestEventCommon):
# Event
event = self.env['event.event'].create({
'name': 'ManagerEvent',
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
'date_begin': datetime.now() + timedelta(days=-1),
'date_end': datetime.now() + timedelta(days=1),
})
event.write({'name': 'New Event Name'})
@@ -180,13 +196,13 @@ class TestEventSecurity(TestEventCommon):
event_company_1, event_company_2 = self.env['event.event'].create([
{
'name': 'Event Company 1',
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
'date_begin': datetime.now() + timedelta(days=-1),
'date_end': datetime.now() + timedelta(days=1),
'company_id': company_1.id,
}, {
'name': 'Event Company 2',
'date_begin': datetime.now() + relativedelta(days=-1),
'date_end': datetime.now() + relativedelta(days=1),
'date_begin': datetime.now() + timedelta(days=-1),
'date_end': datetime.now() + timedelta(days=1),
'company_id': company_2.id,
}
])
+21 -16
View File
@@ -4,7 +4,7 @@
from datetime import datetime, timedelta, time
from unittest.mock import patch
from odoo.addons.event.tests.common import TestEventCommon
from odoo.addons.event.tests.common import EventCase
from odoo.addons.mail.tests.common import mail_new_test_user
from odoo.fields import Datetime as FieldsDatetime, Date as FieldsDate
from odoo.tests.common import TransactionCase
@@ -57,21 +57,30 @@ class EventDtPatcher(TransactionCase):
cls.addClassCleanup(cls.wevent_main_date.stop)
class TestWebsiteEventCommon(TestEventCommon):
class OnlineEventCase(EventCase):
@classmethod
def setUpClass(cls):
super(TestWebsiteEventCommon, cls).setUpClass()
super(OnlineEventCase, cls).setUpClass()
cls.company_main = cls.env.user.company_id
cls.user_event_web_manager = mail_new_test_user(
cls.env, login='user_event_web_manager',
name='Martin Sales Manager', email='crm_manager@test.example.com',
company_id=cls.company_main.id,
notification_type='inbox',
cls.env,
company_id=cls.company_admin.id,
email='crm_manager@test.example.com',
groups='event.group_event_manager,website.group_website_designer',
login='user_event_web_manager',
name='Martin Sales Manager',
notification_type='inbox',
)
cls.event_customer.write({
'website_description': '<p>I am your best customer, %s</p>' % cls.event_customer.name,
})
cls.event_customer2.write({
'website_description': '<p>I am your best customer, %s</p>' % cls.event_customer2.name,
})
def _get_menus(self):
return set(['Introduction', 'Location', 'Register', 'Community'])
@@ -97,21 +106,17 @@ class TestWebsiteEventCommon(TestEventCommon):
self.assertFalse(bool(view))
class TestEventOnlineCommon(TestEventCommon, EventDtPatcher):
class TestEventOnlineCommon(OnlineEventCase, EventDtPatcher):
@classmethod
def setUpClass(cls):
super(TestEventOnlineCommon, cls).setUpClass()
# event if 8-18 in Europe/Brussels (DST) (first day: begins at 9, last day: ends at 15)
cls.event_0.write({
cls.event_0 = cls.env['event.event'].create({
'name': 'TestEvent',
'auto_confirm': True,
'date_begin': datetime.combine(cls.reference_now, time(7, 0)) - timedelta(days=1),
'date_end': datetime.combine(cls.reference_now, time(13, 0)) + timedelta(days=1),
})
cls.event_customer.write({
'website_description': '<p>I am your best customer, %s</p>' % cls.event_customer.name,
})
cls.event_customer2.write({
'website_description': '<p>I am your best customer, %s</p>' % cls.event_customer2.name,
'date_tz': 'Europe/Brussels',
})
@@ -4,11 +4,11 @@
from datetime import datetime, timedelta
from odoo import fields
from odoo.addons.website_event.tests.common import TestWebsiteEventCommon
from odoo.addons.website_event.tests.common import OnlineEventCase
from odoo.tests.common import users
class TestEventMenus(TestWebsiteEventCommon):
class TestEventMenus(OnlineEventCase):
@users('user_eventmanager')
def test_menu_management(self):
@@ -4,10 +4,10 @@
from datetime import datetime, timedelta
from odoo import fields
from odoo.addons.website_event.tests.common import TestWebsiteEventCommon
from odoo.addons.website_event.tests.common import TestEventOnlineCommon
class TestEventVisitor(TestWebsiteEventCommon):
class TestEventVisitor(TestEventOnlineCommon):
def test_visitor_events(self):
event_1 = self.env['event.event'].create({
@@ -6,7 +6,7 @@ from datetime import datetime, timedelta
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
from odoo.addons.mail.tests.common import mail_new_test_user
from odoo.addons.website.tests.test_base_url import TestUrlCommon
from odoo.addons.website_event.tests.common import TestWebsiteEventCommon
from odoo.addons.website_event.tests.common import OnlineEventCase
from odoo.tests import tagged
from odoo.tools import mute_logger
@@ -27,7 +27,7 @@ class TestURLs(TestUrlCommon):
@tagged('post_install', '-at_install')
class TestWebsiteAccess(HttpCaseWithUserDemo, TestWebsiteEventCommon):
class TestWebsiteAccess(HttpCaseWithUserDemo, OnlineEventCase):
def setUp(self):
super(TestWebsiteAccess, self).setUp()
@@ -26,4 +26,6 @@ class TestEventExhibitorCommon(TestEventOnlineCommon):
'partner_id': cls.sponsor_0_partner.id,
'event_id': cls.event_0.id,
'sponsor_type_id': cls.sponsor_type_0.id,
'hour_from': 8.0,
'hour_to': 18.0,
})
@@ -15,11 +15,6 @@ class TestSponsorData(TestEventExhibitorCommon):
def setUpClass(cls):
super(TestSponsorData, cls).setUpClass()
cls.sponsor_0.write({
'hour_from': 8.0,
'hour_to': 18.0,
})
cls.wevent_exhib_dt = patch(
'odoo.addons.website_event_exhibitor.models.event_sponsor.fields.Datetime',
wraps=FieldsDatetime
@@ -1,11 +1,26 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.event.tests.common import TestEventCommon
from datetime import datetime, timedelta
from odoo import fields
from odoo.addons.event.tests.common import EventCase
from odoo.tests import Form
class TestWebsiteEventMeet(TestEventCommon):
class TestWebsiteEventMeet(EventCase):
@classmethod
def setUpClass(cls):
super(TestWebsiteEventMeet, cls).setUpClass()
cls.event_0 = cls.env['event.event'].create({
'name': 'TestEvent',
'auto_confirm': True,
'date_begin': fields.Datetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': fields.Datetime.to_string(datetime.today() + timedelta(days=15)),
'date_tz': 'Europe/Brussels',
})
def test_meeting_room_create(self):
"""Test that the field of the mixin are automatically filled."""
new_meeting_room_form = Form(self.env["event.meeting.room"])
+15 -5
View File
@@ -1,19 +1,29 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.event.tests.common import TestEventCommon
from odoo.addons.event.tests.common import EventCase
class TestEventQuestionCommon(TestEventCommon):
class TestEventQuestionCommon(EventCase):
@classmethod
def setUpClass(cls):
super(TestEventQuestionCommon, cls).setUpClass()
cls.event_type_questions = cls.env['event.type'].create({
'name': 'Update Type',
'auto_confirm': True,
'has_seats_limitation': True,
'seats_max': 30,
'default_timezone': 'Europe/Paris',
'event_type_ticket_ids': [],
'event_type_mail_ids': [],
})
cls.event_question_1 = cls.env['event.question'].create({
'title': 'Question1',
'question_type': 'simple_choice',
'event_type_id': cls.event_type_complex.id,
'event_type_id': cls.event_type_questions.id,
'once_per_order': False,
'answer_ids': [
(0, 0, {'name': 'Q1-Answer1'}),
@@ -23,7 +33,7 @@ class TestEventQuestionCommon(TestEventCommon):
cls.event_question_2 = cls.env['event.question'].create({
'title': 'Question2',
'question_type': 'simple_choice',
'event_type_id': cls.event_type_complex.id,
'event_type_id': cls.event_type_questions.id,
'once_per_order': True,
'answer_ids': [
(0, 0, {'name': 'Q2-Answer1'}),
@@ -33,6 +43,6 @@ class TestEventQuestionCommon(TestEventCommon):
cls.event_question_3 = cls.env['event.question'].create({
'title': 'Question3',
'question_type': 'text_box',
'event_type_id': cls.event_type_complex.id,
'event_type_id': cls.event_type_questions.id,
'once_per_order': True,
})
@@ -14,7 +14,7 @@ class TestEventData(TestEventQuestionCommon):
@users('user_eventmanager')
def test_event_type_configuration_from_type(self):
event_type = self.event_type_complex.with_user(self.env.user)
event_type = self.event_type_questions.with_user(self.env.user)
event = self.env['event.event'].create({
'name': 'Event Update Type',
@@ -40,7 +40,7 @@ class TestEventData(TestEventQuestionCommon):
def test_process_attendees_form(self):
event = self.env['event.event'].create({
'name': 'Event Update Type',
'event_type_id': self.event_type_complex.with_user(self.env.user).id,
'event_type_id': self.event_type_questions.with_user(self.env.user).id,
'date_begin': FieldsDatetime.to_string(datetime.today() + timedelta(days=1)),
'date_end': FieldsDatetime.to_string(datetime.today() + timedelta(days=15)),
})
@@ -4,11 +4,11 @@
from datetime import datetime, timedelta
from odoo import fields
from odoo.addons.website_event.tests.common import TestWebsiteEventCommon
from odoo.addons.website_event.tests.common import OnlineEventCase
from odoo.tests.common import users
class TestEventWebsiteTrack(TestWebsiteEventCommon):
class TestEventWebsiteTrack(OnlineEventCase):
def _get_menus(self):
return super(TestEventWebsiteTrack, self)._get_menus() | set(['Talks', 'Agenda', 'Talk Proposals'])