diff options
Diffstat (limited to 'buildscripts/tests/test_todo_check.py')
-rw-r--r-- | buildscripts/tests/test_todo_check.py | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/buildscripts/tests/test_todo_check.py b/buildscripts/tests/test_todo_check.py new file mode 100644 index 00000000000..b158c3b18fb --- /dev/null +++ b/buildscripts/tests/test_todo_check.py @@ -0,0 +1,266 @@ +"""Unit tests for todo_check.py.""" + +from __future__ import absolute_import + +import os +import textwrap +import unittest +from tempfile import TemporaryDirectory + +from typing import Iterable + +import buildscripts.todo_check as under_test + +# pylint: disable=missing-docstring,invalid-name,unused-argument,no-self-use,protected-access + + +def create_file_iterator(file_contents: str) -> Iterable[str]: + return textwrap.dedent(file_contents.strip()).splitlines() + + +class TestTodo(unittest.TestCase): + def test_line_without_a_jira_issues(self): + content = "a line with some random text" + todo = under_test.Todo.from_line("file", 42, f"\n{content}\n\t\n") + + self.assertEqual(todo.file_name, "file") + self.assertEqual(todo.line_number, 42) + self.assertEqual(todo.line, content) + self.assertIsNone(todo.ticket) + + def test_line_with_a_server_ticket(self): + ticket = "SERVER-12345" + content = f"a line with {ticket} some random text" + todo = under_test.Todo.from_line("file", 42, f"\n{content}\n\t\n") + + self.assertEqual(todo.file_name, "file") + self.assertEqual(todo.line_number, 42) + self.assertEqual(todo.line, content) + self.assertEqual(todo.ticket, ticket) + + def test_line_with_a_wiredtiger_ticket(self): + ticket = "WT-5555" + content = f"a line with {ticket} some random text" + todo = under_test.Todo.from_line("file", 42, f"\n{content}\n\t\n") + + self.assertEqual(todo.file_name, "file") + self.assertEqual(todo.line_number, 42) + self.assertEqual(todo.line, content) + self.assertEqual(todo.ticket, ticket) + + +class TestTodoChecker(unittest.TestCase): + def test_todo_checker_starts_out_empty(self): + todos = under_test.TodoChecker() + + self.assertEqual(len(todos.found_todos.no_tickets), 0) + self.assertEqual(len(todos.found_todos.with_tickets), 0) + self.assertEqual(len(todos.found_todos.by_file), 0) + + def test_a_file_with_no_todos(self): + file_contents = """ + line 0 + line 1 + this is the file contents. + + """ + todos = under_test.TodoChecker() + + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertEqual(len(todos.found_todos.no_tickets), 0) + self.assertEqual(len(todos.found_todos.with_tickets), 0) + self.assertEqual(len(todos.found_todos.by_file), 0) + + def test_a_file_with_an_untagged_todo(self): + file_contents = """ + line 0 + line 1 + /* todo this needs some updating */ + this is the file contents. + """ + todos = under_test.TodoChecker() + + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertEqual(len(todos.found_todos.no_tickets), 1) + self.assertEqual(len(todos.found_todos.with_tickets), 0) + self.assertEqual(len(todos.found_todos.by_file), 1) + + todo = todos.found_todos.no_tickets[0] + self.assertEqual(todo.file_name, "my file") + self.assertEqual(todo.line_number, 3) + self.assertEqual(todo.ticket, None) + + self.assertEqual(todo, todos.found_todos.by_file["my file"][0]) + + def test_a_file_with_a_tagged_todo(self): + file_contents = """ + line 0 + line 1 + line 2 + /* TODO server-1234 this needs some updating */ + this is the file contents. + """ + todos = under_test.TodoChecker() + + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertEqual(len(todos.found_todos.no_tickets), 0) + self.assertEqual(len(todos.found_todos.with_tickets), 1) + self.assertEqual(len(todos.found_todos.by_file), 1) + + todo = todos.found_todos.with_tickets["SERVER-1234"][0] + self.assertEqual(todo.file_name, "my file") + self.assertEqual(todo.line_number, 4) + self.assertEqual(todo.ticket, "SERVER-1234") + + self.assertEqual(todo, todos.found_todos.by_file["my file"][0]) + + def test_report_on_ticket_will_return_true_if_ticket_is_found(self): + file_contents = """ + line 0 + line 1 + line 2 + /* TODO server-1234 this needs some updating */ + this is the file contents. + """ + todos = under_test.TodoChecker() + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertTrue(todos.report_on_ticket("SERVER-1234")) + + def test_report_on_ticket_will_return_false_if_ticket_is_not_found(self): + file_contents = """ + line 0 + line 1 + line 2 + /* TODO server-1234 this needs some updating */ + this is the file contents. + """ + todos = under_test.TodoChecker() + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertFalse(todos.report_on_ticket("SERVER-9876")) + + def test_report_all_tickets_will_return_true_if_any_ticket_is_found(self): + file_contents = """ + line 0 + line 1 + line 2 + /* TODO server-1234 this needs some updating */ + this is the file contents. + /* TODO server-54321 this also needs some updating */ + """ + todos = under_test.TodoChecker() + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertTrue(todos.report_on_all_tickets()) + + def test_report_all_tickets_will_return_false_if_no_ticket_is_found(self): + file_contents = """ + line 0 + line 1 + line 2 + this is the file contents. + """ + todos = under_test.TodoChecker() + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertFalse(todos.report_on_all_tickets()) + + +class TestValidateCommitQueue(unittest.TestCase): + def test_revert_commits_should_not_fail(self): + commit_message = "Reverts commit SERVER-1234" + file_contents = """ + line 0 + line 1 + line 2 + /* TODO server-1234 this needs some updating */ + this is the file contents. + /* TODO server-54321 this also needs some updating */ + """ + todos = under_test.TodoChecker() + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertFalse(todos.validate_commit_queue(commit_message)) + + def test_todos_associated_with_commit_message_should_be_found(self): + commit_message = "SERVER-1234 making a commit" + file_contents = """ + line 0 + line 1 + line 2 + /* TODO server-1234 this needs some updating */ + this is the file contents. + /* TODO server-54321 this also needs some updating */ + """ + todos = under_test.TodoChecker() + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertTrue(todos.validate_commit_queue(commit_message)) + + def test_commit_messages_with_multiple_commits_search_all_of_them(self): + commit_message = """ + Making a wiredtiger drop + + WT-1234 + WT-4321 + WT-9876 + """ + file_contents = """ + line 0 + line 1 + line 2 + /* TODO server-1234 this needs some updating */ + this is the file contents. + /* TODO WT-9876 this also needs some updating */ + """ + todos = under_test.TodoChecker() + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertTrue(todos.validate_commit_queue(commit_message)) + + def test_commit_messages_with_no_tickets_doesnt_cause_issues(self): + commit_message = "A random commit" + file_contents = """ + line 0 + line 1 + line 2 + /* TODO server-1234 this needs some updating */ + this is the file contents. + /* TODO WT-9876 this also needs some updating */ + """ + todos = under_test.TodoChecker() + todos.check_file("my file", create_file_iterator(file_contents)) + + self.assertFalse(todos.validate_commit_queue(commit_message)) + + +def write_file(path: str, contents: str): + with open(path, "w") as fh: + fh.write(contents) + + +class TestWalkFs(unittest.TestCase): + def test_walk_fs_walks_the_fs(self): + expected_files = { + "file1.txt": "The contents of file 1", + "file2.txt": "The contents of file 2", + } + with TemporaryDirectory() as tmpdir: + write_file(os.path.join(tmpdir, "file1.txt"), expected_files["file1.txt"]) + os.makedirs(os.path.join(tmpdir, "dir0", "dir1")) + write_file( + os.path.join(tmpdir, "dir0", "dir1", "file2.txt"), expected_files["file2.txt"]) + + seen_files = {} + + def visit_file(file_name, file_contents): + base_name = os.path.basename(file_name) + seen_files[base_name] = "\n".join(file_contents) + + under_test.walk_fs(tmpdir, visit_file) + + self.assertDictEqual(expected_files, seen_files) |