diff --git a/addons/event/tests/common.py b/addons/event/tests/common.py index c3c32a9880a..4713aa09716 100644 --- a/addons/event/tests/common.py +++ b/addons/event/tests/common.py @@ -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 diff --git a/addons/event/tests/test_event_flow.py b/addons/event/tests/test_event_flow.py index 93667aba78e..dd021b25e73 100644 --- a/addons/event/tests/test_event_flow.py +++ b/addons/event/tests/test_event_flow.py @@ -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): diff --git a/addons/event/tests/test_event_internals.py b/addons/event/tests/test_event_internals.py index 9fb11beff6d..e02a42aedf5 100644 --- a/addons/event/tests/test_event_internals.py +++ b/addons/event/tests/test_event_internals.py @@ -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): diff --git a/addons/event/tests/test_event_mail_schedule.py b/addons/event/tests/test_event_mail_schedule.py index 85f639648d2..1089c8358a5 100644 --- a/addons/event/tests/test_event_mail_schedule.py +++ b/addons/event/tests/test_event_mail_schedule.py @@ -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): diff --git a/addons/event_booth/tests/common.py b/addons/event_booth/tests/common.py index b378449ad6a..7b8fb50f907 100644 --- a/addons/event_booth/tests/common.py +++ b/addons/event_booth/tests/common.py @@ -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': '

Premium

', }) - - 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}), - ], - }) diff --git a/addons/event_booth_sale/tests/common.py b/addons/event_booth_sale/tests/common.py index b2c98e5b4a0..f72e6bf399b 100644 --- a/addons/event_booth_sale/tests/common.py +++ b/addons/event_booth_sale/tests/common.py @@ -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): diff --git a/addons/event_crm/tests/common.py b/addons/event_crm/tests/common.py index c27b82d21c0..6d53c0fb41f 100644 --- a/addons/event_crm/tests/common.py +++ b/addons/event_crm/tests/common.py @@ -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 diff --git a/addons/event_sale/tests/common.py b/addons/event_sale/tests/common.py index cf75273e000..d40bbc853da 100644 --- a/addons/event_sale/tests/common.py +++ b/addons/event_sale/tests/common.py @@ -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', + }) diff --git a/addons/event_sale/tests/test_event_internals.py b/addons/event_sale/tests/test_event_internals.py index 6eb4833426e..b133a477f7e 100644 --- a/addons/event_sale/tests/test_event_internals.py +++ b/addons/event_sale/tests/test_event_internals.py @@ -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}) diff --git a/addons/event_sms/tests/test_sms_schedule.py b/addons/event_sms/tests/test_sms_schedule.py index 25caf1b1855..8045c1ac65e 100644 --- a/addons/event_sms/tests/test_sms_schedule.py +++ b/addons/event_sms/tests/test_sms_schedule.py @@ -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) diff --git a/addons/test_event_full/tests/test_event_security.py b/addons/test_event_full/tests/test_event_security.py index a5ba250691d..ec7f0ac3448 100644 --- a/addons/test_event_full/tests/test_event_security.py +++ b/addons/test_event_full/tests/test_event_security.py @@ -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, } ]) diff --git a/addons/website_event/tests/common.py b/addons/website_event/tests/common.py index 7fe660d403f..31f7decc06a 100644 --- a/addons/website_event/tests/common.py +++ b/addons/website_event/tests/common.py @@ -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': '

I am your best customer, %s

' % cls.event_customer.name, + }) + cls.event_customer2.write({ + 'website_description': '

I am your best customer, %s

' % 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': '

I am your best customer, %s

' % cls.event_customer.name, - }) - cls.event_customer2.write({ - 'website_description': '

I am your best customer, %s

' % cls.event_customer2.name, + 'date_tz': 'Europe/Brussels', }) diff --git a/addons/website_event/tests/test_event_menus.py b/addons/website_event/tests/test_event_menus.py index aa65e159119..5ecdcb16236 100644 --- a/addons/website_event/tests/test_event_menus.py +++ b/addons/website_event/tests/test_event_menus.py @@ -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): diff --git a/addons/website_event/tests/test_event_visitor.py b/addons/website_event/tests/test_event_visitor.py index b9ef29c6547..7ba97eee480 100644 --- a/addons/website_event/tests/test_event_visitor.py +++ b/addons/website_event/tests/test_event_visitor.py @@ -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({ diff --git a/addons/website_event/tests/test_website_event.py b/addons/website_event/tests/test_website_event.py index 36ce39b74c8..3bdd6ed447f 100644 --- a/addons/website_event/tests/test_website_event.py +++ b/addons/website_event/tests/test_website_event.py @@ -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() diff --git a/addons/website_event_exhibitor/tests/common.py b/addons/website_event_exhibitor/tests/common.py index 9e957fc2d32..57768661eed 100644 --- a/addons/website_event_exhibitor/tests/common.py +++ b/addons/website_event_exhibitor/tests/common.py @@ -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, }) diff --git a/addons/website_event_exhibitor/tests/test_sponsor_internals.py b/addons/website_event_exhibitor/tests/test_sponsor_internals.py index 8a84840042f..4d952f7ff2e 100644 --- a/addons/website_event_exhibitor/tests/test_sponsor_internals.py +++ b/addons/website_event_exhibitor/tests/test_sponsor_internals.py @@ -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 diff --git a/addons/website_event_meet/tests/test_website_event_meet.py b/addons/website_event_meet/tests/test_website_event_meet.py index 8d1b8a95b0f..3e91f364481 100644 --- a/addons/website_event_meet/tests/test_website_event_meet.py +++ b/addons/website_event_meet/tests/test_website_event_meet.py @@ -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"]) diff --git a/addons/website_event_questions/tests/common.py b/addons/website_event_questions/tests/common.py index 1a621875dc2..62c30acbd70 100644 --- a/addons/website_event_questions/tests/common.py +++ b/addons/website_event_questions/tests/common.py @@ -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, }) diff --git a/addons/website_event_questions/tests/test_event_internals.py b/addons/website_event_questions/tests/test_event_internals.py index 28c9099734a..f1b8ce7d322 100644 --- a/addons/website_event_questions/tests/test_event_internals.py +++ b/addons/website_event_questions/tests/test_event_internals.py @@ -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)), }) diff --git a/addons/website_event_track/tests/test_event_menus.py b/addons/website_event_track/tests/test_event_menus.py index ab0093563b2..3d07e3baf89 100644 --- a/addons/website_event_track/tests/test_event_menus.py +++ b/addons/website_event_track/tests/test_event_menus.py @@ -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'])