Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/helpers/search_helper_spec.rb')
-rw-r--r--spec/helpers/search_helper_spec.rb284
1 files changed, 246 insertions, 38 deletions
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index 2cea577a852..b2606fcfae1 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -60,17 +60,10 @@ RSpec.describe SearchHelper, feature_category: :global_search do
expect(search_autocomplete_opts(project.name).size).to eq(1)
end
- context 'for users' do
+ shared_examples 'for users' do
let_it_be(:another_user) { create(:user, name: 'Jane Doe') }
let(:term) { 'jane' }
- it 'makes a call to SearchService' do
- params = { search: term, per_page: 5, scope: 'users' }
- expect(SearchService).to receive(:new).with(current_user, params).and_call_original
-
- search_autocomplete_opts(term)
- end
-
it 'returns users matching the term' do
result = search_autocomplete_opts(term)
expect(result.size).to eq(1)
@@ -88,6 +81,68 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
end
+ describe 'permissions' do
+ let(:term) { 'jane@doe' }
+ let(:private_email_user) { create(:user, email: term) }
+ let(:public_email_user) { create(:user, :public_email, email: term) }
+ let(:banned_user) { create(:user, :banned, email: term) }
+ let(:user_with_other_email) { create(:user, email: 'something@else') }
+ let(:secondary_email) { create(:email, :confirmed, user: user_with_other_email, email: term) }
+ let(:ids) { search_autocomplete_opts(term).pluck(:id) }
+
+ context 'when current_user is an admin' do
+ before do
+ allow(current_user).to receive(:can_admin_all_resources?).and_return(true)
+ end
+
+ it 'includes users with matching public emails' do
+ public_email_user
+ expect(ids).to include(public_email_user.id)
+ end
+
+ it 'includes users in forbidden states' do
+ banned_user
+ expect(ids).to include(banned_user.id)
+ end
+
+ it 'includes users without matching public emails but with matching private emails' do
+ private_email_user
+ expect(ids).to include(private_email_user.id)
+ end
+
+ it 'includes users matching on secondary email' do
+ secondary_email
+ expect(ids).to include(secondary_email.user_id)
+ end
+ end
+
+ context 'when current_user is not an admin' do
+ before do
+ allow(current_user).to receive(:can_admin_all_resources?).and_return(false)
+ end
+
+ it 'includes users with matching public emails' do
+ public_email_user
+ expect(ids).to include(public_email_user.id)
+ end
+
+ it 'does not include users in forbidden states' do
+ banned_user
+ expect(ids).not_to include(banned_user.id)
+ end
+
+ it 'does not include users without matching public emails but with matching private emails' do
+ private_email_user
+ expect(ids).not_to include(private_email_user.id)
+ end
+
+ it 'does not include users matching on secondary email' do
+ secondary_email
+ expect(ids).not_to include(secondary_email.user_id)
+ end
+ end
+ end
+
context 'with limiting' do
let!(:users) { create_list(:user, 6, name: 'Jane Doe') }
@@ -98,6 +153,16 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
end
+ [true, false].each do |enabled|
+ context "with feature flag autcomplete_users_use_search_service #{enabled}" do
+ before do
+ stub_feature_flags(autocomplete_users_use_search_service: enabled)
+ end
+
+ include_examples 'for users'
+ end
+ end
+
it "includes the required project attrs" do
project = create(:project, namespace: create(:namespace, owner: user))
result = search_autocomplete_opts(project.name).first
@@ -268,12 +333,23 @@ RSpec.describe SearchHelper, feature_category: :global_search do
expect(results.first).to include({
category: 'In this project',
id: issue.id,
- label: 'test title (#1)',
+ label: "test title (##{issue.iid})",
url: ::Gitlab::Routing.url_helpers.project_issue_path(issue.project, issue),
avatar_url: '' # project has no avatar
})
end
end
+
+ context 'with a search scope' do
+ let(:term) { 'bla' }
+ let(:scope) { 'project' }
+
+ it 'returns scoped resource results' do
+ expect(self).to receive(:resource_results).with(term, scope: scope).and_return([])
+
+ search_autocomplete_opts(term, filter: :search, scope: scope)
+ end
+ end
end
end
@@ -306,8 +382,98 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
end
+ describe 'resource_results' do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:user) { create(:user, name: 'User') }
+ let_it_be(:group) { create(:group, name: 'Group') }
+ let_it_be(:project) { create(:project, name: 'Project') }
+ let!(:issue) { create(:issue, project: project) }
+ let(:issue_iid) { "\##{issue.iid}" }
+
+ before do
+ allow(self).to receive(:current_user).and_return(user)
+ group.add_owner(user)
+ project.add_owner(user)
+ @project = project
+ end
+
+ where(:term, :size, :category) do
+ 'g' | 0 | 'Groups'
+ 'gr' | 1 | 'Groups'
+ 'gro' | 1 | 'Groups'
+ 'p' | 0 | 'Projects'
+ 'pr' | 1 | 'Projects'
+ 'pro' | 1 | 'Projects'
+ 'u' | 0 | 'Users'
+ 'us' | 1 | 'Users'
+ 'use' | 1 | 'Users'
+ ref(:issue_iid) | 1 | 'In this project'
+ end
+
+ with_them do
+ it 'returns results only if the term is more than or equal to Gitlab::Search::Params::MIN_TERM_LENGTH' do
+ results = resource_results(term)
+
+ expect(results.size).to eq(size)
+ expect(results.first[:category]).to eq(category) if size == 1
+ end
+ end
+
+ context 'with a search scope' do
+ let(:term) { 'bla' }
+ let(:scope) { 'project' }
+
+ it 'returns only scope-specific results' do
+ expect(self).to receive(:scope_specific_results).with(term, scope).and_return([])
+ expect(self).not_to receive(:groups_autocomplete)
+ expect(self).not_to receive(:projects_autocomplete)
+ expect(self).not_to receive(:users_autocomplete)
+ expect(self).not_to receive(:issue_autocomplete)
+
+ resource_results(term, scope: scope)
+ end
+ end
+ end
+
+ describe 'scope_specific_results' do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:user) { create(:user, name: 'Searched') }
+ let_it_be(:project) { create(:project, name: 'Searched') }
+ let_it_be(:issue) { create(:issue, title: 'Searched', project: project) }
+
+ before do
+ allow(self).to receive(:current_user).and_return(user)
+ allow_next_instance_of(Gitlab::Search::RecentIssues) do |recent_issues|
+ allow(recent_issues).to receive(:search).and_return([issue])
+ end
+ project.add_developer(user)
+ end
+
+ where(:scope, :category) do
+ 'user' | 'Users'
+ 'project' | 'Projects'
+ 'issue' | 'Recent issues'
+ end
+
+ with_them do
+ it 'returns results only for the specific scope' do
+ results = scope_specific_results('sea', scope)
+ expect(results.size).to eq(1)
+ expect(results.first[:category]).to eq(category)
+ end
+ end
+
+ context 'when scope is unknown' do
+ it 'does not return any results' do
+ expect(scope_specific_results('sea', 'other')).to eq([])
+ end
+ end
+ end
+
describe 'projects_autocomplete' do
- let_it_be(:user) { create(:user, name: "madelein") }
+ let_it_be(:user) { create(:user) }
let_it_be(:project_1) { create(:project, name: 'test 1') }
let_it_be(:project_2) { create(:project, name: 'test 2') }
let(:search_term) { 'test' }
@@ -578,7 +744,7 @@ RSpec.describe SearchHelper, feature_category: :global_search do
@project = :some_project
expect(self).to receive(:project_search_tabs?)
- .with(:members)
+ .with(:users)
.and_return(:value)
end
@@ -711,22 +877,38 @@ RSpec.describe SearchHelper, feature_category: :global_search do
allow(self).to receive(:current_user).and_return(:the_current_user)
end
- where(:confidential, :expected) do
+ where(:input, :expected) do
'0' | false
'1' | true
'yes' | true
'no' | false
+ 'true' | true
+ 'false' | false
true | true
false | false
end
- let(:params) { { confidential: confidential } }
+ describe 'for confidential' do
+ let(:params) { { confidential: input } }
- with_them do
- it 'transforms confidentiality param' do
- expect(::SearchService).to receive(:new).with(:the_current_user, { confidential: expected })
+ with_them do
+ it 'transforms param' do
+ expect(::SearchService).to receive(:new).with(:the_current_user, { confidential: expected })
- subject
+ subject
+ end
+ end
+ end
+
+ describe 'for include_archived' do
+ let(:params) { { include_archived: input } }
+
+ with_them do
+ it 'transforms param' do
+ expect(::SearchService).to receive(:new).with(:the_current_user, { include_archived: expected })
+
+ subject
+ end
end
end
end
@@ -989,15 +1171,20 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
context 'issues' do
- where(:project_search_tabs, :global_search_issues_tab, :condition) do
- false | false | false
- false | true | true
- true | false | true
- true | true | true
+ where(:project_search_tabs, :global_search_issues_tab, :global_project, :condition) do
+ false | false | nil | false
+ false | true | nil | true
+ false | true | ref(:project) | false
+ false | false | ref(:project) | false
+ true | false | nil | true
+ true | true | nil | true
+ true | false | ref(:project) | true
+ true | true | ref(:project) | true
end
with_them do
it 'data item condition is set correctly' do
+ @project = global_project
allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_issues_tab).and_return(global_search_issues_tab)
allow(self).to receive(:project_search_tabs?).with(:issues).and_return(project_search_tabs)
@@ -1007,15 +1194,20 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
context 'merge requests' do
- where(:project_search_tabs, :feature_flag_tab_enabled, :condition) do
- false | false | false
- true | false | true
- false | true | true
- true | true | true
+ where(:project_search_tabs, :feature_flag_tab_enabled, :global_project, :condition) do
+ false | false | nil | false
+ true | false | nil | true
+ false | false | ref(:project) | false
+ true | false | ref(:project) | true
+ false | true | nil | true
+ true | true | nil | true
+ false | true | ref(:project) | false
+ true | true | ref(:project) | true
end
with_them do
it 'data item condition is set correctly' do
+ @project = global_project
allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_merge_requests_tab).and_return(feature_flag_tab_enabled)
allow(self).to receive(:project_search_tabs?).with(:merge_requests).and_return(project_search_tabs)
@@ -1028,7 +1220,9 @@ RSpec.describe SearchHelper, feature_category: :global_search do
where(:global_search_wiki_tab, :show_elasticsearch_tabs, :global_project, :project_search_tabs, :condition) do
false | false | nil | true | true
false | false | nil | false | false
+ false | false | ref(:project) | false | false
false | true | nil | false | false
+ false | true | ref(:project) | false | false
true | false | nil | false | false
true | true | ref(:project) | false | false
end
@@ -1038,7 +1232,7 @@ RSpec.describe SearchHelper, feature_category: :global_search do
@project = global_project
allow(search_service).to receive(:show_elasticsearch_tabs?).and_return(show_elasticsearch_tabs)
allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_wiki_tab).and_return(global_search_wiki_tab)
- allow(self).to receive(:project_search_tabs?).with(:wiki).and_return(project_search_tabs)
+ allow(self).to receive(:project_search_tabs?).with(:wiki_blobs).and_return(project_search_tabs)
expect(search_navigation[:wiki_blobs][:condition]).to eq(condition)
end
@@ -1048,9 +1242,12 @@ RSpec.describe SearchHelper, feature_category: :global_search do
context 'commits' do
where(:global_search_commits_tab, :show_elasticsearch_tabs, :global_project, :project_search_tabs, :condition) do
false | false | nil | true | true
+ false | false | ref(:project) | true | true
false | false | nil | false | false
+ false | true | ref(:project) | false | false
false | true | nil | false | false
true | false | nil | false | false
+ true | false | ref(:project) | false | false
true | true | ref(:project) | false | false
true | true | nil | false | true
end
@@ -1068,15 +1265,20 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
context 'comments' do
- where(:project_search_tabs, :show_elasticsearch_tabs, :condition) do
- true | true | true
- false | false | false
- false | true | true
- true | false | true
+ where(:project_search_tabs, :show_elasticsearch_tabs, :global_project, :condition) do
+ true | true | nil | true
+ true | true | ref(:project) | true
+ false | false | nil | false
+ false | false | ref(:project) | false
+ false | true | nil | true
+ false | true | ref(:project) | false
+ true | false | nil | true
+ true | false | ref(:project) | true
end
with_them do
it 'data item condition is set correctly' do
+ @project = global_project
allow(search_service).to receive(:show_elasticsearch_tabs?).and_return(show_elasticsearch_tabs)
allow(self).to receive(:project_search_tabs?).with(:notes).and_return(project_search_tabs)
@@ -1119,16 +1321,22 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
context 'snippet_titles' do
- where(:global_project, :global_show_snippets, :condition) do
- ref(:project) | true | false
- nil | false | false
- ref(:project) | false | false
- nil | true | true
+ where(:global_project, :global_show_snippets, :global_feature_flag_enabled, :condition) do
+ ref(:project) | true | false | false
+ nil | false | false | false
+ ref(:project) | false | false | false
+ nil | true | false | false
+ ref(:project) | true | true | false
+ nil | false | true | false
+ ref(:project) | false | true | false
+ nil | true | true | true
end
with_them do
it 'data item condition is set correctly' do
allow(search_service).to receive(:show_snippets?).and_return(global_show_snippets)
+ allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_snippet_titles_tab)
+ .and_return(global_feature_flag_enabled)
@project = global_project
expect(search_navigation[:snippet_titles][:condition]).to eq(condition)