diff --git a/main.py b/main.py index c0db054..c6d3490 100644 --- a/main.py +++ b/main.py @@ -105,6 +105,9 @@ def process_diff(diff, client=Client(), insert_issue_urls=False, parser=TodoPars # Stagger the requests to be on the safe side. sleep(1) + return raw_issues + + if __name__ == "__main__": client: Client | None = None # Try to create a basic client for communicating with the remote version control server, automatically initialised with environment variables. diff --git a/tests/test_comment_suffix_after_source_line.diff b/tests/test_comment_suffix_after_source_line.diff new file mode 100644 index 0000000..d192335 --- /dev/null +++ b/tests/test_comment_suffix_after_source_line.diff @@ -0,0 +1,10 @@ +diff --git a/comment_suffix_after_source_line.c b/comment_suffix_after_source_line.c +new file mode 100644 +index 0000000..d340f6a +--- /dev/null ++++ b/comment_suffix_after_source_line.c +@@ -0,0 +1,4 @@ ++void some_func() { ++ int x = 0; // TODO: give this a better name ++ x++; ++} diff --git a/tests/test_process_diff.py b/tests/test_process_diff.py index 58e1831..576e8c1 100644 --- a/tests/test_process_diff.py +++ b/tests/test_process_diff.py @@ -4,6 +4,7 @@ import unittest import tempfile import subprocess import io +import re from TodoParser import TodoParser from main import process_diff @@ -41,7 +42,7 @@ class IssueUrlInsertionTest(unittest.TestCase): # create object to hold output output = io.StringIO() # process the diffs - process_diff(diff=self.diff_file, insert_issue_urls=True, parser=self.parser, output=output) + self.raw_issues = process_diff(diff=self.diff_file, insert_issue_urls=True, parser=self.parser, output=output) # make sure the number of issue URL comments inserted is as expected self.assertEqual(output.getvalue().count('Issue URL successfully inserted'), expected_count, @@ -56,11 +57,50 @@ class IssueUrlInsertionTest(unittest.TestCase): self._setUp('test_new.diff') self._standardTest(80) + # There is a known bug related to this issue, so until it's resolved + # this is an expected failure. + # See #225 and #224 @unittest.expectedFailure def test_same_title_in_same_file(self): self._setUp('test_same_title_in_same_file.diff') self._standardTest(5) + # There is a known bug related to this issue, so until it's resolved + # this is an expected failure. + # See #229 + @unittest.expectedFailure + def test_comment_suffix_after_source_line(self): + self._setUp('test_comment_suffix_after_source_line.diff') + self._standardTest(1) + # get details about the issue and source file + issue = self.raw_issues[0] + markers, _ = self.parser._get_file_details(issue.file_name) + with open(f'{self.tempdir.name}/{issue.file_name}', 'r') as source_file: + lines = source_file.read().splitlines() + # regex search the TODO comment and issue URL lines, such that groups are: + # 2: everything from start of line up to (but excluding) comment marker + # 3: comment marker + # 4: anything after comment marker and before identifier + # 1: encompasses all of the above + source_and_todo_line = re.search(fr'^((.*?)({markers[0]["pattern"]})(.*?))(?i:{issue.identifier}).*?{issue.title}', + lines[issue.start_line-1]).groups() + issue_url_line = re.search(fr'^((.*?)({markers[0]["pattern"]})(\s*))Issue URL: N/A$', + lines[issue.start_line]).groups() + # ensure Issue URL is aligned with the TODO above it by verifying + # that length of first group is equal for both lines + self.assertEqual(len(source_and_todo_line[0]), len(issue_url_line[0]), msg='\n' + + f'Issue URL mis-alignment. {issue.identifier} begins at column ' + + f'{len(source_and_todo_line[0])+1} but\nissue URL begins at column ' + + f'{len(issue_url_line[0])+1}.\n' + + '-------------------------------------------------------------------\n' + + f'{lines[issue.start_line-1]}\n' + + f'{lines[issue.start_line]}\n') + # ensure Issue URL line has only whitespace before the comment marker + self.assertRegex(issue_url_line[1], r'^\s*$', msg='\n' + + 'Non-whitespace detected prior to comment marker for issue URL line!\n' + + '-------------------------------------------------------------------\n' + + f'{lines[issue.start_line]}\n') + def tearDown(self): # return to original working directory to ensure we don't mess up other tests os.chdir(self.orig_cwd)