gitlab-org--gitlab-foss/spec/migrations/cleanup_group_import_states...

102 lines
4.8 KiB
Ruby

# frozen_string_literal: true
# In order to test the CleanupGroupImportStatesWithNullUserId migration, we need
# to first create GroupImportState with NULL user_id
# and then run the migration to check that user_id was populated or record removed
#
# The problem is that the CleanupGroupImportStatesWithNullUserId migration comes
# after the NOT NULL constraint has been added with a previous migration (AddNotNullConstraintToUserOnGroupImportStates)
# That means that while testing the current class we can not insert GroupImportState records with an
# invalid user_id as constraint is blocking it from doing so
#
# To solve this problem, use SchemaVersionFinder to set schema one version prior to AddNotNullConstraintToUserOnGroupImportStates
require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20200907092715_add_not_null_constraint_to_user_on_group_import_states.rb')
require Rails.root.join('db', 'post_migrate', '20200909161624_cleanup_group_import_states_with_null_user_id.rb')
RSpec.describe CleanupGroupImportStatesWithNullUserId, :migration,
schema: MigrationHelpers::SchemaVersionFinder.migration_prior(AddNotNullConstraintToUserOnGroupImportStates) do
let(:namespaces_table) { table(:namespaces) }
let(:users_table) { table(:users) }
let(:group_import_states_table) { table(:group_import_states) }
let(:members_table) { table(:members) }
describe 'Group import states clean up' do
context 'when user_id is present' do
it 'does not update group_import_state record' do
user_1 = users_table.create!(name: 'user1', email: 'user1@example.com', projects_limit: 1)
group_1 = namespaces_table.create!(name: 'group_1', path: 'group_1', type: 'Group')
create_member(user_id: user_1.id, type: 'GroupMember', source_type: 'Namespace', source_id: group_1.id, access_level: described_class::Group::OWNER)
group_import_state_1 = group_import_states_table.create!(group_id: group_1.id, user_id: user_1.id, status: 0)
expect(group_import_state_1.user_id).to eq(user_1.id)
disable_migrations_output { migrate! }
expect(group_import_state_1.reload.user_id).to eq(user_1.id)
end
end
context 'when user_id is missing' do
it 'updates user_id with group default owner id' do
user_2 = users_table.create!(name: 'user2', email: 'user2@example.com', projects_limit: 1)
group_2 = namespaces_table.create!(name: 'group_2', path: 'group_2', type: 'Group')
create_member(user_id: user_2.id, type: 'GroupMember', source_type: 'Namespace', source_id: group_2.id, access_level: described_class::Group::OWNER)
group_import_state_2 = group_import_states_table.create!(group_id: group_2.id, user_id: nil, status: 0)
disable_migrations_output { migrate! }
expect(group_import_state_2.reload.user_id).to eq(user_2.id)
end
end
context 'when group does not contain any owners' do
it 'removes group_import_state record' do
group_3 = namespaces_table.create!(name: 'group_3', path: 'group_3', type: 'Group')
group_import_state_3 = group_import_states_table.create!(group_id: group_3.id, user_id: nil, status: 0)
disable_migrations_output { migrate! }
expect { group_import_state_3.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
end
context 'when group has parent' do
it 'updates user_id with parent group default owner id' do
user = users_table.create!(name: 'user4', email: 'user4@example.com', projects_limit: 1)
group_1 = namespaces_table.create!(name: 'group_1', path: 'group_1', type: 'Group')
create_member(user_id: user.id, type: 'GroupMember', source_type: 'Namespace', source_id: group_1.id, access_level: described_class::Group::OWNER)
group_2 = namespaces_table.create!(name: 'group_2', path: 'group_2', type: 'Group', parent_id: group_1.id)
group_import_state = group_import_states_table.create!(group_id: group_2.id, user_id: nil, status: 0)
disable_migrations_output { migrate! }
expect(group_import_state.reload.user_id).to eq(user.id)
end
end
context 'when group has owner_id' do
it 'updates user_id with owner_id' do
user = users_table.create!(name: 'user', email: 'user@example.com', projects_limit: 1)
group = namespaces_table.create!(name: 'group', path: 'group', type: 'Group', owner_id: user.id)
group_import_state = group_import_states_table.create!(group_id: group.id, user_id: nil, status: 0)
disable_migrations_output { migrate! }
expect(group_import_state.reload.user_id).to eq(user.id)
end
end
end
def create_member(options)
members_table.create!(
{
notification_level: 0,
ldap: false,
override: false
}.merge(options)
)
end
end