diff --git a/addons/event/tests/__init__.py b/addons/event/tests/__init__.py index 881edfc8974..72c2d9abfd9 100644 --- a/addons/event/tests/__init__.py +++ b/addons/event/tests/__init__.py @@ -4,3 +4,4 @@ from . import test_event_flow from . import test_event_internals from . import test_event_mail_schedule +from . import test_event_security diff --git a/addons/event/tests/common.py b/addons/event/tests/common.py index 56c14a78451..44aabb1d5d5 100644 --- a/addons/event/tests/common.py +++ b/addons/event/tests/common.py @@ -44,7 +44,7 @@ class TestEventCommon(common.SavepointCase): cls.customer = cls.env['res.partner'].create({ 'name': 'Constantin Customer', - 'email': 'constantin@example.com', + 'email': 'constantin@test.example.com', 'country_id': cls.env.ref('base.be').id, 'phone': '0485112233', }) diff --git a/addons/event/tests/test_event_internals.py b/addons/event/tests/test_event_internals.py index 874422c1eac..1f388eee3d8 100644 --- a/addons/event/tests/test_event_internals.py +++ b/addons/event/tests/test_event_internals.py @@ -2,11 +2,9 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from datetime import datetime, timedelta -from dateutil.relativedelta import relativedelta from unittest.mock import patch from odoo.addons.event.tests.common import TestEventCommon -from odoo.exceptions import AccessError from odoo.fields import Datetime as FieldsDatetime from odoo.tests.common import users from odoo.tools import mute_logger @@ -100,6 +98,10 @@ class TestEventData(TestEventCommon): @users('user_eventmanager') @mute_logger('odoo.models.unlink') def test_event_configuration_from_type(self): + """ Test data computation of event coming from its event.type template. + Some one2many notably are duplicated from type configuration and some + advanced testing is required, notably mail schedulers. """ + self.assertEqual(self.env.user.tz, 'Europe/Brussels') event_type = self.event_type_complex.with_user(self.env.user) @@ -148,97 +150,26 @@ class TestEventData(TestEventCommon): self.assertEqual(event.event_mail_ids.template_id, self.env.ref('event.event_reminder')) -class TestEventSecurity(TestEventCommon): - - @users('user_employee') - @mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model') - def test_event_access_employee(self): - # employee can read events (sure ?) - event = self.event_0.with_user(self.env.user) - event.read(['name']) - # event.stage_id.read(['name', 'description']) - # event.event_type_id.read(['name', 'has_seats_limitation']) - - 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), - 'seats_max': 10, - }) - - with self.assertRaises(AccessError): - event.write({ - 'name': 'TestEvent Modified', - }) - - with self.assertRaises(AccessError): - self.env['event.stage'].create({ - 'name': 'TestStage', - }) - - @users('user_eventuser') - @mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model') - def test_event_access_event_user(self): - event = self.event_0.with_user(self.env.user) - event.read(['name', 'user_id', 'kanban_state_label']) - - 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), - 'seats_max': 10, - }) - - with self.assertRaises(AccessError): - event.write({ - 'name': 'TestEvent Modified', - }) - - # with self.assertRaises(AccessError): - # self.env['event.stage'].create({ - # 'name': 'TestStage', - # }) +class TestEventTypeData(TestEventCommon): @users('user_eventmanager') - @mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model') - def test_event_access_event_manager(self): - # EventManager can do about everything + def test_event_type_fields(self): + """ Test event type fields synchronization """ + # create test type and ensure its initial values event_type = self.env['event.type'].create({ - 'name': 'ManagerEventType', - 'use_mail_schedule': True, - 'event_type_mail_ids': [(5, 0), (0, 0, { - 'interval_nbr': 1, 'interval_unit': 'days', 'interval_type': 'before_event', - 'template_id': self.env['ir.model.data'].xmlid_to_res_id('event.event_reminder')})] + 'name': 'Testing fields computation', + 'has_seats_limitation': True, + 'default_registration_min': 5, + 'default_registration_max': 30, }) - event = self.env['event.event'].create({ - 'name': 'ManagerEvent', - 'date_begin': datetime.now() + relativedelta(days=-1), - 'date_end': datetime.now() + relativedelta(days=1), - }) - event.update({'event_type_id': event_type.id}) - event._onchange_type() - event.flush() + event_type._onchange_has_seats_limitation() + self.assertTrue(event_type.has_seats_limitation) + self.assertEqual(event_type.default_registration_min, 5) + self.assertEqual(event_type.default_registration_max, 30) - registration = self.env['event.registration'].create({'event_id': event.id}) - registration.write({'name': 'Myself'}) - - stage = self.env.ref('event.event_stage_done') - stage.write({'name': 'ManagerEnded'}) - event.write({'stage_id': stage.id}) - - registration.unlink() - event.unlink() - stage.unlink() - event_type.unlink() - - # Settings access rights required to enable some features - self.user_eventmanager.write({'groups_id': [ - (3, self.env.ref('base.group_system').id), - (4, self.env.ref('base.group_erp_manager').id) - ]}) - with self.assertRaises(AccessError): - event_config = self.env['res.config.settings'].with_user(self.user_eventmanager).create({ - }) - event_config.execute() + # reset seats limitation + event_type.write({'has_seats_limitation': False}) + event_type._onchange_has_seats_limitation() + self.assertFalse(event_type.has_seats_limitation) + self.assertEqual(event_type.default_registration_min, 0) + self.assertEqual(event_type.default_registration_max, 0) diff --git a/addons/event/tests/test_event_security.py b/addons/event/tests/test_event_security.py new file mode 100644 index 00000000000..ef056c438b5 --- /dev/null +++ b/addons/event/tests/test_event_security.py @@ -0,0 +1,106 @@ +# -*- 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 odoo.addons.event.tests.common import TestEventCommon +from odoo.exceptions import AccessError +from odoo.tests.common import users +from odoo.tools import mute_logger + + +class TestEventSecurity(TestEventCommon): + + @users('user_employee') + @mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model') + def test_event_access_employee(self): + # employee can read events (sure ?) + event = self.event_0.with_user(self.env.user) + event.read(['name']) + # event.stage_id.read(['name', 'description']) + # event.event_type_id.read(['name', 'has_seats_limitation']) + + 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), + 'seats_max': 10, + }) + + with self.assertRaises(AccessError): + event.write({ + 'name': 'TestEvent Modified', + }) + + with self.assertRaises(AccessError): + self.env['event.stage'].create({ + 'name': 'TestStage', + }) + + @users('user_eventuser') + @mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model') + def test_event_access_event_user(self): + event = self.event_0.with_user(self.env.user) + event.read(['name', 'user_id', 'kanban_state_label']) + + 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), + 'seats_max': 10, + }) + + with self.assertRaises(AccessError): + event.write({ + 'name': 'TestEvent Modified', + }) + + # with self.assertRaises(AccessError): + # self.env['event.stage'].create({ + # 'name': 'TestStage', + # }) + + @users('user_eventmanager') + @mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model') + def test_event_access_event_manager(self): + # EventManager can do about everything + event_type = self.env['event.type'].create({ + 'name': 'ManagerEventType', + 'use_mail_schedule': True, + 'event_type_mail_ids': [(5, 0), (0, 0, { + 'interval_nbr': 1, 'interval_unit': 'days', 'interval_type': 'before_event', + 'template_id': self.env['ir.model.data'].xmlid_to_res_id('event.event_reminder')})] + }) + event = self.env['event.event'].create({ + 'name': 'ManagerEvent', + 'date_begin': datetime.now() + relativedelta(days=-1), + 'date_end': datetime.now() + relativedelta(days=1), + }) + event.update({'event_type_id': event_type.id}) + event._onchange_type() + event.flush() + + registration = self.env['event.registration'].create({'event_id': event.id}) + registration.write({'name': 'Myself'}) + + stage = self.env.ref('event.event_stage_done') + stage.write({'name': 'ManagerEnded'}) + event.write({'stage_id': stage.id}) + + registration.unlink() + event.unlink() + stage.unlink() + event_type.unlink() + + # Settings access rights required to enable some features + self.user_eventmanager.write({'groups_id': [ + (3, self.env.ref('base.group_system').id), + (4, self.env.ref('base.group_erp_manager').id) + ]}) + with self.assertRaises(AccessError): + event_config = self.env['res.config.settings'].with_user(self.user_eventmanager).create({ + }) + event_config.execute() diff --git a/addons/event_sale/tests/__init__.py b/addons/event_sale/tests/__init__.py index c023d41b5dd..47f238b93ad 100644 --- a/addons/event_sale/tests/__init__.py +++ b/addons/event_sale/tests/__init__.py @@ -1,2 +1,6 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_event_internals from . import test_event_sale from . import test_event_sale_ui diff --git a/addons/event_sale/tests/common.py b/addons/event_sale/tests/common.py new file mode 100644 index 00000000000..30f437fd760 --- /dev/null +++ b/addons/event_sale/tests/common.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.event.tests.common import TestEventCommon + + +class TestEventSaleCommon(TestEventCommon): + + @classmethod + def setUpClass(cls): + super(TestEventSaleCommon, cls).setUpClass() + + cls.event_product = cls.env['product.product'].create({ + 'name': 'Test Registration Product', + 'list_price': 10, + 'event_ok': True, + 'standard_price': 30.0, + 'type': 'service', + }) diff --git a/addons/event_sale/tests/test_event_internals.py b/addons/event_sale/tests/test_event_internals.py new file mode 100644 index 00000000000..9f8539ec6bd --- /dev/null +++ b/addons/event_sale/tests/test_event_internals.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import date, datetime, timedelta + +from odoo.addons.event_sale.tests.common import TestEventSaleCommon +from odoo.fields import Datetime as FieldsDatetime +from odoo.tests.common import users + + +class EventSaleTest(TestEventSaleCommon): + + @users('user_eventmanager') + 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.write({ + 'use_mail_schedule': False, + 'use_ticketing': False, + }) + # Event type does not use tickets but data is kept for compatibility and avoid recreating them + self.assertEqual(len(event_type.event_ticket_ids), 1) + self.assertEqual(event_type.event_ticket_ids.name, 'Registration') + + event = self.env['event.event'].create({ + 'name': 'Event Update Type', + 'event_type_id': event_type.id, + 'date_begin': FieldsDatetime.to_string(datetime.today() + timedelta(days=1)), + 'date_end': FieldsDatetime.to_string(datetime.today() + timedelta(days=15)), + }) + event._onchange_type() + self.assertEqual(event.event_ticket_ids, self.env['event.event.ticket']) + + event_type.write({ + 'use_ticketing': True, + 'event_ticket_ids': [(5, 0), (0, 0, { + 'name': 'First Ticket', + 'product_id': self.event_product.id, + })] + }) + event_type.event_ticket_ids._onchange_product_id() + event._onchange_type() + self.assertEqual(event.event_ticket_ids.name, 'Registration for %s' % event.name) + self.assertEqual(event.event_ticket_ids.product_id, self.event_product) + self.assertEqual(event.event_ticket_ids.price, self.event_product.list_price) + + def test_event_registrable(self): + """Test if `_compute_event_registrations_open` works properly.""" + test_event = self.env['event.event'].create({ + 'name': 'TestEvent', + 'date_begin': datetime.now() - timedelta(days=5), + 'date_end': datetime.now() + timedelta(days=5), + }) + test_event_ticket = self.env['event.event.ticket'].create({ + 'name': 'TestTicket', + 'event_id': test_event.id, + 'product_id': self.env['product.product'].search([], limit=1).id, + }) + + self.assertEqual(test_event.event_registrations_open, True) + + test_event.write({ + 'date_begin': datetime.now() - timedelta(days=5), + 'date_end': datetime.now() - timedelta(days=1), + }) + + test_event.date_end = datetime.now() - timedelta(days=1) + self.assertEqual(test_event.event_registrations_open, False) + + test_event.write({ + 'date_begin': datetime.now() - timedelta(days=1), + 'date_end': datetime.now() + timedelta(days=5), + }) + + test_event.write({'event_ticket_ids': [(5, 0)]}) + self.assertEqual(test_event.event_registrations_open, False, 'cannot register if no tickets') + + test_event_ticket = self.env['event.event.ticket'].create({ + 'name': 'TestTicket', + 'event_id': test_event.id, + 'product_id': self.env['product.product'].search([], limit=1).id, + }) + test_event_ticket.product_id.active = False + self.assertEqual(test_event.event_registrations_open, False, 'cannot register if product linked to the tickets are all archived') diff --git a/addons/event_sale/tests/test_event_sale.py b/addons/event_sale/tests/test_event_sale.py index 720b3ad7fbf..fb121228bd6 100644 --- a/addons/event_sale/tests/test_event_sale.py +++ b/addons/event_sale/tests/test_event_sale.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import datetime from odoo.tests import common @@ -68,42 +67,3 @@ class EventSaleTest(common.TransactionCase): # I check if a registration is created registrations = self.EventRegistration.search([('origin', '=', self.sale_order.name)]) self.assertTrue(registrations, "The registration is not created.") - - def test_event_is_registrable(self): - """Test if `_compute_event_registrations_open` works properly.""" - test_event = self.env['event.event'].create({ - 'name': 'TestEvent', - 'date_begin': datetime.datetime.now() - datetime.timedelta(days=5), - 'date_end': datetime.datetime.now() + datetime.timedelta(days=5), - }) - test_event_ticket = self.env['event.event.ticket'].create({ - 'name': 'TestTicket', - 'event_id': test_event.id, - 'product_id': self.env['product.product'].search([], limit=1).id, - }) - - self.assertEqual(test_event.event_registrations_open, True) - - test_event.write({ - 'date_begin': datetime.datetime.now() - datetime.timedelta(days=5), - 'date_end': datetime.datetime.now() - datetime.timedelta(days=1), - }) - - test_event.date_end = datetime.datetime.now() - datetime.timedelta(days=1) - self.assertEqual(test_event.event_registrations_open, False) - - test_event.write({ - 'date_begin': datetime.datetime.now() - datetime.timedelta(days=1), - 'date_end': datetime.datetime.now() + datetime.timedelta(days=5), - }) - - test_event.write({'event_ticket_ids': [(6, 0, [])]}) - self.assertEqual(test_event.event_registrations_open, False, 'cannot register if no tickets') - - test_event_ticket = self.env['event.event.ticket'].create({ - 'name': 'TestTicket', - 'event_id': test_event.id, - 'product_id': self.env['product.product'].search([], limit=1).id, - }) - test_event_ticket.product_id.active = False - self.assertEqual(test_event.event_registrations_open, False, 'cannot register if product linked to the tickets are all archived') diff --git a/addons/event_sale/tests/test_event_sale_ui.py b/addons/event_sale/tests/test_event_sale_ui.py index 79932be0c79..24e68c5dbb8 100644 --- a/addons/event_sale/tests/test_event_sale_ui.py +++ b/addons/event_sale/tests/test_event_sale_ui.py @@ -1,13 +1,16 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. -import odoo.tests from datetime import timedelta + from odoo.fields import Datetime +from odoo.tests import HttpCase, tagged -@odoo.tests.tagged('post_install', '-at_install') -class TestUi(odoo.tests.HttpCase): - def test_01_event_configurator(self): +@tagged('post_install', '-at_install') +class TestUi(HttpCase): + + def test_event_configurator(self): + event = self.env['event.event'].create({ 'name': 'Design Fair Los Angeles', 'date_begin': Datetime.now() + timedelta(days=1),