From caf6b9918e3f7a79c9ffcffd1880f29422d50eb5 Mon Sep 17 00:00:00 2001
From: Grzegorz Bizon <grzesiek.bizon@gmail.com>
Date: Thu, 15 Jun 2017 14:43:47 +0200
Subject: [PATCH] Check warnings when building compound status SQL query

---
 app/models/commit_status.rb       |  6 ------
 app/models/concerns/has_status.rb | 23 +++++++++++++----------
 spec/models/commit_status_spec.rb |  2 +-
 3 files changed, 14 insertions(+), 17 deletions(-)

diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 500d05fd84..07cec63b93 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -103,12 +103,6 @@ class CommitStatus < ActiveRecord::Base
     end
   end
 
-  def self.status
-    super.tap do |status|
-      return 'success' if status == 'skipped' && all.failed_but_allowed.any?
-    end
-  end
-
   def locking_enabled?
     status_changed?
   end
diff --git a/app/models/concerns/has_status.rb b/app/models/concerns/has_status.rb
index 3c9c6584e0..32af556613 100644
--- a/app/models/concerns/has_status.rb
+++ b/app/models/concerns/has_status.rb
@@ -11,18 +11,21 @@ module HasStatus
 
   class_methods do
     def status_sql
-      scope = respond_to?(:exclude_ignored) ? exclude_ignored : all
-
-      builds = scope.select('count(*)').to_sql
-      created = scope.created.select('count(*)').to_sql
-      success = scope.success.select('count(*)').to_sql
-      manual = scope.manual.select('count(*)').to_sql
-      pending = scope.pending.select('count(*)').to_sql
-      running = scope.running.select('count(*)').to_sql
-      skipped = scope.skipped.select('count(*)').to_sql
-      canceled = scope.canceled.select('count(*)').to_sql
+      scope_relevant = respond_to?(:exclude_ignored) ? exclude_ignored : all
+      scope_warnings = respond_to?(:failed_but_allowed) ? failed_but_allowed : none
+
+      builds = scope_relevant.select('count(*)').to_sql
+      created = scope_relevant.created.select('count(*)').to_sql
+      success = scope_relevant.success.select('count(*)').to_sql
+      manual = scope_relevant.manual.select('count(*)').to_sql
+      pending = scope_relevant.pending.select('count(*)').to_sql
+      running = scope_relevant.running.select('count(*)').to_sql
+      skipped = scope_relevant.skipped.select('count(*)').to_sql
+      canceled = scope_relevant.canceled.select('count(*)').to_sql
+      warnings = scope_warnings.select('count(*) > 0').to_sql.presence || 'false'
 
       "(CASE
+        WHEN (#{builds})=(#{skipped}) AND (#{warnings}) THEN 'success'
         WHEN (#{builds})=(#{skipped}) THEN 'skipped'
         WHEN (#{builds})=(#{success}) THEN 'success'
         WHEN (#{builds})=(#{created}) THEN 'created'
diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb
index dc348f6cd3..1e074c7ad2 100644
--- a/spec/models/commit_status_spec.rb
+++ b/spec/models/commit_status_spec.rb
@@ -309,7 +309,7 @@ describe CommitStatus, :models do
 
     context 'when using a scope to select latest statuses' do
       before do
-        create_status(name: 'test', status: 'failed')
+        create_status(name: 'test', retried: true, status: 'failed')
         create_status(allow_failure: true, name: 'test', status: 'failed')
       end
 
-- 
2.30.9