gitlab-ce/spec/requests/api/group_placeholder_reassignm...

148 lines
4.6 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe API::GroupPlaceholderReassignments, feature_category: :importers do
include WorkhorseHelpers
let_it_be(:group_owner) { create(:user) }
let(:current_user) { group_owner }
let_it_be(:group) { create(:group, :public, owners: group_owner) }
let_it_be(:source_user) { create(:import_source_user, namespace: group) }
shared_examples 'it has authentication and authorization requirements' do
context 'when no token supplied' do
let(:current_user) { nil }
it 'returns 401' do
subject
expect(response).to have_gitlab_http_status(:unauthorized)
end
end
context 'when a non-group-owner token is supplied' do
let(:current_user) { build(:user) }
it 'returns 403' do
subject
expect(response).to have_gitlab_http_status(:forbidden)
end
end
end
describe 'GET /groups/:id/placeholder_reassignments' do
let(:url) { "/groups/#{group.id}/placeholder_reassignments" }
subject(:request_csv) { get api(url, current_user) }
it 'returns the CSV data' do
request_csv
expect(response).to have_gitlab_http_status(:ok)
expect(response.content_type).to eql('text/csv; charset=utf-8')
expect(response.headers['Content-Disposition'])
.to match(/^attachment; filename="placeholder_reassignments_for_group_\d+_\d+.csv"$/)
end
context 'when the CSV service returns an error' do
before do
allow_next_instance_of(Import::SourceUsers::GenerateCsvService) do |service|
allow(service).to receive(:execute).and_return(ServiceResponse.error(message: 'my error message'))
end
end
it 'passes the error along to the user' do
request_csv
expect(response).to have_gitlab_http_status(:unprocessable_entity)
expect(json_response['message']).to eq('my error message')
end
end
it_behaves_like 'it has authentication and authorization requirements'
end
describe 'POST /groups/:id/placeholder_reassignments/authorize' do
include_context 'workhorse headers'
let(:url) { "/groups/#{group.id}/placeholder_reassignments/authorize" }
subject(:make_request) { post api(url, current_user), headers: workhorse_headers }
it 'verifies file size limit' do
expect(::Import::PlaceholderReassignmentsUploader)
.to receive(:workhorse_authorize)
.with(a_hash_including(maximum_size: Gitlab::CurrentSettings.max_attachment_size.megabytes))
.and_call_original
make_request
end
it 'returns 200' do
make_request
expect(response).to have_gitlab_http_status(:ok)
end
it_behaves_like 'it has authentication and authorization requirements'
end
describe 'POST /groups/:id/placeholder_reassignments' do
include_context 'workhorse headers'
let(:url) { "/groups/#{group.id}/placeholder_reassignments" }
let(:file) { fixture_file_upload('spec/fixtures/import/user_mapping/user_mapping_upload.csv') }
subject(:make_request) { upload_reassignment_sheet(url, file, workhorse_headers, 'file.size': file.size) }
it 'returns 201' do
make_request
expect(response).to have_gitlab_http_status(:created)
expect(json_response['message'])
.to eq(s_('UserMapping|The file is being processed and you will receive an email when completed.'))
end
it_behaves_like 'it has authentication and authorization requirements'
context 'when the wrong filetype is uploaded' do
let(:file) { fixture_file_upload('spec/fixtures/dk.png') }
it 'rejects the request' do
make_request
expect(response).to have_gitlab_http_status(:unprocessable_entity)
expect(json_response['message']).to eq(s_('UserMapping|You must upload a CSV file with a .csv file extension.'))
end
end
context 'when the reassignment service responds with an error' do
before do
allow_next_instance_of(Import::SourceUsers::BulkReassignFromCsvService) do |service|
allow(service).to receive(:async_execute).and_return(ServiceResponse.error(message: 'my error message'))
end
end
it 'passes the error along to the user' do
make_request
expect(response).to have_gitlab_http_status(:unprocessable_entity)
expect(json_response['message']).to eq('my error message')
end
end
def upload_reassignment_sheet(url, file, headers = {}, params = {})
workhorse_finalize(
api(url, current_user),
method: :post,
file_key: :file,
params: params.merge(file: file),
headers: headers,
send_rewritten_field: true
)
end
end
end