@@ -1680,6 +1680,64 @@ async def test_check_if_pr_approved_commented(self, pull_request_handler: PullRe
16801680 result = await pull_request_handler ._check_if_pr_approved (labels = [f"{ COMMENTED_BY_LABEL_PREFIX } reviewer1" ])
16811681 assert result == "" # Empty string means no errors
16821682
1683+ @pytest .mark .asyncio
1684+ async def test_check_if_pr_approved_lgtm_hyphenated_username (
1685+ self , pull_request_handler : PullRequestHandler
1686+ ) -> None :
1687+ """Test that LGTM labels with hyphenated usernames are parsed correctly."""
1688+ hyphenated_user = "Ahmad-Hafe"
1689+ with (
1690+ patch .object (
1691+ pull_request_handler .owners_file_handler ,
1692+ "owners_data_for_changed_files" ,
1693+ _owners_data_coroutine (),
1694+ ),
1695+ patch .object (pull_request_handler .github_webhook , "minimum_lgtm" , 1 ),
1696+ patch .object (pull_request_handler .owners_file_handler , "all_pull_request_approvers" , []),
1697+ patch .object (pull_request_handler .owners_file_handler , "root_approvers" , []),
1698+ patch .object (pull_request_handler .owners_file_handler , "root_reviewers" , []),
1699+ patch .object (pull_request_handler .owners_file_handler , "all_pull_request_reviewers" , [hyphenated_user ]),
1700+ patch .object (pull_request_handler .github_webhook , "parent_committer" , "someone-else" ),
1701+ ):
1702+ result = await pull_request_handler ._check_if_pr_approved (
1703+ labels = [f"{ LGTM_BY_LABEL_PREFIX } { hyphenated_user } " ]
1704+ )
1705+ assert result == "" # Hyphenated username should be recognized as a valid reviewer
1706+
1707+ @pytest .mark .asyncio
1708+ async def test_check_if_pr_approved_approved_hyphenated_username (
1709+ self , pull_request_handler : PullRequestHandler
1710+ ) -> None :
1711+ """Test that approved labels with hyphenated usernames are parsed correctly."""
1712+ hyphenated_user = "Ahmad-Hafe"
1713+ with (
1714+ patch .object (
1715+ pull_request_handler .owners_file_handler ,
1716+ "owners_data_for_changed_files" ,
1717+ _owners_data_coroutine (),
1718+ ),
1719+ patch .object (pull_request_handler .github_webhook , "minimum_lgtm" , 0 ),
1720+ patch .object (pull_request_handler .owners_file_handler , "all_pull_request_approvers" , [hyphenated_user ]),
1721+ patch .object (pull_request_handler .owners_file_handler , "root_approvers" , [hyphenated_user ]),
1722+ patch .object (pull_request_handler .owners_file_handler , "root_reviewers" , []),
1723+ patch .object (pull_request_handler .owners_file_handler , "all_pull_request_reviewers" , []),
1724+ ):
1725+ result = await pull_request_handler ._check_if_pr_approved (
1726+ labels = [f"{ APPROVED_BY_LABEL_PREFIX } { hyphenated_user } " ]
1727+ )
1728+ assert result == "" # Hyphenated username should be recognized as an approver
1729+
1730+ def test_check_labels_for_can_be_merged_changes_requested_hyphenated_username (
1731+ self , pull_request_handler : PullRequestHandler
1732+ ) -> None :
1733+ """Test that changes-requested labels with hyphenated usernames are parsed correctly."""
1734+ hyphenated_user = "Ahmad-Hafe"
1735+ with patch .object (pull_request_handler .owners_file_handler , "all_pull_request_approvers" , [hyphenated_user ]):
1736+ result = pull_request_handler ._check_labels_for_can_be_merged (
1737+ labels = [f"{ CHANGED_REQUESTED_BY_LABEL_PREFIX } { hyphenated_user } " ]
1738+ )
1739+ assert "PR has changed requests from approvers" in result
1740+
16831741 def test_check_labels_for_can_be_merged_approved (self , pull_request_handler : PullRequestHandler ) -> None :
16841742 # Mock the logic to return empty string (no errors) when appropriate
16851743 with patch .object (pull_request_handler , "_check_if_pr_approved" , return_value = "" ):
@@ -1710,6 +1768,77 @@ def test_check_labels_for_can_be_merged_not_approved(self, pull_request_handler:
17101768 result = pull_request_handler ._check_labels_for_can_be_merged (labels = ["other-label" ])
17111769 assert result == "" # Empty string means no errors
17121770
1771+ @pytest .mark .asyncio
1772+ async def test_check_if_pr_approved_lgtm_label_only_matches_prefix (
1773+ self , pull_request_handler : PullRequestHandler
1774+ ) -> None :
1775+ """Test that only labels starting with LGTM prefix are counted as LGTM."""
1776+ reviewer = "reviewer1"
1777+ with (
1778+ patch .object (
1779+ pull_request_handler .owners_file_handler ,
1780+ "owners_data_for_changed_files" ,
1781+ _owners_data_coroutine (),
1782+ ),
1783+ patch .object (pull_request_handler .github_webhook , "minimum_lgtm" , 1 ),
1784+ patch .object (pull_request_handler .owners_file_handler , "all_pull_request_approvers" , []),
1785+ patch .object (pull_request_handler .owners_file_handler , "root_approvers" , []),
1786+ patch .object (pull_request_handler .owners_file_handler , "root_reviewers" , []),
1787+ patch .object (pull_request_handler .owners_file_handler , "all_pull_request_reviewers" , [reviewer ]),
1788+ patch .object (pull_request_handler .github_webhook , "parent_committer" , "someone-else" ),
1789+ ):
1790+ # Valid LGTM label starting with prefix should count
1791+ result = await pull_request_handler ._check_if_pr_approved (labels = [f"{ LGTM_BY_LABEL_PREFIX } { reviewer } " ])
1792+ assert result == ""
1793+
1794+ # Label containing prefix in the middle should NOT count
1795+ result = await pull_request_handler ._check_if_pr_approved (labels = [f"not-{ LGTM_BY_LABEL_PREFIX } { reviewer } " ])
1796+ assert "Missing lgtm from reviewers" in result
1797+
1798+ @pytest .mark .asyncio
1799+ async def test_check_if_pr_approved_approved_label_only_matches_prefix (
1800+ self , pull_request_handler : PullRequestHandler
1801+ ) -> None :
1802+ """Test that only labels starting with approved prefix are matched."""
1803+ approver = "approver1"
1804+ with (
1805+ patch .object (
1806+ pull_request_handler .owners_file_handler ,
1807+ "owners_data_for_changed_files" ,
1808+ _owners_data_coroutine ({"repo/OWNERS" : {"approvers" : [approver ]}}),
1809+ ),
1810+ patch .object (pull_request_handler .github_webhook , "minimum_lgtm" , 0 ),
1811+ patch .object (pull_request_handler .owners_file_handler , "all_pull_request_approvers" , [approver ]),
1812+ patch .object (pull_request_handler .owners_file_handler , "root_approvers" , []),
1813+ patch .object (pull_request_handler .owners_file_handler , "root_reviewers" , []),
1814+ patch .object (pull_request_handler .owners_file_handler , "all_pull_request_reviewers" , []),
1815+ ):
1816+ result = await pull_request_handler ._check_if_pr_approved (labels = [f"{ APPROVED_BY_LABEL_PREFIX } { approver } " ])
1817+ assert result == ""
1818+
1819+ result = await pull_request_handler ._check_if_pr_approved (
1820+ labels = [f"not-{ APPROVED_BY_LABEL_PREFIX } { approver } " ]
1821+ )
1822+ assert "Missing approved from approvers" in result
1823+
1824+ def test_check_labels_for_can_be_merged_changes_requested_label_only_matches_prefix (
1825+ self , pull_request_handler : PullRequestHandler
1826+ ) -> None :
1827+ """Test that only labels starting with changes-requested prefix are matched."""
1828+ approver = "reviewer1"
1829+ with patch .object (pull_request_handler .owners_file_handler , "all_pull_request_approvers" , [approver ]):
1830+ # Valid changes-requested label should trigger the check
1831+ result = pull_request_handler ._check_labels_for_can_be_merged (
1832+ labels = [f"{ CHANGED_REQUESTED_BY_LABEL_PREFIX } { approver } " ]
1833+ )
1834+ assert "PR has changed requests from approvers" in result
1835+
1836+ # Label containing prefix in the middle should NOT trigger
1837+ result = pull_request_handler ._check_labels_for_can_be_merged (
1838+ labels = [f"not-{ CHANGED_REQUESTED_BY_LABEL_PREFIX } { approver } " ]
1839+ )
1840+ assert result == ""
1841+
17131842 @pytest .mark .asyncio
17141843 async def test_skip_if_pull_request_already_merged_merged (
17151844 self , pull_request_handler : PullRequestHandler , mock_pull_request : Mock
0 commit comments