2019-12-06 16:59:35 +00:00
""" Unit tests for the evergreen_task_timeout script. """
2024-05-16 18:00:17 -04:00
2019-12-06 16:59:35 +00:00
import unittest
2025-02-27 15:24:19 -08:00
from unittest . mock import patch
2024-10-10 10:59:18 -07:00
2024-06-18 17:50:28 -07:00
from git import Commit , Repo
2019-12-06 16:59:35 +00:00
2025-02-27 15:24:19 -08:00
from buildscripts . validate_commit_message import (
get_non_merge_queue_squashed_commits ,
is_valid_commit ,
)
2020-04-29 19:00:37 +01:00
2020-04-28 20:46:00 -04:00
class ValidateCommitMessageTest ( unittest . TestCase ) :
2024-05-20 22:17:04 -04:00
def test_valid ( self ) :
2024-06-18 17:50:28 -07:00
fake_repo = Repo ( )
2019-12-06 16:59:35 +00:00
messages = [
2024-06-18 17:50:28 -07:00
Commit ( repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " SERVER-44338 " ) ,
Commit ( repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = ' Revert " SERVER-60 ' ) ,
Commit (
repo = fake_repo ,
binsha = b " deadbeefdeadbeefdead " ,
message = " Import wiredtiger: 58115abb6fbb3c1cc7bfd087d41a47347bce9a69 from branch mongodb-4.4 " ,
) ,
Commit (
repo = fake_repo ,
binsha = b " deadbeefdeadbeefdead " ,
message = ' Revert " Import wiredtiger: 58115abb6fbb3c1cc7bfd087d41a47347bce9a69 from branch mongodb-4.4 " ' ,
) ,
Commit (
repo = fake_repo ,
binsha = b " deadbeefdeadbeefdead " ,
message = " SERVER-44338 blablablalbabla \n multiline message \n asdfasdf " ,
) ,
2020-01-23 17:52:51 +00:00
]
2021-09-07 12:31:17 -04:00
2024-09-20 09:01:02 -07:00
self . assertTrue ( all ( is_valid_commit ( message ) for message in messages ) )
2021-09-07 12:31:17 -04:00
2024-05-20 22:17:04 -04:00
def test_invalid ( self ) :
2024-06-18 17:50:28 -07:00
fake_repo = Repo ( )
2021-07-13 15:55:44 -04:00
messages = [
2024-06-18 17:50:28 -07:00
Commit (
repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " SERVER- "
) , # missing number
Commit (
repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " Revert SERVER-60 "
) , # missing quote before SERVER
Commit ( repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " " ) , # empty value
Commit (
repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " nonsense "
) , # nonsense value
Commit (
repo = fake_repo ,
binsha = b " deadbeefdeadbeefdead " ,
message = " SERVER-123 asdf \n https://spruce.mongodb.com " ,
) , # Contains some banned strings
Commit (
repo = fake_repo ,
binsha = b " deadbeefdeadbeefdead " ,
message = " SERVER-123 asdf \n https://evergreen.mongodb.com " ,
) , # Contains some banned strings
Commit (
repo = fake_repo ,
binsha = b " deadbeefdeadbeefdead " ,
message = " SERVER-123 asdf \n Anything in this description will be included in the commit message. Replace or delete this text before merging. Add links to testing in the comments of the PR. " ,
) , # Contains some banned strings
2024-07-23 12:35:07 -04:00
Commit (
repo = fake_repo ,
binsha = b " deadbeefdeadbeefdead " ,
message = " SERVER-123 asdf \n Anything \n \n in this description will be included in the commit message. \n Replace or delete this text before merging. Add links to testing in the \n comments of the PR. " ,
) , # Contains some banned strings with extra newlines
2021-07-13 15:55:44 -04:00
]
2021-12-29 10:57:03 -05:00
2024-09-20 09:01:02 -07:00
self . assertTrue ( all ( not is_valid_commit ( message ) for message in messages ) )
2025-02-27 15:24:19 -08:00
2026-02-18 12:12:18 -06:00
def test_valid_commit_with_changed_files_server_project ( self ) :
""" Test that SERVER project can modify any file. """
fake_repo = Repo ( )
commit = Commit (
repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " SERVER-12345 Add new feature "
)
# SERVER project should be able to modify any file
changed_files = [
" src/mongo/db/query.cpp " ,
" monguard/test.cpp " ,
" buildscripts/test.py " ,
" random/path/to/file.txt " ,
]
self . assertTrue ( is_valid_commit ( commit , changed_files ) )
def test_valid_commit_with_changed_files_guard_project ( self ) :
""" Test that GUARD project can only modify files in monguard/ directory. """
fake_repo = Repo ( )
commit = Commit (
repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " GUARD-12345 Update monguard "
)
# GUARD project should be able to modify files in monguard/
changed_files = [
" monguard/test.cpp " ,
" monguard/subdir/file.h " ,
" monguard/deep/nested/path/file.py " ,
]
self . assertTrue ( is_valid_commit ( commit , changed_files ) )
def test_invalid_commit_guard_project_wrong_path ( self ) :
""" Test that GUARD project cannot modify files outside monguard/ directory. """
fake_repo = Repo ( )
commit = Commit (
repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " GUARD-12345 Update monguard "
)
# GUARD project should NOT be able to modify files outside monguard/
changed_files = [
" monguard/test.cpp " , # This is allowed
" src/mongo/db/query.cpp " , # This is NOT allowed
]
self . assertFalse ( is_valid_commit ( commit , changed_files ) )
def test_invalid_commit_unknown_jira_project ( self ) :
""" Test that unknown JIRA projects are rejected. """
fake_repo = Repo ( )
commit = Commit (
repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " UNKNOWN-12345 Some change "
)
changed_files = [ " src/mongo/db/query.cpp " ]
self . assertFalse ( is_valid_commit ( commit , changed_files ) )
def test_wiredtiger_import_no_path_validation ( self ) :
""" Test that wiredtiger imports don ' t trigger path validation. """
fake_repo = Repo ( )
commit = Commit (
repo = fake_repo ,
binsha = b " deadbeefdeadbeefdead " ,
message = " Import wiredtiger: 58115abb6fbb3c1cc7bfd087d41a47347bce9a69 from branch mongodb-4.4 " ,
)
# Wiredtiger imports don't have JIRA project validation
changed_files = [ " src/third_party/wiredtiger/file.c " ]
self . assertTrue ( is_valid_commit ( commit , changed_files ) )
def test_recursive_glob_pattern_matching ( self ) :
""" Test that ** pattern correctly matches nested paths. """
fake_repo = Repo ( )
commit = Commit (
repo = fake_repo , binsha = b " deadbeefdeadbeefdead " , message = " GUARD-12345 Deep nested change "
)
# Test deeply nested paths work with **/* pattern
changed_files = [ " monguard/a/b/c/d/e/f/g/deeply/nested/file.cpp " ]
self . assertTrue ( is_valid_commit ( commit , changed_files ) )
2025-02-27 15:24:19 -08:00
@patch ( " requests.post " )
def test_squashed_commit ( self , mock_request ) :
class FakeResponse :
def json ( self ) :
return {
" data " : {
" repository " : {
" pullRequest " : {
" viewerMergeHeadlineText " : " SERVER-1234 Add a ton of great support (#32823) " ,
" viewerMergeBodyText " : " This PR adds back support for a lot of things \n Many great things! " ,
}
}
}
}
mock_request . return_value = FakeResponse ( )
commits = get_non_merge_queue_squashed_commits (
github_org = " fun_org " , github_repo = " fun_repo " , pr_number = 1024 , github_token = " fun_token "
)
self . assertEqual ( len ( commits ) , 1 )
self . assertEqual (
commits [ 0 ] . message ,
" SERVER-1234 Add a ton of great support (#32823) \n This PR adds back support for a lot of things \n Many great things! " ,
)