From 55aa727eff50a9472405b302645abb54f28bdba0 Mon Sep 17 00:00:00 2001
From: Grzegorz Bizon <grzesiek.bizon@gmail.com>
Date: Wed, 12 Apr 2017 13:36:35 +0200
Subject: [PATCH] Extract build play specs and extend test examples

---
 spec/models/ci/build_spec.rb                |  36 +------
 spec/services/ci/play_build_service_spec.rb | 105 ++++++++++++++++++++
 2 files changed, 107 insertions(+), 34 deletions(-)
 create mode 100644 spec/services/ci/play_build_service_spec.rb

diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 8124d263fd4..09e9f5bd8ba 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -959,40 +959,8 @@ describe Ci::Build, :models do
       project.add_developer(user)
     end
 
-    context 'when user does not have ability to trigger action' do
-      before do
-        create(:protected_branch, :no_one_can_push,
-               name: build.ref, project: project)
-      end
-
-      it 'raises an error' do
-        expect { build.play(user) }
-          .to raise_error Gitlab::Access::AccessDeniedError
-      end
-    end
-
-    context 'when user has ability to trigger manual action' do
-      context 'when build is manual' do
-        it 'enqueues a build' do
-          new_build = build.play(user)
-
-          expect(new_build).to be_pending
-          expect(new_build).to eq(build)
-        end
-      end
-
-      context 'when build is not manual' do
-        before do
-          build.update(status: 'success')
-        end
-
-        it 'creates a new build' do
-          new_build = build.play(user)
-
-          expect(new_build).to be_pending
-          expect(new_build).not_to eq(build)
-        end
-      end
+    it 'enqueues the build' do
+      expect(build.play(user)).to be_pending
     end
   end
 
diff --git a/spec/services/ci/play_build_service_spec.rb b/spec/services/ci/play_build_service_spec.rb
new file mode 100644
index 00000000000..d6f9fa42045
--- /dev/null
+++ b/spec/services/ci/play_build_service_spec.rb
@@ -0,0 +1,105 @@
+require 'spec_helper'
+
+describe Ci::PlayBuildService, '#execute', :services do
+  let(:user) { create(:user) }
+  let(:project) { create(:empty_project) }
+  let(:pipeline) { create(:ci_pipeline, project: project) }
+  let(:build) { create(:ci_build, :manual, pipeline: pipeline) }
+
+  let(:service) do
+    described_class.new(project, user)
+  end
+
+  context 'when project does not have repository yet' do
+    let(:project) { create(:empty_project) }
+
+    it 'allows user with master role to play build' do
+      project.add_master(user)
+
+      service.execute(build)
+
+      expect(build.reload).to be_pending
+    end
+
+    it 'does not allow user with developer role to play build' do
+      project.add_developer(user)
+
+      expect { service.execute(build) }
+        .to raise_error Gitlab::Access::AccessDeniedError
+    end
+  end
+
+  context 'when project has repository' do
+    let(:project) { create(:project) }
+
+    it 'allows user with developer role to play a build' do
+      project.add_developer(user)
+
+      service.execute(build)
+
+      expect(build.reload).to be_pending
+    end
+  end
+
+  context 'when build is a playable manual action' do
+    let(:build) { create(:ci_build, :manual, pipeline: pipeline) }
+
+    before do
+      project.add_master(user)
+    end
+
+    it 'enqueues the build' do
+      expect(service.execute(build)).to eq build
+      expect(build.reload).to be_pending
+    end
+
+    it 'reassignes build user correctly' do
+      service.execute(build)
+
+      expect(build.reload.user).to eq user
+    end
+  end
+
+  context 'when build is not a playable manual action' do
+    let(:build) { create(:ci_build, when: :manual, pipeline: pipeline) }
+
+    before do
+      project.add_master(user)
+    end
+
+    it 'duplicates the build' do
+      duplicate = service.execute(build)
+
+      expect(duplicate).not_to eq build
+      expect(duplicate).to be_pending
+    end
+
+    it 'assigns users correctly' do
+      duplicate = service.execute(build)
+
+      expect(build.user).not_to eq user
+      expect(duplicate.user).to eq user
+    end
+  end
+
+  context 'when build is not action' do
+    let(:build) { create(:ci_build, :success, pipeline: pipeline) }
+
+    it 'raises an error' do
+      expect { service.execute(build) }
+        .to raise_error Gitlab::Access::AccessDeniedError
+    end
+  end
+
+  context 'when user does not have ability to trigger action' do
+    before do
+      create(:protected_branch, :no_one_can_push,
+             name: build.ref, project: project)
+    end
+
+    it 'raises an error' do
+      expect { service.execute(build) }
+        .to raise_error Gitlab::Access::AccessDeniedError
+    end
+  end
+end
-- 
GitLab