summaryrefslogtreecommitdiff
path: root/buildscripts/tests/test_validate_commit_message.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildscripts/tests/test_validate_commit_message.py')
-rw-r--r--buildscripts/tests/test_validate_commit_message.py123
1 files changed, 111 insertions, 12 deletions
diff --git a/buildscripts/tests/test_validate_commit_message.py b/buildscripts/tests/test_validate_commit_message.py
index 1bf0039188d..db341a5add1 100644
--- a/buildscripts/tests/test_validate_commit_message.py
+++ b/buildscripts/tests/test_validate_commit_message.py
@@ -1,31 +1,130 @@
"""Unit tests for the evergreen_task_timeout script."""
+import itertools
import unittest
+from typing import List, Optional
+from unittest.mock import MagicMock
-from buildscripts.validate_commit_message import main, STATUS_OK, STATUS_ERROR
+import buildscripts.validate_commit_message as under_test
+from buildscripts.client.jiraclient import JiraClient, SecurityLevel
+from evergreen import EvergreenApi
# pylint: disable=missing-docstring,no-self-use
+INVALID_MESSAGES = [
+ "", # You must provide a message
+ "RevertEVG-1", # revert and ticket must be formatted
+ "revert EVG-1", # revert must be capitalized
+ "This is not a valid message", # message must be valid
+ "Fix Lint", # Fix lint is strict in terms of caps
+]
+
+
+def create_mock_code_change(code_change_messages: List[str], branch_name: Optional[str] = None):
+ mock_code_change = MagicMock(
+ commit_messages=code_change_messages,
+ branch_name=branch_name if branch_name else "mongodb-mongo-master",
+ )
+ return mock_code_change
+
+
+def create_mock_patch(code_change_messages: List[str], branch_name: Optional[str] = None):
+ mock_code_change = create_mock_code_change(code_change_messages, branch_name)
+ mock_patch = MagicMock(module_code_changes=[mock_code_change])
+ return mock_patch
+
+
+def create_mock_evg_client(code_change_messages: List[str],
+ branch_name: Optional[str] = None) -> MagicMock:
+ mock_patch = create_mock_patch(code_change_messages, branch_name)
+
+ mock_evg_client = MagicMock(spec_set=EvergreenApi)
+ mock_evg_client.patch_by_id.return_value = mock_patch
+ return mock_evg_client
+
+
+def create_mock_jira_client():
+ mock_jira = MagicMock(spec_set=JiraClient)
+ mock_jira.get_ticket_security_level.return_value = SecurityLevel.NONE
+ return mock_jira
+
+
+def interleave_new_format(older):
+ """Create a new list containing a new and old format copy of each string."""
+ newer = [
+ f"Commit Queue Merge: '{old}' into 'mongodb/mongo:SERVER-45949-validate-message-format'"
+ for old in older
+ ]
+ return list(itertools.chain(*zip(older, newer)))
+
class ValidateCommitMessageTest(unittest.TestCase):
- def test_valid(self):
+ def test_valid_commits(self):
messages = [
+ "Fix lint",
+ "EVG-1", # Test valid projects with various number lengths
+ "SERVER-20",
+ "WT-300",
"SERVER-44338",
- "Revert \"SERVER-60",
+ "Revert EVG-5",
+ "Revert SERVER-60",
+ "Revert WT-700",
+ "Revert 'SERVER-8000",
+ 'Revert "SERVER-90000',
"Import wiredtiger: 58115abb6fbb3c1cc7bfd087d41a47347bce9a69 from branch mongodb-4.4",
+ "Import tools: 58115abb6fbb3c1cc7bfd087d41a47347bce9a69 from branch mongodb-4.4",
'Revert "Import wiredtiger: 58115abb6fbb3c1cc7bfd087d41a47347bce9a69 from branch mongodb-4.4"',
]
+ mock_evg_api = create_mock_evg_client(interleave_new_format(messages))
+ mock_jira = create_mock_jira_client()
+ orchestrator = under_test.CommitMessageValidationOrchestrator(mock_evg_api, mock_jira)
+
+ is_valid = orchestrator.validate_commit_messages("version_id")
+
+ self.assertEqual(is_valid, under_test.STATUS_OK)
- self.assertTrue(all(main([message]) == STATUS_OK for message in messages))
+ def test_private(self):
+ messages = ["XYZ-1"]
+ mock_evg_api = create_mock_evg_client(interleave_new_format(messages))
+ mock_jira = create_mock_jira_client()
+ orchestrator = under_test.CommitMessageValidationOrchestrator(mock_evg_api, mock_jira)
- def test_invalid(self):
+ is_valid = orchestrator.validate_commit_messages("version_id")
+
+ self.assertEqual(is_valid, under_test.STATUS_ERROR)
+
+ def test_private_with_public(self):
messages = [
- "SERVER-", # missing number
- "Revert SERVER-60", # missing quote before SERVER
- "", # empty value
- "nonsense", # nonsense values
+ "Fix lint",
+ "EVG-1", # Test valid projects with various number lengths
+ "SERVER-20",
+ "XYZ-1",
]
+ mock_evg_api = create_mock_evg_client(interleave_new_format(messages))
+ mock_jira = create_mock_jira_client()
+ orchestrator = under_test.CommitMessageValidationOrchestrator(mock_evg_api, mock_jira)
+
+ is_valid = orchestrator.validate_commit_messages("version_id")
+
+ self.assertEqual(is_valid, under_test.STATUS_ERROR)
+
+ def test_internal_ticket_to_public_repo_should_fail(self):
+ message = "SERVER-20"
+ mock_evg_api = create_mock_evg_client(interleave_new_format([message]))
+ mock_jira = create_mock_jira_client()
+ mock_jira.get_ticket_security_level.return_value = SecurityLevel.MONGO_INTERNAL
+ orchestrator = under_test.CommitMessageValidationOrchestrator(mock_evg_api, mock_jira)
+
+ is_valid = orchestrator.validate_commit_messages("version_id")
+
+ self.assertEqual(is_valid, under_test.STATUS_ERROR)
+
+ def test_internal_ticket_to_private_repo_should_succeed(self):
+ message = "SERVER-20"
+ mock_evg_api = create_mock_evg_client(interleave_new_format([message]), "private-repo")
+ mock_jira = create_mock_jira_client()
+ mock_jira.get_ticket_security_level.return_value = SecurityLevel.MONGO_INTERNAL
+ orchestrator = under_test.CommitMessageValidationOrchestrator(mock_evg_api, mock_jira)
- self.assertTrue(all(main([message]) == STATUS_ERROR for message in messages))
+ is_valid = orchestrator.validate_commit_messages("version_id")
- def test_message_is_empty_list(self):
- self.assertEqual(main([]), STATUS_ERROR)
+ self.assertEqual(is_valid, under_test.STATUS_OK)