def test_required_flags_found(self): extractor = BugzillaExtractor("", required_flags=[ 'myos-1.0+', 'pm_ack+']) bug1 = ('123456', 'Did something interesting.') bug2 = ('444555', 'Something else.') bug3 = ('987654', 'Such amaze!') extractor._extract_bzs = Mock(return_value=[ bug1, bug2, bug3]) extractor._check_for_bugzilla_creds = Mock() bug_mocks = [ MockBug(bug1[0], ['myos-1.0+', 'pm_ack+']), MockBug(bug2[0], ['myos-2.0?', 'pm_ack?']), MockBug(bug3[0], ['myos-1.0+', 'pm_ack+'])] def next_bug(*args): return bug_mocks.pop(0) extractor._load_bug = Mock(side_effect=next_bug) results = extractor.extract() self.assertEquals(2, len(extractor.bzs)) self.assertEquals(bug1[0], extractor.bzs[0][0]) self.assertEquals(bug1[1], extractor.bzs[0][1]) self.assertEquals(bug3[0], extractor.bzs[1][0]) self.assertEquals(bug3[1], extractor.bzs[1][1]) self.assertEquals(2, len(results)) self.assertEquals("Resolves: #123456 - Did something interesting.", results[0]) self.assertEquals("Resolves: #987654 - Such amaze!", results[1])
def test_same_id_multiple_times(self): extractor = BugzillaExtractor("", required_flags=[ 'myos-1.0+', 'pm_ack+']) bug1 = ('123456', 'Did something interesting.') bug3 = ('123456', 'Oops, lets try again.') extractor._extract_bzs = Mock(return_value=[ bug1, bug3]) extractor._check_for_bugzilla_creds = Mock() extractor._load_bug = Mock( return_value=MockBug(bug1[0], ['myos-1.0+', 'pm_ack+'])) results = extractor.extract() self.assertEquals(2, len(extractor.bzs)) self.assertEquals(bug1[0], extractor.bzs[0][0]) self.assertEquals(bug1[1], extractor.bzs[0][1]) self.assertEquals(bug3[0], extractor.bzs[1][0]) self.assertEquals(bug3[1], extractor.bzs[1][1]) self.assertEquals(2, len(results)) self.assertEquals("Resolves: #123456 - Did something interesting.", results[0]) self.assertEquals("Resolves: #123456 - Oops, lets try again.", results[1])
def test_required_flags_missing(self, mock_error): required_flags = ['myos-2.0+'] extractor = BugzillaExtractor("", required_flags) bug1 = ('123456', 'Did something interesting.') bug2 = ('444555', 'Something else.') bug3 = ('987654', 'Such amaze!') extractor._extract_bzs = Mock(return_value=[ bug1, bug2, bug3]) extractor._check_for_bugzilla_creds = Mock() bug_mocks = [ MockBug(bug1[0], ['myos-1.0+', 'pm_ack+']), MockBug(bug2[0], ['myos-2.0?', 'pm_ack?']), MockBug(bug3[0], ['myos-1.0+', 'pm_ack+'])] def next_bug(*args): return bug_mocks.pop(0) extractor._load_bug = Mock(side_effect=next_bug) results = extractor.extract() self.assertEquals(0, len(extractor.bzs)) self.assertEquals(0, len(results)) mock_error.assert_called_once_with("No bugzillas found with required flags: %s" % required_flags)
def test_diff_format(self): commit_log = "+- 123456: Did something interesting." extractor = BugzillaExtractor(commit_log) results = extractor.extract() self.assertEquals(1, len(results)) self.assertEquals("Resolves: #123456 - Did something interesting.", results[0])
def test_single_with_no_spaces(self): commit_log = "- 123456-Did something interesting." extractor = BugzillaExtractor(commit_log) results = extractor.extract() self.assertEquals(1, len(results)) self.assertEquals("Resolves: #123456 - Did something interesting.", results[0])
def test_multi_line(self): commit_log = "- 123456: Did something interesting.\n- Another commit.\n" \ "- 456789: A third commit." extractor = BugzillaExtractor(commit_log) results = extractor.extract() self.assertEquals(2, len(results)) self.assertEquals("Resolves: #123456 - Did something interesting.", results[0]) self.assertEquals("Resolves: #456789 - A third commit.", results[1])
def _confirm_commit_msg(self, diff_output): """ Generates a commit message in a temporary file, gives the user a chance to edit it, and returns the filename to the caller. """ fd, name = tempfile.mkstemp() debug("Storing commit message in temp file: %s" % name) write(fd, "Update %s to %s\n" % (self.project_name, self.builder.build_version)) # Write out Resolves line for all bugzillas we see in commit diff: # TODO: move to DistGitBuilder only? try: (required_bz_flags, placeholder_bz) = self._get_bz_flags() extractor = BugzillaExtractor(diff_output, required_flags=required_bz_flags, placeholder_bz=placeholder_bz) for line in extractor.extract(): write(fd, line + "\n") except MissingBugzillaCredsException: error_out([ "Releaser specifies required flags but you have not configured", "a ~/.bugzillarc with your bugzilla credentials.", "Example:", "", "[bugzilla.redhat.com]", "user = [email protected]", "password = mypassword"]) print("") print("##### Commit message: #####") print("") os.lseek(fd, 0, 0) f = os.fdopen(fd) for line in f.readlines(): print(line) f.close() print("") print("###############################") print("") if self._ask_yes_no("Would you like to edit this commit message? [y/n] ", False): debug("Opening editor for user to edit commit message in: %s" % name) editor = 'vi' if "EDITOR" in os.environ: editor = os.environ["EDITOR"] subprocess.call(editor.split() + [name]) return name
def test_bug_doesnt_exist(self, mock_error): required_flags = ['myos-1.0+', 'pm_ack+'] extractor = BugzillaExtractor("", required_flags) bug1 = ('123456', 'Did something interesting.') extractor._extract_bzs = Mock(return_value=[ bug1]) extractor._check_for_bugzilla_creds = Mock() from tito.compat import xmlrpclib extractor._load_bug = Mock(side_effect=xmlrpclib.Fault("", "")) results = extractor.extract() self.assertEquals(0, len(extractor.bzs)) self.assertEquals(0, len(results)) mock_error.assert_called_once_with("No bugzillas found with required flags: %s" % required_flags)
def test_required_flags_missing_with_placeholder(self): extractor = BugzillaExtractor("", required_flags=[ 'myos-2.0+'], placeholder_bz="54321") bug1 = ('123456', 'Did something interesting.') extractor._extract_bzs = Mock(return_value=[ bug1]) extractor._check_for_bugzilla_creds = Mock() extractor._load_bug = Mock( return_value=MockBug(bug1[0], ['myos-1.0+', 'pm_ack+'])) results = extractor.extract() self.assertEquals(0, len(extractor.bzs)) self.assertEquals(1, len(results)) self.assertEquals("Related: #54321", results[0])
def test_single_required_flag_found(self): extractor = BugzillaExtractor("", required_flags=[ 'myos-1.0+', 'pm_ack+']) bug1 = ('123456', 'Did something interesting.') extractor._extract_bzs = Mock(return_value=[ bug1]) extractor._check_for_bugzilla_creds = Mock() extractor._load_bug = Mock( return_value=MockBug(bug1[0], ['myos-1.0+', 'pm_ack+'])) results = extractor.extract() self.assertEquals(1, len(extractor.bzs)) self.assertEquals(bug1[0], extractor.bzs[0][0]) self.assertEquals(bug1[1], extractor.bzs[0][1]) self.assertEquals(1, len(results)) self.assertEquals("Resolves: #123456 - Did something interesting.", results[0])
def _confirm_commit_msg(self, diff_output): """ Generates a commit message in a temporary file, gives the user a chance to edit it, and returns the filename to the caller. """ fd, name = tempfile.mkstemp() debug("Storing commit message in temp file: %s" % name) write(fd, "Update %s to %s\n" % (self.obs_package_name, self.builder.build_version)) # Write out Resolves line for all bugzillas we see in commit diff: extractor = BugzillaExtractor(diff_output) for line in extractor.extract(): write(fd, line + "\n") print("") print("##### Commit message: #####") print("") os.lseek(fd, 0, 0) commit_file = os.fdopen(fd) for line in commit_file.readlines(): print(line) commit_file.close() print("") print("###############################") print("") if self._ask_yes_no("Would you like to edit this commit message? [y/n] ", False): debug("Opening editor for user to edit commit message in: %s" % name) editor = 'vi' if "EDITOR" in os.environ: editor = os.environ["EDITOR"] subprocess.call(editor.split() + [name]) return name
def test_bug_doesnt_exist(self, mock_error): required_flags = ['myos-1.0+', 'pm_ack+'] extractor = BugzillaExtractor("", required_flags) bug1 = ('123456', 'Did something interesting.') extractor._extract_bzs = Mock(return_value=[bug1]) extractor._check_for_bugzilla_creds = Mock() from tito.compat import xmlrpclib extractor._load_bug = Mock(side_effect=xmlrpclib.Fault("", "")) results = extractor.extract() self.assertEquals(0, len(extractor.bzs)) self.assertEquals(0, len(results)) mock_error.assert_called_once_with( "No bugzillas found with required flags: %s" % required_flags)
def test_required_flags_missing_with_placeholder(self): extractor = BugzillaExtractor("", required_flags=['myos-2.0+'], placeholder_bz="54321") bug1 = ('123456', 'Did something interesting.') extractor._extract_bzs = Mock(return_value=[bug1]) extractor._check_for_bugzilla_creds = Mock() extractor._load_bug = Mock( return_value=MockBug(bug1[0], ['myos-1.0+', 'pm_ack+'])) results = extractor.extract() self.assertEquals(0, len(extractor.bzs)) self.assertEquals(1, len(results)) self.assertEquals("Related: #54321", results[0])
def test_single_required_flag_found(self): extractor = BugzillaExtractor("", required_flags=['myos-1.0+', 'pm_ack+']) bug1 = ('123456', 'Did something interesting.') extractor._extract_bzs = Mock(return_value=[bug1]) extractor._check_for_bugzilla_creds = Mock() extractor._load_bug = Mock( return_value=MockBug(bug1[0], ['myos-1.0+', 'pm_ack+'])) results = extractor.extract() self.assertEquals(1, len(extractor.bzs)) self.assertEquals(bug1[0], extractor.bzs[0][0]) self.assertEquals(bug1[1], extractor.bzs[0][1]) self.assertEquals(1, len(results)) self.assertEquals("Resolves: #123456 - Did something interesting.", results[0])
def test_single_line_no_bz(self): commit_log = "- Did something interesting." extractor = BugzillaExtractor(commit_log) results = extractor.extract() self.assertEquals(0, len(results))