11import os
22import sys
3- from unittest .mock import Mock , patch
3+ from unittest .mock import MagicMock , Mock , patch
44
55# Add the parent directory to path for importing bot modules
66sys .path .insert (0 , os .path .dirname (os .path .dirname (os .path .abspath (__file__ ))))
@@ -516,6 +516,7 @@ def test_opened(self, bot_env):
516516 )
517517 mock_issue = _make_issue_with_assignment ("testuser" )
518518 bot_env ["repo" ].get_issue .return_value = mock_issue
519+ bot .validate_pr_issues = MagicMock (return_value = True )
519520 assert bot .handle_pull_request ()
520521 mock_issue .add_to_assignees .assert_called_once_with ("testuser" )
521522
@@ -533,8 +534,27 @@ def test_reopened(self, bot_env):
533534 )
534535 mock_issue = _make_issue_with_assignment ("testuser" )
535536 bot_env ["repo" ].get_issue .return_value = mock_issue
537+ bot .validate_pr_issues = MagicMock (return_value = True )
536538 assert bot .handle_pull_request ()
537539
540+ def test_skips_auto_assign_if_invalid (self , bot_env ):
541+ bot = IssueAssignmentBot ()
542+ bot .load_event_payload (
543+ {
544+ "action" : "opened" ,
545+ "pull_request" : {
546+ "number" : 100 ,
547+ "user" : {"login" : "testuser" },
548+ "body" : "Fixes #123" ,
549+ },
550+ }
551+ )
552+ mock_issue = _make_issue_with_assignment ("testuser" )
553+ bot_env ["repo" ].get_issue .return_value = mock_issue
554+ bot .validate_pr_issues = MagicMock (return_value = False )
555+ assert bot .handle_pull_request ()
556+ mock_issue .add_to_assignees .assert_not_called ()
557+
538558 def test_closed (self , bot_env ):
539559 bot = IssueAssignmentBot ()
540560 bot .load_event_payload (
@@ -1037,11 +1057,9 @@ def test_validate_pr_issues_is_pr(self, bot_env):
10371057 mock_pr .user .login = "external-contributor"
10381058 mock_pr .author_association = "NONE"
10391059 mock_pr .body = "Fixes #12"
1040-
10411060 mock_issue = Mock ()
10421061 mock_issue .pull_request = {"url" : "..." }
10431062 bot_env ["repo" ].get_issue .return_value = mock_issue
1044-
10451063 assert not bot .validate_pr_issues (mock_pr )
10461064
10471065 def test_validate_pr_issues_closed (self , bot_env ):
@@ -1050,12 +1068,10 @@ def test_validate_pr_issues_closed(self, bot_env):
10501068 mock_pr .user .login = "external-contributor"
10511069 mock_pr .author_association = "NONE"
10521070 mock_pr .body = "Fixes #12"
1053-
10541071 mock_issue = Mock ()
10551072 mock_issue .pull_request = None
10561073 mock_issue .state = "closed"
10571074 bot_env ["repo" ].get_issue .return_value = mock_issue
1058-
10591075 assert not bot .validate_pr_issues (mock_pr )
10601076
10611077 def test_validate_pr_issues_invalid_labels (self , bot_env ):
@@ -1064,21 +1080,18 @@ def test_validate_pr_issues_invalid_labels(self, bot_env):
10641080 mock_pr .user .login = "external-contributor"
10651081 mock_pr .author_association = "NONE"
10661082 mock_pr .body = "Fixes #12"
1067-
10681083 # Test case 1: No labels
10691084 mock_issue = Mock ()
10701085 mock_issue .pull_request = None
10711086 mock_issue .state = "open"
10721087 mock_issue .labels = []
10731088 bot_env ["repo" ].get_issue .return_value = mock_issue
10741089 assert not bot .validate_pr_issues (mock_pr )
1075-
10761090 # Test case 2: Has wontfix/invalid labels
10771091 label_wontfix = Mock ()
10781092 label_wontfix .name = "wontfix"
10791093 mock_issue .labels = [label_wontfix ]
10801094 assert not bot .validate_pr_issues (mock_pr )
1081-
10821095 # Test case 3: Has a mix of valid and invalid/wontfix labels
10831096 label_bug = Mock ()
10841097 label_bug .name = "bug"
@@ -1091,15 +1104,13 @@ def test_validate_pr_issues_not_in_project(self, bot_env):
10911104 mock_pr .user .login = "external-contributor"
10921105 mock_pr .author_association = "NONE"
10931106 mock_pr .body = "Fixes #12"
1094-
10951107 label_bug = Mock ()
10961108 label_bug .name = "bug"
10971109 mock_issue = Mock ()
10981110 mock_issue .pull_request = None
10991111 mock_issue .state = "open"
11001112 mock_issue .labels = [label_bug ]
11011113 bot_env ["repo" ].get_issue .return_value = mock_issue
1102-
11031114 with patch .object (
11041115 bot , "get_issue_projects" , return_value = ["Some Other Project" ]
11051116 ):
@@ -1111,15 +1122,13 @@ def test_validate_pr_issues_fully_valid(self, bot_env):
11111122 mock_pr .user .login = "external-contributor"
11121123 mock_pr .author_association = "NONE"
11131124 mock_pr .body = "Fixes #12"
1114-
11151125 label_bug = Mock ()
11161126 label_bug .name = "bug"
11171127 mock_issue = Mock ()
11181128 mock_issue .pull_request = None
11191129 mock_issue .state = "open"
11201130 mock_issue .labels = [label_bug ]
11211131 bot_env ["repo" ].get_issue .return_value = mock_issue
1122-
11231132 with patch .object (
11241133 bot , "get_issue_projects" , return_value = ["OpenWISP Contributor's Board" ]
11251134 ):
@@ -1138,11 +1147,9 @@ def test_handle_pull_request_invalid_label_and_comment(self, bot_env):
11381147 },
11391148 }
11401149 )
1141-
11421150 mock_pr_obj = Mock ()
11431151 mock_pr_obj .labels = []
11441152 bot_env ["repo" ].get_pull .return_value = mock_pr_obj
1145-
11461153 with patch .object (bot , "validate_pr_issues" , return_value = False ), patch .object (
11471154 bot , "has_bot_comment" , return_value = False
11481155 ):
@@ -1167,13 +1174,11 @@ def test_handle_pull_request_valid_removes_label(self, bot_env):
11671174 },
11681175 }
11691176 )
1170-
11711177 mock_label = Mock ()
11721178 mock_label .name = "invalid"
11731179 mock_pr_obj = Mock ()
11741180 mock_pr_obj .labels = [mock_label ]
11751181 bot_env ["repo" ].get_pull .return_value = mock_pr_obj
1176-
11771182 with patch .object (bot , "validate_pr_issues" , return_value = True ):
11781183 assert bot .handle_pull_request ()
11791184 mock_pr_obj .remove_from_labels .assert_called_once_with ("invalid" )
0 commit comments