diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-18 23:02:30 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-18 23:02:30 +0300 |
commit | 41fe97390ceddf945f3d967b8fdb3de4c66b7dea (patch) | |
tree | 9c8d89a8624828992f06d892cd2f43818ff5dcc8 /spec/migrations | |
parent | 0804d2dc31052fb45a1efecedc8e06ce9bc32862 (diff) |
Add latest changes from gitlab-org/gitlab@14-9-stable-eev14.9.0-rc42
Diffstat (limited to 'spec/migrations')
18 files changed, 516 insertions, 12 deletions
diff --git a/spec/migrations/20210805192450_update_trial_plans_ci_daily_pipeline_schedule_triggers_spec.rb b/spec/migrations/20210805192450_update_trial_plans_ci_daily_pipeline_schedule_triggers_spec.rb index 0b2f76baf1a..b1885b96adb 100644 --- a/spec/migrations/20210805192450_update_trial_plans_ci_daily_pipeline_schedule_triggers_spec.rb +++ b/spec/migrations/20210805192450_update_trial_plans_ci_daily_pipeline_schedule_triggers_spec.rb @@ -16,7 +16,7 @@ RSpec.describe UpdateTrialPlansCiDailyPipelineScheduleTriggers, :migration do context 'when the environment is dev or com' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return(true) + allow(Gitlab).to receive(:com?).and_return(true) end it 'sets the trial plan limits for ci_daily_pipeline_schedule_triggers' do @@ -57,7 +57,7 @@ RSpec.describe UpdateTrialPlansCiDailyPipelineScheduleTriggers, :migration do context 'when the environment is anything other than dev or com' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return(false) + allow(Gitlab).to receive(:com?).and_return(false) end it 'does not update the plan limits' do @@ -75,7 +75,7 @@ RSpec.describe UpdateTrialPlansCiDailyPipelineScheduleTriggers, :migration do context 'when the environment is dev or com' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return(true) + allow(Gitlab).to receive(:com?).and_return(true) end it 'sets the trial plan limits ci_daily_pipeline_schedule_triggers to zero' do @@ -116,7 +116,7 @@ RSpec.describe UpdateTrialPlansCiDailyPipelineScheduleTriggers, :migration do context 'when the environment is anything other than dev or com' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return(false) + allow(Gitlab).to receive(:com?).and_return(false) end it 'does not change the ultimate trial plan limits' do diff --git a/spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb b/spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb new file mode 100644 index 00000000000..f734456b0b6 --- /dev/null +++ b/spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration!('remove_duplicate_project_authorizations') + +RSpec.describe RemoveDuplicateProjectAuthorizations, :migration do + let(:users) { table(:users) } + let(:namespaces) { table(:namespaces) } + let(:projects) { table(:projects) } + let(:project_authorizations) { table(:project_authorizations) } + + let!(:user_1) { users.create! email: 'user1@example.com', projects_limit: 0 } + let!(:user_2) { users.create! email: 'user2@example.com', projects_limit: 0 } + let!(:namespace_1) { namespaces.create! name: 'namespace 1', path: 'namespace1' } + let!(:namespace_2) { namespaces.create! name: 'namespace 2', path: 'namespace2' } + let!(:project_1) { projects.create! namespace_id: namespace_1.id } + let!(:project_2) { projects.create! namespace_id: namespace_2.id } + + before do + stub_const("#{described_class.name}::BATCH_SIZE", 2) + end + + describe '#up' do + subject { migrate! } + + context 'User with multiple projects' do + before do + project_authorizations.create! project_id: project_1.id, user_id: user_1.id, access_level: Gitlab::Access::DEVELOPER + project_authorizations.create! project_id: project_2.id, user_id: user_1.id, access_level: Gitlab::Access::DEVELOPER + end + + it { expect { subject }.not_to change { ProjectAuthorization.count } } + end + + context 'Project with multiple users' do + before do + project_authorizations.create! project_id: project_1.id, user_id: user_1.id, access_level: Gitlab::Access::DEVELOPER + project_authorizations.create! project_id: project_1.id, user_id: user_2.id, access_level: Gitlab::Access::DEVELOPER + end + + it { expect { subject }.not_to change { ProjectAuthorization.count } } + end + + context 'Same project and user but different access level' do + before do + project_authorizations.create! project_id: project_1.id, user_id: user_1.id, access_level: Gitlab::Access::DEVELOPER + project_authorizations.create! project_id: project_1.id, user_id: user_1.id, access_level: Gitlab::Access::MAINTAINER + project_authorizations.create! project_id: project_1.id, user_id: user_1.id, access_level: Gitlab::Access::REPORTER + end + + it { expect { subject }.to change { ProjectAuthorization.count}.from(3).to(1) } + + it 'retains the highest access level' do + subject + + all_records = ProjectAuthorization.all.to_a + expect(all_records.count).to eq 1 + expect(all_records.first.access_level).to eq Gitlab::Access::MAINTAINER + end + end + end +end diff --git a/spec/migrations/20220204194347_encrypt_integration_properties_spec.rb b/spec/migrations/20220204194347_encrypt_integration_properties_spec.rb new file mode 100644 index 00000000000..78e3b43ff76 --- /dev/null +++ b/spec/migrations/20220204194347_encrypt_integration_properties_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'spec_helper' + +require_migration! + +RSpec.describe EncryptIntegrationProperties, :migration, schema: 20220204193000 do + subject(:migration) { described_class.new } + + let(:integrations) { table(:integrations) } + + before do + stub_const("#{described_class.name}::BATCH_SIZE", 2) + end + + it 'correctly schedules background migrations', :aggregate_failures do + # update required + record1 = integrations.create!(properties: some_props) + record2 = integrations.create!(properties: some_props) + record3 = integrations.create!(properties: some_props) + record4 = integrations.create!(properties: nil) + record5 = integrations.create!(properties: nil) + + Sidekiq::Testing.fake! do + freeze_time do + migrate! + + expect(described_class::MIGRATION).to be_scheduled_migration(record1.id, record2.id) + expect(described_class::MIGRATION).to be_scheduled_migration(record3.id, record4.id) + expect(described_class::MIGRATION).to be_scheduled_migration(record5.id, record5.id) + + expect(BackgroundMigrationWorker.jobs.size).to eq(3) + end + end + end + + def some_props + { iid: generate(:iid), url: generate(:url), username: generate(:username) }.to_json + end +end diff --git a/spec/migrations/20220208080921_schedule_migrate_personal_namespace_project_maintainer_to_owner_spec.rb b/spec/migrations/20220208080921_schedule_migrate_personal_namespace_project_maintainer_to_owner_spec.rb new file mode 100644 index 00000000000..41f3476dea8 --- /dev/null +++ b/spec/migrations/20220208080921_schedule_migrate_personal_namespace_project_maintainer_to_owner_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe ScheduleMigratePersonalNamespaceProjectMaintainerToOwner do + let_it_be(:migration) { described_class::MIGRATION } + + describe '#up' do + it 'schedules background jobs for each batch of members' do + migrate! + + expect(migration).to have_scheduled_batched_migration( + table_name: :members, + column_name: :id, + interval: described_class::INTERVAL + ) + end + end +end diff --git a/spec/migrations/20220222192524_create_not_null_constraint_releases_tag_spec.rb b/spec/migrations/20220222192524_create_not_null_constraint_releases_tag_spec.rb new file mode 100644 index 00000000000..bd7d992240a --- /dev/null +++ b/spec/migrations/20220222192524_create_not_null_constraint_releases_tag_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +require 'spec_helper' +require_migration! + +RSpec.describe CreateNotNullConstraintReleasesTag do + let_it_be(:releases) { table(:releases) } + let_it_be(:migration) { described_class.new } + + before do + allow(migration).to receive(:transaction_open?).and_return(false) + allow(migration).to receive(:with_lock_retries).and_yield + end + + it 'adds a check constraint to tags' do + constraint = releases.connection.check_constraints(:releases).find { |constraint| constraint.expression == "tag IS NOT NULL" } + expect(constraint).to be_nil + + migration.up + + constraint = releases.connection.check_constraints(:releases).find { |constraint| constraint.expression == "tag IS NOT NULL" } + expect(constraint).to be_a(ActiveRecord::ConnectionAdapters::CheckConstraintDefinition) + end +end diff --git a/spec/migrations/20220222192525_remove_null_releases_spec.rb b/spec/migrations/20220222192525_remove_null_releases_spec.rb new file mode 100644 index 00000000000..6043f2c8cc8 --- /dev/null +++ b/spec/migrations/20220222192525_remove_null_releases_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +require 'spec_helper' + +require_migration! + +RSpec.describe RemoveNullReleases do + let(:releases) { table(:releases) } + + before do + # we need to migrate to before previous migration so an invalid record can be created + migrate! + migration_context.down(previous_migration(3).version) + + releases.create!(tag: 'good', name: 'good release', released_at: Time.now) + releases.create!(tag: nil, name: 'bad release', released_at: Time.now) + end + + it 'deletes template records and associated data' do + expect { migrate! } + .to change { releases.count }.from(2).to(1) + end +end diff --git a/spec/migrations/20220305223212_add_security_training_providers_spec.rb b/spec/migrations/20220305223212_add_security_training_providers_spec.rb new file mode 100644 index 00000000000..3d0089aaa8d --- /dev/null +++ b/spec/migrations/20220305223212_add_security_training_providers_spec.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe AddSecurityTrainingProviders, :migration do + include MigrationHelpers::WorkItemTypesHelper + + let_it_be(:security_training_providers) { table(:security_training_providers) } + + it 'creates default data' do + # Need to delete all as security training providers are seeded before entire test suite + security_training_providers.delete_all + + reversible_migration do |migration| + migration.before -> { + expect(security_training_providers.count).to eq(0) + } + + migration.after -> { + expect(security_training_providers.count).to eq(2) + } + end + end +end diff --git a/spec/migrations/20220307192610_remove_duplicate_project_tag_releases_spec.rb b/spec/migrations/20220307192610_remove_duplicate_project_tag_releases_spec.rb new file mode 100644 index 00000000000..8a653869a9b --- /dev/null +++ b/spec/migrations/20220307192610_remove_duplicate_project_tag_releases_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe RemoveDuplicateProjectTagReleases do + let(:namespaces) { table(:namespaces) } + let(:projects) { table(:projects) } + let(:users) { table(:users) } + let(:releases) { table(:releases) } + + let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') } + let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') } + + let(:dup_releases) do + Array.new(4).fill do |i| + rel = releases.new(project_id: project.id, + tag: "duplicate tag", + released_at: (DateTime.now + i.days)) + rel.save!(validate: false) + rel + end + end + + let(:valid_release) do + releases.create!( + project_id: project.id, + tag: "valid tag", + released_at: DateTime.now + ) + end + + describe '#up' do + it "correctly removes duplicate tags from the same project" do + expect(dup_releases.length).to eq 4 + expect(valid_release).not_to be nil + expect(releases.where(tag: 'duplicate tag').count).to eq 4 + expect(releases.where(tag: 'valid tag').count).to eq 1 + + migrate! + + expect(releases.where(tag: 'duplicate tag').count).to eq 1 + expect(releases.where(tag: 'valid tag').count).to eq 1 + expect(releases.all.map(&:tag)).to match_array ['valid tag', 'duplicate tag'] + end + end +end diff --git a/spec/migrations/20220309084954_remove_leftover_external_pull_request_deletions_spec.rb b/spec/migrations/20220309084954_remove_leftover_external_pull_request_deletions_spec.rb new file mode 100644 index 00000000000..c471fd86bf5 --- /dev/null +++ b/spec/migrations/20220309084954_remove_leftover_external_pull_request_deletions_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true +require 'spec_helper' + +require_migration! + +RSpec.describe RemoveLeftoverExternalPullRequestDeletions do + let(:deleted_records) { table(:loose_foreign_keys_deleted_records) } + + let(:pending_record1) { deleted_records.create!(id: 1, fully_qualified_table_name: 'public.external_pull_requests', primary_key_value: 1, status: 1) } + let(:pending_record2) { deleted_records.create!(id: 2, fully_qualified_table_name: 'public.external_pull_requests', primary_key_value: 2, status: 1) } + let(:other_pending_record1) { deleted_records.create!(id: 3, fully_qualified_table_name: 'public.projects', primary_key_value: 1, status: 1) } + let(:other_pending_record2) { deleted_records.create!(id: 4, fully_qualified_table_name: 'public.ci_builds', primary_key_value: 1, status: 1) } + let(:processed_record1) { deleted_records.create!(id: 5, fully_qualified_table_name: 'public.external_pull_requests', primary_key_value: 3, status: 2) } + let(:other_processed_record1) { deleted_records.create!(id: 6, fully_qualified_table_name: 'public.ci_builds', primary_key_value: 2, status: 2) } + + let!(:persisted_ids_before) do + [ + pending_record1, + pending_record2, + other_pending_record1, + other_pending_record2, + processed_record1, + other_processed_record1 + ].map(&:id).sort + end + + let!(:persisted_ids_after) do + [ + other_pending_record1, + other_pending_record2, + processed_record1, + other_processed_record1 + ].map(&:id).sort + end + + def all_ids + deleted_records.all.map(&:id).sort + end + + it 'deletes pending external_pull_requests records' do + expect { migrate! }.to change { all_ids }.from(persisted_ids_before).to(persisted_ids_after) + end +end diff --git a/spec/migrations/20220310141349_remove_dependency_list_usage_data_from_redis_spec.rb b/spec/migrations/20220310141349_remove_dependency_list_usage_data_from_redis_spec.rb new file mode 100644 index 00000000000..c00685c1397 --- /dev/null +++ b/spec/migrations/20220310141349_remove_dependency_list_usage_data_from_redis_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe RemoveDependencyListUsageDataFromRedis, :migration, :clean_gitlab_redis_shared_state do + let(:key) { "DEPENDENCY_LIST_USAGE_COUNTER" } + + describe "#up" do + it 'removes the hash from redis' do + with_redis do |redis| + redis.hincrby(key, 1, 1) + redis.hincrby(key, 2, 1) + end + + expect { migrate! }.to change { with_redis { |r| r.hgetall(key) } }.from({ '1' => '1', '2' => '1' }).to({}) + end + end + + def with_redis(&block) + Gitlab::Redis::SharedState.with(&block) + end +end diff --git a/spec/migrations/add_new_trail_plans_spec.rb b/spec/migrations/add_new_trail_plans_spec.rb index 8ba6da11ad1..c1b488e8c3c 100644 --- a/spec/migrations/add_new_trail_plans_spec.rb +++ b/spec/migrations/add_new_trail_plans_spec.rb @@ -7,7 +7,7 @@ require_migration! RSpec.describe AddNewTrailPlans, :migration do describe '#up' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return true + allow(Gitlab).to receive(:com?).and_return true end it 'creates 2 entries within the plans table' do @@ -40,7 +40,7 @@ RSpec.describe AddNewTrailPlans, :migration do context 'when the instance is not SaaS' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return false + allow(Gitlab).to receive(:com?).and_return false end it 'does not create plans and plan limits and returns' do @@ -58,7 +58,7 @@ RSpec.describe AddNewTrailPlans, :migration do context 'when the instance is SaaS' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return true + allow(Gitlab).to receive(:com?).and_return true end it 'removes the newly added ultimate and premium trial entries' do @@ -77,7 +77,7 @@ RSpec.describe AddNewTrailPlans, :migration do context 'when the instance is not SaaS' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return false + allow(Gitlab).to receive(:com?).and_return false table(:plans).create!(id: 1, name: 'ultimate_trial', title: 'Ultimate Trial') table(:plans).create!(id: 2, name: 'premium_trial', title: 'Premium Trial') table(:plan_limits).create!(id: 1, plan_id: 1) diff --git a/spec/migrations/add_open_source_plan_spec.rb b/spec/migrations/add_open_source_plan_spec.rb index 04b26662f82..6e1cd544141 100644 --- a/spec/migrations/add_open_source_plan_spec.rb +++ b/spec/migrations/add_open_source_plan_spec.rb @@ -7,7 +7,7 @@ require_migration! RSpec.describe AddOpenSourcePlan, :migration do describe '#up' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return true + allow(Gitlab).to receive(:com?).and_return true end it 'creates 1 entry within the plans table' do @@ -35,7 +35,7 @@ RSpec.describe AddOpenSourcePlan, :migration do context 'when the instance is not SaaS' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return false + allow(Gitlab).to receive(:com?).and_return false end it 'does not create plans and plan limits and returns' do @@ -52,7 +52,7 @@ RSpec.describe AddOpenSourcePlan, :migration do context 'when the instance is SaaS' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return true + allow(Gitlab).to receive(:com?).and_return true end it 'removes the newly added opensource entry' do @@ -70,7 +70,7 @@ RSpec.describe AddOpenSourcePlan, :migration do context 'when the instance is not SaaS' do before do - allow(Gitlab).to receive(:dev_env_or_com?).and_return false + allow(Gitlab).to receive(:com?).and_return false table(:plans).create!(id: 1, name: 'opensource', title: 'Open Source Program') table(:plan_limits).create!(id: 1, plan_id: 1) end diff --git a/spec/migrations/backfill_all_project_namespaces_spec.rb b/spec/migrations/backfill_all_project_namespaces_spec.rb new file mode 100644 index 00000000000..1bcaad783b2 --- /dev/null +++ b/spec/migrations/backfill_all_project_namespaces_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe BackfillAllProjectNamespaces, :migration do + let_it_be(:migration) { described_class::MIGRATION } + + let(:projects) { table(:projects) } + let(:namespaces) { table(:namespaces) } + let(:user_namespace) { namespaces.create!(name: 'user1', path: 'user1', visibility_level: 20, type: 'User') } + let(:parent_group1) { namespaces.create!(name: 'parent_group1', path: 'parent_group1', visibility_level: 20, type: 'Group') } + let!(:parent_group1_project) { projects.create!(name: 'parent_group1_project', path: 'parent_group1_project', namespace_id: parent_group1.id, visibility_level: 20) } + let!(:user_namespace_project) { projects.create!(name: 'user1_project', path: 'user1_project', namespace_id: user_namespace.id, visibility_level: 20) } + + describe '#up' do + it 'schedules background jobs for each batch of namespaces' do + migrate! + + expect(migration).to have_scheduled_batched_migration( + table_name: :projects, + column_name: :id, + job_arguments: [nil, 'up'], + interval: described_class::DELAY_INTERVAL + ) + end + end + + describe '#down' do + it 'deletes all batched migration records' do + migrate! + schema_migrate_down! + + expect(migration).not_to have_scheduled_batched_migration + end + end +end diff --git a/spec/migrations/backfill_cycle_analytics_aggregations_spec.rb b/spec/migrations/backfill_cycle_analytics_aggregations_spec.rb new file mode 100644 index 00000000000..2a5d33742ce --- /dev/null +++ b/spec/migrations/backfill_cycle_analytics_aggregations_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe BackfillCycleAnalyticsAggregations, :migration do + let(:migration) { described_class.new } + + let(:aggregations) { table(:analytics_cycle_analytics_aggregations) } + let(:namespaces) { table(:namespaces) } + let(:group_value_streams) { table(:analytics_cycle_analytics_group_value_streams) } + + context 'when there are value stream records' do + it 'inserts a record for each top-level namespace' do + group1 = namespaces.create!(path: 'aaa', name: 'aaa') + subgroup1 = namespaces.create!(path: 'bbb', name: 'bbb', parent_id: group1.id) + group2 = namespaces.create!(path: 'ccc', name: 'ccc') + + namespaces.create!(path: 'ddd', name: 'ddd') # not used + + group_value_streams.create!(name: 'for top level group', group_id: group2.id) + group_value_streams.create!(name: 'another for top level group', group_id: group2.id) + + group_value_streams.create!(name: 'for subgroup', group_id: subgroup1.id) + group_value_streams.create!(name: 'another for subgroup', group_id: subgroup1.id) + + migrate! + + expect(aggregations.pluck(:group_id)).to match_array([group1.id, group2.id]) + end + end + + it 'does nothing' do + expect { migrate! }.not_to change { aggregations.count } + end +end diff --git a/spec/migrations/backfill_member_namespace_id_for_group_members_spec.rb b/spec/migrations/backfill_member_namespace_id_for_group_members_spec.rb new file mode 100644 index 00000000000..0c0acf85d41 --- /dev/null +++ b/spec/migrations/backfill_member_namespace_id_for_group_members_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe BackfillMemberNamespaceIdForGroupMembers do + let_it_be(:migration) { described_class::MIGRATION } + + describe '#up' do + it 'schedules background jobs for each batch of group members' do + migrate! + + expect(migration).to have_scheduled_batched_migration( + table_name: :members, + column_name: :id, + interval: described_class::INTERVAL + ) + end + end + + describe '#down' do + it 'deletes all batched migration records' do + migrate! + schema_migrate_down! + + expect(migration).not_to have_scheduled_batched_migration + end + end +end diff --git a/spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb b/spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb new file mode 100644 index 00000000000..8ec51d86779 --- /dev/null +++ b/spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'spec_helper' + +require_migration! + +RSpec.describe RecreateIndexSecurityCiBuildsOnNameAndIdParserWithNewFeatures, :migration do + let(:db) { described_class.new } + let(:pg_class) { table(:pg_class) } + let(:pg_index) { table(:pg_index) } + let(:async_indexes) { table(:postgres_async_indexes) } + + it 'recreates index' do + reversible_migration do |migration| + migration.before -> { + expect(async_indexes.where(name: described_class::OLD_INDEX_NAME).exists?).to be false + expect(db.index_exists?(described_class::TABLE, described_class::COLUMNS, name: described_class::OLD_INDEX_NAME)).to be true + expect(db.index_exists?(described_class::TABLE, described_class::COLUMNS, name: described_class::NEW_INDEX_NAME)).to be false + } + + migration.after -> { + expect(async_indexes.where(name: described_class::OLD_INDEX_NAME).exists?).to be true + expect(db.index_exists?(described_class::TABLE, described_class::COLUMNS, name: described_class::OLD_INDEX_NAME)).to be false + expect(db.index_exists?(described_class::TABLE, described_class::COLUMNS, name: described_class::NEW_INDEX_NAME)).to be true + } + end + end +end diff --git a/spec/migrations/remove_not_null_contraint_on_title_from_sprints_spec.rb b/spec/migrations/remove_not_null_contraint_on_title_from_sprints_spec.rb new file mode 100644 index 00000000000..fdafc4a5a89 --- /dev/null +++ b/spec/migrations/remove_not_null_contraint_on_title_from_sprints_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'spec_helper' + +require_migration! + +RSpec.describe RemoveNotNullContraintOnTitleFromSprints, :migration, schema: 20220304052335 do + let(:migration) { described_class.new } + let(:namespaces) { table(:namespaces) } + let(:sprints) { table(:sprints) } + let(:iterations_cadences) { table(:iterations_cadences) } + + let!(:group) { namespaces.create!(name: 'foo', path: 'foo') } + let!(:cadence) { iterations_cadences.create!(group_id: group.id, title: "cadence 1") } + let!(:iteration1) { sprints.create!(id: 1, title: 'a', group_id: group.id, iterations_cadence_id: cadence.id, start_date: Date.new(2021, 11, 1), due_date: Date.new(2021, 11, 5), iid: 1) } + + describe '#down' do + it "removes null titles by setting them with ids" do + migration.up + + iteration2 = sprints.create!(id: 2, title: nil, group_id: group.id, iterations_cadence_id: cadence.id, start_date: Date.new(2021, 12, 1), due_date: Date.new(2021, 12, 5), iid: 2) + + migration.down + + expect(iteration1.reload.title).to eq 'a' + expect(iteration2.reload.title).to eq '2' + end + end +end diff --git a/spec/migrations/update_application_settings_container_registry_exp_pol_worker_capacity_default_spec.rb b/spec/migrations/update_application_settings_container_registry_exp_pol_worker_capacity_default_spec.rb new file mode 100644 index 00000000000..842456089fe --- /dev/null +++ b/spec/migrations/update_application_settings_container_registry_exp_pol_worker_capacity_default_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe UpdateApplicationSettingsContainerRegistryExpPolWorkerCapacityDefault do + let(:settings) { table(:application_settings) } + + context 'with no rows in the application_settings table' do + it 'does not insert a row' do + expect { migrate! }.to not_change { settings.count } + end + end + + context 'with a row in the application_settings table' do + before do + settings.create!(container_registry_expiration_policies_worker_capacity: capacity) + end + + context 'with container_registry_expiration_policy_worker_capacity set to a value different than 0' do + let(:capacity) { 1 } + + it 'does not update the row' do + expect { migrate! } + .to not_change { settings.count } + .and not_change { settings.first.container_registry_expiration_policies_worker_capacity } + end + end + + context 'with container_registry_expiration_policy_worker_capacity set to 0' do + let(:capacity) { 0 } + + it 'updates the existing row' do + expect { migrate! } + .to not_change { settings.count } + .and change { settings.first.container_registry_expiration_policies_worker_capacity }.from(0).to(4) + end + end + end +end |