summaryrefslogtreecommitdiff
path: root/addons/test_mail/tests
diff options
context:
space:
mode:
Diffstat (limited to 'addons/test_mail/tests')
-rw-r--r--addons/test_mail/tests/__init__.py5
-rw-r--r--addons/test_mail/tests/test_mail_redirect.py67
-rw-r--r--addons/test_mail/tests/test_mail_thread_internals.py (renamed from addons/test_mail/tests/test_discuss.py)65
-rw-r--r--addons/test_mail/tests/test_message_track.py115
-rw-r--r--addons/test_mail/tests/test_odoobot.py132
-rw-r--r--addons/test_mail/tests/test_performance.py53
-rw-r--r--addons/test_mail/tests/test_update_notification.py11
7 files changed, 152 insertions, 296 deletions
diff --git a/addons/test_mail/tests/__init__.py b/addons/test_mail/tests/__init__.py
index 78d3b1516b6..3aac76d3df9 100644
--- a/addons/test_mail/tests/__init__.py
+++ b/addons/test_mail/tests/__init__.py
@@ -2,19 +2,16 @@
from . import test_invite
from . import test_ir_actions
-from . import test_discuss
from . import test_mail_activity
from . import test_mail_followers
from . import test_mail_message
from . import test_mail_mail
from . import test_mail_channel
from . import test_mail_gateway
-from . import test_mail_redirect
from . import test_mail_template
+from . import test_mail_thread_internals
from . import test_message_composer
from . import test_message_management
from . import test_message_post
from . import test_message_track
-from . import test_odoobot
from . import test_performance
-from . import test_update_notification
diff --git a/addons/test_mail/tests/test_mail_redirect.py b/addons/test_mail/tests/test_mail_redirect.py
deleted file mode 100644
index 706a9704319..00000000000
--- a/addons/test_mail/tests/test_mail_redirect.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-from werkzeug.urls import url_decode, url_parse
-from odoo.tests.common import HttpCase, tagged
-
-
-@tagged('-at_install', 'post_install')
-class TestMultiCompany(HttpCase):
-
- def test_redirect_to_records(self):
-
- self.company_A = self.env['res.company'].create({
- 'name': 'Company A',
- 'user_ids': [(4, self.ref('base.user_admin'))],
- })
-
- self.company_B = self.env['res.company'].create({
- 'name': 'Company B',
- })
-
- self.multi_company_record = self.env['mail.test.multi.company'].create({
- 'name': 'Multi Company Record',
- 'company_id': self.company_A.id,
- })
-
- # Test Case 0
- # Not logged, redirect to web/login
- response = self.url_open('/mail/view?model=%s&res_id=%s' % (
- self.multi_company_record._name,
- self.multi_company_record.id), timeout=15)
-
- path = url_parse(response.url).path
- self.assertEqual(path, '/web/login')
-
- self.authenticate('admin', 'admin')
-
- # Test Case 1
- # Logged into company 1, try accessing record in company A
- # _redirect_to_record should add company A in allowed_company_ids
- response = self.url_open('/mail/view?model=%s&res_id=%s' % (
- self.multi_company_record._name,
- self.multi_company_record.id), timeout=15)
-
- self.assertEqual(response.status_code, 200)
-
- fragment = url_parse(response.url).fragment
- cids = url_decode(fragment)['cids']
-
- self.assertEqual(cids, '1,%s' % (self.company_A.id))
-
- # Test Case 2
- # Logged into company 1, try accessing record in company B
- # _redirect_to_record should redirect to messaging as the user
- # doesn't have any access for this company
- self.multi_company_record.company_id = self.company_B
-
- response = self.url_open('/mail/view?model=%s&res_id=%s' % (
- self.multi_company_record._name,
- self.multi_company_record.id), timeout=15)
-
- self.assertEqual(response.status_code, 200)
-
- fragment = url_parse(response.url).fragment
- action = url_decode(fragment)['action']
-
- self.assertEqual(action, 'mail.action_discuss')
diff --git a/addons/test_mail/tests/test_discuss.py b/addons/test_mail/tests/test_mail_thread_internals.py
index 86b9a7de0cb..1674d9ca312 100644
--- a/addons/test_mail/tests/test_discuss.py
+++ b/addons/test_mail/tests/test_mail_thread_internals.py
@@ -1,7 +1,10 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from werkzeug.urls import url_parse, url_decode
+
from odoo.addons.test_mail.tests.common import TestMailCommon, TestRecipients
+from odoo.tests.common import tagged, HttpCase
from odoo.tools import mute_logger
@@ -141,3 +144,65 @@ class TestDiscuss(TestMailCommon, TestRecipients):
(False, 'cc1@example.com', 'CC Email'),
(False, 'cc2@example.com', 'CC Email'),
], 'cc should be in suggestions')
+
+
+@tagged('-at_install', 'post_install')
+class TestMultiCompany(HttpCase):
+
+ def test_redirect_to_records(self):
+
+ self.company_A = self.env['res.company'].create({
+ 'name': 'Company A',
+ 'user_ids': [(4, self.ref('base.user_admin'))],
+ })
+
+ self.company_B = self.env['res.company'].create({
+ 'name': 'Company B',
+ })
+
+ self.multi_company_record = self.env['mail.test.multi.company'].create({
+ 'name': 'Multi Company Record',
+ 'company_id': self.company_A.id,
+ })
+
+ # Test Case 0
+ # Not logged, redirect to web/login
+ response = self.url_open('/mail/view?model=%s&res_id=%s' % (
+ self.multi_company_record._name,
+ self.multi_company_record.id), timeout=15)
+
+ path = url_parse(response.url).path
+ self.assertEqual(path, '/web/login')
+
+ self.authenticate('admin', 'admin')
+
+ # Test Case 1
+ # Logged into company 1, try accessing record in company A
+ # _redirect_to_record should add company A in allowed_company_ids
+ response = self.url_open('/mail/view?model=%s&res_id=%s' % (
+ self.multi_company_record._name,
+ self.multi_company_record.id), timeout=15)
+
+ self.assertEqual(response.status_code, 200)
+
+ fragment = url_parse(response.url).fragment
+ cids = url_decode(fragment)['cids']
+
+ self.assertEqual(cids, '1,%s' % (self.company_A.id))
+
+ # Test Case 2
+ # Logged into company 1, try accessing record in company B
+ # _redirect_to_record should redirect to messaging as the user
+ # doesn't have any access for this company
+ self.multi_company_record.company_id = self.company_B
+
+ response = self.url_open('/mail/view?model=%s&res_id=%s' % (
+ self.multi_company_record._name,
+ self.multi_company_record.id), timeout=15)
+
+ self.assertEqual(response.status_code, 200)
+
+ fragment = url_parse(response.url).fragment
+ action = url_decode(fragment)['action']
+
+ self.assertEqual(action, 'mail.action_discuss')
diff --git a/addons/test_mail/tests/test_message_track.py b/addons/test_mail/tests/test_message_track.py
index 20ee3d74c4b..45ae711d32b 100644
--- a/addons/test_mail/tests/test_message_track.py
+++ b/addons/test_mail/tests/test_message_track.py
@@ -4,8 +4,10 @@
from unittest.mock import patch
from odoo.addons.test_mail.tests.common import TestMailCommon
+from odoo.tests.common import tagged
+@tagged('mail_track')
class TestTracking(TestMailCommon):
def setUp(self):
@@ -127,61 +129,6 @@ class TestTracking(TestMailCommon):
# one email send due to template
self.assertSentEmail(self.record.env.user.partner_id, [self.partner_admin], body='<p>Hello Test</p>')
- def test_message_tracking_sequence(self):
- """ Update some tracked fields and check that the mail.tracking.value are ordered according to their tracking_sequence"""
- self.record.write({
- 'name': 'Zboub',
- 'customer_id': self.user_admin.partner_id.id,
- 'user_id': self.user_admin.id,
- 'umbrella_id': self.env['mail.test'].with_context(mail_create_nosubscribe=True).create({'name': 'Umbrella'}).id
- })
- self.flush_tracking()
- self.assertEqual(len(self.record.message_ids), 1, 'should have 1 tracking message')
-
- tracking_values = self.env['mail.tracking.value'].search([('mail_message_id', '=', self.record.message_ids.id)])
- self.assertEqual(tracking_values[0].tracking_sequence, 1)
- self.assertEqual(tracking_values[1].tracking_sequence, 2)
- self.assertEqual(tracking_values[2].tracking_sequence, 100)
-
- def test_track_groups(self):
- # patch the group attribute
- field = self.record._fields['email_from']
- self.addCleanup(setattr, field, 'groups', field.groups)
- field.groups = 'base.group_erp_manager'
-
- self.record.sudo().write({'email_from': 'X'})
- self.flush_tracking()
-
- msg_emp = self.record.message_ids.message_format()
- msg_sudo = self.record.sudo().message_ids.message_format()
- self.assertFalse(msg_emp[0].get('tracking_value_ids'), "should not have protected tracking values")
- self.assertTrue(msg_sudo[0].get('tracking_value_ids'), "should have protected tracking values")
-
- def test_notify_track_groups(self):
- # patch the group attribute
- field = self.record._fields['email_from']
- self.addCleanup(setattr, field, 'groups', field.groups)
- field.groups = 'base.group_erp_manager'
-
- self.record.sudo().write({'email_from': 'X'})
- self.flush_tracking()
-
- msg_emp = self.record._notify_prepare_template_context(self.record.message_ids, {})
- msg_sudo = self.record.sudo()._notify_prepare_template_context(self.record.message_ids, {})
- self.assertFalse(msg_emp.get('tracking_values'), "should not have protected tracking values")
- self.assertTrue(msg_sudo.get('tracking_values'), "should have protected tracking values")
-
- def test_unlinked_field(self):
- record_sudo = self.record.sudo()
- record_sudo.write({'email_from': 'X'}) # create a tracking value
- self.flush_tracking()
- self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 1)
- ir_model_field = self.env['ir.model.fields'].search([
- ('model', '=', 'mail.test.full'),
- ('name', '=', 'email_from')])
- ir_model_field.with_context(_force_unlink=True).unlink()
- self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 0)
-
def test_create_partner_from_tracking_multicompany(self):
company1 = self.env['res.company'].create({'name': 'company1'})
self.env.user.write({'company_ids': [(4, company1.id, False)]})
@@ -334,3 +281,61 @@ class TestTracking(TestMailCommon):
('partner_name', 'char', 'Fool', 'Bar'),
('partner_email', 'char', 'foo@example.com', 'bar@example.com'),
])
+
+
+@tagged('mail_track')
+class TestTrackingInternals(TestMailCommon):
+
+ def setUp(self):
+ super(TestTrackingInternals, self).setUp()
+
+ record = self.env['mail.test.full'].with_user(self.user_employee).with_context(self._test_context).create({
+ 'name': 'Test',
+ })
+ self.flush_tracking()
+ self.record = record.with_context(mail_notrack=False)
+
+ def test_track_groups(self):
+ field = self.record._fields['email_from']
+ self.addCleanup(setattr, field, 'groups', field.groups)
+ field.groups = 'base.group_erp_manager'
+
+ self.record.sudo().write({'email_from': 'X'})
+ self.flush_tracking()
+
+ msg_emp = self.record.message_ids.message_format()
+ msg_sudo = self.record.sudo().message_ids.message_format()
+ self.assertFalse(msg_emp[0].get('tracking_value_ids'), "should not have protected tracking values")
+ self.assertTrue(msg_sudo[0].get('tracking_value_ids'), "should have protected tracking values")
+
+ msg_emp = self.record._notify_prepare_template_context(self.record.message_ids, {})
+ msg_sudo = self.record.sudo()._notify_prepare_template_context(self.record.message_ids, {})
+ self.assertFalse(msg_emp.get('tracking_values'), "should not have protected tracking values")
+ self.assertTrue(msg_sudo.get('tracking_values'), "should have protected tracking values")
+
+ def test_track_sequence(self):
+ """ Update some tracked fields and check that the mail.tracking.value are ordered according to their tracking_sequence"""
+ self.record.write({
+ 'name': 'Zboub',
+ 'customer_id': self.user_admin.partner_id.id,
+ 'user_id': self.user_admin.id,
+ 'umbrella_id': self.env['mail.test'].with_context(mail_create_nosubscribe=True).create({'name': 'Umbrella'}).id
+ })
+ self.flush_tracking()
+ self.assertEqual(len(self.record.message_ids), 1, 'should have 1 tracking message')
+
+ tracking_values = self.env['mail.tracking.value'].search([('mail_message_id', '=', self.record.message_ids.id)])
+ self.assertEqual(tracking_values[0].tracking_sequence, 1)
+ self.assertEqual(tracking_values[1].tracking_sequence, 2)
+ self.assertEqual(tracking_values[2].tracking_sequence, 100)
+
+ def test_unlinked_field(self):
+ record_sudo = self.record.sudo()
+ record_sudo.write({'email_from': 'new_value'}) # create a tracking value
+ self.flush_tracking()
+ self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 1)
+ ir_model_field = self.env['ir.model.fields'].search([
+ ('model', '=', 'mail.test.full'),
+ ('name', '=', 'email_from')])
+ ir_model_field.with_context(_force_unlink=True).unlink()
+ self.assertEqual(len(record_sudo.message_ids.tracking_value_ids), 0)
diff --git a/addons/test_mail/tests/test_odoobot.py b/addons/test_mail/tests/test_odoobot.py
deleted file mode 100644
index 2e4dc55490a..00000000000
--- a/addons/test_mail/tests/test_odoobot.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-from unittest.mock import patch
-
-from odoo.addons.test_mail.tests.common import TestMailCommon, TestRecipients
-from odoo.tests import tagged
-from odoo.tools import mute_logger
-
-
-@tagged("odoobot")
-class TestOdoobot(TestMailCommon, TestRecipients):
-
- @classmethod
- def setUpClass(cls):
- super(TestOdoobot, cls).setUpClass()
- cls.test_record = cls.env['mail.test.simple'].with_context(cls._test_context).create({'name': 'Test', 'email_from': 'ignasse@example.com'})
-
- cls.odoobot = cls.env.ref("base.partner_root")
- cls.message_post_default_kwargs = {
- 'body': '',
- 'attachment_ids': [],
- 'message_type': 'comment',
- 'partner_ids': [],
- 'subtype_xmlid': 'mail.mt_comment'
- }
- cls.odoobot_ping_body = '<a href="http://odoo.com/web#model=res.partner&amp;id=%s" class="o_mail_redirect" data-oe-id="%s" data-oe-model="res.partner" target="_blank">@OdooBot</a>' % (cls.odoobot.id, cls.odoobot.id)
- cls.test_record_employe = cls.test_record.with_user(cls.user_employee)
-
- @mute_logger('odoo.addons.mail.models.mail_mail')
- def test_fetch_listener(self):
- channel = self.env['mail.channel'].with_user(self.user_employee).init_odoobot()
- partners = self.env['mail.channel'].channel_fetch_listeners(channel.uuid)
- odoobot = self.env.ref("base.partner_root")
- odoobot_in_fetch_listeners = [partner for partner in partners if partner['id'] == odoobot.id]
- self.assertEqual(len(odoobot_in_fetch_listeners), 1, 'odoobot should appear only once in channel_fetch_listeners')
-
- @mute_logger('odoo.addons.mail.models.mail_mail')
- def test_odoobot_ping(self):
- kwargs = self.message_post_default_kwargs.copy()
- kwargs.update({'body': self.odoobot_ping_body, 'partner_ids': [self.odoobot.id, self.user_admin.partner_id.id]})
-
- with patch('random.choice', lambda x: x[0]):
- self.assertNextMessage(
- self.test_record_employe.with_context({'mail_post_autofollow': True}).message_post(**kwargs),
- sender=self.odoobot,
- answer=False
- )
- # Odoobot should not be a follower but user_employee and user_admin should
- follower = self.test_record.message_follower_ids.mapped('partner_id')
- self.assertNotIn(self.odoobot, follower)
- self.assertIn(self.user_employee.partner_id, follower)
- self.assertIn(self.user_admin.partner_id, follower)
-
- @mute_logger('odoo.addons.mail.models.mail_mail')
- def test_onboarding_flow(self):
- kwargs = self.message_post_default_kwargs.copy()
- channel = self.env['mail.channel'].with_user(self.user_employee).init_odoobot()
-
- kwargs['body'] = 'tagada 😊'
- self.assertNextMessage(
- channel.message_post(**kwargs),
- sender=self.odoobot,
- answer=("attachment",)
- )
- kwargs['body'] = ''
- attachment = self.env['ir.attachment'].with_user(self.user_employee).create({
- 'datas': 'bWlncmF0aW9uIHRlc3Q=',
- 'name': 'picture_of_your_dog.doc',
- 'res_model': 'mail.compose.message',
- })
- kwargs['attachment_ids'] = [attachment.id]
- last_message = self.assertNextMessage(
- channel.message_post(**kwargs),
- sender=self.odoobot,
- answer=("help",)
- )
- kwargs['attachment_ids'] = []
-
- channel.execute_command(command="help")
- self.assertNextMessage(
- last_message, # no message will be post with command help, use last odoobot message instead
- sender=self.odoobot,
- answer=("@OdooBot",)
- )
- # we dont test the end of the flow since it will depends of the installed apps (livechat)
- self.user_employee.odoobot_state = "idle"
- kwargs['partner_ids'] = []
- kwargs['body'] = "I love you"
- self.assertNextMessage(
- channel.message_post(**kwargs),
- sender=self.odoobot,
- answer=("too human for me",)
- )
- kwargs['body'] = "Go fuck yourself"
- self.assertNextMessage(
- channel.message_post(**kwargs),
- sender=self.odoobot,
- answer=("I have feelings",)
- )
-
- @mute_logger('odoo.addons.mail.models.mail_mail')
- def test_odoobot_no_default_answer(self):
- kwargs = self.message_post_default_kwargs.copy()
- kwargs.update({'body': "I'm not talking to @odoobot right now", 'partner_ids': []})
- self.assertNextMessage(
- self.test_record_employe.message_post(**kwargs),
- answer=False
- )
-
- def assertNextMessage(self, message, answer=None, sender=None):
- last_message = self.env['mail.message'].search([('id', '=', message.id + 1)])
- if last_message:
- body = last_message.body.replace('<p>', '').replace('</p>', '')
- else:
- self.assertFalse(answer, "No last message found when an answer was expect")
- if answer is not None:
- if answer and not last_message:
- self.assertTrue(False, "No last message found")
- if isinstance(answer, list):
- self.assertIn(body, answer)
- elif isinstance(answer, tuple):
- for elem in answer:
- self.assertIn(elem, body)
- elif not answer:
- self.assertFalse(last_message, "No answer should have been post")
- return
- else:
- self.assertEqual(body, answer)
- if sender:
- self.assertEqual(sender, last_message.author_id)
- return last_message
diff --git a/addons/test_mail/tests/test_performance.py b/addons/test_mail/tests/test_performance.py
index de82171251b..1d8ab7729c9 100644
--- a/addons/test_mail/tests/test_performance.py
+++ b/addons/test_mail/tests/test_performance.py
@@ -183,6 +183,11 @@ class TestMailAPIPerformance(BaseMailPerformance):
'notification_type': 'inbox',
'groups_id': [(6, 0, [self.env.ref('base.group_user').id])],
})
+
+ # automatically follow activities, for backward compatibility concerning query count
+ self.env.ref('mail.mt_activities').write({'default': True})
+
+ def _create_test_records(self):
self.test_record_full = self.env['mail.test.full'].with_context(self._quick_create_ctx).create({
'name': 'TestRecord',
'customer_id': self.customer.id,
@@ -199,9 +204,6 @@ class TestMailAPIPerformance(BaseMailPerformance):
'email_to': '${("%s Customer <%s>" % (object.name, object.email_from)) | safe}',
})
- # automatically follow activities, for backward compatibility concerning query count
- self.env.ref('mail.mt_activities').write({'default': True})
-
@users('__system__', 'emp')
@warmup
def test_adv_activity(self):
@@ -255,6 +257,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
@mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail')
def test_mail_composer(self):
+ self._create_test_records()
test_record = self.env['mail.test.full'].browse(self.test_record_full.id)
customer_id = self.customer.id
with self.assertQueryCount(__system__=4, emp=4):
@@ -274,6 +277,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
@mute_logger('odoo.tests', 'odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
def test_mail_composer_w_template(self):
+ self._create_test_records()
test_record = self.env['mail.test.full'].browse(self.test_record_full.id)
test_template = self.env['mail.template'].browse(self.test_template_full.id)
# TODO FIXME non deterministic, last check 25 Mar 2020. Runbot at most +7 compared to local.
@@ -395,6 +399,25 @@ class TestMailAPIPerformance(BaseMailPerformance):
with self.assertQueryCount(__system__=2, emp=2):
record.message_subscribe(partner_ids=self.user_test.partner_id.ids, subtype_ids=subtype_ids)
+ @mute_logger('odoo.models.unlink')
+ @users('__system__', 'emp')
+ @warmup
+ def test_message_track(self):
+ record = self.env['mail.test.tracking'].create({'name': 'Zizizatestname'})
+ with self.assertQueryCount(__system__=3, emp=3):
+ record.write({'name': 'Zizizanewtestname'})
+ record.flush()
+
+ with self.assertQueryCount(__system__=5, emp=5):
+ record.write({'field_%s' % (i): 'Tracked Char Fields %s' % (i) for i in range(3)})
+ record.flush()
+
+ with self.assertQueryCount(__system__=6, emp=6):
+ record.write({'field_%s' % (i): 'Field Without Cache %s' % (i) for i in range(3)})
+ record.flush()
+ record.write({'field_%s' % (i): 'Field With Cache %s' % (i) for i in range(3)})
+ record.flush()
+
@tagged('mail_performance')
class TestMailComplexPerformance(BaseMailPerformance):
@@ -949,27 +972,3 @@ class TestMailHeavyPerformancePost(BaseMailPerformance):
self.assertEqual(self.attachements.mapped('res_model'), [record._name for i in range(3)])
self.assertEqual(self.attachements.mapped('res_id'), [record.id for i in range(3)])
# self.assertEqual(record.message_ids[0].notified_partner_ids, [])
-
-
-@tagged('mail_performance')
-class TestTrackingPerformance(BaseMailPerformance):
-
- @users('__system__', 'demo')
- @warmup
- def test_tracking_multiple_fields(self):
- """ Check that tracking multiple fields is scalable """
-
- record = self.env['mail.test.tracking'].create({'name': 'Zizizatestname'})
- with self.assertQueryCount(__system__=3, demo=3):
- record.write({'name': 'Zizizanewtestname'})
- record.flush()
-
- with self.assertQueryCount(__system__=5, demo=5):
- record.write({'field_%s' % (i): 'Tracked Char Fields %s' % (i) for i in range(3)})
- record.flush()
-
- with self.assertQueryCount(__system__=6, demo=6):
- record.write({'field_%s' % (i): 'Field Without Cache %s' % (i) for i in range(3)})
- record.flush()
- record.write({'field_%s' % (i): 'Field With Cache %s' % (i) for i in range(3)})
- record.flush()
diff --git a/addons/test_mail/tests/test_update_notification.py b/addons/test_mail/tests/test_update_notification.py
deleted file mode 100644
index 7621e4056a1..00000000000
--- a/addons/test_mail/tests/test_update_notification.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# -*- coding: utf-8 -*-
-from odoo.tests.common import TransactionCase
-
-
-class TestUpdateNotification(TransactionCase):
- def test_user_count(self):
- ping_msg = self.env['publisher_warranty.contract'].with_context(active_test=False)._get_message()
- user_count = self.env['res.users'].search_count([('active', '=', True)])
- self.assertEqual(ping_msg.get('nbr_users'), user_count, 'Update Notification: Users count is badly computed in ping message')
- share_user_count = self.env['res.users'].search_count([('active', '=', True), ('share', '=', True)])
- self.assertEqual(ping_msg.get('nbr_share_users'), share_user_count, 'Update Notification: Portal Users count is badly computed in ping message')