def test_crm_lead_partner_sync_email_phone_corner_cases(self): """ Test corner cases of email and phone sync (False versus '', formatting differences, wrong input, ...) """ test_email = '*****@*****.**' lead = self.lead_1.with_user(self.env.user) contact = self.env['res.partner'].create({ 'name': 'NoContact Partner', 'phone': '', 'email': '', 'mobile': '', }) lead_form = Form(lead) self.assertEqual(lead_form.email_from, test_email) self.assertFalse(lead_form.ribbon_message) # email: False versus empty string lead_form.partner_id = contact self.assertIn('the customer email', lead_form.ribbon_message) lead_form.email_from = '' self.assertFalse(lead_form.ribbon_message) lead_form.email_from = False self.assertFalse(lead_form.ribbon_message) # phone: False versus empty string lead_form.phone = '+1 202-555-0888' self.assertIn('the customer phone', lead_form.ribbon_message) lead_form.phone = '' self.assertFalse(lead_form.ribbon_message) lead_form.phone = False self.assertFalse(lead_form.ribbon_message) # email/phone: formatting should not trigger ribbon lead.write({ 'email_from': '"My Name" <%s>' % test_email, 'phone': '+1 202-555-0888', }) contact.write({ 'email': '"My Name" <%s>' % test_email, 'phone': '+1 202-555-0888', }) lead_form = Form(lead) self.assertFalse(lead_form.ribbon_message) lead_form.partner_id = contact self.assertFalse(lead_form.ribbon_message) lead_form.email_from = '"Another Name" <%s>' % test_email # same email normalized self.assertFalse(lead_form.ribbon_message, 'Formatting-only change should not trigger write') lead_form.phone = '2025550888' # same number but another format self.assertFalse(lead_form.ribbon_message, 'Formatting-only change should not trigger write') # wrong value are also propagated lead_form.phone = '666 789456789456789456' self.assertIn('the customer phone', lead_form.ribbon_message)
def test_crm_lead_partner_sync_email_phone(self): """ Specifically test synchronize between a lead and its partner about phone and email fields. Phone especially has some corner cases due to automatic formatting (notably with onchange in form view). """ lead, partner = self.lead_1.with_user(self.env.user), self.contact_2 lead_form = Form(lead) # reset partner phone to a local number and prepare formatted / sanitized values partner_phone, partner_mobile = self.test_phone_data[ 2], self.test_phone_data[1] partner_phone_formatted = phone_format(partner_phone, 'US', '1') partner_phone_sanitized = phone_format(partner_phone, 'US', '1', force_format='E164') partner_mobile_formatted = phone_format(partner_mobile, 'US', '1') partner_mobile_sanitized = phone_format(partner_mobile, 'US', '1', force_format='E164') partner_email, partner_email_normalized = self.test_email_data[ 2], self.test_email_data_normalized[2] self.assertEqual(partner_phone_formatted, '+1 202-555-0888') self.assertEqual(partner_phone_sanitized, self.test_phone_data_sanitized[2]) self.assertEqual(partner_mobile_formatted, '+1 202-555-0999') self.assertEqual(partner_mobile_sanitized, self.test_phone_data_sanitized[1]) # ensure initial data self.assertEqual(partner.phone, partner_phone) self.assertEqual(partner.mobile, partner_mobile) self.assertEqual(partner.email, partner_email) # LEAD/PARTNER SYNC: email and phone are propagated to lead # as well as mobile (who does not trigger the reverse sync) lead_form.partner_id = partner self.assertEqual(lead_form.email_from, partner_email) self.assertEqual(lead_form.phone, partner_phone_formatted, 'Lead: form automatically formats numbers') self.assertEqual(lead_form.mobile, partner_mobile_formatted, 'Lead: form automatically formats numbers') self.assertFalse(lead_form.ribbon_message) lead_form.save() self.assertEqual(partner.phone, partner_phone, 'Lead / Partner: partner values sent to lead') self.assertEqual(lead.email_from, partner_email, 'Lead / Partner: partner values sent to lead') self.assertEqual( lead.email_normalized, partner_email_normalized, 'Lead / Partner: equal emails should lead to equal normalized emails' ) self.assertEqual( lead.phone, partner_phone_formatted, 'Lead / Partner: partner values (formatted) sent to lead') self.assertEqual( lead.mobile, partner_mobile_formatted, 'Lead / Partner: partner values (formatted) sent to lead') self.assertEqual(lead.phone_sanitized, partner_mobile_sanitized, 'Lead: phone_sanitized computed field on mobile') # for email_from, if only formatting differs, warning ribbon should # not appear and email on partner should not be updated lead_form.email_from = '"Hermes Conrad" <%s>' % partner_email_normalized self.assertFalse(lead_form.ribbon_message) lead_form.save() self.assertEqual(lead_form.partner_id.email, partner_email) # LEAD/PARTNER SYNC: lead updates partner new_email = '"John Zoidberg" <*****@*****.**>' new_email_normalized = '*****@*****.**' lead_form.email_from = new_email self.assertIn('the customer email will', lead_form.ribbon_message) new_phone = '+1 202 555 7799' new_phone_formatted = phone_format(new_phone, 'US', '1') lead_form.phone = new_phone self.assertEqual(lead_form.phone, new_phone_formatted) self.assertIn('the customer email and phone number will', lead_form.ribbon_message) lead_form.save() self.assertEqual(partner.email, new_email) self.assertEqual(partner.email_normalized, new_email_normalized) self.assertEqual(partner.phone, new_phone_formatted) # LEAD/PARTNER SYNC: mobile does not update partner new_mobile = '+1 202 555 6543' new_mobile_formatted = phone_format(new_mobile, 'US', '1') lead_form.mobile = new_mobile lead_form.save() self.assertEqual(lead.mobile, new_mobile_formatted) self.assertEqual(partner.mobile, partner_mobile) # LEAD/PARTNER SYNC: reseting lead values also resets partner for email # and phone, but not for mobile lead_form.email_from, lead_form.phone, lead.mobile = False, False, False self.assertIn('the customer email and phone number will', lead_form.ribbon_message) lead_form.save() self.assertFalse(partner.email) self.assertFalse(partner.email_normalized) self.assertFalse(partner.phone) self.assertFalse(lead.phone) self.assertFalse(lead.mobile) self.assertFalse(lead.phone_sanitized) self.assertEqual(partner.mobile, partner_mobile) self.assertEqual(partner.phone_sanitized, partner_mobile_sanitized, 'Partner sanitized should be computed on mobile')