diff --git a/app/models/project.rb b/app/models/project.rb
index 3f8ee0eb23e972e9c81278b260c46458d561c0df..d6152280ba5967664fd95cb585dfedef3f4820ee 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 9b407670dd8222d153423432df6faa5ff6a2931d..2fef32b7dc3ead924e4d369175889b29588b5199 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 0000000000000000000000000000000000000000..8773ac73a75eb9622f475c91cf73d09b657ccc10
--- /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 86e0a38aae17b65e7136133dd39984dff297f006..8afb0dde0771cc3ab53c5b47d77e48afc925fe12 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 3cec7a4d364f304f03463ea686f991f1f4f50575..507f9884b374be6816d77ab3c3558b132137f25e 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 4b88cb5e27f367df88df9f365bb979bf09e899ce..d3b88ae8d2a3a6c44791209c4706b40776217222 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 b4403becb0ddfd98eae393797d4d1e9401ac73cd..9db31522c5c15a5272c436b8f634a3980dc79a86 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 174d9f301b0da1621710a0619b691619a2e4aa75..810371bb445474a196d72a05b88a3897e902d33b 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 8138c9162351c4d207ec0dddeb9ee2feb71f2d58..b8657fd99c3f0f2b046d5881187654fb9e11c977 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 60707f26aee76839997d53ded971058205fc69c7..0350e1c2aef91ae7fce6bac6a8caf2c6094e93fc 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 6781a906a942c8af4fcde4431a2e5015f8aead28..fd51ee1a316a9a97d03e499292df71f53ee772f5 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 6e04f09f322488b00515388a11a48d26cf28abc2..eeb5e1f888e77932e2a370e4e7168cf861b3c7f5 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 f6445b57ec058d4bf0da00351cff276ec6958130..fc4ef26f6b68e7426c1e934e0eee523ff8099f45 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 a6ce06aadac91149b394a0e70548ab19de91af4f..6e6c8f1460eece5fe3b85003a7999882a53e6ead 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 e361270f8c864fc4470d115065b4fa1e99a57b7e..1f00ee5e13c7cea9f06b271a42b926ca64e5ca87 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 f044a0689387a946e22b1f53db7f0541c760a438..f350641a643abe4a6f9e8f4bef4ef0653788d907 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 db5cefbe335c240a05d6bde9d8b9fa0216788265..3a449d25f56da487f87342063ff3c1ee0a89d0fa 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 a2b432af23a4032d08d0359e0d98260107996315..71d45a22d9163a1b0be14a8827f711c8f17ebda7 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 2f3d7be9abea0eb3fe6f2d5b9157ebd9ddb98336..60547db82b67980c9df73ecf02fee5e2cb4f6972 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 f9faa4fa59a256478d01e80369eefca68783f1b1..b4a731fd3a3236ce3ee181786808e6c88e5a8856 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 566d85151982a19d55df311ee0f6dc5d5bf84eee..97c2c3fb940d076558a5877fa1e9c21ce51b28fc 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 c1aba46be04cf031c758f3fd6695cf5cd352c72e..733386500cafb21c7b261131a2592fc7e863d6eb 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 9014b8b508441866dbe73a209d64ac0785890332..e133950e68444f80c91265a36781f79e83799b6a 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 f5ea097af8b5a22fb67690d93a4150c3da0ce4f2..3bbe168f6d5da21a1e18406cf59c9bcbbcbf1a06 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 54282aa40017fbd01b5fa69315ac7cca18f925a2..88d4f4e9cd00df1d5c203b6ebfb1a89faf6d52bc 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 6a1c07b4a0b6e7814dd311bd7f5bc50c5210870e..00a7df6ccc8e62778d989068639b9ff88969c2b2 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 be81b50d61dfb0cb9171d682608c0bd00298e4a9..af2266a8f2e92eddef88fa4e7255cebeeecc7d00 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 b22ec247cfd6ef30144189f29c0524a19514e268..a5139cc9b9016ac4a5ea9a6e43bd2fca4c3f654d 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 c459d7325073abbee6b60ad2c634774ff8648433..73fb90d73ec45d227216380117e816701a418ddd 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 fe5818da0bc7abb0107e1a8dfe0739a4c445a07c..046ce027965212d07d59f325e315fdf23f34720c 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 6fae52edbadf018105204262a80ec9f9572d2991..7c708a418a7d78d98df37c2b0d9b37f436e4a720 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 c3208357694aea53e2f0745a969b8520d31ada87..97db69427e9b4bd90cb6ca2d529fbb30c0c8e339 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 3164fd5c143c7b6e06ebc795347ce52c7ba522c7..73e7921fab78c54d043c8448a317ae862cdee16c 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 3bf676637a2bcc4c9bc72ccc59bae46d3e1041dd..00328d3ea514c6278935bc165eb6de6dc613aeb7 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 6a5433bcc9c75360818ff905ee703cb0731a427c..505fe82851a23edd374f4a1cb88b9204f04a974b 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 1bedb8ebdfff7ac6f5a55eece2ee2f104166a897..c4b32dc3a09d1d3973a406f223410607ea70ba03 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 5af03ae118c0bb7ce4700edd004bd3f5f8197025..c3605555fe7895c38effa32c9af76e0079267632 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 f8c792cd0f09732f3d5d6d5eff4e20bd06e8ad6e..5bfc3d3140138fcd159f932985884c5fff259d19 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 07174660f4608ea07c1b7f5516580e45e103e89a..aba70c6d4c1ca210b70f3a34d24e855fb8c4706f 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 cf904669f9fabcc15d8b740a31dae6b72946b912..5c5d3dfab0b6f220eeca40b41ffcc9c971442de9 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 2c6ec036b62dc88ab098dbd02ec84f1c7ac7ba64..d909b812f73c745ca6b1fe9bf5931621a6e6b47a 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 7490f8fefce0a95ec16cb9e1cbde6f2ddb6d78bf..e6a4e7c8257e40ae5e34f976c31ff1c11a6d09ac 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 cf83f2f3265541895ca3e890301c574dd54b64aa..452d7e239838f87f85ede2695bf2f760a954738b 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 33d48ff94d1370bcf612bc57c13c9fb269d5d90b..c5ac0be27bb900574bad46e6fa37f033d058d8a0 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 7fdddc02fd3a52f852243f7c3341579e4488a394..7e2366847f4756dd3c4c03b3f2d4ebfa207f1416 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 ba97ccfbbd4700af012f9ee7d33f34d6880a3033..5d297c654bf69f1d4d1b5c4226dd6840575a1a92 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 209979e642d73d3644d1a4b4e0eb24356627435f..00cf464ec5bcf25890efe0036e74bd375e93921a 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 37e9f863fc4ee0561e387a3cab3a82115cc48be1..de132dfaa218337134bc7ed4d0f151f54328a23b 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 0513937ba4a34562eac4b78eea92fb252cd5b33c..cc32c9fbc4ca08bb305fde1809c31ca78b4763a9 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 748ae040928f319803030b9905194720fe5123af..ceaffd9262321f6f735d20a6e6289778dd241937 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 358f26dfb02b212b0c216ac33a77a021fc7b893f..fc1619acec6aabae5b79aeb448246607bc94c2ae 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 8b777eb68ca096914c556a0bbf467f56a0bfac6f..04d16e9891380c18e1e5f484a540f64b9458e0af 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 a907da2b60fa8ec23fa42ccda08cc0927991bf3d..2c6ad00515e61247a45692fc6a020441d29855a1 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 b8fe0f46f574edd31a35214ed82fc5aea468891c..77a47f0ad1302cfe07c72e846b93bf95ba377584 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 9e69596ce1d25bb9977bbdcc5f99608e59702ad8..8eb4067171a01429064a0b42d4dcdf240d19a43b 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 4e985d9b6e67976729c33496a1b7dfdf87758b69..3ce544f84a60ad5a1e950a4f9dc3f2165dafafb0 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 70e7f9ca96e88f5848106d2fe5f09d719db88d9f..8fcfa3c9ecd3c626ae9e16b7b111542747e8b9b3 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 4622e27e60f3d28ef2d9e0141ca9fea98bcd606d..e2524be77246ab663fd60f6cc85ddca4cb08ef6e 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 65b821c948635b6745b0bc770d41c7729ee84fd8..d3188f054cf7fbd5eec73bb9de482ee69fdc44f7 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 d065cd00d007b256799e863fea6c1e659b188596..9fde65442153b59b2e755616f74523f51807fcfc 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 7187c685310c53d84775765d6a11fd626a73e3b5..b67f1d10a2366a9a051b37168533e51918beb08b 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 7e42e43345c741a9e0caa3baa091ced067dbf96d..b1f601a19e593df0126450d4e35b2fb4a98284e0 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 01ab59aa36371cec8f8f023af99973275b166982..2898c4b119ec96d8c360b88190994a17be5634cf 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 f86f2de9659f2c1357e07b8c2ab42a449e39bf43..6ac28ac1c97a6fc5e446f905654ab9f2bd353dcc 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 28dd0e95a242bb21d5dae62841d7a55d76bccaad..bd493d782f9647a219688bc8ff1947c8a707e551 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 fcb2152ae258455b9bcfc24a754f09c5c5868d80..15dd690b3202623b83af0f0eed3c867bf128b8f9 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 53906321e7c128a3699f35ac71c89b84869e108e..9fe14b5659fab4de1fdbef49e16173ac1930f307 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 dbc6cd3472a57033c8d8e253c29af76a08538fe4..b9d76ca35ce33cb3c5c53c1186a44546c215fbec 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 482c856b0384e0856fa9ab6cc4ad126332eff4a7..e4926afa73354dfdc0880e354c2a7518d5f5b8db 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 3a3df19a1c2cba74020b91dcd866a0d47c68ed39..b546c6dbb2206d2c5f08efe2a57ec77a3a567ce2 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 b77b47eaa6bc49013d176352788921145db6e170..3893787871ae4d0c9376a05aa919e8102f23ec4c 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 7f085e73ac578b7e31b79bb9e5d250f94733ba5a..7cdbddf372a54a346b17fb654dbb5baf2aba4259 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 bf862b06c6c297b223725ef87b35c6f40352ad42..55f723f6ab0a572c452728444ef34a0f14c051b9 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 36ab9497efa14719d9b31894a74689ad5bf93671..248f5c125094b16fe55197c5434e864a037c1f83 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 8337c566120bf466b1a12e1c876f96337f9d921a..75e08e65119c86811fda9d4744abbb177606c3bf 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 78a6bdd2f58975b64adf2c0dbbe55301b3953718..a8655a8beb34996c35b80efaf7730923f5cf7b25 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 546ad33ad994a276e234e9bd2747f6a204391ee2..3d629ad03445254893504d24a5a61750b6ea72b8 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 d7913a7b8125ebfa834a2bb0a0d29e603573bc0b..a6f2b6b057166cd7f58eb241624228f0937444ae 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 a78093deda83570f9ab1045cad708e089d67c3d3..d19b40a37e432f3e53aea992995bf6fffa163895 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 88a932aba3b78919d8f7f8fdc04f658be794281e..63ff8a9c71a9bcbe94cc945e65844802900ed02c 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 94b12105088c805bfb64b61890253f143cbb4647..d02ac6c2e2a6870eba94496e4bc625cd0b9f2f56 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 89c9d377003436a904a2414a5c9de6da27046249..d673bac499510926a27554fa6cf1f12f0a405ac1 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 2c0c331b6db771f35bd7ffe64a0fa3727aeff8f3..c6683bb3bc9b8225a0431ccc2935602105701069 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 4102ac0588a9e4590702532d203ada615c2f6828..525ce23aa56a00ee2a42014fbe6ebd452e66c528 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 2b934d816741cd072fd61a6108a881c4a266fc54..782f42aab04df0bef2271d8737f071b33517c994 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 7a395f6251121f63dc73ccda3771db4fa15726d6..9aef68b7156a5651e60ca12fd9e5f95b8bc09502 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 ad46afddd493552dd5e82a613fb5932dfcbdd5be..82fcbeda31bf720c7da71b6448f38b01f70c8672 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 9e4d6452bc45f0f746c35ae1cee310dca1b3b2c3..d40bd6ffc968b228bd3c18365cb87f4e79e9b409 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 4cbb48e2e6ec97168a6be6e2b8d9d20ae41b7739..5abd02dbb48703c1c4d8841aff6edc84ebd03615 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 422d96175f71f808143323459ee3199402ffe5aa..5907bb0840f733510fdcc2f3e4fa8d07d218a917 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 6a36ef0734ee4ad91b99b3ba9406662e91409009..210d790ff422de95241fe2a8173ba2c6897f24f0 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 5ac4d87e90bb0504f51297203aa2ef7729e647e9..6769acb7c9c3730efbf96c501b71fcefa2286ba3 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 77dcdf89f377e0dbbe17d522d04ba260b31e39fd..a28b8905b65b121f854fe68026f63de95bca62f3 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 177cd50dd72a4a0114ba11ee27dde6b0ccaad348..d36954954b6d93fdb0977d6245361ba9c13579c9 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 e8d699ff5e0fbbc669f3b03bbeb0395313a49e36..b36231fd78b011c108f83f5f3a49d134af83e15c 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 349f9a471125c9e303e6e3520c836496c95f2b8d..089c388636d7edd61eeb752306b72216d512ffd9 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 5b4c00b3c7ea31bbf913a3fe9f95633420790ec2..54652e2d84954f4ec9c1bb98210dfae5d04737f3 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 41d37376cfbeb02e176b166c968d9df3d9fbe314..7787772a958250f27951e713f7f8958990c72ccd 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 8f96899fb4f001abcea9bc8083dd9a6739ec179f..6c3093607b0bde979b1d25c70fdc44fbfa8c7c01 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 fbf8b5c0db6fa4f65d04583abc21e14042c098e5..586c7b48d0b18470a123ede982636e6346ec1ea6 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 ad0f132da8cf6a6ffcd85ddc30988795440e08f5..2fc34301d5186eddfc409a99367071bab9f47c05 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 b7d39a872b02d5c8de722020827702d91f87616b..10e3ad843fd597921fae0e97e463a4e762c466b9 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 c352b6ded14112f215df1279ec2c03d221a9e58c..92f4d4b854c527d560d3481b5f9820e8a413534c 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 8504191ef6f1bf070c8a6e8c86dafb9e2e6e11eb..ee69a1649cff8d6a1e8cb565dda66f9840361635 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 a143c34288bfb5c81f5038d4ef9f74ef2ccbb5b9..090e5da978a2dd2e1f9613893c9193b25d64ed7f 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 f04e13adba7b98b0a7a7f00ea283cd744ff4c83b..4f5756138485d8567d621a0eb78f70b49154a45d 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 850b35c4467ff7fb80c6a450fba50048a7e87fdb..1131e1711bf26ebaa2f0695ec94914d58653eea7 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 fa4d3a55c622299093f372bd80920c1fee59aff4..587ece22ec748ad67fe5e99775876b29f3d3d0a7 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 822ba48e005accf7bc1c6d991668cd0549bcb9cb..e0466aaf42268664938e62c6b16f43f1d13d6539 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 f0bed85595c442bf937a48961da3beacacb57b96..34beb282bad9bd21e792211d4f4767b491c5910f 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 2e4a25ee15d7b40c60d0b6a6284faa7d6af18d61..cbd0949c192a70fa1dbae218401ecbe4c07b42f2 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 2fb5e7cdba4a1df54bc94ab20b2c013a1dae2a3d..70b4f11410da2b3f7f2067d653f8c5ca52e49d6c 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 8db435634fd474787e93441de9fd8faa4aa3a47b..436625a6f7bc3fa1b94bbfb464d6798ef055e4fb 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 0183495a1dbe0df6accb89f4c7e3e89f98e3adf8..18ae45aa3404254fac92f5bdfe3045df11606e72 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 031eb06723a13e39c8ccce862deda0ab3ca3feb1..94710c2f71fd60858f9b0f9cb884875976a78ac6 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 eaf05c701d11a39692424b41e85981c02ff97e3c..cc15db2e340ecacdbb286b5b1652d68894a5258a 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 dfedac931fec56d4a544023a860a5f4840e0bd62..0aafc104f094ad258102f6679c283a9aa1e0f5f6 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 bb1350a2adbd3c527e97550c3a72c4dfd3da710f..d40b2129877ad572c8d532ed12a8631e30b4dff3 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 0afd5226f1b08cc90e13bc1442c4be4770778392..107ffa3d0e3c12496c7e25b00d645588ed9d8fc6 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 6a9a80235c113f4ddae126c62ed6e9fd35045123..f2624f55c86a6ffb41fe25a6fe074573dcca4423 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 0660b77396728326bfd80e991897f77267c02e6e..da04e37a68ed3f5e7b9b2c3f8ad6bd30bc0e819b 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 17035b5501c8ed58479ba811c9dc86d3ff901d89..076a02150a403b823505aeff895fa94393b6b25b 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 05c93a19253f3fe4271307537c043e0914a7a05d..f08c73f947cb0f9814f3ed556f802e92204f649c 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 d25231d624c5f66f878858c712241661caefa58c..53706ef84bcaf61e4d2e647b09740dc6cc59f94e 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 29a2d38ae182f21a92851b83148fbd7f2f6c77cc..8e6493bbd930bedb375e0ca4857111e2af59821a 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 bcc6e9bab0f67ee30ea14bfd6897c1a7adc53c28..7d6edc171f8ede209e967f2d92b6ba962c5e1ea7 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 b0babf005866e83fab9c60d0854a93312de04688..0365ed90e17a35cf2b815ef50c4dd363b9b76218 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 2d84b5ff53792bf7f3ef85296a5ab45690bf91dd..7b744555c338c6b7afa6fa02eb3b7246f8088249 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 d49d145f254617237103da2a5ce5828ca9c4b581..b2d64a62b4fbc4663e46675fc695a465153a25c9 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 fbbfe7942be08d4903aa88fdc8427ff86f4b07e9..892c32c88062644fb0a84a17e266343cb3135a67 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 48f370c3ad4feef5d0d60cef18a08370e2de3edc..205e38337d103f40de380162ac8966eca7df50e3 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 73d4c43e66f6f53c9566cdd6f217259ac8bde698..910a1ae06e21fb22498dfc893484d66101504623 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 4e2963c116d8d51f12287f744be7d750277ff462..05d99a2dff2618cb89195079a8f5ed2af13381ac 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 50518dfa6558ea65765e9f08cde83fe8bce3f86b..86e25d624a2614209973b44cfe55ce48c7994684 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 ca2225318cd0fc4344418b5c51790acf66ed3637..53b62caf7436a055558c443fdf17b43567525e3e 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 7883cef45be71f94a874f7143d82166e4d985370..6d0526bca852ae8e32b70a4ee2d2461eb8c5aef0 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 9e816cf041b0e546544dd575602c2f6527a4a9d8..ef8f314cc0304ca576dfe89787516e83eee619b9 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 15d380b1bf4fc7bd81d4c9cff2b4ca3b383bc23e..9d4194d8ca041883d8ee9e5d0fb857a0bd7a3373 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 6fd47b9bc0defaa0deb16f5b1a2b2a3f7e1e24a7..6d72e8b81ef9eda325aa63afc658777cff2148f2 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 8b9ff9be94310fdb97a0277c09fd0ce7a87ae0b3..8db94352f738bfa2e2eb26029c142d314eed5819 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 1dcc1e139a010db36d82d31cff9766371ca61f11..1ebf762a00617c22f78adc1413f15a4d20b6c7fb 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 b53570835cb4b17439e9592a8d8eeef535722c6c..d0f8da4e6cda0e5a1ea217f35fbdcfc50616a65a 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 82b2b56ef8016663b625f95061f2c9cbbe77a194..ddd034e13762ed2bc6d8befd44bb166782fdc556 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 0b5a595acce0dbf1a9ecfe172fd8f6beb3635533..e1317b33ad1fc9c8d7fc3432b4bf4845355f8696 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 885d97b65aa387eafd67479bb3a70cdcc18ca85a..bfd31f2465533b9a70c410d9db1a0d50fedf9c4c 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 91f207bd339dba018bab811cb7143e2dc5f0dc0d..7d9282b932b6adf3a051fd845c08c9ca78716da1 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 307c860eac4d6a1bea90dc9135d4305fd4dabf51..04e3f4bdcf1996f9567e5f91039969606cda7f9b 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 eed95816bdfeb7699fc9ed816e108cf8034c16e1..daca4422bf198944d439b92226f495fe3d93c4b5 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 6572c8d976ea4b917ac92c9395957d4d79a613ba..c7cabbef980045eb5cbfa2708d98a2253b18b1cf 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 bce36e05e574a122125782a9bca5f93f6a19612e..d9f7a056deaa7484b937daecd06236999ae76e04 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 c5498563b3952512e21af2c228ae22286bd865b5..a96404b86edbc149852c39db8fd6f8eaeb68a959 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 fab65f6738e0e5aa747665f960ff23b1b9c39882..00dfdb038762a8c670cf2177546130852c96ef8b 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 72a52c979b3c1b44c6b9eb9a43dbbf53432af52a..ec2da72ddffa23dede523193f3625124db475d92 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 3ee094c216e7a3e56a558a2a29c1fd6b466c8144..8970586a160d0277320bf8425f54b17c3d333b10 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 b422c76249d16065451e005e9db846e08713ba18..2617e735c259bc0c7c0a7ea17ae27ca5d96aa348 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 9f24193a2ac31a8fe65ca2a411a05042db30a891..b02d2d4261cda941bc2d9a99c68fe0930b4a66f3 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 df89918f17ae998478cb4df25f8de2243a4bf48b..1952fdae798d09bfd9f978046abec756096b3dd4 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 84c2faa2015504a381ae023ee41d5e69a5d83d8f..2693e5392681ed4544393eb1712eb4e515b1e30c 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 683756f3022e3ec1565d698dffb9a0d3759570fe..07ca4cec8a86696ad72818ee504932cdd00e07ae 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 c68e10a2563ee7479146b87122b8e8ba87410b40..821ce88a402adc20b75bcc581e3d8344e9caeaf7 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 68c4a6479584cb29fa0b501aa1bd8bc735dab131..c705e4796900f3879c2e4cb7b3f8117664654400 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 965028a6f90e1ef7ba17adec4439380190c76c5d..69e4c9f04a18e8e753a38e29b184137aa4c20529 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 2f407b13c2f2e2ab0ffef2ad80a92265d569ace9..39bcea013e786ade893cfd039cde67b70fb4270a 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 aa3b27db227907c5b5119ea3b56191b13ab73d27..7362ef8c6d265c5baafc1b9ce9465cf5175fb85d 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 79e84a4f0a6a48ca44e1ec4fd2fc8d2b4c28b31f..36a746ac83d8bd9683f26e7cd6b319f96cc398c7 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 c11a95732b2ff61bd6b15ddf8e28a54c10b6cc91..c4c399e30583cc54c56927f4763f3691a120c6a3 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 db958346f06612669e09eb0cf16e07726fb045f2..0d9c7355ddda36211917e931c0895def969bebf6 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 87ffc2a0b901e75c64c1bb7bbc4648701383aef2..1fb22fd0e4ca01e1a3e2616ef9a583b5c6f25206 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 e445758cb5e0353d02eeedd0a0d7bb14d90ee138..886c56e71639b59d6b85e8b2e111cf893378a9f7 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 eb0de6ae848d67057e2b9f58931e9dc4512a648d..3501bf96cb60ed064ea3cb725e01031e01e12bd7 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 7a3727575235753c2197e377e648f4bffbd2ed8c..1d4b4d0fdca6206efb7a6258b6b7979fc8ec990e 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 dfcf97ad495211d9ab8fed0e6e44f08617833ea2..64e600144e0c43de5323f718ae4af22a8366f3da 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 4a05313c14ac4ba5555c9450919bbff2189df3b6..5248a783db45472cc9e927999dd675d2ac03e34a 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 033c45a60bfff503dcadf02e23a5c719a76b2819..b0eb7c5b42acad9385d858fbfbc792a8c0ba6f8c 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 84197e45dcbd4225f80c133454dcfd21aef298a6..2c38c380d9d53b264c885f7416f034e04cc87b1e 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 e1852a6e544ffcd894cfc39ce15ecc3d45fbb88e..8d982636525427d21710d83074b42db7808dba94 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 3c3a5326538effc0232db371243ff05d2df0501d..f4a39e331fd97423ecf9f8069641c535f09875ce 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 d2382d55c0b7cbd85a89a3e9fda7cb148595ae10..2101627f324b7e0d21fb561e1c4e11e58057f3af 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 3ab43b3c6565e2c9f0966c881c7fb522e14b33b0..8d32ada57953ad49588db48f3a912865777aefd4 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 20be968e89fa8904c829d330ef812fed397c4ad3..d874cdbff8dc892d9d792724bf3e855d371021d6 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 702b99de7339d39bef67ebf2a3e34a306ff0a584..ead9f7e91685da6ba6b492a81b6780ad9374c1df 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 618725ee7815b93c50e1ebf21a74670d56569723..e9ff06c72d8b88b95a5529b5b5caf77ceaa3b758 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 81d68c3d67c318eba60c043c1a07a8ba5ffdf22b..79f3fd09b481fdfd2eb0fff71c90f97335b8f7e5 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 8e58fa7bd56f037535189938de9bd599799d6b45..db6c67b802e6122599ff9290f61789d23687d6a3 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 6c5b1086ec15519f13c470e5ca5b220190e3fb04..07599600876a32c5f3280a9bca6995d7b509129b 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 6c616bf045603db15cfadf8c9d63a565461a3876..121285c84b04b63064374b57260e9353a36d149b 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 f95a60e5194a6a26d3cb3573e0fcae3049450df3..97408a9c41ec48aa04dc307f4b3203c07ad3c106 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 64fe350f3dcebb191d066284161821724b736227..fbf35fb4e1c3a20f2a99ca098457b5f6e13e5062 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 98c7ef57a5136bed6946163fce5bc612f495cd68..199682b943c256ee8ddcd8efaeabcaf4de0f730e 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 4319fc2746c5f0b12a7a97f5b22cbf41a430185f..e26caf1f4565a0592a52eda49bc365819a8213f5 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 58eeef8c258e3588ec5296b1efc2e1e258b9cf56..ff91aabc311e8c8629667701c1ba66182cd9d954 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 b6c9923f28497df190c83e0a5466fe34220991da..9bc8329fbf0587c052ac9f65ea2129abcfc9e53f 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 e8c70dec854910aadac0c55a4d29b1d9b52daeab..70e8d436dcbc7fe07b1f16c2e969fb62fef98f61 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 d063f5c27b55660c6f056c2ccbe9c179d0b719e3..85bd776932b14a089470c75a1da4ec6d5da6e0c2 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 3f2579bb01a27df5d442d37a46cb60d63f0f5d00..81f08e44cf3f8b3d076067201be5d61adeaab43b 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 7914180b951c320d4a6555323ab28020b6d83665..3c98c11b4903cee06e36333219ac562def8238ef 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 bf0990d675db43c329d3490205edd4ebd51ac105..e2a48bfd1d4e9d6f1cb1a9f070c7da4d50ac0387 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 c140fece41d218499eab59d25a51694964fd36ac..e22b6fa6c43e426d57f7ec59c60a1224097d8075 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 7f067aadec685743427153b1d379e120b53bf60a..e6d0c6e00f83e5ef7b994e4f783a30630bfa6f2d 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 0f88f4cb1e8065978b57e8894a8b6ba7b2ed110e..8fe340d3bae1a86f6daf2bff5c25547c0b980498 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 eb3c803487373d3cc04aa13b7d6a313740c776ed..d575596937d287e4f76fa2867ff27b34ba6ed887 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 04806f8fd9e48ac7b81269da9b69c1a17170126f..47911c32a723ce0c2323fd84d440daf630b11a5e 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 51371390ff636d7e7c96481d0c3d2ef7793d0fec..de4dd0b2505b08df8d5fa8db17292d0d2e6babde 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 cade1b75bbfa3c59b3fa866f27a23d5a7cf0d6f8..4cf686ea3212a2055d8689251d5bca1630f683bb 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 a879efef4b50db4fa9d9d7b76ec651d8962e4a60..b34b13db381444a4ca264279adb3682dd7b44987 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 013ed6f2e58950e73b6dd424c570ff84ea9b7835..2e334caa98fceb64f181daebc5141d9cbdb08f06 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 e1dcbe072d00dc629102a33b7a3dfaa55f0f583b..a61264b5816c964dace3d14696dc178953985266 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 888e290292bb55c0cb764b349513e985345407ec..43d47a945f8d507d95802883f1fb9608f37c4196 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 b87b47d0e1a2bc0eed6bc7f290ff78a89c07515a..df261c246f7c2d4ce829bf7b9bcdb2f63e860aab 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 bb90c84969285891acf1cc6d850b1fbc15c34103..95a7b47d5c91e48b34825405e845828f6c02e653 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 ff4713565d1fab6a28edfcf17c6f05e72b959b4a..81a6b613cc89430dad4d37e914ce11d5d90a0a38 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 ac78b1dfb1cd34ecc7cb437425740e640e2a6e68..028669eeaf2ebc15ff7a3f73b88a62dca328a380 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 6f05713786779911510e078954ec9ae39f5cc894..b2906e315f70c3ee9b4c8574796e46f44f25b382 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 a8baf126269797474ef6b1535227441cf50a49d4..4a88654210ce5a392dc11db69010befe992b55d9 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 cbdb7973ac86e83f3920886536ed165717bb487d..f6a1a46df11e6f94ce36d5f7270c2dabfa0a44f5 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 717ea478fc625ea96b03b1e29619e973e72d3538..e94d38c593af824416c6242c5d5d0e8a2bf663f4 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 ac76c30cc7c76c84e96eb30218f47c5e9469d56e..015db603d33834cad8bd01bf09763c288bb9c8a7 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 561f08cba00d7cd0d5bded57ca9445e90d0171af..d07208555647b2708e8bd446f970be75d90dea2a 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 e2a5619c22b41e83a99ca26ea6ecbf59cb54898e..81b282502fcdd80c280d7717f26ceab0c081a3d6 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 e6c28334c3add7b77051c2257dab86e825d4380c..a3905f3728f2f81463ef89bc915a1cf0a0268be8 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 1c3b84d0114020ec8a4c61441bc153b9e00d055c..06f6702670bb77c4645ee058f867b2e464edc889 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 e4215291f994a878917f5dd633dac2280fc50980..3466a3dfb778cb7381a22c965073cb19b187d06c 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 08dc7cf6c5bbd2aa3c831b4d4a5be911f9969c1a..216f2af7c886d832ea2757cc846185df51c7299d 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 d38a5b1324bace52f513a4404cfe563f66781f86..b62498194c4ae49e3a280a62f397c4111c5f54d4 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 4f2e0a76a651b90b4faed6727dcdf92d0795fb04..6407370ac0dc1b219fdd5a20702443353679cd20 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 f5e4d7f5130ca8c322f5c3cf75520c18ce44735c..62e6419cc423b46e9a90aa4c2ca9ce0c1e0c8350 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 052cb3188c573b187bb157794013691c4c744dd7..00e48f6fabd22bc25e7f104f4f88a924acfa3d5a 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 d84b91ddc32e7d7342614ce90148848aa62ffebc..7a935dd2477aba819202a723eb7a933c008bfc21 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 9e4e92ec07604d1546d06fc1b97ab6d8ffd7cf70..9d55197e719b99c4fc3d6e2f2d2045761d8f1034 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 d26ee653415028e097bbe8f73096a86e9e382825..5c5c6a398f6b0d54c75d686bf164e9a6c690a76a 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 245b6aa285b74c2075248acdaf82f69e2674a059..74872403b35fae729ea0027c76ab385c85721362 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 ae51901adc6fc55f6470fd46eefe230ec55dc097..75898afcda946f55e6c685eac68d46f92212adce 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 337baaf4dcd1bd9f7b32aa3be1881c3bd863463a..006c15d60c53c047e64042f673dc900c5cbfa6a7 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 ebb3bd044c118d4cdfc65944eec77f21977295de..2682b62fa047f758c43d2b51de397b647fd6817a 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 63e6051b5710bca342bfeee40e981e3b2efbea97..b66a7dea598b839870c478ee0b9c09c057eb00ad 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 a54ea216a1b02134a8c8198399cdfc94a31c1e31..0bc38a9f839a0c09c574e0b664ab37a76f4cc71d 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 8efa5b58141de69073f4411f8b3fe39b89580a01..6088b831c14c778f98c3cbdc6f1fbae615c8746b 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 1f8bd8d681ef5dea7db67dbfe8ddbc86dcfb941f..8a8f6933fa5fbcc33bd827517ebcbe74a0f83191 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 dfda664d673ee8b7d0fdfbb166eca3a0b942c081..c0b4fa52526e90625b1a0fca7df9cc40f4eae835 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 b93ad44dfd3349bd8f8ff0c244be2ce24ea92071..1c370a99b13f0671bdebb44016e802018f3ab90d 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 9edc7ced163bbb9768cb3c12b039d456f239bc8c..e54b9852b05e5f7fd146c3158d3b7f12c97f2c15 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 bc472e749971a1e0eacc50eab2e564c7af736318..197841201082cc0eb7c86da798487d85673e9c83 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 dde60c835364d78ceed4d0ee085b44a0f6bcd40d..79ca2b4bb4a26de32802f6b000dfaece11f966b9 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 0789d3a9b449b6cd7d6fe27f67436b826ce0292f..650f7229647647a4cf2963bbc6bb25cda6f52b78 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 d3596d6c97be3a69a34988533c583293bd69e71e..0c2da469777ddaf3cd864ed4feb601bb6a8075c9 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 7d7f8bf48868bc1ff4d65de68ecc0501e2be3c49..5868e858829fff3947d77017222028c33db19ac1 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 afa2a40ed2acd35e67aeb300e28f15b1da2b5f23..d507af3fd3dfe549939a24787343047f892b62b6 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 67867f125687e292041de10e9eeae35c4869632a..f97dbe55ca768b8c6ed757d43e6a4c9700e61572 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 e577083a2d097141788cfbc26347be4cd27993a9..74639d4147f8e2b0bf63a12fdf5bc8224eddf210 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 900fa2b12d1d6503bceff51f03191db91529f700..7b43494eea2fff9d631f81f64648664f7f731649 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 d0113ba87df6b689e3df7183886cd129f03e9bb7..5e52898e9c01726f31ca0805bc8c048126cd3613 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 4607af8d11fe2d94e3d8deebc0b89793b31805bc..1ee519d77387de44cbeb1dd3506cebcebdc6b83f 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 884ce22091e219fb227cd44c67e1fad074b38295..90eb0fe21e4f3c8103c91c75ee02b819d8cd922a 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 ba0039f3a11baa1de988034bbfd76d098e8c9fbe..c0dc9293397dbf4345693cf5590a800b42b9cd5a 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 cd15e27b4976e4664d22c27a604987ebf8236380..b40f96e3473da92c5d9f30442529371a12d34094 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 68643effb66bda5032fe119c2c0ea4b1c39e82a5..5a7858e77f3755c27f32f4e82809532fcd90efca 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 fc03741976ed86e31b80b82b2b823b4302d39cfb..c76adc262fca755111890fb1075dec23222bc26e 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 e49726aca6ceca20c3d3efba4f4f45420a6d9639..b079a3be0298a2fa8b467993fa0a36faa45bded3 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 03d1f46b517b58113c57110dee157cc4efd567d5..2cce7a23ea7f7b4b0c32879ad740a68930951288 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 b38fbee248693d12610171aabda8094932886ad6..40871f86568311cde375eca6444061367a4cdde4 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 c96fd53e730cbdf729a5362197c8a4052bfdb452..529d02a3e396e409447ecd516883af5bc3bfa0db 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 4a5b45e7cae3286112f5e23a67688f560cebe4d6..57df8325635e752b9462cfec91e9ac378e93824a 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 dd754b849b22456a1c152434f80d2ddaf0daf1be..defb3fdc0df2024ab87322d3c402b2c939b32471 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 f5f03ac0395604a77b25ed34578ec64db90659b7..6ec35f8da7ed2b8e8b4789ddcc28b6f0c99b2347 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 432b07e4902b086712006669825e0ea31be3a6c9..dee4f4efd1bc493dc833f2727d9865bcf39289aa 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 ef7d766a13d5127dab7e757aa042a971b0dccd2a..8c79ef54c6cd0857e487585d12fe46fb8d94f1aa 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 2a0dd7be439246d774e78c2ed67e9f6e0546df37..6de4bd3dc7cf0cc657ff4e0c0330503eb8195e72 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 0c34b1f66444999d0ff3ea835eda60201318c1b4..b241133870788d8a4a2242d53f98adeecce17820 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 3426f42025d1dfc98abc73cc88287ceb816e9a14..63b2f3f5bce05d1df8bdaa4f2914dc7c324b3b56 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 d0fa16ce4d17b3f407751f2a4c3213a582c2ce6b..031efcf1291459d2acf47214eafcb2a9d38180c2 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 7dc06c900783f47947517cadbb1fded50d4c6fc8..4d2f08f95fceb77f358435b01b82a305c5c9a8b3 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 03a9cc488cae2f36be0afed21f0325acf2dcacc2..d20a2ca935ff879d01816ae0bbf2acfe50a53439 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 5e09b32d1305d4862d42e8e500365b3e33f253dd..d1ec6229a4a1726ddfb05bf8fab3f74883b58f96 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 1056074264a4b8768f42ae0156ff8302afebfec1..186b2d9279d45acd0cd2372957c80e2f7d451e0d 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 798ea0bac584f047bbe4b43bd42b5bbe84aa393c..017facd0f5e906fcda01b7de0c7206170e7a7423 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 cccf764e049183ea4a3256d5da34799e4f7296b5..ef7f2cfc27b21024603115fd6597d5a394ff8770 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 e6ad516deef383886b9ce109eacf83de89ed8df7..44f972fe530b180581175f28e599dd596568fd74 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 0e55993c8ef33e63a8b0067205b0fa8b9fa0c57b..1d1e7e7f89a227612e9d77e81802a3d99d0d2990 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 953cfbb8b881d66d9c4c148813f4ce3cea14f9a4..f3cd6961e9439424017dcfdcf54909f5dc7fc7eb 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 bde47133d0666cc1a89ec4d6331f709ff8bb7613..ccf839fbe0a9aff6af474681e36efafa6b90bae4 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 8a374beeb63427771efaa32c7ec6f14c15401abf..c75f08846553c686f15e1d442be5beba2317ea8d 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 e44a7c23452108b8cc993d2266dc681b14216e67..3b1518fcb3ff13181b9b28922dccbf1d32c1ac25 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 75ae58d05825ee0ab8ca809ece061eb1d1b37c29..3b077c58c50217014d6eb82483fcd62d08846545 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 51f59216413244ff45cf2b9300127dce69c26071..e41e5254dde618cd1eb35db1e2690f558525c563 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 08c380ca8f1074520dc34e1988a6d2dad3c71456..e5834d5a2ee777a05ea4ec29b22a7df6e7780ec9 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 cd97416bcc983e617a93c670eaec16f5327a09b1..7280acb6c82ff637ceb7c260d1751e4c2051cdbd 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 0497a01b760455866a528cf8a7d4225be878fb39..94f80f6ae74a178f1ac62b7ca55c14875ae35ee1 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 71aa51e185713182ca0943fefc682f30e72d0d72..38fb98d4f50092081db988b583b220835db2090d 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 dfccbbde6bdb2c844e53e8310487be6ae13eb72d..4cc37255b2284690dae38a0983a2125bc60cf58c 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 bd9c837402f8dcacacf5ce9dda424bed0725815f..d4b72205203ce7a6b24c1c48bf315533c031cb04 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 cd955a5eb6993eaf466f6cd1d7c6a1a8964468a0..4f02dc33cd89d3543b2a4fde13d6d6d85f486f53 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 296b6f41ee5e97fee95f6bfae823cacff110be9f..bc6939f16e5290eb0058b6bbfef3046fbe6a5882 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 c26c19e2c1b0acb6e1d3f3fcaedb096ff32d0798..5ce254afebce25abe1ffdd444b7bec9902ea9298 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 8b545aec7f56a08611ebec060e601677f8365694..c73ea6aa94c4610c3c8ce2db8a9be4a979833a74 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 673c609f5349aae83cadddaddf893b69249897ee..87bf731340f58e652eaedc3824ccc99ddb138a36 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 1616c2ea985de5cfb9e1b5f95ed5df1892e02be0..2a2ef5a304d8a454119c261532d14d7271592fd8 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 aa7a8342a4c7cf8a16151d0c0e3d770802519e63..e999192940cecf148a79f2715484003764974952 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 7f1909710d84bc850555085b9da09d61d7238731..673049d1cc43ebf50fd9cf8264587f793b4af916 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 431e3db9f0082c39fde6a75c0b5b1cbbe5878cc1..0e965f541d88a8a1d6c5473ba2bba99814ddd74d 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 34d98a3c9753ffa8aa459999c333af1444fcb027..580a98193af0704b5e129310317eb32dde4eec13 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 2beccc83d8d41068d3e7edb2783d5db2c9134912..56306a4db47fe189ca852c7cd9e805f81af44202 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 0a017c068adedf36dd822045dd054c0e9cf3e054..6aa0e7f49c3b5bf405ff9918a32586298915014b 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 fa3e80ba062ac915c372760bafa5ec09b45ce5c9..3e46fa363751bc05e7a821c1bdc12f18f1b6a76f 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 f82aee668c0a50400969e94aa59ce388af28a61b..b91eb2737417c3c593e993d23912913f1c13f4c5 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 cefbf60b28c0c56a352444458d758e9f962b23d3..3d0309270364608e94ce9d776c67c70d0147066f 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 006f95baf00a9379a6ad8b2f503209ac37dad3d5..691ef837cb1874f56d083516fc4c6ab3744e896e 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 be07ca2d9451b83215c8657fb8aeabf91a6b1fc7..75ae22079104b7d1ae8251b3a4c758bfae9ebb7f 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 cd6d276fff7bd6aac26e160524a9f09fb0817cbb..6aaa8bd173d7c792c75b6663fc0a013a9fc66125 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 314824b32da442e781d430e75c8d27dc6d61aa68..e07c522800a6707cb78185e655d8e04616e5ff2b 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 a59dfa96c1dd10941112b134dd7fce7722e152de..0bf9a5a1d31f7c61c4ec72e5e3f1ce3c8831204a 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 298a9d16425b345e42a821417d193f1ae994a437..41cf2ef72259c3d574b797b697d433590bc7e468 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 be40dbb2aa99fa969336adb22b273c72dd76ea30..14630748c90dabc9d1feea338df89180c6566f99 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 be4c24c727c872fd4a36b711300ce1dfefbaa64c..a4af9361ea6ed8514f70b4ed89afe5226436c492 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 e8f5f913b553a9d1f2f4b377ac240ed95cdc2496..fb1be93193a32c039f3a72c49f70d6c358b921dd 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 9177011f8860ae0df1116024600d91547ed06d34..f08247cb4241bd3fc931cc4c00d67a6acde0080c 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 35ca3635a9de5d31d91d3ae2a99cd5d5f2f245a9..24389f28b21fbc67b63101df659b414a75bc082b 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 eaf12f714219d7e7c69a71ecb1cbdaeb50724ef6..5adfb33677f5cd1cb0bfa702046dc176b898cb2b 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 3d8a9b9287ba340f9cd7b09dd3988c7349c68523..86bf395bfc5aec262fc5b35d2008329df22d395e 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 c7977e624ff4ae4af2c89ab82d31fe3bd5b2350e..6732c99e3294ff79d638fcacda088687cee59640 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 3665cfd724134ffad48d85fab178eb6c97dacaba..53d48a9100788872c7cbf503f3ee785e5330a502 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 5d8338a3fb7426ee12876d15acb17786f572d71e..d8fdfd6dee1ae2c5793ffc9b9aeb7a9c2d5a7d9b 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 2ac50f8f94628f9edefcfb35aad16631ff53f46e..58c4a114c3304f25774d271ea785c030cec3c802 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 7671bec933b3f44dd7b6cfffbb3048b7a071ade1..a0beb0471289421ed6dfd912236d04d39096c40c 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 3f634a7768eb5d733fe7bb8d3e5d41af0b7c73a0..94ee037e6928b2af71571e65e6df4add53ac31cd 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 ed309434dc602a332dbc7bc51e2107305b8261e0..511ccc6c8ac0bc272776e80b684a7c3cbe6c5a65 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 3498e5bc8d969529574b0aeac63bb9fbfdae1901..34cbf75f4c14e45dd4c9d54c2c995042533b3ac7 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 9f626f386b323d62f1ad8d3f469a5e855978821e..afd1a03ff4379355b39fb472facabae01a6a773c 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 bf4c8443b23fae0359dce30a26870cb9646b71e5..cb647aee70fdeda3bce0922560b47cf1f742ebb5 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 fe496ff3b6839ec04898bcc4d2a65b228334b7d2..481693950a62bdb5e903a3d5214c627ae6764942 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 3bfb4c5506f195538ff351208c8ffb2465680ea8..be8d9c191257eafab6ef1003ed456001be816784 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 e4dcc9252fa11f0705bbd20861885b065bd42ca1..0736329f9fdf852ed0429025a0da24e2c01283a9 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 f31344a6238aa463e2292f7b4ab70697e33a2c79..1fd082ecc38e8f384bc0816d5f65d36936df53d5 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 72e1574b55f5ce2881965ab7b0dde6c3e901a247..6fe8ab5a3f6808f8d94794fcd30e38520eeb4e33 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 761ff7eb4e3bc3fa8fac35030638267eb2ac226c..7e2e8105c8e49cf5717ae485b95d9a8e648377e3 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 326a4370bb0b485474ca0f9b1933f95fea8f9793..50080f8c29a1062b6cd6f42e600ae81bd7e9d598 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 7eb950f2f30edadac57ecd045ad393c58a631c67..f8129928b8e0c9b480118966adf5199f06e1750d 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 c6063a2e0899670ca8869d5ceefaeaf3019efc32..fb3a33cadffa5bb4f72d6ab34f8715463fc667f6 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 0cd8b70007f00770580342b44e99b455bdd11146..6dc430676b0c3e9623658460f70901f9cbcf77b9 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 14409d25544dbec086071e7dc035550f4ce32843..dde4f0961938150150570a4ac5f93e5a99ea344b 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 d31c94ddd2caeb1802f04406fce7cd4d7f26ad8f..8b115e01f47318285cfeff327c907ac1654d0cb6 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 90eabda4dac604caeff930e151bcec4d35977a92..ac86fbea4988dc21ba3ff0add0576c04ada480e4 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 937250b5219d037969b211f69adc00492519b547..68be5256b64a143a81491ee8e63fe5dc0d163655 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 5500c1cf770016230220b3089dbadeaa00f6baa4..26a3d8870a015883a6d0e88875ceab9e9489e508 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 842e9ce9eac7e97f49f33fba95f1557aba8e2a5f..9fef8e2c8c9216bbae2f2e07409511680caa145f 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 afe9ec570ec60f9e064b884bcb6fd4be35a7254a..52e33a1f48ce0da574f2ff8dc8af9b80b7695583 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 1d31213d5ca4e330b860e52a9b0b643012ef1edc..cdab4d2bd73622346cdaf4b413f1ad83fbcdf2fe 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 68be3d24c268dad187126c5d9d0da7629f06b9f9..b91782ae5119f4ac895cd0c043fd7422eb2cc068 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 6fdd8b530822f15d47a1bd50163172eb88001dbe..d18245a6ff46f972710dcef7fdb5d92df329353c 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 9d0e39ec0c29501f717761b735f6e703b3c91997..22a3645e57fa09d47d94ec1deb2d09ee8f04c2a1 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 e82f35598a6e4265b1951c8430f8d013e221cd54..9ee71ea9c5d68f049e90c53210379b60163d597a 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 d3455a4bba414712bd42bfb9fd05dfb10eec1813..6428d9daabaaaecdff6472b1c1e78033d0c0c3cf 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 1c7d9fe32bb3f9686e60b159894853bfa8a4a868..ea943f22c415c53b5af53866aac77f4c65af8af7 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 00f59744a31cf1644de0fa88673ef899c02bd484..248ae97f8759e42675b93701d78f209056081467 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 650f477e13a9a9c31d2e1a203e02fb901644dd60..7ec27aaf97aa0f1573b801ad962278f8ec1665bf 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 27cfe443ba76169ff5bdd961d7938a03d7c61ad7..ec57ec9e50c54891e1136009d906f62d792bab55 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 8f5c3fbf8ddf58c71d63b64e4f31e7495f8184b2..53fd962272a1ac16e60d611bba8f505e306eee49 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 724a880e2fe3882a407950688a090081f76b9872..8027f89d02ed0820550c9ee87c1a13974b4b2883 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 f2432bc6f8b288b95e4c6cae6b43bd02d3dbd3d5..85e06f1d563e57f014ffdc58c5c5e8869d10cebb 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 286d8a884a418882bf7b80893c03578d96fc62ae..98f70e2101bd826183d64214f81374ce2891ec13 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 a6e19726582fca563c2aa12c2a624994247d4432..50ed7aea37f039aaaf6bc71d2dbc12fd7cb79c3a 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 544aa5071f8d06677c91d58dbcef3e3772e48b5a..a4efac593fee57590317c7a8e8b186142b05f647 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 8d5d733f05c44c68d5c189a605f7b7b441fc8150..406263ce55aa3387e6d23afeffd9f365bfab13d7 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 ec4bcf43f114d650ff2ac03621b91e998d86a185..c16d0d2a6b1fb7735769ebd9e16440ec6ace6702 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 cb3b4a7fe4949f0d2cce4927b13b1230c03cefa9..493de18a76418ded365ead716bd36e35f5a3b262 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 464ff9f94b364f1e422b1ada38a7b568b9e85a0e..280e411683e97cba78d8d09fac82b87e2b94537f 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 7d0b396cd06c27d9d1730e48bcf2df04ead02b10..d5322e1bb2140131ba67ab5df87baf2c1544e726 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 592f25059ac2e181bb85971ead6611491f84de0d..82dbd1ee744d7d3ceb8472a3568b6be5f9623135 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 e2a9ed27e87420e5ed448b879f52ef8614f15f25..3fc4e499b0c0652df52d5cf52ccde31531262965 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 19855c9bee2981c99ce6f99da5e942be53cd59c9..9c9fba030e751fcd37c0478b3c328f004b30c5a3 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 ab8df7b74cdd160131cfb1a7785e89d5f5ba9ef2..3895a0b3aea9e61dbb6d17edef5f58c641c1eb07 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 2b4f8cd42eed59f8893090222f2db1763d95674f..43b0c9a63a936daf04764a6877c8dbef7cde66a4 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 67581c1f1d381d52f3e62fc5ff4bcbf73ba0a50c..edf12a3eb222dfddc29471a7327053b760ece499 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 05695aa8188452de021f68449c365fd3aff86b9f..33405d7a7ec69753b1ced3d3cb53a4f17b656a29 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 bdaab88d673a9487e77fdd49f0c1cc0925adad7b..53c85f73cde2ab152da26f3999053fe270d6d12a 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 03f76bd428ddb4af74382097c6bed75dee4600e0..248e7d5a389b7eaa9ea207e4ca155547e35d08ca 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 5c27e8fd5613eeab908432ee4e128fdd2f6afd47..8897a64a138bc1942e3109fc92c6ae5c43077453 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 d86da2445201c4bdd50a71fe0f27f7a895bb48d4..79bcdc41fb06b9e4c198382384d83fe790964961 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 f2b35a8fadf500dede8e9fd3912754cd71c8e3dd..40f15f9f09689921273a5ecffd8c4cb8521e345e 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 48fc98b3b2f1b7324cd4869835f345bd4df485ce..42e5d544f4cf879f9b5299155eff2884eef68d46 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 67a86c50fc13c63da374a6e890ffad8b502cc398..13accc6ae1b6aabf4e7850e2a1d554579e8e472b 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 f07b81e842a1725ff51370a371dbc171005a9f8d..1cb6f2e097f7701da4e829d3e3e53d2dde6c1a3a 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 a781fbc7f7d262d0f5c9f1083cc22ad465092d1f..78aa5d442e7178991aa238b7808dba778473decf 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 302c488d6c63810b42d18dac27862b59dbf73107..b3018169a1c380cc66cebe0bf63b396e1405b89f 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 d4ef31c0c749350efecba9fbd0989cb4f9e1e883..757c45708b902a0a5bc8be0380ec1348ea06d60c 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 2a793e0eb4d743aa56bcf059a6034c631ed09f38..6bd4718e780a8b7080f0c2d12be0d0dcf9bd1666 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 72f5e27180df3fe64d14aa214d47f80e249a0db4..91152df3ad94e2a3041410a063a08ac0f9c25ed0 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 fcbe0e5985fa67b554a3e0671615651a4b756a79..bda6383a3468d37cf8cbf708027e51434ea1c2c8 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 b5c92e681fb936c00714337066ec27bae2866c7b..a9605c6e4c65be8d3876aafb6283de6f1b51510a 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 b38869873169e7e3bef5b2becb380be0f1ba92ee..2a59bc4594af47ba5d3efbfd7bf0dc4023030992 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 a047f891ab2d955e1edb3d2ba5aa37e85db03b42..dd8c803a2f7a8db24694bb3689865fd0d831efdc 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 aaabf3ed2b03b2cc4d02fafec1732acd4d4b042c..aa90feeef89a1fb3aaf5ad9b612918042f71e5a9 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 d2bd05d921fec9c234f3e0aaad3167484fc61df9..8f2c5df5907d0907af163e5f61694af78f51d7dc 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 d6a309de12517f0487873c66d1dfe7626d93c9e9..d1b37cdd073687348d4eac67072ced776023ef0f 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 7298d25ad11d127d722de9923ee3fd6f7862b324..8128f07f3ff2fcf8a16c5a51ac79632992b996a1 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 fa652611c6b628f355ee067a52c0f80e7f7f7733..94f31ff139c78933a1ecf28d2db07754a7d1f914 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 2fe82475f0d1eea223c1aef3972289c431184043..25837dab6619c5ea3bc4f1d36c07d68313fd57f8 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 2bdf224804d7aa5d9cbb9fae867ed02ed9b20d1d..adad73f7e1141126656089400d24e47bfc5f8f51 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 8837b91051df0ab3f7ec19920036bfe00f82193c..f2a18c7295a5d2db4608583534e40fb67e69b3cb 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 af35e17bfa7d0c13a6b4c46b8736cb3f8f07a662..9703780b0e994ef6c09f2a751154b795a66d95c6 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 661d26946e79476bb4de6f0796230417d85ccd0a..0ae26e871549e2ebcbf87aafc65905211672c30c 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 a2b3638059ffa3be046de2d8fe6f2ea372d413ab..6ef5e93cb2005f2f723480f3ccfb024ce39ba478 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 424cc9694d36f60dd60b0902abad63f56cb15361..ada34d1a26a7c6c167e98eaf35bb11cdced7a17f 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 3210539f3eed854dde870ee510d82e79a40bd6c0..65b1d61399826e0cc94c3659fae980c33eb400bb 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 426593be428e3f0b243e3c10ee6460b3d6879ad0..7a8c54673f78d45c35fe1ae6a051d065077c67a5 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 dc41214f438ee4f9a6dc8f92e349d93a639422df..7b9e6e38c378c948a3aa04920fb16591881e1c26 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 eae9bd4f5cf8a489c62f4256664898a7d1ec8fec..bc7885b03d947b940efb4e94e054529a6849bbbd 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 c56f077ed9fedb96457f321de94540d98402a977..ee0f9f14581a3526282ee6293a652636e475292b 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 f8ec95950a819fd9daebf298a144178cedcedcb2..1a58e1aab299e3c73a6cfdeedccf2c3aecd220f0 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 08e21ee253761070a9ee9ab9af20ded0cd2dca08..2c20821ac3f6c0b517b5e396989c8fde2c79a565 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 48af5330170d00e4bcc6f0fa487ff834a9443afa..ab21928f5f5555756b82b240fc4ef9dbf6dedd14 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 15b30d059662d883d2c1d62ed6777997346402f1..5810ea8f89039a53d3121aad450cb359015d1519 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 bd83cb88058d1edb7c4ff006689eb32bbd513d22..baf8bcc04b88bb8dc251ca2eb0d1982b2df8a487 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 9399745f9003697761c4882d83c504623990073f..7b0641627262cb62bf8b0a31156d08491bdb70d0 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 565d3203e4f1cd2819878ee99189a872d4e9cea3..5e3f19ba19e3aa17f04f9981f0addab7f9cbcc1f 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 9b2930657972103af75e1ff58d6f242431fa6f20..ec435ec3b32b1763a6717bf52a333449ccaae7be 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 cae6bee2776d7cfe715a2196e800c928d819ecfc..50980718e660bc69865f2642fa1c924092635fb1 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 303193bab9bce2aa6d0f90726186a63c7eb59808..c861a56497e0ceccb13456748cfc891f803e5d7b 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