From 2ff684ae227c9c2d94d1b6b286a27f6b318b3914 Mon Sep 17 00:00:00 2001
From: "Vitaliy @blackst0ne Klachkov" <blackst0ne.ru@gmail.com>
Date: Fri, 22 Dec 2017 14:56:09 +1100
Subject: [PATCH] Replace '.team << [user, role]' with 'add_role(user)' in
 specs

---
 app/models/project.rb                         |  2 +-
 app/models/project_team.rb                    | 28 +++++----------
 ...-user-role-with-add_role-user-in-specs.yml |  5 +++
 db/fixtures/development/06_teams.rb           |  2 +-
 features/steps/groups_management.rb           |  2 +-
 features/steps/profile/profile.rb             |  2 +-
 features/steps/project/deploy_keys.rb         |  4 +--
 .../steps/project/elastic/global_search.rb    |  2 +-
 .../steps/project/elastic/project_search.rb   |  2 +-
 features/steps/project/fork.rb                |  4 +--
 .../steps/project/forked_merge_requests.rb    |  2 +-
 features/steps/project/source/browse_files.rb |  2 +-
 .../steps/project/source/markdown_render.rb   |  2 +-
 features/steps/shared/group.rb                |  2 +-
 features/steps/shared/project.rb              | 21 ++++++-----
 .../admin/users_controller_spec.rb            |  2 +-
 .../boards/issues_controller_spec.rb          |  6 ++--
 .../boards/lists_controller_spec.rb           |  4 +--
 .../dashboard/milestones_controller_spec.rb   |  2 +-
 .../dashboard/todos_controller_spec.rb        |  2 +-
 spec/controllers/dashboard_controller_spec.rb |  2 +-
 .../groups/milestones_controller_spec.rb      |  2 +-
 .../notification_settings_controller_spec.rb  |  2 +-
 .../projects/avatars_controller_spec.rb       |  2 +-
 .../projects/blame_controller_spec.rb         |  2 +-
 .../projects/blob_controller_spec.rb          |  8 ++---
 .../projects/boards_controller_spec.rb        |  2 +-
 .../projects/branches_controller_spec.rb      |  4 +--
 .../projects/commits_controller_spec.rb       |  2 +-
 .../projects/compare_controller_spec.rb       |  2 +-
 .../cycle_analytics_controller_spec.rb        |  2 +-
 .../projects/deploy_keys_controller_spec.rb   |  4 +--
 .../projects/deployments_controller_spec.rb   |  2 +-
 .../projects/discussions_controller_spec.rb   |  4 +--
 .../projects/find_file_controller_spec.rb     |  2 +-
 .../projects/forks_controller_spec.rb         |  2 +-
 .../projects/graphs_controller_spec.rb        |  2 +-
 .../projects/group_links_controller_spec.rb   |  2 +-
 .../projects/hooks_controller_spec.rb         |  2 +-
 .../projects/imports_controller_spec.rb       |  4 +--
 .../projects/issues_controller_spec.rb        | 28 +++++++--------
 .../projects/jobs_controller_spec.rb          |  2 +-
 .../projects/labels_controller_spec.rb        |  2 +-
 .../projects/mattermosts_controller_spec.rb   |  2 +-
 .../creations_controller_spec.rb              |  4 +--
 .../merge_requests/diffs_controller_spec.rb   |  2 +-
 .../projects/milestones_controller_spec.rb    |  2 +-
 .../projects/notes_controller_spec.rb         | 14 ++++----
 .../project_members_controller_spec.rb        | 26 +++++++-------
 .../projects/refs_controller_spec.rb          |  2 +-
 .../projects/releases_controller_spec.rb      |  2 +-
 .../projects/repositories_controller_spec.rb  |  2 +-
 .../projects/services_controller_spec.rb      |  2 +-
 .../settings/ci_cd_controller_spec.rb         |  2 +-
 .../settings/integrations_controller_spec.rb  |  2 +-
 .../settings/slacks_controller_spec.rb        |  2 +-
 .../projects/templates_controller_spec.rb     |  2 +-
 .../projects/todos_controller_spec.rb         |  4 +--
 .../projects/tree_controller_spec.rb          |  2 +-
 .../projects/variables_controller_spec.rb     |  2 +-
 spec/controllers/projects_controller_spec.rb  |  8 ++---
 spec/controllers/uploads_controller_spec.rb   |  8 ++---
 spec/controllers/users_controller_spec.rb     |  4 +--
 .../projects/boards_controller_spec.rb        |  2 +-
 .../merge_requests_controller_spec.rb         |  2 +-
 .../boards/scoped_issue_board_spec.rb         |  2 +-
 spec/ee/spec/features/boards/sidebar_spec.rb  |  2 +-
 spec/ee/spec/features/issues/form_spec.rb     |  4 +--
 .../ee/repository_mirrors_settings_spec.rb    |  2 +-
 .../projects/settings/issues_settings_spec.rb |  2 +-
 .../settings/merge_requests_settings_spec.rb  |  2 +-
 .../settings/push_rules_settings_spec.rb      |  2 +-
 spec/ee/spec/features/variables_spec.rb       |  2 +-
 spec/ee/spec/requests/api/issues_spec.rb      |  2 +-
 .../services/ee/issues/build_service_spec.rb  |  2 +-
 .../issue_links/create_service_spec.rb        |  4 +--
 .../services/issue_links/list_service_spec.rb |  2 +-
 .../protected_tags/access_control_spec.rb     |  4 +--
 .../protected_branches_access_control.rb      |  4 +--
 .../elastic_integration/global_search_spec.rb |  6 ++--
 spec/features/admin/admin_projects_spec.rb    |  6 ++--
 spec/features/atom/dashboard_issues_spec.rb   |  4 +--
 spec/features/atom/dashboard_spec.rb          |  2 +-
 spec/features/atom/issues_spec.rb             |  2 +-
 spec/features/atom/users_spec.rb              |  2 +-
 spec/features/auto_deploy_spec.rb             |  4 +--
 spec/features/boards/add_issues_modal_spec.rb |  2 +-
 spec/features/boards/boards_spec.rb           |  6 ++--
 spec/features/boards/issue_ordering_spec.rb   |  2 +-
 spec/features/boards/modal_filter_spec.rb     |  6 ++--
 spec/features/boards/multiple_boards_spec.rb  |  4 +--
 spec/features/boards/new_issue_spec.rb        |  2 +-
 spec/features/commits_spec.rb                 |  8 ++---
 spec/features/cycle_analytics_spec.rb         |  2 +-
 .../dashboard/archived_projects_spec.rb       |  4 +--
 .../dashboard/datetime_on_tooltips_spec.rb    |  4 +--
 spec/features/dashboard/issues_spec.rb        |  2 +-
 spec/features/dashboard/milestones_spec.rb    |  2 +-
 .../project_member_activity_index_spec.rb     |  2 +-
 spec/features/dashboard/projects_spec.rb      |  2 +-
 .../dashboard/todos/todos_filtering_spec.rb   |  8 ++---
 .../dashboard/todos/todos_sorting_spec.rb     |  2 +-
 .../dashboard/user_filters_projects_spec.rb   |  4 +--
 spec/features/es_global_search_spec.rb        |  2 +-
 spec/features/es_group_search_spec.rb         |  2 +-
 spec/features/global_search_spec.rb           |  2 +-
 spec/features/issues/award_emoji_spec.rb      |  2 +-
 .../issues/bulk_assignment_labels_spec.rb     |  2 +-
 ...e_for_discussions_in_merge_request_spec.rb |  4 +--
 ...single_discussion_in_merge_request_spec.rb |  4 +--
 .../filtered_search/dropdown_assignee_spec.rb |  8 ++---
 .../filtered_search/dropdown_author_spec.rb   |  8 ++---
 .../filtered_search/dropdown_emoji_spec.rb    |  2 +-
 .../filtered_search/dropdown_hint_spec.rb     |  2 +-
 .../dropdown_milestone_spec.rb                |  2 +-
 .../filtered_search/dropdown_weight_spec.rb   |  2 +-
 .../filter_issues_weight_spec.rb              |  2 +-
 .../issues/filtered_search/search_bar_spec.rb |  2 +-
 spec/features/issues/form_spec.rb             |  4 +--
 spec/features/issues/gfm_autocomplete_spec.rb |  2 +-
 spec/features/issues/issue_sidebar_spec.rb    |  8 ++---
 spec/features/issues/move_spec.rb             | 10 +++---
 spec/features/issues/notes_on_issues_spec.rb  |  2 +-
 spec/features/issues/spam_issues_spec.rb      |  2 +-
 spec/features/issues/todo_spec.rb             |  2 +-
 spec/features/issues/update_issues_spec.rb    |  2 +-
 .../issues/user_uses_slash_commands_spec.rb   | 16 ++++-----
 spec/features/issues_spec.rb                  |  9 ++---
 .../merge_requests/assign_issues_spec.rb      |  2 +-
 ...geable_with_unresolved_discussions_spec.rb |  2 +-
 .../merge_requests/cherry_pick_spec.rb        |  2 +-
 .../merge_requests/closes_issues_spec.rb      |  4 +--
 .../features/merge_requests/conflicts_spec.rb |  4 +--
 .../merge_requests/create_new_mr_spec.rb      |  2 +-
 .../merge_requests/created_from_fork_spec.rb  |  2 +-
 .../deleted_source_branch_spec.rb             |  2 +-
 .../merge_requests/diff_notes_avatars_spec.rb |  2 +-
 .../merge_requests/diff_notes_resolve_spec.rb |  6 ++--
 spec/features/merge_requests/edit_mr_spec.rb  |  5 +--
 .../filter_by_milestone_spec.rb               |  2 +-
 spec/features/merge_requests/form_spec.rb     |  6 ++--
 .../merge_requests/image_diff_notes_spec.rb   |  2 +-
 .../merge_commit_message_toggle_spec.rb       |  2 +-
 .../merge_immediately_with_pipeline_spec.rb   |  2 +-
 .../merge_with_push_rules_spec.rb             |  2 +-
 ...only_allow_merge_if_build_succeeds_spec.rb |  2 +-
 .../features/merge_requests/pipelines_spec.rb |  2 +-
 .../merge_requests/reset_filters_spec.rb      |  2 +-
 spec/features/merge_requests/squash_spec.rb   |  2 +-
 .../merge_requests/target_branch_spec.rb      |  2 +-
 .../update_merge_requests_spec.rb             |  2 +-
 .../user_uses_slash_commands_spec.rb          | 10 +++---
 .../merge_requests/widget_deployments_spec.rb |  2 +-
 spec/features/merge_requests/widget_spec.rb   |  2 +-
 .../merge_requests/wip_message_spec.rb        |  2 +-
 spec/features/milestone_spec.rb               |  2 +-
 .../user_visits_notifications_tab_spec.rb     |  2 +-
 spec/features/projects/activity/rss_spec.rb   |  2 +-
 spec/features/projects/audit_events_spec.rb   |  4 +--
 .../features/projects/badges/coverage_spec.rb |  2 +-
 spec/features/projects/badges/list_spec.rb    |  2 +-
 spec/features/projects/blobs/edit_spec.rb     |  8 ++---
 .../branches/download_buttons_spec.rb         |  2 +-
 spec/features/projects/branches_spec.rb       |  4 +--
 spec/features/projects/commit/builds_spec.rb  |  2 +-
 .../projects/commit/cherry_pick_spec.rb       |  2 +-
 spec/features/projects/commits/rss_spec.rb    |  2 +-
 spec/features/projects/compare_spec.rb        |  2 +-
 spec/features/projects/deploy_keys_spec.rb    |  2 +-
 ...r_views_empty_project_instructions_spec.rb |  2 +-
 spec/features/projects/edit_spec.rb           |  2 +-
 .../projects/environments/environment_spec.rb |  2 +-
 .../environments/environments_spec.rb         |  2 +-
 .../projects/features_visibility_spec.rb      |  6 ++--
 .../projects/files/browse_files_spec.rb       |  2 +-
 .../projects/files/creating_a_file_spec.rb    |  2 +-
 .../files/dockerfile_dropdown_spec.rb         |  2 +-
 .../projects/files/download_buttons_spec.rb   |  2 +-
 .../files/edit_file_soft_wrap_spec.rb         |  2 +-
 .../projects/files/editing_a_file_spec.rb     |  2 +-
 ...files_sort_submodules_with_folders_spec.rb |  2 +-
 .../projects/files/find_file_keyboard_spec.rb |  2 +-
 .../projects/files/gitignore_dropdown_spec.rb |  2 +-
 .../files/gitlab_ci_yml_dropdown_spec.rb      |  2 +-
 ...project_owner_creates_license_file_spec.rb |  2 +-
 ...eate_license_file_in_empty_project_spec.rb |  2 +-
 .../files/template_type_dropdown_spec.rb      |  2 +-
 .../projects/files/undo_template_spec.rb      |  2 +-
 .../projects/guest_navigation_menu_spec.rb    |  2 +-
 .../projects/issuable_templates_spec.rb       |  4 +--
 spec/features/projects/issues/rss_spec.rb     |  2 +-
 spec/features/projects/jobs_spec.rb           |  2 +-
 .../projects/labels/subscription_spec.rb      |  2 +-
 .../labels/update_prioritization_spec.rb      |  2 +-
 .../projects/main/download_buttons_spec.rb    |  2 +-
 spec/features/projects/main/rss_spec.rb       |  2 +-
 .../anonymous_user_sees_members_spec.rb       |  2 +-
 .../projects/members/group_members_spec.rb    |  2 +-
 .../members/groups_with_access_list_spec.rb   |  2 +-
 ...r_adds_member_with_expiration_date_spec.rb |  2 +-
 .../master_manages_access_requests_spec.rb    |  2 +-
 ...nnot_request_access_to_his_project_spec.rb |  2 +-
 .../member_is_removed_from_project_spec.rb    |  2 +-
 .../members/member_leaves_project_spec.rb     |  2 +-
 .../projects/merge_requests/list_spec.rb      |  2 +-
 spec/features/projects/pages_spec.rb          |  2 +-
 spec/features/projects/path_locks_spec.rb     |  2 +-
 .../projects/pipelines/pipeline_spec.rb       |  2 +-
 .../projects/pipelines/pipelines_spec.rb      |  2 +-
 spec/features/projects/push_rules_spec.rb     |  2 +-
 spec/features/projects/remote_mirror_spec.rb  |  2 +-
 .../services/user_activates_jira_spec.rb      |  2 +-
 ...activates_mattermost_slash_command_spec.rb |  2 +-
 ...user_activates_slack_slash_command_spec.rb |  2 +-
 .../settings/integration_settings_spec.rb     |  2 +-
 .../projects/settings/issues_settings_spec.rb |  2 +-
 .../settings/merge_requests_settings_spec.rb  |  2 +-
 .../settings/pipelines_settings_spec.rb       |  2 +-
 .../settings/repository_settings_spec.rb      |  4 +--
 .../settings/slack_application_spec.rb        |  2 +-
 .../settings/visibility_settings_spec.rb      |  2 +-
 .../projects/snippets/create_snippet_spec.rb  |  2 +-
 spec/features/projects/snippets/show_spec.rb  |  2 +-
 .../projects/tags/download_buttons_spec.rb    |  2 +-
 spec/features/projects/tree/rss_spec.rb       |  2 +-
 .../projects/user_browses_files_spec.rb       |  2 +-
 .../projects/user_creates_directory_spec.rb   |  4 +--
 .../projects/user_creates_files_spec.rb       |  6 ++--
 .../projects/user_deletes_files_spec.rb       |  4 +--
 .../projects/user_edits_files_spec.rb         |  4 +--
 .../projects/user_replaces_files_spec.rb      |  4 +--
 .../projects/user_uploads_files_spec.rb       |  4 +--
 .../projects/wiki/markdown_preview_spec.rb    |  2 +-
 .../user_views_wiki_in_project_page_spec.rb   |  2 +-
 spec/features/projects_spec.rb                |  6 ++--
 spec/features/promotion_spec.rb               | 28 +++++++--------
 spec/features/signed_commits_spec.rb          |  6 ++--
 spec/features/tags/master_creates_tag_spec.rb |  2 +-
 spec/features/tags/master_deletes_tag_spec.rb |  2 +-
 spec/features/tags/master_updates_tag_spec.rb |  2 +-
 spec/features/tags/master_views_tags_spec.rb  |  2 +-
 spec/features/triggers_spec.rb                |  6 ++--
 spec/features/variables_spec.rb               |  2 +-
 spec/finders/access_requests_finder_spec.rb   |  4 +--
 spec/finders/group_projects_finder_spec.rb    |  4 +--
 spec/finders/issues_finder_spec.rb            |  6 ++--
 spec/finders/labels_finder_spec.rb            |  4 +--
 spec/finders/merge_requests_finder_spec.rb    |  8 ++---
 spec/finders/move_to_project_finder_spec.rb   | 34 +++++++++---------
 spec/finders/notes_finder_spec.rb             |  6 ++--
 spec/finders/personal_projects_finder_spec.rb |  2 +-
 spec/finders/snippets_finder_spec.rb          |  4 +--
 spec/finders/todos_finder_spec.rb             |  2 +-
 spec/helpers/markup_helper_spec.rb            |  2 +-
 spec/helpers/notes_helper_spec.rb             |  8 ++---
 .../lib/banzai/filter/redactor_filter_spec.rb |  6 ++--
 .../filter/user_reference_filter_spec.rb      |  6 ++--
 .../reference_parser/user_parser_spec.rb      |  6 ++--
 .../lib/gitlab/ci/status/build/common_spec.rb |  2 +-
 .../gitlab/ci/status/external/common_spec.rb  |  2 +-
 .../gitlab/ci/status/external/factory_spec.rb |  2 +-
 .../gitlab/ci/status/pipeline/common_spec.rb  |  2 +-
 .../gitlab/ci/status/pipeline/factory_spec.rb |  2 +-
 .../lib/gitlab/ci/status/stage/common_spec.rb |  2 +-
 .../gitlab/ci/status/stage/factory_spec.rb    |  2 +-
 .../gitlab/closing_issue_extractor_spec.rb    |  6 ++--
 .../cycle_analytics/permissions_spec.rb       |  8 ++---
 .../elastic/project_search_results_spec.rb    |  4 +--
 .../lib/gitlab/elastic/search_results_spec.rb |  8 ++---
 .../email/handler/create_note_handler_spec.rb |  4 +--
 .../lib/gitlab/gfm/reference_rewriter_spec.rb |  2 +-
 spec/lib/gitlab/git/repository_spec.rb        |  2 +-
 spec/lib/gitlab/git_access_spec.rb            | 10 +++---
 spec/lib/gitlab/git_access_wiki_spec.rb       |  4 +--
 .../google_code_import/importer_spec.rb       |  2 +-
 .../import_export/project_tree_saver_spec.rb  |  2 +-
 .../gitlab/import_export/repo_saver_spec.rb   |  2 +-
 .../import_export/wiki_repo_saver_spec.rb     |  2 +-
 .../lib/gitlab/project_authorizations_spec.rb |  2 +-
 .../lib/gitlab/project_search_results_spec.rb |  8 ++---
 spec/lib/gitlab/reference_extractor_spec.rb   | 12 +++----
 spec/lib/gitlab/search_results_spec.rb        | 10 +++---
 .../gitlab/slash_commands/issue_new_spec.rb   |  2 +-
 .../slash_commands/issue_search_spec.rb       |  2 +-
 .../gitlab/slash_commands/issue_show_spec.rb  |  2 +-
 spec/lib/gitlab/user_access_spec.rb           | 36 +++++++++----------
 spec/mailers/notify_spec.rb                   |  8 ++---
 spec/models/ability_spec.rb                   |  6 ++--
 spec/models/ci/pipeline_spec.rb               |  2 +-
 spec/models/ci/trigger_spec.rb                |  2 +-
 spec/models/commit_spec.rb                    |  4 +--
 spec/models/concerns/elastic/note_spec.rb     |  4 +--
 spec/models/concerns/elastic/snippet_spec.rb  |  2 +-
 spec/models/concerns/mentionable_spec.rb      |  4 +--
 spec/models/concerns/milestoneish_spec.rb     |  4 +--
 .../concerns/resolvable_discussion_spec.rb    |  2 +-
 spec/models/event_spec.rb                     |  4 +--
 spec/models/generic_commit_status_spec.rb     |  2 +-
 spec/models/hooks/system_hook_spec.rb         |  4 +--
 spec/models/issue_collection_spec.rb          |  2 +-
 spec/models/issue_spec.rb                     | 14 ++++----
 spec/models/member_spec.rb                    |  8 ++---
 spec/models/members/project_member_spec.rb    |  8 ++---
 spec/models/merge_request_spec.rb             | 28 +++++++--------
 spec/models/note_spec.rb                      |  2 +-
 spec/models/project_feature_spec.rb           |  2 +-
 .../pipelines_email_service_spec.rb           |  2 +-
 spec/models/project_spec.rb                   | 14 ++++----
 spec/models/project_team_spec.rb              |  4 +--
 spec/models/user_spec.rb                      | 26 +++++++-------
 spec/policies/ci/build_policy_spec.rb         |  4 +--
 spec/policies/ci/trigger_policy_spec.rb       | 10 +++---
 spec/policies/issue_policy_spec.rb            | 12 +++----
 spec/policies/project_snippet_policy_spec.rb  |  6 ++--
 .../merge_request_presenter_spec.rb           |  8 ++---
 spec/requests/api/access_requests_spec.rb     |  4 +--
 spec/requests/api/award_emoji_spec.rb         |  2 +-
 spec/requests/api/boards_spec.rb              |  4 +--
 spec/requests/api/deployments_spec.rb         |  2 +-
 spec/requests/api/environments_spec.rb        |  2 +-
 spec/requests/api/files_spec.rb               |  2 +-
 spec/requests/api/groups_spec.rb              |  2 +-
 spec/requests/api/internal_spec.rb            | 16 ++++-----
 spec/requests/api/issues_spec.rb              |  8 ++---
 spec/requests/api/jobs_spec.rb                |  2 +-
 spec/requests/api/labels_spec.rb              |  2 +-
 spec/requests/api/members_spec.rb             |  4 +--
 spec/requests/api/merge_request_diffs_spec.rb |  2 +-
 spec/requests/api/merge_requests_spec.rb      | 30 ++++++++--------
 spec/requests/api/notes_spec.rb               |  4 +--
 spec/requests/api/pipelines_spec.rb           |  4 +--
 spec/requests/api/project_hooks_spec.rb       |  6 ++--
 spec/requests/api/project_milestones_spec.rb  |  2 +-
 spec/requests/api/project_push_rule_spec.rb   |  4 +--
 spec/requests/api/projects_spec.rb            | 10 +++---
 spec/requests/api/services_spec.rb            |  2 +-
 spec/requests/api/todos_spec.rb               |  6 ++--
 spec/requests/api/v3/award_emoji_spec.rb      |  2 +-
 spec/requests/api/v3/boards_spec.rb           |  4 +--
 spec/requests/api/v3/commits_spec.rb          |  8 ++---
 spec/requests/api/v3/deployments_spec.rb      |  2 +-
 spec/requests/api/v3/environments_spec.rb     |  2 +-
 spec/requests/api/v3/files_spec.rb            |  2 +-
 spec/requests/api/v3/groups_spec.rb           |  2 +-
 spec/requests/api/v3/issues_spec.rb           |  8 ++---
 spec/requests/api/v3/labels_spec.rb           |  2 +-
 spec/requests/api/v3/members_spec.rb          |  4 +--
 .../api/v3/merge_request_diffs_spec.rb        |  2 +-
 spec/requests/api/v3/merge_requests_spec.rb   | 26 +++++++-------
 spec/requests/api/v3/milestones_spec.rb       |  6 ++--
 spec/requests/api/v3/notes_spec.rb            |  4 +--
 spec/requests/api/v3/pipelines_spec.rb        |  4 +--
 spec/requests/api/v3/project_hooks_spec.rb    |  6 ++--
 .../requests/api/v3/project_push_rule_spec.rb |  4 +--
 spec/requests/api/v3/projects_spec.rb         | 10 +++---
 spec/requests/api/v3/todos_spec.rb            |  4 +--
 spec/requests/git_http_spec.rb                | 24 ++++++-------
 spec/requests/lfs_http_spec.rb                | 30 ++++++++--------
 .../projects/cycle_analytics_events_spec.rb   |  2 +-
 .../projects/issue_links_controller_spec.rb   |  6 ++--
 .../projects/mirrors_controller_spec.rb       |  2 +-
 spec/serializers/environment_entity_spec.rb   |  2 +-
 .../boards/issues/create_service_spec.rb      |  4 +--
 .../boards/issues/list_service_spec.rb        |  2 +-
 .../boards/issues/move_service_spec.rb        |  2 +-
 .../boards/lists/create_service_spec.rb       |  2 +-
 .../boards/lists/generate_service_spec.rb     |  2 +-
 .../ci/stop_environments_service_spec.rb      |  6 ++--
 spec/services/delete_branch_service_spec.rb   |  2 +-
 .../discussions/resolve_service_spec.rb       |  2 +-
 spec/services/files/update_service_spec.rb    |  2 +-
 spec/services/git_push_service_spec.rb        | 12 +++----
 spec/services/git_tag_push_service_spec.rb    |  2 +-
 .../issuable/bulk_update_service_spec.rb      |  8 ++---
 spec/services/issues/build_service_spec.rb    |  2 +-
 spec/services/issues/close_service_spec.rb    |  6 ++--
 spec/services/issues/create_service_spec.rb   | 18 +++++-----
 spec/services/issues/move_service_spec.rb     | 16 ++++-----
 spec/services/issues/reopen_service_spec.rb   |  4 +--
 .../issues/resolve_discussions_spec.rb        |  2 +-
 spec/services/issues/update_service_spec.rb   | 12 +++----
 .../labels/find_or_create_service_spec.rb     |  2 +-
 .../approve_access_request_service_spec.rb    |  2 +-
 .../authorized_destroy_service_spec.rb        |  4 +--
 spec/services/members/create_service_spec.rb  |  2 +-
 spec/services/members/destroy_service_spec.rb |  4 +--
 .../assign_issues_service_spec.rb             |  2 +-
 .../merge_requests/build_service_spec.rb      |  2 +-
 .../merge_requests/close_service_spec.rb      |  6 ++--
 .../merge_requests/create_service_spec.rb     | 18 +++++-----
 .../merge_requests/ff_merge_service_spec.rb   |  4 +--
 .../merge_requests/post_merge_service_spec.rb |  2 +-
 .../merge_requests/rebase_service_spec.rb     |  2 +-
 .../merge_requests/refresh_service_spec.rb    |  4 +--
 .../merge_requests/reopen_service_spec.rb     |  6 ++--
 .../merge_requests/update_service_spec.rb     | 10 +++---
 .../services/milestones/close_service_spec.rb |  2 +-
 .../milestones/create_service_spec.rb         |  2 +-
 .../milestones/destroy_service_spec.rb        |  2 +-
 spec/services/notes/create_service_spec.rb    |  2 +-
 .../notes/post_process_service_spec.rb        |  2 +-
 .../notes/quick_actions_service_spec.rb       | 10 +++---
 spec/services/notes/update_service_spec.rb    |  6 ++--
 .../projects/autocomplete_service_spec.rb     |  4 +--
 .../quick_actions/interpret_service_spec.rb   |  4 +--
 spec/services/search/snippet_service_spec.rb  |  2 +-
 spec/services/todo_service_spec.rb            | 16 ++++-----
 .../support/api/milestones_shared_examples.rb |  4 +--
 ...issuable_slash_commands_shared_examples.rb |  2 +-
 spec/support/markdown_feature.rb              |  4 +--
 spec/support/mentionable_shared_examples.rb   |  2 +-
 .../reference_parser_shared_examples.rb       |  2 +-
 ..._service_slash_commands_shared_examples.rb |  4 +--
 .../updating_mentions_shared_examples.rb      |  2 +-
 .../projects/imports/new.html.haml_spec.rb    |  2 +-
 .../shared/notes/_form.html.haml_spec.rb      |  2 +-
 spec/workers/merge_worker_spec.rb             |  2 +-
 417 files changed, 906 insertions(+), 912 deletions(-)
 create mode 100644 changelogs/unreleased/36782-replace-team-user-role-with-add_role-user-in-specs.yml

diff --git a/app/models/project.rb b/app/models/project.rb
index 3f8ee0eb23e9..d6152280ba59 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -231,7 +231,7 @@ class Project < ActiveRecord::Base
   delegate :name, to: :owner, allow_nil: true, prefix: true
   delegate :members, to: :team, prefix: true
   delegate :add_user, :add_users, to: :team
-  delegate :add_guest, :add_reporter, :add_developer, :add_master, to: :team
+  delegate :add_guest, :add_reporter, :add_developer, :add_master, :add_role, to: :team
 
   # Validations
   validates :creator, presence: true, on: :create
diff --git a/app/models/project_team.rb b/app/models/project_team.rb
index 9b407670dd82..2fef32b7dc3e 100644
--- a/app/models/project_team.rb
+++ b/app/models/project_team.rb
@@ -7,36 +7,24 @@ def initialize(project)
     @project = project
   end
 
-  # Shortcut to add users
-  #
-  # Use:
-  #   @team << [@user, :master]
-  #   @team << [@users, :master]
-  #
-  def <<(args)
-    users, access, current_user = *args
-
-    if users.respond_to?(:each)
-      add_users(users, access, current_user: current_user)
-    else
-      add_user(users, access, current_user: current_user)
-    end
-  end
-
   def add_guest(user, current_user: nil)
-    self << [user, :guest, current_user]
+    add_user(user, :guest, current_user: current_user)
   end
 
   def add_reporter(user, current_user: nil)
-    self << [user, :reporter, current_user]
+    add_user(user, :reporter, current_user: current_user)
   end
 
   def add_developer(user, current_user: nil)
-    self << [user, :developer, current_user]
+    add_user(user, :developer, current_user: current_user)
   end
 
   def add_master(user, current_user: nil)
-    self << [user, :master, current_user]
+    add_user(user, :master, current_user: current_user)
+  end
+
+  def add_role(user, role, current_user: nil)
+    public_send(:"add_#{role}", user, current_user: current_user) # rubocop:disable GitlabSecurity/PublicSend
   end
 
   def find_member(user_id)
diff --git a/changelogs/unreleased/36782-replace-team-user-role-with-add_role-user-in-specs.yml b/changelogs/unreleased/36782-replace-team-user-role-with-add_role-user-in-specs.yml
new file mode 100644
index 000000000000..8773ac73a75e
--- /dev/null
+++ b/changelogs/unreleased/36782-replace-team-user-role-with-add_role-user-in-specs.yml
@@ -0,0 +1,5 @@
+---
+title: Replace '.team << [user, role]' with 'add_role(user)' in specs
+merge_request: 16069
+author: "@blackst0ne"
+type: other
diff --git a/db/fixtures/development/06_teams.rb b/db/fixtures/development/06_teams.rb
index 86e0a38aae17..8afb0dde0771 100644
--- a/db/fixtures/development/06_teams.rb
+++ b/db/fixtures/development/06_teams.rb
@@ -14,7 +14,7 @@
 
     Project.all.each do |project|
       User.all.sample(4).each do |user|
-        if project.team << [user, Gitlab::Access.values.sample]
+        if project.add_role(user, Gitlab::Access.values.sample)
           print '.'
         else
           print 'F'
diff --git a/features/steps/groups_management.rb b/features/steps/groups_management.rb
index 3cec7a4d364f..507f9884b374 100644
--- a/features/steps/groups_management.rb
+++ b/features/steps/groups_management.rb
@@ -13,7 +13,7 @@ class Spinach::Features::GroupsManagement < Spinach::FeatureSteps
   step '"Mary Jane" has master access for project "Open"' do
     @user = User.find_by(name: "Mary Jane") || create(:user, name: "Mary Jane")
     @project = Project.find_by(name: "Open")
-    @project.team << [@user, :master]
+    @project.add_master(@user)
   end
 
   step "Group membership lock is enabled" do
diff --git a/features/steps/profile/profile.rb b/features/steps/profile/profile.rb
index 4b88cb5e27f3..d3b88ae8d2a3 100644
--- a/features/steps/profile/profile.rb
+++ b/features/steps/profile/profile.rb
@@ -165,7 +165,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
     @project = create(:project, :repository, namespace: @group)
     @event   = create(:closed_issue_event, project: @project)
 
-    @project.team << [current_user, :master]
+    @project.add_master(current_user)
   end
 
   step 'I should see groups I belong to' do
diff --git a/features/steps/project/deploy_keys.rb b/features/steps/project/deploy_keys.rb
index b4403becb0dd..9db31522c5c1 100644
--- a/features/steps/project/deploy_keys.rb
+++ b/features/steps/project/deploy_keys.rb
@@ -48,11 +48,11 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
 
   step 'other projects have deploy keys' do
     @second_project = create(:project, namespace: create(:group))
-    @second_project.team << [current_user, :master]
+    @second_project.add_master(current_user)
     create(:deploy_keys_project, project: @second_project)
 
     @third_project = create(:project, namespace: create(:group))
-    @third_project.team << [current_user, :master]
+    @third_project.add_master(current_user)
     create(:deploy_keys_project, project: @third_project, deploy_key: @second_project.deploy_keys.first)
   end
 
diff --git a/features/steps/project/elastic/global_search.rb b/features/steps/project/elastic/global_search.rb
index 174d9f301b0d..810371bb4454 100644
--- a/features/steps/project/elastic/global_search.rb
+++ b/features/steps/project/elastic/global_search.rb
@@ -19,7 +19,7 @@ class Spinach::Features::GlobalSearch < Spinach::FeatureSteps
 
   step 'project has all data available for the search' do
     @project = create :project
-    @project.team << [current_user, :master]
+    @project.add_master(current_user)
 
     @issue = create :issue, title: 'bla-bla initial', project: @project
     @merge_request = create :merge_request, title: 'bla-bla initial', source_project: @project
diff --git a/features/steps/project/elastic/project_search.rb b/features/steps/project/elastic/project_search.rb
index 8138c9162351..b8657fd99c3f 100644
--- a/features/steps/project/elastic/project_search.rb
+++ b/features/steps/project/elastic/project_search.rb
@@ -17,7 +17,7 @@ class Spinach::Features::ProjectSearch < Spinach::FeatureSteps
 
   step 'project has all data available for the search' do
     @project = create :project, :repository
-    @project.team << [current_user, :master]
+    @project.add_master(current_user)
 
     @issue = create :issue, title: 'bla-bla initial', project: @project
     @merge_request = create :merge_request, title: 'bla-bla initial', source_project: @project
diff --git a/features/steps/project/fork.rb b/features/steps/project/fork.rb
index 60707f26aee7..0350e1c2aef9 100644
--- a/features/steps/project/fork.rb
+++ b/features/steps/project/fork.rb
@@ -10,7 +10,7 @@ class Spinach::Features::ProjectFork < Spinach::FeatureSteps
 
   step 'I am a member of project "Shop"' do
     @project = create(:project, :repository, name: "Shop")
-    @project.team << [@user, :reporter]
+    @project.add_reporter(@user)
   end
 
   step 'I should see the forked project page' do
@@ -71,7 +71,7 @@ class Spinach::Features::ProjectFork < Spinach::FeatureSteps
 
   step 'There is an existent fork of the "Shop" project' do
     user = create(:user, name: 'Mike')
-    @project.team << [user, :reporter]
+    @project.add_reporter(user)
     @forked_project = Projects::ForkService.new(@project, user).execute
   end
 
diff --git a/features/steps/project/forked_merge_requests.rb b/features/steps/project/forked_merge_requests.rb
index 6781a906a942..fd51ee1a316a 100644
--- a/features/steps/project/forked_merge_requests.rb
+++ b/features/steps/project/forked_merge_requests.rb
@@ -10,7 +10,7 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps
   step 'I am a member of project "Shop"' do
     @project = ::Project.find_by(name: "Shop")
     @project ||= create(:project, :repository, name: "Shop")
-    @project.team << [@user, :reporter]
+    @project.add_reporter(@user)
   end
 
   step 'I have a project forked off of "Shop" called "Forked Shop"' do
diff --git a/features/steps/project/source/browse_files.rb b/features/steps/project/source/browse_files.rb
index 6e04f09f3224..eeb5e1f888e7 100644
--- a/features/steps/project/source/browse_files.rb
+++ b/features/steps/project/source/browse_files.rb
@@ -8,7 +8,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
 
   step "I don't have write access" do
     @project = create(:project, :repository, name: "Other Project", path: "other-project")
-    @project.team << [@user, :reporter]
+    @project.add_reporter(@user)
     visit project_tree_path(@project, root_ref)
   end
 
diff --git a/features/steps/project/source/markdown_render.rb b/features/steps/project/source/markdown_render.rb
index f6445b57ec05..fc4ef26f6b68 100644
--- a/features/steps/project/source/markdown_render.rb
+++ b/features/steps/project/source/markdown_render.rb
@@ -10,7 +10,7 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   step 'I own project "Delta"' do
     @project = ::Project.find_by(name: "Delta")
     @project ||= create(:project, :repository, name: "Delta", namespace: @user.namespace)
-    @project.team << [@user, :master]
+    @project.add_master(@user)
   end
 
   step 'I should see files from repository in markdown' do
diff --git a/features/steps/shared/group.rb b/features/steps/shared/group.rb
index a6ce06aadac9..6e6c8f1460ee 100644
--- a/features/steps/shared/group.rb
+++ b/features/steps/shared/group.rb
@@ -45,7 +45,7 @@ def is_member_of(username, groupname, role)
     group.add_user(user, role)
     project ||= create(:project, :repository, namespace: group)
     create(:closed_issue_event, project: project)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   def owned_group
diff --git a/features/steps/shared/project.rb b/features/steps/shared/project.rb
index e361270f8c86..1f00ee5e13c7 100644
--- a/features/steps/shared/project.rb
+++ b/features/steps/shared/project.rb
@@ -4,13 +4,13 @@ module SharedProject
   # Create a project without caring about what it's called
   step "I own a project" do
     @project = create(:project, :repository, namespace: @user.namespace)
-    @project.team << [@user, :master]
+    @project.add_master(@user)
   end
 
   step "I own a project in some group namespace" do
     @group = create(:group, name: 'some group')
     @project = create(:project, namespace: @group)
-    @project.team << [@user, :master]
+    @project.add_master(@user)
   end
 
   step "project exists in some group namespace" do
@@ -22,7 +22,7 @@ module SharedProject
   step 'I own project "Shop"' do
     @project = Project.find_by(name: "Shop")
     @project ||= create(:project, :repository, name: "Shop", namespace: @user.namespace, issues_template: "This issue should contain the following.", merge_requests_template: "This merge request should contain the following.")
-    @project.team << [@user, :master]
+    @project.add_master(@user)
   end
 
   step 'I disable snippets in project' do
@@ -40,7 +40,7 @@ module SharedProject
   step 'I add a user to project "Shop"' do
     @project = Project.find_by(name: "Shop")
     other_user = create(:user, name: 'Alpha')
-    @project.team << [other_user, :master]
+    @project.add_master(other_user)
   end
 
   # Create another specific project called "Forum"
@@ -49,14 +49,13 @@ module SharedProject
     @project ||= create(:project, :repository, name: "Forum", namespace: @user.namespace, path: 'forum_project')
     @project.build_project_feature
     @project.project_feature.save
-    @project.team << [@user, :master]
+    @project.add_master(@user)
   end
 
   # Create an empty project without caring about the name
   step 'I own an empty project' do
-    @project = create(:project,
-                      name: 'Empty Project', namespace: @user.namespace)
-    @project.team << [@user, :master]
+    @project = create(:project, name: 'Empty Project', namespace: @user.namespace)
+    @project.add_master(@user)
   end
 
   step 'I visit my empty project page' do
@@ -101,11 +100,11 @@ def current_project
   # ----------------------------------------
 
   step 'I am member of a project with a guest role' do
-    @project.team << [@user, Gitlab::Access::GUEST]
+    @project.add_guest(@user)
   end
 
   step 'I am member of a project with a reporter role' do
-    @project.team << [@user, Gitlab::Access::REPORTER]
+    @project.add_reporter(@user)
   end
 
   # ----------------------------------------
@@ -245,6 +244,6 @@ def user_owns_project(user_name:, project_name:, visibility: :private)
     user = user_exists(user_name, username: user_name.gsub(/\s/, '').underscore)
     project = Project.find_by(name: project_name)
     project ||= create(:project, visibility, name: project_name, namespace: user.namespace)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 end
diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb
index f044a0689387..f350641a643a 100644
--- a/spec/controllers/admin/users_controller_spec.rb
+++ b/spec/controllers/admin/users_controller_spec.rb
@@ -13,7 +13,7 @@
     let!(:issue) { create(:issue, author: user) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     it 'deletes user and ghosts their contributions' do
diff --git a/spec/controllers/boards/issues_controller_spec.rb b/spec/controllers/boards/issues_controller_spec.rb
index db5cefbe335c..3a449d25f56d 100644
--- a/spec/controllers/boards/issues_controller_spec.rb
+++ b/spec/controllers/boards/issues_controller_spec.rb
@@ -13,8 +13,8 @@
   let!(:list2) { create(:list, board: board, label: development, position: 1) }
 
   before do
-    project.team << [user, :master]
-    project.team << [guest, :guest]
+    project.add_master(user)
+    project.add_guest(guest)
   end
 
   describe 'GET index', :request_store do
@@ -221,7 +221,7 @@ def create_issue(user:, board:, list:, title:)
       let(:guest) { create(:user) }
 
       before do
-        project.team << [guest, :guest]
+        project.add_guest(guest)
       end
 
       it 'returns a forbidden 403 response' do
diff --git a/spec/controllers/boards/lists_controller_spec.rb b/spec/controllers/boards/lists_controller_spec.rb
index a2b432af23a4..71d45a22d916 100644
--- a/spec/controllers/boards/lists_controller_spec.rb
+++ b/spec/controllers/boards/lists_controller_spec.rb
@@ -7,8 +7,8 @@
   let(:guest)   { create(:user) }
 
   before do
-    project.team << [user, :master]
-    project.team << [guest, :guest]
+    project.add_master(user)
+    project.add_guest(guest)
   end
 
   describe 'GET index' do
diff --git a/spec/controllers/dashboard/milestones_controller_spec.rb b/spec/controllers/dashboard/milestones_controller_spec.rb
index 2f3d7be9abea..60547db82b67 100644
--- a/spec/controllers/dashboard/milestones_controller_spec.rb
+++ b/spec/controllers/dashboard/milestones_controller_spec.rb
@@ -17,7 +17,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   it_behaves_like 'milestone tabs'
diff --git a/spec/controllers/dashboard/todos_controller_spec.rb b/spec/controllers/dashboard/todos_controller_spec.rb
index f9faa4fa59a2..b4a731fd3a32 100644
--- a/spec/controllers/dashboard/todos_controller_spec.rb
+++ b/spec/controllers/dashboard/todos_controller_spec.rb
@@ -8,7 +8,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   describe 'GET #index' do
diff --git a/spec/controllers/dashboard_controller_spec.rb b/spec/controllers/dashboard_controller_spec.rb
index 566d85151982..97c2c3fb940d 100644
--- a/spec/controllers/dashboard_controller_spec.rb
+++ b/spec/controllers/dashboard_controller_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/groups/milestones_controller_spec.rb b/spec/controllers/groups/milestones_controller_spec.rb
index c1aba46be04c..733386500caf 100644
--- a/spec/controllers/groups/milestones_controller_spec.rb
+++ b/spec/controllers/groups/milestones_controller_spec.rb
@@ -28,7 +28,7 @@
   before do
     sign_in(user)
     group.add_owner(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe '#index' do
diff --git a/spec/controllers/notification_settings_controller_spec.rb b/spec/controllers/notification_settings_controller_spec.rb
index 9014b8b50844..e133950e6844 100644
--- a/spec/controllers/notification_settings_controller_spec.rb
+++ b/spec/controllers/notification_settings_controller_spec.rb
@@ -6,7 +6,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   describe '#create' do
diff --git a/spec/controllers/projects/avatars_controller_spec.rb b/spec/controllers/projects/avatars_controller_spec.rb
index f5ea097af8b5..3bbe168f6d5d 100644
--- a/spec/controllers/projects/avatars_controller_spec.rb
+++ b/spec/controllers/projects/avatars_controller_spec.rb
@@ -6,7 +6,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
     controller.instance_variable_set(:@project, project)
   end
 
diff --git a/spec/controllers/projects/blame_controller_spec.rb b/spec/controllers/projects/blame_controller_spec.rb
index 54282aa40017..88d4f4e9cd00 100644
--- a/spec/controllers/projects/blame_controller_spec.rb
+++ b/spec/controllers/projects/blame_controller_spec.rb
@@ -7,7 +7,7 @@
   before do
     sign_in(user)
 
-    project.team << [user, :master]
+    project.add_master(user)
     controller.instance_variable_set(:@project, project)
   end
 
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index 6a1c07b4a0b6..00a7df6ccc8e 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -89,7 +89,7 @@ def do_get(opts = {})
     end
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
 
       sign_in(user)
     end
@@ -147,7 +147,7 @@ def do_get(opts = {})
       let(:developer) { create(:user) }
 
       before do
-        project.team << [developer, :developer]
+        project.add_developer(developer)
         sign_in(developer)
         get :edit, default_params
       end
@@ -161,7 +161,7 @@ def do_get(opts = {})
       let(:master) { create(:user) }
 
       before do
-        project.team << [master, :master]
+        project.add_master(master)
         sign_in(master)
         get :edit, default_params
       end
@@ -190,7 +190,7 @@ def blob_after_edit_path
     end
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
 
       sign_in(user)
     end
diff --git a/spec/controllers/projects/boards_controller_spec.rb b/spec/controllers/projects/boards_controller_spec.rb
index be81b50d61df..af2266a8f2e9 100644
--- a/spec/controllers/projects/boards_controller_spec.rb
+++ b/spec/controllers/projects/boards_controller_spec.rb
@@ -5,7 +5,7 @@
   let(:user)    { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb
index b22ec247cfd6..a5139cc9b901 100644
--- a/spec/controllers/projects/branches_controller_spec.rb
+++ b/spec/controllers/projects/branches_controller_spec.rb
@@ -6,8 +6,8 @@
   let(:developer) { create(:user) }
 
   before do
-    project.team << [user, :master]
-    project.team << [user, :developer]
+    project.add_master(user)
+    project.add_developer(user)
 
     allow(project).to receive(:branches).and_return(['master', 'foo/bar/baz'])
     allow(project).to receive(:tags).and_return(['v1.0.0', 'v2.0.0'])
diff --git a/spec/controllers/projects/commits_controller_spec.rb b/spec/controllers/projects/commits_controller_spec.rb
index c459d7325073..73fb90d73ec4 100644
--- a/spec/controllers/projects/commits_controller_spec.rb
+++ b/spec/controllers/projects/commits_controller_spec.rb
@@ -6,7 +6,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe "GET show" do
diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb
index fe5818da0bc7..046ce0279652 100644
--- a/spec/controllers/projects/compare_controller_spec.rb
+++ b/spec/controllers/projects/compare_controller_spec.rb
@@ -8,7 +8,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   it 'compare shows some diffs' do
diff --git a/spec/controllers/projects/cycle_analytics_controller_spec.rb b/spec/controllers/projects/cycle_analytics_controller_spec.rb
index 6fae52edbadf..7c708a418a7d 100644
--- a/spec/controllers/projects/cycle_analytics_controller_spec.rb
+++ b/spec/controllers/projects/cycle_analytics_controller_spec.rb
@@ -6,7 +6,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'cycle analytics not set up flag' do
diff --git a/spec/controllers/projects/deploy_keys_controller_spec.rb b/spec/controllers/projects/deploy_keys_controller_spec.rb
index c3208357694a..97db69427e9b 100644
--- a/spec/controllers/projects/deploy_keys_controller_spec.rb
+++ b/spec/controllers/projects/deploy_keys_controller_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in(user)
   end
@@ -48,7 +48,7 @@
       end
 
       before do
-        project2.team << [user, :developer]
+        project2.add_developer(user)
       end
 
       it 'returns json in a correct format' do
diff --git a/spec/controllers/projects/deployments_controller_spec.rb b/spec/controllers/projects/deployments_controller_spec.rb
index 3164fd5c143c..73e7921fab78 100644
--- a/spec/controllers/projects/deployments_controller_spec.rb
+++ b/spec/controllers/projects/deployments_controller_spec.rb
@@ -8,7 +8,7 @@
   let(:environment) { create(:environment, name: 'production', project: project) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in(user)
   end
diff --git a/spec/controllers/projects/discussions_controller_spec.rb b/spec/controllers/projects/discussions_controller_spec.rb
index 3bf676637a2b..00328d3ea514 100644
--- a/spec/controllers/projects/discussions_controller_spec.rb
+++ b/spec/controllers/projects/discussions_controller_spec.rb
@@ -31,7 +31,7 @@
 
     context "when the user is authorized to resolve the discussion" do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       context "when the discussion is not resolvable" do
@@ -92,7 +92,7 @@
 
     context "when the user is authorized to resolve the discussion" do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       context "when the discussion is not resolvable" do
diff --git a/spec/controllers/projects/find_file_controller_spec.rb b/spec/controllers/projects/find_file_controller_spec.rb
index 6a5433bcc9c7..505fe82851a2 100644
--- a/spec/controllers/projects/find_file_controller_spec.rb
+++ b/spec/controllers/projects/find_file_controller_spec.rb
@@ -7,7 +7,7 @@
   before do
     sign_in(user)
 
-    project.team << [user, :master]
+    project.add_master(user)
     controller.instance_variable_set(:@project, project)
   end
 
diff --git a/spec/controllers/projects/forks_controller_spec.rb b/spec/controllers/projects/forks_controller_spec.rb
index 1bedb8ebdfff..c4b32dc3a09d 100644
--- a/spec/controllers/projects/forks_controller_spec.rb
+++ b/spec/controllers/projects/forks_controller_spec.rb
@@ -51,7 +51,7 @@ def get_forks
 
         context 'when user is a member of the Project' do
           before do
-            forked_project.team << [project.creator, :developer]
+            forked_project.add_developer(project.creator)
           end
 
           it 'sees the project listed' do
diff --git a/spec/controllers/projects/graphs_controller_spec.rb b/spec/controllers/projects/graphs_controller_spec.rb
index 5af03ae118c0..c3605555fe78 100644
--- a/spec/controllers/projects/graphs_controller_spec.rb
+++ b/spec/controllers/projects/graphs_controller_spec.rb
@@ -6,7 +6,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'GET languages' do
diff --git a/spec/controllers/projects/group_links_controller_spec.rb b/spec/controllers/projects/group_links_controller_spec.rb
index f8c792cd0f09..5bfc3d314013 100644
--- a/spec/controllers/projects/group_links_controller_spec.rb
+++ b/spec/controllers/projects/group_links_controller_spec.rb
@@ -7,7 +7,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/projects/hooks_controller_spec.rb b/spec/controllers/projects/hooks_controller_spec.rb
index 07174660f460..aba70c6d4c1c 100644
--- a/spec/controllers/projects/hooks_controller_spec.rb
+++ b/spec/controllers/projects/hooks_controller_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/projects/imports_controller_spec.rb b/spec/controllers/projects/imports_controller_spec.rb
index cf904669f9fa..5c5d3dfab0b6 100644
--- a/spec/controllers/projects/imports_controller_spec.rb
+++ b/spec/controllers/projects/imports_controller_spec.rb
@@ -6,7 +6,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'GET #show' do
@@ -15,7 +15,7 @@
 
       before do
         sign_in(user)
-        project.team << [user, :master]
+        project.add_master(user)
       end
 
       it 'renders template' do
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 2c6ec036b62d..d909b812f73c 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -37,7 +37,7 @@
     context 'internal issue tracker' do
       before do
         sign_in(user)
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it_behaves_like "issuables list meta-data", :issue
@@ -69,7 +69,7 @@
 
       before do
         sign_in(user)
-        project.team << [user, :developer]
+        project.add_developer(user)
         allow(Kaminari.config).to receive(:default_per_page).and_return(1)
       end
 
@@ -116,7 +116,7 @@
     context 'internal issue tracker' do
       before do
         sign_in(user)
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it 'builds a new issue' do
@@ -127,7 +127,7 @@
 
       it 'fills in an issue for a merge request' do
         project_with_repository = create(:project, :repository)
-        project_with_repository.team << [user, :developer]
+        project_with_repository.add_developer(user)
         mr = create(:merge_request_with_diff_notes, source_project: project_with_repository)
 
         get :new, namespace_id: project_with_repository.namespace, project_id: project_with_repository, merge_request_to_resolve_discussions_of: mr.iid
@@ -153,7 +153,7 @@
 
       before do
         sign_in(user)
-        project.team << [user, :developer]
+        project.add_developer(user)
 
         external = double
         allow(project).to receive(:external_issue_tracker).and_return(external)
@@ -329,7 +329,7 @@ def move_issue
 
       it 'does not list confidential issues for project members with guest role' do
         sign_in(member)
-        project.team << [member, :guest]
+        project.add_guest(member)
 
         get_issues
 
@@ -354,7 +354,7 @@ def move_issue
 
       it 'lists confidential issues for project members' do
         sign_in(member)
-        project.team << [member, :developer]
+        project.add_developer(member)
 
         get_issues
 
@@ -394,7 +394,7 @@ def get_issues
 
       it 'returns 404 for project members with guest role' do
         sign_in(member)
-        project.team << [member, :guest]
+        project.add_guest(member)
         go(id: unescaped_parameter_value.to_param)
 
         expect(response).to have_gitlab_http_status :not_found
@@ -416,7 +416,7 @@ def get_issues
 
       it "returns #{http_status[:success]} for project members" do
         sign_in(member)
-        project.team << [member, :developer]
+        project.add_developer(member)
         go(id: unescaped_parameter_value.to_param)
 
         expect(response).to have_gitlab_http_status http_status[:success]
@@ -450,7 +450,7 @@ def go(id:)
 
       before do
         sign_in(user)
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it_behaves_like 'restricted action', success: 200
@@ -594,7 +594,7 @@ def go(id:)
         let(:deleted_user) { create(:user) }
 
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
 
           issue.update!(last_edited_by: deleted_user, last_edited_at: Time.now)
 
@@ -638,7 +638,7 @@ def go(id:)
     def post_new_issue(issue_attrs = {}, additional_params = {})
       sign_in(user)
       project = create(:project, :public)
-      project.team << [user, :developer]
+      project.add_developer(user)
 
       post :create, {
         namespace_id: project.namespace.to_param,
@@ -655,7 +655,7 @@ def post_new_issue(issue_attrs = {}, additional_params = {})
       let(:project) { merge_request.source_project }
 
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         sign_in user
       end
 
@@ -829,7 +829,7 @@ def post_verified_issue
       def post_spam
         admin = create(:admin)
         create(:user_agent_detail, subject: issue)
-        project.team << [admin, :master]
+        project.add_master(admin)
         sign_in(admin)
         post :mark_as_spam, {
           namespace_id: project.namespace,
diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb
index 7490f8fefce0..e6a4e7c8257e 100644
--- a/spec/controllers/projects/jobs_controller_spec.rb
+++ b/spec/controllers/projects/jobs_controller_spec.rb
@@ -374,7 +374,7 @@ def post_cancel_all
     let(:role) { :master }
 
     before do
-      project.team << [user, role]
+      project.add_role(user, role)
       sign_in(user)
 
       post_erase
diff --git a/spec/controllers/projects/labels_controller_spec.rb b/spec/controllers/projects/labels_controller_spec.rb
index cf83f2f32655..452d7e239838 100644
--- a/spec/controllers/projects/labels_controller_spec.rb
+++ b/spec/controllers/projects/labels_controller_spec.rb
@@ -6,7 +6,7 @@
   let(:user)    { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in(user)
   end
diff --git a/spec/controllers/projects/mattermosts_controller_spec.rb b/spec/controllers/projects/mattermosts_controller_spec.rb
index 33d48ff94d13..c5ac0be27bb9 100644
--- a/spec/controllers/projects/mattermosts_controller_spec.rb
+++ b/spec/controllers/projects/mattermosts_controller_spec.rb
@@ -5,7 +5,7 @@
   let!(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/projects/merge_requests/creations_controller_spec.rb b/spec/controllers/projects/merge_requests/creations_controller_spec.rb
index 7fdddc02fd3a..7e2366847f47 100644
--- a/spec/controllers/projects/merge_requests/creations_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/creations_controller_spec.rb
@@ -6,7 +6,7 @@
   let(:fork_project) { create(:forked_project_with_submodules) }
 
   before do
-    fork_project.team << [user, :master]
+    fork_project.add_master(user)
 
     sign_in(user)
   end
@@ -86,7 +86,7 @@ def diff_for_path(extra_params = {})
       let(:other_project) { create(:project, :repository) }
 
       before do
-        other_project.team << [user, :master]
+        other_project.add_master(user)
       end
 
       context 'when the path exists in the diff' do
diff --git a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
index ba97ccfbbd47..5d297c654bf6 100644
--- a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
@@ -151,7 +151,7 @@ def diff_for_path(extra_params = {})
       let(:other_project) { create(:project) }
 
       before do
-        other_project.team << [user, :master]
+        other_project.add_master(user)
         diff_for_path(old_path: existing_path, new_path: existing_path, project_id: other_project)
       end
 
diff --git a/spec/controllers/projects/milestones_controller_spec.rb b/spec/controllers/projects/milestones_controller_spec.rb
index 209979e642d7..00cf464ec5bc 100644
--- a/spec/controllers/projects/milestones_controller_spec.rb
+++ b/spec/controllers/projects/milestones_controller_spec.rb
@@ -11,7 +11,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
     controller.instance_variable_set(:@project, project)
   end
 
diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb
index 37e9f863fc4e..de132dfaa218 100644
--- a/spec/controllers/projects/notes_controller_spec.rb
+++ b/spec/controllers/projects/notes_controller_spec.rb
@@ -32,7 +32,7 @@
 
     before do
       sign_in(user)
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     it 'passes last_fetched_at from headers to NotesFinder' do
@@ -351,7 +351,7 @@ def post_create(extra_params = {})
 
     before do
       sign_in(note.author)
-      project.team << [note.author, :developer]
+      project.add_developer(note.author)
     end
 
     it "updates the note" do
@@ -372,7 +372,7 @@ def post_create(extra_params = {})
     context 'user is the author of a note' do
       before do
         sign_in(note.author)
-        project.team << [note.author, :developer]
+        project.add_developer(note.author)
       end
 
       it "returns status 200 for html" do
@@ -389,7 +389,7 @@ def post_create(extra_params = {})
     context 'user is not the author of a note' do
       before do
         sign_in(user)
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it "returns status 404" do
@@ -403,7 +403,7 @@ def post_create(extra_params = {})
   describe 'POST toggle_award_emoji' do
     before do
       sign_in(user)
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     it "toggles the award emoji" do
@@ -445,7 +445,7 @@ def post_create(extra_params = {})
 
       context "when the user is authorized to resolve the note" do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         context "when the note is not resolvable" do
@@ -506,7 +506,7 @@ def post_create(extra_params = {})
 
       context "when the user is authorized to resolve the note" do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         context "when the note is not resolvable" do
diff --git a/spec/controllers/projects/project_members_controller_spec.rb b/spec/controllers/projects/project_members_controller_spec.rb
index 0513937ba4a3..cc32c9fbc4ca 100644
--- a/spec/controllers/projects/project_members_controller_spec.rb
+++ b/spec/controllers/projects/project_members_controller_spec.rb
@@ -21,7 +21,7 @@
 
     context 'when user does not have enough rights' do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it 'returns 404' do
@@ -37,7 +37,7 @@
 
     context 'when user has enough rights' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
       end
 
       it 'adds user to members' do
@@ -106,7 +106,7 @@
     context 'when member is found' do
       context 'when user does not have enough rights' do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         it 'returns 404' do
@@ -121,7 +121,7 @@
 
       context 'when user has enough rights' do
         before do
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it '[HTML] removes user from members' do
@@ -164,7 +164,7 @@
     context 'when member is found' do
       context 'and is not an owner' do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         it 'removes user from members' do
@@ -181,7 +181,7 @@
         let(:project) { create(:project, namespace: user.namespace) }
 
         before do
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it 'does not remove himself from the project' do
@@ -248,7 +248,7 @@
     context 'when member is found' do
       context 'when user does not have enough rights' do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         it 'returns 404' do
@@ -263,7 +263,7 @@
 
       context 'when user has enough rights' do
         before do
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it 'adds user to members' do
@@ -285,8 +285,8 @@
     let(:member) { create(:user) }
 
     before do
-      project.team << [user, :master]
-      another_project.team << [member, :guest]
+      project.add_master(user)
+      another_project.add_guest(member)
       sign_in(user)
     end
 
@@ -300,7 +300,7 @@
 
     context 'when user can access source project members' do
       before do
-        another_project.team << [user, :guest]
+        another_project.add_guest(user)
       end
 
       include_context 'import applied'
@@ -332,7 +332,7 @@
 
     context 'when creating owner' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         sign_in(user)
       end
 
@@ -348,7 +348,7 @@
 
     context 'when create master' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         sign_in(user)
       end
 
diff --git a/spec/controllers/projects/refs_controller_spec.rb b/spec/controllers/projects/refs_controller_spec.rb
index 748ae040928f..ceaffd926232 100644
--- a/spec/controllers/projects/refs_controller_spec.rb
+++ b/spec/controllers/projects/refs_controller_spec.rb
@@ -6,7 +6,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   describe 'GET #logs_tree' do
diff --git a/spec/controllers/projects/releases_controller_spec.rb b/spec/controllers/projects/releases_controller_spec.rb
index 358f26dfb02b..fc1619acec6a 100644
--- a/spec/controllers/projects/releases_controller_spec.rb
+++ b/spec/controllers/projects/releases_controller_spec.rb
@@ -7,7 +7,7 @@
   let!(:tag)     { release.tag }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/projects/repositories_controller_spec.rb b/spec/controllers/projects/repositories_controller_spec.rb
index 8b777eb68ca0..04d16e989138 100644
--- a/spec/controllers/projects/repositories_controller_spec.rb
+++ b/spec/controllers/projects/repositories_controller_spec.rb
@@ -17,7 +17,7 @@
       let(:user) { create(:user) }
 
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
         sign_in(user)
       end
 
diff --git a/spec/controllers/projects/services_controller_spec.rb b/spec/controllers/projects/services_controller_spec.rb
index a907da2b60fa..2c6ad00515e6 100644
--- a/spec/controllers/projects/services_controller_spec.rb
+++ b/spec/controllers/projects/services_controller_spec.rb
@@ -9,7 +9,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe '#test' do
diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
index b8fe0f46f574..77a47f0ad130 100644
--- a/spec/controllers/projects/settings/ci_cd_controller_spec.rb
+++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/projects/settings/integrations_controller_spec.rb b/spec/controllers/projects/settings/integrations_controller_spec.rb
index 9e69596ce1d2..8eb4067171a0 100644
--- a/spec/controllers/projects/settings/integrations_controller_spec.rb
+++ b/spec/controllers/projects/settings/integrations_controller_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/projects/settings/slacks_controller_spec.rb b/spec/controllers/projects/settings/slacks_controller_spec.rb
index 4e985d9b6e67..3ce544f84a60 100644
--- a/spec/controllers/projects/settings/slacks_controller_spec.rb
+++ b/spec/controllers/projects/settings/slacks_controller_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/projects/templates_controller_spec.rb b/spec/controllers/projects/templates_controller_spec.rb
index 70e7f9ca96e8..8fcfa3c9ecd3 100644
--- a/spec/controllers/projects/templates_controller_spec.rb
+++ b/spec/controllers/projects/templates_controller_spec.rb
@@ -8,7 +8,7 @@
   let(:body) { JSON.parse(response.body) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
     sign_in(user)
   end
 
diff --git a/spec/controllers/projects/todos_controller_spec.rb b/spec/controllers/projects/todos_controller_spec.rb
index 4622e27e60f3..e2524be77246 100644
--- a/spec/controllers/projects/todos_controller_spec.rb
+++ b/spec/controllers/projects/todos_controller_spec.rb
@@ -20,7 +20,7 @@ def go
       context 'when authorized' do
         before do
           sign_in(user)
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         it 'creates todo for issue' do
@@ -88,7 +88,7 @@ def go
       context 'when authorized' do
         before do
           sign_in(user)
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         it 'creates todo for merge request' do
diff --git a/spec/controllers/projects/tree_controller_spec.rb b/spec/controllers/projects/tree_controller_spec.rb
index 65b821c94863..d3188f054cf7 100644
--- a/spec/controllers/projects/tree_controller_spec.rb
+++ b/spec/controllers/projects/tree_controller_spec.rb
@@ -7,7 +7,7 @@
   before do
     sign_in(user)
 
-    project.team << [user, :master]
+    project.add_master(user)
     controller.instance_variable_set(:@project, project)
   end
 
diff --git a/spec/controllers/projects/variables_controller_spec.rb b/spec/controllers/projects/variables_controller_spec.rb
index d065cd00d007..9fde65442153 100644
--- a/spec/controllers/projects/variables_controller_spec.rb
+++ b/spec/controllers/projects/variables_controller_spec.rb
@@ -6,7 +6,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'POST #create' do
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 7187c685310c..b67f1d10a236 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -102,7 +102,7 @@
         render_views
 
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
           project.project_feature.update_attribute(:repository_access_level, ProjectFeature::DISABLED)
         end
 
@@ -236,7 +236,7 @@
           allow_any_instance_of(EE::Project)
             .to receive(:above_size_limit?).and_return(true)
 
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it 'shows the over size limit warning message for project members' do
@@ -460,7 +460,7 @@ def update_project(**parameters)
 
     before do
       sign_in(user)
-      project.team << [user, :developer]
+      project.add_developer(user)
       allow(Gitlab.config.incoming_email).to receive(:enabled).and_return(true)
     end
 
@@ -488,7 +488,7 @@ def update_project(**parameters)
 
     before do
       sign_in(user)
-      project.team << [user, :developer]
+      project.add_developer(user)
       allow(Gitlab.config.incoming_email).to receive(:enabled).and_return(true)
     end
 
diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb
index 7e42e43345c7..b1f601a19e59 100644
--- a/spec/controllers/uploads_controller_spec.rb
+++ b/spec/controllers/uploads_controller_spec.rb
@@ -265,13 +265,13 @@
 
           context "when the user has access to the project" do
             before do
-              project.team << [user, :master]
+              project.add_master(user)
             end
 
             context "when the user is blocked" do
               before do
                 user.block
-                project.team << [user, :master]
+                project.add_master(user)
               end
 
               it "redirects to the sign in page" do
@@ -465,13 +465,13 @@
 
           context "when the user has access to the project" do
             before do
-              project.team << [user, :master]
+              project.add_master(user)
             end
 
             context "when the user is blocked" do
               before do
                 user.block
-                project.team << [user, :master]
+                project.add_master(user)
               end
 
               it "redirects to the sign in page" do
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index 01ab59aa3637..2898c4b119ec 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -91,7 +91,7 @@
 
       before do
         sign_in(user)
-        project.team << [user, :developer]
+        project.add_developer(user)
 
         push_data = Gitlab::DataBuilder::Push.build_sample(project, user)
 
@@ -117,7 +117,7 @@
       allow_any_instance_of(User).to receive(:contributed_projects_ids).and_return([project.id])
 
       sign_in(user)
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     it 'assigns @calendar_date' do
diff --git a/spec/ee/spec/controllers/projects/boards_controller_spec.rb b/spec/ee/spec/controllers/projects/boards_controller_spec.rb
index f86f2de9659f..6ac28ac1c97a 100644
--- a/spec/ee/spec/controllers/projects/boards_controller_spec.rb
+++ b/spec/ee/spec/controllers/projects/boards_controller_spec.rb
@@ -5,7 +5,7 @@
   let(:user)    { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/ee/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/ee/spec/controllers/projects/merge_requests_controller_spec.rb
index 28dd0e95a242..bd493d782f96 100644
--- a/spec/ee/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/ee/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -10,7 +10,7 @@ def json_response
 
   before do
     merge_request.update_attribute :approvals_before_merge, 2
-    project.team << [approver.user, :developer]
+    project.add_developer(approver.user)
   end
 
   describe 'approve' do
diff --git a/spec/ee/spec/features/boards/scoped_issue_board_spec.rb b/spec/ee/spec/features/boards/scoped_issue_board_spec.rb
index fcb2152ae258..15dd690b3202 100644
--- a/spec/ee/spec/features/boards/scoped_issue_board_spec.rb
+++ b/spec/ee/spec/features/boards/scoped_issue_board_spec.rb
@@ -415,7 +415,7 @@
     before do
       stub_licensed_features(scoped_issue_boards: false)
 
-      project.team << [user, :master]
+      project.add_master(user)
       login_as(user)
 
       visit project_boards_path(project)
diff --git a/spec/ee/spec/features/boards/sidebar_spec.rb b/spec/ee/spec/features/boards/sidebar_spec.rb
index 53906321e7c1..9fe14b5659fa 100644
--- a/spec/ee/spec/features/boards/sidebar_spec.rb
+++ b/spec/ee/spec/features/boards/sidebar_spec.rb
@@ -23,7 +23,7 @@
   before do
     stub_licensed_features(multiple_issue_assignees: true)
 
-    project.team << [user, :master]
+    project.add_master(user)
     project.team.add_developer(user2)
 
     gitlab_sign_in(user)
diff --git a/spec/ee/spec/features/issues/form_spec.rb b/spec/ee/spec/features/issues/form_spec.rb
index dbc6cd3472a5..b9d76ca35ce3 100644
--- a/spec/ee/spec/features/issues/form_spec.rb
+++ b/spec/ee/spec/features/issues/form_spec.rb
@@ -14,8 +14,8 @@
   let!(:issue)     { create(:issue, project: project, assignees: [user], milestone: milestone) }
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :master]
+    project.add_master(user)
+    project.add_master(user2)
 
     allow_any_instance_of(ApplicationHelper).to receive(:collapsed_sidebar?).and_return(true)
 
diff --git a/spec/ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb b/spec/ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb
index 482c856b0384..e4926afa7335 100644
--- a/spec/ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb
+++ b/spec/ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb
@@ -35,7 +35,7 @@
     let(:user2) { create(:user) }
 
     before do
-      project.team << [user2, :master]
+      project.add_master(user2)
 
       visit project_settings_repository_path(project)
     end
diff --git a/spec/ee/spec/features/projects/settings/issues_settings_spec.rb b/spec/ee/spec/features/projects/settings/issues_settings_spec.rb
index 3a3df19a1c2c..b546c6dbb220 100644
--- a/spec/ee/spec/features/projects/settings/issues_settings_spec.rb
+++ b/spec/ee/spec/features/projects/settings/issues_settings_spec.rb
@@ -8,7 +8,7 @@
 
   before do
     gitlab_sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   context 'issuable default templates feature not available' do
diff --git a/spec/ee/spec/features/projects/settings/merge_requests_settings_spec.rb b/spec/ee/spec/features/projects/settings/merge_requests_settings_spec.rb
index b77b47eaa6bc..3893787871ae 100644
--- a/spec/ee/spec/features/projects/settings/merge_requests_settings_spec.rb
+++ b/spec/ee/spec/features/projects/settings/merge_requests_settings_spec.rb
@@ -11,7 +11,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
     group.add_developer(user)
     group.add_developer(group_member)
   end
diff --git a/spec/ee/spec/features/projects/settings/push_rules_settings_spec.rb b/spec/ee/spec/features/projects/settings/push_rules_settings_spec.rb
index 7f085e73ac57..7cdbddf372a5 100644
--- a/spec/ee/spec/features/projects/settings/push_rules_settings_spec.rb
+++ b/spec/ee/spec/features/projects/settings/push_rules_settings_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project_empty_repo) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/ee/spec/features/variables_spec.rb b/spec/ee/spec/features/variables_spec.rb
index bf862b06c6c2..55f723f6ab0a 100644
--- a/spec/ee/spec/features/variables_spec.rb
+++ b/spec/ee/spec/features/variables_spec.rb
@@ -12,7 +12,7 @@
       variable_environment_scope: variable_environment_scope)
 
     login_as(user)
-    project.team << [user, :master]
+    project.add_master(user)
     project.variables << variable
 
     visit project_settings_ci_cd_path(project)
diff --git a/spec/ee/spec/requests/api/issues_spec.rb b/spec/ee/spec/requests/api/issues_spec.rb
index 36ab9497efa1..248f5c125094 100644
--- a/spec/ee/spec/requests/api/issues_spec.rb
+++ b/spec/ee/spec/requests/api/issues_spec.rb
@@ -25,7 +25,7 @@
   set(:milestone) { create(:milestone, title: '1.0.0', project: project) }
 
   before(:all) do
-    project.team << [user, :reporter]
+    project.add_reporter(user)
   end
 
   describe "GET /issues" do
diff --git a/spec/ee/spec/services/ee/issues/build_service_spec.rb b/spec/ee/spec/services/ee/issues/build_service_spec.rb
index 8337c566120b..75e08e65119c 100644
--- a/spec/ee/spec/services/ee/issues/build_service_spec.rb
+++ b/spec/ee/spec/services/ee/issues/build_service_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   context 'with an issue template' do
diff --git a/spec/ee/spec/services/issue_links/create_service_spec.rb b/spec/ee/spec/services/issue_links/create_service_spec.rb
index 78a6bdd2f589..a8655a8beb34 100644
--- a/spec/ee/spec/services/issue_links/create_service_spec.rb
+++ b/spec/ee/spec/services/issue_links/create_service_spec.rb
@@ -13,7 +13,7 @@
     before do
       stub_licensed_features(related_issues: true)
 
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     subject { described_class.new(issue, user, params).execute }
@@ -89,7 +89,7 @@
       end
 
       before do
-        another_project.team << [user, :developer]
+        another_project.add_developer(user)
       end
 
       it 'creates relationships' do
diff --git a/spec/ee/spec/services/issue_links/list_service_spec.rb b/spec/ee/spec/services/issue_links/list_service_spec.rb
index 546ad33ad994..3d629ad03445 100644
--- a/spec/ee/spec/services/issue_links/list_service_spec.rb
+++ b/spec/ee/spec/services/issue_links/list_service_spec.rb
@@ -9,7 +9,7 @@
   before do
     stub_licensed_features(related_issues: true)
 
-    project.team << [user, user_role]
+    project.add_role(user, user_role)
   end
 
   describe '#execute' do
diff --git a/spec/ee/support/protected_tags/access_control_spec.rb b/spec/ee/support/protected_tags/access_control_spec.rb
index d7913a7b8125..a6f2b6b05716 100644
--- a/spec/ee/support/protected_tags/access_control_spec.rb
+++ b/spec/ee/support/protected_tags/access_control_spec.rb
@@ -4,7 +4,7 @@
   let(:roles) { ProtectedRefAccess::HUMAN_ACCESS_LEVELS.except(0) }
 
   before do
-    users.each { |user| project.team << [user, :developer] }
+    users.each { |user| project.add_developer(user) }
     groups.each { |group| project.project_group_links.create(group: group, group_access: Gitlab::Access::DEVELOPER) }
   end
 
@@ -74,7 +74,7 @@ def access_levels
 
   it "prepends selected users that can create" do
     users = create_list(:user, 21)
-    users.each { |user| project.team << [user, :developer] }
+    users.each { |user| project.add_developer(user) }
 
     visit project_protected_tags_path(project)
 
diff --git a/spec/ee/support/shared_examples/features/protected_branches_access_control.rb b/spec/ee/support/shared_examples/features/protected_branches_access_control.rb
index a78093deda83..d19b40a37e43 100644
--- a/spec/ee/support/shared_examples/features/protected_branches_access_control.rb
+++ b/spec/ee/support/shared_examples/features/protected_branches_access_control.rb
@@ -8,7 +8,7 @@
     let(:groups) { create_list(:group, 5) }
 
     before do
-      users.each { |user| project.team << [user, :developer] }
+      users.each { |user| project.add_developer(user) }
       groups.each { |group| project.project_group_links.create(group: group, group_access: Gitlab::Access::DEVELOPER) }
     end
 
@@ -83,7 +83,7 @@ def last_access_levels(git_operation)
 
     it "prepends selected users that can #{git_operation} to" do
       users = create_list(:user, 21)
-      users.each { |user| project.team << [user, :developer] }
+      users.each { |user| project.add_developer(user) }
 
       visit project_protected_branches_path(project)
 
diff --git a/spec/elastic_integration/global_search_spec.rb b/spec/elastic_integration/global_search_spec.rb
index 88a932aba3b7..63ff8a9c71a9 100644
--- a/spec/elastic_integration/global_search_spec.rb
+++ b/spec/elastic_integration/global_search_spec.rb
@@ -14,9 +14,9 @@
     stub_application_setting(elasticsearch_search: true, elasticsearch_indexing: true)
     Gitlab::Elastic::Helper.create_empty_index
 
-    project.team << [member, :developer]
-    project.team << [external_member, :developer]
-    project.team << [guest, :guest]
+    project.add_developer(member)
+    project.add_developer(external_member)
+    project.add_guest(guest)
   end
 
   after do
diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb
index 94b12105088c..d02ac6c2e2a6 100644
--- a/spec/features/admin/admin_projects_spec.rb
+++ b/spec/features/admin/admin_projects_spec.rb
@@ -88,7 +88,7 @@
 
   describe 'add admin himself to a project' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     it 'adds admin a to a project as developer', :js do
@@ -110,8 +110,8 @@
 
   describe 'admin remove himself from a project' do
     before do
-      project.team << [user, :master]
-      project.team << [current_user, :developer]
+      project.add_master(user)
+      project.add_developer(current_user)
     end
 
     it 'removes admin from the project' do
diff --git a/spec/features/atom/dashboard_issues_spec.rb b/spec/features/atom/dashboard_issues_spec.rb
index 89c9d3770034..d673bac49951 100644
--- a/spec/features/atom/dashboard_issues_spec.rb
+++ b/spec/features/atom/dashboard_issues_spec.rb
@@ -8,8 +8,8 @@
     let!(:project2) { create(:project) }
 
     before do
-      project1.team << [user, :master]
-      project2.team << [user, :master]
+      project1.add_master(user)
+      project2.add_master(user)
     end
 
     describe "atom feed" do
diff --git a/spec/features/atom/dashboard_spec.rb b/spec/features/atom/dashboard_spec.rb
index 2c0c331b6db7..c6683bb3bc9b 100644
--- a/spec/features/atom/dashboard_spec.rb
+++ b/spec/features/atom/dashboard_spec.rb
@@ -26,7 +26,7 @@
       let(:note) { create(:note, noteable: issue, author: user, note: 'Bug confirmed', project: project) }
 
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         issue_event(issue, user)
         note_event(note, user)
         visit dashboard_projects_path(:atom, rss_token: user.rss_token)
diff --git a/spec/features/atom/issues_spec.rb b/spec/features/atom/issues_spec.rb
index 4102ac0588a9..525ce23aa56a 100644
--- a/spec/features/atom/issues_spec.rb
+++ b/spec/features/atom/issues_spec.rb
@@ -9,7 +9,7 @@
     let!(:issue)    { create(:issue, author: user, assignees: [assignee], project: project) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       group.add_developer(user)
     end
 
diff --git a/spec/features/atom/users_spec.rb b/spec/features/atom/users_spec.rb
index 2b934d816741..782f42aab04d 100644
--- a/spec/features/atom/users_spec.rb
+++ b/spec/features/atom/users_spec.rb
@@ -47,7 +47,7 @@
       let!(:push_event_payload) { create(:push_event_payload, event: push_event) }
 
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         issue_event(issue, user)
         note_event(note, user)
         merge_request_event(merge_request, user)
diff --git a/spec/features/auto_deploy_spec.rb b/spec/features/auto_deploy_spec.rb
index 7a395f625112..9aef68b7156a 100644
--- a/spec/features/auto_deploy_spec.rb
+++ b/spec/features/auto_deploy_spec.rb
@@ -52,7 +52,7 @@
   context 'when user configured kubernetes from Integration > Kubernetes' do
     before do
       create :kubernetes_service, project: project
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
     end
 
@@ -65,7 +65,7 @@
   context 'when user configured kubernetes from CI/CD > Clusters' do
     before do
       create(:cluster, :provided_by_gcp, projects: [project])
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
     end
 
diff --git a/spec/features/boards/add_issues_modal_spec.rb b/spec/features/boards/add_issues_modal_spec.rb
index ad46afddd493..82fcbeda31bf 100644
--- a/spec/features/boards/add_issues_modal_spec.rb
+++ b/spec/features/boards/add_issues_modal_spec.rb
@@ -12,7 +12,7 @@
   let!(:issue2) { create(:issue, project: project, title: 'hij', description: 'klm') }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in(user)
 
diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb
index 9e4d6452bc45..d40bd6ffc968 100644
--- a/spec/features/boards/boards_spec.rb
+++ b/spec/features/boards/boards_spec.rb
@@ -13,8 +13,8 @@
   let!(:user2)  { create(:user) }
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :master]
+    project.add_master(user)
+    project.add_master(user2)
 
     set_cookie('sidebar_collapsed', 'true')
 
@@ -569,7 +569,7 @@
     let(:user_guest) { create(:user) }
 
     before do
-      project.team << [user_guest, :guest]
+      project.add_guest(user_guest)
       sign_out(:user)
       sign_in(user_guest)
       visit project_board_path(project, board)
diff --git a/spec/features/boards/issue_ordering_spec.rb b/spec/features/boards/issue_ordering_spec.rb
index 4cbb48e2e6ec..5abd02dbb487 100644
--- a/spec/features/boards/issue_ordering_spec.rb
+++ b/spec/features/boards/issue_ordering_spec.rb
@@ -13,7 +13,7 @@
   let!(:issue3) { create(:labeled_issue, project: project, title: 'testing 3', labels: [label], relative_position: 1) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in(user)
   end
diff --git a/spec/features/boards/modal_filter_spec.rb b/spec/features/boards/modal_filter_spec.rb
index 422d96175f71..5907bb0840f7 100644
--- a/spec/features/boards/modal_filter_spec.rb
+++ b/spec/features/boards/modal_filter_spec.rb
@@ -10,7 +10,7 @@
   let!(:issue1) { create(:issue, project: project) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in(user)
   end
@@ -76,7 +76,7 @@
     let!(:issue) { create(:issue, project: project, author: user2) }
 
     before do
-      project.team << [user2, :developer]
+      project.add_developer(user2)
 
       visit_board
     end
@@ -99,7 +99,7 @@
     let!(:issue) { create(:issue, project: project, assignees: [user2]) }
 
     before do
-      project.team << [user2, :developer]
+      project.add_developer(user2)
 
       visit_board
     end
diff --git a/spec/features/boards/multiple_boards_spec.rb b/spec/features/boards/multiple_boards_spec.rb
index 6a36ef0734ee..210d790ff422 100644
--- a/spec/features/boards/multiple_boards_spec.rb
+++ b/spec/features/boards/multiple_boards_spec.rb
@@ -14,7 +14,7 @@
 
     context 'authorized user' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
 
         login_as(user)
 
@@ -151,7 +151,7 @@
   context 'with multiple issue boards disabled' do
     before do
       stub_licensed_features(multiple_issue_boards: false)
-      project.team << [user, :master]
+      project.add_master(user)
 
       login_as(user)
     end
diff --git a/spec/features/boards/new_issue_spec.rb b/spec/features/boards/new_issue_spec.rb
index 5ac4d87e90bb..6769acb7c9c3 100644
--- a/spec/features/boards/new_issue_spec.rb
+++ b/spec/features/boards/new_issue_spec.rb
@@ -8,7 +8,7 @@
 
   context 'authorized user' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
 
       sign_in(user)
 
diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb
index 77dcdf89f377..a28b8905b65b 100644
--- a/spec/features/commits_spec.rb
+++ b/spec/features/commits_spec.rb
@@ -26,7 +26,7 @@
       let!(:status) { create(:generic_commit_status, pipeline: pipeline) }
 
       before do
-        project.team << [user, :reporter]
+        project.add_reporter(user)
       end
 
       describe 'Commit builds' do
@@ -51,7 +51,7 @@
 
       context 'when logged as developer' do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         describe 'Project commits' do
@@ -145,7 +145,7 @@
 
       context "when logged as reporter" do
         before do
-          project.team << [user, :reporter]
+          project.add_reporter(user)
           build.update_attributes(legacy_artifacts_file: artifacts_file)
           visit pipeline_path(pipeline)
         end
@@ -188,7 +188,7 @@
     let(:branch_name) { 'master' }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
       visit project_commits_path(project, branch_name)
     end
diff --git a/spec/features/cycle_analytics_spec.rb b/spec/features/cycle_analytics_spec.rb
index 177cd50dd72a..d36954954b6d 100644
--- a/spec/features/cycle_analytics_spec.rb
+++ b/spec/features/cycle_analytics_spec.rb
@@ -95,7 +95,7 @@
       before do
         user.update_attribute(:preferred_language, 'es')
 
-        project.team << [user, :master]
+        project.add_master(user)
         sign_in(user)
         visit project_cycle_analytics_path(project)
         wait_for_requests
diff --git a/spec/features/dashboard/archived_projects_spec.rb b/spec/features/dashboard/archived_projects_spec.rb
index e8d699ff5e0f..b36231fd78b0 100644
--- a/spec/features/dashboard/archived_projects_spec.rb
+++ b/spec/features/dashboard/archived_projects_spec.rb
@@ -6,8 +6,8 @@
   let(:archived_project) { create(:project, :archived) }
 
   before do
-    project.team << [user, :master]
-    archived_project.team << [user, :master]
+    project.add_master(user)
+    archived_project.add_master(user)
 
     sign_in(user)
 
diff --git a/spec/features/dashboard/datetime_on_tooltips_spec.rb b/spec/features/dashboard/datetime_on_tooltips_spec.rb
index 349f9a471125..089c388636d7 100644
--- a/spec/features/dashboard/datetime_on_tooltips_spec.rb
+++ b/spec/features/dashboard/datetime_on_tooltips_spec.rb
@@ -8,7 +8,7 @@
 
   context 'on the activity tab' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
 
       Event.create( project: project, author_id: user.id, action: Event::JOINED,
                     updated_at: created_date, created_at: created_date)
@@ -27,7 +27,7 @@
 
   context 'on the snippets tab' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       create(:snippet, author: user, updated_at: created_date, created_at: created_date)
 
       sign_in user
diff --git a/spec/features/dashboard/issues_spec.rb b/spec/features/dashboard/issues_spec.rb
index 5b4c00b3c7ea..54652e2d8495 100644
--- a/spec/features/dashboard/issues_spec.rb
+++ b/spec/features/dashboard/issues_spec.rb
@@ -12,7 +12,7 @@
   let!(:other_issue) { create :issue, project: project }
 
   before do
-    [project, project_with_issues_disabled].each { |project| project.team << [current_user, :master] }
+    [project, project_with_issues_disabled].each { |project| project.add_master(current_user) }
     sign_in(current_user)
     visit issues_dashboard_path(assignee_id: current_user.id)
   end
diff --git a/spec/features/dashboard/milestones_spec.rb b/spec/features/dashboard/milestones_spec.rb
index 41d37376cfbe..7787772a9582 100644
--- a/spec/features/dashboard/milestones_spec.rb
+++ b/spec/features/dashboard/milestones_spec.rb
@@ -16,7 +16,7 @@
     let(:project) { create(:project, namespace: user.namespace) }
     let!(:milestone) { create(:milestone, project: project) }
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
       visit dashboard_milestones_path
     end
diff --git a/spec/features/dashboard/project_member_activity_index_spec.rb b/spec/features/dashboard/project_member_activity_index_spec.rb
index 8f96899fb4f0..6c3093607b0b 100644
--- a/spec/features/dashboard/project_member_activity_index_spec.rb
+++ b/spec/features/dashboard/project_member_activity_index_spec.rb
@@ -5,7 +5,7 @@
   let(:project)         { create(:project, :public, name: 'x', namespace: user.namespace) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   def visit_activities_and_wait_with_event(event_type)
diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb
index fbf8b5c0db6f..586c7b48d0b1 100644
--- a/spec/features/dashboard/projects_spec.rb
+++ b/spec/features/dashboard/projects_spec.rb
@@ -6,7 +6,7 @@
   let(:project2) { create(:project, :public, name: 'Community project') }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
     sign_in(user)
   end
 
diff --git a/spec/features/dashboard/todos/todos_filtering_spec.rb b/spec/features/dashboard/todos/todos_filtering_spec.rb
index ad0f132da8cf..2fc34301d518 100644
--- a/spec/features/dashboard/todos/todos_filtering_spec.rb
+++ b/spec/features/dashboard/todos/todos_filtering_spec.rb
@@ -15,8 +15,8 @@
     create(:todo, user: user_1, author: user_2, project: project_1, target: issue, action: 1)
     create(:todo, user: user_1, author: user_1, project: project_2, target: merge_request, action: 2)
 
-    project_1.team << [user_1, :developer]
-    project_2.team << [user_1, :developer]
+    project_1.add_developer(user_1)
+    project_2.add_developer(user_1)
     sign_in(user_1)
     visit dashboard_todos_path
   end
@@ -66,8 +66,8 @@
       create(:todo, user: user_1, author: user_3, project: project_1, target: issue, action: 1, state: :done)
       create(:todo, user: user_1, author: user_4, project: project_2, target: merge_request, action: 2, state: :done)
 
-      project_1.team << [user_3, :developer]
-      project_2.team << [user_4, :developer]
+      project_1.add_developer(user_3)
+      project_2.add_developer(user_4)
 
       visit dashboard_todos_path(state: 'done')
 
diff --git a/spec/features/dashboard/todos/todos_sorting_spec.rb b/spec/features/dashboard/todos/todos_sorting_spec.rb
index b7d39a872b02..10e3ad843fd5 100644
--- a/spec/features/dashboard/todos/todos_sorting_spec.rb
+++ b/spec/features/dashboard/todos/todos_sorting_spec.rb
@@ -9,7 +9,7 @@
   let(:label_3) { create(:label, title: 'label_3', project: project, priority: 3) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   context 'sort options' do
diff --git a/spec/features/dashboard/user_filters_projects_spec.rb b/spec/features/dashboard/user_filters_projects_spec.rb
index c352b6ded141..92f4d4b854c5 100644
--- a/spec/features/dashboard/user_filters_projects_spec.rb
+++ b/spec/features/dashboard/user_filters_projects_spec.rb
@@ -7,14 +7,14 @@
   let(:project2) { create(:project, name: 'Treasure', namespace: user2.namespace) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in(user)
   end
 
   describe 'filtering personal projects' do
     before do
-      project2.team << [user, :developer]
+      project2.add_developer(user)
 
       visit dashboard_projects_path
     end
diff --git a/spec/features/es_global_search_spec.rb b/spec/features/es_global_search_spec.rb
index 8504191ef6f1..ee69a1649cff 100644
--- a/spec/features/es_global_search_spec.rb
+++ b/spec/features/es_global_search_spec.rb
@@ -8,7 +8,7 @@
     stub_application_setting(elasticsearch_search: true, elasticsearch_indexing: true)
     Gitlab::Elastic::Helper.create_empty_index
 
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/es_group_search_spec.rb b/spec/features/es_group_search_spec.rb
index a143c34288bf..090e5da978a2 100644
--- a/spec/features/es_group_search_spec.rb
+++ b/spec/features/es_group_search_spec.rb
@@ -18,7 +18,7 @@ def choose_group(group)
     stub_application_setting(elasticsearch_search: true, elasticsearch_indexing: true)
     Gitlab::Elastic::Helper.create_empty_index
 
-    project.team << [user, :master]
+    project.add_master(user)
     group.add_owner(user)
 
     sign_in(user)
diff --git a/spec/features/global_search_spec.rb b/spec/features/global_search_spec.rb
index f04e13adba7b..4f5756138485 100644
--- a/spec/features/global_search_spec.rb
+++ b/spec/features/global_search_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project, namespace: user.namespace) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/issues/award_emoji_spec.rb b/spec/features/issues/award_emoji_spec.rb
index 850b35c4467f..1131e1711bf2 100644
--- a/spec/features/issues/award_emoji_spec.rb
+++ b/spec/features/issues/award_emoji_spec.rb
@@ -11,7 +11,7 @@
 
   context 'authorized user' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
diff --git a/spec/features/issues/bulk_assignment_labels_spec.rb b/spec/features/issues/bulk_assignment_labels_spec.rb
index fa4d3a55c622..587ece22ec74 100644
--- a/spec/features/issues/bulk_assignment_labels_spec.rb
+++ b/spec/features/issues/bulk_assignment_labels_spec.rb
@@ -11,7 +11,7 @@
 
   context 'as an allowed user', :js do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
 
       sign_in user
     end
diff --git a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
index 822ba48e005a..e0466aaf4226 100644
--- a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
+++ b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
@@ -8,7 +8,7 @@
 
   describe 'as a user with access to the project' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
       visit project_merge_request_path(project, merge_request)
     end
@@ -81,7 +81,7 @@
 
   describe 'as a reporter' do
     before do
-      project.team << [user, :reporter]
+      project.add_reporter(user)
       sign_in user
       visit new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid)
     end
diff --git a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb
index f0bed85595c4..34beb282bad9 100644
--- a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb
+++ b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb
@@ -8,7 +8,7 @@
 
   describe 'As a user with access to the project' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
       visit project_merge_request_path(project, merge_request)
     end
@@ -65,7 +65,7 @@
 
   describe 'as a reporter' do
     before do
-      project.team << [user, :reporter]
+      project.add_reporter(user)
       sign_in user
       visit new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid,
                                             discussion_to_resolve: discussion.id)
diff --git a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
index 2e4a25ee15d7..cbd0949c192a 100644
--- a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
@@ -20,9 +20,9 @@ def click_assignee(text)
   end
 
   before do
-    project.team << [user, :master]
-    project.team << [user_john, :master]
-    project.team << [user_jacob, :master]
+    project.add_master(user)
+    project.add_master(user_john)
+    project.add_master(user_jacob)
     sign_in(user)
     create(:issue, project: project)
 
@@ -222,7 +222,7 @@ def click_assignee(text)
       expect(initial_size).to be > 0
 
       new_user = create(:user)
-      project.team << [new_user, :master]
+      project.add_master(new_user)
       find('.filtered-search-box .clear-search').click
       filtered_search.set('assignee')
       filtered_search.send_keys(':')
diff --git a/spec/features/issues/filtered_search/dropdown_author_spec.rb b/spec/features/issues/filtered_search/dropdown_author_spec.rb
index 2fb5e7cdba4a..70b4f11410da 100644
--- a/spec/features/issues/filtered_search/dropdown_author_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_author_spec.rb
@@ -28,9 +28,9 @@ def click_author(text)
   end
 
   before do
-    project.team << [user, :master]
-    project.team << [user_john, :master]
-    project.team << [user_jacob, :master]
+    project.add_master(user)
+    project.add_master(user_john)
+    project.add_master(user_jacob)
     sign_in(user)
     create(:issue, project: project)
 
@@ -195,7 +195,7 @@ def click_author(text)
       expect(initial_size).to be > 0
 
       new_user = create(:user)
-      project.team << [new_user, :master]
+      project.add_master(new_user)
       find('.filtered-search-box .clear-search').click
       filtered_search.set('author')
       send_keys_to_filtered_search(':')
diff --git a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
index 8db435634fd4..436625a6f7bc 100644
--- a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
@@ -28,7 +28,7 @@ def click_emoji(text)
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     create_list(:award_emoji, 2, user: user, name: 'thumbsup')
     create_list(:award_emoji, 1, user: user, name: 'thumbsdown')
     create_list(:award_emoji, 3, user: user, name: 'star')
diff --git a/spec/features/issues/filtered_search/dropdown_hint_spec.rb b/spec/features/issues/filtered_search/dropdown_hint_spec.rb
index 0183495a1dbe..18ae45aa3404 100644
--- a/spec/features/issues/filtered_search/dropdown_hint_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_hint_spec.rb
@@ -13,7 +13,7 @@ def click_hint(text)
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     create(:issue, project: project)
   end
 
diff --git a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
index 031eb06723a1..94710c2f71fd 100644
--- a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
@@ -29,7 +29,7 @@ def click_static_milestone(text)
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     create(:issue, project: project)
 
diff --git a/spec/features/issues/filtered_search/dropdown_weight_spec.rb b/spec/features/issues/filtered_search/dropdown_weight_spec.rb
index eaf05c701d11..cc15db2e340e 100644
--- a/spec/features/issues/filtered_search/dropdown_weight_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_weight_spec.rb
@@ -25,7 +25,7 @@ def click_static_weight(text)
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     create(:issue, project: project)
 
diff --git a/spec/features/issues/filtered_search/filter_issues_weight_spec.rb b/spec/features/issues/filtered_search/filter_issues_weight_spec.rb
index dfedac931fec..0aafc104f094 100644
--- a/spec/features/issues/filtered_search/filter_issues_weight_spec.rb
+++ b/spec/features/issues/filtered_search/filter_issues_weight_spec.rb
@@ -17,7 +17,7 @@ def expect_issues_list_count(open_count, closed_count = 0)
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
 
     label = create(:label, project: project, title: 'urgent')
diff --git a/spec/features/issues/filtered_search/search_bar_spec.rb b/spec/features/issues/filtered_search/search_bar_spec.rb
index bb1350a2adbd..d40b2129877a 100644
--- a/spec/features/issues/filtered_search/search_bar_spec.rb
+++ b/spec/features/issues/filtered_search/search_bar_spec.rb
@@ -8,7 +8,7 @@
   let(:filtered_search) { find('.filtered-search') }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     create(:issue, project: project)
 
diff --git a/spec/features/issues/form_spec.rb b/spec/features/issues/form_spec.rb
index 0afd5226f1b0..107ffa3d0e3c 100644
--- a/spec/features/issues/form_spec.rb
+++ b/spec/features/issues/form_spec.rb
@@ -15,8 +15,8 @@
   before do
     stub_licensed_features(multiple_issue_assignees: false, issue_weights: false)
 
-    project.team << [user, :master]
-    project.team << [user2, :master]
+    project.add_master(user)
+    project.add_master(user2)
     sign_in(user)
   end
 
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb
index 6a9a80235c11..f2624f55c86a 100644
--- a/spec/features/issues/gfm_autocomplete_spec.rb
+++ b/spec/features/issues/gfm_autocomplete_spec.rb
@@ -7,7 +7,7 @@
   let(:issue)   { create(:issue, project: project) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit project_issue_path(project, issue)
 
diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb
index 0660b7739672..da04e37a68ed 100644
--- a/spec/features/issues/issue_sidebar_spec.rb
+++ b/spec/features/issues/issue_sidebar_spec.rb
@@ -18,7 +18,7 @@
     let(:issue2) { create(:issue, project: project, author: user2) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       visit_issue(project, issue2)
 
       find('.block.assignee .edit-link').click
@@ -78,7 +78,7 @@
 
   context 'as a allowed user' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       visit_issue(project, issue)
     end
 
@@ -156,7 +156,7 @@
 
   context 'as a guest' do
     before do
-      project.team << [user, :guest]
+      project.add_guest(user)
       visit_issue(project, issue)
     end
 
@@ -167,7 +167,7 @@
 
   context 'updating weight', :js do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       visit_issue(project, issue)
     end
 
diff --git a/spec/features/issues/move_spec.rb b/spec/features/issues/move_spec.rb
index 17035b5501c8..076a02150a40 100644
--- a/spec/features/issues/move_spec.rb
+++ b/spec/features/issues/move_spec.rb
@@ -13,7 +13,7 @@
 
   context 'user does not have permission to move issue' do
     background do
-      old_project.team << [user, :guest]
+      old_project.add_guest(user)
 
       visit issue_path(issue)
     end
@@ -31,8 +31,8 @@
     let(:cross_reference) { old_project.to_reference(new_project) }
 
     background do
-      old_project.team << [user, :reporter]
-      new_project.team << [user, :reporter]
+      old_project.add_reporter(user)
+      new_project.add_reporter(user)
 
       visit issue_path(issue)
     end
@@ -50,7 +50,7 @@
     end
 
     scenario 'searching project dropdown', :js do
-      new_project_search.team << [user, :reporter]
+      new_project_search.add_reporter(user)
 
       find('.js-move-issue').click
       wait_for_requests
@@ -66,7 +66,7 @@
     context 'user does not have permission to move the issue to a project', :js do
       let!(:private_project) { create(:project, :private) }
       let(:another_project) { create(:project) }
-      background { another_project.team << [user, :guest] }
+      background { another_project.add_guest(user) }
 
       scenario 'browsing projects in projects select' do
         find('.js-move-issue').click
diff --git a/spec/features/issues/notes_on_issues_spec.rb b/spec/features/issues/notes_on_issues_spec.rb
index 05c93a19253f..f08c73f947cb 100644
--- a/spec/features/issues/notes_on_issues_spec.rb
+++ b/spec/features/issues/notes_on_issues_spec.rb
@@ -8,7 +8,7 @@
     let(:note_text) { "Check #{mention.to_reference}" }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       sign_in(user)
       visit project_issue_path(project, issue)
 
diff --git a/spec/features/issues/spam_issues_spec.rb b/spec/features/issues/spam_issues_spec.rb
index d25231d624c5..53706ef84bca 100644
--- a/spec/features/issues/spam_issues_spec.rb
+++ b/spec/features/issues/spam_issues_spec.rb
@@ -17,7 +17,7 @@
       recaptcha_private_key: 'test private key'
     )
 
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/issues/todo_spec.rb b/spec/features/issues/todo_spec.rb
index 29a2d38ae182..8e6493bbd930 100644
--- a/spec/features/issues/todo_spec.rb
+++ b/spec/features/issues/todo_spec.rb
@@ -6,7 +6,7 @@
   let!(:user)    { create(:user)}
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit project_issue_path(project, issue)
   end
diff --git a/spec/features/issues/update_issues_spec.rb b/spec/features/issues/update_issues_spec.rb
index bcc6e9bab0f6..7d6edc171f8e 100644
--- a/spec/features/issues/update_issues_spec.rb
+++ b/spec/features/issues/update_issues_spec.rb
@@ -6,7 +6,7 @@
   let!(:user)      { create(:user)}
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/issues/user_uses_slash_commands_spec.rb b/spec/features/issues/user_uses_slash_commands_spec.rb
index b0babf005866..0365ed90e17a 100644
--- a/spec/features/issues/user_uses_slash_commands_spec.rb
+++ b/spec/features/issues/user_uses_slash_commands_spec.rb
@@ -12,7 +12,7 @@
     let(:project) { create(:project, :public) }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
       visit project_issue_path(project, issue)
     end
@@ -50,7 +50,7 @@
       context 'when the current user cannot update the due date' do
         let(:guest) { create(:user) }
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
           gitlab_sign_out
           sign_in(guest)
           visit project_issue_path(project, issue)
@@ -90,7 +90,7 @@
       context 'when the current user cannot update the due date' do
         let(:guest) { create(:user) }
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
           gitlab_sign_out
           sign_in(guest)
           visit project_issue_path(project, issue)
@@ -138,7 +138,7 @@
       context 'when the current user cannot update the weight' do
         let(:guest) { create(:user) }
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
           gitlab_sign_out
           sign_in(guest)
           visit project_issue_path(project, issue)
@@ -176,7 +176,7 @@
       context 'when the current user cannot update the weight' do
         let(:guest) { create(:user) }
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
           gitlab_sign_out
           sign_in(guest)
           visit project_issue_path(project, issue)
@@ -214,7 +214,7 @@
       context 'when the current user cannot update the issue' do
         let(:guest) { create(:user) }
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
           gitlab_sign_out
           sign_in(guest)
           visit project_issue_path(project, issue)
@@ -239,7 +239,7 @@
         let(:target_project) { create(:project, :public) }
 
         before do
-          target_project.team << [user, :master]
+          target_project.add_master(user)
           sign_in(user)
           visit project_issue_path(project, issue)
         end
@@ -296,7 +296,7 @@
         let(:wontfix_target)  { create(:label, project: target_project, title: 'wontfix') }
 
         before do
-          target_project.team << [user, :master]
+          target_project.add_master(user)
           sign_in(user)
           visit project_issue_path(project, issue)
         end
diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb
index 2d84b5ff5379..7b744555c338 100644
--- a/spec/features/issues_spec.rb
+++ b/spec/features/issues_spec.rb
@@ -25,7 +25,8 @@
       sign_in(user)
       user2 = create(:user)
 
-      project.team << [[user, user2], :developer]
+      project.add_developer(user)
+      project.add_developer(user2)
     end
 
     describe 'empty state' do
@@ -394,7 +395,7 @@
 
       before do
         stub_incoming_email_setting(enabled: true, address: "p+%{key}@gl.ab")
-        project1.team << [user, :master]
+        project1.add_master(user)
         visit namespace_project_issues_path(user.namespace, project1)
       end
 
@@ -506,7 +507,7 @@
         let(:guest) { create(:user) }
 
         before do
-          project.team << [[guest], :guest]
+          project.add_guest(guest)
         end
 
         it 'shows assignee text', :js do
@@ -588,7 +589,7 @@
         let(:guest) { create(:user) }
 
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
           issue.milestone = milestone
           issue.save
         end
diff --git a/spec/features/merge_requests/assign_issues_spec.rb b/spec/features/merge_requests/assign_issues_spec.rb
index d49d145f2546..b2d64a62b4fb 100644
--- a/spec/features/merge_requests/assign_issues_spec.rb
+++ b/spec/features/merge_requests/assign_issues_spec.rb
@@ -9,7 +9,7 @@
   let(:service) { MergeRequests::AssignIssuesService.new(merge_request, user, user, project) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   def visit_merge_request(current_user = nil)
diff --git a/spec/features/merge_requests/check_if_mergeable_with_unresolved_discussions_spec.rb b/spec/features/merge_requests/check_if_mergeable_with_unresolved_discussions_spec.rb
index fbbfe7942be0..892c32c88062 100644
--- a/spec/features/merge_requests/check_if_mergeable_with_unresolved_discussions_spec.rb
+++ b/spec/features/merge_requests/check_if_mergeable_with_unresolved_discussions_spec.rb
@@ -7,7 +7,7 @@
 
   before do
     sign_in user
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   context 'when project.only_allow_merge_if_all_discussions_are_resolved == true' do
diff --git a/spec/features/merge_requests/cherry_pick_spec.rb b/spec/features/merge_requests/cherry_pick_spec.rb
index 48f370c3ad4f..205e38337d10 100644
--- a/spec/features/merge_requests/cherry_pick_spec.rb
+++ b/spec/features/merge_requests/cherry_pick_spec.rb
@@ -8,7 +8,7 @@
 
   before do
     sign_in user
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   context "Viewing a merged merge request" do
diff --git a/spec/features/merge_requests/closes_issues_spec.rb b/spec/features/merge_requests/closes_issues_spec.rb
index 73d4c43e66f6..910a1ae06e21 100644
--- a/spec/features/merge_requests/closes_issues_spec.rb
+++ b/spec/features/merge_requests/closes_issues_spec.rb
@@ -18,7 +18,7 @@
   let(:merge_request_title) { 'Merge Request Title' }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in user
 
@@ -78,7 +78,7 @@
 
   context 'approvals are enabled while closing issues', :js do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     let(:project) { create(:project, :public, :repository, approvals_before_merge: 1) }
diff --git a/spec/features/merge_requests/conflicts_spec.rb b/spec/features/merge_requests/conflicts_spec.rb
index 4e2963c116d8..05d99a2dff26 100644
--- a/spec/features/merge_requests/conflicts_spec.rb
+++ b/spec/features/merge_requests/conflicts_spec.rb
@@ -88,7 +88,7 @@ def create_merge_request(source_branch)
 
   context 'can be resolved in the UI' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       sign_in(user)
     end
 
@@ -175,7 +175,7 @@ def create_merge_request(source_branch)
       let(:merge_request) { create_merge_request(source_branch) }
 
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
         sign_in(user)
 
         visit project_merge_request_path(project, merge_request)
diff --git a/spec/features/merge_requests/create_new_mr_spec.rb b/spec/features/merge_requests/create_new_mr_spec.rb
index 50518dfa6558..86e25d624a26 100644
--- a/spec/features/merge_requests/create_new_mr_spec.rb
+++ b/spec/features/merge_requests/create_new_mr_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project, :public, :repository) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in user
   end
diff --git a/spec/features/merge_requests/created_from_fork_spec.rb b/spec/features/merge_requests/created_from_fork_spec.rb
index ca2225318cd0..53b62caf7436 100644
--- a/spec/features/merge_requests/created_from_fork_spec.rb
+++ b/spec/features/merge_requests/created_from_fork_spec.rb
@@ -14,7 +14,7 @@
   end
 
   background do
-    forked_project.team << [user, :master]
+    forked_project.add_master(user)
     sign_in user
   end
 
diff --git a/spec/features/merge_requests/deleted_source_branch_spec.rb b/spec/features/merge_requests/deleted_source_branch_spec.rb
index 7883cef45be7..6d0526bca852 100644
--- a/spec/features/merge_requests/deleted_source_branch_spec.rb
+++ b/spec/features/merge_requests/deleted_source_branch_spec.rb
@@ -9,7 +9,7 @@
 
   before do
     sign_in user
-    merge_request.project.team << [user, :master]
+    merge_request.project.add_master(user)
     merge_request.update!(source_branch: 'this-branch-does-not-exist')
     visit project_merge_request_path(merge_request.project, merge_request)
   end
diff --git a/spec/features/merge_requests/diff_notes_avatars_spec.rb b/spec/features/merge_requests/diff_notes_avatars_spec.rb
index 9e816cf041b0..ef8f314cc030 100644
--- a/spec/features/merge_requests/diff_notes_avatars_spec.rb
+++ b/spec/features/merge_requests/diff_notes_avatars_spec.rb
@@ -19,7 +19,7 @@
   let!(:note) { create(:diff_note_on_merge_request, project: project, noteable: merge_request, position: position) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
 
     set_cookie('sidebar_collapsed', 'true')
diff --git a/spec/features/merge_requests/diff_notes_resolve_spec.rb b/spec/features/merge_requests/diff_notes_resolve_spec.rb
index 15d380b1bf4f..9d4194d8ca04 100644
--- a/spec/features/merge_requests/diff_notes_resolve_spec.rb
+++ b/spec/features/merge_requests/diff_notes_resolve_spec.rb
@@ -18,7 +18,7 @@
 
   context 'no discussions' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
       note.destroy
       visit_merge_request
@@ -32,7 +32,7 @@
 
   context 'as authorized user' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
       visit_merge_request
     end
@@ -429,7 +429,7 @@
     let(:guest) { create(:user) }
 
     before do
-      project.team << [guest, :guest]
+      project.add_guest(guest)
       sign_in guest
     end
 
diff --git a/spec/features/merge_requests/edit_mr_spec.rb b/spec/features/merge_requests/edit_mr_spec.rb
index 6fd47b9bc0de..6d72e8b81ef9 100644
--- a/spec/features/merge_requests/edit_mr_spec.rb
+++ b/spec/features/merge_requests/edit_mr_spec.rb
@@ -7,7 +7,7 @@
 
   context 'editing a MR' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
 
       sign_in user
 
@@ -73,7 +73,8 @@ def get_textarea_height
 
   context 'saving the MR that needs approvals' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
+
       project.update_attributes(approvals_before_merge: 2)
 
       visit_edit_mr_page
diff --git a/spec/features/merge_requests/filter_by_milestone_spec.rb b/spec/features/merge_requests/filter_by_milestone_spec.rb
index 8b9ff9be9431..8db94352f738 100644
--- a/spec/features/merge_requests/filter_by_milestone_spec.rb
+++ b/spec/features/merge_requests/filter_by_milestone_spec.rb
@@ -14,7 +14,7 @@ def filter_by_milestone(title)
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/merge_requests/form_spec.rb b/spec/features/merge_requests/form_spec.rb
index 1dcc1e139a01..1ebf762a0061 100644
--- a/spec/features/merge_requests/form_spec.rb
+++ b/spec/features/merge_requests/form_spec.rb
@@ -12,8 +12,8 @@
   let!(:label2)      { create(:label, project: project) }
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :master]
+    project.add_master(user)
+    project.add_master(user2)
   end
 
   context 'owned projects' do
@@ -172,7 +172,7 @@
 
   context 'forked project' do
     before do
-      forked_project.team << [user, :master]
+      forked_project.add_master(user)
       sign_in(user)
     end
 
diff --git a/spec/features/merge_requests/image_diff_notes_spec.rb b/spec/features/merge_requests/image_diff_notes_spec.rb
index b53570835cb4..d0f8da4e6cda 100644
--- a/spec/features/merge_requests/image_diff_notes_spec.rb
+++ b/spec/features/merge_requests/image_diff_notes_spec.rb
@@ -7,7 +7,7 @@
   let(:project) { create(:project, :public, :repository) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
 
     # Stub helper to return any blob file as image from public app folder.
diff --git a/spec/features/merge_requests/merge_commit_message_toggle_spec.rb b/spec/features/merge_requests/merge_commit_message_toggle_spec.rb
index 82b2b56ef801..ddd034e13762 100644
--- a/spec/features/merge_requests/merge_commit_message_toggle_spec.rb
+++ b/spec/features/merge_requests/merge_commit_message_toggle_spec.rb
@@ -32,7 +32,7 @@
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in user
 
diff --git a/spec/features/merge_requests/merge_immediately_with_pipeline_spec.rb b/spec/features/merge_requests/merge_immediately_with_pipeline_spec.rb
index 0b5a595acce0..e1317b33ad1f 100644
--- a/spec/features/merge_requests/merge_immediately_with_pipeline_spec.rb
+++ b/spec/features/merge_requests/merge_immediately_with_pipeline_spec.rb
@@ -19,7 +19,7 @@
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   context 'when there is active pipeline for merge request' do
diff --git a/spec/features/merge_requests/merge_with_push_rules_spec.rb b/spec/features/merge_requests/merge_with_push_rules_spec.rb
index 885d97b65aa3..bfd31f246553 100644
--- a/spec/features/merge_requests/merge_with_push_rules_spec.rb
+++ b/spec/features/merge_requests/merge_with_push_rules_spec.rb
@@ -6,7 +6,7 @@
   let(:merge_request) { create(:merge_request_with_diffs, source_project: project, author: user, title: 'Bug NS-04') }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   context 'commit message is invalid' do
diff --git a/spec/features/merge_requests/only_allow_merge_if_build_succeeds_spec.rb b/spec/features/merge_requests/only_allow_merge_if_build_succeeds_spec.rb
index 91f207bd339d..7d9282b932b6 100644
--- a/spec/features/merge_requests/only_allow_merge_if_build_succeeds_spec.rb
+++ b/spec/features/merge_requests/only_allow_merge_if_build_succeeds_spec.rb
@@ -7,7 +7,7 @@
   before do
     sign_in merge_request.author
 
-    project.team << [merge_request.author, :master]
+    project.add_master(merge_request.author)
   end
 
   context 'project does not have CI enabled', :js do
diff --git a/spec/features/merge_requests/pipelines_spec.rb b/spec/features/merge_requests/pipelines_spec.rb
index 307c860eac4d..04e3f4bdcf19 100644
--- a/spec/features/merge_requests/pipelines_spec.rb
+++ b/spec/features/merge_requests/pipelines_spec.rb
@@ -7,7 +7,7 @@
     given(:project) { merge_request.target_project }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
     end
 
diff --git a/spec/features/merge_requests/reset_filters_spec.rb b/spec/features/merge_requests/reset_filters_spec.rb
index eed95816bdfe..daca4422bf19 100644
--- a/spec/features/merge_requests/reset_filters_spec.rb
+++ b/spec/features/merge_requests/reset_filters_spec.rb
@@ -17,7 +17,7 @@
 
   before do
     mr2.labels << bug
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   context 'when a milestone filter has been applied' do
diff --git a/spec/features/merge_requests/squash_spec.rb b/spec/features/merge_requests/squash_spec.rb
index 6572c8d976ea..c7cabbef9800 100644
--- a/spec/features/merge_requests/squash_spec.rb
+++ b/spec/features/merge_requests/squash_spec.rb
@@ -46,7 +46,7 @@ def accept_mr
     # Prevent source branch from being removed so we can use be_merged_to_root_ref
     # method to check if squash was performed or not
     allow_any_instance_of(MergeRequest).to receive(:force_remove_source_branch?).and_return(false)
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in user
   end
diff --git a/spec/features/merge_requests/target_branch_spec.rb b/spec/features/merge_requests/target_branch_spec.rb
index bce36e05e574..d9f7a056deaa 100644
--- a/spec/features/merge_requests/target_branch_spec.rb
+++ b/spec/features/merge_requests/target_branch_spec.rb
@@ -11,7 +11,7 @@ def path_to_merge_request
 
   before do
     sign_in user
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   context 'when branch was deleted' do
diff --git a/spec/features/merge_requests/update_merge_requests_spec.rb b/spec/features/merge_requests/update_merge_requests_spec.rb
index c5498563b395..a96404b86edb 100644
--- a/spec/features/merge_requests/update_merge_requests_spec.rb
+++ b/spec/features/merge_requests/update_merge_requests_spec.rb
@@ -6,7 +6,7 @@
   let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/merge_requests/user_uses_slash_commands_spec.rb b/spec/features/merge_requests/user_uses_slash_commands_spec.rb
index fab65f6738e0..00dfdb038762 100644
--- a/spec/features/merge_requests/user_uses_slash_commands_spec.rb
+++ b/spec/features/merge_requests/user_uses_slash_commands_spec.rb
@@ -15,7 +15,7 @@
     let!(:milestone) { create(:milestone, project: project, title: 'ASAP') }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
       visit project_merge_request_path(project, merge_request)
     end
@@ -58,7 +58,7 @@
       context 'when the current user cannot toggle the WIP prefix' do
         let(:guest) { create(:user) }
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
           sign_out(:user)
           sign_in(guest)
           visit project_merge_request_path(project, merge_request)
@@ -104,7 +104,7 @@
       context 'when the current user cannot merge the MR' do
         let(:guest) { create(:user) }
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
           sign_out(:user)
           sign_in(guest)
           visit project_merge_request_path(project, merge_request)
@@ -134,7 +134,7 @@
 
       before do
         sign_out(:user)
-        another_project.team << [user, :master]
+        another_project.add_master(user)
         sign_in(user)
       end
 
@@ -188,7 +188,7 @@
       context 'when current user can not change target branch' do
         let(:guest) { create(:user) }
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
           sign_out(:user)
           sign_in(guest)
           visit project_merge_request_path(project, merge_request)
diff --git a/spec/features/merge_requests/widget_deployments_spec.rb b/spec/features/merge_requests/widget_deployments_spec.rb
index 72a52c979b3c..ec2da72ddffa 100644
--- a/spec/features/merge_requests/widget_deployments_spec.rb
+++ b/spec/features/merge_requests/widget_deployments_spec.rb
@@ -13,7 +13,7 @@
 
     background do
       sign_in(user)
-      project.team << [user, role]
+      project.add_role(user, role)
       visit project_merge_request_path(project, merge_request)
     end
 
diff --git a/spec/features/merge_requests/widget_spec.rb b/spec/features/merge_requests/widget_spec.rb
index 3ee094c216e7..8970586a160d 100644
--- a/spec/features/merge_requests/widget_spec.rb
+++ b/spec/features/merge_requests/widget_spec.rb
@@ -273,7 +273,7 @@
     let(:user2) { create(:user) }
 
     before do
-      project.team << [user2, :master]
+      project.add_master(user2)
       sign_out(:user)
       sign_in(user2)
       merge_request.update(target_project: fork_project)
diff --git a/spec/features/merge_requests/wip_message_spec.rb b/spec/features/merge_requests/wip_message_spec.rb
index b422c76249d1..2617e735c259 100644
--- a/spec/features/merge_requests/wip_message_spec.rb
+++ b/spec/features/merge_requests/wip_message_spec.rb
@@ -5,7 +5,7 @@
   let!(:user)    { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/milestone_spec.rb b/spec/features/milestone_spec.rb
index 9f24193a2ac3..b02d2d4261cd 100644
--- a/spec/features/milestone_spec.rb
+++ b/spec/features/milestone_spec.rb
@@ -7,7 +7,7 @@
 
   before do
     create(:group_member, group: group, user: user)
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/profiles/user_visits_notifications_tab_spec.rb b/spec/features/profiles/user_visits_notifications_tab_spec.rb
index df89918f17ae..1952fdae798d 100644
--- a/spec/features/profiles/user_visits_notifications_tab_spec.rb
+++ b/spec/features/profiles/user_visits_notifications_tab_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit(profile_notifications_path)
   end
diff --git a/spec/features/projects/activity/rss_spec.rb b/spec/features/projects/activity/rss_spec.rb
index 84c2faa20155..2693e5392681 100644
--- a/spec/features/projects/activity/rss_spec.rb
+++ b/spec/features/projects/activity/rss_spec.rb
@@ -11,7 +11,7 @@
 
   context 'when signed in' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       sign_in(user)
       visit path
     end
diff --git a/spec/features/projects/audit_events_spec.rb b/spec/features/projects/audit_events_spec.rb
index 683756f3022e..07ca4cec8a86 100644
--- a/spec/features/projects/audit_events_spec.rb
+++ b/spec/features/projects/audit_events_spec.rb
@@ -6,7 +6,7 @@
   let(:project) { create(:project, :repository, namespace: user.namespace) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
@@ -88,7 +88,7 @@
 
   describe 'changing a user access level' do
     before do
-      project.team << [pete, :developer]
+      project.add_developer(pete)
     end
 
     it "appears in the project's audit events" do
diff --git a/spec/features/projects/badges/coverage_spec.rb b/spec/features/projects/badges/coverage_spec.rb
index c68e10a2563e..821ce88a402a 100644
--- a/spec/features/projects/badges/coverage_spec.rb
+++ b/spec/features/projects/badges/coverage_spec.rb
@@ -6,7 +6,7 @@
 
   context 'when user has access to view badge' do
     background do
-      project.team << [user, :developer]
+      project.add_developer(user)
       sign_in(user)
     end
 
diff --git a/spec/features/projects/badges/list_spec.rb b/spec/features/projects/badges/list_spec.rb
index 68c4a6479584..c705e4796900 100644
--- a/spec/features/projects/badges/list_spec.rb
+++ b/spec/features/projects/badges/list_spec.rb
@@ -4,7 +4,7 @@
   background do
     user = create(:user)
     project = create(:project, :repository)
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit project_pipelines_settings_path(project)
   end
diff --git a/spec/features/projects/blobs/edit_spec.rb b/spec/features/projects/blobs/edit_spec.rb
index 965028a6f90e..69e4c9f04a18 100644
--- a/spec/features/projects/blobs/edit_spec.rb
+++ b/spec/features/projects/blobs/edit_spec.rb
@@ -13,7 +13,7 @@
     let(:role) { :developer }
 
     before do
-      project.team << [user, role]
+      project.add_role(user, role)
       sign_in(user)
     end
 
@@ -55,7 +55,7 @@ def edit_and_commit
         let(:user) { create(:user) }
 
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
           visit project_edit_blob_path(project, tree_join(branch, file_path))
         end
 
@@ -90,7 +90,7 @@ def edit_and_commit
       let(:protected_branch) { 'protected-branch' }
 
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
         project.repository.add_branch(user, protected_branch, 'master')
         create(:protected_branch, project: project, name: protected_branch)
         sign_in(user)
@@ -122,7 +122,7 @@ def edit_and_commit
       let(:user) { create(:user) }
 
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         sign_in(user)
         visit project_edit_blob_path(project, tree_join(branch, file_path))
       end
diff --git a/spec/features/projects/branches/download_buttons_spec.rb b/spec/features/projects/branches/download_buttons_spec.rb
index 2f407b13c2f2..39bcea013e78 100644
--- a/spec/features/projects/branches/download_buttons_spec.rb
+++ b/spec/features/projects/branches/download_buttons_spec.rb
@@ -23,7 +23,7 @@
 
   background do
     sign_in(user)
-    project.team << [user, role]
+    project.add_role(user, role)
   end
 
   describe 'when checking branches' do
diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb
index aa3b27db2279..7362ef8c6d26 100644
--- a/spec/features/projects/branches_spec.rb
+++ b/spec/features/projects/branches_spec.rb
@@ -10,7 +10,7 @@
   context 'logged in as developer' do
     before do
       sign_in(user)
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     describe 'Initial branches page' do
@@ -80,7 +80,7 @@
   context 'logged in as master' do
     before do
       sign_in(user)
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     describe 'Initial branches page' do
diff --git a/spec/features/projects/commit/builds_spec.rb b/spec/features/projects/commit/builds_spec.rb
index 79e84a4f0a6a..36a746ac83d8 100644
--- a/spec/features/projects/commit/builds_spec.rb
+++ b/spec/features/projects/commit/builds_spec.rb
@@ -5,7 +5,7 @@
 
   background do
     user = create(:user)
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/projects/commit/cherry_pick_spec.rb b/spec/features/projects/commit/cherry_pick_spec.rb
index c11a95732b2f..c4c399e30583 100644
--- a/spec/features/projects/commit/cherry_pick_spec.rb
+++ b/spec/features/projects/commit/cherry_pick_spec.rb
@@ -9,7 +9,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
     visit project_commit_path(project, master_pickable_commit.id)
   end
 
diff --git a/spec/features/projects/commits/rss_spec.rb b/spec/features/projects/commits/rss_spec.rb
index db958346f066..0d9c7355ddda 100644
--- a/spec/features/projects/commits/rss_spec.rb
+++ b/spec/features/projects/commits/rss_spec.rb
@@ -7,7 +7,7 @@
 
   context 'when signed in' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       sign_in(user)
       visit path
     end
diff --git a/spec/features/projects/compare_spec.rb b/spec/features/projects/compare_spec.rb
index 87ffc2a0b901..1fb22fd0e4ca 100644
--- a/spec/features/projects/compare_spec.rb
+++ b/spec/features/projects/compare_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project, :repository) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
     visit project_compare_index_path(project, from: "master", to: "master")
   end
diff --git a/spec/features/projects/deploy_keys_spec.rb b/spec/features/projects/deploy_keys_spec.rb
index e445758cb5e0..886c56e71639 100644
--- a/spec/features/projects/deploy_keys_spec.rb
+++ b/spec/features/projects/deploy_keys_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project_empty_repo) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/projects/developer_views_empty_project_instructions_spec.rb b/spec/features/projects/developer_views_empty_project_instructions_spec.rb
index eb0de6ae848d..3501bf96cb60 100644
--- a/spec/features/projects/developer_views_empty_project_instructions_spec.rb
+++ b/spec/features/projects/developer_views_empty_project_instructions_spec.rb
@@ -5,7 +5,7 @@
   let(:developer) { create(:user) }
 
   background do
-    project.team << [developer, :developer]
+    project.add_developer(developer)
 
     sign_in(developer)
   end
diff --git a/spec/features/projects/edit_spec.rb b/spec/features/projects/edit_spec.rb
index 7a3727575235..1d4b4d0fdca6 100644
--- a/spec/features/projects/edit_spec.rb
+++ b/spec/features/projects/edit_spec.rb
@@ -7,7 +7,7 @@
 
   context 'feature visibility' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
 
       visit edit_project_path(project)
diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb
index dfcf97ad4952..64e600144e0c 100644
--- a/spec/features/projects/environments/environment_spec.rb
+++ b/spec/features/projects/environments/environment_spec.rb
@@ -7,7 +7,7 @@
 
   background do
     sign_in(user)
-    project.team << [user, role]
+    project.add_role(user, role)
   end
 
   feature 'environment details page' do
diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb
index 4a05313c14ac..5248a783db45 100644
--- a/spec/features/projects/environments/environments_spec.rb
+++ b/spec/features/projects/environments/environments_spec.rb
@@ -6,7 +6,7 @@
   given(:role) { :developer }
 
   background do
-    project.team << [user, role]
+    project.add_role(user, role)
     sign_in(user)
   end
 
diff --git a/spec/features/projects/features_visibility_spec.rb b/spec/features/projects/features_visibility_spec.rb
index 033c45a60bff..b0eb7c5b42ac 100644
--- a/spec/features/projects/features_visibility_spec.rb
+++ b/spec/features/projects/features_visibility_spec.rb
@@ -8,7 +8,7 @@
 
   describe 'project features visibility selectors', :js do
     before do
-      project.team << [member, :master]
+      project.add_master(member)
       sign_in(member)
     end
 
@@ -165,7 +165,7 @@
 
   describe 'repository visibility', :js do
     before do
-      project.team << [member, :master]
+      project.add_master(member)
       sign_in(member)
       visit edit_project_path(project)
     end
@@ -261,7 +261,7 @@ def save_changes_and_check_activity_tab
     let!(:project) { create(:project, :private) }
 
     before do
-      project.team << [member, :guest]
+      project.add_guest(member)
       sign_in(member)
       visit project_path(project)
     end
diff --git a/spec/features/projects/files/browse_files_spec.rb b/spec/features/projects/files/browse_files_spec.rb
index 84197e45dcbd..2c38c380d9d5 100644
--- a/spec/features/projects/files/browse_files_spec.rb
+++ b/spec/features/projects/files/browse_files_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit project_tree_path(project, project.default_branch)
   end
diff --git a/spec/features/projects/files/creating_a_file_spec.rb b/spec/features/projects/files/creating_a_file_spec.rb
index e1852a6e544f..8d9826365254 100644
--- a/spec/features/projects/files/creating_a_file_spec.rb
+++ b/spec/features/projects/files/creating_a_file_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   background do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
     visit project_new_blob_path(project, project.default_branch)
   end
diff --git a/spec/features/projects/files/dockerfile_dropdown_spec.rb b/spec/features/projects/files/dockerfile_dropdown_spec.rb
index 3c3a5326538e..f4a39e331fd9 100644
--- a/spec/features/projects/files/dockerfile_dropdown_spec.rb
+++ b/spec/features/projects/files/dockerfile_dropdown_spec.rb
@@ -5,7 +5,7 @@
   before do
     user = create(:user)
     project = create(:project, :repository)
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in user
 
diff --git a/spec/features/projects/files/download_buttons_spec.rb b/spec/features/projects/files/download_buttons_spec.rb
index d2382d55c0b7..2101627f324b 100644
--- a/spec/features/projects/files/download_buttons_spec.rb
+++ b/spec/features/projects/files/download_buttons_spec.rb
@@ -23,7 +23,7 @@
 
   background do
     sign_in(user)
-    project.team << [user, role]
+    project.add_role(user, role)
   end
 
   describe 'when files tree' do
diff --git a/spec/features/projects/files/edit_file_soft_wrap_spec.rb b/spec/features/projects/files/edit_file_soft_wrap_spec.rb
index 3ab43b3c6565..8d32ada57953 100644
--- a/spec/features/projects/files/edit_file_soft_wrap_spec.rb
+++ b/spec/features/projects/files/edit_file_soft_wrap_spec.rb
@@ -4,7 +4,7 @@
   before do
     user = create(:user)
     project = create(:project, :repository)
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
     visit project_new_blob_path(project, 'master', file_name: 'test_file-name')
     page.within('.file-editor.code') do
diff --git a/spec/features/projects/files/editing_a_file_spec.rb b/spec/features/projects/files/editing_a_file_spec.rb
index 20be968e89fa..d874cdbff8dc 100644
--- a/spec/features/projects/files/editing_a_file_spec.rb
+++ b/spec/features/projects/files/editing_a_file_spec.rb
@@ -16,7 +16,7 @@
   end
 
   background do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
     visit project_edit_blob_path(project,
                                            File.join(project.default_branch, '.gitignore'))
diff --git a/spec/features/projects/files/files_sort_submodules_with_folders_spec.rb b/spec/features/projects/files/files_sort_submodules_with_folders_spec.rb
index 702b99de7339..ead9f7e91685 100644
--- a/spec/features/projects/files/files_sort_submodules_with_folders_spec.rb
+++ b/spec/features/projects/files/files_sort_submodules_with_folders_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:forked_project_with_submodules) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
     visit project_tree_path(project, project.repository.root_ref)
   end
diff --git a/spec/features/projects/files/find_file_keyboard_spec.rb b/spec/features/projects/files/find_file_keyboard_spec.rb
index 618725ee7815..e9ff06c72d8b 100644
--- a/spec/features/projects/files/find_file_keyboard_spec.rb
+++ b/spec/features/projects/files/find_file_keyboard_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project, :repository) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
 
     visit project_find_file_path(project, project.repository.root_ref)
diff --git a/spec/features/projects/files/gitignore_dropdown_spec.rb b/spec/features/projects/files/gitignore_dropdown_spec.rb
index 81d68c3d67c3..79f3fd09b481 100644
--- a/spec/features/projects/files/gitignore_dropdown_spec.rb
+++ b/spec/features/projects/files/gitignore_dropdown_spec.rb
@@ -4,7 +4,7 @@
   before do
     user = create(:user)
     project = create(:project, :repository)
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
     visit project_new_blob_path(project, 'master', file_name: '.gitignore')
   end
diff --git a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb
index 8e58fa7bd56f..db6c67b802e6 100644
--- a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb
+++ b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb
@@ -4,7 +4,7 @@
   before do
     user = create(:user)
     project = create(:project, :repository)
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
     visit project_new_blob_path(project, 'master', file_name: '.gitlab-ci.yml')
   end
diff --git a/spec/features/projects/files/project_owner_creates_license_file_spec.rb b/spec/features/projects/files/project_owner_creates_license_file_spec.rb
index 6c5b1086ec15..07599600876a 100644
--- a/spec/features/projects/files/project_owner_creates_license_file_spec.rb
+++ b/spec/features/projects/files/project_owner_creates_license_file_spec.rb
@@ -6,7 +6,7 @@
   background do
     project.repository.delete_file(project_master, 'LICENSE',
       message: 'Remove LICENSE', branch_name: 'master')
-    project.team << [project_master, :master]
+    project.add_master(project_master)
     sign_in(project_master)
     visit project_path(project)
   end
diff --git a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
index 6c616bf04560..121285c84b04 100644
--- a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
+++ b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
@@ -4,7 +4,7 @@
   let(:project_master) { create(:user) }
   let(:project) { create(:project) }
   background do
-    project.team << [project_master, :master]
+    project.add_master(project_master)
     sign_in(project_master)
   end
 
diff --git a/spec/features/projects/files/template_type_dropdown_spec.rb b/spec/features/projects/files/template_type_dropdown_spec.rb
index f95a60e5194a..97408a9c41ec 100644
--- a/spec/features/projects/files/template_type_dropdown_spec.rb
+++ b/spec/features/projects/files/template_type_dropdown_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
   end
 
diff --git a/spec/features/projects/files/undo_template_spec.rb b/spec/features/projects/files/undo_template_spec.rb
index 64fe350f3dce..fbf35fb4e1c3 100644
--- a/spec/features/projects/files/undo_template_spec.rb
+++ b/spec/features/projects/files/undo_template_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
   end
 
diff --git a/spec/features/projects/guest_navigation_menu_spec.rb b/spec/features/projects/guest_navigation_menu_spec.rb
index 98c7ef57a513..199682b943c2 100644
--- a/spec/features/projects/guest_navigation_menu_spec.rb
+++ b/spec/features/projects/guest_navigation_menu_spec.rb
@@ -5,7 +5,7 @@
   let(:guest) { create(:user) }
 
   before do
-    project.team << [guest, :guest]
+    project.add_guest(guest)
 
     sign_in(guest)
   end
diff --git a/spec/features/projects/issuable_templates_spec.rb b/spec/features/projects/issuable_templates_spec.rb
index 4319fc2746c5..e26caf1f4565 100644
--- a/spec/features/projects/issuable_templates_spec.rb
+++ b/spec/features/projects/issuable_templates_spec.rb
@@ -8,7 +8,7 @@
   let(:issue_form_location) { '#content-body .issuable-details .detail-page-description' }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in user
   end
 
@@ -120,7 +120,7 @@
     background do
       sign_out(:user)
 
-      project.team << [fork_user, :developer]
+      project.add_developer(fork_user)
 
       sign_in(fork_user)
 
diff --git a/spec/features/projects/issues/rss_spec.rb b/spec/features/projects/issues/rss_spec.rb
index 58eeef8c258e..ff91aabc311e 100644
--- a/spec/features/projects/issues/rss_spec.rb
+++ b/spec/features/projects/issues/rss_spec.rb
@@ -12,7 +12,7 @@
     let(:user) { create(:user) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       sign_in(user)
       visit path
     end
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index b6c9923f2849..9bc8329fbf05 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -15,7 +15,7 @@
   end
 
   before do
-    project.team << [user, user_access_level]
+    project.add_role(user, user_access_level)
     sign_in(user)
   end
 
diff --git a/spec/features/projects/labels/subscription_spec.rb b/spec/features/projects/labels/subscription_spec.rb
index e8c70dec8549..70e8d436dcbc 100644
--- a/spec/features/projects/labels/subscription_spec.rb
+++ b/spec/features/projects/labels/subscription_spec.rb
@@ -9,7 +9,7 @@
 
   context 'when signed in' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       sign_in user
     end
 
diff --git a/spec/features/projects/labels/update_prioritization_spec.rb b/spec/features/projects/labels/update_prioritization_spec.rb
index d063f5c27b55..85bd776932b1 100644
--- a/spec/features/projects/labels/update_prioritization_spec.rb
+++ b/spec/features/projects/labels/update_prioritization_spec.rb
@@ -12,7 +12,7 @@
 
   context 'when user belongs to project team' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
 
       sign_in user
     end
diff --git a/spec/features/projects/main/download_buttons_spec.rb b/spec/features/projects/main/download_buttons_spec.rb
index 3f2579bb01a2..81f08e44cf3f 100644
--- a/spec/features/projects/main/download_buttons_spec.rb
+++ b/spec/features/projects/main/download_buttons_spec.rb
@@ -23,7 +23,7 @@
 
   background do
     sign_in(user)
-    project.team << [user, role]
+    project.add_role(user, role)
   end
 
   describe 'when checking project main page' do
diff --git a/spec/features/projects/main/rss_spec.rb b/spec/features/projects/main/rss_spec.rb
index 7914180b951c..3c98c11b4903 100644
--- a/spec/features/projects/main/rss_spec.rb
+++ b/spec/features/projects/main/rss_spec.rb
@@ -7,7 +7,7 @@
 
   context 'when signed in' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       sign_in(user)
       visit path
     end
diff --git a/spec/features/projects/members/anonymous_user_sees_members_spec.rb b/spec/features/projects/members/anonymous_user_sees_members_spec.rb
index bf0990d675db..e2a48bfd1d4e 100644
--- a/spec/features/projects/members/anonymous_user_sees_members_spec.rb
+++ b/spec/features/projects/members/anonymous_user_sees_members_spec.rb
@@ -6,7 +6,7 @@
   let(:project) { create(:project, :public) }
 
   background do
-    project.team << [user, :master]
+    project.add_master(user)
     create(:project_group_link, project: project, group: group)
   end
 
diff --git a/spec/features/projects/members/group_members_spec.rb b/spec/features/projects/members/group_members_spec.rb
index c140fece41d2..e22b6fa6c43e 100644
--- a/spec/features/projects/members/group_members_spec.rb
+++ b/spec/features/projects/members/group_members_spec.rb
@@ -11,7 +11,7 @@
   let(:group_requester) { create(:user) }
 
   background do
-    project.team << [developer, :developer]
+    project.add_developer(developer)
     group.add_owner(user)
     sign_in(user)
   end
diff --git a/spec/features/projects/members/groups_with_access_list_spec.rb b/spec/features/projects/members/groups_with_access_list_spec.rb
index 7f067aadec68..e6d0c6e00f83 100644
--- a/spec/features/projects/members/groups_with_access_list_spec.rb
+++ b/spec/features/projects/members/groups_with_access_list_spec.rb
@@ -6,7 +6,7 @@
   let(:project) { create(:project, :public) }
 
   background do
-    project.team << [user, :master]
+    project.add_master(user)
     @group_link = create(:project_group_link, project: project, group: group)
 
     sign_in(user)
diff --git a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
index 0f88f4cb1e80..8fe340d3bae1 100644
--- a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
+++ b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
@@ -9,7 +9,7 @@
   let!(:new_member) { create(:user) }
 
   background do
-    project.team << [master, :master]
+    project.add_master(master)
     sign_in(master)
   end
 
diff --git a/spec/features/projects/members/master_manages_access_requests_spec.rb b/spec/features/projects/members/master_manages_access_requests_spec.rb
index eb3c80348737..d575596937d2 100644
--- a/spec/features/projects/members/master_manages_access_requests_spec.rb
+++ b/spec/features/projects/members/master_manages_access_requests_spec.rb
@@ -7,7 +7,7 @@
 
   background do
     project.request_access(user)
-    project.team << [master, :master]
+    project.add_master(master)
     sign_in(master)
   end
 
diff --git a/spec/features/projects/members/member_cannot_request_access_to_his_project_spec.rb b/spec/features/projects/members/member_cannot_request_access_to_his_project_spec.rb
index 04806f8fd9e4..47911c32a723 100644
--- a/spec/features/projects/members/member_cannot_request_access_to_his_project_spec.rb
+++ b/spec/features/projects/members/member_cannot_request_access_to_his_project_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project) }
 
   background do
-    project.team << [member, :developer]
+    project.add_developer(member)
     sign_in(member)
     visit project_path(project)
   end
diff --git a/spec/features/projects/members/member_is_removed_from_project_spec.rb b/spec/features/projects/members/member_is_removed_from_project_spec.rb
index 51371390ff63..de4dd0b2505b 100644
--- a/spec/features/projects/members/member_is_removed_from_project_spec.rb
+++ b/spec/features/projects/members/member_is_removed_from_project_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project) }
 
   background do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit project_project_members_path(project)
   end
diff --git a/spec/features/projects/members/member_leaves_project_spec.rb b/spec/features/projects/members/member_leaves_project_spec.rb
index cade1b75bbfa..4cf686ea3212 100644
--- a/spec/features/projects/members/member_leaves_project_spec.rb
+++ b/spec/features/projects/members/member_leaves_project_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project, :repository) }
 
   background do
-    project.team << [user, :developer]
+    project.add_developer(user)
     sign_in(user)
     visit project_path(project)
   end
diff --git a/spec/features/projects/merge_requests/list_spec.rb b/spec/features/projects/merge_requests/list_spec.rb
index a879efef4b50..b34b13db3814 100644
--- a/spec/features/projects/merge_requests/list_spec.rb
+++ b/spec/features/projects/merge_requests/list_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project, :repository) }
 
   background do
-    project.team << [user, :developer]
+    project.add_developer(user)
 
     sign_in(user)
   end
diff --git a/spec/features/projects/pages_spec.rb b/spec/features/projects/pages_spec.rb
index 013ed6f2e589..2e334caa98fc 100644
--- a/spec/features/projects/pages_spec.rb
+++ b/spec/features/projects/pages_spec.rb
@@ -8,7 +8,7 @@
   background do
     allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
 
-    project.team << [user, role]
+    project.add_role(user, role)
 
     sign_in(user)
   end
diff --git a/spec/features/projects/path_locks_spec.rb b/spec/features/projects/path_locks_spec.rb
index e1dcbe072d00..a61264b5816c 100644
--- a/spec/features/projects/path_locks_spec.rb
+++ b/spec/features/projects/path_locks_spec.rb
@@ -8,7 +8,7 @@
   before do
     allow(project).to receive(:feature_available?).with(:file_locks) { true }
 
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
 
     visit tree_path
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index 888e290292bb..43d47a945f8d 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -6,7 +6,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   shared_context 'pipeline builds' do
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index b87b47d0e1a2..df261c246f7c 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -8,7 +8,7 @@
 
     before do
       sign_in(user)
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     describe 'GET /:project/pipelines' do
diff --git a/spec/features/projects/push_rules_spec.rb b/spec/features/projects/push_rules_spec.rb
index bb90c8496928..95a7b47d5c91 100644
--- a/spec/features/projects/push_rules_spec.rb
+++ b/spec/features/projects/push_rules_spec.rb
@@ -6,7 +6,7 @@
   let(:foo) {{ reject_unsigned_commits: 'Reject unsigned commits' }}
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/projects/remote_mirror_spec.rb b/spec/features/projects/remote_mirror_spec.rb
index ff4713565d1f..81a6b613cc89 100644
--- a/spec/features/projects/remote_mirror_spec.rb
+++ b/spec/features/projects/remote_mirror_spec.rb
@@ -7,7 +7,7 @@
 
   describe 'On a project', :js do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
     end
 
diff --git a/spec/features/projects/services/user_activates_jira_spec.rb b/spec/features/projects/services/user_activates_jira_spec.rb
index ac78b1dfb1cd..028669eeaf2e 100644
--- a/spec/features/projects/services/user_activates_jira_spec.rb
+++ b/spec/features/projects/services/user_activates_jira_spec.rb
@@ -18,7 +18,7 @@ def fill_form(active = true)
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
 
     visit project_settings_integrations_path(project)
diff --git a/spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb b/spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb
index 6f0571378677..b2906e315f70 100644
--- a/spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb
+++ b/spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb
@@ -8,7 +8,7 @@
 
   before do
     stub_mattermost_setting(enabled: mattermost_enabled)
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit edit_project_service_path(project, service)
   end
diff --git a/spec/features/projects/services/user_activates_slack_slash_command_spec.rb b/spec/features/projects/services/user_activates_slack_slash_command_spec.rb
index a8baf1262697..4a88654210ce 100644
--- a/spec/features/projects/services/user_activates_slack_slash_command_spec.rb
+++ b/spec/features/projects/services/user_activates_slack_slash_command_spec.rb
@@ -6,7 +6,7 @@
   given(:service) { project.create_slack_slash_commands_service }
 
   background do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit edit_project_service_path(project, service)
   end
diff --git a/spec/features/projects/settings/integration_settings_spec.rb b/spec/features/projects/settings/integration_settings_spec.rb
index cbdb7973ac86..f6a1a46df11e 100644
--- a/spec/features/projects/settings/integration_settings_spec.rb
+++ b/spec/features/projects/settings/integration_settings_spec.rb
@@ -8,7 +8,7 @@
 
   background do
     sign_in(user)
-    project.team << [user, role]
+    project.add_role(user, role)
   end
 
   context 'for developer' do
diff --git a/spec/features/projects/settings/issues_settings_spec.rb b/spec/features/projects/settings/issues_settings_spec.rb
index 717ea478fc62..e94d38c593af 100644
--- a/spec/features/projects/settings/issues_settings_spec.rb
+++ b/spec/features/projects/settings/issues_settings_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   background do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/projects/settings/merge_requests_settings_spec.rb b/spec/features/projects/settings/merge_requests_settings_spec.rb
index ac76c30cc7c7..015db603d338 100644
--- a/spec/features/projects/settings/merge_requests_settings_spec.rb
+++ b/spec/features/projects/settings/merge_requests_settings_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   background do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/projects/settings/pipelines_settings_spec.rb b/spec/features/projects/settings/pipelines_settings_spec.rb
index 561f08cba00d..d07208555647 100644
--- a/spec/features/projects/settings/pipelines_settings_spec.rb
+++ b/spec/features/projects/settings/pipelines_settings_spec.rb
@@ -7,7 +7,7 @@
 
   background do
     sign_in(user)
-    project.team << [user, role]
+    project.add_role(user, role)
   end
 
   context 'for developer' do
diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb
index e2a5619c22b4..81b282502fcd 100644
--- a/spec/features/projects/settings/repository_settings_spec.rb
+++ b/spec/features/projects/settings/repository_settings_spec.rb
@@ -6,7 +6,7 @@
   let(:role) { :developer }
 
   background do
-    project.team << [user, role]
+    project.add_role(user, role)
     sign_in(user)
   end
 
@@ -66,7 +66,7 @@
 
       scenario 'edit a deploy key from projects user has access to' do
         project2 = create(:project_empty_repo)
-        project2.team << [user, role]
+        project2.add_role(user, role)
         project2.deploy_keys << private_deploy_key
 
         visit project_settings_repository_path(project)
diff --git a/spec/features/projects/settings/slack_application_spec.rb b/spec/features/projects/settings/slack_application_spec.rb
index e6c28334c3ad..a3905f3728f2 100644
--- a/spec/features/projects/settings/slack_application_spec.rb
+++ b/spec/features/projects/settings/slack_application_spec.rb
@@ -9,7 +9,7 @@
 
   background do
     gitlab_sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
 
     create(:slack_integration, service: service)
 
diff --git a/spec/features/projects/settings/visibility_settings_spec.rb b/spec/features/projects/settings/visibility_settings_spec.rb
index 1c3b84d01140..06f6702670bb 100644
--- a/spec/features/projects/settings/visibility_settings_spec.rb
+++ b/spec/features/projects/settings/visibility_settings_spec.rb
@@ -31,7 +31,7 @@
     let(:master_user) { create(:user) }
 
     before do
-      project.team << [master_user, :master]
+      project.add_master(master_user)
       sign_in(master_user)
       visit edit_project_path(project)
     end
diff --git a/spec/features/projects/snippets/create_snippet_spec.rb b/spec/features/projects/snippets/create_snippet_spec.rb
index e4215291f994..3466a3dfb778 100644
--- a/spec/features/projects/snippets/create_snippet_spec.rb
+++ b/spec/features/projects/snippets/create_snippet_spec.rb
@@ -16,7 +16,7 @@ def fill_form
 
   context 'when a user is authenticated' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
 
       visit project_snippets_path(project)
diff --git a/spec/features/projects/snippets/show_spec.rb b/spec/features/projects/snippets/show_spec.rb
index 08dc7cf6c5bb..216f2af7c886 100644
--- a/spec/features/projects/snippets/show_spec.rb
+++ b/spec/features/projects/snippets/show_spec.rb
@@ -6,7 +6,7 @@
   let(:snippet) { create(:project_snippet, project: project, file_name: file_name, content: content) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/projects/tags/download_buttons_spec.rb b/spec/features/projects/tags/download_buttons_spec.rb
index d38a5b1324ba..b62498194c4a 100644
--- a/spec/features/projects/tags/download_buttons_spec.rb
+++ b/spec/features/projects/tags/download_buttons_spec.rb
@@ -24,7 +24,7 @@
 
   background do
     sign_in(user)
-    project.team << [user, role]
+    project.add_role(user, role)
   end
 
   describe 'when checking tags' do
diff --git a/spec/features/projects/tree/rss_spec.rb b/spec/features/projects/tree/rss_spec.rb
index 4f2e0a76a651..6407370ac0dc 100644
--- a/spec/features/projects/tree/rss_spec.rb
+++ b/spec/features/projects/tree/rss_spec.rb
@@ -7,7 +7,7 @@
 
   context 'when signed in' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       sign_in(user)
       visit path
     end
diff --git a/spec/features/projects/user_browses_files_spec.rb b/spec/features/projects/user_browses_files_spec.rb
index f5e4d7f5130c..62e6419cc423 100644
--- a/spec/features/projects/user_browses_files_spec.rb
+++ b/spec/features/projects/user_browses_files_spec.rb
@@ -15,7 +15,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/projects/user_creates_directory_spec.rb b/spec/features/projects/user_creates_directory_spec.rb
index 052cb3188c57..00e48f6fabd2 100644
--- a/spec/features/projects/user_creates_directory_spec.rb
+++ b/spec/features/projects/user_creates_directory_spec.rb
@@ -11,7 +11,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
     sign_in(user)
     visit project_tree_path(project, 'master')
   end
@@ -63,7 +63,7 @@
 
   context 'when an user does not have write access' do
     before do
-      project2.team << [user, :reporter]
+      project2.add_reporter(user)
       visit(project2_tree_path_root_ref)
     end
 
diff --git a/spec/features/projects/user_creates_files_spec.rb b/spec/features/projects/user_creates_files_spec.rb
index d84b91ddc32e..7a935dd2477a 100644
--- a/spec/features/projects/user_creates_files_spec.rb
+++ b/spec/features/projects/user_creates_files_spec.rb
@@ -12,7 +12,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
@@ -33,7 +33,7 @@
 
     context 'when an user does not have write access' do
       before do
-        project2.team << [user, :reporter]
+        project2.add_reporter(user)
         visit(project2_tree_path_root_ref)
       end
 
@@ -131,7 +131,7 @@
 
     context 'when an user does not have write access' do
       before do
-        project2.team << [user, :reporter]
+        project2.add_reporter(user)
         visit(project2_tree_path_root_ref)
       end
 
diff --git a/spec/features/projects/user_deletes_files_spec.rb b/spec/features/projects/user_deletes_files_spec.rb
index 9e4e92ec0760..9d55197e719b 100644
--- a/spec/features/projects/user_deletes_files_spec.rb
+++ b/spec/features/projects/user_deletes_files_spec.rb
@@ -17,7 +17,7 @@
 
   context 'when an user has write access' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       visit(project_tree_path_root_ref)
     end
 
@@ -37,7 +37,7 @@
 
   context 'when an user does not have write access' do
     before do
-      project2.team << [user, :reporter]
+      project2.add_reporter(user)
       visit(project2_tree_path_root_ref)
     end
 
diff --git a/spec/features/projects/user_edits_files_spec.rb b/spec/features/projects/user_edits_files_spec.rb
index d26ee6534150..5c5c6a398f6b 100644
--- a/spec/features/projects/user_edits_files_spec.rb
+++ b/spec/features/projects/user_edits_files_spec.rb
@@ -14,7 +14,7 @@
 
   context 'when an user has write access' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       visit(project_tree_path_root_ref)
     end
 
@@ -87,7 +87,7 @@
 
   context 'when an user does not have write access' do
     before do
-      project2.team << [user, :reporter]
+      project2.add_reporter(user)
       visit(project2_tree_path_root_ref)
     end
 
diff --git a/spec/features/projects/user_replaces_files_spec.rb b/spec/features/projects/user_replaces_files_spec.rb
index 245b6aa285b7..74872403b35f 100644
--- a/spec/features/projects/user_replaces_files_spec.rb
+++ b/spec/features/projects/user_replaces_files_spec.rb
@@ -19,7 +19,7 @@
 
   context 'when an user has write access' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       visit(project_tree_path_root_ref)
     end
 
@@ -45,7 +45,7 @@
 
   context 'when an user does not have write access' do
     before do
-      project2.team << [user, :reporter]
+      project2.add_reporter(user)
       visit(project2_tree_path_root_ref)
     end
 
diff --git a/spec/features/projects/user_uploads_files_spec.rb b/spec/features/projects/user_uploads_files_spec.rb
index ae51901adc6f..75898afcda94 100644
--- a/spec/features/projects/user_uploads_files_spec.rb
+++ b/spec/features/projects/user_uploads_files_spec.rb
@@ -14,7 +14,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
@@ -50,7 +50,7 @@
 
   context 'when an user does not have write access' do
     before do
-      project2.team << [user, :reporter]
+      project2.add_reporter(user)
       visit(project2_tree_path_root_ref)
     end
 
diff --git a/spec/features/projects/wiki/markdown_preview_spec.rb b/spec/features/projects/wiki/markdown_preview_spec.rb
index 337baaf4dcd1..006c15d60c53 100644
--- a/spec/features/projects/wiki/markdown_preview_spec.rb
+++ b/spec/features/projects/wiki/markdown_preview_spec.rb
@@ -13,7 +13,7 @@
   end
 
   background do
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in(user)
 
diff --git a/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb b/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb
index ebb3bd044c11..2682b62fa047 100644
--- a/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb
+++ b/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb
@@ -4,7 +4,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index 63e6051b5710..b66a7dea598b 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -133,7 +133,7 @@
 
     before do
       sign_in(user)
-      project.team << [user, :master]
+      project.add_master(user)
       visit edit_project_path(project)
     end
 
@@ -151,7 +151,7 @@
     let(:project) { create(:forked_project_with_submodules) }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
       visit project_path(project)
     end
@@ -180,7 +180,7 @@
     let(:project) { create(:project, :repository) }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in user
       visit project_path(project)
     end
diff --git a/spec/features/promotion_spec.rb b/spec/features/promotion_spec.rb
index a54ea216a1b0..0bc38a9f839a 100644
--- a/spec/features/promotion_spec.rb
+++ b/spec/features/promotion_spec.rb
@@ -12,7 +12,7 @@
 
   describe 'if you have a license' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     it 'should show no promotion at all' do
@@ -27,7 +27,7 @@
       before do
         allow(License).to receive(:current).and_return(nil)
         stub_application_setting(check_namespace_plan: false)
-        project.team << [user, :master]
+        project.add_master(user)
       end
 
       it 'should have the contact admin line' do
@@ -47,8 +47,8 @@
   describe 'for project features in general', :js do
     context 'for .com' do
       before do
-        project.team << [user, :master]
-        otherproject.team << [user, :master]
+        project.add_master(user)
+        otherproject.add_master(user)
 
         stub_application_setting(check_namespace_plan: true)
         allow(Gitlab).to receive(:com?) { true }
@@ -73,7 +73,7 @@
       allow(License).to receive(:current).and_return(nil)
       stub_application_setting(check_namespace_plan: false)
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
@@ -100,7 +100,7 @@
       allow(License).to receive(:current).and_return(nil)
       stub_application_setting(check_namespace_plan: false)
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
@@ -127,7 +127,7 @@
       allow(License).to receive(:current).and_return(nil)
       stub_application_setting(check_namespace_plan: false)
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
@@ -155,7 +155,7 @@
       allow(License).to receive(:current).and_return(nil)
       stub_application_setting(check_namespace_plan: false)
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
@@ -182,7 +182,7 @@
       stub_application_setting(check_namespace_plan: true)
       allow(Gitlab).to receive(:com?) { true }
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
@@ -209,7 +209,7 @@
       stub_application_setting(check_namespace_plan: true)
       allow(Gitlab).to receive(:com?) { true }
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
@@ -236,7 +236,7 @@
       allow(License).to receive(:current).and_return(nil)
       stub_application_setting(check_namespace_plan: false)
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
@@ -252,7 +252,7 @@
       allow(License).to receive(:current).and_return(nil)
       stub_application_setting(check_namespace_plan: false)
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
@@ -269,7 +269,7 @@
       allow(License).to receive(:current).and_return(nil)
       stub_application_setting(check_namespace_plan: false)
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
@@ -286,7 +286,7 @@
       allow(License).to receive(:current).and_return(nil)
       stub_application_setting(check_namespace_plan: false)
 
-      project.team << [user, :master]
+      project.add_master(user)
       sign_in(user)
     end
 
diff --git a/spec/features/signed_commits_spec.rb b/spec/features/signed_commits_spec.rb
index 8efa5b58141d..6088b831c14c 100644
--- a/spec/features/signed_commits_spec.rb
+++ b/spec/features/signed_commits_spec.rb
@@ -5,7 +5,7 @@
 
   it 'changes from unverified to verified when the user changes his email to match the gpg key' do
     user = create :user, email: 'unrelated.user@example.org'
-    project.team << [user, :master]
+    project.add_master(user)
 
     Sidekiq::Testing.inline! do
       create :gpg_key, key: GpgHelpers::User1.public_key, user: user
@@ -36,7 +36,7 @@
 
   it 'changes from unverified to verified when the user adds the missing gpg key' do
     user = create :user, email: GpgHelpers::User1.emails.first
-    project.team << [user, :master]
+    project.add_master(user)
 
     sign_in(user)
 
@@ -86,7 +86,7 @@
 
     before do
       user = create :user
-      project.team << [user, :master]
+      project.add_master(user)
 
       sign_in(user)
     end
diff --git a/spec/features/tags/master_creates_tag_spec.rb b/spec/features/tags/master_creates_tag_spec.rb
index 1f8bd8d681ef..8a8f6933fa5f 100644
--- a/spec/features/tags/master_creates_tag_spec.rb
+++ b/spec/features/tags/master_creates_tag_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project, :repository, namespace: user.namespace) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/tags/master_deletes_tag_spec.rb b/spec/features/tags/master_deletes_tag_spec.rb
index dfda664d673e..c0b4fa52526e 100644
--- a/spec/features/tags/master_deletes_tag_spec.rb
+++ b/spec/features/tags/master_deletes_tag_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project, :repository, namespace: user.namespace) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit project_tags_path(project)
   end
diff --git a/spec/features/tags/master_updates_tag_spec.rb b/spec/features/tags/master_updates_tag_spec.rb
index b93ad44dfd33..1c370a99b13f 100644
--- a/spec/features/tags/master_updates_tag_spec.rb
+++ b/spec/features/tags/master_updates_tag_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project, :repository, namespace: user.namespace) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
     visit project_tags_path(project)
   end
diff --git a/spec/features/tags/master_views_tags_spec.rb b/spec/features/tags/master_views_tags_spec.rb
index 9edc7ced163b..e54b9852b05e 100644
--- a/spec/features/tags/master_views_tags_spec.rb
+++ b/spec/features/tags/master_views_tags_spec.rb
@@ -4,7 +4,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     sign_in(user)
   end
 
diff --git a/spec/features/triggers_spec.rb b/spec/features/triggers_spec.rb
index bc472e749971..197841201082 100644
--- a/spec/features/triggers_spec.rb
+++ b/spec/features/triggers_spec.rb
@@ -10,9 +10,9 @@
     sign_in(user)
 
     @project = create(:project)
-    @project.team << [user, :master]
-    @project.team << [user2, :master]
-    @project.team << [guest_user, :guest]
+    @project.add_master(user)
+    @project.add_master(user2)
+    @project.add_guest(guest_user)
 
     visit project_settings_ci_cd_path(@project)
   end
diff --git a/spec/features/variables_spec.rb b/spec/features/variables_spec.rb
index dde60c835364..79ca2b4bb4a2 100644
--- a/spec/features/variables_spec.rb
+++ b/spec/features/variables_spec.rb
@@ -7,7 +7,7 @@
 
   before do
     sign_in(user)
-    project.team << [user, :master]
+    project.add_master(user)
     project.variables << variable
 
     visit project_settings_ci_cd_path(project)
diff --git a/spec/finders/access_requests_finder_spec.rb b/spec/finders/access_requests_finder_spec.rb
index 0789d3a9b449..650f72296476 100644
--- a/spec/finders/access_requests_finder_spec.rb
+++ b/spec/finders/access_requests_finder_spec.rb
@@ -51,7 +51,7 @@
 
     context 'when current user can see access requests' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         group.add_owner(user)
       end
 
@@ -78,7 +78,7 @@
 
     context 'when current user can see access requests' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         group.add_owner(user)
       end
 
diff --git a/spec/finders/group_projects_finder_spec.rb b/spec/finders/group_projects_finder_spec.rb
index d3596d6c97be..0c2da469777d 100644
--- a/spec/finders/group_projects_finder_spec.rb
+++ b/spec/finders/group_projects_finder_spec.rb
@@ -45,7 +45,7 @@
 
   describe 'without group member current_user' do
     before do
-      shared_project_2.team << [current_user, Gitlab::Access::MASTER]
+      shared_project_2.add_master(current_user)
       current_user.reload
     end
 
@@ -70,7 +70,7 @@
 
       context "without external user" do
         before do
-          private_project.team << [current_user, Gitlab::Access::MASTER]
+          private_project.add_master(current_user)
         end
 
         it { is_expected.to match_array([private_project, public_project]) }
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
index 7d7f8bf48868..5868e858829f 100644
--- a/spec/finders/issues_finder_spec.rb
+++ b/spec/finders/issues_finder_spec.rb
@@ -22,9 +22,9 @@
     let(:issues) { described_class.new(search_user, params.reverse_merge(scope: scope, state: 'opened')).execute }
 
     before(:context) do
-      project1.team << [user, :master]
-      project2.team << [user, :developer]
-      project2.team << [user2, :developer]
+      project1.add_master(user)
+      project2.add_developer(user)
+      project2.add_developer(user2)
 
       issue1
       issue2
diff --git a/spec/finders/labels_finder_spec.rb b/spec/finders/labels_finder_spec.rb
index afa2a40ed2ac..d507af3fd3df 100644
--- a/spec/finders/labels_finder_spec.rb
+++ b/spec/finders/labels_finder_spec.rb
@@ -27,7 +27,7 @@
       create(:label, project: project_3, title: 'Label 3')
       create(:group_label, group: group_3, title: 'Group Label 4')
 
-      project_1.team << [user, :developer]
+      project_1.add_developer(user)
     end
 
     context 'with no filter' do
@@ -73,7 +73,7 @@
 
           # project_3 has a label associated to it, which we don't want coming
           # back when we ask for the isolated project's labels
-          project_3.team << [admin, :reporter]
+          project_3.add_reporter(admin)
           finder = described_class.new(admin, project_id: isolated_project.id)
 
           expect(finder.execute).to be_empty
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index 67867f125687..f97dbe55ca76 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -20,10 +20,10 @@
   let!(:merge_request4) { create(:merge_request, :simple, author: user, source_project: project3, target_project: project3) }
 
   before do
-    project1.team << [user, :master]
-    project2.team << [user, :developer]
-    project3.team << [user, :developer]
-    project2.team << [user2, :developer]
+    project1.add_master(user)
+    project2.add_developer(user)
+    project3.add_developer(user)
+    project2.add_developer(user2)
   end
 
   describe "#execute" do
diff --git a/spec/finders/move_to_project_finder_spec.rb b/spec/finders/move_to_project_finder_spec.rb
index e577083a2d09..74639d4147f8 100644
--- a/spec/finders/move_to_project_finder_spec.rb
+++ b/spec/finders/move_to_project_finder_spec.rb
@@ -15,39 +15,39 @@
   describe '#execute' do
     context 'filter' do
       it 'does not return projects under Gitlab::Access::REPORTER' do
-        guest_project.team << [user, :guest]
+        guest_project.add_guest(user)
 
         expect(subject.execute(project)).to be_empty
       end
 
       it 'returns projects equal or above Gitlab::Access::REPORTER ordered by id in descending order' do
-        reporter_project.team << [user, :reporter]
-        developer_project.team << [user, :developer]
-        master_project.team << [user, :master]
+        reporter_project.add_reporter(user)
+        developer_project.add_developer(user)
+        master_project.add_master(user)
 
         expect(subject.execute(project).to_a).to eq([master_project, developer_project, reporter_project])
       end
 
       it 'does not include the source project' do
-        project.team << [user, :reporter]
+        project.add_reporter(user)
 
         expect(subject.execute(project).to_a).to be_empty
       end
 
       it 'does not return archived projects' do
-        reporter_project.team << [user, :reporter]
+        reporter_project.add_reporter(user)
         reporter_project.archive!
         other_reporter_project = create(:project)
-        other_reporter_project.team << [user, :reporter]
+        other_reporter_project.add_reporter(user)
 
         expect(subject.execute(project).to_a).to eq([other_reporter_project])
       end
 
       it 'does not return projects for which issues are disabled' do
-        reporter_project.team << [user, :reporter]
+        reporter_project.add_reporter(user)
         reporter_project.update_attributes(issues_enabled: false)
         other_reporter_project = create(:project)
-        other_reporter_project.team << [user, :reporter]
+        other_reporter_project.add_reporter(user)
 
         expect(subject.execute(project).to_a).to eq([other_reporter_project])
       end
@@ -55,9 +55,9 @@
       it 'returns a page of projects ordered by id in descending order' do
         stub_const 'MoveToProjectFinder::PAGE_SIZE', 2
 
-        reporter_project.team << [user, :reporter]
-        developer_project.team << [user, :developer]
-        master_project.team << [user, :master]
+        reporter_project.add_reporter(user)
+        developer_project.add_developer(user)
+        master_project.add_master(user)
 
         expect(subject.execute(project).to_a).to eq([master_project, developer_project])
       end
@@ -65,9 +65,9 @@
       it 'returns projects after the given offset id' do
         stub_const 'MoveToProjectFinder::PAGE_SIZE', 2
 
-        reporter_project.team << [user, :reporter]
-        developer_project.team << [user, :developer]
-        master_project.team << [user, :master]
+        reporter_project.add_reporter(user)
+        developer_project.add_developer(user)
+        master_project.add_master(user)
 
         expect(subject.execute(project, search: nil, offset_id: master_project.id).to_a).to eq([developer_project, reporter_project])
         expect(subject.execute(project, search: nil, offset_id: developer_project.id).to_a).to eq([reporter_project])
@@ -84,10 +84,10 @@
 
       it 'returns projects matching a search query' do
         foo_project = create(:project)
-        foo_project.team << [user, :master]
+        foo_project.add_master(user)
 
         wadus_project = create(:project, name: 'wadus')
-        wadus_project.team << [user, :master]
+        wadus_project.add_master(user)
 
         expect(subject.execute(project).to_a).to eq([wadus_project, foo_project])
         expect(subject.execute(project, search: 'wadus').to_a).to eq([wadus_project])
diff --git a/spec/finders/notes_finder_spec.rb b/spec/finders/notes_finder_spec.rb
index 900fa2b12d1d..7b43494eea2f 100644
--- a/spec/finders/notes_finder_spec.rb
+++ b/spec/finders/notes_finder_spec.rb
@@ -5,7 +5,7 @@
   let(:project) { create(:project) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe '#execute' do
@@ -147,7 +147,7 @@
 
         it 'raises an error for project members with guest role' do
           user = create(:user)
-          project.team << [user, :guest]
+          project.add_guest(user)
 
           expect { described_class.new(project, user, params).execute }.to raise_error(ActiveRecord::RecordNotFound)
         end
@@ -189,7 +189,7 @@
 
       it "does not return notes with matching content for project members with guest role" do
         user = create(:user)
-        project.team << [user, :guest]
+        project.add_guest(user)
         expect(described_class.new(confidential_note.project, user, search: confidential_note.note).execute).to be_empty
       end
 
diff --git a/spec/finders/personal_projects_finder_spec.rb b/spec/finders/personal_projects_finder_spec.rb
index d0113ba87df6..5e52898e9c01 100644
--- a/spec/finders/personal_projects_finder_spec.rb
+++ b/spec/finders/personal_projects_finder_spec.rb
@@ -15,7 +15,7 @@
   end
 
   before do
-    private_project.team << [current_user, Gitlab::Access::DEVELOPER]
+    private_project.add_developer(current_user)
   end
 
   describe 'without a current user' do
diff --git a/spec/finders/snippets_finder_spec.rb b/spec/finders/snippets_finder_spec.rb
index 4607af8d11fe..1ee519d77387 100644
--- a/spec/finders/snippets_finder_spec.rb
+++ b/spec/finders/snippets_finder_spec.rb
@@ -188,7 +188,7 @@
     end
 
     it "returns all snippets for project members" do
-      project1.team << [user, :developer]
+      project1.add_developer(user)
 
       snippets = described_class.new(user, project: project1).execute
 
@@ -196,7 +196,7 @@
     end
 
     it "returns private snippets for project members" do
-      project1.team << [user, :developer]
+      project1.add_developer(user)
 
       snippets = described_class.new(user, project: project1, visibility: Snippet::PRIVATE).execute
 
diff --git a/spec/finders/todos_finder_spec.rb b/spec/finders/todos_finder_spec.rb
index 884ce22091e2..90eb0fe21e4f 100644
--- a/spec/finders/todos_finder_spec.rb
+++ b/spec/finders/todos_finder_spec.rb
@@ -7,7 +7,7 @@
     let(:finder)        { described_class }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     describe '#sort' do
diff --git a/spec/helpers/markup_helper_spec.rb b/spec/helpers/markup_helper_spec.rb
index ba0039f3a11b..c0dc9293397d 100644
--- a/spec/helpers/markup_helper_spec.rb
+++ b/spec/helpers/markup_helper_spec.rb
@@ -11,7 +11,7 @@
 
   before do
     # Ensure the generated reference links aren't redacted
-    project.team << [user, :master]
+    project.add_master(user)
 
     # Helper expects a @project instance variable
     helper.instance_variable_set(:@project, project)
diff --git a/spec/helpers/notes_helper_spec.rb b/spec/helpers/notes_helper_spec.rb
index cd15e27b4976..b40f96e3473d 100644
--- a/spec/helpers/notes_helper_spec.rb
+++ b/spec/helpers/notes_helper_spec.rb
@@ -17,9 +17,9 @@
 
   before do
     group.add_owner(owner)
-    project.team << [master, :master]
-    project.team << [reporter, :reporter]
-    project.team << [guest, :guest]
+    project.add_master(master)
+    project.add_reporter(reporter)
+    project.add_guest(guest)
   end
 
   describe "#notes_max_access_for_users" do
@@ -31,7 +31,7 @@
 
     it 'handles access in different projects' do
       second_project = create(:project)
-      second_project.team << [master, :reporter]
+      second_project.add_reporter(master)
       other_note = create(:note, author: master, project: second_project)
 
       expect(helper.note_max_access_for_user(master_note)).to eq(Gitlab::Access::MASTER)
diff --git a/spec/lib/banzai/filter/redactor_filter_spec.rb b/spec/lib/banzai/filter/redactor_filter_spec.rb
index 68643effb66b..5a7858e77f37 100644
--- a/spec/lib/banzai/filter/redactor_filter_spec.rb
+++ b/spec/lib/banzai/filter/redactor_filter_spec.rb
@@ -46,7 +46,7 @@ def reference_link(data)
       it 'allows permitted Project references' do
         user = create(:user)
         project = create(:project)
-        project.team << [user, :master]
+        project.add_master(user)
 
         link = reference_link(project: project.id, reference_type: 'test')
         doc = filter(link, current_user: user)
@@ -94,7 +94,7 @@ def reference_link(data)
       it 'removes references for project members with guest role' do
         member = create(:user)
         project = create(:project, :public)
-        project.team << [member, :guest]
+        project.add_guest(member)
         issue = create(:issue, :confidential, project: project)
 
         link = reference_link(project: project.id, issue: issue.id, reference_type: 'issue')
@@ -128,7 +128,7 @@ def reference_link(data)
       it 'allows references for project members' do
         member = create(:user)
         project = create(:project, :public)
-        project.team << [member, :developer]
+        project.add_developer(member)
         issue = create(:issue, :confidential, project: project)
 
         link = reference_link(project: project.id, issue: issue.id, reference_type: 'issue')
diff --git a/spec/lib/banzai/filter/user_reference_filter_spec.rb b/spec/lib/banzai/filter/user_reference_filter_spec.rb
index fc03741976ed..c76adc262fca 100644
--- a/spec/lib/banzai/filter/user_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/user_reference_filter_spec.rb
@@ -34,11 +34,11 @@
     let(:reference) { User.reference_prefix + 'all' }
 
     before do
-      project.team << [project.creator, :developer]
+      project.add_developer(project.creator)
     end
 
     it 'supports a special @all mention' do
-      project.team << [user, :developer]
+      project.add_developer(user)
       doc = reference_filter("Hey #{reference}", author: user)
 
       expect(doc.css('a').length).to eq 1
@@ -47,7 +47,7 @@
     end
 
     it 'includes a data-author attribute when there is an author' do
-      project.team << [user, :developer]
+      project.add_developer(user)
       doc = reference_filter(reference, author: user)
 
       expect(doc.css('a').first.attr('data-author')).to eq(user.id.to_s)
diff --git a/spec/lib/banzai/reference_parser/user_parser_spec.rb b/spec/lib/banzai/reference_parser/user_parser_spec.rb
index e49726aca6ce..b079a3be0298 100644
--- a/spec/lib/banzai/reference_parser/user_parser_spec.rb
+++ b/spec/lib/banzai/reference_parser/user_parser_spec.rb
@@ -63,8 +63,8 @@
         let(:contributor) { create(:user) }
 
         before do
-          project.team << [user, :developer]
-          project.team << [contributor, :developer]
+          project.add_developer(user)
+          project.add_developer(contributor)
         end
 
         it 'returns the members of a project' do
@@ -162,7 +162,7 @@
     context 'when the link has a data-author attribute' do
       it 'returns the nodes when the user is a member of the project' do
         other_project = create(:project)
-        other_project.team << [user, :developer]
+        other_project.add_developer(user)
 
         link['data-project'] = other_project.id.to_s
         link['data-author'] = user.id.to_s
diff --git a/spec/lib/gitlab/ci/status/build/common_spec.rb b/spec/lib/gitlab/ci/status/build/common_spec.rb
index 03d1f46b517b..2cce7a23ea7f 100644
--- a/spec/lib/gitlab/ci/status/build/common_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/common_spec.rb
@@ -18,7 +18,7 @@
   describe '#has_details?' do
     context 'when user has access to read build' do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it { is_expected.to have_details }
diff --git a/spec/lib/gitlab/ci/status/external/common_spec.rb b/spec/lib/gitlab/ci/status/external/common_spec.rb
index b38fbee24869..40871f865683 100644
--- a/spec/lib/gitlab/ci/status/external/common_spec.rb
+++ b/spec/lib/gitlab/ci/status/external/common_spec.rb
@@ -29,7 +29,7 @@
   describe '#has_details?' do
     context 'when user has access to read commit status' do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it { is_expected.to have_details }
diff --git a/spec/lib/gitlab/ci/status/external/factory_spec.rb b/spec/lib/gitlab/ci/status/external/factory_spec.rb
index c96fd53e730c..529d02a3e396 100644
--- a/spec/lib/gitlab/ci/status/external/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/external/factory_spec.rb
@@ -8,7 +8,7 @@
   let(:external_url) { 'http://gitlab.com/status' }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   context 'when external status has a simple core status' do
diff --git a/spec/lib/gitlab/ci/status/pipeline/common_spec.rb b/spec/lib/gitlab/ci/status/pipeline/common_spec.rb
index 4a5b45e7cae3..57df8325635e 100644
--- a/spec/lib/gitlab/ci/status/pipeline/common_spec.rb
+++ b/spec/lib/gitlab/ci/status/pipeline/common_spec.rb
@@ -18,7 +18,7 @@
   describe '#has_details?' do
     context 'when user has access to read pipeline' do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it { is_expected.to have_details }
diff --git a/spec/lib/gitlab/ci/status/pipeline/factory_spec.rb b/spec/lib/gitlab/ci/status/pipeline/factory_spec.rb
index dd754b849b22..defb3fdc0df2 100644
--- a/spec/lib/gitlab/ci/status/pipeline/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/pipeline/factory_spec.rb
@@ -7,7 +7,7 @@
   let(:factory) { described_class.new(pipeline, user) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   context 'when pipeline has a core status' do
diff --git a/spec/lib/gitlab/ci/status/stage/common_spec.rb b/spec/lib/gitlab/ci/status/stage/common_spec.rb
index f5f03ac03956..6ec35f8da7ed 100644
--- a/spec/lib/gitlab/ci/status/stage/common_spec.rb
+++ b/spec/lib/gitlab/ci/status/stage/common_spec.rb
@@ -27,7 +27,7 @@
 
   context 'when user has permission to read pipeline' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     it 'has details' do
diff --git a/spec/lib/gitlab/ci/status/stage/factory_spec.rb b/spec/lib/gitlab/ci/status/stage/factory_spec.rb
index 432b07e4902b..dee4f4efd1bc 100644
--- a/spec/lib/gitlab/ci/status/stage/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/stage/factory_spec.rb
@@ -18,7 +18,7 @@
   end
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   context 'when stage has a core status' do
diff --git a/spec/lib/gitlab/closing_issue_extractor_spec.rb b/spec/lib/gitlab/closing_issue_extractor_spec.rb
index ef7d766a13d5..8c79ef54c6cd 100644
--- a/spec/lib/gitlab/closing_issue_extractor_spec.rb
+++ b/spec/lib/gitlab/closing_issue_extractor_spec.rb
@@ -13,8 +13,8 @@
   subject { described_class.new(project, project.creator) }
 
   before do
-    project.team  << [project.creator, :developer]
-    project2.team << [project.creator, :master]
+    project.add_developer(project.creator)
+    project2.add_master(project.creator)
   end
 
   describe "#closed_by_message" do
@@ -297,7 +297,7 @@
       context 'with an external issue tracker reference' do
         it 'extracts the referenced issue' do
           jira_project = create(:jira_project, name: 'JIRA_EXT1')
-          jira_project.team << [jira_project.creator, :master]
+          jira_project.add_master(jira_project.creator)
           jira_issue = ExternalIssue.new("#{jira_project.name}-1", project: jira_project)
           closing_issue_extractor = described_class.new(jira_project, jira_project.creator)
           message = "Resolve #{jira_issue.to_reference}"
diff --git a/spec/lib/gitlab/cycle_analytics/permissions_spec.rb b/spec/lib/gitlab/cycle_analytics/permissions_spec.rb
index 2a0dd7be4392..6de4bd3dc7cf 100644
--- a/spec/lib/gitlab/cycle_analytics/permissions_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/permissions_spec.rb
@@ -38,7 +38,7 @@
 
   context 'user is master' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     it 'has permissions to issue stage' do
@@ -72,7 +72,7 @@
 
   context 'user has no build permissions' do
     before do
-      project.team << [user, :guest]
+      project.add_guest(user)
     end
 
     it 'has permissions to issue stage' do
@@ -90,7 +90,7 @@
 
   context 'user has no merge request permissions' do
     before do
-      project.team << [user, :guest]
+      project.add_guest(user)
     end
 
     it 'has permissions to issue stage' do
@@ -108,7 +108,7 @@
 
   context 'user has no issue permissions' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED)
     end
 
diff --git a/spec/lib/gitlab/elastic/project_search_results_spec.rb b/spec/lib/gitlab/elastic/project_search_results_spec.rb
index 0c34b1f66444..b24113387078 100644
--- a/spec/lib/gitlab/elastic/project_search_results_spec.rb
+++ b/spec/lib/gitlab/elastic/project_search_results_spec.rb
@@ -191,7 +191,7 @@
     end
 
     it 'lists project confidential issues for project members' do
-      project.team << [member, :developer]
+      project.add_developer(member)
 
       results = described_class.new(member, query, project.id)
       issues = results.objects('issues')
@@ -203,7 +203,7 @@
     end
 
     it 'does not list project confidential issues for project members with guest role' do
-      project.team << [member, :guest]
+      project.add_guest(member)
 
       results = described_class.new(member, query, project.id)
       issues = results.objects('issues')
diff --git a/spec/lib/gitlab/elastic/search_results_spec.rb b/spec/lib/gitlab/elastic/search_results_spec.rb
index 3426f42025d1..63b2f3f5bce0 100644
--- a/spec/lib/gitlab/elastic/search_results_spec.rb
+++ b/spec/lib/gitlab/elastic/search_results_spec.rb
@@ -196,8 +196,8 @@
       end
 
       it 'lists confidential issues for project members' do
-        project_1.team << [member, :developer]
-        project_2.team << [member, :developer]
+        project_1.add_developer(member)
+        project_2.add_developer(member)
 
         results = described_class.new(member, query, limit_project_ids)
         issues = results.objects('issues')
@@ -281,8 +281,8 @@
       end
 
       it 'lists confidential issues for project members' do
-        project_2.team << [member, :developer]
-        project_3.team << [member, :developer]
+        project_2.add_developer(member)
+        project_3.add_developer(member)
 
         results = described_class.new(member, query, limit_project_ids)
         issues = results.objects('issues')
diff --git a/spec/lib/gitlab/email/handler/create_note_handler_spec.rb b/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
index d0fa16ce4d17..031efcf12914 100644
--- a/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
@@ -66,7 +66,7 @@
 
       context 'and current user can update noteable' do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         it 'does not raise an error' do
@@ -99,7 +99,7 @@
 
     context 'and current user can update noteable' do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it 'post a note and updates the noteable' do
diff --git a/spec/lib/gitlab/gfm/reference_rewriter_spec.rb b/spec/lib/gitlab/gfm/reference_rewriter_spec.rb
index 7dc06c900783..4d2f08f95fce 100644
--- a/spec/lib/gitlab/gfm/reference_rewriter_spec.rb
+++ b/spec/lib/gitlab/gfm/reference_rewriter_spec.rb
@@ -10,7 +10,7 @@
   let(:text) { 'some text' }
 
   before do
-    old_project.team << [user, :reporter]
+    old_project.add_reporter(user)
   end
 
   describe '#rewrite' do
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index 03a9cc488cae..d20a2ca935ff 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -1670,7 +1670,7 @@ def commit_files(commit)
       let(:branch_name) { "to-be-deleted-soon" }
 
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
         repository.create_branch(branch_name)
       end
 
diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb
index 5e09b32d1305..d1ec6229a4a1 100644
--- a/spec/lib/gitlab/git_access_spec.rb
+++ b/spec/lib/gitlab/git_access_spec.rb
@@ -275,7 +275,7 @@ def disable_protocol(protocol)
 
   describe '#check_command_disabled!' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     context 'over http' do
@@ -404,7 +404,7 @@ def disable_protocol(protocol)
 
       describe 'reporter user' do
         before do
-          project.team << [user, :reporter]
+          project.add_reporter(user)
         end
 
         context 'pull code' do
@@ -417,7 +417,7 @@ def disable_protocol(protocol)
 
         context 'when member of the project' do
           before do
-            project.team << [user, :reporter]
+            project.add_reporter(user)
           end
 
           context 'pull code' do
@@ -498,7 +498,7 @@ def self.run_permission_checks(permissions_matrix)
           if role == :admin
             user.update_attribute(:admin, true)
           else
-            project.team << [user, role]
+            project.add_role(user, role)
           end
 
           aggregate_failures do
@@ -944,7 +944,7 @@ def self.run_group_permission_checks(permissions_matrix)
 
     context 'when project is authorized' do
       before do
-        project.team << [user, :reporter]
+        project.add_reporter(user)
       end
 
       it { expect { push_access_check }.to raise_unauthorized(described_class::ERROR_MESSAGES[:upload]) }
diff --git a/spec/lib/gitlab/git_access_wiki_spec.rb b/spec/lib/gitlab/git_access_wiki_spec.rb
index 1056074264a4..186b2d9279d4 100644
--- a/spec/lib/gitlab/git_access_wiki_spec.rb
+++ b/spec/lib/gitlab/git_access_wiki_spec.rb
@@ -18,7 +18,7 @@
     context 'when user can :create_wiki' do
       before do
         create(:protected_branch, name: 'master', project: project)
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       subject { access.check('git-receive-pack', changes) }
@@ -41,7 +41,7 @@
     subject { access.check('git-upload-pack', '_any') }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     context 'when wiki feature is enabled' do
diff --git a/spec/lib/gitlab/google_code_import/importer_spec.rb b/spec/lib/gitlab/google_code_import/importer_spec.rb
index 798ea0bac584..017facd0f5e9 100644
--- a/spec/lib/gitlab/google_code_import/importer_spec.rb
+++ b/spec/lib/gitlab/google_code_import/importer_spec.rb
@@ -15,7 +15,7 @@
   subject { described_class.new(project) }
 
   before do
-    project.team << [project.creator, :master]
+    project.add_master(project.creator)
     project.create_import_data(data: import_data)
   end
 
diff --git a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
index cccf764e0491..ef7f2cfc27b2 100644
--- a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
@@ -9,7 +9,7 @@
     let!(:project) { setup_project }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
       allow_any_instance_of(MergeRequest).to receive(:source_branch_sha).and_return('ABCD')
       allow_any_instance_of(MergeRequest).to receive(:target_branch_sha).and_return('DCBA')
diff --git a/spec/lib/gitlab/import_export/repo_saver_spec.rb b/spec/lib/gitlab/import_export/repo_saver_spec.rb
index e6ad516deef3..44f972fe530b 100644
--- a/spec/lib/gitlab/import_export/repo_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/repo_saver_spec.rb
@@ -9,7 +9,7 @@
     let(:bundler) { described_class.new(project: project, shared: shared) }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
     end
 
diff --git a/spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb b/spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb
index 0e55993c8ef3..1d1e7e7f89a2 100644
--- a/spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb
@@ -10,7 +10,7 @@
     let!(:project_wiki) { ProjectWiki.new(project, user) }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
       project_wiki.wiki
       project_wiki.create_page("index", "test content")
diff --git a/spec/lib/gitlab/project_authorizations_spec.rb b/spec/lib/gitlab/project_authorizations_spec.rb
index 953cfbb8b881..f3cd6961e943 100644
--- a/spec/lib/gitlab/project_authorizations_spec.rb
+++ b/spec/lib/gitlab/project_authorizations_spec.rb
@@ -15,7 +15,7 @@ def map_access_levels(rows)
   end
 
   before do
-    other_project.team << [user, :reporter]
+    other_project.add_reporter(user)
     group.add_developer(user)
   end
 
diff --git a/spec/lib/gitlab/project_search_results_spec.rb b/spec/lib/gitlab/project_search_results_spec.rb
index bde47133d066..ccf839fbe0a9 100644
--- a/spec/lib/gitlab/project_search_results_spec.rb
+++ b/spec/lib/gitlab/project_search_results_spec.rb
@@ -179,7 +179,7 @@
     end
 
     it 'does not list project confidential issues for project members with guest role' do
-      project.team << [member, :guest]
+      project.add_guest(member)
 
       results = described_class.new(member, project, query)
       issues = results.objects('issues')
@@ -211,7 +211,7 @@
     end
 
     it 'lists project confidential issues for project members' do
-      project.team << [member, :developer]
+      project.add_developer(member)
 
       results = described_class.new(member, project, query)
       issues = results.objects('issues')
@@ -290,12 +290,12 @@
       let!(:private_project) { create(:project, :private, :repository, creator: creator, namespace: creator.namespace) }
       let(:team_master) do
         user = create(:user, username: 'private-project-master')
-        private_project.team << [user, :master]
+        private_project.add_master(user)
         user
       end
       let(:team_reporter) do
         user = create(:user, username: 'private-project-reporter')
-        private_project.team << [user, :reporter]
+        private_project.add_reporter(user)
         user
       end
 
diff --git a/spec/lib/gitlab/reference_extractor_spec.rb b/spec/lib/gitlab/reference_extractor_spec.rb
index 8a374beeb634..c75f08846553 100644
--- a/spec/lib/gitlab/reference_extractor_spec.rb
+++ b/spec/lib/gitlab/reference_extractor_spec.rb
@@ -15,8 +15,8 @@
     @u_bar = create(:user, username: 'bar')
     @u_offteam = create(:user, username: 'offteam')
 
-    project.team << [@u_foo, :reporter]
-    project.team << [@u_bar, :guest]
+    project.add_guest(@u_foo)
+    project.add_guest(@u_bar)
 
     subject.analyze('@foo, @baduser, @bar, and @offteam')
     expect(subject.users).to match_array([@u_foo, @u_bar, @u_offteam])
@@ -27,8 +27,8 @@
     @u_bar = create(:user, username: 'bar')
     @u_offteam = create(:user, username: 'offteam')
 
-    project.team << [@u_foo, :reporter]
-    project.team << [@u_bar, :guest]
+    project.add_reporter(@u_foo)
+    project.add_reporter(@u_bar)
 
     subject.analyze(%Q{
       Inline code: `@foo`
@@ -243,7 +243,7 @@
     let(:issue) { create(:issue, project: other_project) }
 
     before do
-      other_project.team << [project.creator, :developer]
+      other_project.add_developer(project.creator)
     end
 
     it 'handles project issue references' do
@@ -261,7 +261,7 @@
     let(:text) { "Ref. #{issue.to_reference} and #{label.to_reference}" }
 
     before do
-      project.team << [project.creator, :developer]
+      project.add_developer(project.creator)
       subject.analyze(text)
     end
 
diff --git a/spec/lib/gitlab/search_results_spec.rb b/spec/lib/gitlab/search_results_spec.rb
index e44a7c234521..3b1518fcb3ff 100644
--- a/spec/lib/gitlab/search_results_spec.rb
+++ b/spec/lib/gitlab/search_results_spec.rb
@@ -16,7 +16,7 @@
 
   context 'as a user with access' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     describe '#projects_count' do
@@ -93,8 +93,8 @@
     end
 
     it 'does not list confidential issues for project members with guest role' do
-      project_1.team << [member, :guest]
-      project_2.team << [member, :guest]
+      project_1.add_guest(member)
+      project_2.add_guest(member)
 
       results = described_class.new(member, limit_projects, query)
       issues = results.objects('issues')
@@ -135,8 +135,8 @@
     end
 
     it 'lists confidential issues for project members' do
-      project_1.team << [member, :developer]
-      project_2.team << [member, :developer]
+      project_1.add_developer(member)
+      project_2.add_developer(member)
 
       results = described_class.new(member, limit_projects, query)
       issues = results.objects('issues')
diff --git a/spec/lib/gitlab/slash_commands/issue_new_spec.rb b/spec/lib/gitlab/slash_commands/issue_new_spec.rb
index 75ae58d05825..3b077c58c502 100644
--- a/spec/lib/gitlab/slash_commands/issue_new_spec.rb
+++ b/spec/lib/gitlab/slash_commands/issue_new_spec.rb
@@ -7,7 +7,7 @@
     let(:regex_match) { described_class.match("issue create bird is the word") }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     subject do
diff --git a/spec/lib/gitlab/slash_commands/issue_search_spec.rb b/spec/lib/gitlab/slash_commands/issue_search_spec.rb
index 51f592164132..e41e5254dde6 100644
--- a/spec/lib/gitlab/slash_commands/issue_search_spec.rb
+++ b/spec/lib/gitlab/slash_commands/issue_search_spec.rb
@@ -21,7 +21,7 @@
 
     context 'the user has access' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
       end
 
       it 'returns all results' do
diff --git a/spec/lib/gitlab/slash_commands/issue_show_spec.rb b/spec/lib/gitlab/slash_commands/issue_show_spec.rb
index 08c380ca8f10..e5834d5a2ee7 100644
--- a/spec/lib/gitlab/slash_commands/issue_show_spec.rb
+++ b/spec/lib/gitlab/slash_commands/issue_show_spec.rb
@@ -8,7 +8,7 @@
     let(:regex_match) { described_class.match("issue show #{issue.iid}") }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     subject do
diff --git a/spec/lib/gitlab/user_access_spec.rb b/spec/lib/gitlab/user_access_spec.rb
index cd97416bcc98..7280acb6c82f 100644
--- a/spec/lib/gitlab/user_access_spec.rb
+++ b/spec/lib/gitlab/user_access_spec.rb
@@ -8,19 +8,19 @@
   describe '#can_push_to_branch?' do
     describe 'push to none protected branch' do
       it 'returns true if user is a master' do
-        project.team << [user, :master]
+        project.add_master(user)
 
         expect(access.can_push_to_branch?('random_branch')).to be_truthy
       end
 
       it 'returns true if user is a developer' do
-        project.team << [user, :developer]
+        project.add_developer(user)
 
         expect(access.can_push_to_branch?('random_branch')).to be_truthy
       end
 
       it 'returns false if user is a reporter' do
-        project.team << [user, :reporter]
+        project.add_reporter(user)
 
         expect(access.can_push_to_branch?('random_branch')).to be_falsey
       end
@@ -31,34 +31,34 @@
       let(:project_access) { described_class.new(user, project: empty_project) }
 
       it 'returns true if user is master' do
-        empty_project.team << [user, :master]
+        empty_project.add_master(user)
 
         expect(project_access.can_push_to_branch?('master')).to be_truthy
       end
 
       it 'returns false if user is developer and project is fully protected' do
-        empty_project.team << [user, :developer]
+        empty_project.add_developer(user)
         stub_application_setting(default_branch_protection: Gitlab::Access::PROTECTION_FULL)
 
         expect(project_access.can_push_to_branch?('master')).to be_falsey
       end
 
       it 'returns false if user is developer and it is not allowed to push new commits but can merge into branch' do
-        empty_project.team << [user, :developer]
+        empty_project.add_developer(user)
         stub_application_setting(default_branch_protection: Gitlab::Access::PROTECTION_DEV_CAN_MERGE)
 
         expect(project_access.can_push_to_branch?('master')).to be_falsey
       end
 
       it 'returns true if user is developer and project is unprotected' do
-        empty_project.team << [user, :developer]
+        empty_project.add_developer(user)
         stub_application_setting(default_branch_protection: Gitlab::Access::PROTECTION_NONE)
 
         expect(project_access.can_push_to_branch?('master')).to be_truthy
       end
 
       it 'returns true if user is developer and project grants developers permission' do
-        empty_project.team << [user, :developer]
+        empty_project.add_developer(user)
         stub_application_setting(default_branch_protection: Gitlab::Access::PROTECTION_DEV_CAN_PUSH)
 
         expect(project_access.can_push_to_branch?('master')).to be_truthy
@@ -70,25 +70,25 @@
       let(:not_existing_branch) { create :protected_branch, :developers_can_merge, project: project }
 
       it 'returns true if user is a master' do
-        project.team << [user, :master]
+        project.add_master(user)
 
         expect(access.can_push_to_branch?(branch.name)).to be_truthy
       end
 
       it 'returns false if user is a developer' do
-        project.team << [user, :developer]
+        project.add_developer(user)
 
         expect(access.can_push_to_branch?(branch.name)).to be_falsey
       end
 
       it 'returns false if user is a reporter' do
-        project.team << [user, :reporter]
+        project.add_reporter(user)
 
         expect(access.can_push_to_branch?(branch.name)).to be_falsey
       end
 
       it 'returns false if branch does not exist' do
-        project.team << [user, :developer]
+        project.add_developer(user)
 
         expect(access.can_push_to_branch?(not_existing_branch.name)).to be_falsey
       end
@@ -100,19 +100,19 @@
       end
 
       it 'returns true if user is a master' do
-        project.team << [user, :master]
+        project.add_master(user)
 
         expect(access.can_push_to_branch?(@branch.name)).to be_truthy
       end
 
       it 'returns true if user is a developer' do
-        project.team << [user, :developer]
+        project.add_developer(user)
 
         expect(access.can_push_to_branch?(@branch.name)).to be_truthy
       end
 
       it 'returns false if user is a reporter' do
-        project.team << [user, :reporter]
+        project.add_reporter(user)
 
         expect(access.can_push_to_branch?(@branch.name)).to be_falsey
       end
@@ -124,19 +124,19 @@
       end
 
       it 'returns true if user is a master' do
-        project.team << [user, :master]
+        project.add_master(user)
 
         expect(access.can_merge_to_branch?(@branch.name)).to be_truthy
       end
 
       it 'returns true if user is a developer' do
-        project.team << [user, :developer]
+        project.add_developer(user)
 
         expect(access.can_merge_to_branch?(@branch.name)).to be_truthy
       end
 
       it 'returns false if user is a reporter' do
-        project.team << [user, :reporter]
+        project.add_reporter(user)
 
         expect(access.can_merge_to_branch?(@branch.name)).to be_falsey
       end
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index 0497a01b7604..94f80f6ae74a 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -532,7 +532,7 @@ def have_referable_subject(referable, reply: false)
       context 'for a project in a user namespace' do
         let(:project) do
           create(:project, :public, :access_requestable) do |project|
-            project.team << [project.owner, :master, project.owner]
+            project.add_master(project.owner, current_user: project.owner)
           end
         end
 
@@ -635,7 +635,7 @@ def invite_to_project(project, inviter:)
     end
 
     describe 'project invitation' do
-      let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
+      let(:master) { create(:user).tap { |u| project.add_master(u) } }
       let(:project_member) { invite_to_project(project, inviter: master) }
 
       subject { described_class.member_invited_email('project', project_member.id, project_member.invite_token) }
@@ -655,7 +655,7 @@ def invite_to_project(project, inviter:)
 
     describe 'project invitation accepted' do
       let(:invited_user) { create(:user, name: 'invited user') }
-      let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
+      let(:master) { create(:user).tap { |u| project.add_master(u) } }
       let(:project_member) do
         invitee = invite_to_project(project, inviter: master)
         invitee.accept_invite!(invited_user)
@@ -678,7 +678,7 @@ def invite_to_project(project, inviter:)
     end
 
     describe 'project invitation declined' do
-      let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
+      let(:master) { create(:user).tap { |u| project.add_master(u) } }
       let(:project_member) do
         invitee = invite_to_project(project, inviter: master)
         invitee.decline_invite!
diff --git a/spec/models/ability_spec.rb b/spec/models/ability_spec.rb
index 71aa51e18571..38fb98d4f500 100644
--- a/spec/models/ability_spec.rb
+++ b/spec/models/ability_spec.rb
@@ -34,19 +34,19 @@
       end
 
       it 'returns false for a guest user' do
-        project.team << [user, :guest]
+        project.add_guest(user)
 
         expect(described_class.can_edit_note?(user, note)).to be_falsy
       end
 
       it 'returns false for a developer' do
-        project.team << [user, :developer]
+        project.add_developer(user)
 
         expect(described_class.can_edit_note?(user, note)).to be_falsy
       end
 
       it 'returns true for a master' do
-        project.team << [user, :master]
+        project.add_master(user)
 
         expect(described_class.can_edit_note?(user, note)).to be_truthy
       end
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index dfccbbde6bdb..4cc37255b228 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -1444,7 +1444,7 @@ def create_build(name, stage_idx)
     end
 
     before do
-      project.team << [pipeline.user, Gitlab::Access::DEVELOPER]
+      project.add_developer(pipeline.user)
 
       pipeline.user.global_notification_setting
         .update(level: 'custom', failed_pipeline: true, success_pipeline: true)
diff --git a/spec/models/ci/trigger_spec.rb b/spec/models/ci/trigger_spec.rb
index bd9c837402f8..d4b72205203c 100644
--- a/spec/models/ci/trigger_spec.rb
+++ b/spec/models/ci/trigger_spec.rb
@@ -69,7 +69,7 @@
 
       context 'and is member of the project' do
         before do
-          project.team << [owner, :developer]
+          project.add_developer(owner)
         end
 
         it { is_expected.to eq(true) }
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index cd955a5eb699..4f02dc33cd89 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -193,8 +193,8 @@
     let(:commiter) { create :user }
 
     before do
-      project.team << [commiter, :developer]
-      other_project.team << [commiter, :developer]
+      project.add_developer(commiter)
+      other_project.add_developer(commiter)
     end
 
     it 'detects issues that this commit is marked as closing' do
diff --git a/spec/models/concerns/elastic/note_spec.rb b/spec/models/concerns/elastic/note_spec.rb
index 296b6f41ee5e..bc6939f16e52 100644
--- a/spec/models/concerns/elastic/note_spec.rb
+++ b/spec/models/concerns/elastic/note_spec.rb
@@ -125,7 +125,7 @@
       issue = create :issue, :confidential, author: user
 
       member = create(:user)
-      issue.project.team << [member, :developer]
+      issue.project.add_developer(member)
 
       Sidekiq::Testing.inline! do
         create_notes_for(issue, 'bla-bla term')
@@ -142,7 +142,7 @@
       issue = create :issue, :confidential, author: user
 
       member = create(:user)
-      issue.project.team << [member, :guest]
+      issue.project.add_guest(member)
 
       Sidekiq::Testing.inline! do
         create_notes_for(issue, 'bla-bla term')
diff --git a/spec/models/concerns/elastic/snippet_spec.rb b/spec/models/concerns/elastic/snippet_spec.rb
index c26c19e2c1b0..5ce254afebce 100644
--- a/spec/models/concerns/elastic/snippet_spec.rb
+++ b/spec/models/concerns/elastic/snippet_spec.rb
@@ -45,7 +45,7 @@
 
     it 'returns public, internal snippets, and project private snippets for project members' do
       member = create(:user)
-      project.team << [member, :developer]
+      project.add_developer(member)
 
       result = described_class.elastic_search_code('password', options: { user: member })
 
diff --git a/spec/models/concerns/mentionable_spec.rb b/spec/models/concerns/mentionable_spec.rb
index 8b545aec7f56..c73ea6aa94c4 100644
--- a/spec/models/concerns/mentionable_spec.rb
+++ b/spec/models/concerns/mentionable_spec.rb
@@ -62,7 +62,7 @@ def referenced_issues(current_user)
 
       context 'when the current user can see the issue' do
         before do
-          private_project.team << [user, Gitlab::Access::DEVELOPER]
+          private_project.add_developer(user)
         end
 
         it 'includes the reference' do
@@ -107,7 +107,7 @@ def referenced_issues(current_user)
     let(:issues)  { create_list(:issue, 2, project: project, author: author) }
 
     before do
-      project.team << [author, Gitlab::Access::DEVELOPER]
+      project.add_developer(author)
     end
 
     context 'before changes are persisted' do
diff --git a/spec/models/concerns/milestoneish_spec.rb b/spec/models/concerns/milestoneish_spec.rb
index 673c609f5349..87bf731340f5 100644
--- a/spec/models/concerns/milestoneish_spec.rb
+++ b/spec/models/concerns/milestoneish_spec.rb
@@ -24,8 +24,8 @@
   let(:label_3) { create(:label, title: 'label_3', project: project) }
 
   before do
-    project.team << [member, :developer]
-    project.team << [guest, :guest]
+    project.add_developer(member)
+    project.add_guest(guest)
   end
 
   describe '#sorted_issues' do
diff --git a/spec/models/concerns/resolvable_discussion_spec.rb b/spec/models/concerns/resolvable_discussion_spec.rb
index 1616c2ea985d..2a2ef5a304d8 100644
--- a/spec/models/concerns/resolvable_discussion_spec.rb
+++ b/spec/models/concerns/resolvable_discussion_spec.rb
@@ -190,7 +190,7 @@
 
         context "when the signed in user can push to the project" do
           before do
-            subject.project.team << [current_user, :master]
+            subject.project.add_master(current_user)
           end
 
           it "returns true" do
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb
index aa7a8342a4c7..e999192940ce 100644
--- a/spec/models/event_spec.rb
+++ b/spec/models/event_spec.rb
@@ -125,8 +125,8 @@
     let(:event) { described_class.new(project: project, target: target, author_id: author.id) }
 
     before do
-      project.team << [member, :developer]
-      project.team << [guest, :guest]
+      project.add_developer(member)
+      project.add_guest(guest)
     end
 
     context 'commit note event' do
diff --git a/spec/models/generic_commit_status_spec.rb b/spec/models/generic_commit_status_spec.rb
index 7f1909710d84..673049d1cc43 100644
--- a/spec/models/generic_commit_status_spec.rb
+++ b/spec/models/generic_commit_status_spec.rb
@@ -43,7 +43,7 @@
 
     context 'when user has ability to see datails' do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it 'details path points to an external URL' do
diff --git a/spec/models/hooks/system_hook_spec.rb b/spec/models/hooks/system_hook_spec.rb
index 431e3db9f008..0e965f541d88 100644
--- a/spec/models/hooks/system_hook_spec.rb
+++ b/spec/models/hooks/system_hook_spec.rb
@@ -62,7 +62,7 @@
     end
 
     it "project_create hook" do
-      project.team << [user, :master]
+      project.add_master(user)
 
       expect(WebMock).to have_requested(:post, system_hook.url).with(
         body: /user_add_to_team/,
@@ -71,7 +71,7 @@
     end
 
     it "project_destroy hook" do
-      project.team << [user, :master]
+      project.add_master(user)
       project.project_members.destroy_all
 
       expect(WebMock).to have_requested(:post, system_hook.url).with(
diff --git a/spec/models/issue_collection_spec.rb b/spec/models/issue_collection_spec.rb
index 34d98a3c9753..580a98193af0 100644
--- a/spec/models/issue_collection_spec.rb
+++ b/spec/models/issue_collection_spec.rb
@@ -42,7 +42,7 @@
 
     context 'using a user that has reporter access to the project' do
       it 'returns the issues of the project' do
-        project.team << [user, :reporter]
+        project.add_reporter(user)
 
         expect(collection.updatable_by_user(user)).to eq([issue1, issue2])
       end
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index 2beccc83d8d4..56306a4db47f 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -238,7 +238,7 @@
       let(:issue) { create(:issue, project: project) }
 
       before do
-        project.team << [user, :reporter]
+        project.add_reporter(user)
       end
 
       it { is_expected.to eq true }
@@ -254,7 +254,7 @@
 
         context 'destination project allowed' do
           before do
-            to_project.team << [user, :reporter]
+            to_project.add_reporter(user)
           end
 
           it { is_expected.to eq true }
@@ -262,7 +262,7 @@
 
         context 'destination project not allowed' do
           before do
-            to_project.team << [user, :guest]
+            to_project.add_guest(user)
           end
 
           it { is_expected.to eq false }
@@ -571,7 +571,7 @@
 
         context 'when the user is the project owner' do
           before do
-            project.team << [user, :master]
+            project.add_master(user)
           end
 
           it 'returns true for a regular issue' do
@@ -595,7 +595,7 @@
 
       context 'using a public project' do
         before do
-          project.team << [user, Gitlab::Access::DEVELOPER]
+          project.add_developer(user)
         end
 
         it 'returns true for a regular issue' do
@@ -615,7 +615,7 @@
         let(:project) { create(:project, :internal) }
 
         before do
-          project.team << [user, Gitlab::Access::DEVELOPER]
+          project.add_developer(user)
         end
 
         it 'returns true for a regular issue' do
@@ -635,7 +635,7 @@
         let(:project) { create(:project, :private) }
 
         before do
-          project.team << [user, Gitlab::Access::DEVELOPER]
+          project.add_developer(user)
         end
 
         it 'returns true for a regular issue' do
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index 0a017c068ade..6aa0e7f49c3b 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -62,12 +62,12 @@
       @owner_user = create(:user).tap { |u| group.add_owner(u) }
       @owner = group.members.find_by(user_id: @owner_user.id)
 
-      @master_user = create(:user).tap { |u| project.team << [u, :master] }
+      @master_user = create(:user).tap { |u| project.add_master(u) }
       @master = project.members.find_by(user_id: @master_user.id)
 
       @blocked_user = create(:user).tap do |u|
-        project.team << [u, :master]
-        project.team << [u, :developer]
+        project.add_master(u)
+        project.add_developer(u)
 
         u.block!
       end
@@ -527,7 +527,7 @@
     it "refreshes user's authorized projects" do
       project = create(:project, :private)
       user    = create(:user)
-      member  = project.team << [user, :reporter]
+      member  = project.add_reporter(user)
 
       member.destroy
 
diff --git a/spec/models/members/project_member_spec.rb b/spec/models/members/project_member_spec.rb
index fa3e80ba062a..3e46fa363751 100644
--- a/spec/models/members/project_member_spec.rb
+++ b/spec/models/members/project_member_spec.rb
@@ -88,8 +88,8 @@
       @user_1 = create :user
       @user_2 = create :user
 
-      @project_1.team << [@user_1, :developer]
-      @project_2.team << [@user_2, :reporter]
+      @project_1.add_developer(@user_1)
+      @project_2.add_reporter(@user_2)
 
       @status = @project_2.team.import(@project_1)
     end
@@ -136,8 +136,8 @@
       @user_1 = create :user
       @user_2 = create :user
 
-      @project_1.team << [@user_1, :developer]
-      @project_2.team << [@user_2, :reporter]
+      @project_1.add_developer(@user_1)
+      @project_2.add_reporter(@user_2)
 
       described_class.truncate_teams([@project_1.id, @project_2.id])
     end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index f82aee668c0a..b91eb2737417 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -195,7 +195,7 @@ def create_merge_request_with_diffs(source_branch, diffs: 2)
 
   describe '#cache_merge_request_closes_issues!' do
     before do
-      subject.project.team << [subject.author, :developer]
+      subject.project.add_developer(subject.author)
       subject.target_branch = subject.project.default_branch
     end
 
@@ -482,7 +482,7 @@ def set_compare(merge_request)
     let(:commit2) { double('commit2', safe_message: "Fixes #{issue1.to_reference}") }
 
     before do
-      subject.project.team << [subject.author, :developer]
+      subject.project.add_developer(subject.author)
       allow(subject).to receive(:commits).and_return([commit0, commit1, commit2])
     end
 
@@ -510,7 +510,7 @@ def set_compare(merge_request)
     let(:commit) { double('commit', safe_message: "Fixes #{closing_issue.to_reference}") }
 
     it 'detects issues mentioned in description but not closed' do
-      subject.project.team << [subject.author, :developer]
+      subject.project.add_developer(subject.author)
       subject.description = "Is related to #{mentioned_issue.to_reference} and #{closing_issue.to_reference}"
 
       allow(subject).to receive(:commits).and_return([commit])
@@ -522,7 +522,7 @@ def set_compare(merge_request)
 
     context 'when the project has an external issue tracker' do
       before do
-        subject.project.team << [subject.author, :developer]
+        subject.project.add_developer(subject.author)
         commit = double(:commit, safe_message: 'Fixes TEST-3')
 
         create(:jira_service, project: subject.project)
@@ -692,8 +692,8 @@ def set_compare(merge_request)
     it "excludes blocked users" do
       developer = create(:user)
       blocked_developer = create(:user).tap { |u| u.block! }
-      project.team << [developer, :developer]
-      project.team << [blocked_developer, :developer]
+      project.add_developer(developer)
+      project.add_developer(blocked_developer)
 
       expect(merge_request.reload.number_of_potential_approvers).to eq(2)
     end
@@ -869,7 +869,7 @@ def set_compare(merge_request)
     it 'includes its closed issues in the body' do
       issue = create(:issue, project: subject.project)
 
-      subject.project.team << [subject.author, :developer]
+      subject.project.add_developer(subject.author)
       subject.description = "This issue Closes #{issue.to_reference}"
 
       allow(subject.project).to receive(:default_branch)
@@ -1348,7 +1348,7 @@ def set_compare(merge_request)
         allow(subject).to receive(:mergeable_state?).and_return(true)
 
         subject.target_project.update_attributes(approvals_before_merge: 1)
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it 'return false if not approved' do
@@ -1741,11 +1741,11 @@ def set_compare(merge_request)
       let(:stranger) { create(:user) }
 
       before do
-        project.team << [author, :developer]
-        project.team << [approver, :developer]
-        project.team << [approver_2, :developer]
-        project.team << [developer, :developer]
-        project.team << [reporter, :reporter]
+        project.add_developer(author)
+        project.add_developer(approver)
+        project.add_developer(approver_2)
+        project.add_developer(developer)
+        project.add_reporter(reporter)
       end
 
       context 'when there is one approver required' do
@@ -2115,7 +2115,7 @@ def create_pipeline(status)
     let(:mr_sha)        { merge_request.diff_head_sha }
 
     before do
-      project.team << [developer, :developer]
+      project.add_developer(developer)
     end
 
     context 'when autocomplete_precheck is set to true' do
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index cefbf60b28c0..3d0309270364 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -195,7 +195,7 @@
 
   describe "cross_reference_not_visible_for?" do
     let(:private_user)    { create(:user) }
-    let(:private_project) { create(:project, namespace: private_user.namespace) { |p| p.team << [private_user, :master] } }
+    let(:private_project) { create(:project, namespace: private_user.namespace) { |p| p.add_master(private_user) } }
     let(:private_issue)   { create(:issue, project: private_project) }
 
     let(:ext_proj)  { create(:project, :public) }
diff --git a/spec/models/project_feature_spec.rb b/spec/models/project_feature_spec.rb
index 006f95baf00a..691ef837cb18 100644
--- a/spec/models/project_feature_spec.rb
+++ b/spec/models/project_feature_spec.rb
@@ -37,7 +37,7 @@
       end
 
       it "returns true when user is a team member" do
-        project.team << [user, :developer]
+        project.add_developer(user)
 
         features.each do |feature|
           project.project_feature.update_attribute("#{feature}_access_level".to_sym, ProjectFeature::PRIVATE)
diff --git a/spec/models/project_services/pipelines_email_service_spec.rb b/spec/models/project_services/pipelines_email_service_spec.rb
index be07ca2d9451..75ae22079104 100644
--- a/spec/models/project_services/pipelines_email_service_spec.rb
+++ b/spec/models/project_services/pipelines_email_service_spec.rb
@@ -37,7 +37,7 @@
     let(:user)    { create(:user) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     it 'builds test data' do
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index cd6d276fff7b..6aaa8bd173d7 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -94,7 +94,7 @@
       let(:developer) { create(:user) }
       before do
         project.request_access(requester)
-        project.team << [developer, :developer]
+        project.add_developer(developer)
       end
 
       it_behaves_like 'members and requesters associations' do
@@ -566,7 +566,7 @@
     let(:user)    { create(:user) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     context 'with default issues tracker' do
@@ -1601,35 +1601,35 @@ def create_pipeline
     let(:user)    { create(:user) }
 
     it 'returns false when default_branch_protection is in full protection and user is developer' do
-      project.team << [user, :developer]
+      project.add_developer(user)
       stub_application_setting(default_branch_protection: Gitlab::Access::PROTECTION_FULL)
 
       expect(project.user_can_push_to_empty_repo?(user)).to be_falsey
     end
 
     it 'returns false when default_branch_protection only lets devs merge and user is dev' do
-      project.team << [user, :developer]
+      project.add_developer(user)
       stub_application_setting(default_branch_protection: Gitlab::Access::PROTECTION_DEV_CAN_MERGE)
 
       expect(project.user_can_push_to_empty_repo?(user)).to be_falsey
     end
 
     it 'returns true when default_branch_protection lets devs push and user is developer' do
-      project.team << [user, :developer]
+      project.add_developer(user)
       stub_application_setting(default_branch_protection: Gitlab::Access::PROTECTION_DEV_CAN_PUSH)
 
       expect(project.user_can_push_to_empty_repo?(user)).to be_truthy
     end
 
     it 'returns true when default_branch_protection is unprotected and user is developer' do
-      project.team << [user, :developer]
+      project.add_developer(user)
       stub_application_setting(default_branch_protection: Gitlab::Access::PROTECTION_NONE)
 
       expect(project.user_can_push_to_empty_repo?(user)).to be_truthy
     end
 
     it 'returns true when user is master' do
-      project.team << [user, :master]
+      project.add_master(user)
 
       expect(project.user_can_push_to_empty_repo?(user)).to be_truthy
     end
diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb
index 314824b32da4..e07c522800a6 100644
--- a/spec/models/project_team_spec.rb
+++ b/spec/models/project_team_spec.rb
@@ -291,8 +291,8 @@
       group.add_master(master)
       group.add_developer(developer)
 
-      members_project.team << [developer, :developer]
-      members_project.team << [master, :master]
+      members_project.add_developer(developer)
+      members_project.add_master(master)
 
       create(:project_group_link, project: shared_project, group: group)
     end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index a59dfa96c1dd..0bf9a5a1d31f 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -788,7 +788,7 @@
 
     before do
       # add user to project
-      project.team << [user, :master]
+      project.add_master(user)
 
       # create invite to projet
       create(:project_member, :developer, project: project, invite_token: '1234', invite_email: 'inviteduser1@example.com')
@@ -1517,8 +1517,8 @@
     let!(:merge_event) { create(:event, :created, project: project3, target: merge_request, author: subject) }
 
     before do
-      project1.team << [subject, :master]
-      project2.team << [subject, :master]
+      project1.add_master(subject)
+      project2.add_master(subject)
     end
 
     it "includes IDs for projects the user has pushed to" do
@@ -1617,7 +1617,7 @@
         user = create(:user)
         project = create(:project, :private)
 
-        project.team << [user, Gitlab::Access::MASTER]
+        project.add_master(user)
 
         expect(user.authorized_projects(Gitlab::Access::REPORTER))
           .to contain_exactly(project)
@@ -1636,7 +1636,7 @@
       user2   = create(:user)
       project = create(:project, :private, namespace: user1.namespace)
 
-      project.team << [user2, Gitlab::Access::DEVELOPER]
+      project.add_developer(user2)
 
       expect(user2.authorized_projects).to include(project)
     end
@@ -1681,7 +1681,7 @@
       user2   = create(:user)
       project = create(:project, :private, namespace: user1.namespace)
 
-      project.team << [user2, Gitlab::Access::DEVELOPER]
+      project.add_developer(user2)
 
       expect(user2.authorized_projects).to include(project)
 
@@ -1771,7 +1771,7 @@
     shared_examples :member do
       context 'when the user is a master' do
         before do
-          add_user(Gitlab::Access::MASTER)
+          add_user(:master)
         end
 
         it 'loads' do
@@ -1781,7 +1781,7 @@
 
       context 'when the user is a developer' do
         before do
-          add_user(Gitlab::Access::DEVELOPER)
+          add_user(:developer)
         end
 
         it 'does not load' do
@@ -1805,7 +1805,7 @@ def add_user(access)
       let(:project) { create(:project) }
 
       def add_user(access)
-        project.team << [user, access]
+        project.add_role(user, access)
       end
 
       it_behaves_like :member
@@ -1818,8 +1818,8 @@ def add_user(access)
     let(:user) { create(:user) }
 
     before do
-      project1.team << [user, :reporter]
-      project2.team << [user, :guest]
+      project1.add_reporter(user)
+      project2.add_guest(user)
     end
 
     it 'returns the projects when using a single project ID' do
@@ -1961,8 +1961,8 @@ def add_user(access)
     let(:user) { create(:user) }
 
     before do
-      project1.team << [user, :reporter]
-      project2.team << [user, :guest]
+      project1.add_reporter(user)
+      project2.add_guest(user)
 
       user.project_authorizations.delete_all
       user.refresh_authorized_projects
diff --git a/spec/policies/ci/build_policy_spec.rb b/spec/policies/ci/build_policy_spec.rb
index 298a9d16425b..41cf2ef72259 100644
--- a/spec/policies/ci/build_policy_spec.rb
+++ b/spec/policies/ci/build_policy_spec.rb
@@ -57,7 +57,7 @@
 
       context 'team member is a guest' do
         before do
-          project.team << [user, :guest]
+          project.add_guest(user)
         end
 
         context 'when public builds are enabled' do
@@ -77,7 +77,7 @@
 
       context 'team member is a reporter' do
         before do
-          project.team << [user, :reporter]
+          project.add_reporter(user)
         end
 
         context 'when public builds are enabled' do
diff --git a/spec/policies/ci/trigger_policy_spec.rb b/spec/policies/ci/trigger_policy_spec.rb
index be40dbb2aa99..14630748c90d 100644
--- a/spec/policies/ci/trigger_policy_spec.rb
+++ b/spec/policies/ci/trigger_policy_spec.rb
@@ -45,7 +45,7 @@
 
       context 'when user is master of the project' do
         before do
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it_behaves_like 'allows to admin and manage trigger'
@@ -53,7 +53,7 @@
 
       context 'when user is developer of the project' do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         it_behaves_like 'disallows to admin and manage trigger'
@@ -69,7 +69,7 @@
 
       context 'when user is master of the project' do
         before do
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it_behaves_like 'allows to admin and manage trigger'
@@ -81,7 +81,7 @@
 
       context 'when user is master of the project' do
         before do
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it_behaves_like 'allows to manage trigger'
@@ -89,7 +89,7 @@
 
       context 'when user is developer of the project' do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         it_behaves_like 'disallows to admin and manage trigger'
diff --git a/spec/policies/issue_policy_spec.rb b/spec/policies/issue_policy_spec.rb
index be4c24c727c8..a4af9361ea6e 100644
--- a/spec/policies/issue_policy_spec.rb
+++ b/spec/policies/issue_policy_spec.rb
@@ -19,10 +19,10 @@ def permissions(user, issue)
     let(:issue_no_assignee) { create(:issue, project: project) }
 
     before do
-      project.team << [guest, :guest]
-      project.team << [author, :guest]
-      project.team << [assignee, :guest]
-      project.team << [reporter, :reporter]
+      project.add_guest(guest)
+      project.add_guest(author)
+      project.add_guest(assignee)
+      project.add_reporter(reporter)
 
       group.add_reporter(reporter_from_group_link)
 
@@ -114,8 +114,8 @@ def permissions(user, issue)
     let(:issue_no_assignee) { create(:issue, project: project) }
 
     before do
-      project.team << [guest, :guest]
-      project.team << [reporter, :reporter]
+      project.add_guest(guest)
+      project.add_reporter(reporter)
 
       group.add_reporter(reporter_from_group_link)
 
diff --git a/spec/policies/project_snippet_policy_spec.rb b/spec/policies/project_snippet_policy_spec.rb
index e8f5f913b553..fb1be93193a3 100644
--- a/spec/policies/project_snippet_policy_spec.rb
+++ b/spec/policies/project_snippet_policy_spec.rb
@@ -87,7 +87,7 @@ def expect_disallowed(*permissions)
       subject { abilities(external_user, :internal) }
 
       before do
-        project.team << [external_user, :developer]
+        project.add_developer(external_user)
       end
 
       it do
@@ -141,7 +141,7 @@ def expect_disallowed(*permissions)
       subject { abilities(regular_user, :private) }
 
       before do
-        project.team << [regular_user, :developer]
+        project.add_developer(regular_user)
       end
 
       it do
@@ -154,7 +154,7 @@ def expect_disallowed(*permissions)
       subject { abilities(external_user, :private) }
 
       before do
-        project.team << [external_user, :developer]
+        project.add_developer(external_user)
       end
 
       it do
diff --git a/spec/presenters/merge_request_presenter_spec.rb b/spec/presenters/merge_request_presenter_spec.rb
index 9177011f8860..f08247cb4241 100644
--- a/spec/presenters/merge_request_presenter_spec.rb
+++ b/spec/presenters/merge_request_presenter_spec.rb
@@ -116,7 +116,7 @@
     end
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
 
       allow(resource.project).to receive(:default_branch)
         .and_return(resource.target_branch)
@@ -270,7 +270,7 @@
     context 'when can create issue and issues enabled' do
       it 'returns path' do
         allow(project).to receive(:issues_enabled?) { true }
-        project.team << [user, :master]
+        project.add_master(user)
 
         is_expected
           .to eq("/#{resource.project.full_path}/issues/new?merge_request_to_resolve_discussions_of=#{resource.iid}")
@@ -288,7 +288,7 @@
     context 'when issues disabled' do
       it 'returns nil' do
         allow(project).to receive(:issues_enabled?) { false }
-        project.team << [user, :master]
+        project.add_master(user)
 
         is_expected.to be_nil
       end
@@ -307,7 +307,7 @@
     context 'when merge request enabled and has permission' do
       it 'has remove_wip_path' do
         allow(project).to receive(:merge_requests_enabled?) { true }
-        project.team << [user, :master]
+        project.add_master(user)
 
         is_expected
           .to eq("/#{resource.project.full_path}/merge_requests/#{resource.iid}/remove_wip")
diff --git a/spec/requests/api/access_requests_spec.rb b/spec/requests/api/access_requests_spec.rb
index 35ca3635a9de..24389f28b21f 100644
--- a/spec/requests/api/access_requests_spec.rb
+++ b/spec/requests/api/access_requests_spec.rb
@@ -8,8 +8,8 @@
 
   set(:project) do
     create(:project, :public, :access_requestable, creator_id: master.id, namespace: master.namespace) do |project|
-      project.team << [developer, :developer]
-      project.team << [master, :master]
+      project.add_developer(developer)
+      project.add_master(master)
       project.request_access(access_requester)
     end
   end
diff --git a/spec/requests/api/award_emoji_spec.rb b/spec/requests/api/award_emoji_spec.rb
index eaf12f714219..5adfb33677f5 100644
--- a/spec/requests/api/award_emoji_spec.rb
+++ b/spec/requests/api/award_emoji_spec.rb
@@ -10,7 +10,7 @@
   set(:note)          { create(:note, project: project, noteable: issue) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe "GET /projects/:id/awardable/:awardable_id/award_emoji" do
diff --git a/spec/requests/api/boards_spec.rb b/spec/requests/api/boards_spec.rb
index 3d8a9b9287ba..86bf395bfc5a 100644
--- a/spec/requests/api/boards_spec.rb
+++ b/spec/requests/api/boards_spec.rb
@@ -40,8 +40,8 @@
   end
 
   before do
-    project.team << [user, :reporter]
-    project.team << [guest, :guest]
+    project.add_reporter(user)
+    project.add_guest(guest)
   end
 
   describe "GET /projects/:id/boards" do
diff --git a/spec/requests/api/deployments_spec.rb b/spec/requests/api/deployments_spec.rb
index c7977e624ff4..6732c99e3294 100644
--- a/spec/requests/api/deployments_spec.rb
+++ b/spec/requests/api/deployments_spec.rb
@@ -7,7 +7,7 @@
   let!(:deployment) { create(:deployment) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'GET /projects/:id/deployments' do
diff --git a/spec/requests/api/environments_spec.rb b/spec/requests/api/environments_spec.rb
index 3665cfd72413..53d48a910078 100644
--- a/spec/requests/api/environments_spec.rb
+++ b/spec/requests/api/environments_spec.rb
@@ -7,7 +7,7 @@
   let!(:environment)  { create(:environment, project: project) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'GET /projects/:id/environments' do
diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb
index 5d8338a3fb74..d8fdfd6dee1a 100644
--- a/spec/requests/api/files_spec.rb
+++ b/spec/requests/api/files_spec.rb
@@ -14,7 +14,7 @@
   let(:author_name) { 'John Doe' }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   def route(file_path = nil)
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 2ac50f8f9462..58c4a114c330 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -461,7 +461,7 @@ def add_projects_to_group(group, share_with: nil)
       end
 
       it "only returns projects to which user has access" do
-        project3.team << [user3, :developer]
+        project3.add_developer(user3)
 
         get api("/groups/#{group1.id}/projects", user3)
 
diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb
index 7671bec933b3..a0beb0471289 100644
--- a/spec/requests/api/internal_spec.rb
+++ b/spec/requests/api/internal_spec.rb
@@ -147,7 +147,7 @@
 
   describe "POST /internal/lfs_authenticate" do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     context 'user key' do
@@ -247,7 +247,7 @@
       end
 
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       context 'with env passed as a JSON' do
@@ -407,7 +407,7 @@
 
     context "access denied" do
       before do
-        project.team << [user, :guest]
+        project.add_guest(user)
       end
 
       context "git pull" do
@@ -461,7 +461,7 @@
 
     context "archived project" do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
         project.archive!
       end
 
@@ -575,7 +575,7 @@
     context 'web actions are always allowed' do
       it 'allows WEB push' do
         stub_application_setting(enabled_git_access_protocol: 'ssh')
-        project.team << [user, :developer]
+        project.add_developer(user)
         push(key, project, 'web')
 
         expect(response.status).to eq(200)
@@ -588,7 +588,7 @@
       let!(:repository) { project.repository }
 
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
         project.path = 'new_path'
         project.save!
       end
@@ -614,7 +614,7 @@
     let(:changes) { URI.escape("#{Gitlab::Git::BLANK_SHA} 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/new_branch") }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     it 'returns link to create new merge request' do
@@ -749,7 +749,7 @@
     end
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
       allow(described_class).to receive(:identify).and_return(user)
       allow_any_instance_of(Gitlab::Identifier).to receive(:identify).and_return(user)
     end
diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb
index 3f634a7768eb..94ee037e6928 100644
--- a/spec/requests/api/issues_spec.rb
+++ b/spec/requests/api/issues_spec.rb
@@ -58,8 +58,8 @@
   let(:no_milestone_title) { URI.escape(Milestone::None.title) }
 
   before(:all) do
-    project.team << [user, :reporter]
-    project.team << [guest, :guest]
+    project.add_reporter(user)
+    project.add_guest(guest)
   end
 
   before do
@@ -348,7 +348,7 @@
     let!(:group_note) { create(:note_on_issue, author: user, project: group_project, noteable: group_issue) }
 
     before do
-      group_project.team << [user, :reporter]
+      group_project.add_reporter(user)
     end
     let(:base_url) { "/groups/#{group.id}/issues" }
 
@@ -971,7 +971,7 @@
       let(:project) { merge_request.source_project }
 
       before do
-        project.team << [user, :master]
+        project.add_master(user)
       end
 
       context 'resolving all discussions in a merge request' do
diff --git a/spec/requests/api/jobs_spec.rb b/spec/requests/api/jobs_spec.rb
index ed309434dc60..511ccc6c8ac0 100644
--- a/spec/requests/api/jobs_spec.rb
+++ b/spec/requests/api/jobs_spec.rb
@@ -610,7 +610,7 @@ def get_for_ref(ref = pipeline.ref, job_name = job.name)
     let(:role) { :master }
 
     before do
-      project.team << [user, role]
+      project.add_role(user, role)
 
       post api("/projects/#{project.id}/jobs/#{job.id}/erase", user)
     end
diff --git a/spec/requests/api/labels_spec.rb b/spec/requests/api/labels_spec.rb
index 3498e5bc8d96..34cbf75f4c14 100644
--- a/spec/requests/api/labels_spec.rb
+++ b/spec/requests/api/labels_spec.rb
@@ -7,7 +7,7 @@
   let!(:priority_label) { create(:label, title: 'bug', project: project, priority: 3) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'GET /projects/:id/labels' do
diff --git a/spec/requests/api/members_spec.rb b/spec/requests/api/members_spec.rb
index 9f626f386b32..afd1a03ff437 100644
--- a/spec/requests/api/members_spec.rb
+++ b/spec/requests/api/members_spec.rb
@@ -8,8 +8,8 @@
 
   let(:project) do
     create(:project, :public, :access_requestable, creator_id: master.id, namespace: master.namespace) do |project|
-      project.team << [developer, :developer]
-      project.team << [master, :master]
+      project.add_developer(developer)
+      project.add_master(master)
       project.request_access(access_requester)
     end
   end
diff --git a/spec/requests/api/merge_request_diffs_spec.rb b/spec/requests/api/merge_request_diffs_spec.rb
index bf4c8443b23f..cb647aee70fd 100644
--- a/spec/requests/api/merge_request_diffs_spec.rb
+++ b/spec/requests/api/merge_request_diffs_spec.rb
@@ -8,7 +8,7 @@
   before do
     merge_request.merge_request_diffs.create(head_commit_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9')
     merge_request.merge_request_diffs.create(head_commit_sha: '5937ac0a7beb003549fc5fd26fc247adbce4a52e')
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'GET /projects/:id/merge_requests/:merge_request_iid/versions' do
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index fe496ff3b683..481693950a62 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -25,7 +25,7 @@
   let!(:upvote) { create(:award_emoji, :upvote, awardable: merge_request) }
 
   before do
-    project.team << [user, :reporter]
+    project.add_reporter(user)
   end
 
   describe 'GET /merge_requests' do
@@ -784,7 +784,7 @@ def create_merge_request(approvals_before_merge)
       let(:developer) { create(:user) }
 
       before do
-        project.team << [developer, :developer]
+        project.add_developer(developer)
       end
 
       it "denies the deletion of the merge request" do
@@ -861,7 +861,7 @@ def create_merge_request(approvals_before_merge)
     end
 
     it 'returns 405 if merge request was not approved' do
-      project.team << [create(:user), :developer]
+      project.add_developer(create(:user))
       project.update_attributes(approvals_before_merge: 1)
 
       put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/merge", user)
@@ -872,7 +872,7 @@ def create_merge_request(approvals_before_merge)
 
     it 'returns 200 if merge request was approved' do
       approver = create(:user)
-      project.team << [approver, :developer]
+      project.add_developer(approver)
       project.update_attributes(approvals_before_merge: 1)
       merge_request.approvals.create(user: approver)
 
@@ -883,7 +883,7 @@ def create_merge_request(approvals_before_merge)
 
     it "returns 401 if user has no permissions to merge" do
       user2 = create(:user)
-      project.team << [user2, :reporter]
+      project.add_reporter(user2)
       put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/merge", user2)
       expect(response).to have_gitlab_http_status(401)
       expect(json_response['message']).to eq('401 Unauthorized')
@@ -1087,7 +1087,7 @@ def create_merge_request(approvals_before_merge)
       project = create(:project, :private)
       merge_request = create(:merge_request, :simple, source_project: project)
       guest = create(:user)
-      project.team << [guest, :guest]
+      project.add_guest(guest)
 
       get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/closes_issues", guest)
 
@@ -1135,7 +1135,7 @@ def create_merge_request(approvals_before_merge)
 
     it 'returns 403 if user has no access to read code' do
       guest = create(:user)
-      project.team << [guest, :guest]
+      project.add_guest(guest)
 
       post api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/subscribe", guest)
 
@@ -1171,7 +1171,7 @@ def create_merge_request(approvals_before_merge)
 
     it 'returns 403 if user has no access to read code' do
       guest = create(:user)
-      project.team << [guest, :guest]
+      project.add_guest(guest)
 
       post api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/unsubscribe", guest)
 
@@ -1183,8 +1183,8 @@ def create_merge_request(approvals_before_merge)
     it 'retrieves the approval status' do
       approver = create :user
       project.update_attribute(:approvals_before_merge, 2)
-      project.team << [approver, :developer]
-      project.team << [create(:user), :developer]
+      project.add_developer(approver)
+      project.add_developer(create(:user))
       merge_request.approvals.create(user: approver)
 
       get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/approvals", user)
@@ -1217,8 +1217,8 @@ def create_merge_request(approvals_before_merge)
       let(:approver) { create(:user) }
 
       before do
-        project.team << [approver, :developer]
-        project.team << [create(:user), :developer]
+        project.add_developer(approver)
+        project.add_developer(create(:user))
       end
 
       def approve(extra_params = {})
@@ -1277,9 +1277,9 @@ def approve(extra_params = {})
       let(:unapprover) { create(:user) }
 
       before do
-        project.team << [approver, :developer]
-        project.team << [unapprover, :developer]
-        project.team << [create(:user), :developer]
+        project.add_developer(approver)
+        project.add_developer(unapprover)
+        project.add_developer(create(:user))
         merge_request.approvals.create(user: approver)
         merge_request.approvals.create(user: unapprover)
 
diff --git a/spec/requests/api/notes_spec.rb b/spec/requests/api/notes_spec.rb
index 3bfb4c5506f1..be8d9c191257 100644
--- a/spec/requests/api/notes_spec.rb
+++ b/spec/requests/api/notes_spec.rb
@@ -14,7 +14,7 @@
   let(:private_user)    { create(:user) }
   let(:private_project) do
     create(:project, namespace: private_user.namespace)
-    .tap { |p| p.team << [private_user, :master] }
+    .tap { |p| p.add_master(private_user) }
   end
   let(:private_issue)    { create(:issue, project: private_project) }
 
@@ -29,7 +29,7 @@
   end
 
   before do
-    project.team << [user, :reporter]
+    project.add_reporter(user)
   end
 
   describe "GET /projects/:id/noteable/:noteable_id/notes" do
diff --git a/spec/requests/api/pipelines_spec.rb b/spec/requests/api/pipelines_spec.rb
index e4dcc9252fa1..0736329f9fdf 100644
--- a/spec/requests/api/pipelines_spec.rb
+++ b/spec/requests/api/pipelines_spec.rb
@@ -11,7 +11,7 @@
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'GET /projects/:id/pipelines ' do
@@ -424,7 +424,7 @@
       let!(:reporter) { create(:user) }
 
       before do
-        project.team << [reporter, :reporter]
+        project.add_reporter(reporter)
       end
 
       it 'rejects the action' do
diff --git a/spec/requests/api/project_hooks_spec.rb b/spec/requests/api/project_hooks_spec.rb
index f31344a6238a..1fd082ecc38e 100644
--- a/spec/requests/api/project_hooks_spec.rb
+++ b/spec/requests/api/project_hooks_spec.rb
@@ -13,8 +13,8 @@
   end
 
   before do
-    project.team << [user, :master]
-    project.team << [user3, :developer]
+    project.add_master(user)
+    project.add_developer(user3)
   end
 
   describe "GET /projects/:id/hooks" do
@@ -206,7 +206,7 @@
     it "returns a 404 if a user attempts to delete project hooks he/she does not own" do
       test_user = create(:user)
       other_project = create(:project)
-      other_project.team << [test_user, :master]
+      other_project.add_master(test_user)
 
       delete api("/projects/#{other_project.id}/hooks/#{hook.id}", test_user)
       expect(response).to have_gitlab_http_status(404)
diff --git a/spec/requests/api/project_milestones_spec.rb b/spec/requests/api/project_milestones_spec.rb
index 72e1574b55f5..6fe8ab5a3f68 100644
--- a/spec/requests/api/project_milestones_spec.rb
+++ b/spec/requests/api/project_milestones_spec.rb
@@ -7,7 +7,7 @@
   let!(:milestone) { create(:milestone, project: project, title: 'version2', description: 'open milestone') }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   it_behaves_like 'group and project milestones', "/projects/:id/milestones"  do
diff --git a/spec/requests/api/project_push_rule_spec.rb b/spec/requests/api/project_push_rule_spec.rb
index 761ff7eb4e3b..7e2e8105c8e4 100644
--- a/spec/requests/api/project_push_rule_spec.rb
+++ b/spec/requests/api/project_push_rule_spec.rb
@@ -7,8 +7,8 @@
   let!(:project) { create(:project, :repository, creator_id: user.id, namespace: user.namespace) }
 
   before do
-    project.team << [user, :master]
-    project.team << [user3, :developer]
+    project.add_master(user)
+    project.add_developer(user3)
   end
 
   describe "GET /projects/:id/push_rule" do
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 326a4370bb0b..50080f8c29a1 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -958,7 +958,7 @@
       describe 'permissions' do
         context 'all projects' do
           before do
-            project.team << [user, :master]
+            project.add_master(user)
           end
 
           it 'contains permission information' do
@@ -973,7 +973,7 @@
 
         context 'personal project' do
           it 'sets project access and returns 200' do
-            project.team << [user, :master]
+            project.add_master(user)
             get api("/projects/#{project.id}", user)
 
             expect(response).to have_gitlab_http_status(200)
@@ -1605,7 +1605,7 @@
 
     context 'user without archiving rights to the project' do
       before do
-        project.team << [user3, :developer]
+        project.add_developer(user3)
       end
 
       it 'rejects the action' do
@@ -1641,7 +1641,7 @@
 
     context 'user without archiving rights to the project' do
       before do
-        project.team << [user3, :developer]
+        project.add_developer(user3)
       end
 
       it 'rejects the action' do
@@ -1716,7 +1716,7 @@
 
       it 'does not remove a project if not an owner' do
         user3 = create(:user)
-        project.team << [user3, :developer]
+        project.add_developer(user3)
         delete api("/projects/#{project.id}", user3)
         expect(response).to have_gitlab_http_status(403)
       end
diff --git a/spec/requests/api/services_spec.rb b/spec/requests/api/services_spec.rb
index 7eb950f2f30e..f8129928b8e0 100644
--- a/spec/requests/api/services_spec.rb
+++ b/spec/requests/api/services_spec.rb
@@ -92,7 +92,7 @@
       end
 
       it "returns error when authenticated but not a project owner" do
-        project.team << [user2, :developer]
+        project.add_developer(user2)
         get api("/projects/#{project.id}/services/#{dashed_service}", user2)
 
         expect(response).to have_gitlab_http_status(403)
diff --git a/spec/requests/api/todos_spec.rb b/spec/requests/api/todos_spec.rb
index c6063a2e0899..fb3a33cadffa 100644
--- a/spec/requests/api/todos_spec.rb
+++ b/spec/requests/api/todos_spec.rb
@@ -13,8 +13,8 @@
   let!(:done) { create(:todo, :done, project: project_1, author: author_1, user: john_doe) }
 
   before do
-    project_1.team << [john_doe, :developer]
-    project_2.team << [john_doe, :developer]
+    project_1.add_developer(john_doe)
+    project_2.add_developer(john_doe)
   end
 
   describe 'GET /todos' do
@@ -191,7 +191,7 @@
 
     it 'returns an error if the issuable is not accessible' do
       guest = create(:user)
-      project_1.team << [guest, :guest]
+      project_1.add_guest(guest)
 
       post api("/projects/#{project_1.id}/#{issuable_type}/#{issuable.iid}/todo", guest)
 
diff --git a/spec/requests/api/v3/award_emoji_spec.rb b/spec/requests/api/v3/award_emoji_spec.rb
index 0cd8b70007f0..6dc430676b0c 100644
--- a/spec/requests/api/v3/award_emoji_spec.rb
+++ b/spec/requests/api/v3/award_emoji_spec.rb
@@ -9,7 +9,7 @@
   let!(:downvote)      { create(:award_emoji, :downvote, awardable: merge_request, user: user) }
   set(:note)           { create(:note, project: project, noteable: issue) }
 
-  before { project.team << [user, :master] }
+  before { project.add_master(user) }
 
   describe "GET /projects/:id/awardable/:awardable_id/award_emoji" do
     context 'on an issue' do
diff --git a/spec/requests/api/v3/boards_spec.rb b/spec/requests/api/v3/boards_spec.rb
index 14409d25544d..dde4f0961938 100644
--- a/spec/requests/api/v3/boards_spec.rb
+++ b/spec/requests/api/v3/boards_spec.rb
@@ -27,8 +27,8 @@
   end
 
   before do
-    project.team << [user, :reporter]
-    project.team << [guest, :guest]
+    project.add_reporter(user)
+    project.add_guest(guest)
   end
 
   describe "GET /projects/:id/boards" do
diff --git a/spec/requests/api/v3/commits_spec.rb b/spec/requests/api/v3/commits_spec.rb
index d31c94ddd2ca..8b115e01f473 100644
--- a/spec/requests/api/v3/commits_spec.rb
+++ b/spec/requests/api/v3/commits_spec.rb
@@ -9,11 +9,11 @@
   let!(:note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'a comment on a commit') }
   let!(:another_note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'another comment on a commit') }
 
-  before { project.team << [user, :reporter] }
+  before { project.add_reporter(user) }
 
   describe "List repository commits" do
     context "authorized user" do
-      before { project.team << [user2, :reporter] }
+      before { project.add_reporter(user2) }
 
       it "returns project commits" do
         commit = project.repository.commit
@@ -415,7 +415,7 @@
 
   describe "Get the diff of a commit" do
     context "authorized user" do
-      before { project.team << [user2, :reporter] }
+      before { project.add_reporter(user2) }
 
       it "returns the diff of the selected commit" do
         get v3_api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff", user)
@@ -487,7 +487,7 @@
       end
 
       it 'returns 400 if you are not allowed to push to the target branch' do
-        project.team << [user2, :developer]
+        project.add_developer(user2)
         protected_branch = create(:protected_branch, project: project, name: 'feature')
 
         post v3_api("/projects/#{project.id}/repository/commits/#{master_pickable_commit.id}/cherry_pick", user2), branch: protected_branch.name
diff --git a/spec/requests/api/v3/deployments_spec.rb b/spec/requests/api/v3/deployments_spec.rb
index 90eabda4dac6..ac86fbea4988 100644
--- a/spec/requests/api/v3/deployments_spec.rb
+++ b/spec/requests/api/v3/deployments_spec.rb
@@ -7,7 +7,7 @@
   let!(:deployment) { create(:deployment) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   shared_examples 'a paginated resources' do
diff --git a/spec/requests/api/v3/environments_spec.rb b/spec/requests/api/v3/environments_spec.rb
index 937250b5219d..68be5256b64a 100644
--- a/spec/requests/api/v3/environments_spec.rb
+++ b/spec/requests/api/v3/environments_spec.rb
@@ -7,7 +7,7 @@
   let!(:environment)  { create(:environment, project: project) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   shared_examples 'a paginated resources' do
diff --git a/spec/requests/api/v3/files_spec.rb b/spec/requests/api/v3/files_spec.rb
index 5500c1cf7700..26a3d8870a01 100644
--- a/spec/requests/api/v3/files_spec.rb
+++ b/spec/requests/api/v3/files_spec.rb
@@ -27,7 +27,7 @@
   let(:author_email) { 'user@example.org' }
   let(:author_name) { 'John Doe' }
 
-  before { project.team << [user, :developer] }
+  before { project.add_developer(user) }
 
   describe "GET /projects/:id/repository/files" do
     let(:route) { "/projects/#{project.id}/repository/files" }
diff --git a/spec/requests/api/v3/groups_spec.rb b/spec/requests/api/v3/groups_spec.rb
index 842e9ce9eac7..9fef8e2c8c92 100644
--- a/spec/requests/api/v3/groups_spec.rb
+++ b/spec/requests/api/v3/groups_spec.rb
@@ -473,7 +473,7 @@
       end
 
       it "only returns projects to which user has access" do
-        project3.team << [user3, :developer]
+        project3.add_developer(user3)
 
         get v3_api("/groups/#{group1.id}/projects", user3)
 
diff --git a/spec/requests/api/v3/issues_spec.rb b/spec/requests/api/v3/issues_spec.rb
index afe9ec570ec6..52e33a1f48ce 100644
--- a/spec/requests/api/v3/issues_spec.rb
+++ b/spec/requests/api/v3/issues_spec.rb
@@ -50,8 +50,8 @@
   let(:no_milestone_title) { URI.escape(Milestone::None.title) }
 
   before do
-    project.team << [user, :reporter]
-    project.team << [guest, :guest]
+    project.add_reporter(user)
+    project.add_guest(guest)
   end
 
   describe "GET /issues" do
@@ -278,7 +278,7 @@
     let!(:group_note) { create(:note_on_issue, author: user, project: group_project, noteable: group_issue) }
 
     before do
-      group_project.team << [user, :reporter]
+      group_project.add_reporter(user)
     end
     let(:base_url) { "/groups/#{group.id}/issues" }
 
@@ -829,7 +829,7 @@
       let(:merge_request) { discussion.noteable }
       let(:project) { merge_request.source_project }
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         post v3_api("/projects/#{project.id}/issues", user),
              title: 'New Issue',
              merge_request_for_resolving_discussions: merge_request.iid
diff --git a/spec/requests/api/v3/labels_spec.rb b/spec/requests/api/v3/labels_spec.rb
index 1d31213d5ca4..cdab4d2bd736 100644
--- a/spec/requests/api/v3/labels_spec.rb
+++ b/spec/requests/api/v3/labels_spec.rb
@@ -7,7 +7,7 @@
   let!(:priority_label) { create(:label, title: 'bug', project: project, priority: 3) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'GET /projects/:id/labels' do
diff --git a/spec/requests/api/v3/members_spec.rb b/spec/requests/api/v3/members_spec.rb
index 68be3d24c268..b91782ae5119 100644
--- a/spec/requests/api/v3/members_spec.rb
+++ b/spec/requests/api/v3/members_spec.rb
@@ -8,8 +8,8 @@
 
   let(:project) do
     create(:project, :public, :access_requestable, creator_id: master.id, namespace: master.namespace) do |project|
-      project.team << [developer, :developer]
-      project.team << [master, :master]
+      project.add_developer(developer)
+      project.add_master(master)
       project.request_access(access_requester)
     end
   end
diff --git a/spec/requests/api/v3/merge_request_diffs_spec.rb b/spec/requests/api/v3/merge_request_diffs_spec.rb
index 6fdd8b530822..d18245a6ff46 100644
--- a/spec/requests/api/v3/merge_request_diffs_spec.rb
+++ b/spec/requests/api/v3/merge_request_diffs_spec.rb
@@ -8,7 +8,7 @@
   before do
     merge_request.merge_request_diffs.create(head_commit_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9')
     merge_request.merge_request_diffs.create(head_commit_sha: '5937ac0a7beb003549fc5fd26fc247adbce4a52e')
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'GET /projects/:id/merge_requests/:merge_request_id/versions' do
diff --git a/spec/requests/api/v3/merge_requests_spec.rb b/spec/requests/api/v3/merge_requests_spec.rb
index 9d0e39ec0c29..22a3645e57fa 100644
--- a/spec/requests/api/v3/merge_requests_spec.rb
+++ b/spec/requests/api/v3/merge_requests_spec.rb
@@ -14,7 +14,7 @@
   let(:milestone)   { create(:milestone, title: '1.0.0', project: project) }
 
   before do
-    project.team << [user, :reporter]
+    project.add_reporter(user)
   end
 
   describe "GET /projects/:id/merge_requests" do
@@ -459,7 +459,7 @@ def create_merge_request(approvals_before_merge)
       let(:developer) { create(:user) }
 
       before do
-        project.team << [developer, :developer]
+        project.add_developer(developer)
       end
 
       it "denies the deletion of the merge request" do
@@ -521,7 +521,7 @@ def create_merge_request(approvals_before_merge)
 
     it "returns 401 if user has no permissions to merge" do
       user2 = create(:user)
-      project.team << [user2, :reporter]
+      project.add_reporter(user2)
       put v3_api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user2)
       expect(response).to have_gitlab_http_status(401)
       expect(json_response['message']).to eq('401 Unauthorized')
@@ -723,7 +723,7 @@ def create_merge_request(approvals_before_merge)
       project = create(:project, :private, :repository)
       merge_request = create(:merge_request, :simple, source_project: project)
       guest = create(:user)
-      project.team << [guest, :guest]
+      project.add_guest(guest)
 
       get v3_api("/projects/#{project.id}/merge_requests/#{merge_request.id}/closes_issues", guest)
 
@@ -753,7 +753,7 @@ def create_merge_request(approvals_before_merge)
 
     it 'returns 403 if user has no access to read code' do
       guest = create(:user)
-      project.team << [guest, :guest]
+      project.add_guest(guest)
 
       post v3_api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", guest)
 
@@ -783,7 +783,7 @@ def create_merge_request(approvals_before_merge)
 
     it 'returns 403 if user has no access to read code' do
       guest = create(:user)
-      project.team << [guest, :guest]
+      project.add_guest(guest)
 
       delete v3_api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", guest)
 
@@ -795,8 +795,8 @@ def create_merge_request(approvals_before_merge)
     it 'retrieves the approval status' do
       approver = create :user
       project.update_attribute(:approvals_before_merge, 2)
-      project.team << [approver, :developer]
-      project.team << [create(:user), :developer]
+      project.add_developer(approver)
+      project.add_developer(create(:user))
       merge_request.approvals.create(user: approver)
 
       get v3_api("/projects/#{project.id}/merge_requests/#{merge_request.id}/approvals", user)
@@ -825,8 +825,8 @@ def create_merge_request(approvals_before_merge)
       let(:approver) { create(:user) }
 
       before do
-        project.team << [approver, :developer]
-        project.team << [create(:user), :developer]
+        project.add_developer(approver)
+        project.add_developer(create(:user))
 
         post v3_api("/projects/#{project.id}/merge_requests/#{merge_request.id}/approve", approver)
       end
@@ -848,9 +848,9 @@ def create_merge_request(approvals_before_merge)
       let(:unapprover) { create(:user) }
 
       before do
-        project.team << [approver, :developer]
-        project.team << [unapprover, :developer]
-        project.team << [create(:user), :developer]
+        project.add_developer(approver)
+        project.add_developer(unapprover)
+        project.add_developer(create(:user))
         merge_request.approvals.create(user: approver)
         merge_request.approvals.create(user: unapprover)
 
diff --git a/spec/requests/api/v3/milestones_spec.rb b/spec/requests/api/v3/milestones_spec.rb
index e82f35598a6e..9ee71ea9c5d6 100644
--- a/spec/requests/api/v3/milestones_spec.rb
+++ b/spec/requests/api/v3/milestones_spec.rb
@@ -6,7 +6,7 @@
   let!(:closed_milestone) { create(:closed_milestone, project: project) }
   let!(:milestone) { create(:milestone, project: project) }
 
-  before { project.team << [user, :developer] }
+  before { project.add_developer(user) }
 
   describe 'GET /projects/:id/milestones' do
     it 'returns project milestones' do
@@ -200,7 +200,7 @@
       let(:confidential_issue) { create(:issue, confidential: true, project: public_project) }
 
       before do
-        public_project.team << [user, :developer]
+        public_project.add_developer(user)
         milestone.issues << issue << confidential_issue
       end
 
@@ -215,7 +215,7 @@
 
       it 'does not return confidential issues to team members with guest role' do
         member = create(:user)
-        project.team << [member, :guest]
+        project.add_guest(member)
 
         get v3_api("/projects/#{public_project.id}/milestones/#{milestone.id}/issues", member)
 
diff --git a/spec/requests/api/v3/notes_spec.rb b/spec/requests/api/v3/notes_spec.rb
index d3455a4bba41..6428d9daabaa 100644
--- a/spec/requests/api/v3/notes_spec.rb
+++ b/spec/requests/api/v3/notes_spec.rb
@@ -14,7 +14,7 @@
   let(:private_user)    { create(:user) }
   let(:private_project) do
     create(:project, namespace: private_user.namespace)
-    .tap { |p| p.team << [private_user, :master] }
+    .tap { |p| p.add_master(private_user) }
   end
   let(:private_issue)    { create(:issue, project: private_project) }
 
@@ -28,7 +28,7 @@
     system: true
   end
 
-  before { project.team << [user, :reporter] }
+  before { project.add_reporter(user) }
 
   describe "GET /projects/:id/noteable/:noteable_id/notes" do
     context "when noteable is an Issue" do
diff --git a/spec/requests/api/v3/pipelines_spec.rb b/spec/requests/api/v3/pipelines_spec.rb
index 1c7d9fe32bb3..ea943f22c415 100644
--- a/spec/requests/api/v3/pipelines_spec.rb
+++ b/spec/requests/api/v3/pipelines_spec.rb
@@ -10,7 +10,7 @@
                                ref: project.default_branch)
   end
 
-  before { project.team << [user, :master] }
+  before { project.add_master(user) }
 
   shared_examples 'a paginated resources' do
     before do
@@ -188,7 +188,7 @@
     context 'user without proper access rights' do
       let!(:reporter) { create(:user) }
 
-      before { project.team << [reporter, :reporter] }
+      before { project.add_reporter(reporter) }
 
       it 'rejects the action' do
         post v3_api("/projects/#{project.id}/pipelines/#{pipeline.id}/cancel", reporter)
diff --git a/spec/requests/api/v3/project_hooks_spec.rb b/spec/requests/api/v3/project_hooks_spec.rb
index 00f59744a31c..248ae97f8759 100644
--- a/spec/requests/api/v3/project_hooks_spec.rb
+++ b/spec/requests/api/v3/project_hooks_spec.rb
@@ -13,8 +13,8 @@
   end
 
   before do
-    project.team << [user, :master]
-    project.team << [user3, :developer]
+    project.add_master(user)
+    project.add_developer(user3)
   end
 
   describe "GET /projects/:id/hooks" do
@@ -205,7 +205,7 @@
     it "returns a 404 if a user attempts to delete project hooks he/she does not own" do
       test_user = create(:user)
       other_project = create(:project)
-      other_project.team << [test_user, :master]
+      other_project.add_master(test_user)
 
       delete v3_api("/projects/#{other_project.id}/hooks/#{hook.id}", test_user)
       expect(response).to have_gitlab_http_status(404)
diff --git a/spec/requests/api/v3/project_push_rule_spec.rb b/spec/requests/api/v3/project_push_rule_spec.rb
index 650f477e13a9..7ec27aaf97aa 100644
--- a/spec/requests/api/v3/project_push_rule_spec.rb
+++ b/spec/requests/api/v3/project_push_rule_spec.rb
@@ -7,8 +7,8 @@
   let!(:project) { create(:project, :repository, creator_id: user.id, namespace: user.namespace) }
 
   before do
-    project.team << [user, :master]
-    project.team << [user3, :developer]
+    project.add_master(user)
+    project.add_developer(user3)
   end
 
   describe "DELETE /projects/:id/push_rule" do
diff --git a/spec/requests/api/v3/projects_spec.rb b/spec/requests/api/v3/projects_spec.rb
index 27cfe443ba76..ec57ec9e50c5 100644
--- a/spec/requests/api/v3/projects_spec.rb
+++ b/spec/requests/api/v3/projects_spec.rb
@@ -805,7 +805,7 @@
 
       describe 'permissions' do
         context 'all projects' do
-          before { project.team << [user, :master] }
+          before { project.add_master(user) }
 
           it 'contains permission information' do
             get v3_api("/projects", user)
@@ -819,7 +819,7 @@
 
         context 'personal project' do
           it 'sets project access and returns 200' do
-            project.team << [user, :master]
+            project.add_master(user)
             get v3_api("/projects/#{project.id}", user)
 
             expect(response).to have_gitlab_http_status(200)
@@ -1423,7 +1423,7 @@
 
     context 'user without archiving rights to the project' do
       before do
-        project.team << [user3, :developer]
+        project.add_developer(user3)
       end
 
       it 'rejects the action' do
@@ -1459,7 +1459,7 @@
 
     context 'user without archiving rights to the project' do
       before do
-        project.team << [user3, :developer]
+        project.add_developer(user3)
       end
 
       it 'rejects the action' do
@@ -1527,7 +1527,7 @@
 
       it 'does not remove a project if not an owner' do
         user3 = create(:user)
-        project.team << [user3, :developer]
+        project.add_developer(user3)
         delete v3_api("/projects/#{project.id}", user3)
         expect(response).to have_gitlab_http_status(403)
       end
diff --git a/spec/requests/api/v3/todos_spec.rb b/spec/requests/api/v3/todos_spec.rb
index 8f5c3fbf8ddf..53fd962272a1 100644
--- a/spec/requests/api/v3/todos_spec.rb
+++ b/spec/requests/api/v3/todos_spec.rb
@@ -12,8 +12,8 @@
   let!(:done) { create(:todo, :done, project: project_1, author: author_1, user: john_doe) }
 
   before do
-    project_1.team << [john_doe, :developer]
-    project_2.team << [john_doe, :developer]
+    project_1.add_developer(john_doe)
+    project_2.add_developer(john_doe)
   end
 
   describe 'DELETE /todos/:id' do
diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb
index 724a880e2fe3..8027f89d02ed 100644
--- a/spec/requests/git_http_spec.rb
+++ b/spec/requests/git_http_spec.rb
@@ -149,7 +149,7 @@
 
           context 'and as a developer on the team' do
             before do
-              project.team << [user, :developer]
+              project.add_developer(user)
             end
 
             context 'but the repo is disabled' do
@@ -182,7 +182,7 @@
         context 'when authenticated' do
           context 'and as a developer on the team' do
             before do
-              project.team << [user, :developer]
+              project.add_developer(user)
             end
 
             context 'but the repo is disabled' do
@@ -240,7 +240,7 @@
 
           context 'as a developer on the team' do
             before do
-              project.team << [user, :developer]
+              project.add_developer(user)
             end
 
             it_behaves_like 'pulls are allowed'
@@ -365,13 +365,13 @@
 
             context "when the user has access to the project" do
               before do
-                project.team << [user, :master]
+                project.add_master(user)
               end
 
               context "when the user is blocked" do
                 it "rejects pulls with 401 Unauthorized" do
                   user.block
-                  project.team << [user, :master]
+                  project.add_master(user)
 
                   download(path, env) do |response|
                     expect(response).to have_gitlab_http_status(:unauthorized)
@@ -434,7 +434,7 @@
                 let(:path) { "#{project.full_path}.git" }
 
                 before do
-                  project.team << [user, :master]
+                  project.add_master(user)
                 end
 
                 context 'when username and password are provided' do
@@ -612,7 +612,7 @@ def attempt_login(include_password)
           context 'and build created by' do
             before do
               build.update(user: user)
-              project.team << [user, :reporter]
+              project.add_reporter(user)
             end
 
             shared_examples 'can download code only' do
@@ -705,13 +705,13 @@ def attempt_login(include_password)
 
             context "when the user has access to the project" do
               before do
-                project.team << [user, :master]
+                project.add_master(user)
               end
 
               context "when the user is blocked" do
                 before do
                   user.block
-                  project.team << [user, :master]
+                  project.add_master(user)
                 end
 
                 it "responds with status 403 Forbidden" do
@@ -764,7 +764,7 @@ def attempt_login(include_password)
           let(:env) { { user: user.username, password: user.password } }
 
           before do
-            project.team << [user, :master]
+            project.add_master(user)
           end
 
           it 'responds with status 403 Forbidden' do
@@ -783,7 +783,7 @@ def attempt_login(include_password)
           before do
             allow(License).to receive(:current).and_return(nil)
 
-            project.team << [user, :master]
+            project.add_master(user)
           end
 
           it_behaves_like 'pulls are allowed'
@@ -919,7 +919,7 @@ def attempt_login(include_password)
 
         context 'and the user is on the team' do
           before do
-            project.team << [user, :master]
+            project.add_master(user)
           end
 
           it "responds with status 200" do
diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb
index f2432bc6f8b2..85e06f1d563e 100644
--- a/spec/requests/lfs_http_spec.rb
+++ b/spec/requests/lfs_http_spec.rb
@@ -63,7 +63,7 @@
 
     context 'with LFS disabled globally' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         allow(Gitlab.config.lfs).to receive(:enabled).and_return(false)
       end
 
@@ -106,7 +106,7 @@
 
     context 'with LFS enabled globally' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         enable_lfs
       end
 
@@ -236,7 +236,7 @@
 
           context 'and does have project access' do
             let(:update_permissions) do
-              project.team << [user, :master]
+              project.add_master(user)
               project.lfs_objects << lfs_object
             end
 
@@ -276,7 +276,7 @@
 
           context 'when user allowed' do
             let(:update_permissions) do
-              project.team << [user, :master]
+              project.add_master(user)
               project.lfs_objects << lfs_object
             end
 
@@ -312,7 +312,7 @@
               let(:pipeline) { create(:ci_empty_pipeline, project: project) }
 
               let(:update_permissions) do
-                project.team << [user, :reporter]
+                project.add_reporter(user)
                 project.lfs_objects << lfs_object
               end
 
@@ -534,7 +534,7 @@
         let(:authorization) { authorize_user }
 
         let(:update_user_permissions) do
-          project.team << [user, role]
+          project.add_role(user, role)
         end
 
         it_behaves_like 'an authorized requests' do
@@ -570,7 +570,7 @@
             let(:pipeline) { create(:ci_empty_pipeline, project: project) }
 
             let(:update_user_permissions) do
-              project.team << [user, :reporter]
+              project.add_reporter(user)
             end
 
             it_behaves_like 'an authorized requests'
@@ -718,7 +718,7 @@
           let(:authorization) { authorize_user }
 
           let(:update_user_permissions) do
-            project.team << [user, :developer]
+            project.add_developer(user)
           end
 
           context 'when pushing an lfs object that already exists' do
@@ -840,7 +840,7 @@
       context 'when user is not authenticated' do
         context 'when user has push access' do
           let(:update_user_permissions) do
-            project.team << [user, :master]
+            project.add_master(user)
           end
 
           it 'responds with status 401' do
@@ -885,7 +885,7 @@
 
     before do
       allow(Gitlab::Database).to receive(:read_only?) { true }
-      project.team << [user, :master]
+      project.add_master(user)
       enable_lfs
     end
 
@@ -980,7 +980,7 @@
 
         describe 'when user has push access to the project' do
           before do
-            project.team << [user, :developer]
+            project.add_developer(user)
           end
 
           context 'and the request bypassed workhorse' do
@@ -1078,7 +1078,7 @@
 
         describe 'and user does not have push access' do
           before do
-            project.team << [user, :reporter]
+            project.add_reporter(user)
           end
 
           it_behaves_like 'forbidden'
@@ -1095,7 +1095,7 @@
             let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) }
 
             before do
-              project.team << [user, :developer]
+              project.add_developer(user)
               put_authorize
             end
 
@@ -1147,7 +1147,7 @@
 
         describe 'when user has push access to the project' do
           before do
-            project.team << [user, :developer]
+            project.add_developer(user)
           end
 
           context 'and request is sent by gitlab-workhorse to authorize the request' do
@@ -1234,7 +1234,7 @@
         let(:authorization) { authorize_user }
 
         before do
-          second_project.team << [user, :master]
+          second_project.add_master(user)
           upstream_project.lfs_objects << lfs_object
         end
 
diff --git a/spec/requests/projects/cycle_analytics_events_spec.rb b/spec/requests/projects/cycle_analytics_events_spec.rb
index 286d8a884a41..98f70e2101bd 100644
--- a/spec/requests/projects/cycle_analytics_events_spec.rb
+++ b/spec/requests/projects/cycle_analytics_events_spec.rb
@@ -7,7 +7,7 @@
 
   describe 'GET /:namespace/:project/cycle_analytics/events/issues' do
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
 
       3.times do |count|
         Timecop.freeze(Time.now + count.days) do
diff --git a/spec/requests/projects/issue_links_controller_spec.rb b/spec/requests/projects/issue_links_controller_spec.rb
index a6e19726582f..50ed7aea37f0 100644
--- a/spec/requests/projects/issue_links_controller_spec.rb
+++ b/spec/requests/projects/issue_links_controller_spec.rb
@@ -14,7 +14,7 @@
     let!(:issue_link) { create :issue_link, source: issue, target: issue_b }
 
     before do
-      project.team << [user, :guest]
+      project.add_guest(user)
       login_as user
     end
 
@@ -32,7 +32,7 @@
     let(:issue_b) { create :issue, project: project }
 
     before do
-      project.team << [user, user_role]
+      project.add_role(user, user_role)
       login_as user
     end
 
@@ -83,7 +83,7 @@
     let(:issue_link) { create :issue_link, source: issue, target: referenced_issue }
 
     before do
-      project.team << [user, user_role]
+      project.add_role(user, user_role)
       login_as user
     end
 
diff --git a/spec/requests/projects/mirrors_controller_spec.rb b/spec/requests/projects/mirrors_controller_spec.rb
index 544aa5071f8d..a4efac593fee 100644
--- a/spec/requests/projects/mirrors_controller_spec.rb
+++ b/spec/requests/projects/mirrors_controller_spec.rb
@@ -11,7 +11,7 @@
 
   describe 'updates the mirror URL' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       login_as(user)
     end
 
diff --git a/spec/serializers/environment_entity_spec.rb b/spec/serializers/environment_entity_spec.rb
index 8d5d733f05c4..406263ce55aa 100644
--- a/spec/serializers/environment_entity_spec.rb
+++ b/spec/serializers/environment_entity_spec.rb
@@ -13,7 +13,7 @@
   subject { entity.as_json }
 
   before do
-    environment.project.team << [user, :master]
+    environment.project.add_master(user)
   end
 
   it 'exposes latest deployment' do
diff --git a/spec/services/boards/issues/create_service_spec.rb b/spec/services/boards/issues/create_service_spec.rb
index ec4bcf43f114..c16d0d2a6b1f 100644
--- a/spec/services/boards/issues/create_service_spec.rb
+++ b/spec/services/boards/issues/create_service_spec.rb
@@ -11,7 +11,7 @@
     subject(:service) { described_class.new(board.parent, project, user, board_id: board.id, list_id: list.id, title: 'New issue') }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     it 'delegates the create proceedings to Issues::CreateService' do
@@ -32,7 +32,7 @@
 
     it 'adds the board assignee, weight, labels and milestone to the issue' do
       board_assignee = create(:user)
-      project.team << [board_assignee, :developer]
+      project.add_developer(board_assignee)
       board_milestone = create(:milestone, project: project)
       board_label = create(:label, project: project)
       board.update!(assignee: board_assignee,
diff --git a/spec/services/boards/issues/list_service_spec.rb b/spec/services/boards/issues/list_service_spec.rb
index cb3b4a7fe494..493de18a7641 100644
--- a/spec/services/boards/issues/list_service_spec.rb
+++ b/spec/services/boards/issues/list_service_spec.rb
@@ -37,7 +37,7 @@
     let!(:closed_issue5) { create(:labeled_issue, :closed, project: project, labels: [development]) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     it 'delegates search to IssuesFinder' do
diff --git a/spec/services/boards/issues/move_service_spec.rb b/spec/services/boards/issues/move_service_spec.rb
index 464ff9f94b36..280e411683e9 100644
--- a/spec/services/boards/issues/move_service_spec.rb
+++ b/spec/services/boards/issues/move_service_spec.rb
@@ -15,7 +15,7 @@
     let!(:closed)  { create(:closed_list, board: board1) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     context 'when moving an issue between lists' do
diff --git a/spec/services/boards/lists/create_service_spec.rb b/spec/services/boards/lists/create_service_spec.rb
index 7d0b396cd06c..d5322e1bb214 100644
--- a/spec/services/boards/lists/create_service_spec.rb
+++ b/spec/services/boards/lists/create_service_spec.rb
@@ -10,7 +10,7 @@
     subject(:service) { described_class.new(project, user, label_id: label.id) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     context 'when board lists is empty' do
diff --git a/spec/services/boards/lists/generate_service_spec.rb b/spec/services/boards/lists/generate_service_spec.rb
index 592f25059ac2..82dbd1ee744d 100644
--- a/spec/services/boards/lists/generate_service_spec.rb
+++ b/spec/services/boards/lists/generate_service_spec.rb
@@ -9,7 +9,7 @@
     subject(:service) { described_class.new(project, user) }
 
     before do
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     context 'when board lists is empty' do
diff --git a/spec/services/ci/stop_environments_service_spec.rb b/spec/services/ci/stop_environments_service_spec.rb
index e2a9ed27e874..3fc4e499b0c0 100644
--- a/spec/services/ci/stop_environments_service_spec.rb
+++ b/spec/services/ci/stop_environments_service_spec.rb
@@ -15,7 +15,7 @@
 
       context 'when user has permission to stop environment' do
         before do
-          project.team << [user, :developer]
+          project.add_developer(user)
         end
 
         context 'when environment is associated with removed branch' do
@@ -57,7 +57,7 @@
       context 'when user does not have permission to stop environment' do
         context 'when user has no access to manage deployments' do
           before do
-            project.team << [user, :guest]
+            project.add_guest(user)
           end
 
           it 'does not stop environment' do
@@ -86,7 +86,7 @@
 
       context 'when user has permission to stop environments' do
         before do
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it 'does not stop environment' do
diff --git a/spec/services/delete_branch_service_spec.rb b/spec/services/delete_branch_service_spec.rb
index 19855c9bee29..9c9fba030e75 100644
--- a/spec/services/delete_branch_service_spec.rb
+++ b/spec/services/delete_branch_service_spec.rb
@@ -9,7 +9,7 @@
   describe '#execute' do
     context 'when user has access to push to repository' do
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       it 'removes the branch' do
diff --git a/spec/services/discussions/resolve_service_spec.rb b/spec/services/discussions/resolve_service_spec.rb
index ab8df7b74cdd..3895a0b3aea9 100644
--- a/spec/services/discussions/resolve_service_spec.rb
+++ b/spec/services/discussions/resolve_service_spec.rb
@@ -9,7 +9,7 @@
     let(:service) { described_class.new(discussion.noteable.project, user, merge_request: merge_request) }
 
     before do
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     it "doesn't resolve discussions the user can't resolve" do
diff --git a/spec/services/files/update_service_spec.rb b/spec/services/files/update_service_spec.rb
index 2b4f8cd42eed..43b0c9a63a93 100644
--- a/spec/services/files/update_service_spec.rb
+++ b/spec/services/files/update_service_spec.rb
@@ -24,7 +24,7 @@
   end
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe "#execute" do
diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb
index 67581c1f1d38..edf12a3eb222 100644
--- a/spec/services/git_push_service_spec.rb
+++ b/spec/services/git_push_service_spec.rb
@@ -11,7 +11,7 @@
   let(:ref)      { 'refs/heads/master' }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe 'with remote mirrors' do
@@ -355,8 +355,8 @@
     let(:commit) { project.commit }
 
     before do
-      project.team << [commit_author, :developer]
-      project.team << [user, :developer]
+      project.add_developer(commit_author)
+      project.add_developer(user)
 
       allow(commit).to receive_messages(
         safe_message: "this commit \n mentions #{issue.to_reference}",
@@ -412,8 +412,8 @@
     let(:commit_time) { Time.now }
 
     before do
-      project.team << [commit_author, :developer]
-      project.team << [user, :developer]
+      project.add_developer(commit_author)
+      project.add_developer(user)
 
       allow(commit).to receive_messages(
         safe_message: "this commit \n mentions #{issue.to_reference}",
@@ -465,7 +465,7 @@
       allow_any_instance_of(ProcessCommitWorker).to receive(:build_commit)
         .and_return(closing_commit)
 
-      project.team << [commit_author, :master]
+      project.add_master(commit_author)
     end
 
     context "to default branches" do
diff --git a/spec/services/git_tag_push_service_spec.rb b/spec/services/git_tag_push_service_spec.rb
index 05695aa81884..33405d7a7ec6 100644
--- a/spec/services/git_tag_push_service_spec.rb
+++ b/spec/services/git_tag_push_service_spec.rb
@@ -35,7 +35,7 @@
 
     before do
       stub_ci_pipeline_to_return_yaml_file
-      project.team << [user, :developer]
+      project.add_developer(user)
     end
 
     it "creates a new pipeline" do
diff --git a/spec/services/issuable/bulk_update_service_spec.rb b/spec/services/issuable/bulk_update_service_spec.rb
index bdaab88d673a..53c85f73cde2 100644
--- a/spec/services/issuable/bulk_update_service_spec.rb
+++ b/spec/services/issuable/bulk_update_service_spec.rb
@@ -54,7 +54,7 @@ def bulk_update(issuables, extra_params = {})
     context 'when the new assignee ID is a valid user' do
       it 'succeeds' do
         new_assignee = create(:user)
-        project.team << [new_assignee, :developer]
+        project.add_developer(new_assignee)
 
         result = bulk_update(merge_request, assignee_id: new_assignee.id)
 
@@ -64,7 +64,7 @@ def bulk_update(issuables, extra_params = {})
 
       it 'updates the assignee to the user ID passed' do
         assignee = create(:user)
-        project.team << [assignee, :developer]
+        project.add_developer(assignee)
 
         expect { bulk_update(merge_request, assignee_id: assignee.id) }
           .to change { merge_request.reload.assignee }.from(user).to(assignee)
@@ -92,7 +92,7 @@ def bulk_update(issuables, extra_params = {})
     context 'when the new assignee ID is a valid user' do
       it 'succeeds' do
         new_assignee = create(:user)
-        project.team << [new_assignee, :developer]
+        project.add_developer(new_assignee)
 
         result = bulk_update(issue, assignee_ids: [new_assignee.id])
 
@@ -102,7 +102,7 @@ def bulk_update(issuables, extra_params = {})
 
       it 'updates the assignee to the user ID passed' do
         assignee = create(:user)
-        project.team << [assignee, :developer]
+        project.add_developer(assignee)
         expect { bulk_update(issue, assignee_ids: [assignee.id]) }
           .to change { issue.reload.assignees.first }.from(user).to(assignee)
       end
diff --git a/spec/services/issues/build_service_spec.rb b/spec/services/issues/build_service_spec.rb
index 03f76bd428dd..248e7d5a389b 100644
--- a/spec/services/issues/build_service_spec.rb
+++ b/spec/services/issues/build_service_spec.rb
@@ -5,7 +5,7 @@
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   context 'for a single discussion' do
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
index 5c27e8fd5613..8897a64a138b 100644
--- a/spec/services/issues/close_service_spec.rb
+++ b/spec/services/issues/close_service_spec.rb
@@ -9,9 +9,9 @@
   let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :developer]
-    project.team << [guest, :guest]
+    project.add_master(user)
+    project.add_developer(user2)
+    project.add_guest(guest)
   end
 
   describe '#execute' do
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index d86da2445201..79bcdc41fb06 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -13,8 +13,8 @@
       let(:labels) { create_pair(:label, project: project) }
 
       before do
-        project.team << [user, :master]
-        project.team << [assignee, :master]
+        project.add_master(user)
+        project.add_master(assignee)
       end
 
       let(:opts) do
@@ -43,7 +43,7 @@
         let(:guest) { create(:user) }
 
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
         end
 
         it 'filters out params that cannot be set without the :admin_issue permission' do
@@ -130,7 +130,7 @@
         end
 
         it 'invalidates open issues counter for assignees when issue is assigned' do
-          project.team << [assignee, :master]
+          project.add_master(assignee)
 
           described_class.new(project, user, opts).execute
 
@@ -160,7 +160,7 @@
     context 'issue create service' do
       context 'assignees' do
         before do
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it 'removes assignee when user id is invalid' do
@@ -180,7 +180,7 @@
         end
 
         it 'saves assignee when user id is valid' do
-          project.team << [assignee, :master]
+          project.add_master(assignee)
           opts = { title: 'Title', description: 'Description', assignee_ids: [assignee.id] }
 
           issue = described_class.new(project, user, opts).execute
@@ -224,8 +224,8 @@
         end
 
         before do
-          project.team << [user, :master]
-          project.team << [assignee, :master]
+          project.add_master(user)
+          project.add_master(assignee)
         end
 
         it 'assigns and sets milestone to issuable from command' do
@@ -242,7 +242,7 @@
       let(:project) { merge_request.source_project }
 
       before do
-        project.team << [user, :master]
+        project.add_master(user)
       end
 
       describe 'for a single discussion' do
diff --git a/spec/services/issues/move_service_spec.rb b/spec/services/issues/move_service_spec.rb
index f2b35a8fadf5..40f15f9f0968 100644
--- a/spec/services/issues/move_service_spec.rb
+++ b/spec/services/issues/move_service_spec.rb
@@ -20,8 +20,8 @@
 
   shared_context 'user can move issue' do
     before do
-      old_project.team << [user, :reporter]
-      new_project.team << [user, :reporter]
+      old_project.add_reporter(user)
+      new_project.add_reporter(user)
 
       labels = Array.new(2) { |x| "label%d" % (x + 1) }
 
@@ -301,7 +301,7 @@
 
       context 'user is reporter only in new project' do
         before do
-          new_project.team << [user, :reporter]
+          new_project.add_reporter(user)
         end
 
         it { expect { move }.to raise_error(StandardError, /permissions/) }
@@ -309,7 +309,7 @@
 
       context 'user is reporter only in old project' do
         before do
-          old_project.team << [user, :reporter]
+          old_project.add_reporter(user)
         end
 
         it { expect { move }.to raise_error(StandardError, /permissions/) }
@@ -317,8 +317,8 @@
 
       context 'user is reporter in one project and guest in another' do
         before do
-          new_project.team << [user, :guest]
-          old_project.team << [user, :reporter]
+          new_project.add_guest(user)
+          old_project.add_reporter(user)
         end
 
         it { expect { move }.to raise_error(StandardError, /permissions/) }
@@ -346,8 +346,8 @@
 
     context 'movable issue with no assigned labels' do
       before do
-        old_project.team << [user, :reporter]
-        new_project.team << [user, :reporter]
+        old_project.add_reporter(user)
+        new_project.add_reporter(user)
 
         labels = Array.new(2) { |x| "label%d" % (x + 1) }
 
diff --git a/spec/services/issues/reopen_service_spec.rb b/spec/services/issues/reopen_service_spec.rb
index 48fc98b3b2f1..42e5d544f4cf 100644
--- a/spec/services/issues/reopen_service_spec.rb
+++ b/spec/services/issues/reopen_service_spec.rb
@@ -8,7 +8,7 @@
     context 'when user is not authorized to reopen issue' do
       before do
         guest = create(:user)
-        project.team << [guest, :guest]
+        project.add_guest(guest)
 
         perform_enqueued_jobs do
           described_class.new(project, guest).execute(issue)
@@ -24,7 +24,7 @@
       let(:user) { create(:user) }
 
       before do
-        project.team << [user, :master]
+        project.add_master(user)
       end
 
       it 'invalidates counter cache for assignees' do
diff --git a/spec/services/issues/resolve_discussions_spec.rb b/spec/services/issues/resolve_discussions_spec.rb
index 67a86c50fc13..13accc6ae1b6 100644
--- a/spec/services/issues/resolve_discussions_spec.rb
+++ b/spec/services/issues/resolve_discussions_spec.rb
@@ -14,7 +14,7 @@ def initialize(*args)
   let(:user) { create(:user) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   describe "for resolving discussions" do
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index f07b81e842a1..1cb6f2e097f7 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -17,9 +17,9 @@
   end
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :developer]
-    project.team << [user3, :developer]
+    project.add_master(user)
+    project.add_developer(user2)
+    project.add_developer(user3)
   end
 
   describe 'execute' do
@@ -99,7 +99,7 @@ def update_issue(opts)
       context 'when current user cannot admin issues in the project' do
         let(:guest) { create(:user) }
         before do
-          project.team << [guest, :guest]
+          project.add_guest(guest)
         end
 
         it 'filters out params that cannot be set without the :admin_issue permission' do
@@ -318,7 +318,7 @@ def update_issue(opts)
       let!(:subscriber) do
         create(:user).tap do |u|
           label.toggle_subscription(u, project)
-          project.team << [u, :developer]
+          project.add_developer(u)
         end
       end
 
@@ -556,7 +556,7 @@ def update_issue(opts)
 
       context 'valid project' do
         before do
-          target_project.team << [user, :master]
+          target_project.add_master(user)
         end
 
         it 'calls the move service with the proper issue and project' do
diff --git a/spec/services/labels/find_or_create_service_spec.rb b/spec/services/labels/find_or_create_service_spec.rb
index a781fbc7f7d2..78aa5d442e71 100644
--- a/spec/services/labels/find_or_create_service_spec.rb
+++ b/spec/services/labels/find_or_create_service_spec.rb
@@ -17,7 +17,7 @@
       let(:user) { create(:user) }
       subject(:service) { described_class.new(user, project, params) }
       before do
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
 
       context 'when label does not exist at group level' do
diff --git a/spec/services/members/approve_access_request_service_spec.rb b/spec/services/members/approve_access_request_service_spec.rb
index 302c488d6c63..b3018169a1c3 100644
--- a/spec/services/members/approve_access_request_service_spec.rb
+++ b/spec/services/members/approve_access_request_service_spec.rb
@@ -123,7 +123,7 @@
 
     context 'when current user can approve access request to the project' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         group.add_owner(user)
       end
 
diff --git a/spec/services/members/authorized_destroy_service_spec.rb b/spec/services/members/authorized_destroy_service_spec.rb
index d4ef31c0c749..757c45708b90 100644
--- a/spec/services/members/authorized_destroy_service_spec.rb
+++ b/spec/services/members/authorized_destroy_service_spec.rb
@@ -13,7 +13,7 @@ def number_of_assigned_issuables(user)
   context 'Invited users' do
     # Regression spec for issue: https://gitlab.com/gitlab-org/gitlab-ce/issues/32504
     it 'destroys invited project member' do
-      project.team << [member_user, :developer]
+      project.add_developer(member_user)
 
       member = create :project_member, :invited, project: project
 
@@ -52,7 +52,7 @@ def number_of_assigned_issuables(user)
 
   context 'Project member' do
     it "unassigns issues and merge requests" do
-      project.team << [member_user, :developer]
+      project.add_developer(member_user)
 
       create :issue, project: project, assignees: [member_user]
       create :merge_request, target_project: project, source_project: project, assignee: member_user
diff --git a/spec/services/members/create_service_spec.rb b/spec/services/members/create_service_spec.rb
index 2a793e0eb4d7..6bd4718e780a 100644
--- a/spec/services/members/create_service_spec.rb
+++ b/spec/services/members/create_service_spec.rb
@@ -6,7 +6,7 @@
   let(:project_user) { create(:user) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   it 'adds user to members' do
diff --git a/spec/services/members/destroy_service_spec.rb b/spec/services/members/destroy_service_spec.rb
index 72f5e27180df..91152df3ad94 100644
--- a/spec/services/members/destroy_service_spec.rb
+++ b/spec/services/members/destroy_service_spec.rb
@@ -71,7 +71,7 @@
 
   context 'when a member is found' do
     before do
-      project.team << [member_user, :developer]
+      project.add_developer(member_user)
       group.add_developer(member_user)
     end
     let(:params) { { user_id: member_user.id } }
@@ -88,7 +88,7 @@
 
     context 'when current user can destroy the given member' do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
         group.add_owner(user)
       end
 
diff --git a/spec/services/merge_requests/assign_issues_service_spec.rb b/spec/services/merge_requests/assign_issues_service_spec.rb
index fcbe0e5985fa..bda6383a3468 100644
--- a/spec/services/merge_requests/assign_issues_service_spec.rb
+++ b/spec/services/merge_requests/assign_issues_service_spec.rb
@@ -8,7 +8,7 @@
   let(:service) { described_class.new(project, user, merge_request: merge_request) }
 
   before do
-    project.team << [user, :developer]
+    project.add_developer(user)
   end
 
   it 'finds unassigned issues fixed in merge request' do
diff --git a/spec/services/merge_requests/build_service_spec.rb b/spec/services/merge_requests/build_service_spec.rb
index b5c92e681fb9..a9605c6e4c65 100644
--- a/spec/services/merge_requests/build_service_spec.rb
+++ b/spec/services/merge_requests/build_service_spec.rb
@@ -28,7 +28,7 @@
   end
 
   before do
-    project.team << [user, :guest]
+    project.add_guest(user)
   end
 
   def stub_compare
diff --git a/spec/services/merge_requests/close_service_spec.rb b/spec/services/merge_requests/close_service_spec.rb
index b38869873169..2a59bc4594af 100644
--- a/spec/services/merge_requests/close_service_spec.rb
+++ b/spec/services/merge_requests/close_service_spec.rb
@@ -9,9 +9,9 @@
   let!(:todo) { create(:todo, :assigned, user: user, project: project, target: merge_request, author: user2) }
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :developer]
-    project.team << [guest, :guest]
+    project.add_master(user)
+    project.add_developer(user2)
+    project.add_guest(guest)
   end
 
   describe '#execute' do
diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb
index a047f891ab2d..dd8c803a2f7a 100644
--- a/spec/services/merge_requests/create_service_spec.rb
+++ b/spec/services/merge_requests/create_service_spec.rb
@@ -21,8 +21,8 @@
       let(:merge_request) { service.execute }
 
       before do
-        project.team << [user, :master]
-        project.team << [assignee, :developer]
+        project.add_master(user)
+        project.add_developer(assignee)
         allow(service).to receive(:execute_hooks)
       end
 
@@ -148,8 +148,8 @@
         end
 
         before do
-          project.team << [user, :master]
-          project.team << [assignee, :master]
+          project.add_master(user)
+          project.add_master(assignee)
         end
 
         it 'assigns and sets milestone to issuable from command' do
@@ -165,7 +165,7 @@
         let(:assignee) { create(:user) }
 
         before do
-          project.team << [user, :master]
+          project.add_master(user)
         end
 
         it 'removes assignee_id when user id is invalid' do
@@ -185,7 +185,7 @@
         end
 
         it 'saves assignee when user id is valid' do
-          project.team << [assignee, :master]
+          project.add_master(assignee)
           opts = { title: 'Title', description: 'Description', assignee_id: assignee.id }
 
           merge_request = described_class.new(project, user, opts).execute
@@ -205,7 +205,7 @@
           end
 
           it 'invalidates open merge request counter for assignees when merge request is assigned' do
-            project.team << [assignee, :master]
+            project.add_master(assignee)
 
             described_class.new(project, user, opts).execute
 
@@ -249,8 +249,8 @@
       end
 
       before do
-        project.team << [user, :master]
-        project.team << [assignee, :developer]
+        project.add_master(user)
+        project.add_developer(assignee)
       end
 
       it 'creates a `MergeRequestsClosingIssues` record for each issue' do
diff --git a/spec/services/merge_requests/ff_merge_service_spec.rb b/spec/services/merge_requests/ff_merge_service_spec.rb
index aaabf3ed2b03..aa90feeef89a 100644
--- a/spec/services/merge_requests/ff_merge_service_spec.rb
+++ b/spec/services/merge_requests/ff_merge_service_spec.rb
@@ -12,8 +12,8 @@
   let(:project) { merge_request.project }
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :developer]
+    project.add_master(user)
+    project.add_developer(user2)
   end
 
   describe '#execute' do
diff --git a/spec/services/merge_requests/post_merge_service_spec.rb b/spec/services/merge_requests/post_merge_service_spec.rb
index d2bd05d921fe..8f2c5df5907d 100644
--- a/spec/services/merge_requests/post_merge_service_spec.rb
+++ b/spec/services/merge_requests/post_merge_service_spec.rb
@@ -6,7 +6,7 @@
   let(:project) { merge_request.project }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe '#execute' do
diff --git a/spec/services/merge_requests/rebase_service_spec.rb b/spec/services/merge_requests/rebase_service_spec.rb
index d6a309de1251..d1b37cdd0736 100644
--- a/spec/services/merge_requests/rebase_service_spec.rb
+++ b/spec/services/merge_requests/rebase_service_spec.rb
@@ -15,7 +15,7 @@
   subject(:service) { described_class.new(project, user, {}) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe '#execute' do
diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb
index 7298d25ad11d..8128f07f3ff2 100644
--- a/spec/services/merge_requests/refresh_service_spec.rb
+++ b/spec/services/merge_requests/refresh_service_spec.rb
@@ -394,8 +394,8 @@
       let(:commit) { project.commit }
 
       before do
-        project.team << [commit_author, :developer]
-        project.team << [user, :developer]
+        project.add_developer(commit_author)
+        project.add_developer(user)
 
         allow(commit).to receive_messages(
           safe_message: "Closes #{issue.to_reference}",
diff --git a/spec/services/merge_requests/reopen_service_spec.rb b/spec/services/merge_requests/reopen_service_spec.rb
index fa652611c6b6..94f31ff139c7 100644
--- a/spec/services/merge_requests/reopen_service_spec.rb
+++ b/spec/services/merge_requests/reopen_service_spec.rb
@@ -8,9 +8,9 @@
   let(:project) { merge_request.project }
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :developer]
-    project.team << [guest, :guest]
+    project.add_master(user)
+    project.add_developer(user2)
+    project.add_guest(guest)
   end
 
   describe '#execute' do
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index 2fe82475f0d1..25837dab6619 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -16,9 +16,9 @@
   end
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :developer]
-    project.team << [user3, :developer]
+    project.add_master(user)
+    project.add_developer(user2)
+    project.add_developer(user3)
   end
 
   describe 'execute' do
@@ -385,8 +385,8 @@ def update_merge_request(opts)
       let!(:subscriber) { create(:user) { |u| label.toggle_subscription(u, project) } }
 
       before do
-        project.team << [non_subscriber, :developer]
-        project.team << [subscriber, :developer]
+        project.add_developer(non_subscriber)
+        project.add_developer(subscriber)
       end
 
       it 'sends notifications for subscribers of newly added labels' do
diff --git a/spec/services/milestones/close_service_spec.rb b/spec/services/milestones/close_service_spec.rb
index 2bdf224804d7..adad73f7e114 100644
--- a/spec/services/milestones/close_service_spec.rb
+++ b/spec/services/milestones/close_service_spec.rb
@@ -6,7 +6,7 @@
   let(:milestone) { create(:milestone, title: "Milestone v1.2", project: project) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   describe '#execute' do
diff --git a/spec/services/milestones/create_service_spec.rb b/spec/services/milestones/create_service_spec.rb
index 8837b91051df..f2a18c7295a5 100644
--- a/spec/services/milestones/create_service_spec.rb
+++ b/spec/services/milestones/create_service_spec.rb
@@ -7,7 +7,7 @@
   describe '#execute' do
     context "valid params" do
       before do
-        project.team << [user, :master]
+        project.add_master(user)
 
         opts = {
           title: 'v2.1.9',
diff --git a/spec/services/milestones/destroy_service_spec.rb b/spec/services/milestones/destroy_service_spec.rb
index af35e17bfa7d..9703780b0e99 100644
--- a/spec/services/milestones/destroy_service_spec.rb
+++ b/spec/services/milestones/destroy_service_spec.rb
@@ -8,7 +8,7 @@
   let!(:merge_request) { create(:merge_request, source_project: project, milestone: milestone) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
   end
 
   def service
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index 661d26946e79..0ae26e871549 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -10,7 +10,7 @@
 
   describe '#execute' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     context "valid params" do
diff --git a/spec/services/notes/post_process_service_spec.rb b/spec/services/notes/post_process_service_spec.rb
index a2b3638059ff..6ef5e93cb200 100644
--- a/spec/services/notes/post_process_service_spec.rb
+++ b/spec/services/notes/post_process_service_spec.rb
@@ -7,7 +7,7 @@
 
   describe '#execute' do
     before do
-      project.team << [user, :master]
+      project.add_master(user)
       note_opts = {
         note: 'Awesome comment',
         noteable_type: 'Issue',
diff --git a/spec/services/notes/quick_actions_service_spec.rb b/spec/services/notes/quick_actions_service_spec.rb
index 424cc9694d36..ada34d1a26a7 100644
--- a/spec/services/notes/quick_actions_service_spec.rb
+++ b/spec/services/notes/quick_actions_service_spec.rb
@@ -3,11 +3,11 @@
 describe Notes::QuickActionsService do
   shared_context 'note on noteable' do
     let(:project) { create(:project) }
-    let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
+    let(:master) { create(:user).tap { |u| project.add_master(u) } }
     let(:assignee) { create(:user) }
 
     before do
-      project.team << [assignee, :master]
+      project.add_master(assignee)
     end
   end
 
@@ -226,7 +226,7 @@
   context 'Issue assignees' do
     describe '/assign' do
       let(:project) { create(:project) }
-      let(:master) { create(:user).tap { |u| project.team << [u, :master] } }
+      let(:master) { create(:user).tap { |u| project.add_master(u) } }
       let(:assignee) { create(:user) }
       let(:master) { create(:user) }
       let(:service) { described_class.new(project, master) }
@@ -237,8 +237,8 @@
       end
 
       before do
-        project.team << [master, :master]
-        project.team << [assignee, :master]
+        project.add_master(master)
+        project.add_master(assignee)
       end
 
       it 'adds only one assignee from the list' do
diff --git a/spec/services/notes/update_service_spec.rb b/spec/services/notes/update_service_spec.rb
index 3210539f3eed..65b1d6139982 100644
--- a/spec/services/notes/update_service_spec.rb
+++ b/spec/services/notes/update_service_spec.rb
@@ -9,9 +9,9 @@
   let(:note) { create(:note, project: project, noteable: issue, author: user, note: "Old note #{user2.to_reference}") }
 
   before do
-    project.team << [user, :master]
-    project.team << [user2, :developer]
-    project.team << [user3, :developer]
+    project.add_master(user)
+    project.add_developer(user2)
+    project.add_developer(user3)
   end
 
   describe '#execute' do
diff --git a/spec/services/projects/autocomplete_service_spec.rb b/spec/services/projects/autocomplete_service_spec.rb
index 426593be428e..7a8c54673f78 100644
--- a/spec/services/projects/autocomplete_service_spec.rb
+++ b/spec/services/projects/autocomplete_service_spec.rb
@@ -34,7 +34,7 @@
       end
 
       it 'does not list project confidential issues for project members with guest role' do
-        project.team << [member, :guest]
+        project.add_guest(member)
 
         autocomplete = described_class.new(project, non_member)
         issues = autocomplete.issues.map(&:iid)
@@ -66,7 +66,7 @@
       end
 
       it 'lists project confidential issues for project members' do
-        project.team << [member, :developer]
+        project.add_developer(member)
 
         autocomplete = described_class.new(project, member)
         issues = autocomplete.issues.map(&:iid)
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index dc41214f438e..7b9e6e38c378 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -14,7 +14,7 @@
   before do
     stub_licensed_features(multiple_issue_assignees: false)
 
-    project.team << [developer, :developer]
+    project.add_developer(developer)
   end
 
   describe '#execute' do
@@ -482,7 +482,7 @@
       let(:content) { "/assign @#{developer.username} @#{developer2.username}" }
 
       before do
-        project.team << [developer2, :developer]
+        project.add_developer(developer2)
       end
 
       context 'Issue' do
diff --git a/spec/services/search/snippet_service_spec.rb b/spec/services/search/snippet_service_spec.rb
index eae9bd4f5cf8..bc7885b03d94 100644
--- a/spec/services/search/snippet_service_spec.rb
+++ b/spec/services/search/snippet_service_spec.rb
@@ -33,7 +33,7 @@
 
       it 'returns public, internal snippets and project private snippets for project members' do
         member = create(:user)
-        project.team << [member, :developer]
+        project.add_developer(member)
         search = described_class.new(member, search: 'password')
         results = search.execute
 
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
index c56f077ed9fe..ee0f9f14581a 100644
--- a/spec/services/todo_service_spec.rb
+++ b/spec/services/todo_service_spec.rb
@@ -17,11 +17,11 @@
   let(:service) { described_class.new }
 
   before do
-    project.team << [guest, :guest]
-    project.team << [author, :developer]
-    project.team << [member, :developer]
-    project.team << [john_doe, :developer]
-    project.team << [skipped, :developer]
+    project.add_guest(guest)
+    project.add_developer(author)
+    project.add_developer(member)
+    project.add_developer(john_doe)
+    project.add_developer(skipped)
   end
 
   describe 'Issues' do
@@ -545,9 +545,9 @@
         let(:mr_approvers) { create(:merge_request, source_project: project, author: author, description: approver_mentions) }
 
         before do
-          project.team << [approver_1, :developer]
-          project.team << [approver_2, :developer]
-          project.team << [approver_3, :developer]
+          project.add_developer(approver_1)
+          project.add_developer(approver_2)
+          project.add_developer(approver_3)
 
           create(:approver, user: approver_1, target: mr_approvers)
           create(:approver, user: approver_2, target: mr_approvers)
diff --git a/spec/support/api/milestones_shared_examples.rb b/spec/support/api/milestones_shared_examples.rb
index f8ec95950a81..1a58e1aab299 100644
--- a/spec/support/api/milestones_shared_examples.rb
+++ b/spec/support/api/milestones_shared_examples.rb
@@ -258,7 +258,7 @@
         # Add public project to the group in context
         setup_for_group if context_group
 
-        public_project.team << [user, :developer]
+        public_project.add_developer(user)
         milestone.issues << issue << confidential_issue
       end
 
@@ -275,7 +275,7 @@
 
       it 'does not return confidential issues to team members with guest role' do
         member = create(:user)
-        public_project.team << [member, :guest]
+        public_project.add_guest(member)
 
         get api(issues_route, member)
 
diff --git a/spec/support/features/issuable_slash_commands_shared_examples.rb b/spec/support/features/issuable_slash_commands_shared_examples.rb
index 08e21ee25376..2c20821ac3f6 100644
--- a/spec/support/features/issuable_slash_commands_shared_examples.rb
+++ b/spec/support/features/issuable_slash_commands_shared_examples.rb
@@ -19,7 +19,7 @@
   let(:new_url_opts) { {} }
 
   before do
-    project.team << [master, :master]
+    project.add_master(master)
 
     gitlab_sign_in(master)
   end
diff --git a/spec/support/markdown_feature.rb b/spec/support/markdown_feature.rb
index 48af5330170d..ab21928f5f55 100644
--- a/spec/support/markdown_feature.rb
+++ b/spec/support/markdown_feature.rb
@@ -24,7 +24,7 @@ def group
 
   def project
     @project ||= create(:project, :repository, group: group).tap do |project|
-      project.team << [user, :master]
+      project.add_master(user)
     end
   end
 
@@ -93,7 +93,7 @@ def xproject
     @xproject ||= begin
       group = create(:group, :nested)
       create(:project, :repository, namespace: group) do |project|
-        project.team << [user, :developer]
+        project.add_developer(user)
       end
     end
   end
diff --git a/spec/support/mentionable_shared_examples.rb b/spec/support/mentionable_shared_examples.rb
index 15b30d059662..5810ea8f8903 100644
--- a/spec/support/mentionable_shared_examples.rb
+++ b/spec/support/mentionable_shared_examples.rb
@@ -58,7 +58,7 @@
 
     set_mentionable_text.call(ref_string)
 
-    project.team << [author, :developer]
+    project.add_developer(author)
   end
 end
 
diff --git a/spec/support/reference_parser_shared_examples.rb b/spec/support/reference_parser_shared_examples.rb
index bd83cb88058d..baf8bcc04b88 100644
--- a/spec/support/reference_parser_shared_examples.rb
+++ b/spec/support/reference_parser_shared_examples.rb
@@ -26,7 +26,7 @@
     end
 
     it "creates reference for member" do
-      project.team << [user, :developer]
+      project.add_developer(user)
 
       expect(subject.nodes_visible_to_user(user, [link])).to eq([link])
     end
diff --git a/spec/support/services/issuable_create_service_slash_commands_shared_examples.rb b/spec/support/services/issuable_create_service_slash_commands_shared_examples.rb
index 9399745f9003..7b0641627262 100644
--- a/spec/support/services/issuable_create_service_slash_commands_shared_examples.rb
+++ b/spec/support/services/issuable_create_service_slash_commands_shared_examples.rb
@@ -3,7 +3,7 @@
 
 shared_examples 'new issuable record that supports quick actions' do
   let!(:project) { create(:project, :repository) }
-  let(:user) { create(:user).tap { |u| project.team << [u, :master] } }
+  let(:user) { create(:user).tap { |u| project.add_master(u) } }
   let(:assignee) { create(:user) }
   let!(:milestone) { create(:milestone, project: project) }
   let!(:labels) { create_list(:label, 3, project: project) }
@@ -12,7 +12,7 @@
   let(:issuable) { described_class.new(project, user, params).execute }
 
   before do
-    project.team << [assignee, :master]
+    project.add_master(assignee)
   end
 
   context 'with labels in command only' do
diff --git a/spec/support/updating_mentions_shared_examples.rb b/spec/support/updating_mentions_shared_examples.rb
index 565d3203e4f1..5e3f19ba19e3 100644
--- a/spec/support/updating_mentions_shared_examples.rb
+++ b/spec/support/updating_mentions_shared_examples.rb
@@ -3,7 +3,7 @@
   let(:service_class) { service_class }
 
   before do
-    project.team << [mentioned_user, :developer]
+    project.add_developer(mentioned_user)
   end
 
   def update_mentionable(opts)
diff --git a/spec/views/projects/imports/new.html.haml_spec.rb b/spec/views/projects/imports/new.html.haml_spec.rb
index 9b2930657972..ec435ec3b32b 100644
--- a/spec/views/projects/imports/new.html.haml_spec.rb
+++ b/spec/views/projects/imports/new.html.haml_spec.rb
@@ -8,7 +8,7 @@
 
     before do
       sign_in(user)
-      project.team << [user, :master]
+      project.add_master(user)
     end
 
     it "escapes HTML in import errors" do
diff --git a/spec/views/shared/notes/_form.html.haml_spec.rb b/spec/views/shared/notes/_form.html.haml_spec.rb
index cae6bee2776d..50980718e660 100644
--- a/spec/views/shared/notes/_form.html.haml_spec.rb
+++ b/spec/views/shared/notes/_form.html.haml_spec.rb
@@ -7,7 +7,7 @@
   let(:project) { create(:project, :repository) }
 
   before do
-    project.team << [user, :master]
+    project.add_master(user)
     assign(:project, project)
     assign(:note, note)
 
diff --git a/spec/workers/merge_worker_spec.rb b/spec/workers/merge_worker_spec.rb
index 303193bab9bc..c861a56497e0 100644
--- a/spec/workers/merge_worker_spec.rb
+++ b/spec/workers/merge_worker_spec.rb
@@ -8,7 +8,7 @@
     let!(:author) { merge_request.author }
 
     before do
-      source_project.team << [author, :master]
+      source_project.add_master(author)
       source_project.repository.expire_branches_cache
     end
 
-- 
GitLab