summaryrefslogtreecommitdiff
path: root/spec/controllers/projects/autocomplete_sources_controller_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/controllers/projects/autocomplete_sources_controller_spec.rb')
-rw-r--r--spec/controllers/projects/autocomplete_sources_controller_spec.rb160
1 files changed, 121 insertions, 39 deletions
diff --git a/spec/controllers/projects/autocomplete_sources_controller_spec.rb b/spec/controllers/projects/autocomplete_sources_controller_spec.rb
index 7077aae6b45..70178083e71 100644
--- a/spec/controllers/projects/autocomplete_sources_controller_spec.rb
+++ b/spec/controllers/projects/autocomplete_sources_controller_spec.rb
@@ -4,10 +4,14 @@ require 'spec_helper'
RSpec.describe Projects::AutocompleteSourcesController do
let_it_be(:group, reload: true) { create(:group) }
+ let_it_be(:private_group) { create(:group, :private) }
let_it_be(:project) { create(:project, namespace: group) }
let_it_be(:public_project) { create(:project, :public, group: group) }
let_it_be(:development) { create(:label, project: project, name: 'Development') }
- let_it_be(:issue) { create(:labeled_issue, project: project, labels: [development]) }
+ let_it_be(:private_issue) { create(:labeled_issue, project: project, labels: [development]) }
+ let_it_be(:private_work_item) { create(:work_item, project: project) }
+ let_it_be(:issue) { create(:labeled_issue, project: public_project, labels: [development]) }
+ let_it_be(:work_item) { create(:work_item, project: public_project, id: 1, iid: 100) }
let_it_be(:user) { create(:user) }
def members_by_username(username)
@@ -22,7 +26,7 @@ RSpec.describe Projects::AutocompleteSourcesController do
context 'with a public project' do
shared_examples 'issuable commands' do
it 'returns empty array when no user logged in' do
- get :commands, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type, type_id: issuable_iid }
+ get :commands, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq([])
@@ -52,6 +56,13 @@ RSpec.describe Projects::AutocompleteSourcesController do
it_behaves_like 'issuable commands'
end
+ context 'with work items' do
+ let(:issuable_type) { work_item.class.name }
+ let(:issuable_iid) { work_item.iid }
+
+ it_behaves_like 'issuable commands'
+ end
+
context 'with merge request' do
let(:merge_request) { create(:merge_request, target_project: public_project, source_project: public_project) }
let(:issuable_type) { merge_request.class.name }
@@ -68,24 +79,49 @@ RSpec.describe Projects::AutocompleteSourcesController do
sign_in(user)
end
- it 'raises an error when no target type specified' do
- expect { get :labels, format: :json, params: { namespace_id: group.path, project_id: project.path } }
- .to raise_error(ActionController::ParameterMissing)
+ shared_examples 'label commands' do
+ it 'raises an error when no target type specified' do
+ expect { get :labels, format: :json, params: { namespace_id: group.path, project_id: project.path } }
+ .to raise_error(ActionController::ParameterMissing)
+ end
+
+ it 'returns an array of labels' do
+ get :labels, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issuable_type }
+
+ expect(json_response).to be_a(Array)
+ expect(json_response.count).to eq(1)
+ expect(json_response[0]['title']).to eq('Development')
+ end
+ end
+
+ context 'with issues' do
+ let(:issuable_type) { issue.class.name }
+ let(:issuable_iid) { issue.iid }
+
+ it_behaves_like 'label commands'
end
- it 'returns an array of labels' do
- get :labels, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issue.class.name, type_id: issue.id }
+ context 'with work items' do
+ let(:issuable_type) { work_item.class.name }
+ let(:issuable_iid) { work_item.iid }
- expect(json_response).to be_a(Array)
- expect(json_response.count).to eq(1)
- expect(json_response[0]['title']).to eq('Development')
+ it_behaves_like 'label commands'
end
end
describe 'GET members' do
+ let_it_be(:invited_private_member) { create(:user) }
+ let_it_be(:issue) { create(:labeled_issue, project: public_project, labels: [development], author: user) }
+ let_it_be(:work_item) { create(:work_item, project: public_project, author: user) }
+
+ before_all do
+ create(:project_group_link, group: private_group, project: public_project)
+ group.add_owner(user)
+ private_group.add_developer(invited_private_member)
+ end
+
context 'when logged in' do
before do
- group.add_owner(user)
sign_in(user)
end
@@ -94,42 +130,88 @@ RSpec.describe Projects::AutocompleteSourcesController do
.to raise_error(ActionController::ParameterMissing)
end
- it 'returns an array of member object' do
- get :members, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issue.class.name, type_id: issue.id }
+ shared_examples 'all members are returned' do
+ it 'returns an array of member object' do
+ get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
+
+ expect(members_by_username('all').symbolize_keys).to include(
+ username: 'all',
+ name: 'All Project and Group Members',
+ count: 2)
+
+ expect(members_by_username(group.full_path).symbolize_keys).to include(
+ type: group.class.name,
+ name: group.full_name,
+ avatar_url: group.avatar_url,
+ count: 1)
+
+ expect(members_by_username(user.username).symbolize_keys).to include(
+ type: user.class.name,
+ name: user.name,
+ avatar_url: user.avatar_url)
+
+ expect(members_by_username(invited_private_member.username).symbolize_keys).to include(
+ type: invited_private_member.class.name,
+ name: invited_private_member.name,
+ avatar_url: invited_private_member.avatar_url)
+ end
+ end
- expect(members_by_username('all').symbolize_keys).to include(
- username: 'all',
- name: 'All Project and Group Members',
- count: 1)
+ context 'with issue' do
+ let(:issuable_type) { issue.class.name }
- expect(members_by_username(group.full_path).symbolize_keys).to include(
- type: group.class.name,
- name: group.full_name,
- avatar_url: group.avatar_url,
- count: 1)
+ it_behaves_like 'all members are returned'
+ end
- expect(members_by_username(user.username).symbolize_keys).to include(
- type: user.class.name,
- name: user.name,
- avatar_url: user.avatar_url)
+ context 'with work item' do
+ let(:issuable_type) { work_item.class.name }
+
+ it_behaves_like 'all members are returned'
end
end
context 'when anonymous' do
- it 'redirects to login page' do
- get :members, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issue.class.name, type_id: issue.id }
+ shared_examples 'private project is inaccessible' do
+ it 'redirects to login page for private project' do
+ get :members, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issuable_type }
- expect(response).to redirect_to new_user_session_path
+ expect(response).to redirect_to new_user_session_path
+ end
end
- context 'with public project' do
- it 'returns no members' do
- get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issue.class.name, type_id: issue.id }
+ shared_examples 'only public members are returned for public project' do
+ it 'only returns public members' do
+ get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to be_a(Array)
- expect(json_response.count).to eq(1)
- expect(json_response.first['count']).to eq(0)
+ expect(members_by_username('all').symbolize_keys).to include(
+ username: 'all',
+ name: 'All Project and Group Members',
+ count: 1)
+
+ expect(members_by_username(user.username).symbolize_keys).to include(
+ type: user.class.name,
+ name: user.name,
+ avatar_url: user.avatar_url)
+ end
+ end
+
+ context 'with issue' do
+ it_behaves_like 'private project is inaccessible' do
+ let(:issuable_type) { private_issue.class.name }
+ end
+
+ it_behaves_like 'only public members are returned for public project' do
+ let(:issuable_type) { issue.class.name }
+ end
+ end
+
+ context 'with work item' do
+ it_behaves_like 'private project is inaccessible' do
+ let(:issuable_type) { private_work_item.class.name }
+ end
+
+ it_behaves_like 'only public members are returned for public project' do
+ let(:issuable_type) { work_item.class.name }
end
end
end
@@ -184,7 +266,7 @@ RSpec.describe Projects::AutocompleteSourcesController do
it 'lists contacts' do
group.add_developer(user)
- get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issue.class.name, type_id: issue.id }
+ get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issue.class.name }
emails = json_response.map { |contact_data| contact_data["email"] }
expect(emails).to match_array([contact_1.email, contact_2.email])
@@ -193,7 +275,7 @@ RSpec.describe Projects::AutocompleteSourcesController do
context 'when a user can not read contacts' do
it 'renders 404' do
- get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issue.class.name, type_id: issue.id }
+ get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issue.class.name }
expect(response).to have_gitlab_http_status(:not_found)
end
@@ -204,7 +286,7 @@ RSpec.describe Projects::AutocompleteSourcesController do
it 'renders 404' do
group.add_developer(user)
- get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issue.class.name, type_id: issue.id }
+ get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path, type: issue.class.name }
expect(response).to have_gitlab_http_status(:not_found)
end