From 4f2cc5951f3d2862a44fe124ef9a879162028e62 Mon Sep 17 00:00:00 2001
From: Grzegorz Bizon <grzesiek.bizon@gmail.com>
Date: Mon, 1 May 2017 14:29:20 +0200
Subject: [PATCH] Extend action tooltop to show info about abilities

---
 lib/gitlab/ci/status/build/play.rb            |  6 +-
 .../gitlab/ci/status/build/factory_spec.rb    |  2 +-
 spec/lib/gitlab/ci/status/build/play_spec.rb  | 65 ++++++++++---------
 3 files changed, 42 insertions(+), 31 deletions(-)

diff --git a/lib/gitlab/ci/status/build/play.rb b/lib/gitlab/ci/status/build/play.rb
index 4c893f62925..8130c7d1c90 100644
--- a/lib/gitlab/ci/status/build/play.rb
+++ b/lib/gitlab/ci/status/build/play.rb
@@ -6,7 +6,11 @@ module Gitlab
           include Status::Extended
 
           def label
-            'manual play action'
+            if has_action?
+              'manual play action'
+            else
+              'manual play action (not allowed)'
+            end
           end
 
           def has_action?
diff --git a/spec/lib/gitlab/ci/status/build/factory_spec.rb b/spec/lib/gitlab/ci/status/build/factory_spec.rb
index 2ab67127b1e..2de00c28945 100644
--- a/spec/lib/gitlab/ci/status/build/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/factory_spec.rb
@@ -216,7 +216,7 @@ describe Gitlab::Ci::Status::Build::Factory do
         expect(status.group).to eq 'manual'
         expect(status.icon).to eq 'icon_status_manual'
         expect(status.favicon).to eq 'favicon_status_manual'
-        expect(status.label).to eq 'manual play action'
+        expect(status.label).to include 'manual play action'
         expect(status).to have_details
         expect(status.action_path).to include 'play'
       end
diff --git a/spec/lib/gitlab/ci/status/build/play_spec.rb b/spec/lib/gitlab/ci/status/build/play_spec.rb
index 95f1388a9b9..abefdbe7c66 100644
--- a/spec/lib/gitlab/ci/status/build/play_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/play_spec.rb
@@ -1,51 +1,58 @@
 require 'spec_helper'
 
 describe Gitlab::Ci::Status::Build::Play do
-  let(:status) { double('core') }
-  let(:user) { double('user') }
+  let(:user) { create(:user) }
+  let(:build) { create(:ci_build, :manual) }
+  let(:status) { Gitlab::Ci::Status::Core.new(build, user) }
 
   subject { described_class.new(status) }
 
-  describe '#label' do
-    it { expect(subject.label).to eq 'manual play action' }
-  end
-
-  describe 'action details' do
-    let(:user) { create(:user) }
-    let(:build) { create(:ci_build, :manual) }
-    let(:status) { Gitlab::Ci::Status::Core.new(build, user) }
+  context 'when user is allowed to update build' do
+    context 'when user can push to branch' do
+      before { build.project.add_master(user) }
 
-    describe '#has_action?' do
-      context 'when user is allowed to update build' do
-        context 'when user can push to branch' do
-          before { build.project.add_master(user) }
+      describe '#has_action?' do
+        it { is_expected.to have_action }
+      end
 
-          it { is_expected.to have_action }
+      describe '#label' do
+        it 'has a label that says it is a manual action' do
+          expect(subject.label).to eq 'manual play action'
         end
+      end
+    end
 
-        context 'when user can not push to the branch' do
-          before { build.project.add_developer(user) }
+    context 'when user can not push to the branch' do
+      before { build.project.add_developer(user) }
 
-          it { is_expected.not_to have_action }
-        end
+      describe 'has_action?' do
+        it { is_expected.not_to have_action }
       end
 
-      context 'when user is not allowed to update build' do
-        it { is_expected.not_to have_action }
+      describe '#label' do
+        it 'has a label that says user is not allowed to play it' do
+          expect(subject.label).to eq 'manual play action (not allowed)'
+        end
       end
     end
+  end
 
-    describe '#action_path' do
-      it { expect(subject.action_path).to include "#{build.id}/play" }
+  context 'when user is not allowed to update build' do
+    describe '#has_action?' do
+      it { is_expected.not_to have_action }
     end
+  end
 
-    describe '#action_icon' do
-      it { expect(subject.action_icon).to eq 'icon_action_play' }
-    end
+  describe '#action_path' do
+    it { expect(subject.action_path).to include "#{build.id}/play" }
+  end
 
-    describe '#action_title' do
-      it { expect(subject.action_title).to eq 'Play' }
-    end
+  describe '#action_icon' do
+    it { expect(subject.action_icon).to eq 'icon_action_play' }
+  end
+
+  describe '#action_title' do
+    it { expect(subject.action_title).to eq 'Play' }
   end
 
   describe '.matches?' do
-- 
GitLab