diff --git a/app/contexts/search_context.rb b/app/contexts/search_context.rb index c07fdfe4c39a6021745d93ef19508a045fbd3ff3..2f9438f6bb4a4346cf8566a793e891d3949a27dd 100644 --- a/app/contexts/search_context.rb +++ b/app/contexts/search_context.rb @@ -10,11 +10,14 @@ class SearchContext query = Shellwords.shellescape(query) if query.present? 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? @@ -24,7 +27,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 d2dcf26ac69bec0749db92ed6de9f4e43dc3f3a1..6b8e54d5b22d0e930750f76ec77699487f61d33f 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 0000000000000000000000000000000000000000..58f747e87252f872912d7e282dbfbf919b783bca --- /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