diff options
Diffstat (limited to 'spec/controllers/projects/autocomplete_sources_controller_spec.rb')
-rw-r--r-- | spec/controllers/projects/autocomplete_sources_controller_spec.rb | 160 |
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 |