def test_getChangeUids_multi(self): yield self.insertTestData(self.change14_rows + self.change13_rows + [ fakedb.User(uid=1, identifier="one"), fakedb.User(uid=2, identifier="two"), fakedb.User(uid=99, identifier="nooo"), fakedb.ChangeUser(changeid=14, uid=1), fakedb.ChangeUser(changeid=14, uid=2), fakedb.ChangeUser(changeid=13, uid=99), # not selected ]) res = yield self.db.changes.getChangeUids(14) self.assertEqual(sorted(res), [1, 2])
def test_getChangeUids_multi(self): d = self.insertTestData(self.change14_rows + self.change13_rows + [ fakedb.User(uid=1, identifier="one"), fakedb.User(uid=2, identifier="two"), fakedb.User(uid=99, identifier="nooo"), fakedb.ChangeUser(changeid=14, uid=1), fakedb.ChangeUser(changeid=14, uid=2), fakedb.ChangeUser(changeid=13, uid=99), # not selected ]) d.addCallback(lambda _ : self.db.changes.getChangeUids(14)) def check(res): self.assertEqual(sorted(res), [1, 2]) d.addCallback(check) return d
def test_getChangeUids_found(self): yield self.insertTestData(self.change14_rows + [ fakedb.SourceStamp(id=92), fakedb.User(uid=1), fakedb.ChangeUser(changeid=14, uid=1), ]) res = yield self.db.changes.getChangeUids(14) self.assertEqual(res, [1])
def test_getChangeUids_found(self): d = self.insertTestData(self.change14_rows + [ fakedb.User(uid=1), fakedb.ChangeUser(changeid=14, uid=1), ]) d.addCallback(lambda _ : self.db.changes.getChangeUids(14)) def check(res): self.assertEqual(res, [1]) d.addCallback(check) return d
class Change(unittest.TestCase): change23_rows = [ fakedb.Change(changeid=23, author="dustin", comments="fix whitespace", branch="warnerdb", revision="deadbeef", when_timestamp=266738404, revlink='http://warner/0e92a098b', category='devel', repository='git://warner', codebase='mainapp', project='Buildbot'), fakedb.ChangeFile(changeid=23, filename='master/README.txt'), fakedb.ChangeFile(changeid=23, filename='worker/README.txt'), fakedb.ChangeProperty(changeid=23, property_name='notest', property_value='["no","Change"]'), fakedb.ChangeUser(changeid=23, uid=27), ] def setUp(self): self.master = fakemaster.make_master(testcase=self, wantDb=True) self.change23 = changes.Change( **dict( # using **dict(..) forces kwargs category='devel', repository=u'git://warner', codebase=u'mainapp', who=u'dustin', when=266738404, comments=u'fix whitespace', project=u'Buildbot', branch=u'warnerdb', revlink=u'http://warner/0e92a098b', properties={'notest': "no"}, files=[u'master/README.txt', u'worker/README.txt'], revision=u'deadbeef')) self.change23.number = 23 @defer.inlineCallbacks def test_fromChdict(self): # get a real honest-to-goodness chdict from the fake db yield self.master.db.insertTestData(self.change23_rows) chdict = yield self.master.db.changes.getChange(23) exp = self.change23 got = yield changes.Change.fromChdict(self.master, chdict) # compare ok = True ok = ok and got.number == exp.number ok = ok and got.who == exp.who ok = ok and sorted(got.files) == sorted(exp.files) ok = ok and got.comments == exp.comments ok = ok and got.revision == exp.revision ok = ok and got.when == exp.when ok = ok and got.branch == exp.branch ok = ok and got.category == exp.category ok = ok and got.revlink == exp.revlink ok = ok and got.properties == exp.properties ok = ok and got.repository == exp.repository ok = ok and got.codebase == exp.codebase ok = ok and got.project == exp.project if not ok: def printable(c): return pprint.pformat(c.__dict__) self.fail("changes do not match; expected\n%s\ngot\n%s" % (printable(exp), printable(got))) def test_str(self): string = str(self.change23) self.assertTrue(re.match(r"Change\(.*\)", string), string) def test_asText(self): text = self.change23.asText() self.assertTrue( re.match( textwrap.dedent(u'''\ Files: master/README.txt worker/README.txt On: git://warner For: Buildbot At: .* Changed By: dustin Comments: fix whitespaceProperties:. notest: no '''), text), text) def test_asDict(self): dict = self.change23.asDict() self.assertIn('1978', dict['at']) # timezone-sensitive del dict['at'] self.assertEqual( dict, { 'branch': u'warnerdb', 'category': u'devel', 'codebase': u'mainapp', 'comments': u'fix whitespace', 'files': [{ 'name': u'master/README.txt' }, { 'name': u'worker/README.txt' }], 'number': 23, 'project': u'Buildbot', 'properties': [('notest', 'no', 'Change')], 'repository': u'git://warner', 'rev': u'deadbeef', 'revision': u'deadbeef', 'revlink': u'http://warner/0e92a098b', 'when': 266738404, 'who': u'dustin' }) def test_getShortAuthor(self): self.assertEqual(self.change23.getShortAuthor(), 'dustin') def test_getTime(self): # careful, or timezones will hurt here self.assertIn('Jun 1978', self.change23.getTime()) def test_getTimes(self): self.assertEqual(self.change23.getTimes(), (266738404, None)) def test_getText(self): self.change23.who = 'nasty < nasty' # test the html escaping (ugh!) self.assertEqual(self.change23.getText(), ['nasty < nasty']) def test_getLogs(self): self.assertEqual(self.change23.getLogs(), {})
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]")
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)
class Change(unittest.TestCase): change23_rows = [ fakedb.Change(changeid=23, author="dustin", comments="fix whitespace", is_dir=0, branch="warnerdb", revision="deadbeef", when_timestamp=266738404, revlink='http://warner/0e92a098b', category='devel', repository='git://warner', codebase='mainapp', project='Buildbot'), fakedb.ChangeFile(changeid=23, filename='master/README.txt'), fakedb.ChangeFile(changeid=23, filename='slave/README.txt'), fakedb.ChangeProperty(changeid=23, property_name='notest', property_value='["no","Change"]'), fakedb.ChangeUser(changeid=23, uid=27), ] def setUp(self): self.change23 = changes.Change( **dict( # using **dict(..) forces kwargs category='devel', isdir=0, repository=u'git://warner', codebase=u'mainapp', who=u'dustin', when=266738404, comments=u'fix whitespace', project=u'Buildbot', branch=u'warnerdb', revlink=u'http://warner/0e92a098b', properties={'notest': "no"}, files=[u'master/README.txt', u'slave/README.txt'], revision=u'deadbeef')) self.change23.number = 23 def test_str(self): string = str(self.change23) self.assertTrue(re.match(r"Change\(.*\)", string), string) def test_asText(self): text = self.change23.asText() self.assertTrue( re.match( textwrap.dedent(u'''\ Files: master/README.txt slave/README.txt On: git://warner For: Buildbot At: .* Changed By: dustin Comments: fix whitespaceProperties: notest: no '''), text), text) def test_asDict(self): dict = self.change23.asDict() self.assertIn('1978', dict['at']) # timezone-sensitive del dict['at'] self.assertEqual( dict, { 'branch': u'warnerdb', 'category': u'devel', 'codebase': u'mainapp', 'comments': u'fix whitespace', 'files': [{ 'name': u'master/README.txt' }, { 'name': u'slave/README.txt' }], 'number': 23, 'project': u'Buildbot', 'properties': [('notest', 'no', 'Change')], 'repository': u'git://warner', 'rev': u'deadbeef', 'revision': u'deadbeef', 'revlink': u'http://warner/0e92a098b', 'when': 266738404, 'who': u'dustin' }) def test_getShortAuthor(self): self.assertEqual(self.change23.getShortAuthor(), 'dustin') def test_getTime(self): # careful, or timezones will hurt here self.assertIn('Jun 1978', self.change23.getTime()) def test_getTimes(self): self.assertEqual(self.change23.getTimes(), (266738404, None)) def test_getText(self): self.change23.who = 'nasty < nasty' # test the html escaping (ugh!) self.assertEqual(self.change23.getText(), ['nasty < nasty']) def test_getLogs(self): self.assertEqual(self.change23.getLogs(), {})