def test_buildMessage_addLogs(self): mn = MailNotifier("*****@*****.**", mode=("change",), addLogs=True) mn.buildMessageDict = Mock() mn.buildMessageDict.return_value = {"body": "body", "type": "text", "subject": "subject"} mn.createEmail = Mock("createEmail") mn._gotRecipients = Mock("_gotReceipients") mn._gotRecipients.return_value = None mn.master_status = Mock() mn.master_status.getTitle.return_value = "TITLE" bldr = Mock(name="builder") builds = [FakeBuildStatus(name="build1"), FakeBuildStatus(name="build2")] logs = [FakeLog("log1"), FakeLog("log2")] for b, l in zip(builds, logs): b.builder = bldr b.results = 0 ss = Mock(name="ss") b.getSourceStamps.return_value = [ss] ss.patch = None ss.changes = [] b.getLogs.return_value = [l] d = mn.buildMessage("mybldr", builds, 0) def check(_): mn.createEmail.assert_called_with( dict(body="body\n\nbody\n\n", type="text", subject="subject"), "mybldr", "TITLE", 0, builds, [], logs ) d.addCallback(check) return d
def test_buildMessage_addLogs(self): mn = MailNotifier('*****@*****.**', mode="change", addLogs=True) mn.buildMessageDict = Mock() mn.buildMessageDict.return_value = {"body":"body", "type":"text", "subject":"subject"} mn.createEmail = Mock("createEmail") mn._gotRecipients = Mock("_gotReceipients") mn._gotRecipients.return_value = None mn.master_status = Mock() mn.master_status.getTitle.return_value = 'TITLE' bldr = Mock(name="builder") builds = [ FakeBuildStatus(name='build1'), FakeBuildStatus(name='build2') ] logs = [ FakeLog('log1'), FakeLog('log2') ] for b, l in zip(builds, logs): b.builder = bldr b.results = 0 b.getSourceStamp.return_value = ss = Mock(name='ss') ss.patch = None ss.changes = [] b.getLogs.return_value = [ l ] d = mn.buildMessage("mybldr", builds, 0) def check(_): mn.createEmail.assert_called_with( dict(body='body\n\nbody\n\n', type='text', subject='subject'), 'mybldr', 'TITLE', 0, builds, [], logs) d.addCallback(check) return d
def test_buildMessage_addLogs(self): mn = MailNotifier('*****@*****.**', mode=("change",), addLogs=True) mn.buildMessageDict = Mock() mn.buildMessageDict.return_value = {"body":"body", "type":"text", "subject":"subject"} mn.createEmail = Mock("createEmail") mn._gotRecipients = Mock("_gotReceipients") mn._gotRecipients.return_value = None mn.master_status = Mock() mn.master_status.getTitle.return_value = 'TITLE' bldr = Mock(name="builder") builds = [ FakeBuildStatus(name='build1'), FakeBuildStatus(name='build2') ] logs = [ FakeLog('log1'), FakeLog('log2') ] for b, l in zip(builds, logs): b.builder = bldr b.results = 0 b.getSourceStamp.return_value = ss = Mock(name='ss') ss.patch = None ss.changes = [] b.getLogs.return_value = [ l ] d = mn.buildMessage("mybldr", builds, 0) def check(_): mn.createEmail.assert_called_with( dict(body='body\n\nbody\n\n', type='text', subject='subject'), 'mybldr', 'TITLE', 0, builds, [], logs) d.addCallback(check) return d
def test_createEmail_extraHeaders_two_builds(self): builds = [FakeBuildStatus(name="build1"), FakeBuildStatus(name="build2")] msgdict = create_msgdict() mn = MailNotifier("*****@*****.**", extraHeaders=dict(hhh="vvv")) m = mn.createEmail(msgdict, u"builder-n\u00E5me", u"project-n\u00E5me", SUCCESS, builds) txt = m.as_string() # note that the headers are *not* rendered self.assertIn("hhh: vvv", txt)
def test_createEmail_extraHeaders_one_build(self): builds = [ FakeBuildStatus(name="build") ] msgdict = create_msgdict() mn = MailNotifier('*****@*****.**', extraHeaders=dict(hhh='vvv')) # add some Unicode to detect encoding problems m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) txt = m.as_string() self.assertIn('rndr(hhh): rndr(vvv)', txt)
def test_createEmail_message_with_nonascii_patch(self): builds = [FakeBuildStatus(name="build")] msgdict = create_msgdict() patches = [["", "\x99\xaa", ""]] logs = [FakeLog("simple log")] mn = MailNotifier("*****@*****.**", addLogs=True) m = mn.createEmail(msgdict, u"builder", u"pr", SUCCESS, builds, patches, logs) txt = m.as_string() self.assertIn("application/octet-stream", txt)
def test_createEmail_message_without_patch_and_log_contains_unicode(self): msgdict = dict(body=u'Unicode body with non-ascii (åäö).', type='plain') mn = MailNotifier('*****@*****.**') m = mn.createEmail(msgdict, u'builder-näme', u'project-näme', SUCCESS) try: print m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def test_createEmail_extraHeaders_one_build(self): builds = [FakeBuildStatus(name="build")] msgdict = create_msgdict() mn = MailNotifier('*****@*****.**', extraHeaders=dict(hhh='vvv')) # add some Unicode to detect encoding problems m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) txt = m.as_string() self.assertIn('rndr(hhh): rndr(vvv)', txt)
def test_createEmail_message_without_patch_and_log_contains_unicode(self): build = Mock() msgdict = create_msgdict() mn = MailNotifier("*****@*****.**") m = mn.createEmail(msgdict, u"builder-n\u00E5me", u"project-n\u00E5me", SUCCESS, build) try: m.as_string() except UnicodeEncodeError: self.fail("Failed to call as_string() on email message.")
def test_createEmail_extraHeaders_two_builds(self): builds = [ FakeBuildStatus(name="build1"), FakeBuildStatus(name="build2") ] msgdict = create_msgdict() mn = MailNotifier('*****@*****.**', extraHeaders=dict(hhh='vvv')) m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) txt = m.as_string() # note that the headers are *not* rendered self.assertIn('hhh: vvv', txt)
def test_createEmail_extraHeaders(self): builds = [ Mock(name="build") ] msgdict = create_msgdict() mn = MailNotifier('*****@*****.**', extraHeaders=dict(hhh='vvv')) m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def test_createEmail_extraHeaders_one_build(self): builds = [FakeBuildStatus(name="build")] builds[0].properties = properties.Properties() builds[0].setProperty("hhh", "vvv") msgdict = create_msgdict() mn = MailNotifier("*****@*****.**", extraHeaders=dict(hhh="vvv")) # add some Unicode to detect encoding problems m = mn.createEmail(msgdict, u"builder-n\u00E5me", u"project-n\u00E5me", SUCCESS, builds) txt = m.as_string() self.assertIn("hhh: vvv", txt)
def test_createEmail_message_with_nonascii_patch(self): builds = [ FakeBuildStatus(name="build") ] msgdict = create_msgdict() patches = [ ['', '\x99\xaa', ''] ] logs = [ FakeLog('simple log') ] mn = MailNotifier('*****@*****.**', addLogs=True) m = mn.createEmail(msgdict, u'builder', u'pr', SUCCESS, builds, patches, logs) txt = m.as_string() self.assertIn('application/octet-stream', txt)
def test_createEmail_message_without_patch_and_log_contains_unicode(self): builds = [ FakeBuildStatus(name="build") ] msgdict = create_msgdict() mn = MailNotifier('*****@*****.**') m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def test_createEmail_message_without_patch_and_log_contains_unicode(self): msgdict = dict( body=u'Unicode body with non-ascii (\u00E5\u00E4\u00F6).', type='plain') mn = MailNotifier('*****@*****.**') m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS) try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def test_createEmail_message_with_patch_and_log_contains_unicode(self): build = Mock() msgdict = create_msgdict() patch = ["", u"\u00E5\u00E4\u00F6", ""] logs = [FakeLog(u"Unicode log with non-ascii (\u00E5\u00E4\u00F6).")] mn = MailNotifier("*****@*****.**", addLogs=True) m = mn.createEmail(msgdict, u"builder-n\u00E5me", u"project-n\u00E5me", SUCCESS, build, patch, logs) try: m.as_string() except UnicodeEncodeError: self.fail("Failed to call as_string() on email message.")
def do_test_createEmail_cte(self, funnyChars, expEncoding): builds = [FakeBuildStatus(name="build")] msgdict = create_msgdict(funnyChars) mn = MailNotifier("*****@*****.**") d = mn.createEmail(msgdict, u"builder-name", u"project-name", SUCCESS, builds) @d.addCallback def callback(m): cte_lines = [l for l in m.as_string().split("\n") if l.startswith("Content-Transfer-Encoding:")] self.assertEqual(cte_lines, ["Content-Transfer-Encoding: %s" % expEncoding], repr(m.as_string())) return d
def test_createEmail_message_with_patch_and_log_contains_unicode(self): builds = [FakeBuildStatus(name="build")] msgdict = create_msgdict() patches = [['', u'\u00E5\u00E4\u00F6', '']] logs = [FakeLog(u'Unicode log with non-ascii (\u00E5\u00E4\u00F6).')] mn = MailNotifier('*****@*****.**', addLogs=True) m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds, patches, logs) try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def test_createEmail_message_with_patch_and_log_contains_unicode(self): msgdict = dict(body=u'Unicode body with non-ascii (åäö).', type='plain') patch = ['', u'åäö', ''] logs = [FakeLog(u'Unicode log with non-ascii (åäö).')] mn = MailNotifier('*****@*****.**', addLogs=True) m = mn.createEmail(msgdict, u'builder-näme', u'project-näme', SUCCESS, patch, logs) try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def test_createEmail_message_with_patch_and_log_contains_unicode(self): build = Mock() msgdict = create_msgdict() patch = ['', u'\u00E5\u00E4\u00F6', ''] logs = [FakeLog(u'Unicode log with non-ascii (\u00E5\u00E4\u00F6).')] mn = MailNotifier('*****@*****.**', addLogs=True) m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, build, patch, logs) try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def test_createEmail_message_with_patch_and_log_containing_unicode(self): builds = [FakeBuildStatus(name="build")] msgdict = create_msgdict() patches = [["", u"\u00E5\u00E4\u00F6", ""]] msg = u"Unicode log with non-ascii (\u00E5\u00E4\u00F6)." # add msg twice: as unicode and already encoded logs = [FakeLog(msg), FakeLog(msg.encode("utf-8"))] mn = MailNotifier("*****@*****.**", addLogs=True) m = mn.createEmail(msgdict, u"builder-n\u00E5me", u"project-n\u00E5me", SUCCESS, builds, patches, logs) try: m.as_string() except UnicodeEncodeError: self.fail("Failed to call as_string() on email message.")
def test_createEmail_extraHeaders_two_builds(self): builds = [ FakeBuildStatus(name="build1"), FakeBuildStatus(name="build2") ] msgdict = create_msgdict() mn = MailNotifier('*****@*****.**', extraHeaders=dict(hhh='vvv')) d = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) @d.addCallback def callback(m): txt = m.as_string() # note that the headers are *not* rendered self.assertIn('hhh: vvv', txt) return d
def test_createEmail_message_with_patch_and_log_contains_unicode(self): msgdict = dict( body=u'Unicode body with non-ascii (\u00E5\u00E4\u00F6).', type='plain') patch = ['', u'\u00E5\u00E4\u00F6', ''] logs = [FakeLog(u'Unicode log with non-ascii (\u00E5\u00E4\u00F6).')] mn = MailNotifier('*****@*****.**', addLogs=True) m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, patch, logs) try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def do_test_createEmail_cte(self, funnyChars, expEncoding): builds = [ FakeBuildStatus(name='build') ] msgdict = create_msgdict(funnyChars) mn = MailNotifier('*****@*****.**') d = mn.createEmail(msgdict, u'builder-name', u'project-name', SUCCESS, builds) @d.addCallback def callback(m): cte_lines = [ l for l in m.as_string().split("\n") if l.startswith('Content-Transfer-Encoding:') ] self.assertEqual(cte_lines, [ 'Content-Transfer-Encoding: %s' % expEncoding ], `m.as_string()`) return d
def test_createEmail_extraHeaders_one_build(self): builds = [ FakeBuildStatus(name="build") ] builds[0].properties = properties.Properties() builds[0].setProperty('hhh','vvv') msgdict = create_msgdict() mn = MailNotifier('*****@*****.**', extraHeaders=dict(hhh='vvv')) # add some Unicode to detect encoding problems d = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) @d.addCallback def callback(m): txt = m.as_string() self.assertIn('hhh: vvv', txt) return d
def test_createEmail_message_without_patch_and_log_contains_unicode(self): builds = [FakeBuildStatus(name="build")] msgdict = create_msgdict() mn = MailNotifier("*****@*****.**") d = mn.createEmail(msgdict, u"builder-n\u00E5me", u"project-n\u00E5me", SUCCESS, builds) @d.addCallback def callback(m): try: m.as_string() except UnicodeEncodeError: self.fail("Failed to call as_string() on email message.") return d
def createEmail(self, msgdict, builderName, title, results, builds=None, patches=None, logs=None): # Trybots have their own Notifier if builder_name_schema.IsTrybot(builderName): return None m = MailNotifier.createEmail(self, msgdict, builderName, title, results, builds, patches, logs) if builds and builds[0].getSourceStamp().revision: m.replace_header('Subject', 'buildbot %(result)s in %(title)s for %(revision)s' % { 'result': Results[results], 'title': title, 'revision': builds[0].getSourceStamp().revision, }) return m
def test_createEmail_message_with_patch_and_log_containing_unicode(self): builds = [ FakeBuildStatus(name="build") ] msgdict = create_msgdict() patches = [ ['', u'\u00E5\u00E4\u00F6', ''] ] msg = u'Unicode log with non-ascii (\u00E5\u00E4\u00F6).' # add msg twice: as unicode and already encoded logs = [ FakeLog(msg), FakeLog(msg.encode('utf-8')) ] mn = MailNotifier('*****@*****.**', addLogs=True) d = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds, patches, logs) @d.addCallback def callback(m): try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.') return d
def createEmail(self, msgdict, builderName, title, results, builds=None, patches=None, logs=None): # Trybots have their own Notifier if builder_name_schema.IsTrybot(builderName): return None m = MailNotifier.createEmail(self, msgdict, builderName, title, results, builds, patches, logs) if builds and builds[0].getSourceStamp().revision: m.replace_header( 'Subject', 'buildbot %(result)s in %(title)s for %(revision)s' % { 'result': Results[results], 'title': title, 'revision': builds[0].getSourceStamp().revision, }) return m
def test_sendToInterestedUsers_two_builds(self): from email.Message import Message m = Message() mn = MailNotifier(fromaddr="*****@*****.**", lookup=None) mn.sendMessage = Mock() def fakeGetBuilder(buildername): if buildername == builder.name: return builder return None def fakeGetBuildRequests(self, bsid): return defer.succeed([{"buildername":"Builder", "brid":1}]) builder = Mock() builder.name = "Builder" build1 = FakeBuildStatus(name="build") build1.result = FAILURE build1.finished = True build1.reason = "testReason" build1.builder = builder build2 = FakeBuildStatus(name="build") build2.result = FAILURE build2.finished = True build2.reason = "testReason" build2.builder = builder def fakeCreateEmail(msgdict, builderName, title, results, builds=None, patches=None, logs=None): # only concerned with m['To'] and m['CC'], which are added in # _got_recipients later return m mn.createEmail = fakeCreateEmail self.db = fakedb.FakeDBConnector(self) self.db.insertTestData([fakedb.SourceStampSet(id=1099), fakedb.Buildset(id=99, sourcestampsetid=1099, results=SUCCESS, reason="testReason"), fakedb.BuildRequest(id=11, buildsetid=99, buildername='Builder'), fakedb.Build(number=0, brid=11), fakedb.Build(number=1, brid=11), fakedb.Change(changeid=9123), fakedb.Change(changeid=9124), fakedb.ChangeUser(changeid=9123, uid=1), fakedb.ChangeUser(changeid=9124, uid=2), fakedb.User(uid=1, identifier="tdurden"), fakedb.User(uid=2, identifier="user2"), fakedb.UserInfo(uid=1, attr_type='email', attr_data="*****@*****.**"), fakedb.UserInfo(uid=2, attr_type='email', attr_data="*****@*****.**") ]) def _getInterestedUsers(): # 'narrator' in this case is the owner, which tests the lookup return ["Big Bob <*****@*****.**>", "narrator"] build1.getInterestedUsers = _getInterestedUsers build2.getInterestedUsers = _getInterestedUsers def _getResponsibleUsers(): return ["Big Bob <*****@*****.**>"] build1.getResponsibleUsers = _getResponsibleUsers build2.getResponsibleUsers = _getResponsibleUsers # fake sourcestamp with relevant user bits ss1 = Mock(name="sourcestamp") fake_change1 = Mock(name="change") fake_change1.number = 9123 ss1.changes = [fake_change1] ss1.patch, ss1.addPatch = None, None ss2 = Mock(name="sourcestamp") fake_change2 = Mock(name="change") fake_change2.number = 9124 ss2.changes = [fake_change2] ss2.patch, ss1.addPatch = None, None def fakeGetSS(ss): return lambda: ss build1.getSourceStamp = fakeGetSS(ss1) build2.getSourceStamp = fakeGetSS(ss2) mn.master = self # FIXME: Should be FakeMaster self.status = mn.master_status = mn.buildMessageDict = Mock() mn.master_status.getBuilder = fakeGetBuilder mn.buildMessageDict.return_value = {"body": "body", "type": "text"} mn.buildMessage(builder.name, [build1, build2], build1.result) self.assertEqual(m['To'], "[email protected], [email protected]")
def do_test_sendToInterestedUsers(self, lookup=None, extraRecipients=[], sendToInterestedUsers=True, exp_called_with=None, exp_TO=None, exp_CC=None): from email.Message import Message m = Message() mn = MailNotifier(fromaddr='*****@*****.**', lookup=lookup, sendToInterestedUsers=sendToInterestedUsers, extraRecipients=extraRecipients) mn.sendMessage = Mock() def fakeGetBuild(number): return build def fakeGetBuilder(buildername): if buildername == builder.name: return builder return None def fakeGetBuildRequests(self, bsid): return defer.succeed([{"buildername":"Builder", "brid":1}]) builder = Mock() builder.getBuild = fakeGetBuild builder.name = "Builder" build = FakeBuildStatus(name="build") build.result = FAILURE build.finished = True build.reason = "testReason" build.builder = builder def fakeCreateEmail(msgdict, builderName, title, results, builds=None, patches=None, logs=None): # only concerned with m['To'] and m['CC'], which are added in # _got_recipients later return m mn.createEmail = fakeCreateEmail self.db = fakedb.FakeDBConnector(self) self.db.insertTestData([fakedb.SourceStampSet(id=1099), fakedb.Buildset(id=99, sourcestampsetid=1099, results=SUCCESS, reason="testReason"), fakedb.BuildRequest(id=11, buildsetid=99, buildername='Builder'), fakedb.Build(number=0, brid=11), fakedb.Change(changeid=9123), fakedb.ChangeUser(changeid=9123, uid=1), fakedb.User(uid=1, identifier="tdurden"), fakedb.UserInfo(uid=1, attr_type='svn', attr_data="tdurden"), fakedb.UserInfo(uid=1, attr_type='email', attr_data="*****@*****.**") ]) # fake sourcestamp with relevant user bits ss = Mock(name="sourcestamp") fake_change = Mock(name="change") fake_change.number = 9123 ss.changes = [fake_change] ss.patch, ss.addPatch = None, None def fakeGetSS(): return ss build.getSourceStamp = fakeGetSS def _getInterestedUsers(): # 'narrator' in this case is the owner, which tests the lookup return ["Big Bob <*****@*****.**>", "narrator"] build.getInterestedUsers = _getInterestedUsers def _getResponsibleUsers(): return ["Big Bob <*****@*****.**>"] build.getResponsibleUsers = _getResponsibleUsers mn.master = self # FIXME: Should be FakeMaster self.status = mn.master_status = mn.buildMessageDict = Mock() mn.master_status.getBuilder = fakeGetBuilder mn.buildMessageDict.return_value = {"body": "body", "type": "text"} mn.buildMessage(builder.name, [build], build.result) mn.sendMessage.assert_called_with(m, exp_called_with) self.assertEqual(m['To'], exp_TO) self.assertEqual(m['CC'], exp_CC)
def do_test_sendToInterestedUsers(self, lookup=None, extraRecipients=[], sendToInterestedUsers=True, exp_called_with=None, exp_TO=None, exp_CC=None): from email.Message import Message m = Message() mn = MailNotifier(fromaddr='*****@*****.**', lookup=lookup, sendToInterestedUsers=sendToInterestedUsers, extraRecipients=extraRecipients) mn.sendMessage = Mock() def fakeGetBuild(number): return build def fakeGetBuilder(buildername): if buildername == builder.name: return builder return None def fakeGetBuildRequests(self, bsid): return defer.succeed([{"buildername":"Builder", "brid":1}]) builder = Mock() builder.getBuild = fakeGetBuild builder.name = "Builder" build = FakeBuildStatus(name="build") build.result = FAILURE build.finished = True build.reason = "testReason" build.builder = builder def fakeCreateEmail(msgdict, builderName, title, results, builds=None, patches=None, logs=None): # only concerned with m['To'] and m['CC'], which are added in # _got_recipients later return m mn.createEmail = fakeCreateEmail self.db = fakedb.FakeDBConnector(self) self.db.insertTestData([fakedb.SourceStampSet(id=1099), fakedb.Buildset(id=99, sourcestampsetid=1099, results=SUCCESS, reason="testReason"), fakedb.BuildRequest(id=11, buildsetid=99, buildername='Builder'), fakedb.Build(number=0, brid=11), fakedb.Change(changeid=9123), fakedb.ChangeUser(changeid=9123, uid=1), fakedb.User(uid=1, identifier="tdurden"), fakedb.UserInfo(uid=1, attr_type='svn', attr_data="tdurden"), fakedb.UserInfo(uid=1, attr_type='email', attr_data="*****@*****.**") ]) # fake sourcestamp with relevant user bits ss = Mock(name="sourcestamp") fake_change = Mock(name="change") fake_change.number = 9123 ss.changes = [fake_change] ss.patch, ss.addPatch = None, None def fakeGetSS(): return ss build.getSourceStamp = fakeGetSS def _getInterestedUsers(): # 'narrator' in this case is the owner, which tests the lookup return ["Big Bob <*****@*****.**>", "narrator"] build.getInterestedUsers = _getInterestedUsers def _getResponsibleUsers(): return ["Big Bob <*****@*****.**>"] build.getResponsibleUsers = _getResponsibleUsers mn.parent = self self.status = mn.master_status = mn.buildMessageDict = Mock() mn.master_status.getBuilder = fakeGetBuilder mn.buildMessageDict.return_value = {"body": "body", "type": "text"} mn.buildMessage(builder.name, [build], build.result) mn.sendMessage.assert_called_with(m, exp_called_with) self.assertEqual(m['To'], exp_TO) self.assertEqual(m['CC'], exp_CC)
def test_sendToInterestedUsers_two_builds(self): from email.Message import Message m = Message() mn = MailNotifier(fromaddr="*****@*****.**", lookup=None) mn.sendMessage = Mock() def fakeGetBuilder(buildername): if buildername == builder.name: return builder return None def fakeGetBuildRequests(self, bsid): return defer.succeed([{"buildername":"Builder", "brid":1}]) builder = Mock() builder.name = "Builder" build1 = FakeBuildStatus(name="build") build1.result = FAILURE build1.finished = True build1.reason = "testReason" build1.builder = builder build2 = FakeBuildStatus(name="build") build2.result = FAILURE build2.finished = True build2.reason = "testReason" build2.builder = builder def fakeCreateEmail(msgdict, builderName, title, results, builds=None, patches=None, logs=None): # only concerned with m['To'] and m['CC'], which are added in # _got_recipients later return m mn.createEmail = fakeCreateEmail self.db = fakedb.FakeDBConnector(self) self.db.insertTestData([fakedb.SourceStampSet(id=1099), fakedb.Buildset(id=99, sourcestampsetid=1099, results=SUCCESS, reason="testReason"), fakedb.BuildRequest(id=11, buildsetid=99, buildername='Builder'), fakedb.Build(number=0, brid=11), fakedb.Build(number=1, brid=11), fakedb.Change(changeid=9123), fakedb.Change(changeid=9124), fakedb.ChangeUser(changeid=9123, uid=1), fakedb.ChangeUser(changeid=9124, uid=2), fakedb.User(uid=1, identifier="tdurden"), fakedb.User(uid=2, identifier="user2"), fakedb.UserInfo(uid=1, attr_type='email', attr_data="*****@*****.**"), fakedb.UserInfo(uid=2, attr_type='email', attr_data="*****@*****.**") ]) def _getInterestedUsers(): # 'narrator' in this case is the owner, which tests the lookup return ["Big Bob <*****@*****.**>", "narrator"] build1.getInterestedUsers = _getInterestedUsers build2.getInterestedUsers = _getInterestedUsers def _getResponsibleUsers(): return ["Big Bob <*****@*****.**>"] build1.getResponsibleUsers = _getResponsibleUsers build2.getResponsibleUsers = _getResponsibleUsers # fake sourcestamp with relevant user bits ss1 = Mock(name="sourcestamp") fake_change1 = Mock(name="change") fake_change1.number = 9123 ss1.changes = [fake_change1] ss1.patch, ss1.addPatch = None, None ss2 = Mock(name="sourcestamp") fake_change2 = Mock(name="change") fake_change2.number = 9124 ss2.changes = [fake_change2] ss2.patch, ss1.addPatch = None, None def fakeGetSS(ss): return lambda: ss build1.getSourceStamp = fakeGetSS(ss1) build2.getSourceStamp = fakeGetSS(ss2) mn.parent = self self.status = mn.master_status = mn.buildMessageDict = Mock() mn.master_status.getBuilder = fakeGetBuilder mn.buildMessageDict.return_value = {"body": "body", "type": "text"} mn.buildMessage(builder.name, [build1, build2], build1.result) self.assertEqual(m['To'], "[email protected], [email protected]")