event_crm/tests/common.py

144 lines
6.6 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime, timedelta
from odoo import fields, tools
from odoo.addons.crm.tests.common import TestCrmCommon
from odoo.addons.event.tests.common import EventCase
class EventCrmCase(TestCrmCommon, EventCase):
@classmethod
def setUpClass(cls):
super(EventCrmCase, cls).setUpClass()
# avoid clash with existing rules
cls.env['event.lead.rule'].search([]).write({'active': False})
cls.test_lead_tag = cls.env['crm.tag'].create({'name': 'TagTest'})
cls.test_rule_attendee = cls.env['event.lead.rule'].create({
'name': 'Rule Attendee',
'lead_creation_basis': 'attendee',
'lead_creation_trigger': 'create',
'event_registration_filter': [['email', 'ilike', '@test.example.com']],
'lead_type': 'lead',
'lead_user_id': cls.user_sales_salesman.id,
'lead_tag_ids': cls.test_lead_tag,
})
cls.test_rule_order = cls.env['event.lead.rule'].create({
'name': 'Rule Order',
'lead_creation_basis': 'order',
'lead_creation_trigger': 'create',
'event_registration_filter': [['email', 'ilike', '@test.example.com']],
'lead_type': 'opportunity',
'lead_user_id': cls.user_sales_leads.id,
'lead_sales_team_id': cls.sales_team_1.id,
})
cls.test_rule_order_done = cls.env['event.lead.rule'].create({
'name': 'Rule Order: confirmed partner only',
'lead_creation_basis': 'order',
'lead_creation_trigger': 'done',
'event_registration_filter': [['partner_id', '!=', False]],
'lead_type': 'opportunity',
})
cls.batch_customer_data = [{
'partner_id': cls.event_customer.id,
}] + [{
'name': 'My Customer 00',
'partner_id': cls.event_customer2.id,
'email': 'email.00@test.example.com',
'phone': '0456000000',
}] + [{
'name': 'My Customer %02d' % x,
'partner_id': cls.env.ref('base.public_partner').id if x == 0 else False,
'email': 'email.%02d@test.example.com' % x,
'phone': '04560000%02d' % x,
} for x in range(1, 4)]
def assertLeadConvertion(self, rule, registrations, partner=None, **expected):
""" Tool method hiding details of lead value generation and check
:param lead: lead created through automated rule;
:param rule: event.lead.rule that created the lead;
:param event: original event;
:param registrations: source registrations (singleton or record set if done in batch);
:param partner: partner on lead;
"""
registrations = registrations.sorted('id') # currently order is forced to id ASC
lead = self.env['crm.lead'].sudo().search([
('registration_ids', 'in', registrations.ids),
('event_lead_rule_id', '=', rule.id)
])
self.assertEqual(len(lead), 1, 'Invalid registrations -> lead creation, found %s leads where only 1 is expected.' % len(lead))
self.assertEqual(lead.registration_ids, registrations, 'Invalid registrations -> lead creation, too much registrations on it.')
event = registrations.event_id
self.assertEqual(len(event), 1, 'Invalid registrations -> event assertion, all registrations should belong to same event')
if partner is None:
partner = self.env['res.partner']
expected_reg_name = partner.name or registrations._find_first_notnull('name') or registrations._find_first_notnull('email')
if partner:
expected_contact_name = partner.name if not partner.is_company else False
expected_partner_name = partner.name if partner.is_company else False
else:
expected_contact_name = registrations._find_first_notnull('name')
expected_partner_name = False
# event information
self.assertEqual(lead.event_id, event)
self.assertEqual(lead.referred, event.name)
# registration information
registration_phone = registrations._find_first_notnull('phone')
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 and partner.email else registrations._find_first_notnull('email'))
self.assertEqual(lead.phone, partner.phone if partner and partner.phone else registration_phone)
self.assertEqual(lead.mobile, partner.mobile if partner and partner.mobile else ((registration_phone != lead.phone) and registration_phone))
# description: to improve
self.assertNotIn('False', lead.description) # avoid a "Dear False" like construct ^^ (this assert is serious and intended)
for registration in registrations:
if registration.name:
self.assertIn(registration.name, lead.description)
elif registration.partner_id.name:
self.assertIn(registration.partner_id.name, lead.description)
if registration.email:
if tools.email_normalize(registration.email) == registration.partner_id.email_normalized:
self.assertIn(registration.partner_id.email, lead.description)
else:
self.assertIn(tools.email_normalize(registration.email), lead.description)
if registration.phone:
self.assertIn(registration.phone, lead.description)
# lead configuration
self.assertEqual(lead.type, rule.lead_type)
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',
'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