diff --git a/addons/crm/tests/test_crm_lead.py b/addons/crm/tests/test_crm_lead.py index 7671cac18fc..44092d32b93 100644 --- a/addons/crm/tests/test_crm_lead.py +++ b/addons/crm/tests/test_crm_lead.py @@ -11,7 +11,7 @@ from odoo.addons.crm.tests.common import TestCrmCommon, INCOMING_EMAIL from odoo.addons.phone_validation.tools.phone_validation import phone_format from odoo.exceptions import UserError from odoo.tests.common import Form, tagged, users -from odoo.tools import formataddr, mute_logger +from odoo.tools import mute_logger @tagged('lead_internals') @@ -675,114 +675,6 @@ class TestCRMLead(TestCrmCommon): self.assertEqual(new_lead.partner_id.email, 'unknown.sender@test.example.com') self.assertEqual(new_lead.partner_id.team_id, self.sales_team_1) - @users('user_sales_manager') - def test_message_get_suggested_recipients(self): - """This test checks that creating a contact from a lead with an inactive language will ignore the language - while creating a contact from a lead with an active language will take it into account """ - ResLang = self.env['res.lang'].sudo().with_context(active_test=False) - - # Create a lead with an inactive language -> should ignore the preset language - lang_fr = ResLang.search([('code', '=', 'fr_FR')]) - if not lang_fr: - lang_fr = ResLang._create_lang('fr_FR') - # set French language as inactive then try to call "_message_get_suggested_recipients" - # -> lang code should be ignored - lang_fr.active = False - lead1 = self.env['crm.lead'].create({ - 'name': 'TestLead', - 'email_from': self.test_email, - 'lang_id': lang_fr.id, - }) - data = lead1._message_get_suggested_recipients()[lead1.id] - self.assertEqual(len(data), 1) - suggested_partner_id, suggested_partner_email, suggested_lang, suggested_reason, create_vals = data[0] - self.assertFalse(suggested_partner_id) - self.assertEqual(suggested_partner_email, self.test_email) - self.assertEqual(suggested_lang, None) - self.assertEqual(suggested_reason, 'Customer Email') - self.assertEqual(create_vals['lang'], 'fr_FR') - - # Create a lead with an active language -> should keep the preset language for recipients - lang_en = ResLang.search([('code', '=', 'en_US')]) - if not lang_en: - lang_en = ResLang._create_lang('en_US') - # set American English language as active then try to call "_message_get_suggested_recipients" - # -> lang code should be kept - lang_en.active = True - lead2 = self.env['crm.lead'].create({ - 'name': 'TestLead', - 'email_from': self.test_email, - 'lang_id': lang_en.id, - }) - data = lead2._message_get_suggested_recipients()[lead2.id] - self.assertEqual(len(data), 1) - suggested_partner_id, suggested_partner_email, suggested_lang, suggested_reason, create_vals = data[0] - self.assertFalse(suggested_partner_id) - self.assertEqual(suggested_partner_email, self.test_email) - self.assertEqual(suggested_lang, 'en_US') - self.assertEqual(suggested_reason, 'Customer Email') - self.assertEqual(create_vals['lang'], lang_en.code) - - @users('user_sales_manager') - def test_message_get_suggested_recipients_auto_creation(self): - """Check default creates value for auto creation of recipient - (customer).""" - lead_details_for_contact = { - 'title': self.env.ref('base.res_partner_title_mister').id, - 'street': '3rd Floor, Room 3-C', - 'street2': '123 Arlington Avenue', - 'zip': '13202', - 'city': 'New York', - 'country_id': self.env.ref('base.us').id, - 'state_id': self.env.ref('base.state_us_39').id, - 'website': 'https://www.arlington123.com/3f3c', - 'phone': '678-728-0949', - 'mobile': '661-606-0781', - 'function': 'Delivery Boy', - 'team_id': self.sales_team_1.id, - 'user_id': self.user_sales_manager.id, - } - - for partner_name, name, email in [ - (False, 'Test', 'test_default_create@example.com'), - ('Delivery Boy company', 'Test With Company', 'default_create_with_partner@example.com'), - ('Delivery Boy company', '', 'default_create_with_partner_no_name@example.com'), - ]: - formatted_email = formataddr((name, email)) - with self.subTest(partner_name=partner_name): - lang = self.env['res.lang'].sudo().search([], limit=1)[0] - description = '

Top

' - lead1 = self.env['crm.lead'].create({ - 'name': 'TestLead', - 'contact_name': name, - 'email_from': formatted_email, - 'lang_id': lang.id, - 'description': description, - 'partner_name': partner_name, - **lead_details_for_contact, - }) - data = lead1._message_get_suggested_recipients()[lead1.id] - suggested_partner_id, suggested_partner_email, suggested_lang, suggested_reason, create_vals = data[0] - self.assertFalse(suggested_partner_id) - self.assertEqual(suggested_partner_email, formatted_email) - self.assertEqual(suggested_lang, lang.code) - self.assertEqual(suggested_reason, 'Customer Email') - self.assertEqual(create_vals, lead1._get_customer_information().get(email, {})) - for field, value in lead_details_for_contact.items(): - self.assertEqual(create_vals.get(field), value) - expected_name = partner_name if partner_name and not name else name - self.assertEqual(create_vals['name'], expected_name) - self.assertEqual(create_vals['comment'], description) # description -> comment - # Parent company not created even if partner_name is set - self.assertFalse(create_vals.get('parent_id')) # not supported, even if partner_name set - self.assertEqual(create_vals['company_name'], partner_name) # partner_name -> company_name - expected_company_type = 'company' if partner_name and not name else 'person' - self.assertEqual(create_vals.get('company_type', 'person'), expected_company_type) - - # Check that the creation of the contact won't fail - partner = self.env['res.partner'].create(create_vals) - partner.unlink() - @users('user_sales_manager') def test_phone_mobile_search(self): lead_1 = self.env['crm.lead'].create({ @@ -917,6 +809,8 @@ class TestCRMLead(TestCrmCommon): self.assertFalse(lead.phone_sanitized) -class TestLeadFormatAddress(FormatAddressCase): +@tagged('lead_internals') +class TestLeadFormTools(FormatAddressCase): + def test_address_view(self): self.assertAddressView('crm.lead') diff --git a/addons/crm/tests/test_crm_lead_notification.py b/addons/crm/tests/test_crm_lead_notification.py index 7cecc31d9a6..f55074add07 100644 --- a/addons/crm/tests/test_crm_lead_notification.py +++ b/addons/crm/tests/test_crm_lead_notification.py @@ -1,10 +1,186 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from .common import TestCrmCommon +from odoo.addons.crm.tests.common import TestCrmCommon +from odoo.tests import tagged, users +from odoo.tools import formataddr, mute_logger +@tagged('mail_thread', 'mail_gateway') class NewLeadNotification(TestCrmCommon): + """ Test mail features support on lead + specific overrides and support """ + + @classmethod + def setUpClass(cls): + """ Activate some langs to test lang propagation in various mail flows """ + super(NewLeadNotification, cls).setUpClass() + cls.test_email = '"Test Email" ' + model_lang = cls.env['res.lang'].sudo().with_context(active_test=False) + + # Create a lead with an inactive language -> should ignore the preset language + cls.lang_fr = model_lang.search([('code', '=', 'fr_FR')]) + if not cls.lang_fr: + cls.lang_fr = model_lang._create_lang('fr_FR') + # set French language as inactive then try to call "_message_get_suggested_recipients" + # -> lang code should be ignored + cls.lang_fr.active = False + # Create a lead with an active language -> should keep the preset language for recipients + cls.lang_en = model_lang.search([('code', '=', 'en_US')]) + if not cls.lang_en: + cls.lang_en = model_lang._create_lang('en_US') + # set American English language as active then try to call "_message_get_suggested_recipients" + # -> lang code should be kept + cls.lang_en.active = True + + @users('user_sales_manager') + def test_lead_message_get_suggested_recipients_email(self): + """ Test '_message_get_suggested_recipients' and its override in lead + when dealing with various emails. """ + lead_format, lead_multi, lead_from, lead_partner = self.env['crm.lead'].create([ + { + 'email_from': '"New Customer" ', + 'name': 'Test Suggestion (email_from with format)', + 'partner_name': 'Format Name', + 'user_id': self.user_sales_leads.id, + }, { + 'email_from': 'new.customer.multi.1@test.example.com, new.customer.2@test.example.com', + 'name': 'Test Suggestion (email_from multi)', + 'partner_name': 'Multi Name', + 'user_id': self.user_sales_leads.id, + }, { + 'email_from': 'new.customer.simple@test.example.com', + 'name': 'Test Suggestion (email_from)', + 'partner_name': 'Std Name', + 'user_id': self.user_sales_leads.id, + }, { + 'name': 'Test Suggestion (partner_id)', + 'partner_id': self.contact_1.id, + 'user_id': self.user_sales_leads.id, + } + ]) + for lead, expected in zip( + lead_format + lead_multi + lead_from + lead_partner, + [(False, '"New Customer" ', None, 'Customer Email', + {'company_name': 'Format Name', 'email': 'new.customer.format@test.example.com', + 'name': 'Format Name', 'user_id': self.user_sales_leads.id, + 'team_id': self.sales_team_1.id, + }), + (False, 'new.customer.multi.1@test.example.com, new.customer.2@test.example.com', None, 'Customer Email', + {}), # no email_normalized -> no information + (False, 'new.customer.simple@test.example.com', None, 'Customer Email', + {'company_name': 'Std Name', 'email': 'new.customer.simple@test.example.com', + 'name': 'Std Name', 'user_id': self.user_sales_leads.id, + 'team_id': self.sales_team_1.id, + }), + (self.contact_1.id, '"Philip J Fry" <"Philip, J. Fry" >', self.contact_1.lang, 'Customer', + {}), # creation values only if not partner + ] + ): + with self.subTest(lead=lead, lead_name=lead.name, email_from=lead.email_from): + res = lead._message_get_suggested_recipients()[lead.id] + self.assertEqual(len(res), 1) + self.assertEqual(res[0][:4], expected[:4]) + customer_data = expected[4] + if not customer_data: + self.assertFalse(res[0][4]) + else: + for partner_fname in customer_data: + found, expected = res[0][4][partner_fname], customer_data[partner_fname] + self.assertEqual( + found, expected, + f'Lead suggested customer: wrong value for {partner_fname} got {found} instead of {expected}') + + @users('user_sales_manager') + def test_lead_message_get_suggested_recipients_langs(self): + """This test checks that creating a contact from a lead with an inactive + language will ignore the language while creating a contact from a lead + with an active language will take it into account """ + leads = self.env['crm.lead'].create([ + { + 'email_from': self.test_email, + 'lang_id': self.lang_fr.id, + 'name': 'TestLead', + }, { + 'email_from': self.test_email, + 'lang_id': self.lang_en.id, + 'name': 'TestLead', + } + ]) + expected_list = [ + (False, self.test_email, None, 'Customer Email', {'lang': 'fr_FR'}), + (False, self.test_email, 'en_US', 'Customer Email', {'lang': 'en_US'}), + ] + for lead, expected in zip(leads, expected_list): + with self.subTest(lead=lead): + res = lead._message_get_suggested_recipients()[lead.id] + self.assertEqual(len(res), 1) + self.assertEqual(res[0][:4], expected[:4]) + for partner_fname in expected[4]: + found = res[0][4][partner_fname] + expected = expected[4][partner_fname] + self.assertEqual( + found, expected, + f'Lead suggested customer: wrong value for {partner_fname} got {found} instead of {expected}') + + @users('user_sales_manager') + def test_lead_message_get_suggested_recipients_values_for_create(self): + """Check default creates value used when creating client from suggested + recipients (customer).""" + lead_details_for_contact = { + 'title': self.env.ref('base.res_partner_title_mister').id, + 'street': '3rd Floor, Room 3-C', + 'street2': '123 Arlington Avenue', + 'zip': '13202', + 'city': 'New York', + 'country_id': self.env.ref('base.us').id, + 'state_id': self.env.ref('base.state_us_39').id, + 'website': 'https://www.arlington123.com/3f3c', + 'phone': '678-728-0949', + 'mobile': '661-606-0781', + 'function': 'Delivery Boy', + 'team_id': self.sales_team_1.id, + 'user_id': self.user_sales_manager.id, + } + + for partner_name, name, email in [ + (False, 'Test', 'test_default_create@example.com'), + ('Delivery Boy company', 'Test With Company', 'default_create_with_partner@example.com'), + ('Delivery Boy company', '', 'default_create_with_partner_no_name@example.com'), + ]: + formatted_email = formataddr((name, email)) + with self.subTest(partner_name=partner_name): + lang = self.env['res.lang'].sudo().search([], limit=1)[0] + description = '

Top

' + lead1 = self.env['crm.lead'].create({ + 'name': 'TestLead', + 'contact_name': name, + 'email_from': formatted_email, + 'lang_id': lang.id, + 'description': description, + 'partner_name': partner_name, + **lead_details_for_contact, + }) + data = lead1._message_get_suggested_recipients()[lead1.id] + suggested_partner_id, suggested_partner_email, suggested_lang, suggested_reason, create_vals = data[0] + self.assertFalse(suggested_partner_id) + self.assertEqual(suggested_partner_email, formatted_email) + self.assertEqual(suggested_lang, lang.code) + self.assertEqual(suggested_reason, 'Customer Email') + self.assertEqual(create_vals, lead1._get_customer_information().get(email, {})) + for field, value in lead_details_for_contact.items(): + self.assertEqual(create_vals.get(field), value) + expected_name = partner_name if partner_name and not name else name + self.assertEqual(create_vals['name'], expected_name) + self.assertEqual(create_vals['comment'], description) # description -> comment + # Parent company not created even if partner_name is set + self.assertFalse(create_vals.get('parent_id')) # not supported, even if partner_name set + self.assertEqual(create_vals['company_name'], partner_name) # partner_name -> company_name + expected_company_type = 'company' if partner_name and not name else 'person' + self.assertEqual(create_vals.get('company_type', 'person'), expected_company_type) + + # Check that the creation of the contact won't fail + partner = self.env['res.partner'].create(create_vals) + partner.unlink() def test_new_lead_notification(self): """ Test newly create leads like from the website. People and channels @@ -39,6 +215,7 @@ class NewLeadNotification(TestCrmCommon): lead_user = lead.with_user(self.user_sales_manager) self.assertTrue(lead_user.message_needaction) + @mute_logger('odoo.addons.mail.models.mail_thread') def test_new_lead_from_email_multicompany(self): company0 = self.env.company company1 = self.env['res.company'].create({'name': 'new_company'}) diff --git a/addons/crm/tests/test_crm_ui.py b/addons/crm/tests/test_crm_ui.py index 38b0b6ede6f..508045c9287 100644 --- a/addons/crm/tests/test_crm_ui.py +++ b/addons/crm/tests/test_crm_ui.py @@ -1,8 +1,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.addons.crm.tests.common import TestCrmCommon from odoo.tests import HttpCase -from odoo.tests.common import tagged, users +from odoo.tests.common import tagged @tagged('post_install', '-at_install') diff --git a/addons/test_mail/tests/test_mail_thread_internals.py b/addons/test_mail/tests/test_mail_thread_internals.py index 684d1bacd84..523cbd56b6d 100644 --- a/addons/test_mail/tests/test_mail_thread_internals.py +++ b/addons/test_mail/tests/test_mail_thread_internals.py @@ -360,25 +360,6 @@ class TestDiscuss(MailCommon, TestRecipients): [(False, email, None, 'Customer Email', {'mobile': '+33199001015', 'phone': False})] ) - @users("employee") - @mute_logger('odoo.addons.mail.models.mail_mail') - def test_suggested_recipients_mail_cc(self): - """ MailThreadCC mixin adds its own suggested recipients management - coming from CC (carbon copy) management. """ - record = self.env['mail.test.cc'].create({ - 'email_cc': 'cc1@example.com, cc2@example.com, cc3 ', - }) - suggestions = record._message_get_suggested_recipients()[record.id] - self.assertEqual( - sorted(suggestions), - [ - (False, '"cc3" ', None, 'CC Email', {}), - (False, 'cc1@example.com', None, 'CC Email', {}), - (False, 'cc2@example.com', None, 'CC Email', {}), - ], - 'cc should be in suggestions' - ) - @users("employee") def test_unlink_notification_message(self): channel = self.env['discuss.channel'].create({'name': 'testChannel'}) diff --git a/addons/test_mail/tests/test_mail_thread_mixins.py b/addons/test_mail/tests/test_mail_thread_mixins.py index 169a5257538..c28f4bd1706 100644 --- a/addons/test_mail/tests/test_mail_thread_mixins.py +++ b/addons/test_mail/tests/test_mail_thread_mixins.py @@ -4,7 +4,7 @@ from odoo import exceptions, tools from odoo.addons.mail.tests.common import MailCommon from odoo.addons.test_mail.tests.common import TestRecipients -from odoo.tests.common import tagged +from odoo.tests.common import tagged, users from odoo.tools import mute_logger @@ -59,3 +59,26 @@ class TestMailThread(MailCommon, TestRecipients): self.assertTrue(new_record.is_blacklisted) bl_record.unlink() + + +@tagged('mail_thread', 'mail_thread_cc') +class TestMailThreadCC(MailCommon): + + @users("employee") + @mute_logger('odoo.addons.mail.models.mail_mail') + def test_suggested_recipients_mail_cc(self): + """ MailThreadCC mixin adds its own suggested recipients management + coming from CC (carbon copy) management. """ + record = self.env['mail.test.cc'].create({ + 'email_cc': 'cc1@example.com, cc2@example.com, cc3 ', + }) + suggestions = record._message_get_suggested_recipients()[record.id] + self.assertEqual( + sorted(suggestions), + [ + (False, '"cc3" ', None, 'CC Email', {}), + (False, 'cc1@example.com', None, 'CC Email', {}), + (False, 'cc2@example.com', None, 'CC Email', {}), + ], + 'cc should be in suggestions' + )