From 31af6be076635e6c6936564558bb977740d39eb0 Mon Sep 17 00:00:00 2001
From: Kamil Trzcinski <ayufan@ayufan.eu>
Date: Thu, 19 Jan 2017 23:31:03 +0100
Subject: [PATCH] Fix specs

---
 app/models/ci/runner.rb                       | 12 +++++--
 app/services/ci/update_build_queue_service.rb |  2 +-
 lib/api/helpers.rb                            |  2 +-
 spec/models/ci/runner_spec.rb                 | 33 ++++++++++++++++---
 4 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index d13e54fcc16..6e58a1878c8 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -22,7 +22,7 @@ module Ci
     scope :online, ->() { where('contacted_at > ?', LAST_CONTACT_TIME) }
     scope :ordered, ->() { order(id: :desc) }
 
-    after_save :tick_runner_queue
+    after_save :tick_runner_queue, if: :form_editable_changed?
 
     scope :owned_or_shared, ->(project_id) do
       joins('LEFT JOIN ci_runner_projects ON ci_runner_projects.runner_id = ci_runners.id')
@@ -126,14 +126,14 @@ module Ci
     end
 
     def tick_runner_queue
-      new_update = Time.new.inspect
+      new_update = SecureRandom.hex
       Gitlab::Redis.with { |redis| redis.set(runner_queue_key, new_update, ex: RUNNER_QUEUE_EXPIRY_TIME) }
       new_update
     end
 
     def ensure_runner_queue_value
       Gitlab::Redis.with do |redis|
-        value = Time.new.inspect
+        value = SecureRandom.hex
         redis.set(runner_queue_key, value, ex: RUNNER_QUEUE_EXPIRY_TIME, nx: true)
         redis.get(runner_queue_key)
       end
@@ -149,6 +149,12 @@ module Ci
       "runner:build_queue:#{self.token}"
     end
 
+    def form_editable_changed?
+      FORM_EDITABLE.any? do |editable|
+        public_send("#{editable}_changed?")
+      end
+    end
+
     def tag_constraints
       unless has_tags? || run_untagged?
         errors.add(:tags_list,
diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb
index 704b872ddd0..2e901016666 100644
--- a/app/services/ci/update_build_queue_service.rb
+++ b/app/services/ci/update_build_queue_service.rb
@@ -1,7 +1,7 @@
 module Ci
   class UpdateBuildQueueService
     def execute(build)
-      build.project.runners.select do |runner|
+      build.project.runners.each do |runner|
         if runner.can_pick?(build)
           runner.tick_runner_queue
         end
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index 49c5f0652ab..6b81fbf294e 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -226,7 +226,7 @@ module API
     end
 
     def render_api_error!(message, status)
-      error!({ 'message' => message }, status, header)
+      error!({ 'message' => message }, status)
     end
 
     def handle_api_exception(exception)
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 06eaa6d04d9..2b856ca7af7 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -277,21 +277,44 @@ describe Ci::Runner, models: true do
     it 'sets a new last_update value when it is called the first time' do
       last_update = runner.ensure_runner_queue_value
 
-      expect_value_in_redis(last_update)
+      expect_value_in_redis.to eq(last_update)
     end
 
     it 'does not change if it is not expired and called again' do
       last_update = runner.ensure_runner_queue_value
 
       expect(runner.ensure_runner_queue_value).to eq(last_update)
-      expect_value_in_redis(last_update)
+      expect_value_in_redis.to eq(last_update)
     end
 
-    def expect_value_in_redis(last_update)
+    context 'updates runner queue after changing editable value' do
+      let!(:last_update) { runner.ensure_runner_queue_value }
+
+      before do
+        runner.update(description: 'new runner')
+      end
+
+      it 'sets a new last_update value' do
+        expect_value_in_redis.not_to eq(last_update)
+      end
+    end
+
+    context 'does not update runner value after save' do
+      let!(:last_update) { runner.ensure_runner_queue_value }
+
+      before do
+        runner.touch
+      end
+
+      it 'has an old last_update value' do
+        expect_value_in_redis.to eq(last_update)
+      end
+    end
+
+    def expect_value_in_redis
       Gitlab::Redis.with do |redis|
         runner_queue_key = runner.send(:runner_queue_key)
-
-        expect(redis.get(runner_queue_key)).to eq(last_update)
+        expect(redis.get(runner_queue_key))
       end
     end
   end
-- 
GitLab