def test__mixed_config(self, gitlab): gf = GitLabForm(config_string=mixed_config, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() branch = gitlab.get_branch(GROUP_AND_PROJECT_NAME, "protect_branch_and_allow_merges") assert branch["protected"] is True assert branch["developers_can_push"] is False assert branch["developers_can_merge"] is True branch = gitlab.get_branch(GROUP_AND_PROJECT_NAME, "protect_branch_and_allow_pushes") assert branch["protected"] is True assert branch["developers_can_push"] is True assert branch["developers_can_merge"] is False gf = GitLabForm(config_string=unprotect_branches, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() branch = gitlab.get_branch(GROUP_AND_PROJECT_NAME, "protect_branch_and_allow_merges") assert branch["protected"] is False branch = gitlab.get_branch(GROUP_AND_PROJECT_NAME, "protect_branch_and_allow_pushes") assert branch["protected"] is False
def test__removing_preexisting_approvals(self, gitlab): # add some preexisting approval rules gitlab.create_approval_rule( GROUP_AND_PROJECT_NAME, "additional approval rule", 1, ["merge_requests_user2"], [GROUP_WITH_USER4], ) gf = GitLabForm( config_string=config__approvers_removing_preexisting_approvals, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() rules = gitlab.get_approvals_rules(GROUP_AND_PROJECT_NAME) assert len(rules) == 1 rule = rules[0] assert len(rule["users"]) == 1 usernames_in_rule = set([user["username"] for user in rule["users"]]) assert usernames_in_rule == {"merge_requests_user1"} assert len(rule["groups"]) == 1 groupnames_in_rule = set([group["name"] for group in rule["groups"]]) assert groupnames_in_rule == { "gitlabform_tests_group_with_user3", }
def test__single_secret_variable(self, gitlab): gf = GitLabForm(config_string=config_single_secret_variable, project_or_group=GROUP_NAME) gf.main() secret_variables = gitlab.get_group_secret_variables(GROUP_NAME) assert len(secret_variables) == 1
def test__if_push_events_change_works(self, gitlab: GitLab): gf = GitLabForm( config_string=config_service_push_events_true, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() services = [] for service_name in ["asana", "hipchat", "redmine"]: service = gitlab.get_service(GROUP_AND_PROJECT_NAME, service_name) services.append(service) assert all([service["active"] for service in services]) is True assert all([service["push_events"] for service in services]) is True gf = GitLabForm( config_string=config_service_push_events_false, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() services = [] for service_name in ["asana", "hipchat", "redmine"]: service = gitlab.get_service(GROUP_AND_PROJECT_NAME, service_name) services.append(service) assert all([service["active"] for service in services]) is True assert all([service["push_events"] for service in services]) is False
def test__set_schedule_variables(self, gitlab): gf = GitLabForm( config_string=add_schedule_with_variables, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() schedule = self.__find_pipeline_schedule_by_description_and_get_first( gitlab, "New schedule with variables") assert schedule is not None assert schedule["description"] == "New schedule with variables" assert schedule["ref"] == "master" assert schedule["cron"] == "30 1 * * *" assert schedule["cron_timezone"] == "UTC" assert schedule["active"] is True assert schedule["variables"] is not None assert len(schedule["variables"]) == 2 assert schedule["variables"][0]["variable_type"] == "env_var" assert schedule["variables"][0]["key"] == "var1" assert schedule["variables"][0]["value"] == "value123" assert schedule["variables"][1]["variable_type"] == "file" assert schedule["variables"][1]["key"] == "var2" assert schedule["variables"][1]["value"] == "value987"
def test__if_change_works__single_user_and_single_group_change( self, gitlab): gf = GitLabForm( config_string=config__approvers_single_user_and_single_group, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() rules = gitlab.get_approvals_rules(GROUP_AND_PROJECT_NAME) assert len(rules) == 1 assert len(rules[0]['users']) == 1 assert rules[0]['users'][0]['username'] == 'merge_requests_user1' assert len(rules[0]['groups']) == 1 assert rules[0]['groups'][0][ 'name'] == 'gitlabform_tests_group_with_user4' gf = GitLabForm( config_string=config__approvers_single_user_and_single_group_change, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() rules = gitlab.get_approvals_rules(GROUP_AND_PROJECT_NAME) assert len(rules) == 1 assert len(rules[0]['users']) == 1 assert rules[0]['users'][0]['username'] == 'merge_requests_user2' assert len(rules[0]['groups']) == 1 assert rules[0]['groups'][0][ 'name'] == 'gitlabform_tests_group_with_user1_and_user2'
def test__if_change_works__single_user_and_single_group_change(self, gitlab): gf = GitLabForm( config_string=config__approvers_single_user_and_single_group, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() rules = gitlab.get_approvals_rules(GROUP_AND_PROJECT_NAME) assert len(rules) == 1 assert len(rules[0]["users"]) == 1 assert rules[0]["users"][0]["username"] == "merge_requests_user1" assert len(rules[0]["groups"]) == 1 assert rules[0]["groups"][0]["name"] == "gitlabform_tests_group_with_user4" gf = GitLabForm( config_string=config__approvers_single_user_and_single_group_change, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() rules = gitlab.get_approvals_rules(GROUP_AND_PROJECT_NAME) assert len(rules) == 1 assert len(rules[0]["users"]) == 1 assert rules[0]["users"][0]["username"] == "merge_requests_user2" assert len(rules[0]["groups"]) == 1 assert ( rules[0]["groups"][0]["name"] == "gitlabform_tests_group_with_user1_and_user2" )
def test__more_than_one_user_and_more_than_one_group(self, gitlab): gf = GitLabForm( config_string=config__approvers_more_than_one_user_and_more_than_one_group, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() rules = gitlab.get_approvals_rules(GROUP_AND_PROJECT_NAME) assert len(rules) == 1 rule = rules[0] assert len(rule["users"]) == 2 usernames_in_rule = set([user["username"] for user in rule["users"]]) assert usernames_in_rule == {"merge_requests_user1", "merge_requests_user2"} assert len(rule["groups"]) == 2 groupnames_in_rule = set([group["name"] for group in rule["groups"]]) assert groupnames_in_rule == { "gitlabform_tests_group_with_user3", "gitlabform_tests_group_with_user4", } print(str(rule["eligible_approvers"])) assert len(rule["eligible_approvers"]) == 4 eligibleapprovers_in_rule = set( [user["username"] for user in rule["eligible_approvers"]] ) assert eligibleapprovers_in_rule == { "merge_requests_user1", "merge_requests_user2", "merge_requests_user3", "merge_requests_user4", }
def test__more_than_one_user_and_more_than_one_group(self, gitlab): gf = GitLabForm( config_string= config__approvers_more_than_one_user_and_more_than_one_group, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() rules = gitlab.get_approvals_rules(GROUP_AND_PROJECT_NAME) assert len(rules) == 1 rule = rules[0] assert len(rule['users']) == 2 usernames_in_rule = set([user['username'] for user in rule['users']]) assert usernames_in_rule == { 'merge_requests_user1', 'merge_requests_user2' } assert len(rule['groups']) == 2 groupnames_in_rule = set([group['name'] for group in rule['groups']]) assert groupnames_in_rule == { 'gitlabform_tests_group_with_user3', 'gitlabform_tests_group_with_user4' } print(str(rule['eligible_approvers'])) assert len(rule['eligible_approvers']) == 4 eligibleapprovers_in_rule = set( [user['username'] for user in rule['eligible_approvers']]) assert eligibleapprovers_in_rule == { 'merge_requests_user1', 'merge_requests_user2', 'merge_requests_user3', 'merge_requests_user4' }
def test__set_file_protected_branches(self, gitlab): gf = GitLabForm( config_string=set_file_protected_branches, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() # main branch is protected by default for branch in [ "main", "protected_branch1", "protected_branch2", "protected_branch3", ]: file_content = gitlab.get_file(GROUP_AND_PROJECT_NAME, branch, "README.md") assert file_content == "Content for protected branches only" for branch in ["regular_branch1", "regular_branch2"]: file_content = gitlab.get_file(GROUP_AND_PROJECT_NAME, branch, "README.md") assert not file_content == "Content for protected branches only" branch = gitlab.get_branch_access_levels(GROUP_AND_PROJECT_NAME, "protected_branch3") assert branch["push_access_levels"][0]["access_level"] is 30 assert branch["merge_access_levels"][0]["access_level"] is 30 assert branch["unprotect_access_levels"][0]["access_level"] is 40
def test__if_jira_commit_events_false_works(self, gitlab: GitLab): gf = GitLabForm(config_string=config_service_jira_commit_events_false, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() service = gitlab.get_service(GROUP_AND_PROJECT_NAME, 'jira') assert service['active'] is True assert service['commit_events'] is False
def test__mattermost_confidential_issues_events(self, gitlab: GitLab): gf = GitLabForm( config_string=config_service_mattermost_confidential_issues_events, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() service = gitlab.get_service(GROUP_AND_PROJECT_NAME, 'mattermost') assert service['confidential_issues_events'] is False
def test__protected_secret_variables(self, gitlab): gf = GitLabForm(config_string=config_protected_secret_variables, project_or_group=GROUP_NAME) gf.main() secret_variable = gitlab.get_group_secret_variable_object( GROUP_NAME, "FOO") assert secret_variable["value"] == "123" assert secret_variable["protected"]
def test__builds_for_private_projects(self, gitlab): gf = GitLabForm( config_string=config_builds_for_private_projects, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() settings = gitlab.get_project_settings(GROUP_AND_PROJECT_NAME) assert settings["visibility"] == "private"
def test__archive_project(self, gitlab): gf = GitLabForm( config_string=archive_project, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() project = gitlab.get_project(GROUP_AND_PROJECT_NAME) assert project["archived"] is True
def setup_some_users(gitlab): gf = GitLabForm(config_string=some_users, project_or_group=GROUP_NAME) gf.main() members = gitlab.get_group_members(GROUP_NAME) assert len(members) == 3 members_usernames = [member['username'] for member in members] assert members_usernames.count('root') == 1 assert members_usernames.count('group_member_user2') == 1 assert members_usernames.count('group_member_user3') == 1
def test__delete_schedule(self, gitlab): gf = GitLabForm( config_string=delete_schedule, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() schedule = self.__find_pipeline_schedule_by_description_and_get_first( gitlab, "Redundant schedule") assert schedule is None
def test__if_it_works__single_user(self, gitlab): gf = GitLabForm(config_string=config__approvers_single_user, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() rules = gitlab.get_approvals_rules(GROUP_AND_PROJECT_NAME) assert len(rules) == 1 assert len(rules[0]['users']) == 1 assert rules[0]['users'][0]['username'] == 'merge_requests_user1' assert len(rules[0]['groups']) == 0
def test__if_jira_commit_events_true_works(self, gitlab: GitLab): gf = GitLabForm( config_string=config_service_jira_commit_events_true, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() service = gitlab.get_service(GROUP_AND_PROJECT_NAME, "jira") assert service["active"] is True assert service["commit_events"] is True
def test__protect_branch_and_disallow_all(self, gitlab): gf = GitLabForm(config_string=protect_branch_and_disallow_all, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() branch = gitlab.get_branch(GROUP_AND_PROJECT_NAME, 'protect_branch_and_disallow_all') assert branch['protected'] is True assert branch['developers_can_push'] is False assert branch['developers_can_merge'] is False
def test__builds_disabled(self, gitlab): gf = GitLabForm( config_string=config_builds_not_enabled, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() with pytest.raises(UnexpectedResponseException): # secret variables will NOT be available without builds_access_level in ['private', 'enabled'] gitlab.get_secret_variables(GROUP_AND_PROJECT_NAME)
def test__more_secret_variables(self, gitlab): gf = GitLabForm(config_string=config_more_secret_variables, project_or_group=GROUP_NAME) gf.main() secret_variables = gitlab.get_group_secret_variables(GROUP_NAME) secret_variables_keys = set( [secret["key"] for secret in secret_variables]) assert len(secret_variables) == 2 assert secret_variables_keys == {"FOO", "BAR"}
def test__if_change_works__only_groups(self, gitlab): gf = GitLabForm(config_string=config__approvers_only_groups, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() approvers = gitlab.get_approvers(GROUP_AND_PROJECT_NAME) assert len(approvers['approver_groups']) == 1 gf = GitLabForm(config_string=config__approvers_only_groups_change, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() approvers = gitlab.get_approvers(GROUP_AND_PROJECT_NAME) assert len(approvers['approver_groups']) == 2
def test__remove_users(self, gitlab): Helpers.setup_some_users(gitlab) gf = GitLabForm(config_string=remove_users, project_or_group=GROUP_NAME) gf.main() members = gitlab.get_group_members(GROUP_NAME) assert len(members) == 2 members_usernames = [member['username'] for member in members] assert members_usernames.count('group_member_user1') == 1 assert members_usernames.count('group_member_user3') == 1
def test__if_push_events_false_works(self, gitlab: GitLab): gf = GitLabForm(config_string=config_service_push_events_false, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() services = [] for service_name in ['asana', 'hipchat', 'redmine']: service = gitlab.get_service(GROUP_AND_PROJECT_NAME, service_name) services.append(service) assert all([service['active'] for service in services]) is True assert all([service['push_events'] for service in services]) is False
def test__protect_branch_but_allow_all(self, gitlab): gf = GitLabForm( config_string=protect_branch_but_allow_all, project_or_group=GROUP_AND_PROJECT_NAME, ) gf.main() branch = gitlab.get_branch(GROUP_AND_PROJECT_NAME, "protect_branch_but_allow_all") assert branch["protected"] is True assert branch["developers_can_push"] is True assert branch["developers_can_merge"] is True
def test__set_file_all_branches(self, gitlab): gf = GitLabForm(config_string=set_file_all_branches, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() for branch in [ 'master', 'protected_branch1', 'protected_branch2', 'regular_branch1', 'regular_branch2' ]: file_content = gitlab.get_file(GROUP_AND_PROJECT_NAME, branch, 'README.md') assert file_content == 'Content for all branches'
def run_gitlabform(config, group_and_project): # f-strings with """ used as configs have the disadvantage of having indentation in them - let's remove it here config = textwrap.dedent(config) # we don't want to repeat ourselves in the tests, so prefix the configs with this mandatory part here config = CONFIG + config gf = GitLabForm( config_string=config, project_or_group=group_and_project, ) gf.main()
def test__not_remove_users_without_enforce(self, gitlab): Helpers.setup_some_users(gitlab) gf = GitLabForm(config_string=not_remove_users_without_enforce, project_or_group=GROUP_NAME) gf.main() members = gitlab.get_group_members(GROUP_NAME) assert len(members) == 3 members_usernames = [member['username'] for member in members] assert members_usernames.count('root') == 1 assert members_usernames.count('group_member_user2') == 1 assert members_usernames.count('group_member_user3') == 1
def test__set_file_specific_branch(self, gitlab): gf = GitLabForm(config_string=set_file_specific_branch, project_or_group=GROUP_AND_PROJECT_NAME) gf.main() file_content = gitlab.get_file(GROUP_AND_PROJECT_NAME, 'master', 'README.md') assert file_content == 'Content for master only' other_branch_file_content = gitlab.get_file(GROUP_AND_PROJECT_NAME, 'protected_branch1', 'README.md') assert other_branch_file_content == 'Hello World!'