def testGetUsersPrefs(self): self.user_service.userprefs_tbl = mock.Mock() self.user_service.userprefs_tbl.Select.return_value = [ (111, 'code_font', 'true'), (111, 'keep_perms_open', 'true'), # Note: user 222 has not set any prefs. (333, 'code_font', 'false') ] prefs_dict = self.user_service.GetUsersPrefs(self.cnxn, [111, 222, 333]) expected = { 111: user_pb2.UserPrefs(user_id=111, prefs=[ user_pb2.UserPrefValue(name='code_font', value='true'), user_pb2.UserPrefValue( name='keep_perms_open', value='true') ]), 222: user_pb2.UserPrefs(user_id=222), 333: user_pb2.UserPrefs(user_id=333, prefs=[ user_pb2.UserPrefValue(name='code_font', value='false') ]), } self.assertEqual(expected, prefs_dict)
def testComputeGroupReasonList_NotifyAll(self): """Project is configured to always notify [email protected].""" self.project.issue_notify_address = '*****@*****.**' actual = notify_reasons.ComputeGroupReasonList('cnxn', self.services, self.project, self.issue, self.config, self.users_by_id, [], True) self.CheckGroupReasonList( actual, owner_apl=[ notify_reasons.AddrPerm( False, self.fred.email, self.fred, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.fred.user_id)) ], all_notifications_apl=[ notify_reasons.AddrPerm(False, '*****@*****.**', None, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()) ]) # We don't use the notify-all address when the issue is not public. actual = notify_reasons.ComputeGroupReasonList('cnxn', self.services, self.project, self.issue, self.config, self.users_by_id, [], False) self.CheckGroupReasonList( actual, owner_apl=[ notify_reasons.AddrPerm( False, self.fred.email, self.fred, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.fred.user_id)) ]) # Now with the notify-all address disabled. actual = notify_reasons.ComputeGroupReasonList( 'cnxn', self.services, self.project, self.issue, self.config, self.users_by_id, [], True, include_notify_all=False) self.CheckGroupReasonList( actual, owner_apl=[ notify_reasons.AddrPerm( False, self.fred.email, self.fred, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.fred.user_id)) ])
def testNotifyAddress(self): # No mailing list or filter rules are defined addr_perm_list = notify_reasons.ComputeProjectNotificationAddrList( self.cnxn, self.services, self.project, True, set()) self.assertListEqual([], addr_perm_list) # Only mailing list is notified. self.project.issue_notify_address = '*****@*****.**' addr_perm_list = notify_reasons.ComputeProjectNotificationAddrList( self.cnxn, self.services, self.project, True, set()) self.assertListEqual([ notify_reasons.AddrPerm(False, '*****@*****.**', None, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()) ], addr_perm_list) # No one is notified because mailing list was already notified. omit_addrs = {'*****@*****.**'} addr_perm_list = notify_reasons.ComputeProjectNotificationAddrList( self.cnxn, self.services, self.project, False, omit_addrs) self.assertListEqual([], addr_perm_list) # No one is notified because anon users cannot view. addr_perm_list = notify_reasons.ComputeProjectNotificationAddrList( self.cnxn, self.services, self.project, False, set()) self.assertListEqual([], addr_perm_list)
def testHtmlBody_WithEscapedHtml(self): """"An html body is sent with html content escaped.""" body_with_html_content = ( '<a href="http://www.google.com">test</a> \'something\'') email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(False, '*****@*****.**', self.member, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', body_with_html_content, 'unused body mem', self.project, 'example.com', self.commenter_view, self.detail_url) escaped_body_with_html_content = ( '<a href="http://www.google.com">test</a> ' ''something'') notify_helpers._MakeNotificationFooter(['reason'], REPLY_NOT_ALLOWED, 'example.com') expected_html_body = ( notify_helpers.HTML_BODY_WITH_GMAIL_ACTION_TEMPLATE % { 'url': self.detail_url, 'body': '%s-- <br/>%s' % (escaped_body_with_html_content, self.expected_html_footer) }) self.assertEquals(expected_html_body, email_task['html_body'])
def testGatherUnifiedSettingsPageData(self): mr = self.mr mr.auth.user_view = framework_views.StuffUserView( 100, 'user@invalid', True) mr.auth.user_view.profile_url = '/u/profile/url' userprefs = user_pb2.UserPrefs(prefs=[ user_pb2.UserPrefValue(name='public_issue_notice', value='true') ]) page_data = framework_helpers.UserSettings.GatherUnifiedSettingsPageData( mr.auth.user_id, mr.auth.user_view, mr.auth.user_pb, userprefs) expected_keys = [ 'settings_user', 'settings_user_pb', 'settings_user_is_banned', 'self', 'profile_url_fragment', 'preview_on_hover', 'settings_user_prefs', ] self.assertItemsEqual(expected_keys, list(page_data.keys())) self.assertEqual('profile/url', page_data['profile_url_fragment']) self.assertTrue(page_data['settings_user_prefs'].public_issue_notice) self.assertFalse(page_data['settings_user_prefs'].restrict_new_issues)
def GetUserPrefsByEmail(self, cnxn, email, use_cache=True): """Return a UserPrefs PB for the requested email, or an empty UserPrefs.""" try: user_id = self.LookupUserID(cnxn, email) user_prefs = self.GetUserPrefs(cnxn, user_id, use_cache=use_cache) except exceptions.NoSuchUserException: user_prefs = user_pb2.UserPrefs() return user_prefs
def testComputeGroupReasonList_Subscribers(self): """Bob subscribed.""" sq = tracker_bizobj.MakeSavedQuery(1, 'freds issues', 1, 'owner:[email protected]', subscription_mode='immediate', executes_in_project_ids=[789]) self.services.features.UpdateUserSavedQueries('cnxn', self.bob.user_id, [sq]) actual = notify_reasons.ComputeGroupReasonList('cnxn', self.services, self.project, self.issue, self.config, self.users_by_id, [], True) self.CheckGroupReasonList( actual, owner_apl=[ notify_reasons.AddrPerm( False, self.fred.email, self.fred, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.fred.user_id)) ], subscriber_apl=[ notify_reasons.AddrPerm( False, self.bob.email, self.bob, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.bob.user_id)) ]) # Now with subscriber notifications disabled. actual = notify_reasons.ComputeGroupReasonList( 'cnxn', self.services, self.project, self.issue, self.config, self.users_by_id, [], True, include_subscribers=False) self.CheckGroupReasonList( actual, owner_apl=[ notify_reasons.AddrPerm( False, self.fred.email, self.fred, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.fred.user_id)) ])
def testBodySelection_Member(self): """We send members the email body that is indented for members.""" email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(True, '*****@*****.**', self.member, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', 'body mem', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) self.assertIn('body mem', email_task['body'])
def testGetUserPrefs(self): self.user_service.userprefs_tbl = mock.Mock() self.user_service.userprefs_tbl.Select.return_value = [ (111, 'code_font', 'true'), (111, 'keep_perms_open', 'true'), # Note: user 222 has not set any prefs. (333, 'code_font', 'false')] userprefs = self.user_service.GetUserPrefs(self.cnxn, 111) expected = user_pb2.UserPrefs( user_id=111, prefs=[user_pb2.UserPrefValue(name='code_font', value='true'), user_pb2.UserPrefValue(name='keep_perms_open', value='true')]) self.assertEqual(expected, userprefs) userprefs = self.user_service.GetUserPrefs(self.cnxn, 222) expected = user_pb2.UserPrefs(user_id=222) self.assertEqual(expected, userprefs)
def GetUsersPrefs(self, cnxn, user_ids, use_cache=True): """Return {user_id: userprefs} for the requested user IDs.""" prefs_dict, misses = self.userprefs_2lc.GetAll(cnxn, user_ids, use_cache=use_cache) # Make sure that every user is represented in the result. for user_id in misses: prefs_dict[user_id] = user_pb2.UserPrefs(user_id=user_id) return prefs_dict
def testBodySelection_LinkOnly(self, mock_sulo): """We send a link-only body when ShouldUseLinkOnly() is true.""" mock_sulo.return_value = True email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(True, '*****@*****.**', self.member, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', 'body mem', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) self.assertIn('body link-only', email_task['body'])
def testInboundEmailDisabled(self): """We don't invite replies if they are disabled for this project.""" self.project.process_inbound_email = False email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(True, '*****@*****.**', self.member, REPLY_MAY_UPDATE, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', 'body non', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) self.assertEqual(emailfmt.NoReplyAddress(), email_task['reply_to'])
def testComputeGroupReasonList_OwnerAndCC(self): """Fred owns the issue, Alice is CC'd.""" self.issue.cc_ids = [self.alice.user_id] actual = notify_reasons.ComputeGroupReasonList('cnxn', self.services, self.project, self.issue, self.config, self.users_by_id, [], True) self.CheckGroupReasonList( actual, owner_apl=[ notify_reasons.AddrPerm( False, self.fred.email, self.fred, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.fred.user_id)) ], ccd_apl=[ notify_reasons.AddrPerm( False, self.alice.email, self.alice, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.alice.user_id)) ])
def testReasons(self): """The footer lists reasons why that email was sent to that user.""" email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(True, '*****@*****.**', self.member, REPLY_MAY_UPDATE, user_pb2.UserPrefs()), ['Funny', 'Caring', 'Near'], self.issue, 'body link-only', 'body non', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) self.assertIn('because:', email_task['body']) self.assertIn('1. Funny', email_task['body']) self.assertIn('2. Caring', email_task['body']) self.assertIn('3. Near', email_task['body']) email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(True, '*****@*****.**', self.member, REPLY_MAY_UPDATE, user_pb2.UserPrefs()), [], self.issue, 'body link-only', 'body non', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) self.assertNotIn('because', email_task['body'])
def testRecipientIsMember(self): cnxn = 'fake cnxn' ids_to_consider = [111, 222, 999] addr_perm_list = notify_reasons.ComputeIssueChangeAddressPermList( cnxn, ids_to_consider, self.project, self.issue, self.services, set(), self.users_by_id, pref_check_function=lambda *args: True) self.assertEqual([ notify_reasons.AddrPerm(True, '*****@*****.**', self.owner, REPLY_MAY_UPDATE, user_pb2.UserPrefs(user_id=111)), notify_reasons.AddrPerm(True, '*****@*****.**', self.member, REPLY_MAY_UPDATE, user_pb2.UserPrefs(user_id=222)), notify_reasons.AddrPerm(False, '*****@*****.**', self.visitor, REPLY_MAY_COMMENT, user_pb2.UserPrefs(user_id=999)) ], addr_perm_list)
def testComputeGroupReasonList_Starrers(self): """Bob and Alice starred it, but Alice opts out of notifications.""" self.alice.notify_starred_issue_change = False actual = notify_reasons.ComputeGroupReasonList( 'cnxn', self.services, self.project, self.issue, self.config, self.users_by_id, [], True, starrer_ids=[self.alice.user_id, self.bob.user_id]) self.CheckGroupReasonList( actual, owner_apl=[ notify_reasons.AddrPerm( False, self.fred.email, self.fred, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.fred.user_id)) ], starrer_apl=[ notify_reasons.AddrPerm( False, self.bob.email, self.bob, REPLY_NOT_ALLOWED, user_pb2.UserPrefs(user_id=self.bob.user_id)) ])
def testHtmlBody(self): """"An html body is sent if a detail_url is specified.""" email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(False, '*****@*****.**', self.member, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', 'body non', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) expected_html_body = ( notify_helpers.HTML_BODY_WITH_GMAIL_ACTION_TEMPLATE % { 'url': self.detail_url, 'body': 'body non-- <br/>%s' % self.expected_html_footer }) self.assertEquals(expected_html_body, email_task['html_body'])
def setUp(self): parent = user_pb2.User(user_id=111, email='*****@*****.**', linked_child_ids=[222]) child = user_pb2.User(user_id=222, email='*****@*****.**', linked_parent_id=111) user_3 = user_pb2.User(user_id=333, email='*****@*****.**') user_4 = user_pb2.User(user_id=444, email='*****@*****.**') self.addr_perm_parent = notify_reasons.AddrPerm( False, parent.email, parent, notify_reasons.REPLY_NOT_ALLOWED, user_pb2.UserPrefs()) self.addr_perm_child = notify_reasons.AddrPerm( False, child.email, child, notify_reasons.REPLY_NOT_ALLOWED, user_pb2.UserPrefs()) self.addr_perm_3 = notify_reasons.AddrPerm( False, user_3.email, user_3, notify_reasons.REPLY_NOT_ALLOWED, user_pb2.UserPrefs()) self.addr_perm_4 = notify_reasons.AddrPerm( False, user_4.email, user_4, notify_reasons.REPLY_NOT_ALLOWED, user_pb2.UserPrefs()) self.addr_perm_5 = notify_reasons.AddrPerm( False, '*****@*****.**', None, notify_reasons.REPLY_NOT_ALLOWED, user_pb2.UserPrefs())
def testReplyInvitation(self): """We include a footer about replying that is appropriate for that user.""" email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(True, '*****@*****.**', self.member, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', 'body non', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) self.assertEqual(emailfmt.NoReplyAddress(), email_task['reply_to']) self.assertNotIn('Reply to this email', email_task['body']) email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(True, '*****@*****.**', self.member, REPLY_MAY_COMMENT, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', 'body non', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) self.assertEqual( '%s@%s' % (self.project.project_name, emailfmt.MailDomain()), email_task['reply_to']) self.assertIn('Reply to this email to add a comment', email_task['body']) self.assertNotIn('make changes', email_task['body']) email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(True, '*****@*****.**', self.member, REPLY_MAY_UPDATE, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', 'body non', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) self.assertEqual( '%s@%s' % (self.project.project_name, emailfmt.MailDomain()), email_task['reply_to']) self.assertIn('Reply to this email to add a comment', email_task['body']) self.assertIn('make updates', email_task['body'])
def testFilterRuleNotifyAddresses(self): issue = fake.MakeTestIssue(self.project.project_id, 1, 'summary', 'New', 555) issue.derived_notify_addrs.extend(['*****@*****.**']) addr_perm_list = notify_reasons.ComputeIssueNotificationAddrList( self.cnxn, self.services, issue, set()) self.assertListEqual([ notify_reasons.AddrPerm(False, '*****@*****.**', None, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()) ], addr_perm_list) # Also-notify addresses can be omitted (e.g., if it is the same as # the email address of the user who made the change). addr_perm_list = notify_reasons.ComputeIssueNotificationAddrList( self.cnxn, self.services, issue, {'*****@*****.**'}) self.assertListEqual([], addr_perm_list)
def testBodySelection_NonMember(self): """We send non-members the email body that is indented for non-members.""" email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(False, '*****@*****.**', self.member, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', 'body non', 'body mem', self.project, 'example.com', self.commenter_view, self.detail_url) self.assertEqual('*****@*****.**', email_task['to']) self.assertEqual('Issue 1234 in proj1: summary', email_task['subject']) self.assertIn('body non', email_task['body']) self.assertEqual( emailfmt.FormatFromAddr(self.project, commenter_view=self.commenter_view, can_reply_to=False), email_task['from_addr']) self.assertEqual(emailfmt.NoReplyAddress(), email_task['reply_to'])
def testHtmlBody_WithUnicodeChars(self): """"An html body is sent if a detail_url is specified.""" unicode_content = '\xe2\x9d\xa4 â â' email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(False, '*****@*****.**', self.member, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', unicode_content, 'unused body mem', self.project, 'example.com', self.commenter_view, self.detail_url) expected_html_body = ( notify_helpers.HTML_BODY_WITH_GMAIL_ACTION_TEMPLATE % { 'url': self.detail_url, 'body': '%s-- <br/>%s' % (unicode_content.decode('utf-8'), self.expected_html_footer) }) self.assertEquals(expected_html_body, email_task['html_body'])
def testHtmlBody_LinkWithinTags(self): """"An html body is sent with correct <a href>s.""" email_task = notify_helpers._MakeEmailWorkItem( notify_reasons.AddrPerm(False, '*****@*****.**', self.member, REPLY_NOT_ALLOWED, user_pb2.UserPrefs()), ['reason'], self.issue, 'body link-only', 'a <http://google.com> z', 'unused body', self.project, 'example.com', self.commenter_view, self.detail_url) expected_html_body = ( notify_helpers.HTML_BODY_WITH_GMAIL_ACTION_TEMPLATE % { 'url': self.detail_url, 'body': ('a <<a href="http://google.com">http://google.com</a>> ' 'z-- <br/>%s' % self.expected_html_footer) }) self.assertEquals(expected_html_body, email_task['html_body'])
def setUp(self): self.user_prefs = user_pb2.UserPrefs() self.user = user_pb2.User() self.issue = fake.MakeTestIssue(789, 1, 'summary one', 'New', 111) self.rvg_issue = fake.MakeTestIssue(789, 2, 'summary two', 'New', 111, labels=['Restrict-View-Google']) self.more_restricted_issue = fake.MakeTestIssue( 789, 3, 'summary three', 'New', 111, labels=['Restrict-View-Core']) self.both_restricted_issue = fake.MakeTestIssue( 789, 4, 'summary four', 'New', 111, labels=['Restrict-View-Google', 'Restrict-View-Core']) self.addr_perm = notify_reasons.AddrPerm( False, '*****@*****.**', self.user, notify_reasons.REPLY_MAY_COMMENT, self.user_prefs)
def _DeserializeUserPrefsByID(self, userprefs_rows): """Convert database row tuples into UserPrefs PBs. Args: userprefs_rows: rows from the UserPrefs DB table. Returns: A dict {user_id: userprefs} for all the users in userprefs_rows. """ result_dict = {} # Make one UserPrefs PB for each row in userprefs_rows. for row in userprefs_rows: (user_id, name, value) = row if user_id not in result_dict: userprefs = user_pb2.UserPrefs(user_id=user_id) result_dict[user_id] = userprefs else: userprefs = result_dict[user_id] userprefs.prefs.append( user_pb2.UserPrefValue(name=name, value=value)) return result_dict