From 8835b7889a6265aba3c6d7ee241abf80a1cf07f3 Mon Sep 17 00:00:00 2001
From: Josh Frye <joshfng@gmail.com>
Date: Wed, 1 Jun 2016 19:27:21 -0400
Subject: [PATCH] Flush cache in callback. Add tests

---
 app/models/concerns/issuable.rb |  8 ++++++++
 app/models/user.rb              | 13 +++++++++----
 spec/features/issues_spec.rb    | 15 +++++++++++++++
 3 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 2326a395cb8..46cde460952 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -68,6 +68,14 @@ module Issuable
     strip_attributes :title
 
     acts_as_paranoid
+
+    after_save :update_assignee_cache_counts, if: :assignee_id_changed?
+
+    def update_assignee_cache_counts
+      # make sure we flush the cache for both the old *and* new assignee
+      User.find(assignee_id_was).update_cache_counts if assignee_id_was
+      assignee.update_cache_counts if assignee_id
+    end
   end
 
   module ClassMethods
diff --git a/app/models/user.rb b/app/models/user.rb
index 55f8e149629..172845c9d25 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -776,18 +776,23 @@ class User < ActiveRecord::Base
     notification_settings.find_or_initialize_by(source: source)
   end
 
-  def assigned_open_merge_request_count
-    Rails.cache.fetch(['users', id, 'assigned_open_merge_request_count'], expires_in: 60) do
+  def assigned_open_merge_request_count(force: false)
+    Rails.cache.fetch(['users', id, 'assigned_open_merge_request_count'], force: force) do
       assigned_merge_requests.opened.count
     end
   end
 
-  def assigned_open_issues_count
-    Rails.cache.fetch(['users', id, 'assigned_open_issues_count'], expires_in: 60) do
+  def assigned_open_issues_count(force: false)
+    Rails.cache.fetch(['users', id, 'assigned_open_issues_count'], force: force) do
       assigned_issues.opened.count
     end
   end
 
+  def update_cache_counts
+    assigned_open_merge_request_count(force: true)
+    assigned_open_issues_count(force: true)
+  end
+
   private
 
   def projects_union
diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb
index 9271964166a..fa0d8e1a0cd 100644
--- a/spec/features/issues_spec.rb
+++ b/spec/features/issues_spec.rb
@@ -62,6 +62,21 @@ describe 'Issues', feature: true do
 
       expect(issue.reload.assignee).to be_nil
     end
+
+    it 'updates assigned cache count on change', js: true do
+      visit edit_namespace_project_issue_path(project.namespace, project, issue)
+
+      expect(page).to have_content "Assignee #{@user.name}"
+      expect(@user.assigned_open_issues_count).to eq @user.assigned_issues.opened.count
+
+      first('#s2id_issue_assignee_id').click
+      sleep 2 # wait for ajax stuff to complete
+      first('.user-result').click
+
+      click_button 'Save changes'
+
+      expect(@user.assigned_open_issues_count).to eq @user.assigned_issues.opened.count
+    end
   end
 
   describe 'due date', js: true do
-- 
GitLab