aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_status_mail.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_status_mail.py')
-rw-r--r--lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_status_mail.py816
1 files changed, 0 insertions, 816 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_status_mail.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_status_mail.py
deleted file mode 100644
index 3ca64247..00000000
--- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_status_mail.py
+++ /dev/null
@@ -1,816 +0,0 @@
-# This file is part of Buildbot. Buildbot is free software: you can
-# redistribute it and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation, version 2.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc., 51
-# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Copyright Buildbot Team Members
-
-import sys
-from mock import Mock
-from buildbot import config
-from twisted.trial import unittest
-from buildbot.status.results import SUCCESS, FAILURE, WARNINGS, EXCEPTION
-from buildbot.status.mail import MailNotifier
-from twisted.internet import defer
-from buildbot.test.fake import fakedb
-from buildbot.test.fake.fakebuild import FakeBuildStatus
-from buildbot.process import properties
-
-py_27 = sys.version_info[0] > 2 or (sys.version_info[0] == 2
- and sys.version_info[1] >= 7)
-
-class FakeLog(object):
- def __init__(self, text):
- self.text = text
-
- def getName(self):
- return 'log-name'
-
- def getStep(self):
- class FakeStep(object):
- def getName(self):
- return 'step-name'
- return FakeStep()
-
- def getText(self):
- return self.text
-
-class FakeSource:
- def __init__(self, branch = None, revision = None, repository = None,
- codebase = None, project = None):
- self.changes = []
- self.branch = branch
- self.revision = revision
- self.repository = repository
- self.codebase = codebase
- self.project = project
- self.patch_info = None
- self.patch = None
-
-class TestMailNotifier(unittest.TestCase):
-
- def do_test_createEmail_cte(self, funnyChars, expEncoding):
- builds = [ FakeBuildStatus(name='build') ]
- msgdict = create_msgdict(funnyChars)
- mn = MailNotifier('from@example.org')
- 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_message_content_transfer_encoding_7bit(self):
- return self.do_test_createEmail_cte(u"old fashioned ascii",
- '7bit' if py_27 else 'base64')
-
- def test_createEmail_message_content_transfer_encoding_8bit(self):
- return self.do_test_createEmail_cte(u"\U0001F4A7",
- '8bit' if py_27 else 'base64')
-
- def test_createEmail_message_without_patch_and_log_contains_unicode(self):
- builds = [ FakeBuildStatus(name="build") ]
- msgdict = create_msgdict()
- mn = MailNotifier('from@example.org')
- 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 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('from@example.org', 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_extraHeaders_two_builds(self):
- builds = [ FakeBuildStatus(name="build1"),
- FakeBuildStatus(name="build2") ]
- msgdict = create_msgdict()
- mn = MailNotifier('from@example.org', 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_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('from@example.org', 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 test_createEmail_message_with_nonascii_patch(self):
- builds = [ FakeBuildStatus(name="build") ]
- msgdict = create_msgdict()
- patches = [ ['', '\x99\xaa', ''] ]
- logs = [ FakeLog('simple log') ]
- mn = MailNotifier('from@example.org', addLogs=True)
- d = mn.createEmail(msgdict, u'builder', u'pr', SUCCESS,
- builds, patches, logs)
- @d.addCallback
- def callback(m):
- txt = m.as_string()
- self.assertIn('application/octet-stream', txt)
- return d
-
- def test_init_enforces_categories_and_builders_are_mutually_exclusive(self):
- self.assertRaises(config.ConfigErrors,
- MailNotifier, 'from@example.org',
- categories=['fast','slow'], builders=['a','b'])
-
- def test_builderAdded_ignores_unspecified_categories(self):
- mn = MailNotifier('from@example.org', categories=['fast'])
-
- builder = Mock()
- builder.category = 'slow'
-
- self.assertEqual(None, mn.builderAdded('dummyBuilder', builder))
- self.assert_(builder not in mn.watched)
-
- def test_builderAdded_subscribes_to_all_builders_by_default(self):
- mn = MailNotifier('from@example.org')
-
- builder = Mock()
- builder.category = 'slow'
- builder2 = Mock()
- builder2.category = None
-
- self.assertEqual(mn, mn.builderAdded('dummyBuilder', builder))
- self.assertEqual(mn, mn.builderAdded('dummyBuilder2', builder2))
- self.assertTrue(builder in mn.watched)
- self.assertTrue(builder2 in mn.watched)
-
- def test_buildFinished_ignores_unspecified_builders(self):
- mn = MailNotifier('from@example.org', builders=['a','b'])
-
- build = FakeBuildStatus()
- build.builder = Mock()
-
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
-
- def test_buildsetFinished_sends_email(self):
- fakeBuildMessage = Mock()
- mn = MailNotifier('from@example.org',
- buildSetSummary=True,
- mode=("failing", "passing", "warnings"),
- builders=["Builder1", "Builder2"])
-
- mn.buildMessage = fakeBuildMessage
-
- builder1 = Mock()
- builder1.getBuild = lambda number: build1
- builder1.name = "Builder1"
-
- build1 = FakeBuildStatus()
- build1.results = FAILURE
- build1.finished = True
- build1.reason = "testReason"
- build1.getBuilder.return_value = builder1
-
- builder2 = Mock()
- builder2.getBuild = lambda number: build2
- builder2.name = "Builder2"
-
- build2 = FakeBuildStatus()
- build2.results = FAILURE
- build2.finished = True
- build2.reason = "testReason"
- build2.getBuilder.return_value = builder1
-
- def fakeGetBuilder(buildername):
- return {"Builder1": builder1, "Builder2": builder2}[buildername]
-
-
- self.db = fakedb.FakeDBConnector(self)
- self.db.insertTestData([fakedb.SourceStampSet(id=127),
- fakedb.Buildset(id=99, sourcestampsetid=127,
- results=SUCCESS,
- reason="testReason"),
- fakedb.BuildRequest(id=11, buildsetid=99,
- buildername='Builder1'),
- fakedb.Build(number=0, brid=11),
- fakedb.BuildRequest(id=12, buildsetid=99,
- buildername='Builder2'),
- fakedb.Build(number=0, brid=12),
- ])
- mn.master = self # FIXME: Should be FakeMaster
-
- self.status = Mock()
- mn.master_status = Mock()
- mn.master_status.getBuilder = fakeGetBuilder
- mn.buildMessageDict = Mock()
- mn.buildMessageDict.return_value = {"body":"body", "type":"text",
- "subject":"subject"}
-
- mn.buildsetFinished(99, FAILURE)
- fakeBuildMessage.assert_called_with("Buildset Complete: testReason",
- [build1, build2], SUCCESS)
-
- def test_buildsetFinished_doesnt_send_email(self):
- fakeBuildMessage = Mock()
- mn = MailNotifier('from@example.org',
- buildSetSummary=True,
- mode=("failing", "warnings"),
- builders=["Builder"])
- mn.buildMessage = fakeBuildMessage
-
-
- 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()
- build.results = SUCCESS
- build.finished = True
- build.reason = "testReason"
- build.getBuilder.return_value = builder
-
- self.db = fakedb.FakeDBConnector(self)
- self.db.insertTestData([fakedb.SourceStampSet(id=127),
- fakedb.Buildset(id=99, sourcestampsetid=127,
- results=SUCCESS,
- reason="testReason"),
- fakedb.BuildRequest(id=11, buildsetid=99,
- buildername='Builder'),
- fakedb.Build(number=0, brid=11),
- ])
- mn.master = self
-
- self.status = Mock()
- mn.master_status = Mock()
- mn.master_status.getBuilder = fakeGetBuilder
- mn.buildMessageDict = Mock()
- mn.buildMessageDict.return_value = {"body":"body", "type":"text",
- "subject":"subject"}
-
- mn.buildsetFinished(99, FAILURE)
- self.assertFalse(fakeBuildMessage.called)
-
- def test_getCustomMesgData_multiple_sourcestamps(self):
- self.passedAttrs = {}
- def fakeCustomMessage(attrs):
- self.passedAttrs = attrs
- return ("", "")
-
- mn = MailNotifier('from@example.org',
- buildSetSummary=True,
- mode=("failing", "passing", "warnings"),
- builders=["Builder"])
-
-
- def fakeBuildMessage(name, builds, results):
- for build in builds:
- mn.buildMessageDict(name=build.getBuilder().name,
- build=build, results=build.results)
-
- mn.buildMessage = fakeBuildMessage
- mn.customMesg = fakeCustomMessage
-
- 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}])
-
- self.db = fakedb.FakeDBConnector(self)
- self.db.insertTestData([fakedb.SourceStampSet(id=127),
- fakedb.Buildset(id=99, sourcestampsetid=127,
- results=SUCCESS,
- reason="testReason"),
- fakedb.BuildRequest(id=11, buildsetid=99,
- buildername='Builder'),
- fakedb.Build(number=0, brid=11),
- ])
- mn.master = self
-
- builder = Mock()
- builder.getBuild = fakeGetBuild
- builder.name = "Builder"
-
- build = FakeBuildStatus()
- build.results = FAILURE
- build.finished = True
- build.reason = "testReason"
- build.getLogs.return_value = []
- build.getBuilder.return_value = builder
-
- self.status = Mock()
- mn.master_status = Mock()
- mn.master_status.getBuilder = fakeGetBuilder
-
- ss1 = FakeSource(revision='111222', codebase='testlib1')
- ss2 = FakeSource(revision='222333', codebase='testlib2')
- build.getSourceStamps.return_value = [ss1, ss2]
-
- mn.buildsetFinished(99, FAILURE)
-
- self.assertTrue('revision' in self.passedAttrs, "No revision entry found in attrs")
- self.assertTrue(isinstance(self.passedAttrs['revision'], dict))
- self.assertEqual(self.passedAttrs['revision']['testlib1'], '111222')
- self.assertEqual(self.passedAttrs['revision']['testlib2'], '222333')
-
- def test_getCustomMesgData_single_sourcestamp(self):
- self.passedAttrs = {}
- def fakeCustomMessage(attrs):
- self.passedAttrs = attrs
- return ("", "")
-
- mn = MailNotifier('from@example.org',
- buildSetSummary=True,
- mode=("failing", "passing", "warnings"),
- builders=["Builder"])
-
-
- def fakeBuildMessage(name, builds, results):
- for build in builds:
- mn.buildMessageDict(name=build.getBuilder().name,
- build=build, results=build.results)
-
- mn.buildMessage = fakeBuildMessage
- mn.customMesg = fakeCustomMessage
-
- 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}])
-
- self.db = fakedb.FakeDBConnector(self)
- self.db.insertTestData([fakedb.SourceStampSet(id=127),
- fakedb.Buildset(id=99, sourcestampsetid=127,
- results=SUCCESS,
- reason="testReason"),
- fakedb.BuildRequest(id=11, buildsetid=99,
- buildername='Builder'),
- fakedb.Build(number=0, brid=11),
- ])
- mn.master = self
-
- builder = Mock()
- builder.getBuild = fakeGetBuild
- builder.name = "Builder"
-
- build = FakeBuildStatus()
- build.results = FAILURE
- build.finished = True
- build.reason = "testReason"
- build.getLogs.return_value = []
- build.getBuilder.return_value = builder
-
- self.status = Mock()
- mn.master_status = Mock()
- mn.master_status.getBuilder = fakeGetBuilder
-
- ss1 = FakeSource(revision='111222', codebase='testlib1')
- build.getSourceStamps.return_value = [ss1]
-
- mn.buildsetFinished(99, FAILURE)
-
- self.assertTrue('builderName' in self.passedAttrs, "No builderName entry found in attrs")
- self.assertEqual(self.passedAttrs['builderName'], 'Builder')
- self.assertTrue('revision' in self.passedAttrs, "No revision entry found in attrs")
- self.assertTrue(isinstance(self.passedAttrs['revision'], str))
- self.assertEqual(self.passedAttrs['revision'], '111222')
-
- def test_buildFinished_ignores_unspecified_categories(self):
- mn = MailNotifier('from@example.org', categories=['fast'])
-
-
- build = FakeBuildStatus(name="build")
- build.builder = Mock()
- build.builder.category = 'slow'
-
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
-
- def run_simple_test_sends_email_for_mode(self, mode, result):
- mock_method = Mock()
- self.patch(MailNotifier, "buildMessage", mock_method)
- mn = MailNotifier('from@example.org', mode=mode)
-
- build = FakeBuildStatus(name="build")
- mn.buildFinished('dummyBuilder', build, result)
-
- mock_method.assert_called_with('dummyBuilder', [build], result)
-
- def run_simple_test_ignores_email_for_mode(self, mode, result):
- mock_method = Mock()
- self.patch(MailNotifier, "buildMessage", mock_method)
- mn = MailNotifier('from@example.org', mode=mode)
-
- build = FakeBuildStatus(name="build")
- mn.buildFinished('dummyBuilder', build, result)
-
- self.assertFalse(mock_method.called)
-
- def test_buildFinished_mode_all_for_success(self):
- self.run_simple_test_sends_email_for_mode("all", SUCCESS)
- def test_buildFinished_mode_all_for_failure(self):
- self.run_simple_test_sends_email_for_mode("all", FAILURE)
- def test_buildFinished_mode_all_for_warnings(self):
- self.run_simple_test_sends_email_for_mode("all", WARNINGS)
- def test_buildFinished_mode_all_for_exception(self):
- self.run_simple_test_sends_email_for_mode("all", EXCEPTION)
-
- def test_buildFinished_mode_failing_for_success(self):
- self.run_simple_test_ignores_email_for_mode("failing", SUCCESS)
- def test_buildFinished_mode_failing_for_failure(self):
- self.run_simple_test_sends_email_for_mode("failing", FAILURE)
- def test_buildFinished_mode_failing_for_warnings(self):
- self.run_simple_test_ignores_email_for_mode("failing", WARNINGS)
- def test_buildFinished_mode_failing_for_exception(self):
- self.run_simple_test_ignores_email_for_mode("failing", EXCEPTION)
-
- def test_buildFinished_mode_exception_for_success(self):
- self.run_simple_test_ignores_email_for_mode("exception", SUCCESS)
- def test_buildFinished_mode_exception_for_failure(self):
- self.run_simple_test_ignores_email_for_mode("exception", FAILURE)
- def test_buildFinished_mode_exception_for_warnings(self):
- self.run_simple_test_ignores_email_for_mode("exception", WARNINGS)
- def test_buildFinished_mode_exception_for_exception(self):
- self.run_simple_test_sends_email_for_mode("exception", EXCEPTION)
-
- def test_buildFinished_mode_warnings_for_success(self):
- self.run_simple_test_ignores_email_for_mode("warnings", SUCCESS)
- def test_buildFinished_mode_warnings_for_failure(self):
- self.run_simple_test_sends_email_for_mode("warnings", FAILURE)
- def test_buildFinished_mode_warnings_for_warnings(self):
- self.run_simple_test_sends_email_for_mode("warnings", WARNINGS)
- def test_buildFinished_mode_warnings_for_exception(self):
- self.run_simple_test_ignores_email_for_mode("warnings", EXCEPTION)
-
- def test_buildFinished_mode_passing_for_success(self):
- self.run_simple_test_sends_email_for_mode("passing", SUCCESS)
- def test_buildFinished_mode_passing_for_failure(self):
- self.run_simple_test_ignores_email_for_mode("passing", FAILURE)
- def test_buildFinished_mode_passing_for_warnings(self):
- self.run_simple_test_ignores_email_for_mode("passing", WARNINGS)
- def test_buildFinished_mode_passing_for_exception(self):
- self.run_simple_test_ignores_email_for_mode("passing", EXCEPTION)
-
- def test_buildFinished_mode_failing_ignores_successful_build(self):
- mn = MailNotifier('from@example.org', mode=("failing",))
-
- build = FakeBuildStatus(name="build")
-
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
-
- def test_buildFinished_mode_passing_ignores_failed_build(self):
- mn = MailNotifier('from@example.org', mode=("passing",))
-
- build = FakeBuildStatus(name="build")
-
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build, FAILURE))
-
- def test_buildFinished_mode_problem_ignores_successful_build(self):
- mn = MailNotifier('from@example.org', mode=("problem",))
-
- build = FakeBuildStatus(name="build")
-
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
-
- def test_buildFinished_mode_problem_ignores_two_failed_builds_in_sequence(self):
- mn = MailNotifier('from@example.org', mode=("problem",))
-
- build = FakeBuildStatus(name="build")
- old_build = FakeBuildStatus(name="old_build")
- build.getPreviousBuild.return_value = old_build
- old_build.getResults.return_value = FAILURE
-
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build, FAILURE))
-
- def test_buildFinished_mode_change_ignores_first_build(self):
- mn = MailNotifier('from@example.org', mode=("change",))
-
- build = FakeBuildStatus(name="build")
- build.getPreviousBuild.return_value = None
-
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build, FAILURE))
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
-
-
- def test_buildFinished_mode_change_ignores_same_result_in_sequence(self):
- mn = MailNotifier('from@example.org', mode=("change",))
-
- build = FakeBuildStatus(name="build")
- old_build = FakeBuildStatus(name="old_build")
- build.getPreviousBuild.return_value = old_build
- old_build.getResults.return_value = FAILURE
-
- build2 = FakeBuildStatus(name="build2")
- old_build2 = FakeBuildStatus(name="old_build2")
- build2.getPreviousBuild.return_value = old_build2
- old_build2.getResults.return_value = SUCCESS
-
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build, FAILURE))
- self.assertEqual(None, mn.buildFinished('dummyBuilder', build2, SUCCESS))
-
- def test_buildMessage_addLogs(self):
- mn = MailNotifier('from@example.org', 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 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='from@example.org',
- 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 defer.succeed(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="tyler@mayhem.net")
- ])
-
- # 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 fakeGetSSlist():
- return [ss]
- build.getSourceStamps = fakeGetSSlist
-
- def _getInterestedUsers():
- # 'narrator' in this case is the owner, which tests the lookup
- return ["narrator"]
- build.getInterestedUsers = _getInterestedUsers
-
- def _getResponsibleUsers():
- return ["Big Bob <bob@mayhem.net>"]
- 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 test_sendToInterestedUsers_lookup(self):
- self.do_test_sendToInterestedUsers(
- lookup="example.org",
- exp_called_with=['Big Bob <bob@mayhem.net>',
- 'narrator@example.org'],
- exp_TO="Big Bob <bob@mayhem.net>, " \
- "narrator@example.org")
-
- def test_buildMessage_sendToInterestedUsers_no_lookup(self):
- self.do_test_sendToInterestedUsers(
- exp_called_with=['tyler@mayhem.net'],
- exp_TO="tyler@mayhem.net")
-
- def test_buildMessage_sendToInterestedUsers_extraRecipients(self):
- self.do_test_sendToInterestedUsers(
- extraRecipients=["marla@mayhem.net"],
- exp_called_with=['tyler@mayhem.net',
- 'marla@mayhem.net'],
- exp_TO="tyler@mayhem.net",
- exp_CC="marla@mayhem.net")
- def test_sendToInterestedUsers_False(self):
- self.do_test_sendToInterestedUsers(
- extraRecipients=["marla@mayhem.net"],
- sendToInterestedUsers=False,
- exp_called_with=['marla@mayhem.net'],
- exp_TO="marla@mayhem.net")
-
- def test_sendToInterestedUsers_two_builds(self):
- from email.Message import Message
- m = Message()
-
- mn = MailNotifier(fromaddr="from@example.org", 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 defer.succeed(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="tyler@mayhem.net"),
- fakedb.UserInfo(uid=2, attr_type='email',
- attr_data="user2@example.net")
- ])
-
- def _getInterestedUsers():
- # 'narrator' in this case is the owner, which tests the lookup
- return ["narrator"]
- build1.getInterestedUsers = _getInterestedUsers
- build2.getInterestedUsers = _getInterestedUsers
-
- def _getResponsibleUsers():
- return ["Big Bob <bob@mayhem.net>"]
- 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 fakeGetSSlist(ss):
- return lambda: [ss]
- build1.getSourceStamps = fakeGetSSlist(ss1)
- build2.getSourceStamps = fakeGetSSlist(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'], "tyler@mayhem.net, user2@example.net")
-
-def create_msgdict(funny_chars=u'\u00E5\u00E4\u00F6'):
- unibody = u'Unicode body with non-ascii (%s).' % funny_chars
- msg_dict = dict(body=unibody, type='plain')
- return msg_dict