From 0f87ae3be5d7d1bc0a3728f43ae0465005b68b92 Mon Sep 17 00:00:00 2001 From: Izaak Alpert Date: Thu, 24 Oct 2013 11:16:14 -0400 Subject: [PATCH] Allow searching by namespace name, include public projects --- app/contexts/search_context.rb | 10 ++++++---- app/models/project.rb | 2 +- spec/contexts/search_context_spec.rb | 27 +++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 spec/contexts/search_context_spec.rb diff --git a/app/contexts/search_context.rb b/app/contexts/search_context.rb index 48def07..221f07f 100644 --- a/app/contexts/search_context.rb +++ b/app/contexts/search_context.rb @@ -9,11 +9,14 @@ class SearchContext query = params[:search] return result unless query.present? - - projects = Project.where(id: project_ids) - result[:projects] = projects.search(query).limit(20) + result[:projects] = Project.where("projects.id in (?) OR projects.public = true", project_ids).search(query).limit(20) # Search inside single project + single_project_search(Project.where(id: project_ids), query) + result + end + + def single_project_search(projects, query) project = projects.first if projects.length == 1 if params[:search_code].present? @@ -23,7 +26,6 @@ class SearchContext result[:issues] = Issue.where(project_id: project_ids).search(query).order('updated_at DESC').limit(20) result[:wiki_pages] = [] end - result end def result diff --git a/app/models/project.rb b/app/models/project.rb index d2dcf26..6b8e54d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -122,7 +122,7 @@ class Project < ActiveRecord::Base end def search query - where("projects.name LIKE :query OR projects.path LIKE :query", query: "%#{query}%") + joins(:namespace).where("projects.name LIKE :query OR projects.path LIKE :query OR namespaces.name LIKE :query", query: "%#{query}%") end def find_with_namespace(id) diff --git a/spec/contexts/search_context_spec.rb b/spec/contexts/search_context_spec.rb new file mode 100644 index 0000000..58f747e --- /dev/null +++ b/spec/contexts/search_context_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe SearchContext do + let(:found_namespace) { create(:namespace, name: 'searchable namespace', path:'another_thing') } + let(:user) { create(:user, namespace: found_namespace) } + let!(:found_project) { create(:project, name: 'searchable_project', creator_id: user.id, namespace: found_namespace, public: false) } + + let(:unfound_namespace) { create(:namespace, name: 'unfound namespace', path: 'yet_something_else') } + let!(:unfound_project) { create(:project, name: 'unfound_project', creator_id: user.id, namespace: unfound_namespace, public: false) } + let(:public_namespace) { create(:namespace, path: 'something_else',name: 'searchable public namespace') } + let(:other_user) { create(:user, namespace: public_namespace) } + let!(:public_project) { create(:project, name: 'searchable_public_project', creator_id: other_user.id, namespace: public_namespace, public: true) } + + describe '#execute' do + it 'public projects should be searchable' do + context = SearchContext.new([found_project.id], {search_code: false, search: "searchable"}) + results = context.execute + results[:projects].should == [found_project, public_project] + end + + it 'namespace name should be searchable' do + context = SearchContext.new([found_project.id], {search_code: false, search: "searchable namespace"}) + results = context.execute + results[:projects].should == [found_project] + end + end +end -- libgit2 0.21.2