[IMP] event(_sale): add some tests before updating models

As some event models (event.type and event.ticket notably) are about to
be modified let us add some tests to avoid regressions.

Security tests are also moved in their own file. Some internals tests defined
in event_sale are also moved in their own file. That way we avoid bloating
files with unrelated tests. Future commits will add tests for event and
event.type models.

LINKS

Task ID 2177281 (support tickets directly in event)
Prepares Community PR odoo/odoo#43488
Closes Community PR odoo/odoo#44066
This commit is contained in:
Thibault Delavallée
2020-01-28 10:54:46 +00:00
parent dd1551850c
commit 7caa532341
9 changed files with 245 additions and 136 deletions
+1
View File
@@ -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
+1 -1
View File
@@ -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',
})
+22 -91
View File
@@ -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)
+106
View File
@@ -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()
+4
View File
@@ -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
+19
View File
@@ -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',
})
@@ -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')
@@ -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')
@@ -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),