From db19463f255cbf56d9e6577ee7ab3ea9aa050e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 8 Dec 2021 10:11:11 +0000 Subject: [PATCH] [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 --- addons/event/tests/common.py | 110 +++++++-------- addons/event/tests/test_event_flow.py | 4 +- addons/event/tests/test_event_internals.py | 125 ++++++++++-------- .../event/tests/test_event_mail_schedule.py | 4 +- addons/event_booth/tests/common.py | 14 +- addons/event_booth_sale/tests/common.py | 3 +- addons/event_crm/tests/common.py | 30 ++++- addons/event_sale/tests/common.py | 30 ++++- .../event_sale/tests/test_event_internals.py | 11 +- addons/event_sms/tests/test_sms_schedule.py | 44 +++--- .../tests/test_event_security.py | 58 +++++--- addons/website_event/tests/common.py | 37 +++--- .../website_event/tests/test_event_menus.py | 4 +- .../website_event/tests/test_event_visitor.py | 4 +- .../website_event/tests/test_website_event.py | 4 +- .../website_event_exhibitor/tests/common.py | 2 + .../tests/test_sponsor_internals.py | 5 - .../tests/test_website_event_meet.py | 19 ++- .../website_event_questions/tests/common.py | 20 ++- .../tests/test_event_internals.py | 4 +- .../tests/test_event_menus.py | 4 +- 21 files changed, 314 insertions(+), 222 deletions(-) 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'])