33import shutil
44import tempfile
55import unittest
6- from unittest .mock import MagicMock , patch
6+ from unittest .mock import MagicMock , call , patch
77
88from tools .private .release import changelog_news , release as releaser , utils
99from tools .private .release .gh import MultipleTrackingIssuesError , NoTrackingIssueError
@@ -19,11 +19,13 @@ def _mock_git_and_gh(test_case):
1919 patch ("tools.private.release.release.git" , new = mock_git ).start ()
2020 patch ("tools.private.release.prepare.git" , new = mock_git ).start ()
2121 patch ("tools.private.release.create_release_branch.git" , new = mock_git ).start ()
22+ patch ("tools.private.release.create_rc.git" , new = mock_git ).start ()
2223 patch ("tools.private.release.utils.git" , new = mock_git ).start ()
2324
2425 patch ("tools.private.release.release.gh" , new = mock_gh ).start ()
2526 patch ("tools.private.release.prepare.gh" , new = mock_gh ).start ()
2627 patch ("tools.private.release.create_release_branch.gh" , new = mock_gh ).start ()
28+ patch ("tools.private.release.create_rc.gh" , new = mock_gh ).start ()
2729 mock_gh .MultipleTrackingIssuesError = MultipleTrackingIssuesError
2830 mock_gh .NoTrackingIssueError = NoTrackingIssueError
2931
@@ -932,7 +934,7 @@ def setUp(self):
932934
933935 def test_create_rc_success_first_rc (self ):
934936 # Arrange
935- args = MagicMock (issue = 123 )
937+ args = MagicMock (issue = 123 , remote = "my-remote" )
936938 self .mock_gh .get_issue_title .return_value = "Release 2.0.0"
937939 self .mock_gh .get_issue_body .return_value = """
938940## Checklist
@@ -949,8 +951,12 @@ def test_create_rc_success_first_rc(self):
949951
950952 # Assert
951953 self .assertEqual (result , 0 )
954+ self .mock_git .fetch .assert_has_calls (
955+ [call ("my-remote" ), call ("my-remote" , tags = True , force = True )]
956+ )
957+ self .mock_git .checkout .assert_called_once_with ("my-remote/release/2.0" )
952958 self .mock_git .tag .assert_called_once_with ("2.0.0-rc0" , "HEAD" )
953- self .mock_git .push .assert_called_once_with ("origin " , "2.0.0-rc0" )
959+ self .mock_git .push .assert_called_once_with ("my-remote " , "2.0.0-rc0" )
954960
955961 self .mock_gh .update_issue_body .assert_called_once ()
956962 call_args = self .mock_gh .update_issue_body .call_args [0 ]
@@ -959,10 +965,21 @@ def test_create_rc_success_first_rc(self):
959965 self .assertIn ("commit=12345678" , call_args [1 ])
960966
961967 self .mock_gh .post_issue_comment .assert_called_once ()
968+ comment_call_args = self .mock_gh .post_issue_comment .call_args [0 ]
969+ self .assertEqual (comment_call_args [0 ], 123 )
970+ self .assertIn (
971+ "**New Release Candidate Tagged!** 🐍🌿" ,
972+ comment_call_args [1 ],
973+ )
974+ self .assertIn (
975+ "- Trigger Release Workflow: [Release Workflow](https://github.com/bazel-contrib/rules_python/actions/workflows/release.yml)" ,
976+ comment_call_args [1 ],
977+ )
978+ self .assertNotIn ("🚀" , comment_call_args [1 ])
962979
963980 def test_create_rc_success_next_rc (self ):
964981 # Arrange
965- args = MagicMock (issue = 123 )
982+ args = MagicMock (issue = 123 , remote = "my-remote" )
966983 self .mock_gh .get_issue_title .return_value = "Release 2.0.0"
967984 self .mock_gh .get_issue_body .return_value = """
968985## Checklist
@@ -980,15 +997,30 @@ def test_create_rc_success_next_rc(self):
980997
981998 # Assert
982999 self .assertEqual (result , 0 )
1000+ self .mock_git .fetch .assert_has_calls (
1001+ [call ("my-remote" ), call ("my-remote" , tags = True , force = True )]
1002+ )
1003+ self .mock_git .checkout .assert_called_once_with ("my-remote/release/2.0" )
9831004 self .mock_git .tag .assert_called_once_with ("2.0.0-rc1" , "HEAD" )
984- self .mock_git .push .assert_called_once_with ("origin " , "2.0.0-rc1" )
1005+ self .mock_git .push .assert_called_once_with ("my-remote " , "2.0.0-rc1" )
9851006
9861007 self .mock_gh .update_issue_body .assert_called_once ()
9871008 call_args = self .mock_gh .update_issue_body .call_args [0 ]
9881009 self .assertEqual (call_args [0 ], 123 )
9891010 self .assertIn ("tag=2.0.0-rc1" , call_args [1 ])
9901011
9911012 self .mock_gh .post_issue_comment .assert_called_once ()
1013+ comment_call_args = self .mock_gh .post_issue_comment .call_args [0 ]
1014+ self .assertEqual (comment_call_args [0 ], 123 )
1015+ self .assertIn (
1016+ "**New Release Candidate Tagged!** 🐍🌿" ,
1017+ comment_call_args [1 ],
1018+ )
1019+ self .assertIn (
1020+ "- Trigger Release Workflow: [Release Workflow](https://github.com/bazel-contrib/rules_python/actions/workflows/release.yml)" ,
1021+ comment_call_args [1 ],
1022+ )
1023+ self .assertNotIn ("🚀" , comment_call_args [1 ])
9921024
9931025 def test_create_rc_already_tagged (self ):
9941026 # Arrange
@@ -1234,6 +1266,7 @@ def test_create_release_branch_success(self):
12341266- [ ] Create Release branch | status=pending
12351267"""
12361268 self .mock_git .branch_exists .return_value = False
1269+ self .mock_git .remote_branch_exists .return_value = False
12371270
12381271 # Act
12391272 result = releaser .cmd_create_release_branch (args )
@@ -1291,6 +1324,73 @@ def test_create_release_branch_already_checked(self):
12911324 self .mock_git .push .assert_not_called ()
12921325 self .mock_gh .update_issue_body .assert_not_called ()
12931326
1327+ def test_create_release_branch_already_exists_same_commit (self ):
1328+ # Arrange
1329+ args = MagicMock (issue = 123 , remote = "my-remote" )
1330+ self .mock_gh .get_issue_title .return_value = "Release 2.0.0"
1331+ self .mock_gh .get_issue_body .return_value = """
1332+ ## Checklist
1333+ - [x] Prepare Release | status=done pr=#122 commit=abcdef12
1334+ - [ ] Create Release branch | status=pending
1335+ """
1336+ self .mock_git .remote_branch_exists .return_value = True
1337+ self .mock_git .get_commit_sha .return_value = "abcdef12"
1338+
1339+ # Act
1340+ result = releaser .cmd_create_release_branch (args )
1341+
1342+ # Assert
1343+ self .assertEqual (result , 0 )
1344+ self .mock_git .fetch .assert_called_once_with ("my-remote" )
1345+ self .mock_git .push .assert_not_called ()
1346+ self .mock_gh .update_issue_body .assert_called_once () # Should still update checklist
1347+
1348+ def test_create_release_branch_already_exists_fast_forward (self ):
1349+ # Arrange
1350+ args = MagicMock (issue = 123 , remote = "my-remote" )
1351+ self .mock_gh .get_issue_title .return_value = "Release 2.0.0"
1352+ self .mock_gh .get_issue_body .return_value = """
1353+ ## Checklist
1354+ - [x] Prepare Release | status=done pr=#122 commit=abcdef12
1355+ - [ ] Create Release branch | status=pending
1356+ """
1357+ self .mock_git .remote_branch_exists .return_value = True
1358+ self .mock_git .get_commit_sha .return_value = "oldcommit"
1359+ self .mock_git .is_ancestor .return_value = True
1360+
1361+ # Act
1362+ result = releaser .cmd_create_release_branch (args )
1363+
1364+ # Assert
1365+ self .assertEqual (result , 0 )
1366+ self .mock_git .fetch .assert_called_once_with ("my-remote" )
1367+ self .mock_git .push .assert_called_once_with (
1368+ "my-remote" , "abcdef12:refs/heads/release/2.0"
1369+ )
1370+ self .mock_gh .update_issue_body .assert_called_once ()
1371+
1372+ def test_create_release_branch_already_exists_non_ff (self ):
1373+ # Arrange
1374+ args = MagicMock (issue = 123 , remote = "my-remote" )
1375+ self .mock_gh .get_issue_title .return_value = "Release 2.0.0"
1376+ self .mock_gh .get_issue_body .return_value = """
1377+ ## Checklist
1378+ - [x] Prepare Release | status=done pr=#122 commit=abcdef12
1379+ - [ ] Create Release branch | status=pending
1380+ """
1381+ self .mock_git .remote_branch_exists .return_value = True
1382+ self .mock_git .get_commit_sha .return_value = "othercommit"
1383+ self .mock_git .is_ancestor .return_value = False
1384+
1385+ # Act
1386+ result = releaser .cmd_create_release_branch (args )
1387+
1388+ # Assert
1389+ self .assertEqual (result , 1 )
1390+ self .mock_git .fetch .assert_called_once_with ("my-remote" )
1391+ self .mock_git .push .assert_not_called ()
1392+ self .mock_gh .update_issue_body .assert_not_called ()
1393+
12941394
12951395if __name__ == "__main__" :
12961396 unittest .main ()
0 commit comments