diff options
Diffstat (limited to 'qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb')
-rw-r--r-- | qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb b/qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb new file mode 100644 index 00000000000..e1d762f41cb --- /dev/null +++ b/qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +module QA + RSpec.shared_context( + 'with gitlab group migration', + :import, + :orchestrated, + requires_admin: 'creates a user via API' + ) do + let!(:import_wait_duration) { { max_duration: 120, sleep_interval: 2 } } + + # source instance objects + # + let!(:source_gitlab_address) { ENV["QA_IMPORT_SOURCE_URL"] || raise("QA_IMPORT_SOURCE_URL is required!") } + let!(:source_admin_api_client) do + Runtime::API::Client.new( + source_gitlab_address, + personal_access_token: Runtime::Env.admin_personal_access_token || raise("Admin access token missing!"), + is_new_session: false + ) + end + let!(:source_admin_user) do + Resource::User.fabricate_via_api! do |usr| + usr.api_client = source_admin_api_client + usr.username = Runtime::Env.admin_username || "root" + end.tap(&:set_public_email) + end + let!(:source_group) do + Resource::Sandbox.fabricate_via_api! do |group| + group.api_client = source_admin_api_client + group.path = "source-group-for-import-#{SecureRandom.hex(4)}" + group.avatar = File.new("qa/fixtures/designs/tanuki.jpg", "r") + end + end + + # target instance objects + # + let!(:admin_api_client) { Runtime::API::Client.as_admin } + let!(:admin_user) do + Resource::User.fabricate_via_api! do |usr| + usr.api_client = admin_api_client + usr.username = Runtime::Env.admin_username || "root" + end.tap(&:set_public_email) + end + let!(:user) do + Resource::User.fabricate_via_api! do |usr| + usr.api_client = admin_api_client + usr.username = "target-user-#{SecureRandom.hex(6)}" + end + end + let!(:api_client) { Runtime::API::Client.new(user: user) } + let!(:target_sandbox) do + Resource::Sandbox.fabricate_via_api! do |group| + group.api_client = admin_api_client + end + end + + let(:destination_group_path) { source_group.path } + let(:imported_group) do + Resource::BulkImportGroup.fabricate_via_api! do |group| + group.api_client = api_client + group.sandbox = target_sandbox + group.source_group = source_group + group.source_gitlab_address = source_gitlab_address + group.destination_group_path = destination_group_path + group.import_access_token = source_admin_api_client.personal_access_token + end + end + + let(:import_failures) do + imported_group.import_details.sum([]) { |details| details[:failures] } + end + + let(:cleanup!) {} + + def expect_group_import_finished_successfully + imported_group # trigger import + + status = nil + Support::Retrier.retry_until(**import_wait_duration, raise_on_failure: false) do + status = imported_group.import_status + %w[finished failed].include?(status) + end + + # finished status means success, all other statuses are considered to fail the test + expect(status).to eq('finished'), "Expected import to finish successfully, but status was: #{status}" + end + + before do + Runtime::ApplicationSettings.set_application_settings(bulk_import_enabled: true) + + target_sandbox.add_member(user, Resource::Members::AccessLevel::OWNER) + end + + after do |example| + # Checking for failures in the test currently makes test very flaky due to catching unrelated failures + # Log failures for easier debugging + Runtime::Logger.error("Import failures: #{import_failures}") if example.exception && !import_failures.empty? + rescue StandardError + # rescue when import did not happen at all and checking import failues will raise an error + ensure + # make sure cleanup runs last + cleanup! + end + end +end |