def test_should_raise_exception_when_no_matching_base_branch_is_found( self): client = GitHubClient('', '') mock_repos = [[ Repository('', 'RepoA', 'WRITE', Ref('', '', 'release', '')), ], []] client.get_repositories = Mock(side_effect=mock_repos) with self.assertRaises(Exception): auto_merge('master', 'release', '', client)
def test_should_only_merge_repos_with_matching_base_and_head(self): client = GitHubClient('', '') mock_repos = [[ Repository('', 'RepoA', 'WRITE', Ref('', '', 'release', '')), Repository('', 'RepoB', 'WRITE', Ref('', '', 'release', '')), Repository('', 'RepoC', 'WRITE', Ref('', '', 'release', '')), Repository('', 'RepoD', 'WRITE', None) ], [ Repository('', 'RepoA', 'WRITE', Ref('', '', 'master', '')), Repository('', 'RepoB', 'WRITE', Ref('', '', 'master', '')), Repository('', 'RepoC', 'WRITE', Ref('', '', 'master', '')), Repository('', 'RepoD', 'WRITE', Ref('', '', 'master', '')), ]] mock_merge_response = MergeResponse( '', 'https://github.com/org/repo/commits/#hash', 'merged') expected_merged_repos = 3 client.get_repositories = Mock(side_effect=mock_repos) client.merge_branch = Mock(return_value=mock_merge_response) results = auto_merge('master', 'release', '', client) (succeeded, unprocessed, failed) = results[0] self.assertEqual(client.merge_branch.call_count, expected_merged_repos) self.assertEqual(len(succeeded), expected_merged_repos) self.assertEqual(len(unprocessed), 0) self.assertEqual(len(failed), 0)
def test_should_merge_eligible_repos_base_branch_with_release_branch(self): client = GitHubClient('', '') mock_repos = [[ Repository('', 'RepoA', 'WRITE', Ref('', '', 'release', '')), Repository('', 'RepoB', 'WRITE', Ref('', '', 'release', '')), Repository('', 'RepoC', 'READ', Ref('', '', 'release', '')), Repository('', 'RepoD', 'WRITE', None) ], [ Repository('', 'RepoA', 'WRITE', Ref('', '', 'master', '')), Repository('', 'RepoB', 'WRITE', Ref('', '', 'master', '')), Repository('', 'RepoC', 'READ', Ref('', '', 'master', '')), Repository('', 'RepoD', 'WRITE', Ref('', '', 'master', '')), ], [ Repository('', 'RepoA', 'WRITE', Ref('', '', 'current_release', '')), Repository('', 'RepoB', 'WRITE', Ref('', '', 'current_release', '')) ]] def mock_merge_branch(repo, base, head, message): if repo.permission != 'WRITE': raise GitHubError('UNPROCESSABLE', 'Failed to merge: \"Already merged\"') return MergeResponse('', 'https://github.com/org/repo/commits/#hash', 'merged') expected_succeeded_repos = 2 expected_unprocessed_repos = 1 expected_curr_release_succeeded_repos = 2 client.get_repositories = Mock(side_effect=mock_repos) client.merge_branch = Mock(side_effect=mock_merge_branch) results = auto_merge('master', 'release', 'current_release', client) # assert the first merge from head to base (succeeded, unprocessed, failed) = results[0] self.assertEqual(len(succeeded), expected_succeeded_repos) self.assertEqual(len(unprocessed), expected_unprocessed_repos) self.assertEqual(len(failed), 0) # assert the second merge from base to current release (succeeded, unprocessed, failed) = results[1] self.assertEqual(len(succeeded), expected_curr_release_succeeded_repos) self.assertEqual(len(unprocessed), 0) self.assertEqual(len(failed), 0)
def test_should_fail_repos_with_invalid_permissions(self): client = GitHubClient('', '') mock_repos = [[ Repository('', 'RepoB', 'READ', Ref('', '', 'release', '')) ], [Repository('', 'RepoB', 'READ', Ref('', '', 'master', ''))]] expected_failed_repos = 1 client.get_repositories = Mock(side_effect=mock_repos) results = auto_merge('master', 'release', '', client) (succeeded, unprocessed, failed) = results[0] self.assertEqual(len(succeeded), 0) self.assertEqual(len(unprocessed), 0) self.assertEqual(len(failed), expected_failed_repos)
def test_should_not_fail_when_branches_are_already_merged(self): client = GitHubClient('', '') mock_repos = [[ Repository('', 'RepoA', 'WRITE', Ref('', '', 'release', '')), Repository('', 'RepoB', 'WRITE', Ref('', '', 'release', '')), ], [ Repository('', 'RepoA', 'WRITE', Ref('', '', 'master', '')), Repository('', 'RepoB', 'WRITE', Ref('', '', 'master', '')), ]] count = 0 def mock_merge_branch(repo, base, head, message): nonlocal count if count > 0: raise GitHubError('UNPROCESSABLE', 'Failed to merge: \"Already merged\"') count = count + 1 return MergeResponse('', 'https://github.com/org/repo/commits/#hash', 'merged') expected_merged_repos = 2 expected_succeeded_repos = 1 expected_unprocessed_repos = 1 client.get_repositories = Mock(side_effect=mock_repos) client.merge_branch = Mock(side_effect=mock_merge_branch) results = auto_merge('master', 'release', '', client) (succeeded, unprocessed, failed) = results[0] self.assertEqual(client.merge_branch.call_count, expected_merged_repos) self.assertEqual(len(succeeded), expected_succeeded_repos) self.assertEqual(len(unprocessed), expected_unprocessed_repos) self.assertEqual(len(failed), 0)
help= "Optionally tell the script where to find the config file. By default it searches in the base directory" ) args = parser.parse_args() head_branch = args.head_branch base_branch = args.base_branch current_rel_branch = args.current_rel_branch if args.current_rel_branch else '' config = configparser.ConfigParser() if args.config_path: config.read(args.config_path) else: config.read('config.ini') access_token = config['DEFAULT']['access_token'] organization = config['DEFAULT']['organization'] if args.token: access_token = args.token if args.org: organization = args.org logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO) auto_merge(base_branch, head_branch, current_rel_branch, GitHubClient(access_token, organization))
def test_should_raise_exception_when_no_head_branch_is_found(self): client = GitHubClient('', '') client.get_repositories = Mock(return_value=[]) with self.assertRaises(Exception): auto_merge('master', 'rel', '', client)