diff options
Diffstat (limited to 'spec/migrations/cleanup_group_import_states_with_null_user_id_spec.rb')
-rw-r--r-- | spec/migrations/cleanup_group_import_states_with_null_user_id_spec.rb | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/spec/migrations/cleanup_group_import_states_with_null_user_id_spec.rb b/spec/migrations/cleanup_group_import_states_with_null_user_id_spec.rb new file mode 100644 index 00000000000..f9285c857de --- /dev/null +++ b/spec/migrations/cleanup_group_import_states_with_null_user_id_spec.rb @@ -0,0 +1,101 @@ +# 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 |