summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortiagonbotelho <tiagonbotelho@hotmail.com>2016-08-31 12:35:23 +0100
committertiagonbotelho <tiagonbotelho@hotmail.com>2016-08-31 19:16:47 +0100
commit97b69862ad50936ad0700b23c485a38b637469a7 (patch)
tree5a5ecf4da4105b7c7b2f1da96d65594ab7704ac6
parent6c9c33f43e489d9e225bc64342c7d7d0a558b1e7 (diff)
downloadgitlab-ce-tag-name-filter.tar.gz
add specs for tags findertag-name-filter
-rw-r--r--app/controllers/projects/tags_controller.rb5
-rw-r--r--app/finders/tags_finder.rb29
-rw-r--r--app/views/projects/tags/index.html.haml5
-rw-r--r--spec/finders/tags_finder_spec.rb79
4 files changed, 115 insertions, 3 deletions
diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb
index 3e5de2e0d3e..6ea8ee62bc5 100644
--- a/app/controllers/projects/tags_controller.rb
+++ b/app/controllers/projects/tags_controller.rb
@@ -1,5 +1,6 @@
class Projects::TagsController < Projects::ApplicationController
include SortingHelper
+
# Authorize
before_action :require_non_empty_project
before_action :authorize_download_code!
@@ -7,7 +8,9 @@ class Projects::TagsController < Projects::ApplicationController
before_action :authorize_admin_project!, only: [:destroy]
def index
- @sort = params[:sort] || 'name'
+ params[:sort] = params[:sort].presence || 'name'
+
+ @sort = params[:sort]
@tags = TagsFinder.new(@repository, params).execute
@tags = Kaminari.paginate_array(@tags).page(params[:page])
diff --git a/app/finders/tags_finder.rb b/app/finders/tags_finder.rb
new file mode 100644
index 00000000000..b474f0805dc
--- /dev/null
+++ b/app/finders/tags_finder.rb
@@ -0,0 +1,29 @@
+class TagsFinder
+ def initialize(repository, params)
+ @repository = repository
+ @params = params
+ end
+
+ def execute
+ tags = @repository.tags_sorted_by(sort)
+ filter_by_name(tags)
+ end
+
+ private
+
+ def sort
+ @params[:sort].presence
+ end
+
+ def search
+ @params[:search].presence
+ end
+
+ def filter_by_name(tags)
+ if search
+ tags.select { |tag| tag.name.include?(search) }
+ else
+ tags
+ end
+ end
+end
diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml
index 31a023f24cf..6adbe9351dc 100644
--- a/app/views/projects/tags/index.html.haml
+++ b/app/views/projects/tags/index.html.haml
@@ -12,7 +12,8 @@
= search_field_tag :search, params[:search], { placeholder: 'Filter by tag name', id: 'tag-search', class: 'form-control search-text-input input-short', spellcheck: false }
.dropdown.inline
%button.dropdown-toggle.btn{ type: 'button', data: { toggle: 'dropdown'} }
- %span.light= @sort.humanize
+ %span.light
+ = @sort.humanize
%b.caret
%ul.dropdown-menu.dropdown-menu-align-right
%li
@@ -22,7 +23,7 @@
= sort_title_recently_updated
= link_to filter_tags_path(sort: sort_value_oldest_updated) do
= sort_title_oldest_updated
- - if can? current_user, :push_code, @project
+ - if can?(current_user, :push_code, @project)
= link_to new_namespace_project_tag_path(@project.namespace, @project), class: 'btn btn-create new-tag-btn' do
New tag
diff --git a/spec/finders/tags_finder_spec.rb b/spec/finders/tags_finder_spec.rb
new file mode 100644
index 00000000000..2ac810e478a
--- /dev/null
+++ b/spec/finders/tags_finder_spec.rb
@@ -0,0 +1,79 @@
+require 'spec_helper'
+
+describe TagsFinder do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+ let(:repository) { project.repository }
+
+ describe '#execute' do
+ context 'sort only' do
+ it 'sorts by name' do
+ tags_finder = described_class.new(repository, {})
+
+ result = tags_finder.execute
+
+ expect(result.first.name).to eq("v1.0.0")
+ end
+
+ it 'sorts by recently_updated' do
+ tags_finder = described_class.new(repository, { sort: 'updated_desc' })
+
+ result = tags_finder.execute
+ recently_updated_tag = repository.tags.max do |a, b|
+ repository.commit(a.target).committed_date <=> repository.commit(b.target).committed_date
+ end
+
+ expect(result.first.name).to eq(recently_updated_tag.name)
+ end
+
+ it 'sorts by last_updated' do
+ tags_finder = described_class.new(repository, { sort: 'updated_asc' })
+
+ result = tags_finder.execute
+
+ expect(result.first.name).to eq('v1.0.0')
+ end
+ end
+
+ context 'filter only' do
+ it 'filters tags by name' do
+ tags_finder = described_class.new(repository, { search: '1.0.0' })
+
+ result = tags_finder.execute
+
+ expect(result.first.name).to eq('v1.0.0')
+ expect(result.count).to eq(1)
+ end
+
+ it 'does not find any tags with that name' do
+ tags_finder = described_class.new(repository, { search: 'hey' })
+
+ result = tags_finder.execute
+
+ expect(result.count).to eq(0)
+ end
+ end
+
+ context 'filter and sort' do
+ it 'filters tags by name and sorts by recently_updated' do
+ params = { sort: 'updated_desc', search: 'v1' }
+ tags_finder = described_class.new(repository, params)
+
+ result = tags_finder.execute
+
+ expect(result.first.name).to eq('v1.1.0')
+ expect(result.count).to eq(2)
+ end
+
+ it 'filters tags by name and sorts by last_updated' do
+ params = { sort: 'updated_asc', search: 'v1' }
+ tags_finder = described_class.new(repository, params)
+
+ result = tags_finder.execute
+
+ expect(result.first.name).to eq('v1.0.0')
+ expect(result.count).to eq(2)
+ end
+ end
+ end
+end