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