summaryrefslogtreecommitdiff
path: root/spec/requests/api/bulk_imports_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/requests/api/bulk_imports_spec.rb')
-rw-r--r--spec/requests/api/bulk_imports_spec.rb200
1 files changed, 165 insertions, 35 deletions
diff --git a/spec/requests/api/bulk_imports_spec.rb b/spec/requests/api/bulk_imports_spec.rb
index 13f079c69e7..4fb4fbe6d5c 100644
--- a/spec/requests/api/bulk_imports_spec.rb
+++ b/spec/requests/api/bulk_imports_spec.rb
@@ -11,9 +11,26 @@ RSpec.describe API::BulkImports, feature_category: :importers do
let_it_be(:entity_3) { create(:bulk_import_entity, bulk_import: import_2) }
let_it_be(:failure_3) { create(:bulk_import_failure, entity: entity_3) }
+ before do
+ stub_application_setting(bulk_import_enabled: true)
+ end
+
+ shared_examples 'disabled feature' do
+ it 'returns 404' do
+ stub_application_setting(bulk_import_enabled: false)
+
+ request
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
describe 'GET /bulk_imports' do
+ let(:request) { get api('/bulk_imports', user), params: params }
+ let(:params) { {} }
+
it 'returns a list of bulk imports authored by the user' do
- get api('/bulk_imports', user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('id')).to contain_exactly(import_1.id, import_2.id)
@@ -21,26 +38,38 @@ RSpec.describe API::BulkImports, feature_category: :importers do
context 'sort parameter' do
it 'sorts by created_at descending by default' do
- get api('/bulk_imports', user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('id')).to eq([import_2.id, import_1.id])
end
- it 'sorts by created_at descending when explicitly specified' do
- get api('/bulk_imports', user), params: { sort: 'desc' }
+ context 'when explicitly specified' do
+ context 'when descending' do
+ let(:params) { { sort: 'desc' } }
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response.pluck('id')).to eq([import_2.id, import_1.id])
- end
+ it 'sorts by created_at descending' do
+ request
- it 'sorts by created_at ascending when explicitly specified' do
- get api('/bulk_imports', user), params: { sort: 'asc' }
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to match_array([import_2.id, import_1.id])
+ end
+ end
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response.pluck('id')).to eq([import_1.id, import_2.id])
+ context 'when ascending' do
+ let(:params) { { sort: 'asc' } }
+
+ it 'sorts by created_at ascending when explicitly specified' do
+ request
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to match_array([import_1.id, import_2.id])
+ end
+ end
end
end
+
+ include_examples 'disabled feature'
end
describe 'POST /bulk_imports' do
@@ -56,21 +85,10 @@ RSpec.describe API::BulkImports, feature_category: :importers do
end
end
- context 'when bulk_import feature flag is disabled' do
- before do
- stub_feature_flags(bulk_import: false)
- end
-
- it 'returns 404' do
- post api('/bulk_imports', user), params: {}
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
shared_examples 'starting a new migration' do
- it 'starts a new migration' do
- post api('/bulk_imports', user), params: {
+ let(:request) { post api('/bulk_imports', user), params: params }
+ let(:params) do
+ {
configuration: {
url: 'http://gitlab.example',
access_token: 'access_token'
@@ -83,11 +101,45 @@ RSpec.describe API::BulkImports, feature_category: :importers do
}.merge(destination_param)
]
}
+ end
+
+ it 'starts a new migration' do
+ request
expect(response).to have_gitlab_http_status(:created)
expect(json_response['status']).to eq('created')
end
+
+ describe 'migrate projects flag' do
+ context 'when true' do
+ it 'sets true' do
+ params[:entities][0][:migrate_projects] = true
+
+ request
+
+ expect(user.bulk_imports.last.entities.pluck(:migrate_projects)).to contain_exactly(true)
+ end
+ end
+
+ context 'when false' do
+ it 'sets false' do
+ params[:entities][0][:migrate_projects] = false
+
+ request
+
+ expect(user.bulk_imports.last.entities.pluck(:migrate_projects)).to contain_exactly(false)
+ end
+ end
+
+ context 'when unspecified' do
+ it 'sets true' do
+ request
+
+ expect(user.bulk_imports.last.entities.pluck(:migrate_projects)).to contain_exactly(true)
+ end
+ end
+ end
end
include_examples 'starting a new migration' do
@@ -99,8 +151,8 @@ RSpec.describe API::BulkImports, feature_category: :importers do
end
context 'when both destination_name & destination_slug are provided' do
- it 'returns a mutually exclusive error' do
- post api('/bulk_imports', user), params: {
+ let(:params) do
+ {
configuration: {
url: 'http://gitlab.example',
access_token: 'access_token'
@@ -115,6 +167,10 @@ RSpec.describe API::BulkImports, feature_category: :importers do
}
]
}
+ end
+
+ it 'returns a mutually exclusive error' do
+ request
expect(response).to have_gitlab_http_status(:bad_request)
@@ -123,8 +179,8 @@ RSpec.describe API::BulkImports, feature_category: :importers do
end
context 'when neither destination_name nor destination_slug is provided' do
- it 'returns at_least_one_of error' do
- post api('/bulk_imports', user), params: {
+ let(:params) do
+ {
configuration: {
url: 'http://gitlab.example',
access_token: 'access_token'
@@ -137,6 +193,10 @@ RSpec.describe API::BulkImports, feature_category: :importers do
}
]
}
+ end
+
+ it 'returns at_least_one_of error' do
+ request
expect(response).to have_gitlab_http_status(:bad_request)
@@ -144,9 +204,57 @@ RSpec.describe API::BulkImports, feature_category: :importers do
end
end
+ context 'when the source_full_path is invalid' do
+ it 'returns invalid error' do
+ params[:entities][0][:source_full_path] = 'http://example.com/full_path'
+
+ request
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq("entities[0][source_full_path] must be a relative path and not include protocol, sub-domain, " \
+ "or domain information. E.g. 'source/full/path' not 'https://example.com/source/full/path'")
+ end
+ end
+
+ context 'when the destination_namespace is invalid' do
+ it 'returns invalid error' do
+ params[:entities][0][:destination_namespace] = "?not a destination-namespace"
+
+ request
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq("entities[0][destination_namespace] cannot start with a dash or forward slash, " \
+ "or end with a period or forward slash. It can only contain alphanumeric " \
+ "characters, periods, underscores, forward slashes and dashes. " \
+ "E.g. 'destination_namespace' or 'destination/namespace'")
+ end
+ end
+
+ context 'when the destination_namespace is an empty string' do
+ it 'accepts the param and starts a new migration' do
+ params[:entities][0][:destination_namespace] = ''
+
+ request
+ expect(response).to have_gitlab_http_status(:created)
+
+ expect(json_response['status']).to eq('created')
+ end
+ end
+
+ context 'when the destination_slug is invalid' do
+ it 'returns invalid error' do
+ params[:entities][0][:destination_slug] = 'des?tin?atoi-slugg'
+
+ request
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to include("entities[0][destination_slug] cannot start with a dash " \
+ "or forward slash, or end with a period or forward slash. " \
+ "It can only contain alphanumeric characters, periods, underscores, and dashes. " \
+ "E.g. 'destination_namespace' not 'destination/namespace'")
+ end
+ end
+
context 'when provided url is blocked' do
- it 'returns blocked url error' do
- post api('/bulk_imports', user), params: {
+ let(:params) do
+ {
configuration: {
url: 'url',
access_token: 'access_token'
@@ -158,49 +266,71 @@ RSpec.describe API::BulkImports, feature_category: :importers do
destination_namespace: 'destination_namespace'
]
}
+ end
+
+ it 'returns blocked url error' do
+ request
expect(response).to have_gitlab_http_status(:unprocessable_entity)
expect(json_response['message']).to eq('Validation failed: Url is blocked: Only allowed schemes are http, https')
end
end
+
+ include_examples 'disabled feature'
end
describe 'GET /bulk_imports/entities' do
+ let(:request) { get api('/bulk_imports/entities', user) }
+
it 'returns a list of all import entities authored by the user' do
- get api('/bulk_imports/entities', user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('id')).to contain_exactly(entity_1.id, entity_2.id, entity_3.id)
end
+
+ include_examples 'disabled feature'
end
describe 'GET /bulk_imports/:id' do
+ let(:request) { get api("/bulk_imports/#{import_1.id}", user) }
+
it 'returns specified bulk import' do
- get api("/bulk_imports/#{import_1.id}", user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['id']).to eq(import_1.id)
end
+
+ include_examples 'disabled feature'
end
describe 'GET /bulk_imports/:id/entities' do
+ let(:request) { get api("/bulk_imports/#{import_2.id}/entities", user) }
+
it 'returns specified bulk import entities with failures' do
- get api("/bulk_imports/#{import_2.id}/entities", user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('id')).to contain_exactly(entity_3.id)
expect(json_response.first['failures'].first['exception_class']).to eq(failure_3.exception_class)
end
+
+ include_examples 'disabled feature'
end
describe 'GET /bulk_imports/:id/entities/:entity_id' do
+ let(:request) { get api("/bulk_imports/#{import_1.id}/entities/#{entity_2.id}", user) }
+
it 'returns specified bulk import entity' do
- get api("/bulk_imports/#{import_1.id}/entities/#{entity_2.id}", user)
+ request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['id']).to eq(entity_2.id)
end
+
+ include_examples 'disabled feature'
end
context 'when user is unauthenticated' do