From 56259155d5a0ecfbbafb7319651495582504cfb8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9my=20Coutable?= <remy@rymai.me>
Date: Thu, 29 Sep 2016 16:55:55 +0200
Subject: [PATCH] Small improvements thanks to Robert's feedback
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Rémy Coutable <remy@rymai.me>
---
 .../projects/boards/issues_controller.rb      |  2 +-
 app/controllers/projects_controller.rb        |  4 +-
 app/helpers/issuables_helper.rb               |  8 +--
 lib/api/milestones.rb                         |  3 +-
 spec/features/dashboard_issues_spec.rb        | 18 +-----
 spec/features/issues/filter_by_labels_spec.rb |  6 +-
 spec/features/issues/filter_issues_spec.rb    | 54 +++--------------
 .../filter_by_milestone_spec.rb               | 18 +-----
 spec/helpers/issuables_helper_spec.rb         | 60 +++++++++++--------
 spec/support/matchers/have_issuable_counts.rb | 21 +++++++
 10 files changed, 79 insertions(+), 115 deletions(-)
 create mode 100644 spec/support/matchers/have_issuable_counts.rb

diff --git a/app/controllers/projects/boards/issues_controller.rb b/app/controllers/projects/boards/issues_controller.rb
index 9404612a993..4aa7982eab4 100644
--- a/app/controllers/projects/boards/issues_controller.rb
+++ b/app/controllers/projects/boards/issues_controller.rb
@@ -33,7 +33,7 @@ module Projects
 
       def issue
         @issue ||=
-          IssuesFinder.new(current_user, project_id: project.id, state: 'all')
+          IssuesFinder.new(current_user, project_id: project.id)
                       .execute
                       .where(iid: params[:id])
                       .first!
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index c99aeadb5e4..62916270172 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -137,10 +137,10 @@ class ProjectsController < Projects::ApplicationController
     noteable =
       case params[:type]
       when 'Issue'
-        IssuesFinder.new(current_user, project_id: @project.id, state: 'all').
+        IssuesFinder.new(current_user, project_id: @project.id).
           execute.find_by(iid: params[:type_id])
       when 'MergeRequest'
-        MergeRequestsFinder.new(current_user, project_id: @project.id, state: 'all').
+        MergeRequestsFinder.new(current_user, project_id: @project.id).
           execute.find_by(iid: params[:type_id])
       when 'Commit'
         @project.commit(params[:type_id])
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index 8aa1ece017c..8c04200fab9 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -137,13 +137,13 @@ module IssuablesHelper
     issuables_finder.execute.page(1).total_count
   end
 
-  IRRELEVANT_PARAMS_FOR_CACHE_KEY = %w[utf8 sort page]
+  IRRELEVANT_PARAMS_FOR_CACHE_KEY = %i[utf8 sort page]
   private_constant :IRRELEVANT_PARAMS_FOR_CACHE_KEY
 
   def issuables_state_counter_cache_key(issuable_type, state)
-    opts = params.dup
-    opts['state'] = state
-    opts.delete_if { |k, v| IRRELEVANT_PARAMS_FOR_CACHE_KEY.include?(k) }
+    opts = params.with_indifferent_access
+    opts[:state] = state
+    opts.except!(*IRRELEVANT_PARAMS_FOR_CACHE_KEY)
 
     hexdigest(['issuables_count', issuable_type, opts.sort].flatten.join('-'))
   end
diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb
index 7a0cb7c99f3..9b73f6826cf 100644
--- a/lib/api/milestones.rb
+++ b/lib/api/milestones.rb
@@ -108,8 +108,7 @@ module API
 
         finder_params = {
           project_id: user_project.id,
-          milestone_title: @milestone.title,
-          state: 'all'
+          milestone_title: @milestone.title
         }
 
         issues = IssuesFinder.new(current_user, finder_params).execute
diff --git a/spec/features/dashboard_issues_spec.rb b/spec/features/dashboard_issues_spec.rb
index 4dccf645454..9b54b5301e5 100644
--- a/spec/features/dashboard_issues_spec.rb
+++ b/spec/features/dashboard_issues_spec.rb
@@ -21,11 +21,7 @@ describe "Dashboard Issues filtering", feature: true, js: true do
 
       click_link 'No Milestone'
 
-      page.within '.issues-state-filters' do
-        expect(page).to have_content('Open 1')
-        expect(page).to have_content('Closed 0')
-        expect(page).to have_content('All 1')
-      end
+      expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
       expect(page).to have_selector('.issue', count: 1)
     end
 
@@ -34,11 +30,7 @@ describe "Dashboard Issues filtering", feature: true, js: true do
 
       click_link 'Any Milestone'
 
-      page.within '.issues-state-filters' do
-        expect(page).to have_content('Open 2')
-        expect(page).to have_content('Closed 0')
-        expect(page).to have_content('All 2')
-      end
+      expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
       expect(page).to have_selector('.issue', count: 2)
     end
 
@@ -49,11 +41,7 @@ describe "Dashboard Issues filtering", feature: true, js: true do
         click_link milestone.title
       end
 
-      page.within '.issues-state-filters' do
-        expect(page).to have_content('Open 1')
-        expect(page).to have_content('Closed 0')
-        expect(page).to have_content('All 1')
-      end
+      expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
       expect(page).to have_selector('.issue', count: 1)
     end
   end
diff --git a/spec/features/issues/filter_by_labels_spec.rb b/spec/features/issues/filter_by_labels_spec.rb
index a615174c00e..0253629f753 100644
--- a/spec/features/issues/filter_by_labels_spec.rb
+++ b/spec/features/issues/filter_by_labels_spec.rb
@@ -83,11 +83,7 @@ feature 'Issue filtering by Labels', feature: true, js: true do
     end
 
     it 'applies the filters' do
-      page.within '.issues-state-filters' do
-        expect(page).to have_content('Open 1')
-        expect(page).to have_content('Closed 0')
-        expect(page).to have_content('All 1')
-      end
+      expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
       expect(page).to have_content "Bugfix2"
       expect(page).not_to have_content "Feature1"
       expect(find('.filtered-labels')).to have_content "bug"
diff --git a/spec/features/issues/filter_issues_spec.rb b/spec/features/issues/filter_issues_spec.rb
index 8fd67acff69..8d19198efd3 100644
--- a/spec/features/issues/filter_issues_spec.rb
+++ b/spec/features/issues/filter_issues_spec.rb
@@ -227,11 +227,7 @@ describe 'Filter issues', feature: true do
       it 'filters by text and label' do
         fill_in 'issuable_search', with: 'Bug'
 
-        page.within '.issues-state-filters' do
-          expect(page).to have_content('Open 2')
-          expect(page).to have_content('Closed 0')
-          expect(page).to have_content('All 2')
-        end
+        expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
         page.within '.issues-list' do
           expect(page).to have_selector('.issue', count: 2)
         end
@@ -242,11 +238,7 @@ describe 'Filter issues', feature: true do
         end
         find('.dropdown-menu-close-icon').click
 
-        page.within '.issues-state-filters' do
-          expect(page).to have_content('Open 1')
-          expect(page).to have_content('Closed 0')
-          expect(page).to have_content('All 1')
-        end
+        expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
         page.within '.issues-list' do
           expect(page).to have_selector('.issue', count: 1)
         end
@@ -255,11 +247,7 @@ describe 'Filter issues', feature: true do
       it 'filters by text and milestone' do
         fill_in 'issuable_search', with: 'Bug'
 
-        page.within '.issues-state-filters' do
-          expect(page).to have_content('Open 2')
-          expect(page).to have_content('Closed 0')
-          expect(page).to have_content('All 2')
-        end
+        expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
         page.within '.issues-list' do
           expect(page).to have_selector('.issue', count: 2)
         end
@@ -269,11 +257,7 @@ describe 'Filter issues', feature: true do
           click_link '8'
         end
 
-        page.within '.issues-state-filters' do
-          expect(page).to have_content('Open 1')
-          expect(page).to have_content('Closed 0')
-          expect(page).to have_content('All 1')
-        end
+        expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
         page.within '.issues-list' do
           expect(page).to have_selector('.issue', count: 1)
         end
@@ -282,11 +266,7 @@ describe 'Filter issues', feature: true do
       it 'filters by text and assignee' do
         fill_in 'issuable_search', with: 'Bug'
 
-        page.within '.issues-state-filters' do
-          expect(page).to have_content('Open 2')
-          expect(page).to have_content('Closed 0')
-          expect(page).to have_content('All 2')
-        end
+        expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
         page.within '.issues-list' do
           expect(page).to have_selector('.issue', count: 2)
         end
@@ -296,11 +276,7 @@ describe 'Filter issues', feature: true do
           click_link user.name
         end
 
-        page.within '.issues-state-filters' do
-          expect(page).to have_content('Open 1')
-          expect(page).to have_content('Closed 0')
-          expect(page).to have_content('All 1')
-        end
+        expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
         page.within '.issues-list' do
           expect(page).to have_selector('.issue', count: 1)
         end
@@ -309,11 +285,7 @@ describe 'Filter issues', feature: true do
       it 'filters by text and author' do
         fill_in 'issuable_search', with: 'Bug'
 
-        page.within '.issues-state-filters' do
-          expect(page).to have_content('Open 2')
-          expect(page).to have_content('Closed 0')
-          expect(page).to have_content('All 2')
-        end
+        expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
         page.within '.issues-list' do
           expect(page).to have_selector('.issue', count: 2)
         end
@@ -323,11 +295,7 @@ describe 'Filter issues', feature: true do
           click_link user.name
         end
 
-        page.within '.issues-state-filters' do
-          expect(page).to have_content('Open 1')
-          expect(page).to have_content('Closed 0')
-          expect(page).to have_content('All 1')
-        end
+        expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
         page.within '.issues-list' do
           expect(page).to have_selector('.issue', count: 1)
         end
@@ -356,11 +324,7 @@ describe 'Filter issues', feature: true do
       find('.dropdown-menu-close-icon').click
       wait_for_ajax
 
-      page.within '.issues-state-filters' do
-        expect(page).to have_content('Open 2')
-        expect(page).to have_content('Closed 0')
-        expect(page).to have_content('All 2')
-      end
+      expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
       page.within '.issues-list' do
         expect(page).to have_selector('.issue', count: 2)
       end
diff --git a/spec/features/merge_requests/filter_by_milestone_spec.rb b/spec/features/merge_requests/filter_by_milestone_spec.rb
index 3d5d9614fb6..d917d5950ec 100644
--- a/spec/features/merge_requests/filter_by_milestone_spec.rb
+++ b/spec/features/merge_requests/filter_by_milestone_spec.rb
@@ -17,11 +17,7 @@ feature 'Merge Request filtering by Milestone', feature: true do
     visit_merge_requests(project)
     filter_by_milestone(Milestone::None.title)
 
-    page.within '.issues-state-filters' do
-      expect(page).to have_content('Open 1')
-      expect(page).to have_content('Closed 0')
-      expect(page).to have_content('All 1')
-    end
+    expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
     expect(page).to have_css('.merge-request', count: 1)
   end
 
@@ -44,11 +40,7 @@ feature 'Merge Request filtering by Milestone', feature: true do
       visit_merge_requests(project)
       filter_by_milestone(Milestone::Upcoming.title)
 
-      page.within '.issues-state-filters' do
-        expect(page).to have_content('Open 1')
-        expect(page).to have_content('Closed 0')
-        expect(page).to have_content('All 1')
-      end
+      expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
       expect(page).to have_css('.merge-request', count: 1)
     end
 
@@ -71,11 +63,7 @@ feature 'Merge Request filtering by Milestone', feature: true do
     visit_merge_requests(project)
     filter_by_milestone(milestone.title)
 
-    page.within '.issues-state-filters' do
-      expect(page).to have_content('Open 1')
-      expect(page).to have_content('Closed 0')
-      expect(page).to have_content('All 1')
-    end
+    expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
     expect(page).to have_css('.merge-request', count: 1)
   end
 
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index 5effb7ea36c..62cc10f579a 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -46,18 +46,18 @@ describe IssuablesHelper do
     describe 'counter caching based on issuable type and params', :caching do
       let(:params) do
         {
-          'scope' => 'created-by-me',
-          'state' => 'opened',
-          'utf8' => '✓',
-          'author_id' => '11',
-          'assignee_id' => '18',
-          'label_name' => ['bug', 'discussion', 'documentation'],
-          'milestone_title' => 'v4.0',
-          'sort' => 'due_date_asc',
-          'namespace_id' => 'gitlab-org',
-          'project_id' => 'gitlab-ce',
-          'page' => 2
-        }
+          scope: 'created-by-me',
+          state: 'opened',
+          utf8: '✓',
+          author_id: '11',
+          assignee_id: '18',
+          label_name: ['bug', 'discussion', 'documentation'],
+          milestone_title: 'v4.0',
+          sort: 'due_date_asc',
+          namespace_id: 'gitlab-org',
+          project_id: 'gitlab-ce',
+          page: 2
+        }.with_indifferent_access
       end
 
       it 'returns the cached value when called for the same issuable type & with the same params' do
@@ -73,25 +73,33 @@ describe IssuablesHelper do
           to eq('<span>Open</span> <span class="badge">42</span>')
       end
 
-      describe 'keys not taken in account in the cache key' do
-        %w[state sort utf8 page].each do |param|
-          it "does not take in account params['#{param}'] in the cache key" do
-            expect(helper).to receive(:params).and_return('author_id' => '11', param => 'foo')
-            expect(helper).to receive(:issuables_count_for_state).with(:issues, :opened).and_return(42)
+      it 'does not take some keys into account in the cache key' do
+        expect(helper).to receive(:params).and_return({
+          author_id: '11',
+          state: 'foo',
+          sort: 'foo',
+          utf8: 'foo',
+          page: 'foo'
+        }.with_indifferent_access)
+        expect(helper).to receive(:issuables_count_for_state).with(:issues, :opened).and_return(42)
 
-            expect(helper.issuables_state_counter_text(:issues, :opened)).
-              to eq('<span>Open</span> <span class="badge">42</span>')
+        expect(helper.issuables_state_counter_text(:issues, :opened)).
+          to eq('<span>Open</span> <span class="badge">42</span>')
 
-            expect(helper).to receive(:params).and_return('author_id' => '11', param => 'bar')
-            expect(helper).not_to receive(:issuables_count_for_state)
+        expect(helper).to receive(:params).and_return({
+          author_id: '11',
+          state: 'bar',
+          sort: 'bar',
+          utf8: 'bar',
+          page: 'bar'
+        }.with_indifferent_access)
+        expect(helper).not_to receive(:issuables_count_for_state)
 
-            expect(helper.issuables_state_counter_text(:issues, :opened)).
-              to eq('<span>Open</span> <span class="badge">42</span>')
-          end
-        end
+        expect(helper.issuables_state_counter_text(:issues, :opened)).
+          to eq('<span>Open</span> <span class="badge">42</span>')
       end
 
-      it 'does not take params order in acount in the cache key' do
+      it 'does not take params order into account in the cache key' do
         expect(helper).to receive(:params).and_return('author_id' => '11', 'state' => 'opened')
         expect(helper).to receive(:issuables_count_for_state).with(:issues, :opened).and_return(42)
 
diff --git a/spec/support/matchers/have_issuable_counts.rb b/spec/support/matchers/have_issuable_counts.rb
new file mode 100644
index 00000000000..02605d6b70e
--- /dev/null
+++ b/spec/support/matchers/have_issuable_counts.rb
@@ -0,0 +1,21 @@
+RSpec::Matchers.define :have_issuable_counts do |opts|
+  match do |actual|
+    expected_counts = opts.map do |state, count|
+      "#{state.to_s.humanize} #{count}"
+    end
+
+    actual.within '.issues-state-filters' do
+      expected_counts.each do |expected_count|
+        expect(actual).to have_content(expected_count)
+      end
+    end
+  end
+
+  description do
+    "displays the following issuable counts: #{expected_counts.inspect}"
+  end
+
+  failure_message do
+    "expected the following issuable counts: #{expected_counts.inspect} to be displayed"
+  end
+end
-- 
GitLab