diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-11-18 13:16:36 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-11-18 13:16:36 +0000 |
commit | 311b0269b4eb9839fa63f80c8d7a58f32b8138a0 (patch) | |
tree | 07e7870bca8aed6d61fdcc810731c50d2c40af47 /spec/migrations | |
parent | 27909cef6c4170ed9205afa7426b8d3de47cbb0c (diff) | |
download | gitlab-ce-311b0269b4eb9839fa63f80c8d7a58f32b8138a0.tar.gz |
Add latest changes from gitlab-org/gitlab@14-5-stable-eev14.5.0-rc42
Diffstat (limited to 'spec/migrations')
171 files changed, 356 insertions, 6295 deletions
diff --git a/spec/migrations/20200107172020_add_timestamp_softwarelicensespolicy_spec.rb b/spec/migrations/20200107172020_add_timestamp_softwarelicensespolicy_spec.rb deleted file mode 100644 index fff0745e8af..00000000000 --- a/spec/migrations/20200107172020_add_timestamp_softwarelicensespolicy_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('add_timestamp_softwarelicensespolicy') - -RSpec.describe AddTimestampSoftwarelicensespolicy do - let(:software_licenses_policy) { table(:software_license_policies) } - let(:projects) { table(:projects) } - let(:licenses) { table(:software_licenses) } - - before do - projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce', namespace_id: 1) - licenses.create!(name: 'MIT') - software_licenses_policy.create!(project_id: projects.first.id, software_license_id: licenses.first.id) - end - - it 'creates timestamps' do - migrate! - - expect(software_licenses_policy.first.created_at).to be_nil - expect(software_licenses_policy.first.updated_at).to be_nil - end -end diff --git a/spec/migrations/20200122123016_backfill_project_settings_spec.rb b/spec/migrations/20200122123016_backfill_project_settings_spec.rb deleted file mode 100644 index 7fc8eb0e368..00000000000 --- a/spec/migrations/20200122123016_backfill_project_settings_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('backfill_project_settings') - -RSpec.describe BackfillProjectSettings, :sidekiq, schema: 20200114113341 do - let(:projects) { table(:projects) } - let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') } - let(:project) { projects.create!(namespace_id: namespace.id) } - - describe '#up' do - before do - stub_const("#{described_class}::BATCH_SIZE", 2) - - projects.create!(id: 1, namespace_id: namespace.id) - projects.create!(id: 2, namespace_id: namespace.id) - projects.create!(id: 3, namespace_id: namespace.id) - end - - it 'schedules BackfillProjectSettings background jobs' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, 1, 2) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, 3, 3) - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end - end -end diff --git a/spec/migrations/20200123155929_remove_invalid_jira_data_spec.rb b/spec/migrations/20200123155929_remove_invalid_jira_data_spec.rb deleted file mode 100644 index 9000d4b7fef..00000000000 --- a/spec/migrations/20200123155929_remove_invalid_jira_data_spec.rb +++ /dev/null @@ -1,77 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('remove_invalid_jira_data') - -RSpec.describe RemoveInvalidJiraData do - let(:jira_tracker_data) { table(:jira_tracker_data) } - let(:services) { table(:services) } - - let(:service) { services.create!(id: 1) } - let(:data) do - { - service_id: service.id, - encrypted_api_url: 'http:url.com', - encrypted_api_url_iv: 'somevalue', - encrypted_url: 'http:url.com', - encrypted_url_iv: 'somevalue', - encrypted_username: 'username', - encrypted_username_iv: 'somevalue', - encrypted_password: 'username', - encrypted_password_iv: 'somevalue' - } - end - - let!(:valid_data) { jira_tracker_data.create!(data) } - let!(:empty_data) { jira_tracker_data.create!(service_id: service.id) } - let!(:invalid_api_url) do - data[:encrypted_api_url_iv] = nil - jira_tracker_data.create!(data) - end - - let!(:missing_api_url) do - data[:encrypted_api_url] = '' - data[:encrypted_api_url_iv] = nil - jira_tracker_data.create!(data) - end - - let!(:invalid_url) do - data[:encrypted_url_iv] = nil - jira_tracker_data.create!(data) - end - - let!(:missing_url) do - data[:encrypted_url] = '' - jira_tracker_data.create!(data) - end - - let!(:invalid_username) do - data[:encrypted_username_iv] = nil - jira_tracker_data.create!(data) - end - - let!(:missing_username) do - data[:encrypted_username] = nil - data[:encrypted_username_iv] = nil - jira_tracker_data.create!(data) - end - - let!(:invalid_password) do - data[:encrypted_password_iv] = nil - jira_tracker_data.create!(data) - end - - let!(:missing_password) do - data[:encrypted_password] = nil - data[:encrypted_username_iv] = nil - jira_tracker_data.create!(data) - end - - it 'removes the invalid data' do - valid_data_records = [valid_data, empty_data, missing_api_url, missing_url, missing_username, missing_password] - - expect { migrate! }.to change { jira_tracker_data.count }.from(10).to(6) - - expect(jira_tracker_data.all).to match_array(valid_data_records) - end -end diff --git a/spec/migrations/20200127090233_remove_invalid_issue_tracker_data_spec.rb b/spec/migrations/20200127090233_remove_invalid_issue_tracker_data_spec.rb deleted file mode 100644 index 1d3476d6d61..00000000000 --- a/spec/migrations/20200127090233_remove_invalid_issue_tracker_data_spec.rb +++ /dev/null @@ -1,64 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('remove_invalid_issue_tracker_data') - -RSpec.describe RemoveInvalidIssueTrackerData do - let(:issue_tracker_data) { table(:issue_tracker_data) } - let(:services) { table(:services) } - - let(:service) { services.create!(id: 1) } - let(:data) do - { - service_id: service.id, - encrypted_issues_url: 'http:url.com', - encrypted_issues_url_iv: 'somevalue', - encrypted_new_issue_url: 'http:url.com', - encrypted_new_issue_url_iv: 'somevalue', - encrypted_project_url: 'username', - encrypted_project_url_iv: 'somevalue' - } - end - - let!(:valid_data) { issue_tracker_data.create!(data) } - let!(:empty_data) { issue_tracker_data.create!(service_id: service.id) } - let!(:invalid_issues_url) do - data[:encrypted_issues_url_iv] = nil - issue_tracker_data.create!(data) - end - - let!(:missing_issues_url) do - data[:encrypted_issues_url] = '' - data[:encrypted_issues_url_iv] = nil - issue_tracker_data.create!(data) - end - - let!(:invalid_new_isue_url) do - data[:encrypted_new_issue_url_iv] = nil - issue_tracker_data.create!(data) - end - - let!(:missing_new_issue_url) do - data[:encrypted_new_issue_url] = '' - issue_tracker_data.create!(data) - end - - let!(:invalid_project_url) do - data[:encrypted_project_url_iv] = nil - issue_tracker_data.create!(data) - end - - let!(:missing_project_url) do - data[:encrypted_project_url] = nil - data[:encrypted_project_url_iv] = nil - issue_tracker_data.create!(data) - end - - it 'removes the invalid data' do - valid_data_records = [valid_data, empty_data, missing_issues_url, missing_new_issue_url, missing_project_url] - - expect { migrate! }.to change { issue_tracker_data.count }.from(8).to(5) - - expect(issue_tracker_data.all).to match_array(valid_data_records) - end -end diff --git a/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb b/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb deleted file mode 100644 index cf8bc608483..00000000000 --- a/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb +++ /dev/null @@ -1,115 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('reschedule_migrate_issue_trackers_data') - -RSpec.describe RescheduleMigrateIssueTrackersData do - let(:services) { table(:services) } - let(:migration_class) { Gitlab::BackgroundMigration::MigrateIssueTrackersSensitiveData } - let(:migration_name) { migration_class.to_s.demodulize } - - let(:properties) do - { - 'url' => 'http://example.com' - } - end - - let!(:jira_integration) do - services.create!(id: 10, type: 'JiraService', properties: properties, category: 'issue_tracker') - end - - let!(:jira_integration_nil) do - services.create!(id: 11, type: 'JiraService', properties: nil, category: 'issue_tracker') - end - - let!(:bugzilla_integration) do - services.create!(id: 12, type: 'BugzillaService', properties: properties, category: 'issue_tracker') - end - - let!(:youtrack_integration) do - services.create!(id: 13, type: 'YoutrackService', properties: properties, category: 'issue_tracker') - end - - let!(:youtrack_integration_empty) do - services.create!(id: 14, type: 'YoutrackService', properties: '', category: 'issue_tracker') - end - - let!(:gitlab_service) do - services.create!(id: 15, type: 'GitlabIssueTrackerService', properties: properties, category: 'issue_tracker') - end - - let!(:gitlab_service_empty) do - services.create!(id: 16, type: 'GitlabIssueTrackerService', properties: {}, category: 'issue_tracker') - end - - let!(:other_service) do - services.create!(id: 17, type: 'OtherService', properties: properties, category: 'other_category') - end - - before do - stub_const("#{described_class}::BATCH_SIZE", 2) - end - - describe "#up" do - it 'schedules background migrations at correct time' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(migration_name).to be_scheduled_delayed_migration(3.minutes, jira_integration.id, bugzilla_integration.id) - expect(migration_name).to be_scheduled_delayed_migration(6.minutes, youtrack_integration.id, gitlab_service.id) - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end - end - - describe "#down" do - let(:issue_tracker_data) { table(:issue_tracker_data) } - let(:jira_tracker_data) { table(:jira_tracker_data) } - - let!(:valid_issue_tracker_data) do - issue_tracker_data.create!( - service_id: bugzilla_integration.id, - encrypted_issues_url: 'http://url.com', - encrypted_issues_url_iv: 'somevalue' - ) - end - - let!(:invalid_issue_tracker_data) do - issue_tracker_data.create!( - service_id: bugzilla_integration.id, - encrypted_issues_url: 'http:url.com', - encrypted_issues_url_iv: nil - ) - end - - let!(:valid_jira_tracker_data) do - jira_tracker_data.create!( - service_id: bugzilla_integration.id, - encrypted_url: 'http://url.com', - encrypted_url_iv: 'somevalue' - ) - end - - let!(:invalid_jira_tracker_data) do - jira_tracker_data.create!( - service_id: bugzilla_integration.id, - encrypted_url: 'http://url.com', - encrypted_url_iv: nil - ) - end - - it 'removes the invalid jira tracker data' do - expect { described_class.new.down }.to change { jira_tracker_data.count }.from(2).to(1) - - expect(jira_tracker_data.all).to eq([valid_jira_tracker_data]) - end - - it 'removes the invalid issue tracker data' do - expect { described_class.new.down }.to change { issue_tracker_data.count }.from(2).to(1) - - expect(issue_tracker_data.all).to eq([valid_issue_tracker_data]) - end - end -end diff --git a/spec/migrations/20200313203550_remove_orphaned_chat_names_spec.rb b/spec/migrations/20200313203550_remove_orphaned_chat_names_spec.rb deleted file mode 100644 index 6b1126ca53e..00000000000 --- a/spec/migrations/20200313203550_remove_orphaned_chat_names_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('remove_orphaned_chat_names') - -RSpec.describe RemoveOrphanedChatNames, schema: 20200313202430 do - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - let(:services) { table(:services) } - let(:chat_names) { table(:chat_names) } - - let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } - let(:project) { projects.create!(namespace_id: namespace.id) } - let(:service) { services.create!(project_id: project.id, type: 'chat') } - let(:chat_name) { chat_names.create!(service_id: service.id, team_id: 'TEAM', user_id: 12345, chat_id: 12345) } - let(:orphaned_chat_name) { chat_names.create!(team_id: 'TEAM', service_id: 0, user_id: 12345, chat_id: 12345) } - - it 'removes the orphaned chat_name' do - expect(chat_name).to be_present - expect(orphaned_chat_name).to be_present - - migrate! - - expect(chat_names.where(id: orphaned_chat_name.id)).to be_empty - expect(chat_name.reload).to be_present - end -end diff --git a/spec/migrations/20200406102120_backfill_deployment_clusters_from_deployments_spec.rb b/spec/migrations/20200406102120_backfill_deployment_clusters_from_deployments_spec.rb deleted file mode 100644 index c6a512a1ec9..00000000000 --- a/spec/migrations/20200406102120_backfill_deployment_clusters_from_deployments_spec.rb +++ /dev/null @@ -1,50 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('backfill_deployment_clusters_from_deployments') - -RSpec.describe BackfillDeploymentClustersFromDeployments, :migration, :sidekiq, schema: 20200227140242 do - describe '#up' do - it 'schedules BackfillDeploymentClustersFromDeployments background jobs' do - stub_const("#{described_class}::BATCH_SIZE", 2) - - namespace = table(:namespaces).create!(name: 'the-namespace', path: 'the-path') - project = table(:projects).create!(name: 'the-project', namespace_id: namespace.id) - environment = table(:environments).create!(name: 'the-environment', project_id: project.id, slug: 'slug') - cluster = table(:clusters).create!(name: 'the-cluster') - - deployment_data = { cluster_id: cluster.id, project_id: project.id, environment_id: environment.id, ref: 'abc', tag: false, sha: 'sha', status: 1 } - - # batch 1 - batch_1_begin = create_deployment(**deployment_data) - batch_1_end = create_deployment(**deployment_data) - - # value that should not be included due to default scope - create_deployment(**deployment_data, cluster_id: nil) - - # batch 2 - batch_2_begin = create_deployment(**deployment_data) - batch_2_end = create_deployment(**deployment_data) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - # batch 1 - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, batch_1_begin.id, batch_1_end.id) - - # batch 2 - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, batch_2_begin.id, batch_2_end.id) - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end - - def create_deployment(**data) - @iid ||= 0 - @iid += 1 - table(:deployments).create!(iid: @iid, **data) - end - end -end diff --git a/spec/migrations/20200511145545_change_variable_interpolation_format_in_common_metrics_spec.rb b/spec/migrations/20200511145545_change_variable_interpolation_format_in_common_metrics_spec.rb deleted file mode 100644 index e712e555b70..00000000000 --- a/spec/migrations/20200511145545_change_variable_interpolation_format_in_common_metrics_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('change_variable_interpolation_format_in_common_metrics') - -RSpec.describe ChangeVariableInterpolationFormatInCommonMetrics, :migration do - let(:prometheus_metrics) { table(:prometheus_metrics) } - - let!(:common_metric) do - prometheus_metrics.create!( - identifier: 'system_metrics_kubernetes_container_memory_total', - query: 'avg(sum(container_memory_usage_bytes{container_name!="POD",' \ - 'pod_name=~"^%{ci_environment_slug}-(.*)",namespace="%{kube_namespace}"})' \ - ' by (job)) without (job) /1024/1024/1024', - project_id: nil, - title: 'Memory Usage (Total)', - y_label: 'Total Memory Used (GB)', - unit: 'GB', - legend: 'Total (GB)', - group: -5, - common: true - ) - end - - it 'updates query to use {{}}' do - expected_query = <<~EOS.chomp - avg(sum(container_memory_usage_bytes{container!="POD",\ - pod=~"^{{ci_environment_slug}}-(.*)",namespace="{{kube_namespace}}"}) \ - by (job)) without (job) /1024/1024/1024 OR \ - avg(sum(container_memory_usage_bytes{container_name!="POD",\ - pod_name=~"^{{ci_environment_slug}}-(.*)",namespace="{{kube_namespace}}"}) \ - by (job)) without (job) /1024/1024/1024 - EOS - - migrate! - - expect(common_metric.reload.query).to eq(expected_query) - end -end diff --git a/spec/migrations/20200526115436_dedup_mr_metrics_spec.rb b/spec/migrations/20200526115436_dedup_mr_metrics_spec.rb deleted file mode 100644 index f16026884f5..00000000000 --- a/spec/migrations/20200526115436_dedup_mr_metrics_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('dedup_mr_metrics') - -RSpec.describe DedupMrMetrics, :migration, schema: 20200526013844 do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:merge_requests) { table(:merge_requests) } - let(:metrics) { table(:merge_request_metrics) } - let(:merge_request_params) { { source_branch: 'x', target_branch: 'y', target_project_id: project.id } } - - let!(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } - let!(:project) { projects.create!(namespace_id: namespace.id) } - let!(:merge_request_1) { merge_requests.create!(merge_request_params) } - let!(:merge_request_2) { merge_requests.create!(merge_request_params) } - let!(:merge_request_3) { merge_requests.create!(merge_request_params) } - - let!(:duplicated_metrics_1) { metrics.create!(merge_request_id: merge_request_1.id, latest_build_started_at: 1.day.ago, first_deployed_to_production_at: 5.days.ago, updated_at: 2.months.ago) } - let!(:duplicated_metrics_2) { metrics.create!(merge_request_id: merge_request_1.id, latest_build_started_at: Time.now, merged_at: Time.now, updated_at: 1.month.ago) } - - let!(:duplicated_metrics_3) { metrics.create!(merge_request_id: merge_request_3.id, diff_size: 30, commits_count: 20, updated_at: 2.months.ago) } - let!(:duplicated_metrics_4) { metrics.create!(merge_request_id: merge_request_3.id, added_lines: 5, commits_count: nil, updated_at: 1.month.ago) } - - let!(:non_duplicated_metrics) { metrics.create!(merge_request_id: merge_request_2.id, latest_build_started_at: 2.days.ago) } - - it 'deduplicates merge_request_metrics table' do - expect { migrate! }.to change { metrics.count }.from(5).to(3) - end - - it 'merges `duplicated_metrics_1` with `duplicated_metrics_2`' do - migrate! - - expect(metrics.where(id: duplicated_metrics_1.id)).not_to exist - - merged_metrics = metrics.find_by(id: duplicated_metrics_2.id) - - expect(merged_metrics).to be_present - expect(merged_metrics.latest_build_started_at).to be_like_time(duplicated_metrics_2.latest_build_started_at) - expect(merged_metrics.merged_at).to be_like_time(duplicated_metrics_2.merged_at) - expect(merged_metrics.first_deployed_to_production_at).to be_like_time(duplicated_metrics_1.first_deployed_to_production_at) - end - - it 'merges `duplicated_metrics_3` with `duplicated_metrics_4`' do - migrate! - - expect(metrics.where(id: duplicated_metrics_3.id)).not_to exist - - merged_metrics = metrics.find_by(id: duplicated_metrics_4.id) - - expect(merged_metrics).to be_present - expect(merged_metrics.diff_size).to eq(duplicated_metrics_3.diff_size) - expect(merged_metrics.commits_count).to eq(duplicated_metrics_3.commits_count) - expect(merged_metrics.added_lines).to eq(duplicated_metrics_4.added_lines) - end - - it 'does not change non duplicated records' do - expect { migrate! }.not_to change { non_duplicated_metrics.reload.attributes } - end - - it 'does nothing when there are no metrics' do - metrics.delete_all - - migrate! - - expect(metrics.count).to eq(0) - end -end diff --git a/spec/migrations/20200526231421_update_index_approval_rule_name_for_code_owners_rule_type_spec.rb b/spec/migrations/20200526231421_update_index_approval_rule_name_for_code_owners_rule_type_spec.rb deleted file mode 100644 index 9b72559234e..00000000000 --- a/spec/migrations/20200526231421_update_index_approval_rule_name_for_code_owners_rule_type_spec.rb +++ /dev/null @@ -1,175 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('update_index_approval_rule_name_for_code_owners_rule_type') - -RSpec.describe UpdateIndexApprovalRuleNameForCodeOwnersRuleType do - let(:migration) { described_class.new } - - let(:approval_rules) { table(:approval_merge_request_rules) } - let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab') } - - let(:project) do - table(:projects).create!( - namespace_id: namespace.id, - name: 'gitlab', - path: 'gitlab' - ) - end - - let(:merge_request) do - table(:merge_requests).create!( - target_project_id: project.id, - source_project_id: project.id, - target_branch: 'feature', - source_branch: 'master' - ) - end - - let(:index_names) do - ActiveRecord::Base.connection - .indexes(:approval_merge_request_rules) - .collect(&:name) - end - - def create_sectional_approval_rules - approval_rules.create!( - merge_request_id: merge_request.id, - name: "*.rb", - code_owner: true, - rule_type: 2, - section: "First Section" - ) - - approval_rules.create!( - merge_request_id: merge_request.id, - name: "*.rb", - code_owner: true, - rule_type: 2, - section: "Second Section" - ) - end - - def create_two_matching_nil_section_approval_rules - 2.times do - approval_rules.create!( - merge_request_id: merge_request.id, - name: "nil_section", - code_owner: true, - rule_type: 2 - ) - end - end - - before do - approval_rules.delete_all - end - - describe "#up" do - it "creates the new index and removes the 'legacy' indices" do - # Confirm that existing legacy indices prevent duplicate entries - # - expect { create_sectional_approval_rules } - .to raise_exception(ActiveRecord::RecordNotUnique) - expect { create_two_matching_nil_section_approval_rules } - .to raise_exception(ActiveRecord::RecordNotUnique) - - approval_rules.delete_all - - disable_migrations_output { migrate! } - - # After running the migration, expect `section == nil` rules to still be - # blocked by the legacy indices, but sectional rules are allowed. - # - expect { create_sectional_approval_rules } - .to change { approval_rules.count }.by(2) - expect { create_two_matching_nil_section_approval_rules } - .to raise_exception(ActiveRecord::RecordNotUnique) - - # Attempt to rerun the creation of sectional rules, and see that sectional - # rules are unique by section - # - expect { create_sectional_approval_rules } - .to raise_exception(ActiveRecord::RecordNotUnique) - - expect(index_names).to include( - described_class::SECTIONAL_INDEX_NAME, - described_class::LEGACY_INDEX_NAME_RULE_TYPE, - described_class::LEGACY_INDEX_NAME_CODE_OWNERS - ) - end - end - - describe "#down" do - context "run as FOSS" do - before do - expect(Gitlab).to receive(:ee?).twice.and_return(false) - end - - it "recreates legacy indices, but does not invoke EE-specific code" do - disable_migrations_output { migrate! } - - expect(index_names).to include( - described_class::SECTIONAL_INDEX_NAME, - described_class::LEGACY_INDEX_NAME_RULE_TYPE, - described_class::LEGACY_INDEX_NAME_CODE_OWNERS - ) - - # Since ApprovalMergeRequestRules are EE-specific, we expect none to be - # deleted during the migration. - # - expect { disable_migrations_output { migration.down } } - .not_to change { approval_rules.count } - - index_names = ActiveRecord::Base.connection - .indexes(:approval_merge_request_rules) - .collect(&:name) - - expect(index_names).not_to include(described_class::SECTIONAL_INDEX_NAME) - expect(index_names).to include( - described_class::LEGACY_INDEX_NAME_RULE_TYPE, - described_class::LEGACY_INDEX_NAME_CODE_OWNERS - ) - end - end - - context "EE" do - it "recreates 'legacy' indices and removes duplicate code owner approval rules" do - skip("This test is skipped under FOSS") unless Gitlab.ee? - - disable_migrations_output { migrate! } - - expect { create_sectional_approval_rules } - .to change { approval_rules.count }.by(2) - expect { create_two_matching_nil_section_approval_rules } - .to raise_exception(ActiveRecord::RecordNotUnique) - - expect(MergeRequests::SyncCodeOwnerApprovalRules) - .to receive(:new).with(MergeRequest.find(merge_request.id)).once.and_call_original - - # Run the down migration. This will remove the 3 approval rules we create - # above, and call MergeRequests::SyncCodeOwnerApprovalRules to recreate - # new ones. However, as there is no CODEOWNERS file in this test - # context, no approval rules will be created, so we can expect - # approval_rules.count to be changed by -3. - # - expect { disable_migrations_output { migration.down } } - .to change { approval_rules.count }.by(-3) - - # Test that the index does not allow us to create the same rules as the - # previous sectional index. - # - expect { create_sectional_approval_rules } - .to raise_exception(ActiveRecord::RecordNotUnique) - expect { create_two_matching_nil_section_approval_rules } - .to raise_exception(ActiveRecord::RecordNotUnique) - - expect(index_names).not_to include(described_class::SECTIONAL_INDEX_NAME) - expect(index_names).to include( - described_class::LEGACY_INDEX_NAME_RULE_TYPE, - described_class::LEGACY_INDEX_NAME_CODE_OWNERS - ) - end - end - end -end diff --git a/spec/migrations/20200703125016_backfill_namespace_settings_spec.rb b/spec/migrations/20200703125016_backfill_namespace_settings_spec.rb deleted file mode 100644 index c9f7a66a0b9..00000000000 --- a/spec/migrations/20200703125016_backfill_namespace_settings_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('backfill_namespace_settings') - -RSpec.describe BackfillNamespaceSettings, :sidekiq, schema: 20200703124823 do - let(:namespaces) { table(:namespaces) } - - describe '#up' do - before do - stub_const("#{described_class}::BATCH_SIZE", 2) - - namespaces.create!(id: 1, name: 'test1', path: 'test1') - namespaces.create!(id: 2, name: 'test2', path: 'test2') - namespaces.create!(id: 3, name: 'test3', path: 'test3') - end - - it 'schedules BackfillNamespaceSettings background jobs' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, 1, 2) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, 3, 3) - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end - end -end diff --git a/spec/migrations/20200706035141_adjust_unique_index_alert_management_alerts_spec.rb b/spec/migrations/20200706035141_adjust_unique_index_alert_management_alerts_spec.rb deleted file mode 100644 index 121b1729dd2..00000000000 --- a/spec/migrations/20200706035141_adjust_unique_index_alert_management_alerts_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('adjust_unique_index_alert_management_alerts') - -RSpec.describe AdjustUniqueIndexAlertManagementAlerts, :migration do - let(:migration) { described_class.new } - let(:alerts) { AlertManagement::Alert } - let(:project) { create_project } - let(:other_project) { create_project } - let(:resolved_state) { 2 } - let(:triggered_state) { 1 } - let!(:existing_alert) { create_alert(project, resolved_state, '1234', 1) } - let!(:p2_alert) { create_alert(other_project, resolved_state, '1234', 1) } - let!(:p2_alert_diff_fingerprint) { create_alert(other_project, resolved_state, '4567', 2) } - - it 'can reverse the migration' do - expect(existing_alert.fingerprint).not_to eq(nil) - expect(p2_alert.fingerprint).not_to eq(nil) - expect(p2_alert_diff_fingerprint.fingerprint).not_to eq(nil) - - migrate! - - # Adding a second alert with the same fingerprint now that we can - second_alert = create_alert(project, triggered_state, '1234', 2) - expect(alerts.count).to eq(4) - - schema_migrate_down! - - # We keep the alerts, but the oldest ones fingerprint is removed - expect(alerts.count).to eq(4) - expect(second_alert.reload.fingerprint).not_to eq(nil) - expect(p2_alert.fingerprint).not_to eq(nil) - expect(p2_alert_diff_fingerprint.fingerprint).not_to eq(nil) - expect(existing_alert.reload.fingerprint).to eq(nil) - end - - def namespace - @namespace ||= table(:namespaces).create!(name: 'foo', path: 'foo') - end - - def create_project - table(:projects).create!(namespace_id: namespace.id) - end - - def create_alert(project, status, fingerprint, iid) - params = { - title: 'test', - started_at: Time.current, - iid: iid, - project_id: project.id, - status: status, - fingerprint: fingerprint - } - table(:alert_management_alerts).create!(params) - end -end diff --git a/spec/migrations/20200728080250_replace_unique_index_on_cycle_analytics_stages_spec.rb b/spec/migrations/20200728080250_replace_unique_index_on_cycle_analytics_stages_spec.rb deleted file mode 100644 index a632065946d..00000000000 --- a/spec/migrations/20200728080250_replace_unique_index_on_cycle_analytics_stages_spec.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('replace_unique_index_on_cycle_analytics_stages') - -RSpec.describe ReplaceUniqueIndexOnCycleAnalyticsStages, :migration, schema: 20200727142337 do - let(:namespaces) { table(:namespaces) } - let(:group_value_streams) { table(:analytics_cycle_analytics_group_value_streams) } - let(:group_stages) { table(:analytics_cycle_analytics_group_stages) } - - let(:group) { namespaces.create!(type: 'Group', name: 'test', path: 'test') } - - let(:value_stream_1) { group_value_streams.create!(group_id: group.id, name: 'vs1') } - let(:value_stream_2) { group_value_streams.create!(group_id: group.id, name: 'vs2') } - - let(:duplicated_stage_1) { group_stages.create!(group_id: group.id, group_value_stream_id: value_stream_1.id, name: 'stage', start_event_identifier: 1, end_event_identifier: 1) } - let(:duplicated_stage_2) { group_stages.create!(group_id: group.id, group_value_stream_id: value_stream_2.id, name: 'stage', start_event_identifier: 1, end_event_identifier: 1) } - - let(:stage_record) { group_stages.create!(group_id: group.id, group_value_stream_id: value_stream_2.id, name: 'other stage', start_event_identifier: 1, end_event_identifier: 1) } - - describe '#down' do - subject { described_class.new.down } - - before do - described_class.new.up - - duplicated_stage_1 - duplicated_stage_2 - stage_record - end - - it 'removes duplicated stage records' do - subject - - stage = group_stages.find_by_id(duplicated_stage_2.id) - expect(stage).to be_nil - end - - it 'does not change the first duplicated stage record' do - expect { subject }.not_to change { duplicated_stage_1.reload.attributes } - end - - it 'does not change not duplicated stage record' do - expect { subject }.not_to change { stage_record.reload.attributes } - end - end -end diff --git a/spec/migrations/20200728182311_add_o_auth_paths_to_protected_paths_spec.rb b/spec/migrations/20200728182311_add_o_auth_paths_to_protected_paths_spec.rb deleted file mode 100644 index 5c65d45c6e0..00000000000 --- a/spec/migrations/20200728182311_add_o_auth_paths_to_protected_paths_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('add_o_auth_paths_to_protected_paths') - -RSpec.describe AddOAuthPathsToProtectedPaths do - subject(:migration) { described_class.new } - - let(:application_settings) { table(:application_settings) } - let(:new_paths) do - [ - '/oauth/authorize', - '/oauth/token' - ] - end - - it 'appends new OAuth paths' do - application_settings.create! - - protected_paths_before = application_settings.first.protected_paths - protected_paths_after = protected_paths_before + new_paths - - expect { migrate! }.to change { application_settings.first.protected_paths }.from(protected_paths_before).to(protected_paths_after) - end - - it 'new default includes new paths' do - settings_before = application_settings.create! - - expect(settings_before.protected_paths).not_to include(*new_paths) - - migrate! - - application_settings.reset_column_information - settings_after = application_settings.create! - - expect(settings_after.protected_paths).to include(*new_paths) - end - - it 'does not change the value when the new paths are already included' do - application_settings.create!(protected_paths: %w(/users/sign_in /users/password) + new_paths) - - expect { migrate! }.not_to change { application_settings.first.protected_paths } - end - - it 'adds one value when the other is already present' do - application_settings.create!(protected_paths: %W(/users/sign_in /users/password #{new_paths.first})) - - migrate! - - expect(application_settings.first.protected_paths).to include(new_paths.second) - end -end diff --git a/spec/migrations/20200811130433_create_missing_vulnerabilities_issue_links_spec.rb b/spec/migrations/20200811130433_create_missing_vulnerabilities_issue_links_spec.rb deleted file mode 100644 index d166ff3617b..00000000000 --- a/spec/migrations/20200811130433_create_missing_vulnerabilities_issue_links_spec.rb +++ /dev/null @@ -1,160 +0,0 @@ -# frozen_string_literal: true -require 'spec_helper' -require_migration!('create_missing_vulnerabilities_issue_links') - -RSpec.describe CreateMissingVulnerabilitiesIssueLinks, :migration do - let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') } - let(:users) { table(:users) } - let(:user) { create_user! } - let(:project) { table(:projects).create!(id: 123, namespace_id: namespace.id) } - let(:scanners) { table(:vulnerability_scanners) } - let(:scanner) { scanners.create!(project_id: project.id, external_id: 'test 1', name: 'test scanner 1') } - let(:different_scanner) { scanners.create!(project_id: project.id, external_id: 'test 2', name: 'test scanner 2') } - let(:issues) { table(:issues) } - let(:issue1) { issues.create!(id: 123, project_id: project.id) } - let(:issue2) { issues.create!(id: 124, project_id: project.id) } - let(:issue3) { issues.create!(id: 125, project_id: project.id) } - let(:vulnerabilities) { table(:vulnerabilities) } - let(:vulnerabilities_findings) { table(:vulnerability_occurrences) } - let(:vulnerability_feedback) { table(:vulnerability_feedback) } - let(:vulnerability_issue_links) { table(:vulnerability_issue_links) } - let(:vulnerability_identifiers) { table(:vulnerability_identifiers) } - let(:vulnerability_identifier) { vulnerability_identifiers.create!(project_id: project.id, external_type: 'test 1', external_id: 'test 1', fingerprint: 'test 1', name: 'test 1') } - let(:different_vulnerability_identifier) { vulnerability_identifiers.create!(project_id: project.id, external_type: 'test 2', external_id: 'test 2', fingerprint: 'test 2', name: 'test 2') } - - let!(:vulnerability) do - create_vulnerability!( - project_id: project.id, - author_id: user.id - ) - end - - before do - create_finding!( - vulnerability_id: vulnerability.id, - project_id: project.id, - scanner_id: scanner.id, - primary_identifier_id: vulnerability_identifier.id - ) - create_feedback!( - issue_id: issue1.id, - project_id: project.id, - author_id: user.id - ) - - # Create a finding with no vulnerability_id - # https://gitlab.com/gitlab-com/gl-infra/production/-/issues/2539 - create_finding!( - vulnerability_id: nil, - project_id: project.id, - scanner_id: different_scanner.id, - primary_identifier_id: different_vulnerability_identifier.id, - location_fingerprint: 'somewhereinspace', - uuid: 'test2' - ) - create_feedback!( - category: 2, - issue_id: issue2.id, - project_id: project.id, - author_id: user.id - ) - end - - context 'with no Vulnerabilities::IssueLinks present' do - it 'creates missing Vulnerabilities::IssueLinks' do - expect(vulnerability_issue_links.count).to eq(0) - - migrate! - - expect(vulnerability_issue_links.count).to eq(1) - end - end - - context 'when an Vulnerabilities::IssueLink already exists' do - before do - vulnerability_issue_links.create!(vulnerability_id: vulnerability.id, issue_id: issue1.id) - end - - it 'creates no duplicates' do - expect(vulnerability_issue_links.count).to eq(1) - - migrate! - - expect(vulnerability_issue_links.count).to eq(1) - end - end - - context 'when an Vulnerabilities::IssueLink of type created already exists' do - before do - vulnerability_issue_links.create!(vulnerability_id: vulnerability.id, issue_id: issue3.id, link_type: 2) - end - - it 'creates no duplicates' do - expect(vulnerability_issue_links.count).to eq(1) - - migrate! - - expect(vulnerability_issue_links.count).to eq(1) - end - end - - private - - def create_vulnerability!(project_id:, author_id:, title: 'test', severity: 7, confidence: 7, report_type: 0) - vulnerabilities.create!( - project_id: project_id, - author_id: author_id, - title: title, - severity: severity, - confidence: confidence, - report_type: report_type - ) - end - - # rubocop:disable Metrics/ParameterLists - def create_finding!( - vulnerability_id:, project_id:, scanner_id:, primary_identifier_id:, - name: "test", severity: 7, confidence: 7, report_type: 0, - project_fingerprint: '123qweasdzxc', location_fingerprint: 'test', - metadata_version: 'test', raw_metadata: 'test', uuid: 'test') - vulnerabilities_findings.create!( - vulnerability_id: vulnerability_id, - project_id: project_id, - name: name, - severity: severity, - confidence: confidence, - report_type: report_type, - project_fingerprint: project_fingerprint, - scanner_id: scanner.id, - primary_identifier_id: vulnerability_identifier.id, - location_fingerprint: location_fingerprint, - metadata_version: metadata_version, - raw_metadata: raw_metadata, - uuid: uuid - ) - end - # rubocop:enable Metrics/ParameterLists - - # project_fingerprint on Vulnerabilities::Finding is a bytea and we need to match this - def create_feedback!(issue_id:, project_id:, author_id:, feedback_type: 1, category: 0, project_fingerprint: '3132337177656173647a7863') - vulnerability_feedback.create!( - feedback_type: feedback_type, - issue_id: issue_id, - category: category, - project_fingerprint: project_fingerprint, - project_id: project_id, - author_id: author_id - ) - end - - def create_user!(name: "Example User", email: "user@example.com", user_type: nil, created_at: Time.now, confirmed_at: Time.now) - users.create!( - name: name, - email: email, - username: name, - projects_limit: 0, - user_type: user_type, - confirmed_at: confirmed_at - ) - end -end diff --git a/spec/migrations/20200915044225_schedule_migration_to_hashed_storage_spec.rb b/spec/migrations/20200915044225_schedule_migration_to_hashed_storage_spec.rb deleted file mode 100644 index 69f7525d265..00000000000 --- a/spec/migrations/20200915044225_schedule_migration_to_hashed_storage_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('schedule_migration_to_hashed_storage') - -RSpec.describe ScheduleMigrationToHashedStorage, :sidekiq do - describe '#up' do - it 'schedules background migration job' do - Sidekiq::Testing.fake! do - expect { migrate! }.to change { BackgroundMigrationWorker.jobs.size }.by(1) - end - end - end -end diff --git a/spec/migrations/20200929052138_create_initial_versions_for_pre_versioning_terraform_states_spec.rb b/spec/migrations/20200929052138_create_initial_versions_for_pre_versioning_terraform_states_spec.rb deleted file mode 100644 index 34bd8f1c869..00000000000 --- a/spec/migrations/20200929052138_create_initial_versions_for_pre_versioning_terraform_states_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('create_initial_versions_for_pre_versioning_terraform_states') - -RSpec.describe CreateInitialVersionsForPreVersioningTerraformStates do - let(:namespace) { table(:namespaces).create!(name: 'terraform', path: 'terraform') } - let(:project) { table(:projects).create!(id: 1, namespace_id: namespace.id) } - let(:terraform_state_versions) { table(:terraform_state_versions) } - - def create_state!(project, versioning_enabled:) - table(:terraform_states).create!( - project_id: project.id, - uuid: 'uuid', - file_store: 2, - file: 'state.tfstate', - versioning_enabled: versioning_enabled - ) - end - - describe '#up' do - context 'for a state that is already versioned' do - let!(:terraform_state) { create_state!(project, versioning_enabled: true) } - - it 'does not insert a version record' do - expect { migrate! }.not_to change { terraform_state_versions.count } - end - end - - context 'for a state that is not yet versioned' do - let!(:terraform_state) { create_state!(project, versioning_enabled: false) } - - it 'creates a version using the current state data' do - expect { migrate! }.to change { terraform_state_versions.count }.by(1) - - migrated_version = terraform_state_versions.last - expect(migrated_version.terraform_state_id).to eq(terraform_state.id) - expect(migrated_version.version).to be_zero - expect(migrated_version.file_store).to eq(terraform_state.file_store) - expect(migrated_version.file).to eq(terraform_state.file) - expect(migrated_version.created_at).to be_present - expect(migrated_version.updated_at).to be_present - end - end - end -end diff --git a/spec/migrations/20201014205300_drop_backfill_jira_tracker_deployment_type_jobs_spec.rb b/spec/migrations/20201014205300_drop_backfill_jira_tracker_deployment_type_jobs_spec.rb deleted file mode 100644 index ef9bc5788c1..00000000000 --- a/spec/migrations/20201014205300_drop_backfill_jira_tracker_deployment_type_jobs_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('drop_backfill_jira_tracker_deployment_type_jobs') - -RSpec.describe DropBackfillJiraTrackerDeploymentTypeJobs, :sidekiq, :redis, schema: 2020_10_14_205300 do - subject(:migration) { described_class.new } - - describe '#up' do - let(:retry_set) { Sidekiq::RetrySet.new } - let(:scheduled_set) { Sidekiq::ScheduledSet.new } - - context 'there are only affected jobs on the queue' do - let(:payload) { { 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1] } } - let(:queue_payload) { payload.merge('queue' => described_class::QUEUE) } - - it 'removes enqueued BackfillJiraTrackerDeploymentType background jobs' do - Sidekiq::Testing.disable! do # https://github.com/mperham/sidekiq/wiki/testing#api Sidekiq's API does not have a testing mode - retry_set.schedule(1.hour.from_now, payload) - scheduled_set.schedule(1.hour.from_now, payload) - Sidekiq::Client.push(queue_payload) - - expect { migration.up }.to change { Sidekiq::Queue.new(described_class::QUEUE).size }.from(1).to(0) - expect(retry_set.size).to eq(0) - expect(scheduled_set.size).to eq(0) - end - end - end - - context 'there are not any affected jobs on the queue' do - let(:payload) { { 'class' => ::BackgroundMigrationWorker, 'args' => ['SomeOtherClass', 1] } } - let(:queue_payload) { payload.merge('queue' => described_class::QUEUE) } - - it 'skips other enqueued jobs' do - Sidekiq::Testing.disable! do - retry_set.schedule(1.hour.from_now, payload) - scheduled_set.schedule(1.hour.from_now, payload) - Sidekiq::Client.push(queue_payload) - - expect { migration.up }.not_to change { Sidekiq::Queue.new(described_class::QUEUE).size } - expect(retry_set.size).to eq(1) - expect(scheduled_set.size).to eq(1) - end - end - end - - context 'other queues' do - it 'does not modify them' do - Sidekiq::Testing.disable! do - Sidekiq::Client.push('queue' => 'other', 'class' => ::BackgroundMigrationWorker, 'args' => ['SomeOtherClass', 1]) - Sidekiq::Client.push('queue' => 'other', 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1]) - - expect { migration.up }.not_to change { Sidekiq::Queue.new('other').size } - end - end - end - end -end diff --git a/spec/migrations/20201027002551_migrate_services_to_http_integrations_spec.rb b/spec/migrations/20201027002551_migrate_services_to_http_integrations_spec.rb deleted file mode 100644 index f9f6cd9589c..00000000000 --- a/spec/migrations/20201027002551_migrate_services_to_http_integrations_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('migrate_services_to_http_integrations') - -RSpec.describe MigrateServicesToHttpIntegrations do - let!(:namespace) { table(:namespaces).create!(name: 'namespace', path: 'namespace') } - let!(:project) { table(:projects).create!(id: 1, namespace_id: namespace.id) } - let!(:alert_service) { table(:services).create!(type: 'AlertsService', project_id: project.id, active: true) } - let!(:alert_service_data) { table(:alerts_service_data).create!(service_id: alert_service.id, encrypted_token: 'test', encrypted_token_iv: 'test')} - let(:http_integrations) { table(:alert_management_http_integrations) } - - describe '#up' do - it 'creates the http integrations from the alert services', :aggregate_failures do - expect { migrate! }.to change { http_integrations.count }.by(1) - - http_integration = http_integrations.last - expect(http_integration.project_id).to eq(alert_service.project_id) - expect(http_integration.encrypted_token).to eq(alert_service_data.encrypted_token) - expect(http_integration.encrypted_token_iv).to eq(alert_service_data.encrypted_token_iv) - expect(http_integration.active).to eq(alert_service.active) - expect(http_integration.name).to eq(described_class::SERVICE_NAMES_IDENTIFIER[:name]) - expect(http_integration.endpoint_identifier).to eq(described_class::SERVICE_NAMES_IDENTIFIER[:identifier]) - end - end -end diff --git a/spec/migrations/20201028182809_backfill_jira_tracker_deployment_type2_spec.rb b/spec/migrations/20201028182809_backfill_jira_tracker_deployment_type2_spec.rb deleted file mode 100644 index 0746ad7e44f..00000000000 --- a/spec/migrations/20201028182809_backfill_jira_tracker_deployment_type2_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('backfill_jira_tracker_deployment_type2') - -RSpec.describe BackfillJiraTrackerDeploymentType2, :sidekiq, schema: 20201028182809 do - let(:services) { table(:services) } - let(:jira_tracker_data) { table(:jira_tracker_data) } - let(:migration) { described_class.new } - let(:batch_interval) { described_class::DELAY_INTERVAL } - - describe '#up' do - before do - stub_const("#{described_class}::BATCH_SIZE", 2) - - active_service = services.create!(type: 'JiraService', active: true) - inactive_service = services.create!(type: 'JiraService', active: false) - - jira_tracker_data.create!(id: 1, service_id: active_service.id, deployment_type: 0) - jira_tracker_data.create!(id: 2, service_id: active_service.id, deployment_type: 1) - jira_tracker_data.create!(id: 3, service_id: inactive_service.id, deployment_type: 2) - jira_tracker_data.create!(id: 4, service_id: inactive_service.id, deployment_type: 0) - jira_tracker_data.create!(id: 5, service_id: active_service.id, deployment_type: 0) - end - - it 'schedules BackfillJiraTrackerDeploymentType2 background jobs' do - Sidekiq::Testing.fake! do - freeze_time do - migration.up - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(batch_interval, 1, 4) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(batch_interval * 2, 5, 5) - end - end - end - end -end diff --git a/spec/migrations/20201110161542_cleanup_transfered_projects_shared_runners_spec.rb b/spec/migrations/20201110161542_cleanup_transfered_projects_shared_runners_spec.rb deleted file mode 100644 index 7a79406ac80..00000000000 --- a/spec/migrations/20201110161542_cleanup_transfered_projects_shared_runners_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('cleanup_transfered_projects_shared_runners') - -RSpec.describe CleanupTransferedProjectsSharedRunners, :sidekiq, schema: 20201110161542 do - let(:namespaces) { table(:namespaces) } - let(:migration) { described_class.new } - let(:batch_interval) { described_class::INTERVAL } - - let!(:namespace_1) { namespaces.create!(name: 'foo', path: 'foo') } - let!(:namespace_2) { namespaces.create!(name: 'bar', path: 'bar') } - let!(:namespace_3) { namespaces.create!(name: 'baz', path: 'baz') } - - describe '#up' do - before do - stub_const("#{described_class}::BATCH_SIZE", 2) - end - - it 'schedules ResetSharedRunnersForTransferredProjects background jobs' do - Sidekiq::Testing.fake! do - freeze_time do - migration.up - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(batch_interval, namespace_1.id, namespace_2.id) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(batch_interval * 2, namespace_3.id, namespace_3.id) - end - end - end - end -end diff --git a/spec/migrations/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences_spec.rb b/spec/migrations/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences_spec.rb deleted file mode 100644 index dda919d70d9..00000000000 --- a/spec/migrations/20201112130715_schedule_recalculate_uuid_on_vulnerabilities_occurrences_spec.rb +++ /dev/null @@ -1,138 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('schedule_recalculate_uuid_on_vulnerabilities_occurrences') - -RSpec.describe ScheduleRecalculateUuidOnVulnerabilitiesOccurrences, :migration do - let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') } - let(:users) { table(:users) } - let(:user) { create_user! } - let(:project) { table(:projects).create!(id: 123, namespace_id: namespace.id) } - let(:scanners) { table(:vulnerability_scanners) } - let(:scanner) { scanners.create!(project_id: project.id, external_id: 'test 1', name: 'test scanner 1') } - let(:different_scanner) { scanners.create!(project_id: project.id, external_id: 'test 2', name: 'test scanner 2') } - let(:vulnerabilities) { table(:vulnerabilities) } - let(:vulnerabilities_findings) { table(:vulnerability_occurrences) } - let(:vulnerability_identifiers) { table(:vulnerability_identifiers) } - let(:vulnerability_identifier) do - vulnerability_identifiers.create!( - project_id: project.id, - external_type: 'uuid-v5', - external_id: 'uuid-v5', - fingerprint: '7e394d1b1eb461a7406d7b1e08f057a1cf11287a', - name: 'Identifier for UUIDv5') - end - - let(:different_vulnerability_identifier) do - vulnerability_identifiers.create!( - project_id: project.id, - external_type: 'uuid-v4', - external_id: 'uuid-v4', - fingerprint: '772da93d34a1ba010bcb5efa9fb6f8e01bafcc89', - name: 'Identifier for UUIDv4') - end - - let!(:vulnerability_for_uuidv4) do - create_vulnerability!( - project_id: project.id, - author_id: user.id - ) - end - - let!(:vulnerability_for_uuidv5) do - create_vulnerability!( - project_id: project.id, - author_id: user.id - ) - end - - let(:known_uuid_v4) { "b3cc2518-5446-4dea-871c-89d5e999c1ac" } - let!(:finding_with_uuid_v4) do - create_finding!( - vulnerability_id: vulnerability_for_uuidv4.id, - project_id: project.id, - scanner_id: different_scanner.id, - primary_identifier_id: different_vulnerability_identifier.id, - report_type: 0, # "sast" - location_fingerprint: "fa18f432f1d56675f4098d318739c3cd5b14eb3e", - uuid: known_uuid_v4 - ) - end - - let(:known_uuid_v5) { "e7d3d99d-04bb-5771-bb44-d80a9702d0a2" } - let!(:finding_with_uuid_v5) do - create_finding!( - vulnerability_id: vulnerability_for_uuidv5.id, - project_id: project.id, - scanner_id: scanner.id, - primary_identifier_id: vulnerability_identifier.id, - report_type: 0, # "sast" - location_fingerprint: "838574be0210968bf6b9f569df9c2576242cbf0a", - uuid: known_uuid_v5 - ) - end - - before do - stub_const("#{described_class}::BATCH_SIZE", 1) - end - - around do |example| - freeze_time { Sidekiq::Testing.fake! { example.run } } - end - - it 'schedules background migration' do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - expect(described_class::MIGRATION).to be_scheduled_migration(finding_with_uuid_v4.id, finding_with_uuid_v4.id) - expect(described_class::MIGRATION).to be_scheduled_migration(finding_with_uuid_v5.id, finding_with_uuid_v5.id) - end - - private - - def create_vulnerability!(project_id:, author_id:, title: 'test', severity: 7, confidence: 7, report_type: 0) - vulnerabilities.create!( - project_id: project_id, - author_id: author_id, - title: title, - severity: severity, - confidence: confidence, - report_type: report_type - ) - end - - # rubocop:disable Metrics/ParameterLists - def create_finding!( - vulnerability_id:, project_id:, scanner_id:, primary_identifier_id:, - name: "test", severity: 7, confidence: 7, report_type: 0, - project_fingerprint: '123qweasdzxc', location_fingerprint: 'test', - metadata_version: 'test', raw_metadata: 'test', uuid: 'test') - vulnerabilities_findings.create!( - vulnerability_id: vulnerability_id, - project_id: project_id, - name: name, - severity: severity, - confidence: confidence, - report_type: report_type, - project_fingerprint: project_fingerprint, - scanner_id: scanner.id, - primary_identifier_id: vulnerability_identifier.id, - location_fingerprint: location_fingerprint, - metadata_version: metadata_version, - raw_metadata: raw_metadata, - uuid: uuid - ) - end - # rubocop:enable Metrics/ParameterLists - - def create_user!(name: "Example User", email: "user@example.com", user_type: nil, created_at: Time.now, confirmed_at: Time.now) - users.create!( - name: name, - email: email, - username: name, - projects_limit: 0, - user_type: user_type, - confirmed_at: confirmed_at - ) - end -end diff --git a/spec/migrations/20210112143418_remove_duplicate_services2_spec.rb b/spec/migrations/20210112143418_remove_duplicate_services2_spec.rb index 289416c22cf..b8dc4d7c8ae 100644 --- a/spec/migrations/20210112143418_remove_duplicate_services2_spec.rb +++ b/spec/migrations/20210112143418_remove_duplicate_services2_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('remove_duplicate_services2') +require_migration! RSpec.describe RemoveDuplicateServices2 do let_it_be(:namespaces) { table(:namespaces) } diff --git a/spec/migrations/20210119122354_alter_vsa_issue_first_mentioned_in_commit_value_spec.rb b/spec/migrations/20210119122354_alter_vsa_issue_first_mentioned_in_commit_value_spec.rb index 469dbb4f946..e07b5a48909 100644 --- a/spec/migrations/20210119122354_alter_vsa_issue_first_mentioned_in_commit_value_spec.rb +++ b/spec/migrations/20210119122354_alter_vsa_issue_first_mentioned_in_commit_value_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('alter_vsa_issue_first_mentioned_in_commit_value') +require_migration! RSpec.describe AlterVsaIssueFirstMentionedInCommitValue, schema: 20210114033715 do let(:group_stages) { table(:analytics_cycle_analytics_group_stages) } diff --git a/spec/migrations/20210205174154_remove_bad_dependency_proxy_manifests_spec.rb b/spec/migrations/20210205174154_remove_bad_dependency_proxy_manifests_spec.rb index cb48df20d58..97438062458 100644 --- a/spec/migrations/20210205174154_remove_bad_dependency_proxy_manifests_spec.rb +++ b/spec/migrations/20210205174154_remove_bad_dependency_proxy_manifests_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('remove_bad_dependency_proxy_manifests') +require_migration! RSpec.describe RemoveBadDependencyProxyManifests, schema: 20210128140157 do let_it_be(:namespaces) { table(:namespaces) } diff --git a/spec/migrations/20210210093901_backfill_updated_at_after_repository_storage_move_spec.rb b/spec/migrations/20210210093901_backfill_updated_at_after_repository_storage_move_spec.rb index 1932bc00cee..4a31d36e2bc 100644 --- a/spec/migrations/20210210093901_backfill_updated_at_after_repository_storage_move_spec.rb +++ b/spec/migrations/20210210093901_backfill_updated_at_after_repository_storage_move_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('backfill_updated_at_after_repository_storage_move') +require_migration! RSpec.describe BackfillUpdatedAtAfterRepositoryStorageMove, :sidekiq do let_it_be(:projects) { table(:projects) } diff --git a/spec/migrations/20210218040814_add_environment_scope_to_group_variables_spec.rb b/spec/migrations/20210218040814_add_environment_scope_to_group_variables_spec.rb index e525101f3a0..039ce53cac4 100644 --- a/spec/migrations/20210218040814_add_environment_scope_to_group_variables_spec.rb +++ b/spec/migrations/20210218040814_add_environment_scope_to_group_variables_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('add_environment_scope_to_group_variables') +require_migration! RSpec.describe AddEnvironmentScopeToGroupVariables do let(:migration) { described_class.new } diff --git a/spec/migrations/20210226141517_dedup_issue_metrics_spec.rb b/spec/migrations/20210226141517_dedup_issue_metrics_spec.rb index 6068df85e2e..1b57bf0431f 100644 --- a/spec/migrations/20210226141517_dedup_issue_metrics_spec.rb +++ b/spec/migrations/20210226141517_dedup_issue_metrics_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('dedup_issue_metrics') +require_migration! RSpec.describe DedupIssueMetrics, :migration, schema: 20210205104425 do let(:namespaces) { table(:namespaces) } diff --git a/spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb b/spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb index 94ed2320c50..1f18f7e581a 100644 --- a/spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb +++ b/spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('backfill_total_tuple_count_for_batched_migrations') +require_migration! RSpec.describe BackfillTotalTupleCountForBatchedMigrations, :migration, schema: 20210406140057 do let_it_be(:table_name) { 'projects' } diff --git a/spec/migrations/20210413132500_reschedule_artifact_expiry_backfill_again_spec.rb b/spec/migrations/20210413132500_reschedule_artifact_expiry_backfill_again_spec.rb index 78b6a71c609..e1dc7487222 100644 --- a/spec/migrations/20210413132500_reschedule_artifact_expiry_backfill_again_spec.rb +++ b/spec/migrations/20210413132500_reschedule_artifact_expiry_backfill_again_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -require_migration!('reschedule_artifact_expiry_backfill_again') +require_migration! RSpec.describe RescheduleArtifactExpiryBackfillAgain, :migration do let(:migration_class) { Gitlab::BackgroundMigration::BackfillArtifactExpiryDate } diff --git a/spec/migrations/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url_spec.rb b/spec/migrations/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url_spec.rb index ea0a16212dd..9a59c739ecd 100644 --- a/spec/migrations/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url_spec.rb +++ b/spec/migrations/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('schedule_update_jira_tracker_data_deployment_type_based_on_url') +require_migration! RSpec.describe ScheduleUpdateJiraTrackerDataDeploymentTypeBasedOnUrl, :migration do let(:services_table) { table(:services) } diff --git a/spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb b/spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb index 3b462c884c4..faf440eb117 100644 --- a/spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb +++ b/spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('schedule_drop_invalid_vulnerabilities') +require_migration! RSpec.describe ScheduleDropInvalidVulnerabilities, :migration do let_it_be(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') } diff --git a/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb b/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb index 03ce0a430e5..598da495195 100644 --- a/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb +++ b/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb @@ -2,7 +2,7 @@ # require 'spec_helper' -require_migration!('copy_adoption_snapshot_namespace') +require_migration! RSpec.describe CopyAdoptionSnapshotNamespace, :migration, schema: 20210430124630 do let(:namespaces_table) { table(:namespaces) } diff --git a/spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb b/spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb index abdfd03f97e..25dfaa2e314 100644 --- a/spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb +++ b/spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -require_migration!('copy_adoption_segments_namespace') +require_migration! RSpec.describe CopyAdoptionSegmentsNamespace, :migration do let(:namespaces_table) { table(:namespaces) } diff --git a/spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb b/spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb index 4969d82d183..187b9115ba7 100644 --- a/spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb +++ b/spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -require_migration!('add_project_value_stream_id_to_project_stages') +require_migration! RSpec.describe AddProjectValueStreamIdToProjectStages, schema: 20210503105022 do let(:stages) { table(:analytics_cycle_analytics_project_stages) } diff --git a/spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb b/spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb index 969a2e58947..dd557c833f3 100644 --- a/spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb +++ b/spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('schedule_drop_invalid_vulnerabilities2') +require_migration! RSpec.describe ScheduleDropInvalidVulnerabilities2, :migration do let_it_be(:background_migration_jobs) { table(:background_migration_jobs) } diff --git a/spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb b/spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb index b7524ee0bff..4ac4af19eb9 100644 --- a/spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb +++ b/spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('schedule_cleanup_orphaned_lfs_objects_projects') +require_migration! RSpec.describe ScheduleCleanupOrphanedLfsObjectsProjects, schema: 20210511165250 do let(:lfs_objects_projects) { table(:lfs_objects_projects) } diff --git a/spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb b/spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb index 36d85d1f745..fa4b747aaed 100644 --- a/spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb +++ b/spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('fix_total_stage_in_vsa') +require_migration! RSpec.describe FixTotalStageInVsa, :migration, schema: 20210518001450 do let(:namespaces) { table(:namespaces) } diff --git a/spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb b/spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb index d3154596b26..8d45f571969 100644 --- a/spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb +++ b/spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('group_protected_environments_add_index_and_constraint') +require_migration! RSpec.describe GroupProtectedEnvironmentsAddIndexAndConstraint do let(:migration) { described_class.new } diff --git a/spec/migrations/20210603222333_remove_builds_email_service_from_services_spec.rb b/spec/migrations/20210603222333_remove_builds_email_service_from_services_spec.rb index c457be79834..14aa4fe8da7 100644 --- a/spec/migrations/20210603222333_remove_builds_email_service_from_services_spec.rb +++ b/spec/migrations/20210603222333_remove_builds_email_service_from_services_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -require_migration!('remove_builds_email_service_from_services') +require_migration! RSpec.describe RemoveBuildsEmailServiceFromServices do let(:namespaces) { table(:namespaces) } diff --git a/spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb b/spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb index 4f621d0670c..17599e75947 100644 --- a/spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb +++ b/spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -require_migration!('delete_legacy_operations_feature_flags') +require_migration! RSpec.describe DeleteLegacyOperationsFeatureFlags do let(:namespace) { table(:namespaces).create!(name: 'foo', path: 'bar') } diff --git a/spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb b/spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb index fd664d99f06..d35184e78a8 100644 --- a/spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb +++ b/spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -require_migration!('cascade_delete_freeze_periods') +require_migration! RSpec.describe CascadeDeleteFreezePeriods do let(:namespace) { table(:namespaces).create!(name: 'deploy_freeze', path: 'deploy_freeze') } diff --git a/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb b/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb index 9cc454662f9..7a281611650 100644 --- a/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb +++ b/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration! 'reschedule_merge_request_diff_users_background_migration' +require_migration! RSpec.describe RescheduleMergeRequestDiffUsersBackgroundMigration, :migration do let(:migration) { described_class.new } diff --git a/spec/migrations/20210722042939_update_issuable_slas_where_issue_closed_spec.rb b/spec/migrations/20210722042939_update_issuable_slas_where_issue_closed_spec.rb index a0aae00776d..63802acceb5 100644 --- a/spec/migrations/20210722042939_update_issuable_slas_where_issue_closed_spec.rb +++ b/spec/migrations/20210722042939_update_issuable_slas_where_issue_closed_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('update_issuable_slas_where_issue_closed') +require_migration! RSpec.describe UpdateIssuableSlasWhereIssueClosed, :migration do let(:namespaces) { table(:namespaces) } diff --git a/spec/migrations/20210722150102_operations_feature_flags_correct_flexible_rollout_values_spec.rb b/spec/migrations/20210722150102_operations_feature_flags_correct_flexible_rollout_values_spec.rb index 130ad45ffc1..94af2bb1e9a 100644 --- a/spec/migrations/20210722150102_operations_feature_flags_correct_flexible_rollout_values_spec.rb +++ b/spec/migrations/20210722150102_operations_feature_flags_correct_flexible_rollout_values_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -require_migration!('operations_feature_flags_correct_flexible_rollout_values') +require_migration! RSpec.describe OperationsFeatureFlagsCorrectFlexibleRolloutValues, :migration do let_it_be(:strategies) { table(:operations_strategies) } diff --git a/spec/migrations/20210804150320_create_base_work_item_types_spec.rb b/spec/migrations/20210804150320_create_base_work_item_types_spec.rb index 9ba29637e00..34ea7f53f51 100644 --- a/spec/migrations/20210804150320_create_base_work_item_types_spec.rb +++ b/spec/migrations/20210804150320_create_base_work_item_types_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('create_base_work_item_types') +require_migration! RSpec.describe CreateBaseWorkItemTypes, :migration do let!(:work_item_types) { table(:work_item_types) } 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 819120d43ef..0b2f76baf1a 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 @@ -2,7 +2,7 @@ require 'spec_helper' -require_migration!('update_trial_plans_ci_daily_pipeline_schedule_triggers') +require_migration! RSpec.describe UpdateTrialPlansCiDailyPipelineScheduleTriggers, :migration do let!(:plans) { table(:plans) } diff --git a/spec/migrations/20210811122206_update_external_project_bots_spec.rb b/spec/migrations/20210811122206_update_external_project_bots_spec.rb index a9c7b485cc6..365fb8e3218 100644 --- a/spec/migrations/20210811122206_update_external_project_bots_spec.rb +++ b/spec/migrations/20210811122206_update_external_project_bots_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('update_external_project_bots') +require_migration! RSpec.describe UpdateExternalProjectBots, :migration do def create_user(**extra_options) diff --git a/spec/migrations/20210818185845_backfill_projects_with_coverage_spec.rb b/spec/migrations/20210818185845_backfill_projects_with_coverage_spec.rb index d87f952b5da..29f554a003b 100644 --- a/spec/migrations/20210818185845_backfill_projects_with_coverage_spec.rb +++ b/spec/migrations/20210818185845_backfill_projects_with_coverage_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('backfill_projects_with_coverage') +require_migration! RSpec.describe BackfillProjectsWithCoverage do let(:projects) { table(:projects) } diff --git a/spec/migrations/20210819145000_drop_temporary_columns_and_triggers_for_ci_builds_runner_session_spec.rb b/spec/migrations/20210819145000_drop_temporary_columns_and_triggers_for_ci_builds_runner_session_spec.rb index b1751216732..4ad4bea058b 100644 --- a/spec/migrations/20210819145000_drop_temporary_columns_and_triggers_for_ci_builds_runner_session_spec.rb +++ b/spec/migrations/20210819145000_drop_temporary_columns_and_triggers_for_ci_builds_runner_session_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('drop_temporary_columns_and_triggers_for_ci_builds_runner_session') +require_migration! RSpec.describe DropTemporaryColumnsAndTriggersForCiBuildsRunnerSession, :migration do let(:ci_builds_runner_session_table) { table(:ci_builds_runner_session) } diff --git a/spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb b/spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb index c23110750c3..3c8c55ccb80 100644 --- a/spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb +++ b/spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('upsert_base_work_item_types') +require_migration! RSpec.describe UpsertBaseWorkItemTypes, :migration do let!(:work_item_types) { table(:work_item_types) } diff --git a/spec/migrations/20210902144144_drop_temporary_columns_and_triggers_for_ci_build_needs_spec.rb b/spec/migrations/20210902144144_drop_temporary_columns_and_triggers_for_ci_build_needs_spec.rb index 1b35982c41d..4ec3c5b7211 100644 --- a/spec/migrations/20210902144144_drop_temporary_columns_and_triggers_for_ci_build_needs_spec.rb +++ b/spec/migrations/20210902144144_drop_temporary_columns_and_triggers_for_ci_build_needs_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('drop_temporary_columns_and_triggers_for_ci_build_needs') +require_migration! RSpec.describe DropTemporaryColumnsAndTriggersForCiBuildNeeds do let(:ci_build_needs_table) { table(:ci_build_needs) } diff --git a/spec/migrations/20210906100316_drop_temporary_columns_and_triggers_for_ci_build_trace_chunks_spec.rb b/spec/migrations/20210906100316_drop_temporary_columns_and_triggers_for_ci_build_trace_chunks_spec.rb index 8d46ba7eb58..f1408e4ecab 100644 --- a/spec/migrations/20210906100316_drop_temporary_columns_and_triggers_for_ci_build_trace_chunks_spec.rb +++ b/spec/migrations/20210906100316_drop_temporary_columns_and_triggers_for_ci_build_trace_chunks_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('drop_temporary_columns_and_triggers_for_ci_build_trace_chunks') +require_migration! RSpec.describe DropTemporaryColumnsAndTriggersForCiBuildTraceChunks do let(:ci_build_trace_chunks_table) { table(:ci_build_trace_chunks) } diff --git a/spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb b/spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb index 2e7ce733373..e4385e501b2 100644 --- a/spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb +++ b/spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('drop_temporary_columns_and_triggers_for_taggings') +require_migration! RSpec.describe DropTemporaryColumnsAndTriggersForTaggings do let(:taggings_table) { table(:taggings) } diff --git a/spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb b/spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb index ece5ed8251d..194832fbc43 100644 --- a/spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb +++ b/spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('cleanup_bigint_conversion_for_ci_builds_metadata') +require_migration! RSpec.describe CleanupBigintConversionForCiBuildsMetadata do let(:ci_builds_metadata) { table(:ci_builds_metadata) } diff --git a/spec/migrations/20210907211557_finalize_ci_builds_bigint_conversion_spec.rb b/spec/migrations/20210907211557_finalize_ci_builds_bigint_conversion_spec.rb index 362b4be1bc6..c0f56da7b4f 100644 --- a/spec/migrations/20210907211557_finalize_ci_builds_bigint_conversion_spec.rb +++ b/spec/migrations/20210907211557_finalize_ci_builds_bigint_conversion_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('finalize_ci_builds_bigint_conversion') +require_migration! RSpec.describe FinalizeCiBuildsBigintConversion, :migration, schema: 20210907182359 do context 'with an unexpected FK fk_3f0c88d7dc' do diff --git a/spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb b/spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb index 46a6d8d92ec..c90eabbe4eb 100644 --- a/spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb +++ b/spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('update_report_type_for_existing_approval_project_rules') +require_migration! RSpec.describe UpdateReportTypeForExistingApprovalProjectRules, :migration do using RSpec::Parameterized::TableSyntax diff --git a/spec/migrations/20210914095310_cleanup_orphan_project_access_tokens_spec.rb b/spec/migrations/20210914095310_cleanup_orphan_project_access_tokens_spec.rb index 0d0f6a3df67..2b755dfe11c 100644 --- a/spec/migrations/20210914095310_cleanup_orphan_project_access_tokens_spec.rb +++ b/spec/migrations/20210914095310_cleanup_orphan_project_access_tokens_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('cleanup_orphan_project_access_tokens') +require_migration! RSpec.describe CleanupOrphanProjectAccessTokens, :migration do def create_user(**extra_options) diff --git a/spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb b/spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb index ee71322433d..cedc62a6565 100644 --- a/spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb +++ b/spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('cleanup_bigint_conversion_for_ci_builds') +require_migration! RSpec.describe CleanupBigintConversionForCiBuilds do let(:ci_builds) { table(:ci_builds) } diff --git a/spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb b/spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb index cf326cf0c0a..a6eede8a8f1 100644 --- a/spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb +++ b/spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('drop_int4_columns_for_ci_job_artifacts') +require_migration! RSpec.describe DropInt4ColumnsForCiJobArtifacts do let(:ci_job_artifacts) { table(:ci_job_artifacts) } diff --git a/spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb b/spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb index 00b922ee4f8..730c9ade1fb 100644 --- a/spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb +++ b/spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('drop_int4_column_for_ci_sources_pipelines') +require_migration! RSpec.describe DropInt4ColumnForCiSourcesPipelines do let(:ci_sources_pipelines) { table(:ci_sources_pipelines) } diff --git a/spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb b/spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb index 412556fc283..e460612a7d5 100644 --- a/spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb +++ b/spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('drop_int4_column_for_events') +require_migration! RSpec.describe DropInt4ColumnForEvents do let(:events) { table(:events) } diff --git a/spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb b/spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb index 2b286e3e5e0..8c89cd19f7f 100644 --- a/spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb +++ b/spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('drop_int4_column_for_push_event_payloads') +require_migration! RSpec.describe DropInt4ColumnForPushEventPayloads do let(:push_event_payloads) { table(:push_event_payloads) } diff --git a/spec/migrations/20211006060436_schedule_populate_topics_total_projects_count_cache_spec.rb b/spec/migrations/20211006060436_schedule_populate_topics_total_projects_count_cache_spec.rb index d07d9a71b06..09ce0858b12 100644 --- a/spec/migrations/20211006060436_schedule_populate_topics_total_projects_count_cache_spec.rb +++ b/spec/migrations/20211006060436_schedule_populate_topics_total_projects_count_cache_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('schedule_populate_topics_total_projects_count_cache') +require_migration! RSpec.describe SchedulePopulateTopicsTotalProjectsCountCache do let(:topics) { table(:topics) } diff --git a/spec/migrations/20211012134316_clean_up_migrate_merge_request_diff_commit_users_spec.rb b/spec/migrations/20211012134316_clean_up_migrate_merge_request_diff_commit_users_spec.rb new file mode 100644 index 00000000000..910e6d1d91b --- /dev/null +++ b/spec/migrations/20211012134316_clean_up_migrate_merge_request_diff_commit_users_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! 'clean_up_migrate_merge_request_diff_commit_users' + +RSpec.describe CleanUpMigrateMergeRequestDiffCommitUsers, :migration do + describe '#up' do + context 'when there are pending jobs' do + it 'processes the jobs immediately' do + Gitlab::Database::BackgroundMigrationJob.create!( + class_name: 'MigrateMergeRequestDiffCommitUsers', + status: :pending, + arguments: [10, 20] + ) + + spy = Gitlab::BackgroundMigration::MigrateMergeRequestDiffCommitUsers + migration = described_class.new + + allow(Gitlab::BackgroundMigration::MigrateMergeRequestDiffCommitUsers) + .to receive(:new) + .and_return(spy) + + expect(migration).to receive(:say) + expect(spy).to receive(:perform).with(10, 20) + + migration.up + end + end + + context 'when all jobs are completed' do + it 'does nothing' do + Gitlab::Database::BackgroundMigrationJob.create!( + class_name: 'MigrateMergeRequestDiffCommitUsers', + status: :succeeded, + arguments: [10, 20] + ) + + migration = described_class.new + + expect(migration).not_to receive(:say) + expect(Gitlab::BackgroundMigration::MigrateMergeRequestDiffCommitUsers) + .not_to receive(:new) + + migration.up + end + end + end +end diff --git a/spec/migrations/20201112130710_schedule_remove_duplicate_vulnerabilities_findings_spec.rb b/spec/migrations/20211018152654_schedule_remove_duplicate_vulnerabilities_findings3_spec.rb index 92a716c355b..95c5be2fc30 100644 --- a/spec/migrations/20201112130710_schedule_remove_duplicate_vulnerabilities_findings_spec.rb +++ b/spec/migrations/20211018152654_schedule_remove_duplicate_vulnerabilities_findings3_spec.rb @@ -1,14 +1,14 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('schedule_remove_duplicate_vulnerabilities_findings') +require_migration!('schedule_remove_duplicate_vulnerabilities_findings3') -RSpec.describe ScheduleRemoveDuplicateVulnerabilitiesFindings, :migration do +RSpec.describe ScheduleRemoveDuplicateVulnerabilitiesFindings3, :migration do let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') } let(:users) { table(:users) } let(:user) { create_user! } - let(:project) { table(:projects).create!(id: 123, namespace_id: namespace.id) } + let(:project) { table(:projects).create!(id: 14219619, namespace_id: namespace.id) } let(:scanners) { table(:vulnerability_scanners) } - let!(:scanner) { scanners.create!(project_id: project.id, external_id: 'test 1', name: 'test scanner 1') } + let!(:scanner1) { scanners.create!(project_id: project.id, external_id: 'test 1', name: 'test scanner 1') } let!(:scanner2) { scanners.create!(project_id: project.id, external_id: 'test 2', name: 'test scanner 2') } let!(:scanner3) { scanners.create!(project_id: project.id, external_id: 'test 3', name: 'test scanner 3') } let!(:unrelated_scanner) { scanners.create!(project_id: project.id, external_id: 'unreleated_scanner', name: 'unrelated scanner') } @@ -17,43 +17,68 @@ RSpec.describe ScheduleRemoveDuplicateVulnerabilitiesFindings, :migration do let(:vulnerability_identifiers) { table(:vulnerability_identifiers) } let(:vulnerability_identifier) do vulnerability_identifiers.create!( + id: 1244459, project_id: project.id, external_type: 'vulnerability-identifier', external_id: 'vulnerability-identifier', - fingerprint: '7e394d1b1eb461a7406d7b1e08f057a1cf11287a', + fingerprint: '0a203e8cd5260a1948edbedc76c7cb91ad6a2e45', name: 'vulnerability identifier') end - let!(:first_finding) do + let!(:vulnerability_for_first_duplicate) do + create_vulnerability!( + project_id: project.id, + author_id: user.id + ) + end + + let!(:first_finding_duplicate) do create_finding!( - uuid: "test1", - vulnerability_id: nil, + id: 5606961, + uuid: "bd95c085-71aa-51d7-9bb6-08ae669c262e", + vulnerability_id: vulnerability_for_first_duplicate.id, report_type: 0, - location_fingerprint: '2bda3014914481791847d8eca38d1a8d13b6ad76', + location_fingerprint: '00049d5119c2cb3bfb3d1ee1f6e031fe925aed75', primary_identifier_id: vulnerability_identifier.id, - scanner_id: scanner.id, + scanner_id: scanner1.id, project_id: project.id ) end - let!(:first_duplicate) do + let!(:vulnerability_for_second_duplicate) do + create_vulnerability!( + project_id: project.id, + author_id: user.id + ) + end + + let!(:second_finding_duplicate) do create_finding!( - uuid: "test2", - vulnerability_id: nil, + id: 8765432, + uuid: "5b714f58-1176-5b26-8fd5-e11dfcb031b5", + vulnerability_id: vulnerability_for_second_duplicate.id, report_type: 0, - location_fingerprint: '2bda3014914481791847d8eca38d1a8d13b6ad76', + location_fingerprint: '00049d5119c2cb3bfb3d1ee1f6e031fe925aed75', primary_identifier_id: vulnerability_identifier.id, scanner_id: scanner2.id, project_id: project.id ) end - let!(:second_duplicate) do + let!(:vulnerability_for_third_duplicate) do + create_vulnerability!( + project_id: project.id, + author_id: user.id + ) + end + + let!(:third_finding_duplicate) do create_finding!( - uuid: "test3", - vulnerability_id: nil, + id: 8832995, + uuid: "cfe435fa-b25b-5199-a56d-7b007cc9e2d4", + vulnerability_id: vulnerability_for_third_duplicate.id, report_type: 0, - location_fingerprint: '2bda3014914481791847d8eca38d1a8d13b6ad76', + location_fingerprint: '00049d5119c2cb3bfb3d1ee1f6e031fe925aed75', primary_identifier_id: vulnerability_identifier.id, scanner_id: scanner3.id, project_id: project.id @@ -62,6 +87,7 @@ RSpec.describe ScheduleRemoveDuplicateVulnerabilitiesFindings, :migration do let!(:unrelated_finding) do create_finding!( + id: 9999999, uuid: "unreleated_finding", vulnerability_id: nil, report_type: 1, @@ -84,9 +110,9 @@ RSpec.describe ScheduleRemoveDuplicateVulnerabilitiesFindings, :migration do migrate! expect(BackgroundMigrationWorker.jobs.size).to eq(4) - expect(described_class::MIGRATION).to be_scheduled_migration(first_finding.id, first_finding.id) - expect(described_class::MIGRATION).to be_scheduled_migration(first_duplicate.id, first_duplicate.id) - expect(described_class::MIGRATION).to be_scheduled_migration(second_duplicate.id, second_duplicate.id) + expect(described_class::MIGRATION).to be_scheduled_migration(first_finding_duplicate.id, first_finding_duplicate.id) + expect(described_class::MIGRATION).to be_scheduled_migration(second_finding_duplicate.id, second_finding_duplicate.id) + expect(described_class::MIGRATION).to be_scheduled_migration(third_finding_duplicate.id, third_finding_duplicate.id) expect(described_class::MIGRATION).to be_scheduled_migration(unrelated_finding.id, unrelated_finding.id) end @@ -105,11 +131,13 @@ RSpec.describe ScheduleRemoveDuplicateVulnerabilitiesFindings, :migration do # rubocop:disable Metrics/ParameterLists def create_finding!( + id: nil, vulnerability_id:, project_id:, scanner_id:, primary_identifier_id:, name: "test", severity: 7, confidence: 7, report_type: 0, project_fingerprint: '123qweasdzxc', location_fingerprint: 'test', metadata_version: 'test', raw_metadata: 'test', uuid: 'test') - vulnerability_findings.create!( + vulnerability_findings.create!({ + id: id, vulnerability_id: vulnerability_id, project_id: project_id, name: name, @@ -123,11 +151,11 @@ RSpec.describe ScheduleRemoveDuplicateVulnerabilitiesFindings, :migration do metadata_version: metadata_version, raw_metadata: raw_metadata, uuid: uuid - ) + }.compact) end # rubocop:enable Metrics/ParameterLists - def create_user!(name: "Example User", email: "user@example.com", user_type: nil, created_at: Time.now, confirmed_at: Time.now) + def create_user!(name: "Example User", email: "user@example.com", user_type: nil, created_at: Time.zone.now, confirmed_at: Time.zone.now) users.create!( name: name, email: email, diff --git a/spec/migrations/20211028155449_schedule_fix_merge_request_diff_commit_users_migration_spec.rb b/spec/migrations/20211028155449_schedule_fix_merge_request_diff_commit_users_migration_spec.rb new file mode 100644 index 00000000000..6511f554436 --- /dev/null +++ b/spec/migrations/20211028155449_schedule_fix_merge_request_diff_commit_users_migration_spec.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! 'schedule_fix_merge_request_diff_commit_users_migration' + +RSpec.describe ScheduleFixMergeRequestDiffCommitUsersMigration, :migration do + let(:migration) { described_class.new } + let(:namespaces) { table(:namespaces) } + let(:projects) { table(:projects) } + let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } + + describe '#up' do + it 'does nothing when there are no projects to correct' do + migration.up + + expect(Gitlab::Database::BackgroundMigrationJob.count).to be_zero + end + + it 'schedules imported projects created after July' do + project = projects.create!( + namespace_id: namespace.id, + import_type: 'gitlab_project', + created_at: '2021-08-01' + ) + + expect(migration) + .to receive(:migrate_in) + .with(2.minutes, 'FixMergeRequestDiffCommitUsers', [project.id]) + + migration.up + + expect(Gitlab::Database::BackgroundMigrationJob.count).to eq(1) + + job = Gitlab::Database::BackgroundMigrationJob.first + + expect(job.class_name).to eq('FixMergeRequestDiffCommitUsers') + expect(job.arguments).to eq([project.id]) + end + + it 'ignores projects imported before July' do + projects.create!( + namespace_id: namespace.id, + import_type: 'gitlab_project', + created_at: '2020-08-01' + ) + + migration.up + + expect(Gitlab::Database::BackgroundMigrationJob.count).to be_zero + end + + it 'ignores projects that are not imported' do + projects.create!( + namespace_id: namespace.id, + created_at: '2021-08-01' + ) + + migration.up + + expect(Gitlab::Database::BackgroundMigrationJob.count).to be_zero + end + end +end diff --git a/spec/migrations/add_default_value_stream_to_groups_with_group_stages_spec.rb b/spec/migrations/add_default_value_stream_to_groups_with_group_stages_spec.rb deleted file mode 100644 index f21acbc56df..00000000000 --- a/spec/migrations/add_default_value_stream_to_groups_with_group_stages_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe AddDefaultValueStreamToGroupsWithGroupStages, schema: 20200624142207 do - let(:groups) { table(:namespaces) } - let(:group_stages) { table(:analytics_cycle_analytics_group_stages) } - let(:value_streams) { table(:analytics_cycle_analytics_group_value_streams) } - - let!(:group) { groups.create!(name: 'test', path: 'path', type: 'Group') } - let!(:group_stage) { group_stages.create!(name: 'test', group_id: group.id, start_event_identifier: 1, end_event_identifier: 2) } - - describe '#up' do - it 'creates default value stream record for the group' do - migrate! - - group_value_streams = value_streams.where(group_id: group.id) - expect(group_value_streams.size).to eq(1) - - value_stream = group_value_streams.first - expect(value_stream.name).to eq('default') - end - - it 'migrates existing stages to the default value stream' do - migrate! - - group_stage.reload - - value_stream = value_streams.find_by(group_id: group.id, name: 'default') - expect(group_stage.group_value_stream_id).to eq(value_stream.id) - end - end - - describe '#down' do - it 'sets the group_value_stream_id to nil' do - described_class.new.down - - group_stage.reload - - expect(group_stage.group_value_stream_id).to be_nil - end - end -end diff --git a/spec/migrations/add_deploy_token_type_to_deploy_tokens_spec.rb b/spec/migrations/add_deploy_token_type_to_deploy_tokens_spec.rb deleted file mode 100644 index f90bfcd313c..00000000000 --- a/spec/migrations/add_deploy_token_type_to_deploy_tokens_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe AddDeployTokenTypeToDeployTokens do - let(:deploy_tokens) { table(:deploy_tokens) } - let(:deploy_token) do - deploy_tokens.create!(name: 'token_test', - username: 'gitlab+deploy-token-1', - token_encrypted: 'dr8rPXwM+Mbs2p3Bg1+gpnXqrnH/wu6vaHdcc7A3isPR67WB', - read_repository: true, - expires_at: Time.now + 1.year) - end - - it 'updates the deploy_token_type column to 2' do - expect(deploy_token).not_to respond_to(:deploy_token_type) - - migrate! - - deploy_token.reload - expect(deploy_token.deploy_token_type).to eq(2) - end -end diff --git a/spec/migrations/add_incident_settings_to_all_existing_projects_spec.rb b/spec/migrations/add_incident_settings_to_all_existing_projects_spec.rb deleted file mode 100644 index 3e0bc64bb23..00000000000 --- a/spec/migrations/add_incident_settings_to_all_existing_projects_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe AddIncidentSettingsToAllExistingProjects, :migration do - let(:project_incident_management_settings) { table(:project_incident_management_settings) } - let(:labels) { table(:labels) } - let(:label_links) { table(:label_links) } - let(:issues) { table(:issues) } - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - - RSpec.shared_examples 'setting not added' do - it 'does not add settings' do - migrate! - - expect { migrate! }.not_to change { IncidentManagement::ProjectIncidentManagementSetting.count } - end - end - - RSpec.shared_examples 'project has no incident settings' do - it 'has no settings' do - migrate! - - expect(settings).to eq(nil) - end - end - - RSpec.shared_examples 'no change to incident settings' do - it 'does not change existing settings' do - migrate! - - expect(settings.create_issue).to eq(existing_create_issue) - end - end - - RSpec.shared_context 'with incident settings' do - let(:existing_create_issue) { false } - before do - project_incident_management_settings.create!( - project_id: project.id, - create_issue: existing_create_issue - ) - end - end - - describe 'migrate!' do - let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } - let!(:project) { projects.create!(namespace_id: namespace.id) } - let(:settings) { project_incident_management_settings.find_by(project_id: project.id) } - - context 'when project does not have incident label' do - context 'does not have incident settings' do - include_examples 'setting not added' - include_examples 'project has no incident settings' - end - - context 'and has incident settings' do - include_context 'with incident settings' - - include_examples 'setting not added' - include_examples 'no change to incident settings' - end - end - - context 'when project has incident labels' do - before do - issue = issues.create!(project_id: project.id) - incident_label_attrs = IncidentManagement::CreateIncidentLabelService::LABEL_PROPERTIES - incident_label = labels.create!(project_id: project.id, **incident_label_attrs) - label_links.create!(target_id: issue.id, label_id: incident_label.id, target_type: 'Issue') - end - - context 'when project has incident settings' do - include_context 'with incident settings' - - include_examples 'setting not added' - include_examples 'no change to incident settings' - end - - context 'does not have incident settings' do - it 'adds incident settings with old defaults' do - migrate! - - expect(settings.create_issue).to eq(true) - expect(settings.send_email).to eq(false) - expect(settings.issue_template_key).to eq(nil) - end - end - end - end -end diff --git a/spec/migrations/add_open_source_plan_spec.rb b/spec/migrations/add_open_source_plan_spec.rb new file mode 100644 index 00000000000..04b26662f82 --- /dev/null +++ b/spec/migrations/add_open_source_plan_spec.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +require 'spec_helper' + +require_migration! + +RSpec.describe AddOpenSourcePlan, :migration do + describe '#up' do + before do + allow(Gitlab).to receive(:dev_env_or_com?).and_return true + end + + it 'creates 1 entry within the plans table' do + expect { migrate! }.to change { AddOpenSourcePlan::Plan.count }.by 1 + expect(AddOpenSourcePlan::Plan.last.name).to eql('opensource') + end + + it 'creates 1 entry for plan limits' do + expect { migrate! }.to change { AddOpenSourcePlan::PlanLimits.count }.by 1 + end + + context 'when the plan limits for gold and silver exists' do + before do + table(:plans).create!(id: 1, name: 'ultimate', title: 'Ultimate') + table(:plan_limits).create!(id: 1, plan_id: 1, storage_size_limit: 2000) + end + + it 'duplicates the gold and silvers plan limits entries' do + migrate! + + opensource_limits = AddOpenSourcePlan::Plan.find_by(name: 'opensource').limits + expect(opensource_limits.storage_size_limit).to be 2000 + end + end + + context 'when the instance is not SaaS' do + before do + allow(Gitlab).to receive(:dev_env_or_com?).and_return false + end + + it 'does not create plans and plan limits and returns' do + expect { migrate! }.not_to change { AddOpenSourcePlan::Plan.count } + end + end + end + + describe '#down' do + before do + table(:plans).create!(id: 3, name: 'other') + table(:plan_limits).create!(plan_id: 3) + end + + context 'when the instance is SaaS' do + before do + allow(Gitlab).to receive(:dev_env_or_com?).and_return true + end + + it 'removes the newly added opensource entry' do + migrate! + + expect { described_class.new.down }.to change { AddOpenSourcePlan::Plan.count }.by(-1) + expect(AddOpenSourcePlan::Plan.find_by(name: 'opensource')).to be_nil + + other_plan = AddOpenSourcePlan::Plan.find_by(name: 'other') + expect(other_plan).to be_persisted + expect(AddOpenSourcePlan::PlanLimits.count).to eq(1) + expect(AddOpenSourcePlan::PlanLimits.first.plan_id).to eq(other_plan.id) + end + end + + context 'when the instance is not SaaS' do + before do + allow(Gitlab).to receive(:dev_env_or_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 + + it 'does not delete plans and plan limits and returns' do + migrate! + + expect { described_class.new.down }.not_to change { AddOpenSourcePlan::Plan.count } + expect(AddOpenSourcePlan::PlanLimits.count).to eq(2) + end + end + end +end diff --git a/spec/migrations/add_partial_index_to_ci_builds_table_on_user_id_name_spec.rb b/spec/migrations/add_partial_index_to_ci_builds_table_on_user_id_name_spec.rb deleted file mode 100644 index ab4d6f43797..00000000000 --- a/spec/migrations/add_partial_index_to_ci_builds_table_on_user_id_name_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe AddPartialIndexToCiBuildsTableOnUserIdName do - let(:migration) { described_class.new } - - describe '#up' do - it 'creates temporary partial index on type' do - expect { migration.up }.to change { migration.index_exists?(:ci_builds, [:user_id, :name], name: described_class::INDEX_NAME) }.from(false).to(true) - end - end - - describe '#down' do - it 'removes temporary partial index on type' do - migration.up - - expect { migration.down }.to change { migration.index_exists?(:ci_builds, [:user_id, :name], name: described_class::INDEX_NAME) }.from(true).to(false) - end - end -end diff --git a/spec/migrations/add_repository_storages_weighted_to_application_settings_spec.rb b/spec/migrations/add_repository_storages_weighted_to_application_settings_spec.rb deleted file mode 100644 index bc4c510fea3..00000000000 --- a/spec/migrations/add_repository_storages_weighted_to_application_settings_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe AddRepositoryStoragesWeightedToApplicationSettings, :migration do - let(:storages) { { "foo" => {}, "baz" => {} } } - let(:application_settings) do - table(:application_settings).tap do |klass| - klass.class_eval do - serialize :repository_storages - end - end - end - - before do - allow(Gitlab.config.repositories).to receive(:storages).and_return(storages) - end - - let(:application_setting) { application_settings.create! } - let(:repository_storages) { ["foo"] } - - it 'populates repository_storages_weighted properly' do - application_setting.repository_storages = repository_storages - application_setting.save! - - migrate! - - expect(application_settings.find(application_setting.id).repository_storages_weighted).to eq({ "foo" => 100, "baz" => 0 }) - end -end diff --git a/spec/migrations/add_temporary_partial_index_on_project_id_to_services_spec.rb b/spec/migrations/add_temporary_partial_index_on_project_id_to_services_spec.rb deleted file mode 100644 index dae0241b895..00000000000 --- a/spec/migrations/add_temporary_partial_index_on_project_id_to_services_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe AddTemporaryPartialIndexOnProjectIdToServices do - let(:migration) { described_class.new } - - describe '#up' do - it 'creates temporary partial index on type' do - expect { migration.up }.to change { migration.index_exists?(:services, :project_id, name: described_class::INDEX_NAME) }.from(false).to(true) - end - end - - describe '#down' do - it 'removes temporary partial index on type' do - migration.up - - expect { migration.down }.to change { migration.index_exists?(:services, :project_id, name: described_class::INDEX_NAME) }.from(true).to(false) - end - end -end diff --git a/spec/migrations/backfill_imported_snippet_repositories_spec.rb b/spec/migrations/backfill_imported_snippet_repositories_spec.rb deleted file mode 100644 index 7052433c66d..00000000000 --- a/spec/migrations/backfill_imported_snippet_repositories_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe BackfillImportedSnippetRepositories do - let(:users) { table(:users) } - let(:snippets) { table(:snippets) } - let(:user) { users.create!(id: 1, email: 'user@example.com', projects_limit: 10, username: 'test', name: 'Test', state: 'active') } - - def create_snippet(id) - params = { - id: id, - type: 'PersonalSnippet', - author_id: user.id, - file_name: 'foo', - content: 'bar' - } - - snippets.create!(params) - end - - it 'correctly schedules background migrations' do - create_snippet(1) - create_snippet(2) - create_snippet(3) - create_snippet(5) - create_snippet(7) - create_snippet(8) - create_snippet(10) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes, 1, 3) - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(4.minutes, 5, 5) - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(6.minutes, 7, 8) - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(8.minutes, 10, 10) - - expect(BackgroundMigrationWorker.jobs.size).to eq(4) - end - end - end -end diff --git a/spec/migrations/backfill_operations_feature_flags_iid_spec.rb b/spec/migrations/backfill_operations_feature_flags_iid_spec.rb deleted file mode 100644 index 3c400840f98..00000000000 --- a/spec/migrations/backfill_operations_feature_flags_iid_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe BackfillOperationsFeatureFlagsIid do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:flags) { table(:operations_feature_flags) } - - def setup - namespace = namespaces.create!(name: 'foo', path: 'foo') - projects.create!(namespace_id: namespace.id) - end - - it 'migrates successfully when there are no flags in the database' do - setup - - disable_migrations_output { migrate! } - - expect(flags.count).to eq(0) - end - - it 'migrates successfully with a row in the table in both FOSS and EE' do - project = setup - flags.create!(project_id: project.id, active: true, name: 'test_flag') - - disable_migrations_output { migrate! } - - expect(flags.count).to eq(1) - end -end diff --git a/spec/migrations/backfill_snippet_repositories_spec.rb b/spec/migrations/backfill_snippet_repositories_spec.rb deleted file mode 100644 index 64cfc9cc57b..00000000000 --- a/spec/migrations/backfill_snippet_repositories_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe BackfillSnippetRepositories do - let(:users) { table(:users) } - let(:snippets) { table(:snippets) } - let(:user) { users.create!(id: 1, email: 'user@example.com', projects_limit: 10, username: 'test', name: 'Test', state: 'active') } - - def create_snippet(id) - params = { - id: id, - type: 'PersonalSnippet', - author_id: user.id, - file_name: 'foo', - content: 'bar' - } - - snippets.create!(params) - end - - it 'correctly schedules background migrations' do - create_snippet(1) - create_snippet(2) - create_snippet(3) - - stub_const("#{described_class.name}::BATCH_SIZE", 2) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(3.minutes, 1, 2) - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(6.minutes, 3, 3) - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end -end diff --git a/spec/migrations/backfill_status_page_published_incidents_spec.rb b/spec/migrations/backfill_status_page_published_incidents_spec.rb deleted file mode 100644 index fa4bb182362..00000000000 --- a/spec/migrations/backfill_status_page_published_incidents_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe BackfillStatusPagePublishedIncidents, :migration do - subject(:migration) { described_class.new } - - describe '#up' do - let(:projects) { table(:projects) } - let(:status_page_settings) { table(:status_page_settings) } - let(:issues) { table(:issues) } - let(:incidents) { table(:status_page_published_incidents) } - - let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab') } - let(:project_without_status_page) { projects.create!(namespace_id: namespace.id) } - let(:enabled_project) { projects.create!(namespace_id: namespace.id) } - let(:disabled_project) { projects.create!(namespace_id: namespace.id) } - - let!(:enabled_setting) { status_page_settings.create!(enabled: true, project_id: enabled_project.id, **status_page_setting_attrs) } - let!(:disabled_setting) { status_page_settings.create!(enabled: false, project_id: disabled_project.id, **status_page_setting_attrs) } - - let!(:published_issue) { issues.create!(confidential: false, project_id: enabled_project.id) } - let!(:nonpublished_issue_1) { issues.create!(confidential: true, project_id: enabled_project.id) } - let!(:nonpublished_issue_2) { issues.create!(confidential: false, project_id: disabled_project.id) } - let!(:nonpublished_issue_3) { issues.create!(confidential: false, project_id: project_without_status_page.id) } - - let(:current_time) { Time.current.change(usec: 0) } - let(:status_page_setting_attrs) do - { - aws_s3_bucket_name: 'bucket', - aws_region: 'region', - aws_access_key: 'key', - encrypted_aws_secret_key: 'abc123', - encrypted_aws_secret_key_iv: 'abc123' - } - end - - it 'creates a StatusPage::PublishedIncident record for each published issue' do - travel_to(current_time) do - expect(incidents.all).to be_empty - - migrate! - - incident = incidents.first - - expect(incidents.count).to eq(1) - expect(incident.issue_id).to eq(published_issue.id) - expect(incident.created_at).to eq(current_time) - expect(incident.updated_at).to eq(current_time) - end - end - end -end diff --git a/spec/migrations/backfill_user_namespace_spec.rb b/spec/migrations/backfill_user_namespace_spec.rb new file mode 100644 index 00000000000..094aec82e9c --- /dev/null +++ b/spec/migrations/backfill_user_namespace_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe BackfillUserNamespace do + let_it_be(:migration) { described_class::MIGRATION } + + describe '#up' do + it 'schedules background jobs for each batch of namespaces' do + migrate! + + expect(migration).to have_scheduled_batched_migration( + table_name: :namespaces, + 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/cap_designs_filename_length_to_new_limit_spec.rb b/spec/migrations/cap_designs_filename_length_to_new_limit_spec.rb deleted file mode 100644 index 702f2e6d9bd..00000000000 --- a/spec/migrations/cap_designs_filename_length_to_new_limit_spec.rb +++ /dev/null @@ -1,62 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe CapDesignsFilenameLengthToNewLimit, :migration, schema: 20200528125905 do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:issues) { table(:issues) } - let(:designs) { table(:design_management_designs) } - - let(:filename_below_limit) { generate_filename(254) } - let(:filename_at_limit) { generate_filename(255) } - let(:filename_above_limit) { generate_filename(256) } - - let!(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } - let!(:project) { projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab', namespace_id: namespace.id) } - let!(:issue) { issues.create!(description: 'issue', project_id: project.id) } - - def generate_filename(length, extension: '.png') - name = 'a' * (length - extension.length) - - "#{name}#{extension}" - end - - def create_design(filename) - designs.create!( - issue_id: issue.id, - project_id: project.id, - filename: filename - ) - end - - it 'correctly sets filenames that are above the limit' do - designs = [ - filename_below_limit, - filename_at_limit, - filename_above_limit - ].map(&method(:create_design)) - - migrate! - - designs.each(&:reload) - - expect(designs[0].filename).to eq(filename_below_limit) - expect(designs[1].filename).to eq(filename_at_limit) - expect(designs[2].filename).to eq([described_class::MODIFIED_NAME, designs[2].id, described_class::MODIFIED_EXTENSION].join) - end - - it 'runs after filename limit has been set' do - # This spec file uses the `schema:` keyword to run these tests - # against a schema version before the one that sets the limit, - # as otherwise we can't create the design data with filenames greater - # than the limit. - # - # For this test, we migrate any skipped versions up to this migration. - migration_context.migrate(20200602013901) - - create_design(filename_at_limit) - expect { create_design(filename_above_limit) }.to raise_error(ActiveRecord::StatementInvalid) - end -end diff --git a/spec/migrations/clean_grafana_url_spec.rb b/spec/migrations/clean_grafana_url_spec.rb deleted file mode 100644 index 7a81eb3058b..00000000000 --- a/spec/migrations/clean_grafana_url_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe CleanGrafanaUrl do - let(:application_settings_table) { table(:application_settings) } - - [ - 'javascript:alert(window.opener.document.location)', - ' javascript:alert(window.opener.document.location)' - ].each do |grafana_url| - it "sets grafana_url back to its default value when grafana_url is '#{grafana_url}'" do - application_settings = application_settings_table.create!(grafana_url: grafana_url) - - migrate! - - expect(application_settings.reload.grafana_url).to eq('/-/grafana') - end - end - - ['/-/grafana', '/some/relative/url', 'http://localhost:9000'].each do |grafana_url| - it "does not modify grafana_url when grafana_url is '#{grafana_url}'" do - application_settings = application_settings_table.create!(grafana_url: grafana_url) - - migrate! - - expect(application_settings.reload.grafana_url).to eq(grafana_url) - end - end - - context 'when application_settings table has no rows' do - it 'does not fail' do - migrate! - end - end -end diff --git a/spec/migrations/cleanup_empty_commit_user_mentions_spec.rb b/spec/migrations/cleanup_empty_commit_user_mentions_spec.rb deleted file mode 100644 index d128c13e212..00000000000 --- a/spec/migrations/cleanup_empty_commit_user_mentions_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe CleanupEmptyCommitUserMentions, :migration, :sidekiq do - let(:users) { table(:users) } - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:notes) { table(:notes) } - - let(:user) { users.create!(name: 'root', email: 'root@example.com', username: 'root', projects_limit: 0) } - let(:group) { namespaces.create!(name: 'group1', path: 'group1', owner_id: user.id) } - let(:project) { projects.create!(name: 'gitlab1', path: 'gitlab1', namespace_id: group.id, visibility_level: 0) } - - let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') } - let(:commit) { Commit.new(RepoHelpers.sample_commit, project) } - let(:commit_user_mentions) { table(:commit_user_mentions) } - - let!(:resource1) { notes.create!(commit_id: commit.id, noteable_type: 'Commit', project_id: project.id, author_id: user.id, note: 'note1 for @root to check') } - let!(:resource2) { notes.create!(commit_id: commit.id, noteable_type: 'Commit', project_id: project.id, author_id: user.id, note: 'note1 for @root to check') } - let!(:resource3) { notes.create!(commit_id: commit.id, noteable_type: 'Commit', project_id: project.id, author_id: user.id, note: 'note1 for @root to check', system: true) } - - # this note is already migrated, as it has a record in the commit_user_mentions table - let!(:resource4) { notes.create!(note: 'note3 for @root to check', commit_id: commit.id, noteable_type: 'Commit') } - let!(:user_mention) { commit_user_mentions.create!(commit_id: commit.id, note_id: resource4.id, mentioned_users_ids: [1]) } - - # these should get cleanup, by the migration - let!(:blank_commit_user_mention1) { commit_user_mentions.create!(commit_id: commit.id, note_id: resource1.id)} - let!(:blank_commit_user_mention2) { commit_user_mentions.create!(commit_id: commit.id, note_id: resource2.id)} - let!(:blank_commit_user_mention3) { commit_user_mentions.create!(commit_id: commit.id, note_id: resource3.id)} - - it 'cleanups blank user mentions' do - expect { migrate! }.to change { commit_user_mentions.count }.by(-3) - end -end 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 deleted file mode 100644 index acd6a19779d..00000000000 --- a/spec/migrations/cleanup_group_import_states_with_null_user_id_spec.rb +++ /dev/null @@ -1,101 +0,0 @@ -# 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_migration!('add_not_null_constraint_to_user_on_group_import_states') -require_migration! - -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 diff --git a/spec/migrations/cleanup_move_container_registry_enabled_to_project_features_spec.rb b/spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb index 3c39327304e..f0f9249515b 100644 --- a/spec/migrations/cleanup_move_container_registry_enabled_to_project_features_spec.rb +++ b/spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration!('cleanup_move_container_registry_enabled_to_project_feature') +require_migration! RSpec.describe CleanupMoveContainerRegistryEnabledToProjectFeature, :migration do let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab-org') } diff --git a/spec/migrations/cleanup_optimistic_locking_nulls_pt2_fixed_spec.rb b/spec/migrations/cleanup_optimistic_locking_nulls_pt2_fixed_spec.rb deleted file mode 100644 index 2f461ebc1d5..00000000000 --- a/spec/migrations/cleanup_optimistic_locking_nulls_pt2_fixed_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('cleanup_optimistic_locking_nulls_pt2_fixed') - -RSpec.describe CleanupOptimisticLockingNullsPt2Fixed, :migration, schema: 20200219193117 do - test_tables = %w(ci_stages ci_builds ci_pipelines).freeze - test_tables.each do |table| - let(table.to_sym) { table(table.to_sym) } - end - let(:tables) { test_tables.map { |t| method(t.to_sym).call } } - - before do - # Create necessary rows - ci_stages.create! - ci_builds.create! - ci_pipelines.create! - - # Nullify `lock_version` column for all rows - # Needs to be done with a SQL fragment, otherwise Rails will coerce it to 0 - tables.each do |table| - table.update_all('lock_version = NULL') - end - end - - it 'correctly migrates nullified lock_version column', :sidekiq_might_not_need_inline do - tables.each do |table| - expect(table.where(lock_version: nil).count).to eq(1) - end - - tables.each do |table| - expect(table.where(lock_version: 0).count).to eq(0) - end - - migrate! - - tables.each do |table| - expect(table.where(lock_version: nil).count).to eq(0) - end - - tables.each do |table| - expect(table.where(lock_version: 0).count).to eq(1) - end - end -end diff --git a/spec/migrations/cleanup_optimistic_locking_nulls_spec.rb b/spec/migrations/cleanup_optimistic_locking_nulls_spec.rb deleted file mode 100644 index a287d950c89..00000000000 --- a/spec/migrations/cleanup_optimistic_locking_nulls_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('cleanup_optimistic_locking_nulls') - -RSpec.describe CleanupOptimisticLockingNulls do - let(:epics) { table(:epics) } - let(:merge_requests) { table(:merge_requests) } - let(:issues) { table(:issues) } - let(:tables) { [epics, merge_requests, issues] } - - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:users) { table(:users)} - - before do - namespaces.create!(id: 123, name: 'gitlab1', path: 'gitlab1') - projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1', namespace_id: 123) - users.create!(id: 123, username: 'author', projects_limit: 1000) - - # Create necessary rows - epics.create!(iid: 123, group_id: 123, author_id: 123, title: 'a', title_html: 'a') - merge_requests.create!(iid: 123, target_project_id: 123, source_project_id: 123, target_branch: 'master', source_branch: 'hmm', title: 'a', title_html: 'a') - issues.create!(iid: 123, project_id: 123, title: 'a', title_html: 'a') - - # Nullify `lock_version` column for all rows - # Needs to be done with a SQL fragment, otherwise Rails will coerce it to 0 - tables.each do |table| - table.update_all('lock_version = NULL') - end - end - - it 'correctly migrates nullified lock_version column', :sidekiq_inline do - tables.each do |table| - expect(table.where(lock_version: nil).count).to eq(1) - end - - tables.each do |table| - expect(table.where(lock_version: 0).count).to eq(0) - end - - migrate! - - tables.each do |table| - expect(table.where(lock_version: nil).count).to eq(0) - end - - tables.each do |table| - expect(table.where(lock_version: 0).count).to eq(1) - end - end -end diff --git a/spec/migrations/cleanup_projects_with_missing_namespace_spec.rb b/spec/migrations/cleanup_projects_with_missing_namespace_spec.rb deleted file mode 100644 index c640bfcd174..00000000000 --- a/spec/migrations/cleanup_projects_with_missing_namespace_spec.rb +++ /dev/null @@ -1,142 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration!('add_projects_foreign_key_to_namespaces') -require_migration! - -# In order to test the CleanupProjectsWithMissingNamespace migration, we need -# to first create an orphaned project (one with an invalid namespace_id) -# and then run the migration to check that the project was properly cleaned up -# -# The problem is that the CleanupProjectsWithMissingNamespace migration comes -# after the FK has been added with a previous migration (AddProjectsForeignKeyToNamespaces) -# That means that while testing the current class we can not insert projects with an -# invalid namespace_id as the existing FK is correctly blocking us from doing so -# -# The approach that solves that problem is to: -# - Set the schema of this test to the one prior to AddProjectsForeignKeyToNamespaces -# - We could hardcode it to `20200508091106` (which currently is the previous -# migration before adding the FK) but that would mean that this test depends -# on migration 20200508091106 not being reverted or deleted -# - So, we use SchemaVersionFinder that finds the previous migration and returns -# its schema, which we then use in the describe -# -# That means that we lock the schema version to the one returned by -# SchemaVersionFinder.previous_migration and only test the cleanup migration -# *without* the migration that adds the Foreign Key ever running -# That's acceptable as the cleanup script should not be affected in any way -# by the migration that adds the Foreign Key -class SchemaVersionFinder - def self.migrations_paths - ActiveRecord::Migrator.migrations_paths - end - - def self.migration_context - ActiveRecord::MigrationContext.new(migrations_paths, ActiveRecord::SchemaMigration) - end - - def self.migrations - migration_context.migrations - end - - def self.previous_migration - migrations.each_cons(2) do |previous, migration| - break previous.version if migration.name == AddProjectsForeignKeyToNamespaces.name - end - end -end - -RSpec.describe CleanupProjectsWithMissingNamespace, :migration, schema: SchemaVersionFinder.previous_migration do - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - let(:users) { table(:users) } - - before do - namespace = namespaces.create!(name: 'existing_namespace', path: 'existing_namespace') - - projects.create!( - name: 'project_with_existing_namespace', - path: 'project_with_existing_namespace', - visibility_level: 20, - archived: false, - namespace_id: namespace.id - ) - - projects.create!( - name: 'project_with_non_existing_namespace', - path: 'project_with_non_existing_namespace', - visibility_level: 20, - archived: false, - namespace_id: non_existing_record_id - ) - end - - it 'creates the ghost user' do - expect(users.where(user_type: described_class::User::USER_TYPE_GHOST).count).to eq(0) - - disable_migrations_output { migrate! } - - expect(users.where(user_type: described_class::User::USER_TYPE_GHOST).count).to eq(1) - end - - it 'creates the lost-and-found group, owned by the ghost user' do - expect( - described_class::Group.where( - described_class::Group - .arel_table[:name] - .matches("#{described_class::User::LOST_AND_FOUND_GROUP}%") - ).count - ).to eq(0) - - disable_migrations_output { migrate! } - - ghost_user = users.find_by(user_type: described_class::User::USER_TYPE_GHOST) - expect( - described_class::Group - .joins('INNER JOIN members ON namespaces.id = members.source_id') - .where(namespaces: { type: 'Group' }) - .where(members: { type: 'GroupMember' }) - .where(members: { source_type: 'Namespace' }) - .where(members: { user_id: ghost_user.id }) - .where(members: { requested_at: nil }) - .where(members: { access_level: described_class::ACCESS_LEVEL_OWNER }) - .where( - described_class::Group - .arel_table[:name] - .matches("#{described_class::User::LOST_AND_FOUND_GROUP}%") - ) - .count - ).to eq(1) - end - - it 'moves the orphaned project to the lost-and-found group' do - orphaned_project = projects.find_by(name: 'project_with_non_existing_namespace') - expect(orphaned_project.visibility_level).to eq(20) - expect(orphaned_project.archived).to eq(false) - expect(orphaned_project.namespace_id).to eq(non_existing_record_id) - - disable_migrations_output { migrate! } - - lost_and_found_group = described_class::Group.find_by( - described_class::Group - .arel_table[:name] - .matches("#{described_class::User::LOST_AND_FOUND_GROUP}%") - ) - orphaned_project = projects.find_by(id: orphaned_project.id) - - expect(orphaned_project.visibility_level).to eq(0) - expect(orphaned_project.namespace_id).to eq(lost_and_found_group.id) - expect(orphaned_project.name).to eq("project_with_non_existing_namespace_#{orphaned_project.id}") - expect(orphaned_project.path).to eq("project_with_non_existing_namespace_#{orphaned_project.id}") - expect(orphaned_project.archived).to eq(true) - - valid_project = projects.find_by(name: 'project_with_existing_namespace') - existing_namespace = namespaces.find_by(name: 'existing_namespace') - - expect(valid_project.visibility_level).to eq(20) - expect(valid_project.namespace_id).to eq(existing_namespace.id) - expect(valid_project.path).to eq('project_with_existing_namespace') - expect(valid_project.archived).to eq(false) - end -end diff --git a/spec/migrations/cleanup_remaining_orphan_invites_spec.rb b/spec/migrations/cleanup_remaining_orphan_invites_spec.rb index 0eb1f5a578a..987535a4f09 100644 --- a/spec/migrations/cleanup_remaining_orphan_invites_spec.rb +++ b/spec/migrations/cleanup_remaining_orphan_invites_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration! 'cleanup_remaining_orphan_invites' +require_migration! RSpec.describe CleanupRemainingOrphanInvites, :migration do def create_member(**extra_attributes) diff --git a/spec/migrations/complete_namespace_settings_migration_spec.rb b/spec/migrations/complete_namespace_settings_migration_spec.rb deleted file mode 100644 index 46c455d8b19..00000000000 --- a/spec/migrations/complete_namespace_settings_migration_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe CompleteNamespaceSettingsMigration, :redis do - let(:migration) { spy('migration') } - - context 'when still legacy artifacts exist' do - let(:namespaces) { table(:namespaces) } - let(:namespace_settings) { table(:namespace_settings) } - let!(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') } - - it 'steals sidekiq jobs from BackfillNamespaceSettings background migration' do - expect(Gitlab::BackgroundMigration).to receive(:steal).with('BackfillNamespaceSettings') - - migrate! - end - - it 'migrates namespaces without namespace_settings' do - expect { migrate! }.to change { namespace_settings.count }.from(0).to(1) - end - end -end diff --git a/spec/migrations/confirm_project_bot_users_spec.rb b/spec/migrations/confirm_project_bot_users_spec.rb deleted file mode 100644 index 5f70181e70a..00000000000 --- a/spec/migrations/confirm_project_bot_users_spec.rb +++ /dev/null @@ -1,84 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ConfirmProjectBotUsers, :migration do - let(:users) { table(:users) } - - context 'project bot users that are currently unconfirmed' do - let!(:project_bot_1) do - create_user!( - name: 'bot_1', - email: 'bot_1@example.com', - created_at: 2.days.ago, - user_type: described_class::User::USER_TYPE_PROJECT_BOT - ) - end - - let!(:project_bot_2) do - create_user!( - name: 'bot_2', - email: 'bot_2@example.com', - created_at: 4.days.ago, - user_type: described_class::User::USER_TYPE_PROJECT_BOT - ) - end - - it 'updates their `confirmed_at` attribute' do - expect { migrate! } - .to change { project_bot_1.reload.confirmed_at } - .and change { project_bot_2.reload.confirmed_at } - end - - it 'sets `confirmed_at` to be the same as their `created_at` attribute' do - migrate! - - [project_bot_1, project_bot_2].each do |bot| - expect(bot.reload.confirmed_at).to eq(bot.created_at) - end - end - end - - context 'project bot users that are currently confirmed' do - let!(:confirmed_project_bot) do - create_user!( - name: 'bot_1', - email: 'bot_1@example.com', - user_type: described_class::User::USER_TYPE_PROJECT_BOT, - confirmed_at: 1.day.ago - ) - end - - it 'does not update their `confirmed_at` attribute' do - expect { migrate! }.not_to change { confirmed_project_bot.reload.confirmed_at } - end - end - - context 'human users that are currently unconfirmed' do - let!(:unconfirmed_human) do - create_user!( - name: 'human', - email: 'human@example.com', - user_type: nil - ) - end - - it 'does not update their `confirmed_at` attribute' do - expect { migrate! }.not_to change { unconfirmed_human.reload.confirmed_at } - end - end - - private - - def create_user!(name:, email:, user_type:, created_at: Time.now, confirmed_at: nil) - users.create!( - name: name, - email: email, - username: name, - projects_limit: 0, - user_type: user_type, - confirmed_at: confirmed_at - ) - end -end diff --git a/spec/migrations/create_environment_for_self_monitoring_project_spec.rb b/spec/migrations/create_environment_for_self_monitoring_project_spec.rb deleted file mode 100644 index 4615c231510..00000000000 --- a/spec/migrations/create_environment_for_self_monitoring_project_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe CreateEnvironmentForSelfMonitoringProject do - let(:application_settings_table) { table(:application_settings) } - - let(:environments) { table(:environments) } - - let(:instance_administrators_group) do - table(:namespaces).create!( - id: 1, - name: 'GitLab Instance Administrators', - path: 'gitlab-instance-administrators-random', - type: 'Group' - ) - end - - let(:self_monitoring_project) do - table(:projects).create!( - id: 2, - name: 'Self Monitoring', - path: 'self_monitoring', - namespace_id: instance_administrators_group.id - ) - end - - context 'when the self monitoring project ID is not set' do - it 'does not make changes' do - expect(environments.find_by(project_id: self_monitoring_project.id)).to be_nil - - migrate! - - expect(environments.find_by(project_id: self_monitoring_project.id)).to be_nil - end - end - - context 'when the self monitoring project ID is set' do - before do - application_settings_table.create!(instance_administration_project_id: self_monitoring_project.id) - end - - context 'when the environment already exists' do - let!(:environment) do - environments.create!(project_id: self_monitoring_project.id, name: 'production', slug: 'production') - end - - it 'does not make changes' do - expect(environments.find_by(project_id: self_monitoring_project.id)).to eq(environment) - - migrate! - - expect(environments.find_by(project_id: self_monitoring_project.id)).to eq(environment) - end - end - - context 'when the environment does not exist' do - it 'creates the environment' do - expect(environments.find_by(project_id: self_monitoring_project.id)).to be_nil - - migrate! - - expect(environments.find_by(project_id: self_monitoring_project.id)).to be - end - end - end -end diff --git a/spec/migrations/deduplicate_epic_iids_spec.rb b/spec/migrations/deduplicate_epic_iids_spec.rb deleted file mode 100644 index c9dd5b3253b..00000000000 --- a/spec/migrations/deduplicate_epic_iids_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe DeduplicateEpicIids, :migration, schema: 20201106082723 do - let(:routes) { table(:routes) } - let(:epics) { table(:epics) } - let(:users) { table(:users) } - let(:namespaces) { table(:namespaces) } - - let!(:group) { create_group('foo') } - let!(:user) { users.create!(email: 'test@example.com', projects_limit: 100, username: 'test') } - let!(:dup_epic1) { epics.create!(iid: 1, title: 'epic 1', group_id: group.id, author_id: user.id, created_at: Time.now, updated_at: Time.now, title_html: 'any') } - let!(:dup_epic2) { epics.create!(iid: 1, title: 'epic 2', group_id: group.id, author_id: user.id, created_at: Time.now, updated_at: Time.now, title_html: 'any') } - let!(:dup_epic3) { epics.create!(iid: 1, title: 'epic 3', group_id: group.id, author_id: user.id, created_at: Time.now, updated_at: Time.now, title_html: 'any') } - - it 'deduplicates epic iids', :aggregate_failures do - duplicate_epics_count = epics.where(iid: 1, group_id: group.id).count - expect(duplicate_epics_count).to eq 3 - - migrate! - - duplicate_epics_count = epics.where(iid: 1, group_id: group.id).count - expect(duplicate_epics_count).to eq 1 - expect(dup_epic1.reload.iid).to eq 1 - expect(dup_epic2.reload.iid).to eq 2 - expect(dup_epic3.reload.iid).to eq 3 - end - - def create_group(path) - namespaces.create!(name: path, path: path, type: 'Group').tap do |namespace| - routes.create!(path: namespace.path, name: namespace.name, source_id: namespace.id, source_type: 'Namespace') - end - end -end diff --git a/spec/migrations/delete_internal_ids_where_feature_flags_usage_spec.rb b/spec/migrations/delete_internal_ids_where_feature_flags_usage_spec.rb deleted file mode 100644 index 30d776c498b..00000000000 --- a/spec/migrations/delete_internal_ids_where_feature_flags_usage_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe DeleteInternalIdsWhereFeatureFlagsUsage do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:internal_ids) { table(:internal_ids) } - - def setup - namespace = namespaces.create!(name: 'foo', path: 'foo') - projects.create!(namespace_id: namespace.id) - end - - it 'deletes feature flag rows from the internal_ids table' do - project = setup - internal_ids.create!(project_id: project.id, usage: 6, last_value: 1) - - disable_migrations_output { migrate! } - - expect(internal_ids.count).to eq(0) - end - - it 'does not delete issue rows from the internal_ids table' do - project = setup - internal_ids.create!(project_id: project.id, usage: 0, last_value: 1) - - disable_migrations_output { migrate! } - - expect(internal_ids.count).to eq(1) - end - - it 'does not delete merge request rows from the internal_ids table' do - project = setup - internal_ids.create!(project_id: project.id, usage: 1, last_value: 1) - - disable_migrations_output { migrate! } - - expect(internal_ids.count).to eq(1) - end -end diff --git a/spec/migrations/delete_template_project_services_spec.rb b/spec/migrations/delete_template_project_services_spec.rb deleted file mode 100644 index 20532e4187a..00000000000 --- a/spec/migrations/delete_template_project_services_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe DeleteTemplateProjectServices, :migration do - let(:services) { table(:services) } - let(:project) { table(:projects).create!(namespace_id: 1) } - - before do - services.create!(template: true, project_id: project.id) - services.create!(template: true) - services.create!(template: false, project_id: project.id) - end - - it 'deletes services when template and attached to a project' do - expect { migrate! }.to change { services.where(template: true, project_id: project.id).count }.from(1).to(0) - .and not_change { services.where(template: true, project_id: nil).count } - .and not_change { services.where(template: false).where.not(project_id: nil).count } - end -end diff --git a/spec/migrations/delete_template_services_duplicated_by_type_spec.rb b/spec/migrations/delete_template_services_duplicated_by_type_spec.rb deleted file mode 100644 index 577fea984da..00000000000 --- a/spec/migrations/delete_template_services_duplicated_by_type_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe DeleteTemplateServicesDuplicatedByType do - let(:services) { table(:services) } - - before do - services.create!(template: true, type: 'JenkinsService') - services.create!(template: true, type: 'JenkinsService') - services.create!(template: true, type: 'JiraService') - services.create!(template: true, type: 'JenkinsService') - end - - it 'deletes service templates duplicated by type except the one with the lowest ID' do - jenkins_integration_id = services.where(type: 'JenkinsService').order(:id).pluck(:id).first - jira_integration_id = services.where(type: 'JiraService').pluck(:id).first - - migrate! - - expect(services.pluck(:id)).to contain_exactly(jenkins_integration_id, jira_integration_id) - end -end diff --git a/spec/migrations/delete_user_callout_alerts_moved_spec.rb b/spec/migrations/delete_user_callout_alerts_moved_spec.rb deleted file mode 100644 index 401cf77628d..00000000000 --- a/spec/migrations/delete_user_callout_alerts_moved_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe DeleteUserCalloutAlertsMoved do - let(:users) { table(:users) } - let(:user_callouts) { table(:user_callouts) } - let(:alerts_moved_feature) { described_class::FEATURE_NAME_ALERTS_MOVED } - let(:unrelated_feature) { 1 } - - let!(:user1) { users.create!(email: '1', projects_limit: 0) } - let!(:user2) { users.create!(email: '2', projects_limit: 0) } - - subject(:migration) { described_class.new } - - before do - user_callouts.create!(user_id: user1.id, feature_name: alerts_moved_feature) - user_callouts.create!(user_id: user1.id, feature_name: unrelated_feature) - user_callouts.create!(user_id: user2.id, feature_name: alerts_moved_feature) - end - - describe '#up' do - it 'deletes `alerts_moved` user callouts' do - migration.up - - expect(user_callouts.all.map(&:feature_name)).to eq([unrelated_feature]) - end - end -end diff --git a/spec/migrations/drop_activate_prometheus_services_background_jobs_spec.rb b/spec/migrations/drop_activate_prometheus_services_background_jobs_spec.rb deleted file mode 100644 index c6115d5889c..00000000000 --- a/spec/migrations/drop_activate_prometheus_services_background_jobs_spec.rb +++ /dev/null @@ -1,89 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe DropActivatePrometheusServicesBackgroundJobs, :sidekiq, :redis, schema: 2020_02_21_144534 do - subject(:migration) { described_class.new } - - describe '#up' do - let(:retry_set) { Sidekiq::RetrySet.new } - let(:scheduled_set) { Sidekiq::ScheduledSet.new } - - context 'there are only affected jobs on the queue' do - let(:payload) { { 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1] } } - let(:queue_payload) { payload.merge('queue' => described_class::QUEUE) } - - it 'removes enqueued ActivatePrometheusServicesForSharedClusterApplications background jobs' do - Sidekiq::Testing.disable! do # https://github.com/mperham/sidekiq/wiki/testing#api Sidekiq's API does not have a testing mode - retry_set.schedule(1.hour.from_now, payload) - scheduled_set.schedule(1.hour.from_now, payload) - Sidekiq::Client.push(queue_payload) - - expect { migration.up }.to change { Sidekiq::Queue.new(described_class::QUEUE).size }.from(1).to(0) - expect(retry_set.size).to eq(0) - expect(scheduled_set.size).to eq(0) - end - end - end - - context "there aren't any affected jobs on the queue" do - let(:payload) { { 'class' => ::BackgroundMigrationWorker, 'args' => ['SomeOtherClass', 1] } } - let(:queue_payload) { payload.merge('queue' => described_class::QUEUE) } - - it 'skips other enqueued jobs' do - Sidekiq::Testing.disable! do - retry_set.schedule(1.hour.from_now, payload) - scheduled_set.schedule(1.hour.from_now, payload) - Sidekiq::Client.push(queue_payload) - - expect { migration.up }.not_to change { Sidekiq::Queue.new(described_class::QUEUE).size } - expect(retry_set.size).to eq(1) - expect(scheduled_set.size).to eq(1) - end - end - end - - context "there are multiple types of jobs on the queue" do - let(:payload) { { 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1] } } - let(:queue_payload) { payload.merge('queue' => described_class::QUEUE) } - - it 'skips other enqueued jobs' do - Sidekiq::Testing.disable! do - queue = Sidekiq::Queue.new(described_class::QUEUE) - # these jobs will be deleted - retry_set.schedule(1.hour.from_now, payload) - scheduled_set.schedule(1.hour.from_now, payload) - Sidekiq::Client.push(queue_payload) - # this jobs will be skipped - skipped_jobs_args = [['SomeOtherClass', 1], [described_class::DROPPED_JOB_CLASS, 'wrong id type'], [described_class::DROPPED_JOB_CLASS, 1, 'some wired argument']] - skipped_jobs_args.each do |args| - retry_set.schedule(1.hour.from_now, { 'class' => ::BackgroundMigrationWorker, 'args' => args }) - scheduled_set.schedule(1.hour.from_now, { 'class' => ::BackgroundMigrationWorker, 'args' => args }) - Sidekiq::Client.push('queue' => described_class::QUEUE, 'class' => ::BackgroundMigrationWorker, 'args' => args) - end - - migration.up - - expect(retry_set.size).to be 3 - expect(scheduled_set.size).to be 3 - expect(queue.size).to be 3 - expect(queue.map(&:args)).to match_array skipped_jobs_args - expect(retry_set.map(&:args)).to match_array skipped_jobs_args - expect(scheduled_set.map(&:args)).to match_array skipped_jobs_args - end - end - end - - context "other queues" do - it 'does not modify them' do - Sidekiq::Testing.disable! do - Sidekiq::Client.push('queue' => 'other', 'class' => ::BackgroundMigrationWorker, 'args' => ['SomeOtherClass', 1]) - Sidekiq::Client.push('queue' => 'other', 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1]) - - expect { migration.up }.not_to change { Sidekiq::Queue.new('other').size } - end - end - end - end -end diff --git a/spec/migrations/drop_background_migration_jobs_spec.rb b/spec/migrations/drop_background_migration_jobs_spec.rb deleted file mode 100644 index 82b3f9f7187..00000000000 --- a/spec/migrations/drop_background_migration_jobs_spec.rb +++ /dev/null @@ -1,61 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe DropBackgroundMigrationJobs, :sidekiq, :redis, schema: 2020_01_16_051619 do - subject(:migration) { described_class.new } - - describe '#up' do - context 'there are only affected jobs on the queue' do - it 'removes enqueued ActivatePrometheusServicesForSharedClusterApplications background jobs' do - Sidekiq::Testing.disable! do # https://github.com/mperham/sidekiq/wiki/testing#api Sidekiq's API does not have a testing mode - Sidekiq::Client.push('queue' => described_class::QUEUE, 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1]) - - expect { migration.up }.to change { Sidekiq::Queue.new(described_class::QUEUE).size }.from(1).to(0) - end - end - end - - context "there aren't any affected jobs on the queue" do - it 'skips other enqueued jobs' do - Sidekiq::Testing.disable! do - Sidekiq::Client.push('queue' => described_class::QUEUE, 'class' => ::BackgroundMigrationWorker, 'args' => ['SomeOtherClass', 1]) - - expect { migration.up }.not_to change { Sidekiq::Queue.new(described_class::QUEUE).size } - end - end - end - - context "there are multiple types of jobs on the queue" do - it 'skips other enqueued jobs' do - Sidekiq::Testing.disable! do - queue = Sidekiq::Queue.new(described_class::QUEUE) - # this job will be deleted - Sidekiq::Client.push('queue' => described_class::QUEUE, 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1]) - # this jobs will be skipped - skipped_jobs_args = [['SomeOtherClass', 1], [described_class::DROPPED_JOB_CLASS, 'wrong id type'], [described_class::DROPPED_JOB_CLASS, 1, 'some wired argument']] - skipped_jobs_args.each do |args| - Sidekiq::Client.push('queue' => described_class::QUEUE, 'class' => ::BackgroundMigrationWorker, 'args' => args) - end - - migration.up - - expect(queue.size).to be 3 - expect(queue.map(&:args)).to match_array skipped_jobs_args - end - end - end - - context "other queues" do - it 'does not modify them' do - Sidekiq::Testing.disable! do - Sidekiq::Client.push('queue' => 'other', 'class' => ::BackgroundMigrationWorker, 'args' => ['SomeOtherClass', 1]) - Sidekiq::Client.push('queue' => 'other', 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1]) - - expect { migration.up }.not_to change { Sidekiq::Queue.new('other').size } - end - end - end - end -end diff --git a/spec/migrations/ensure_filled_external_diff_store_on_merge_request_diffs_spec.rb b/spec/migrations/ensure_filled_external_diff_store_on_merge_request_diffs_spec.rb deleted file mode 100644 index 6998e7a91cf..00000000000 --- a/spec/migrations/ensure_filled_external_diff_store_on_merge_request_diffs_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe EnsureFilledExternalDiffStoreOnMergeRequestDiffs, schema: 20200908095446 do - let!(:merge_request_diffs) { table(:merge_request_diffs) } - let!(:merge_requests) { table(:merge_requests) } - let!(:namespaces) { table(:namespaces) } - let!(:projects) { table(:projects) } - let!(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } - let!(:project) { projects.create!(namespace_id: namespace.id) } - let!(:merge_request) { merge_requests.create!(source_branch: 'x', target_branch: 'master', target_project_id: project.id) } - - before do - constraint_name = 'check_93ee616ac9' - - # In order to insert a row with a NULL to fill. - ActiveRecord::Base.connection.execute "ALTER TABLE merge_request_diffs DROP CONSTRAINT #{constraint_name}" - - @external_diff_store_1 = merge_request_diffs.create!(external_diff_store: 1, merge_request_id: merge_request.id) - @external_diff_store_2 = merge_request_diffs.create!(external_diff_store: 2, merge_request_id: merge_request.id) - @external_diff_store_nil = merge_request_diffs.create!(external_diff_store: nil, merge_request_id: merge_request.id) - - # revert DB structure - ActiveRecord::Base.connection.execute "ALTER TABLE merge_request_diffs ADD CONSTRAINT #{constraint_name} CHECK ((external_diff_store IS NOT NULL)) NOT VALID" - end - - it 'correctly migrates nil external_diff_store to 1' do - migrate! - - @external_diff_store_1.reload - @external_diff_store_2.reload - @external_diff_store_nil.reload - - expect(@external_diff_store_1.external_diff_store).to eq(1) # unchanged - expect(@external_diff_store_2.external_diff_store).to eq(2) # unchanged - expect(@external_diff_store_nil.external_diff_store).to eq(1) # nil => 1 - end -end diff --git a/spec/migrations/ensure_filled_file_store_on_package_files_spec.rb b/spec/migrations/ensure_filled_file_store_on_package_files_spec.rb deleted file mode 100644 index 5cfc3a6eeb8..00000000000 --- a/spec/migrations/ensure_filled_file_store_on_package_files_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe EnsureFilledFileStoreOnPackageFiles, schema: 20200910175553 do - let!(:packages_package_files) { table(:packages_package_files) } - let!(:packages_packages) { table(:packages_packages) } - let!(:namespaces) { table(:namespaces) } - let!(:projects) { table(:projects) } - let!(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } - let!(:project) { projects.create!(namespace_id: namespace.id) } - let!(:package) { packages_packages.create!(project_id: project.id, name: 'bar', package_type: 1) } - - before do - constraint_name = 'check_4c5e6bb0b3' - - # In order to insert a row with a NULL to fill. - ActiveRecord::Base.connection.execute "ALTER TABLE packages_package_files DROP CONSTRAINT #{constraint_name}" - - @file_store_1 = packages_package_files.create!(file_store: 1, file_name: 'foo_1', file: 'foo_1', package_id: package.id) - @file_store_2 = packages_package_files.create!(file_store: 2, file_name: 'foo_2', file: 'foo_2', package_id: package.id) - @file_store_nil = packages_package_files.create!(file_store: nil, file_name: 'foo_nil', file: 'foo_nil', package_id: package.id) - - # revert DB structure - ActiveRecord::Base.connection.execute "ALTER TABLE packages_package_files ADD CONSTRAINT #{constraint_name} CHECK ((file_store IS NOT NULL)) NOT VALID" - end - - it 'correctly migrates nil file_store to 1' do - migrate! - - @file_store_1.reload - @file_store_2.reload - @file_store_nil.reload - - expect(@file_store_1.file_store).to eq(1) # unchanged - expect(@file_store_2.file_store).to eq(2) # unchanged - expect(@file_store_nil.file_store).to eq(1) # nil => 1 - end -end diff --git a/spec/migrations/ensure_namespace_settings_creation_spec.rb b/spec/migrations/ensure_namespace_settings_creation_spec.rb deleted file mode 100644 index b105e678d35..00000000000 --- a/spec/migrations/ensure_namespace_settings_creation_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe EnsureNamespaceSettingsCreation do - context 'when there are namespaces without namespace settings' do - let(:namespaces) { table(:namespaces) } - let(:namespace_settings) { table(:namespace_settings) } - let!(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') } - let!(:namespace_2) { namespaces.create!(name: 'gitlab', path: 'gitlab-org2') } - - it 'migrates namespaces without namespace_settings' do - stub_const("#{described_class.name}::BATCH_SIZE", 2) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes.to_i, namespace.id, namespace_2.id) - end - end - end - - it 'schedules migrations in batches' do - stub_const("#{described_class.name}::BATCH_SIZE", 2) - - namespace_3 = namespaces.create!(name: 'gitlab', path: 'gitlab-org3') - namespace_4 = namespaces.create!(name: 'gitlab', path: 'gitlab-org4') - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes.to_i, namespace.id, namespace_2.id) - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(4.minutes.to_i, namespace_3.id, namespace_4.id) - end - end - end - end -end diff --git a/spec/migrations/ensure_target_project_id_is_filled_spec.rb b/spec/migrations/ensure_target_project_id_is_filled_spec.rb deleted file mode 100644 index 7a9f49390fb..00000000000 --- a/spec/migrations/ensure_target_project_id_is_filled_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe EnsureTargetProjectIdIsFilled, schema: 20200827085101 do - let_it_be(:namespaces) { table(:namespaces) } - let_it_be(:projects) { table(:projects) } - let_it_be(:merge_requests) { table(:merge_requests) } - let_it_be(:metrics) { table(:merge_request_metrics) } - - let!(:namespace) { namespaces.create!(name: 'namespace', path: 'namespace') } - let!(:project_1) { projects.create!(namespace_id: namespace.id) } - let!(:project_2) { projects.create!(namespace_id: namespace.id) } - let!(:merge_request_to_migrate_1) { merge_requests.create!(source_branch: 'a', target_branch: 'b', target_project_id: project_1.id) } - let!(:merge_request_to_migrate_2) { merge_requests.create!(source_branch: 'c', target_branch: 'd', target_project_id: project_2.id) } - let!(:merge_request_not_to_migrate) { merge_requests.create!(source_branch: 'e', target_branch: 'f', target_project_id: project_1.id) } - - let!(:metrics_1) { metrics.create!(merge_request_id: merge_request_to_migrate_1.id) } - let!(:metrics_2) { metrics.create!(merge_request_id: merge_request_to_migrate_2.id) } - let!(:metrics_3) { metrics.create!(merge_request_id: merge_request_not_to_migrate.id, target_project_id: project_1.id) } - - it 'migrates missing target_project_ids' do - migrate! - - expect(metrics_1.reload.target_project_id).to eq(project_1.id) - expect(metrics_2.reload.target_project_id).to eq(project_2.id) - expect(metrics_3.reload.target_project_id).to eq(project_1.id) - end -end diff --git a/spec/migrations/ensure_u2f_registrations_migrated_spec.rb b/spec/migrations/ensure_u2f_registrations_migrated_spec.rb deleted file mode 100644 index 01db29c0edf..00000000000 --- a/spec/migrations/ensure_u2f_registrations_migrated_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe EnsureU2fRegistrationsMigrated, schema: 20201022144501 do - let(:u2f_registrations) { table(:u2f_registrations) } - let(:webauthn_registrations) { table(:webauthn_registrations) } - let(:users) { table(:users) } - - let(:user) { users.create!(email: 'email@email.com', name: 'foo', username: 'foo', projects_limit: 0) } - - before do - create_u2f_registration(1, 'reg1') - create_u2f_registration(2, 'reg2') - webauthn_registrations.create!({ name: 'reg1', u2f_registration_id: 1, credential_xid: '', public_key: '', user_id: user.id }) - end - - it 'correctly migrates u2f registrations previously not migrated' do - expect { migrate! }.to change { webauthn_registrations.count }.from(1).to(2) - end - - it 'migrates all valid u2f registrations depite errors' do - create_u2f_registration(3, 'reg3', 'invalid!') - create_u2f_registration(4, 'reg4') - - expect { migrate! }.to change { webauthn_registrations.count }.from(1).to(3) - end - - def create_u2f_registration(id, name, public_key = nil) - device = U2F::FakeU2F.new(FFaker::BaconIpsum.characters(5), { key_handle: SecureRandom.random_bytes(255) }) - public_key ||= Base64.strict_encode64(device.origin_public_key_raw) - u2f_registrations.create!({ id: id, - certificate: Base64.strict_encode64(device.cert_raw), - key_handle: U2F.urlsafe_encode64(device.key_handle_raw), - public_key: public_key, - counter: 5, - name: name, - user_id: user.id }) - end -end diff --git a/spec/migrations/fill_file_store_ci_job_artifacts_spec.rb b/spec/migrations/fill_file_store_ci_job_artifacts_spec.rb deleted file mode 100644 index 7adcf74bdba..00000000000 --- a/spec/migrations/fill_file_store_ci_job_artifacts_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe FillFileStoreCiJobArtifacts do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:builds) { table(:ci_builds) } - let(:job_artifacts) { table(:ci_job_artifacts) } - - before do - namespaces.create!(id: 123, name: 'sample', path: 'sample') - projects.create!(id: 123, name: 'sample', path: 'sample', namespace_id: 123) - builds.create!(id: 1) - end - - context 'when file_store is nil' do - it 'updates file_store to local' do - job_artifacts.create!(project_id: 123, job_id: 1, file_type: 1, file_store: nil) - job_artifact = job_artifacts.find_by(project_id: 123, job_id: 1) - - expect { migrate! }.to change { job_artifact.reload.file_store }.from(nil).to(1) - end - end - - context 'when file_store is set to local' do - it 'does not update file_store' do - job_artifacts.create!(project_id: 123, job_id: 1, file_type: 1, file_store: 1) - job_artifact = job_artifacts.find_by(project_id: 123, job_id: 1) - - expect { migrate! }.not_to change { job_artifact.reload.file_store } - end - end - - context 'when file_store is set to object storage' do - it 'does not update file_store' do - job_artifacts.create!(project_id: 123, job_id: 1, file_type: 1, file_store: 2) - job_artifact = job_artifacts.find_by(project_id: 123, job_id: 1) - - expect { migrate! }.not_to change { job_artifact.reload.file_store } - end - end -end diff --git a/spec/migrations/fill_file_store_lfs_objects_spec.rb b/spec/migrations/fill_file_store_lfs_objects_spec.rb deleted file mode 100644 index 688976f79e8..00000000000 --- a/spec/migrations/fill_file_store_lfs_objects_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe FillFileStoreLfsObjects do - let(:lfs_objects) { table(:lfs_objects) } - let(:oid) { 'b804383982bb89b00e828e3f44c038cc991d3d1768009fc39ba8e2c081b9fb75' } - - context 'when file_store is nil' do - it 'updates file_store to local' do - lfs_objects.create!(oid: oid, size: 1062, file_store: nil) - lfs_object = lfs_objects.find_by(oid: oid) - - expect { migrate! }.to change { lfs_object.reload.file_store }.from(nil).to(1) - end - end - - context 'when file_store is set to local' do - it 'does not update file_store' do - lfs_objects.create!(oid: oid, size: 1062, file_store: 1) - lfs_object = lfs_objects.find_by(oid: oid) - - expect { migrate! }.not_to change { lfs_object.reload.file_store } - end - end - - context 'when file_store is set to object storage' do - it 'does not update file_store' do - lfs_objects.create!(oid: oid, size: 1062, file_store: 2) - lfs_object = lfs_objects.find_by(oid: oid) - - expect { migrate! }.not_to change { lfs_object.reload.file_store } - end - end -end diff --git a/spec/migrations/fill_store_uploads_spec.rb b/spec/migrations/fill_store_uploads_spec.rb deleted file mode 100644 index 19db7c2b48d..00000000000 --- a/spec/migrations/fill_store_uploads_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe FillStoreUploads do - let(:uploads) { table(:uploads) } - let(:path) { 'uploads/-/system/avatar.jpg' } - - context 'when store is nil' do - it 'updates store to local' do - uploads.create!(size: 100.kilobytes, - uploader: 'AvatarUploader', - path: path, - store: nil) - - upload = uploads.find_by(path: path) - - expect { migrate! }.to change { upload.reload.store }.from(nil).to(1) - end - end - - context 'when store is set to local' do - it 'does not update store' do - uploads.create!(size: 100.kilobytes, - uploader: 'AvatarUploader', - path: path, - store: 1) - - upload = uploads.find_by(path: path) - - expect { migrate! }.not_to change { upload.reload.store } - end - end - - context 'when store is set to object storage' do - it 'does not update store' do - uploads.create!(size: 100.kilobytes, - uploader: 'AvatarUploader', - path: path, - store: 2) - - upload = uploads.find_by(path: path) - - expect { migrate! }.not_to change { upload.reload.store } - end - end -end diff --git a/spec/migrations/fix_projects_without_project_feature_spec.rb b/spec/migrations/fix_projects_without_project_feature_spec.rb deleted file mode 100644 index d8c5e7a28c0..00000000000 --- a/spec/migrations/fix_projects_without_project_feature_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe FixProjectsWithoutProjectFeature do - let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab-org') } - - let!(:projects) do - [ - table(:projects).create!(namespace_id: namespace.id, name: 'foo 1'), - table(:projects).create!(namespace_id: namespace.id, name: 'foo 2'), - table(:projects).create!(namespace_id: namespace.id, name: 'foo 3') - ] - end - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 2) - end - - around do |example| - Sidekiq::Testing.fake! do - freeze_time do - example.call - end - end - end - - it 'schedules jobs for ranges of projects' do - migrate! - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes, projects[0].id, projects[1].id) - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(4.minutes, projects[2].id, projects[2].id) - end - - it 'schedules jobs according to the configured batch size' do - expect { migrate! }.to change { BackgroundMigrationWorker.jobs.size }.by(2) - end -end diff --git a/spec/migrations/fix_projects_without_prometheus_services_spec.rb b/spec/migrations/fix_projects_without_prometheus_services_spec.rb deleted file mode 100644 index dc03f381abd..00000000000 --- a/spec/migrations/fix_projects_without_prometheus_services_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true -# -require 'spec_helper' -require_migration!('fix_projects_without_prometheus_service') - -RSpec.describe FixProjectsWithoutPrometheusService, :migration do - let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab-org') } - - let!(:projects) do - [ - table(:projects).create!(namespace_id: namespace.id, name: 'foo 1'), - table(:projects).create!(namespace_id: namespace.id, name: 'foo 2'), - table(:projects).create!(namespace_id: namespace.id, name: 'foo 3') - ] - end - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 2) - end - - around do |example| - Sidekiq::Testing.fake! do - freeze_time do - example.call - end - end - end - - it 'schedules jobs for ranges of projects' do - migrate! - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes, projects[0].id, projects[1].id) - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(4.minutes, projects[2].id, projects[2].id) - end - - it 'schedules jobs according to the configured batch size' do - expect { migrate! }.to change { BackgroundMigrationWorker.jobs.size }.by(2) - end -end diff --git a/spec/migrations/generate_ci_jwt_signing_key_spec.rb b/spec/migrations/generate_ci_jwt_signing_key_spec.rb deleted file mode 100644 index 7a895284aa1..00000000000 --- a/spec/migrations/generate_ci_jwt_signing_key_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe GenerateCiJwtSigningKey do - let(:application_settings) do - Class.new(ActiveRecord::Base) do - self.table_name = 'application_settings' - - attr_encrypted :ci_jwt_signing_key, { - mode: :per_attribute_iv, - key: Gitlab::Utils.ensure_utf8_size(Rails.application.secrets.db_key_base, bytes: 32.bytes), - algorithm: 'aes-256-gcm', - encode: true - } - end - end - - it 'generates JWT signing key' do - application_settings.create! - - reversible_migration do |migration| - migration.before -> { - settings = application_settings.first - - expect(settings.ci_jwt_signing_key).to be_nil - expect(settings.encrypted_ci_jwt_signing_key).to be_nil - expect(settings.encrypted_ci_jwt_signing_key_iv).to be_nil - } - - migration.after -> { - settings = application_settings.first - - expect(settings.encrypted_ci_jwt_signing_key).to be_present - expect(settings.encrypted_ci_jwt_signing_key_iv).to be_present - expect { OpenSSL::PKey::RSA.new(settings.ci_jwt_signing_key) }.not_to raise_error - } - end - end -end diff --git a/spec/migrations/generate_missing_routes_for_bots_spec.rb b/spec/migrations/generate_missing_routes_for_bots_spec.rb deleted file mode 100644 index 594e51b4410..00000000000 --- a/spec/migrations/generate_missing_routes_for_bots_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe GenerateMissingRoutesForBots, :migration do - let(:users) { table(:users) } - let(:namespaces) { table(:namespaces) } - let(:routes) { table(:routes) } - - let(:visual_review_bot) do - users.create!(email: 'visual-review-bot@gitlab.com', name: 'GitLab Visual Review Bot', username: 'visual-review-bot', user_type: 3, projects_limit: 5) - end - - let(:migration_bot) do - users.create!(email: 'migration-bot@gitlab.com', name: 'GitLab Migration Bot', username: 'migration-bot', user_type: 7, projects_limit: 5) - end - - let!(:visual_review_bot_namespace) do - namespaces.create!(owner_id: visual_review_bot.id, name: visual_review_bot.name, path: visual_review_bot.username) - end - - let!(:migration_bot_namespace) do - namespaces.create!(owner_id: migration_bot.id, name: migration_bot.name, path: migration_bot.username) - end - - context 'for bot users without an existing route' do - it 'creates new routes' do - expect { migrate! }.to change { routes.count }.by(2) - end - - it 'creates new routes with the same path and name as their namespace' do - migrate! - - [visual_review_bot, migration_bot].each do |bot| - namespace = namespaces.find_by(owner_id: bot.id) - route = route_for(namespace: namespace) - - expect(route.path).to eq(namespace.path) - expect(route.name).to eq(namespace.name) - end - end - end - - it 'does not create routes for bot users with existing routes' do - create_route!(namespace: visual_review_bot_namespace) - create_route!(namespace: migration_bot_namespace) - - expect { migrate! }.not_to change { routes.count } - end - - it 'does not create routes for human users without an existing route' do - human_namespace = create_human_namespace!(name: 'GitLab Human', username: 'human') - - expect { migrate! }.not_to change { route_for(namespace: human_namespace) } - end - - it 'does not create route for a bot user with a missing route, if a human user with the same path already exists' do - human_namespace = create_human_namespace!(name: visual_review_bot.name, username: visual_review_bot.username) - create_route!(namespace: human_namespace) - - expect { migrate! }.not_to change { route_for(namespace: visual_review_bot_namespace) } - end - - private - - def create_human_namespace!(name:, username:) - human = users.create!(email: 'human@gitlab.com', name: name, username: username, user_type: nil, projects_limit: 5) - namespaces.create!(owner_id: human.id, name: human.name, path: human.username) - end - - def create_route!(namespace:) - routes.create!(path: namespace.path, name: namespace.name, source_id: namespace.id, source_type: 'Namespace') - end - - def route_for(namespace:) - routes.find_by(source_type: 'Namespace', source_id: namespace.id) - end -end diff --git a/spec/migrations/insert_daily_invites_plan_limits_spec.rb b/spec/migrations/insert_daily_invites_plan_limits_spec.rb deleted file mode 100644 index 49d41a1039f..00000000000 --- a/spec/migrations/insert_daily_invites_plan_limits_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe InsertDailyInvitesPlanLimits do - let(:plans) { table(:plans) } - let(:plan_limits) { table(:plan_limits) } - let!(:free_plan) { plans.create!(name: 'free') } - let!(:bronze_plan) { plans.create!(name: 'bronze') } - let!(:silver_plan) { plans.create!(name: 'silver') } - let!(:gold_plan) { plans.create!(name: 'gold') } - - context 'when on Gitlab.com' do - before do - expect(Gitlab).to receive(:com?).at_most(:twice).and_return(true) - end - - it 'correctly migrates up and down' do - reversible_migration do |migration| - migration.before -> { - expect(plan_limits.where.not(daily_invites: 0)).to be_empty - } - - # Expectations will run after the up migration. - migration.after -> { - expect(plan_limits.pluck(:plan_id, :daily_invites)).to contain_exactly( - [free_plan.id, 20], - [bronze_plan.id, 0], - [silver_plan.id, 0], - [gold_plan.id, 0] - ) - } - end - end - end - - context 'when on self hosted' do - before do - expect(Gitlab).to receive(:com?).at_most(:twice).and_return(false) - end - - it 'correctly migrates up and down' do - reversible_migration do |migration| - migration.before -> { - expect(plan_limits.pluck(:daily_invites)).to eq [] - } - - migration.after -> { - expect(plan_limits.pluck(:daily_invites)).to eq [] - } - end - end - end -end diff --git a/spec/migrations/insert_project_feature_flags_plan_limits_spec.rb b/spec/migrations/insert_project_feature_flags_plan_limits_spec.rb deleted file mode 100644 index 481e987c188..00000000000 --- a/spec/migrations/insert_project_feature_flags_plan_limits_spec.rb +++ /dev/null @@ -1,76 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe InsertProjectFeatureFlagsPlanLimits do - let(:migration) { described_class.new } - let(:plans) { table(:plans) } - let(:plan_limits) { table(:plan_limits) } - let!(:default_plan) { plans.create!(name: 'default') } - let!(:free_plan) { plans.create!(name: 'free') } - let!(:bronze_plan) { plans.create!(name: 'bronze') } - let!(:silver_plan) { plans.create!(name: 'silver') } - let!(:gold_plan) { plans.create!(name: 'gold') } - let!(:default_plan_limits) do - plan_limits.create!(plan_id: default_plan.id, project_feature_flags: 200) - end - - context 'when on Gitlab.com' do - before do - expect(Gitlab).to receive(:com?).at_most(:twice).and_return(true) - end - - describe '#up' do - it 'updates the project_feature_flags plan limits' do - migration.up - - expect(plan_limits.pluck(:plan_id, :project_feature_flags)).to contain_exactly( - [default_plan.id, 200], - [free_plan.id, 50], - [bronze_plan.id, 100], - [silver_plan.id, 150], - [gold_plan.id, 200] - ) - end - end - - describe '#down' do - it 'removes the project_feature_flags plan limits' do - migration.up - migration.down - - expect(plan_limits.pluck(:plan_id, :project_feature_flags)).to contain_exactly( - [default_plan.id, 200], - [free_plan.id, 0], - [bronze_plan.id, 0], - [silver_plan.id, 0], - [gold_plan.id, 0] - ) - end - end - end - - context 'when on self-hosted' do - before do - expect(Gitlab).to receive(:com?).at_most(:twice).and_return(false) - end - - describe '#up' do - it 'does not change the plan limits' do - migration.up - - expect(plan_limits.pluck(:project_feature_flags)).to contain_exactly(200) - end - end - - describe '#down' do - it 'does not change the plan limits' do - migration.up - migration.down - - expect(plan_limits.pluck(:project_feature_flags)).to contain_exactly(200) - end - end - end -end diff --git a/spec/migrations/migrate_all_merge_request_user_mentions_to_db_spec.rb b/spec/migrations/migrate_all_merge_request_user_mentions_to_db_spec.rb deleted file mode 100644 index c2df04bf2d6..00000000000 --- a/spec/migrations/migrate_all_merge_request_user_mentions_to_db_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe MigrateAllMergeRequestUserMentionsToDb, :migration do - let(:users) { table(:users) } - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - let(:merge_requests) { table(:merge_requests) } - let(:merge_request_user_mentions) { table(:merge_request_user_mentions) } - - let(:user) { users.create!(name: 'root', email: 'root@example.com', username: 'root', projects_limit: 0) } - let(:group) { namespaces.create!(name: 'group1', path: 'group1', owner_id: user.id, type: 'Group') } - let(:project) { projects.create!(name: 'gitlab1', path: 'gitlab1', namespace_id: group.id, visibility_level: 0) } - - let(:opened_state) { 1 } - let(:closed_state) { 2 } - let(:merged_state) { 3 } - - # migrateable resources - let(:common_args) { { source_branch: 'master', source_project_id: project.id, target_project_id: project.id, author_id: user.id, description: 'mr description with @root mention' } } - let!(:resource1) { merge_requests.create!(common_args.merge(title: "title 1", state_id: opened_state, target_branch: 'feature1')) } - let!(:resource2) { merge_requests.create!(common_args.merge(title: "title 2", state_id: closed_state, target_branch: 'feature2')) } - let!(:resource3) { merge_requests.create!(common_args.merge(title: "title 3", state_id: merged_state, target_branch: 'feature3')) } - - # non-migrateable resources - # this merge request is already migrated, as it has a record in the merge_request_user_mentions table - let!(:resource4) { merge_requests.create!(common_args.merge(title: "title 3", state_id: opened_state, target_branch: 'feature4')) } - let!(:user_mention) { merge_request_user_mentions.create!(merge_request_id: resource4.id, mentioned_users_ids: [1]) } - - let!(:resource5) { merge_requests.create!(common_args.merge(title: "title 3", description: 'description with no mention', state_id: opened_state, target_branch: 'feature5')) } - - it_behaves_like 'schedules resource mentions migration', MergeRequest, false -end diff --git a/spec/migrations/migrate_bot_type_to_user_type_spec.rb b/spec/migrations/migrate_bot_type_to_user_type_spec.rb deleted file mode 100644 index 54cf3450692..00000000000 --- a/spec/migrations/migrate_bot_type_to_user_type_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe MigrateBotTypeToUserType, :migration do - let(:users) { table(:users) } - - it 'updates bots & ignores humans' do - users.create!(email: 'human', bot_type: nil, projects_limit: 0) - users.create!(email: 'support_bot', bot_type: 1, projects_limit: 0) - users.create!(email: 'alert_bot', bot_type: 2, projects_limit: 0) - users.create!(email: 'visual_review_bot', bot_type: 3, projects_limit: 0) - - migrate! - - expect(users.where.not(user_type: nil).map(&:user_type)).to match_array([1, 2, 3]) - end -end diff --git a/spec/migrations/migrate_commit_notes_mentions_to_db_spec.rb b/spec/migrations/migrate_commit_notes_mentions_to_db_spec.rb deleted file mode 100644 index aa2aa6297c4..00000000000 --- a/spec/migrations/migrate_commit_notes_mentions_to_db_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe MigrateCommitNotesMentionsToDb, :migration, :sidekiq do - let(:users) { table(:users) } - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:notes) { table(:notes) } - - let(:user) { users.create!(name: 'root', email: 'root@example.com', username: 'root', projects_limit: 0) } - let(:group) { namespaces.create!(name: 'group1', path: 'group1', owner_id: user.id) } - let(:project) { projects.create!(name: 'gitlab1', path: 'gitlab1', namespace_id: group.id, visibility_level: 0) } - - let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') } - let(:commit) { Commit.new(RepoHelpers.sample_commit, project) } - let(:commit_user_mentions) { table(:commit_user_mentions) } - - let!(:resource1) { notes.create!(commit_id: commit.id, noteable_type: 'Commit', project_id: project.id, author_id: user.id, note: 'note1 for @root to check') } - let!(:resource2) { notes.create!(commit_id: commit.id, noteable_type: 'Commit', project_id: project.id, author_id: user.id, note: 'note1 for @root to check') } - let!(:resource3) { notes.create!(commit_id: commit.id, noteable_type: 'Commit', project_id: project.id, author_id: user.id, note: 'note1 for @root to check', system: true) } - - # non-migrateable resources - # this note is already migrated, as it has a record in the commit_user_mentions table - let!(:resource4) { notes.create!(note: 'note3 for @root to check', commit_id: commit.id, noteable_type: 'Commit') } - let!(:user_mention) { commit_user_mentions.create!(commit_id: commit.id, note_id: resource4.id, mentioned_users_ids: [1]) } - # this should have pointed to an inexistent commit record in a commits table - # but because commit is not an AR, we'll just make it so that the note does not have mentions, i.e. no `@` char. - let!(:resource5) { notes.create!(note: 'note3 to check', commit_id: 'abc', noteable_type: 'Commit') } - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 1) - end - - it_behaves_like 'schedules resource mentions migration', Commit, true -end diff --git a/spec/migrations/migrate_compliance_framework_enum_to_database_framework_record_spec.rb b/spec/migrations/migrate_compliance_framework_enum_to_database_framework_record_spec.rb deleted file mode 100644 index 6a9a75a7019..00000000000 --- a/spec/migrations/migrate_compliance_framework_enum_to_database_framework_record_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe MigrateComplianceFrameworkEnumToDatabaseFrameworkRecord, schema: 20201005092753 do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:project_compliance_framework_settings) { table(:project_compliance_framework_settings) } - let(:compliance_management_frameworks) { table(:compliance_management_frameworks) } - - let(:gdpr_framework) { 1 } - let(:sox_framework) { 5 } - - let!(:root_group) { namespaces.create!(type: 'Group', name: 'a', path: 'a') } - let!(:sub_group) { namespaces.create!(type: 'Group', name: 'b', path: 'b', parent_id: root_group.id) } - let!(:sub_sub_group) { namespaces.create!(type: 'Group', name: 'c', path: 'c', parent_id: sub_group.id) } - - let!(:namespace) { namespaces.create!(name: 'd', path: 'd') } - - let!(:project_on_root_level) { projects.create!(namespace_id: root_group.id) } - let!(:project_on_sub_sub_level_1) { projects.create!(namespace_id: sub_sub_group.id) } - let!(:project_on_sub_sub_level_2) { projects.create!(namespace_id: sub_sub_group.id) } - let!(:project_on_namespace) { projects.create!(namespace_id: namespace.id) } - - let!(:project_on_root_level_compliance_setting) { project_compliance_framework_settings.create!(project_id: project_on_root_level.id, framework: gdpr_framework) } - let!(:project_on_sub_sub_level_compliance_setting_1) { project_compliance_framework_settings.create!(project_id: project_on_sub_sub_level_1.id, framework: sox_framework) } - let!(:project_on_sub_sub_level_compliance_setting_2) { project_compliance_framework_settings.create!(project_id: project_on_sub_sub_level_2.id, framework: gdpr_framework) } - let!(:project_on_namespace_level_compliance_setting) { project_compliance_framework_settings.create!(project_id: project_on_namespace.id, framework: gdpr_framework) } - - subject { described_class.new.up } - - it 'updates the project settings' do - subject - - gdpr_framework = compliance_management_frameworks.find_by(namespace_id: root_group.id, name: 'GDPR') - expect(project_on_root_level_compliance_setting.reload.framework_id).to eq(gdpr_framework.id) - expect(project_on_sub_sub_level_compliance_setting_2.reload.framework_id).to eq(gdpr_framework.id) - - sox_framework = compliance_management_frameworks.find_by(namespace_id: root_group.id, name: 'SOX') - expect(project_on_sub_sub_level_compliance_setting_1.reload.framework_id).to eq(sox_framework.id) - - gdpr_framework = compliance_management_frameworks.find_by(namespace_id: namespace.id, name: 'GDPR') - expect(project_on_namespace_level_compliance_setting.reload.framework_id).to eq(gdpr_framework.id) - end - - it 'adds two framework records' do - subject - - expect(compliance_management_frameworks.count).to eq(3) - end -end diff --git a/spec/migrations/migrate_create_commit_signature_worker_sidekiq_queue_spec.rb b/spec/migrations/migrate_create_commit_signature_worker_sidekiq_queue_spec.rb deleted file mode 100644 index 0e631f255bf..00000000000 --- a/spec/migrations/migrate_create_commit_signature_worker_sidekiq_queue_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe MigrateCreateCommitSignatureWorkerSidekiqQueue, :sidekiq, :redis do - include Gitlab::Database::MigrationHelpers - include StubWorker - - context 'when there are jobs in the queue' do - it 'correctly migrates queue when migrating up' do - Sidekiq::Testing.disable! do - stub_worker(queue: 'create_commit_signature').perform_async('Something', [1]) - stub_worker(queue: 'create_gpg_signature').perform_async('Something', [1]) - - described_class.new.up - - expect(sidekiq_queue_length('create_gpg_signature')).to eq 0 - expect(sidekiq_queue_length('create_commit_signature')).to eq 2 - end - end - - it 'correctly migrates queue when migrating down' do - Sidekiq::Testing.disable! do - stub_worker(queue: 'create_gpg_signature').perform_async('Something', [1]) - - described_class.new.down - - expect(sidekiq_queue_length('create_gpg_signature')).to eq 1 - expect(sidekiq_queue_length('create_commit_signature')).to eq 0 - end - end - end - - context 'when there are no jobs in the queues' do - it 'does not raise error when migrating up' do - expect { described_class.new.up }.not_to raise_error - end - - it 'does not raise error when migrating down' do - expect { described_class.new.down }.not_to raise_error - end - end -end diff --git a/spec/migrations/migrate_incident_issues_to_incident_type_spec.rb b/spec/migrations/migrate_incident_issues_to_incident_type_spec.rb deleted file mode 100644 index acac6114c71..00000000000 --- a/spec/migrations/migrate_incident_issues_to_incident_type_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe MigrateIncidentIssuesToIncidentType do - let(:migration) { described_class.new } - - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - let(:labels) { table(:labels) } - let(:issues) { table(:issues) } - let(:label_links) { table(:label_links) } - let(:label_props) { IncidentManagement::CreateIncidentLabelService::LABEL_PROPERTIES } - - let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } - let!(:project) { projects.create!(namespace_id: namespace.id) } - let(:label) { labels.create!(project_id: project.id, **label_props) } - let!(:incident_issue) { issues.create!(project_id: project.id) } - let!(:other_issue) { issues.create!(project_id: project.id) } - - # Issue issue_type enum - let(:issue_type) { 0 } - let(:incident_type) { 1 } - - before do - label_links.create!(target_id: incident_issue.id, label_id: label.id, target_type: 'Issue') - end - - describe '#up' do - it 'updates the incident issue type' do - expect { migrate! } - .to change { incident_issue.reload.issue_type } - .from(issue_type) - .to(incident_type) - - expect(other_issue.reload.issue_type).to eql(issue_type) - end - end - - describe '#down' do - let!(:incident_issue) { issues.create!(project_id: project.id, issue_type: issue_type) } - - it 'updates the incident issue type' do - migration.up - - expect { migration.down } - .to change { incident_issue.reload.issue_type } - .from(incident_type) - .to(issue_type) - - expect(other_issue.reload.issue_type).to eql(issue_type) - end - end -end diff --git a/spec/migrations/migrate_merge_request_mentions_to_db_spec.rb b/spec/migrations/migrate_merge_request_mentions_to_db_spec.rb deleted file mode 100644 index 06493c4e5c1..00000000000 --- a/spec/migrations/migrate_merge_request_mentions_to_db_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe MigrateMergeRequestMentionsToDb, :migration do - let(:users) { table(:users) } - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - let(:merge_requests) { table(:merge_requests) } - let(:merge_request_user_mentions) { table(:merge_request_user_mentions) } - - let(:user) { users.create!(name: 'root', email: 'root@example.com', username: 'root', projects_limit: 0) } - let(:group) { namespaces.create!(name: 'group1', path: 'group1', owner_id: user.id, type: 'Group') } - let(:project) { projects.create!(name: 'gitlab1', path: 'gitlab1', namespace_id: group.id, visibility_level: 0) } - - # migrateable resources - let(:common_args) { { source_branch: 'master', source_project_id: project.id, target_project_id: project.id, author_id: user.id, description: 'mr description with @root mention' } } - let!(:resource1) { merge_requests.create!(common_args.merge(title: "title 1", state_id: 1, target_branch: 'feature1')) } - let!(:resource2) { merge_requests.create!(common_args.merge(title: "title 2", state_id: 1, target_branch: 'feature2')) } - let!(:resource3) { merge_requests.create!(common_args.merge(title: "title 3", state_id: 1, target_branch: 'feature3')) } - - # non-migrateable resources - # this merge request is already migrated, as it has a record in the merge_request_user_mentions table - let!(:resource4) { merge_requests.create!(common_args.merge(title: "title 3", state_id: 1, target_branch: 'feature3')) } - let!(:user_mention) { merge_request_user_mentions.create!(merge_request_id: resource4.id, mentioned_users_ids: [1]) } - - let!(:resource5) { merge_requests.create!(common_args.merge(title: "title 3", description: 'description with no mention', state_id: 1, target_branch: 'feature3')) } - - it_behaves_like 'schedules resource mentions migration', MergeRequest, false -end diff --git a/spec/migrations/migrate_store_security_reports_sidekiq_queue_spec.rb b/spec/migrations/migrate_store_security_reports_sidekiq_queue_spec.rb deleted file mode 100644 index 35cb6104fe2..00000000000 --- a/spec/migrations/migrate_store_security_reports_sidekiq_queue_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe MigrateStoreSecurityReportsSidekiqQueue, :redis do - include Gitlab::Database::MigrationHelpers - include StubWorker - - context 'when there are jobs in the queue' do - it 'migrates queue when migrating up' do - Sidekiq::Testing.disable! do - stub_worker(queue: 'pipeline_default:store_security_reports').perform_async(1, 5) - - described_class.new.up - - expect(sidekiq_queue_length('pipeline_default:store_security_reports')).to eq 0 - expect(sidekiq_queue_length('security_scans:store_security_reports')).to eq 1 - end - end - - it 'migrates queue when migrating down' do - Sidekiq::Testing.disable! do - stub_worker(queue: 'security_scans:store_security_reports').perform_async(1, 5) - - described_class.new.down - - expect(sidekiq_queue_length('pipeline_default:store_security_reports')).to eq 1 - expect(sidekiq_queue_length('security_scans:store_security_reports')).to eq 0 - end - end - end -end diff --git a/spec/migrations/migrate_sync_security_reports_to_report_approval_rules_sidekiq_queue_spec.rb b/spec/migrations/migrate_sync_security_reports_to_report_approval_rules_sidekiq_queue_spec.rb deleted file mode 100644 index a9e386301b8..00000000000 --- a/spec/migrations/migrate_sync_security_reports_to_report_approval_rules_sidekiq_queue_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe MigrateSyncSecurityReportsToReportApprovalRulesSidekiqQueue, :redis do - include Gitlab::Database::MigrationHelpers - include StubWorker - - context 'when there are jobs in the queue' do - it 'migrates queue when migrating up' do - Sidekiq::Testing.disable! do - stub_worker(queue: 'pipeline_default:sync_security_reports_to_report_approval_rules').perform_async(1, 5) - - described_class.new.up - - expect(sidekiq_queue_length('pipeline_default:sync_security_reports_to_report_approval_rules')).to eq 0 - expect(sidekiq_queue_length('security_scans:sync_security_reports_to_report_approval_rules')).to eq 1 - end - end - - it 'migrates queue when migrating down' do - Sidekiq::Testing.disable! do - stub_worker(queue: 'security_scans:sync_security_reports_to_report_approval_rules').perform_async(1, 5) - - described_class.new.down - - expect(sidekiq_queue_length('pipeline_default:sync_security_reports_to_report_approval_rules')).to eq 1 - expect(sidekiq_queue_length('security_scans:sync_security_reports_to_report_approval_rules')).to eq 0 - end - end - end -end diff --git a/spec/migrations/orphaned_invite_tokens_cleanup_spec.rb b/spec/migrations/orphaned_invite_tokens_cleanup_spec.rb index be5e7756514..b33e29f82e2 100644 --- a/spec/migrations/orphaned_invite_tokens_cleanup_spec.rb +++ b/spec/migrations/orphaned_invite_tokens_cleanup_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration! 'orphaned_invite_tokens_cleanup' +require_migration! RSpec.describe OrphanedInviteTokensCleanup, :migration do def create_member(**extra_attributes) diff --git a/spec/migrations/populate_remaining_missing_dismissal_information_for_vulnerabilities_spec.rb b/spec/migrations/populate_remaining_missing_dismissal_information_for_vulnerabilities_spec.rb deleted file mode 100644 index 986436971ac..00000000000 --- a/spec/migrations/populate_remaining_missing_dismissal_information_for_vulnerabilities_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe PopulateRemainingMissingDismissalInformationForVulnerabilities do - let(:users) { table(:users) } - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:vulnerabilities) { table(:vulnerabilities) } - - let(:user) { users.create!(name: 'test', email: 'test@example.com', projects_limit: 5) } - let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') } - let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') } - - let(:states) { { detected: 1, dismissed: 2, resolved: 3, confirmed: 4 } } - let!(:vulnerability_1) { vulnerabilities.create!(title: 'title', state: states[:detected], severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id) } - let!(:vulnerability_2) { vulnerabilities.create!(title: 'title', state: states[:dismissed], severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id) } - let!(:vulnerability_3) { vulnerabilities.create!(title: 'title', state: states[:resolved], severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id) } - let!(:vulnerability_4) { vulnerabilities.create!(title: 'title', state: states[:confirmed], severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id) } - - describe '#perform' do - it 'calls the background migration class instance with broken vulnerability IDs' do - expect_next_instance_of(::Gitlab::BackgroundMigration::PopulateMissingVulnerabilityDismissalInformation) do |migrator| - expect(migrator).to receive(:perform).with(vulnerability_2.id) - end - - migrate! - end - end -end diff --git a/spec/migrations/remove_additional_application_settings_rows_spec.rb b/spec/migrations/remove_additional_application_settings_rows_spec.rb deleted file mode 100644 index d781195abf2..00000000000 --- a/spec/migrations/remove_additional_application_settings_rows_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe RemoveAdditionalApplicationSettingsRows do - let(:application_settings) { table(:application_settings) } - - it 'removes additional rows from application settings' do - 3.times { application_settings.create! } - latest_settings = application_settings.create! - - disable_migrations_output { migrate! } - - expect(application_settings.count).to eq(1) - expect(application_settings.first).to eq(latest_settings) - end - - it 'leaves only row in application_settings' do - latest_settings = application_settings.create! - - disable_migrations_output { migrate! } - - expect(application_settings.first).to eq(latest_settings) - end -end diff --git a/spec/migrations/remove_deprecated_jenkins_service_records_spec.rb b/spec/migrations/remove_deprecated_jenkins_service_records_spec.rb deleted file mode 100644 index 817cf183e0c..00000000000 --- a/spec/migrations/remove_deprecated_jenkins_service_records_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -require_migration!('ensure_deprecated_jenkins_service_records_removal') - -RSpec.shared_examples 'remove DeprecatedJenkinsService records' do - let(:services) { table(:services) } - - before do - services.create!(type: 'JenkinsDeprecatedService') - services.create!(type: 'JenkinsService') - end - - it 'deletes services when template and attached to a project' do - expect { migrate! } - .to change { services.where(type: 'JenkinsDeprecatedService').count }.from(1).to(0) - .and not_change { services.where(type: 'JenkinsService').count } - end -end - -RSpec.describe RemoveDeprecatedJenkinsServiceRecords, :migration do - it_behaves_like 'remove DeprecatedJenkinsService records' -end - -RSpec.describe EnsureDeprecatedJenkinsServiceRecordsRemoval, :migration do - it_behaves_like 'remove DeprecatedJenkinsService records' -end diff --git a/spec/migrations/remove_duplicate_labels_from_groups_spec.rb b/spec/migrations/remove_duplicate_labels_from_groups_spec.rb deleted file mode 100644 index 125314f70dd..00000000000 --- a/spec/migrations/remove_duplicate_labels_from_groups_spec.rb +++ /dev/null @@ -1,227 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration!('remove_duplicate_labels_from_group') - -RSpec.describe RemoveDuplicateLabelsFromGroup do - let(:labels_table) { table(:labels) } - let(:labels) { labels_table.all } - let(:projects_table) { table(:projects) } - let(:projects) { projects_table.all } - let(:namespaces_table) { table(:namespaces) } - let(:namespaces) { namespaces_table.all } - let(:backup_labels_table) { table(:backup_labels) } - let(:backup_labels) { backup_labels_table.all } - # for those cases where we can't use the activerecord class because the `type` column - # makes it think it has polymorphism and should be/have a Label subclass - let(:sql_backup_labels) { ApplicationRecord.connection.execute('SELECT * from backup_labels') } - - # all the possible tables with records that may have a relationship with a label - let(:analytics_cycle_analytics_group_stages_table) { table(:analytics_cycle_analytics_group_stages) } - let(:analytics_cycle_analytics_project_stages_table) { table(:analytics_cycle_analytics_project_stages) } - let(:board_labels_table) { table(:board_labels) } - let(:label_links_table) { table(:label_links) } - let(:label_priorities_table) { table(:label_priorities) } - let(:lists_table) { table(:lists) } - let(:resource_label_events_table) { table(:resource_label_events) } - - let!(:group_one) { namespaces_table.create!(id: 1, type: 'Group', name: 'group', path: 'group') } - let!(:project_one) do - projects_table.create!(id: 1, name: 'project', path: 'project', - visibility_level: 0, namespace_id: group_one.id) - end - - let(:label_title) { 'bug' } - let(:label_color) { 'red' } - let(:label_description) { 'nice label' } - let(:project_id) { project_one.id } - let(:group_id) { group_one.id } - let(:other_title) { 'feature' } - - let(:group_label_attributes) do - { - title: label_title, color: label_color, group_id: group_id, type: 'GroupLabel', template: false, description: label_description - } - end - - let(:migration) { described_class.new } - - describe 'removing full duplicates' do - context 'when there are no duplicate labels' do - let!(:first_label) { labels_table.create!(group_label_attributes.merge(id: 1, title: "a different label")) } - let!(:second_label) { labels_table.create!(group_label_attributes.merge(id: 2, title: "a totally different label")) } - - it 'does not remove anything' do - expect { migration.up }.not_to change { backup_labels_table.count } - end - - it 'restores removed records when rolling back - no change' do - migration.up - - expect { migration.down }.not_to change { labels_table.count } - end - end - - context 'with duplicates with no relationships' do - let!(:first_label) { labels_table.create!(group_label_attributes.merge(id: 1)) } - let!(:second_label) { labels_table.create!(group_label_attributes.merge(id: 2)) } - let!(:third_label) { labels_table.create!(group_label_attributes.merge(id: 3, title: other_title)) } - let!(:fourth_label) { labels_table.create!(group_label_attributes.merge(id: 4, title: other_title)) } - - it 'creates a backup record for each removed record' do - expect { migration.up }.to change { backup_labels_table.count }.from(0).to(2) - end - - it 'creates the correct backup records with `create` restore_action' do - migration.up - - expect(sql_backup_labels.find { |bl| bl["id"] == 2 }).to include(second_label.attributes.merge("restore_action" => described_class::CREATE, "new_title" => nil, "created_at" => anything, "updated_at" => anything)) - expect(sql_backup_labels.find { |bl| bl["id"] == 4 }).to include(fourth_label.attributes.merge("restore_action" => described_class::CREATE, "new_title" => nil, "created_at" => anything, "updated_at" => anything)) - end - - it 'deletes all but one' do - migration.up - - expect { second_label.reload }.to raise_error(ActiveRecord::RecordNotFound) - expect { fourth_label.reload }.to raise_error(ActiveRecord::RecordNotFound) - end - - it 'restores removed records on rollback' do - second_label_attributes = modified_attributes(second_label) - fourth_label_attributes = modified_attributes(fourth_label) - - migration.up - - migration.down - - expect(second_label.attributes).to include(second_label_attributes) - expect(fourth_label.attributes).to include(fourth_label_attributes) - end - end - - context 'two duplicate records, one of which has a relationship' do - let!(:first_label) { labels_table.create!(group_label_attributes.merge(id: 1)) } - let!(:second_label) { labels_table.create!(group_label_attributes.merge(id: 2)) } - let!(:label_priority) { label_priorities_table.create!(label_id: second_label.id, project_id: project_id, priority: 1) } - - it 'does not remove anything' do - expect { migration.up }.not_to change { labels_table.count } - end - - it 'does not create a backup record with `create` restore_action' do - expect { migration.up }.not_to change { backup_labels_table.where(restore_action: described_class::CREATE).count } - end - - it 'restores removed records when rolling back - no change' do - migration.up - - expect { migration.down }.not_to change { labels_table.count } - end - end - - context 'multiple duplicates, a subset of which have relationships' do - let!(:first_label) { labels_table.create!(group_label_attributes.merge(id: 1)) } - let!(:second_label) { labels_table.create!(group_label_attributes.merge(id: 2)) } - let!(:label_priority_for_second_label) { label_priorities_table.create!(label_id: second_label.id, project_id: project_id, priority: 1) } - let!(:third_label) { labels_table.create!(group_label_attributes.merge(id: 3)) } - let!(:fourth_label) { labels_table.create!(group_label_attributes.merge(id: 4)) } - let!(:label_priority_for_fourth_label) { label_priorities_table.create!(label_id: fourth_label.id, project_id: project_id, priority: 2) } - - it 'creates a backup record with `create` restore_action for each removed record' do - expect { migration.up }.to change { backup_labels_table.where(restore_action: described_class::CREATE).count }.from(0).to(1) - end - - it 'creates the correct backup records' do - migration.up - - expect(sql_backup_labels.find { |bl| bl["id"] == 3 }).to include(third_label.attributes.merge("restore_action" => described_class::CREATE, "new_title" => nil, "created_at" => anything, "updated_at" => anything)) - end - - it 'deletes the duplicate record' do - migration.up - - expect { first_label.reload }.not_to raise_error - expect { second_label.reload }.not_to raise_error - expect { third_label.reload }.to raise_error(ActiveRecord::RecordNotFound) - end - - it 'restores removed records on rollback' do - third_label_attributes = modified_attributes(third_label) - - migration.up - migration.down - - expect(third_label.attributes).to include(third_label_attributes) - end - end - end - - describe 'renaming partial duplicates' do - # partial duplicates - only group_id and title match. Distinct colour prevents deletion. - context 'when there are no duplicate labels' do - let!(:first_label) { labels_table.create!(group_label_attributes.merge(id: 1, title: "a unique label", color: 'green')) } - let!(:second_label) { labels_table.create!(group_label_attributes.merge(id: 2, title: "a totally different, unique, label", color: 'blue')) } - - it 'does not rename anything' do - expect { migration.up }.not_to change { backup_labels_table.count } - end - end - - context 'with duplicates with no relationships' do - let!(:first_label) { labels_table.create!(group_label_attributes.merge(id: 1, color: 'green')) } - let!(:second_label) { labels_table.create!(group_label_attributes.merge(id: 2, color: 'blue')) } - let!(:third_label) { labels_table.create!(group_label_attributes.merge(id: 3, title: other_title, color: 'purple')) } - let!(:fourth_label) { labels_table.create!(group_label_attributes.merge(id: 4, title: other_title, color: 'yellow')) } - - it 'creates a backup record for each renamed record' do - expect { migration.up }.to change { backup_labels_table.count }.from(0).to(2) - end - - it 'creates the correct backup records with `rename` restore_action' do - migration.up - - expect(sql_backup_labels.find { |bl| bl["id"] == 2 }).to include(second_label.attributes.merge("restore_action" => described_class::RENAME, "created_at" => anything, "updated_at" => anything)) - expect(sql_backup_labels.find { |bl| bl["id"] == 4 }).to include(fourth_label.attributes.merge("restore_action" => described_class::RENAME, "created_at" => anything, "updated_at" => anything)) - end - - it 'modifies the titles of the partial duplicates' do - migration.up - - expect(second_label.reload.title).to match(/#{label_title}_duplicate#{second_label.id}$/) - expect(fourth_label.reload.title).to match(/#{other_title}_duplicate#{fourth_label.id}$/) - end - - it 'restores renamed records on rollback' do - second_label_attributes = modified_attributes(second_label) - fourth_label_attributes = modified_attributes(fourth_label) - - migration.up - - migration.down - - expect(second_label.reload.attributes).to include(second_label_attributes) - expect(fourth_label.reload.attributes).to include(fourth_label_attributes) - end - - context 'when the labels have a long title that might overflow' do - let(:long_title) { "a" * 255 } - - before do - first_label.update_attribute(:title, long_title) - second_label.update_attribute(:title, long_title) - end - - it 'keeps the length within the limit' do - migration.up - - expect(second_label.reload.title).to eq("#{"a" * 244}_duplicate#{second_label.id}") - expect(second_label.title.length).to eq(255) - end - end - end - end - - def modified_attributes(label) - label.attributes.except('created_at', 'updated_at') - end -end diff --git a/spec/migrations/remove_duplicate_labels_from_project_spec.rb b/spec/migrations/remove_duplicate_labels_from_project_spec.rb deleted file mode 100644 index eeb9f155e01..00000000000 --- a/spec/migrations/remove_duplicate_labels_from_project_spec.rb +++ /dev/null @@ -1,239 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe RemoveDuplicateLabelsFromProject do - let(:labels_table) { table(:labels) } - let(:labels) { labels_table.all } - let(:projects_table) { table(:projects) } - let(:projects) { projects_table.all } - let(:namespaces_table) { table(:namespaces) } - let(:namespaces) { namespaces_table.all } - let(:backup_labels_table) { table(:backup_labels) } - let(:backup_labels) { backup_labels_table.all } - - # all the possible tables with records that may have a relationship with a label - let(:analytics_cycle_analytics_group_stages_table) { table(:analytics_cycle_analytics_group_stages) } - let(:analytics_cycle_analytics_project_stages_table) { table(:analytics_cycle_analytics_project_stages) } - let(:board_labels_table) { table(:board_labels) } - let(:label_links_table) { table(:label_links) } - let(:label_priorities_table) { table(:label_priorities) } - let(:lists_table) { table(:lists) } - let(:resource_label_events_table) { table(:resource_label_events) } - - let!(:group_one) { namespaces_table.create!(id: 1, type: 'Group', name: 'group', path: 'group') } - let!(:project_one) do - projects_table.create!(id: 1, name: 'project', path: 'project', - visibility_level: 0, namespace_id: group_one.id) - end - - let(:label_title) { 'bug' } - let(:label_color) { 'red' } - let(:label_description) { 'nice label' } - let(:group_id) { group_one.id } - let(:project_id) { project_one.id } - let(:other_title) { 'feature' } - - let(:group_label_attributes) do - { - title: label_title, color: label_color, group_id: group_id, type: 'GroupLabel', template: false, description: label_description - } - end - - let(:project_label_attributes) do - { - title: label_title, color: label_color, project_id: project_id, type: 'ProjectLabel', template: false, description: label_description - } - end - - let(:migration) { described_class.new } - - describe 'removing full duplicates' do - context 'when there are no duplicate labels' do - let!(:first_label) { labels_table.create!(project_label_attributes.merge(id: 1, title: "a different label")) } - let!(:second_label) { labels_table.create!(project_label_attributes.merge(id: 2, title: "a totally different label")) } - - it 'does not remove anything' do - expect { migration.up }.not_to change { backup_labels_table.count } - end - - it 'restores removed records when rolling back - no change' do - migration.up - - expect { migration.down }.not_to change { labels_table.count } - end - end - - context 'with duplicates with no relationships' do - # can't use the activerecord class because the `type` makes it think it has polymorphism and should be/have a ProjectLabel subclass - let(:backup_labels) { ApplicationRecord.connection.execute('SELECT * from backup_labels') } - - let!(:first_label) { labels_table.create!(project_label_attributes.merge(id: 1)) } - let!(:second_label) { labels_table.create!(project_label_attributes.merge(id: 2)) } - let!(:third_label) { labels_table.create!(project_label_attributes.merge(id: 3, title: other_title)) } - let!(:fourth_label) { labels_table.create!(project_label_attributes.merge(id: 4, title: other_title)) } - - it 'creates a backup record for each removed record' do - expect { migration.up }.to change { backup_labels_table.count }.from(0).to(2) - end - - it 'creates the correct backup records with `create` restore_action' do - migration.up - - expect(backup_labels.find { |bl| bl["id"] == 2 }).to include(second_label.attributes.merge("restore_action" => described_class::CREATE, "new_title" => nil, "created_at" => anything, "updated_at" => anything)) - expect(backup_labels.find { |bl| bl["id"] == 4 }).to include(fourth_label.attributes.merge("restore_action" => described_class::CREATE, "new_title" => nil, "created_at" => anything, "updated_at" => anything)) - end - - it 'deletes all but one' do - migration.up - - expect { second_label.reload }.to raise_error(ActiveRecord::RecordNotFound) - expect { fourth_label.reload }.to raise_error(ActiveRecord::RecordNotFound) - end - - it 'restores removed records on rollback' do - second_label_attributes = modified_attributes(second_label) - fourth_label_attributes = modified_attributes(fourth_label) - - migration.up - - migration.down - - expect(second_label.attributes).to include(second_label_attributes) - expect(fourth_label.attributes).to include(fourth_label_attributes) - end - end - - context 'two duplicate records, one of which has a relationship' do - let!(:first_label) { labels_table.create!(project_label_attributes.merge(id: 1)) } - let!(:second_label) { labels_table.create!(project_label_attributes.merge(id: 2)) } - let!(:label_priority) { label_priorities_table.create!(label_id: second_label.id, project_id: project_id, priority: 1) } - - it 'does not remove anything' do - expect { migration.up }.not_to change { labels_table.count } - end - - it 'does not create a backup record with `create` restore_action' do - expect { migration.up }.not_to change { backup_labels_table.where(restore_action: described_class::CREATE).count } - end - - it 'restores removed records when rolling back - no change' do - migration.up - - expect { migration.down }.not_to change { labels_table.count } - end - end - - context 'multiple duplicates, a subset of which have relationships' do - let!(:first_label) { labels_table.create!(project_label_attributes.merge(id: 1)) } - let!(:second_label) { labels_table.create!(project_label_attributes.merge(id: 2)) } - let!(:label_priority_for_second_label) { label_priorities_table.create!(label_id: second_label.id, project_id: project_id, priority: 1) } - let!(:third_label) { labels_table.create!(project_label_attributes.merge(id: 3)) } - let!(:fourth_label) { labels_table.create!(project_label_attributes.merge(id: 4)) } - let!(:label_priority_for_fourth_label) { label_priorities_table.create!(label_id: fourth_label.id, project_id: project_id, priority: 2) } - - it 'creates a backup record with `create` restore_action for each removed record' do - expect { migration.up }.to change { backup_labels_table.where(restore_action: described_class::CREATE).count }.from(0).to(1) - end - - it 'creates the correct backup records' do - migration.up - - # can't use the activerecord class because the `type` column makes it think it has polymorphism and should be/have a ProjectLabel subclass - backup_labels = ApplicationRecord.connection.execute('SELECT * from backup_labels') - - expect(backup_labels.find { |bl| bl["id"] == 3 }).to include(third_label.attributes.merge("restore_action" => described_class::CREATE, "new_title" => nil, "created_at" => anything, "updated_at" => anything)) - end - - it 'deletes the duplicate record' do - migration.up - - expect { first_label.reload }.not_to raise_error - expect { second_label.reload }.not_to raise_error - expect { third_label.reload }.to raise_error(ActiveRecord::RecordNotFound) - end - - it 'restores removed records on rollback' do - third_label_attributes = modified_attributes(third_label) - - migration.up - migration.down - - expect(third_label.attributes).to include(third_label_attributes) - end - end - end - - describe 'renaming partial duplicates' do - # partial duplicates - only project_id and title match. Distinct colour prevents deletion. - context 'when there are no duplicate labels' do - let!(:first_label) { labels_table.create!(project_label_attributes.merge(id: 1, title: "a unique label", color: 'green')) } - let!(:second_label) { labels_table.create!(project_label_attributes.merge(id: 2, title: "a totally different, unique, label", color: 'blue')) } - - it 'does not rename anything' do - expect { migration.up }.not_to change { backup_labels_table.count } - end - end - - context 'with duplicates with no relationships' do - let!(:first_label) { labels_table.create!(project_label_attributes.merge(id: 1, color: 'green')) } - let!(:second_label) { labels_table.create!(project_label_attributes.merge(id: 2, color: 'blue')) } - let!(:third_label) { labels_table.create!(project_label_attributes.merge(id: 3, title: other_title, color: 'purple')) } - let!(:fourth_label) { labels_table.create!(project_label_attributes.merge(id: 4, title: other_title, color: 'yellow')) } - - it 'creates a backup record for each renamed record' do - expect { migration.up }.to change { backup_labels_table.count }.from(0).to(2) - end - - it 'creates the correct backup records with `rename` restore_action' do - migration.up - - # can't use the activerecord class because the `type` makes it think it has polymorphism and should be/have a ProjectLabel subclass - backup_labels = ApplicationRecord.connection.execute('SELECT * from backup_labels') - - expect(backup_labels.find { |bl| bl["id"] == 2 }).to include(second_label.attributes.merge("restore_action" => described_class::RENAME, "created_at" => anything, "updated_at" => anything)) - expect(backup_labels.find { |bl| bl["id"] == 4 }).to include(fourth_label.attributes.merge("restore_action" => described_class::RENAME, "created_at" => anything, "updated_at" => anything)) - end - - it 'modifies the titles of the partial duplicates' do - migration.up - - expect(second_label.reload.title).to match(/#{label_title}_duplicate#{second_label.id}$/) - expect(fourth_label.reload.title).to match(/#{other_title}_duplicate#{fourth_label.id}$/) - end - - it 'restores renamed records on rollback' do - second_label_attributes = modified_attributes(second_label) - fourth_label_attributes = modified_attributes(fourth_label) - - migration.up - - migration.down - - expect(second_label.reload.attributes).to include(second_label_attributes) - expect(fourth_label.reload.attributes).to include(fourth_label_attributes) - end - - context 'when the labels have a long title that might overflow' do - let(:long_title) { "a" * 255 } - - before do - first_label.update_attribute(:title, long_title) - second_label.update_attribute(:title, long_title) - end - - it 'keeps the length within the limit' do - migration.up - - expect(second_label.reload.title).to eq("#{"a" * 244}_duplicate#{second_label.id}") - expect(second_label.title.length).to eq 255 - end - end - end - end - - def modified_attributes(label) - label.attributes.except('created_at', 'updated_at') - end -end diff --git a/spec/migrations/remove_gitlab_issue_tracker_service_records_spec.rb b/spec/migrations/remove_gitlab_issue_tracker_service_records_spec.rb deleted file mode 100644 index b4aa5187d4c..00000000000 --- a/spec/migrations/remove_gitlab_issue_tracker_service_records_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe RemoveGitlabIssueTrackerServiceRecords do - let(:services) { table(:services) } - - before do - 5.times { services.create!(type: 'GitlabIssueTrackerService') } - services.create!(type: 'SomeOtherType') - end - - it 'removes services records of type GitlabIssueTrackerService', :aggregate_failures do - expect { migrate! }.to change { services.count }.from(6).to(1) - expect(services.first.type).to eq('SomeOtherType') - expect(services.where(type: 'GitlabIssueTrackerService')).to be_empty - end -end diff --git a/spec/migrations/remove_orphan_service_hooks_spec.rb b/spec/migrations/remove_orphan_service_hooks_spec.rb deleted file mode 100644 index 71e70daf1e6..00000000000 --- a/spec/migrations/remove_orphan_service_hooks_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! -require_migration!('add_web_hooks_service_foreign_key') - -RSpec.describe RemoveOrphanServiceHooks, schema: 20201203123201 do - let(:web_hooks) { table(:web_hooks) } - let(:services) { table(:services) } - - before do - services.create! - web_hooks.create!(service_id: services.first.id, type: 'ServiceHook') - web_hooks.create!(service_id: nil) - - AddWebHooksServiceForeignKey.new.down - web_hooks.create!(service_id: non_existing_record_id, type: 'ServiceHook') - AddWebHooksServiceForeignKey.new.up - end - - it 'removes service hooks where the referenced service does not exist', :aggregate_failures do - expect { RemoveOrphanServiceHooks.new.up }.to change { web_hooks.count }.by(-1) - expect(web_hooks.where.not(service_id: services.select(:id)).count).to eq(0) - end -end diff --git a/spec/migrations/remove_orphaned_invited_members_spec.rb b/spec/migrations/remove_orphaned_invited_members_spec.rb deleted file mode 100644 index 67e98b69ccc..00000000000 --- a/spec/migrations/remove_orphaned_invited_members_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe RemoveOrphanedInvitedMembers do - let(:members_table) { table(:members) } - let(:users_table) { table(:users) } - let(:namespaces_table) { table(:namespaces) } - let(:projects_table) { table(:projects) } - - let!(:user1) { users_table.create!(name: 'user1', email: 'user1@example.com', projects_limit: 1) } - let!(:user2) { users_table.create!(name: 'user2', email: 'user2@example.com', projects_limit: 1) } - let!(:group) { namespaces_table.create!(type: 'Group', name: 'group', path: 'group') } - let!(:project) { projects_table.create!(name: 'project', path: 'project', namespace_id: group.id) } - - let!(:member1) { create_member(user_id: user1.id, source_type: 'Project', source_id: project.id, access_level: 10) } - let!(:member2) { create_member(user_id: user2.id, source_type: 'Group', source_id: group.id, access_level: 20) } - - let!(:invited_member1) do - create_member(user_id: nil, source_type: 'Project', source_id: project.id, - invite_token: SecureRandom.hex, invite_accepted_at: Time.now, - access_level: 20) - end - - let!(:invited_member2) do - create_member(user_id: nil, source_type: 'Group', source_id: group.id, - invite_token: SecureRandom.hex, invite_accepted_at: Time.now, - access_level: 20) - end - - let!(:orphaned_member1) do - create_member(user_id: nil, source_type: 'Project', source_id: project.id, - invite_accepted_at: Time.now, access_level: 30) - end - - let!(:orphaned_member2) do - create_member(user_id: nil, source_type: 'Group', source_id: group.id, - invite_accepted_at: Time.now, access_level: 20) - end - - it 'removes orphaned invited members but keeps current members' do - expect { migrate! }.to change { members_table.count }.from(6).to(4) - - expect(members_table.all.pluck(:id)).to contain_exactly(member1.id, member2.id, invited_member1.id, invited_member2.id) - end - - def create_member(options) - members_table.create!( - { - notification_level: 0, - ldap: false, - override: false - }.merge(options) - ) - end -end diff --git a/spec/migrations/remove_packages_deprecated_dependencies_spec.rb b/spec/migrations/remove_packages_deprecated_dependencies_spec.rb deleted file mode 100644 index f76a26bcdc1..00000000000 --- a/spec/migrations/remove_packages_deprecated_dependencies_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe RemovePackagesDeprecatedDependencies do - let(:projects) { table(:projects) } - let(:packages) { table(:packages_packages) } - let(:dependency_links) { table(:packages_dependency_links) } - let(:dependencies) { table(:packages_dependencies) } - - before do - projects.create!(id: 123, name: 'gitlab', path: 'gitlab-org/gitlab-ce', namespace_id: 1) - packages.create!(id: 1, name: 'package', version: '1.0.0', package_type: 4, project_id: 123) - 5.times do |i| - dependencies.create!(id: i, name: "pkg_dependency_#{i}", version_pattern: '~1.0.0') - dependency_links.create!(package_id: 1, dependency_id: i, dependency_type: 5) - end - dependencies.create!(id: 10, name: 'valid_pkg_dependency', version_pattern: '~2.5.0') - dependency_links.create!(package_id: 1, dependency_id: 10, dependency_type: 1) - end - - it 'removes all dependency links with type 5' do - expect(dependency_links.count).to eq 6 - - migrate! - - expect(dependency_links.count).to eq 1 - end -end diff --git a/spec/migrations/remove_security_dashboard_feature_flag_spec.rb b/spec/migrations/remove_security_dashboard_feature_flag_spec.rb deleted file mode 100644 index fea7fe01cc7..00000000000 --- a/spec/migrations/remove_security_dashboard_feature_flag_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe RemoveSecurityDashboardFeatureFlag do - let(:feature_gates) { table(:feature_gates) } - - subject(:migration) { described_class.new } - - describe '#up' do - it 'deletes the security_dashboard feature gate' do - security_dashboard_feature = feature_gates.create!(feature_key: :security_dashboard, key: :boolean, value: 'false') - actors_security_dashboard_feature = feature_gates.create!(feature_key: :security_dashboard, key: :actors, value: 'Project:1') - - migration.up - - expect { security_dashboard_feature.reload }.to raise_error(ActiveRecord::RecordNotFound) - expect(actors_security_dashboard_feature.reload).to be_present - end - end - - describe '#down' do - it 'copies the instance_security_dashboard feature gate to a security_dashboard gate' do - feature_gates.create!(feature_key: :instance_security_dashboard, key: :actors, value: 'Project:1') - feature_gates.create!(feature_key: :instance_security_dashboard, key: 'boolean', value: 'false') - - migration.down - - security_dashboard_feature = feature_gates.find_by(feature_key: :security_dashboard, key: :boolean) - expect(security_dashboard_feature.value).to eq('false') - end - - context 'when there is no instance_security_dashboard gate' do - it 'does nothing' do - migration.down - - security_dashboard_feature = feature_gates.find_by(feature_key: :security_dashboard, key: :boolean) - expect(security_dashboard_feature).to be_nil - end - end - - context 'when there already is a security_dashboard gate' do - it 'does nothing' do - feature_gates.create!(feature_key: :security_dashboard, key: 'boolean', value: 'false') - feature_gates.create!(feature_key: :instance_security_dashboard, key: 'boolean', value: 'false') - - expect { migration.down }.not_to raise_error - end - end - end -end diff --git a/spec/migrations/rename_security_dashboard_feature_flag_to_instance_security_dashboard_spec.rb b/spec/migrations/rename_security_dashboard_feature_flag_to_instance_security_dashboard_spec.rb deleted file mode 100644 index fcbf94812fb..00000000000 --- a/spec/migrations/rename_security_dashboard_feature_flag_to_instance_security_dashboard_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe RenameSecurityDashboardFeatureFlagToInstanceSecurityDashboard do - let(:feature_gates) { table(:feature_gates) } - - subject(:migration) { described_class.new } - - describe '#up' do - it 'copies the security_dashboard feature gate to a new instance_security_dashboard gate' do - feature_gates.create!(feature_key: :security_dashboard, key: :actors, value: 'Project:1') - feature_gates.create!(feature_key: :security_dashboard, key: :boolean, value: 'false') - - migration.up - - instance_security_dashboard_feature = feature_gates.find_by(feature_key: :instance_security_dashboard, key: :boolean) - expect(instance_security_dashboard_feature.value).to eq('false') - end - - context 'when there is no security_dashboard gate' do - it 'does nothing' do - migration.up - - instance_security_dashboard_feature = feature_gates.find_by(feature_key: :instance_security_dashboard, key: :boolean) - expect(instance_security_dashboard_feature).to be_nil - end - end - - context 'when there is already an instance_security_dashboard gate' do - it 'does nothing' do - feature_gates.create!(feature_key: :security_dashboard, key: 'boolean', value: 'false') - feature_gates.create!(feature_key: :instance_security_dashboard, key: 'boolean', value: 'false') - - expect { migration.up }.not_to raise_error - end - end - end - - describe '#down' do - it 'removes the instance_security_dashboard gate' do - actors_instance_security_dashboard_feature = feature_gates.create!(feature_key: :instance_security_dashboard, key: :actors, value: 'Project:1') - instance_security_dashboard_feature = feature_gates.create!(feature_key: :instance_security_dashboard, key: :boolean, value: 'false') - - migration.down - - expect { instance_security_dashboard_feature.reload }.to raise_error(ActiveRecord::RecordNotFound) - expect(actors_instance_security_dashboard_feature.reload).to be_present - end - end -end diff --git a/spec/migrations/rename_sitemap_namespace_spec.rb b/spec/migrations/rename_sitemap_namespace_spec.rb deleted file mode 100644 index 21b74587d50..00000000000 --- a/spec/migrations/rename_sitemap_namespace_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe RenameSitemapNamespace do - let(:namespaces) { table(:namespaces) } - let(:routes) { table(:routes) } - let(:sitemap_path) { 'sitemap' } - - it 'correctly run #up and #down' do - create_namespace(sitemap_path) - - reversible_migration do |migration| - migration.before -> { - expect(namespaces.pluck(:path)).to contain_exactly(sitemap_path) - } - - migration.after -> { - expect(namespaces.pluck(:path)).to contain_exactly(sitemap_path + '0') - } - end - end - - def create_namespace(path) - namespaces.create!(name: path, path: path).tap do |namespace| - routes.create!(path: namespace.path, name: namespace.name, source_id: namespace.id, source_type: 'Namespace') - end - end -end diff --git a/spec/migrations/rename_sitemap_root_namespaces_spec.rb b/spec/migrations/rename_sitemap_root_namespaces_spec.rb deleted file mode 100644 index 12a687194e0..00000000000 --- a/spec/migrations/rename_sitemap_root_namespaces_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe RenameSitemapRootNamespaces do - let(:namespaces) { table(:namespaces) } - let(:routes) { table(:routes) } - let(:sitemap_path) { 'sitemap.xml' } - let(:sitemap_gz_path) { 'sitemap.xml.gz' } - let(:other_path1) { 'sitemap.xmlfoo' } - let(:other_path2) { 'foositemap.xml' } - - it 'correctly run #up and #down' do - create_namespace(sitemap_path) - create_namespace(sitemap_gz_path) - create_namespace(other_path1) - create_namespace(other_path2) - - reversible_migration do |migration| - migration.before -> { - expect(namespaces.pluck(:path)).to contain_exactly(sitemap_path, sitemap_gz_path, other_path1, other_path2) - } - - migration.after -> { - expect(namespaces.pluck(:path)).to contain_exactly(sitemap_path + '0', sitemap_gz_path + '0', other_path1, other_path2) - } - end - end - - def create_namespace(path) - namespaces.create!(name: path, path: path).tap do |namespace| - routes.create!(path: namespace.path, name: namespace.name, source_id: namespace.id, source_type: 'Namespace') - end - end -end diff --git a/spec/migrations/reschedule_set_default_iteration_cadences_spec.rb b/spec/migrations/reschedule_set_default_iteration_cadences_spec.rb deleted file mode 100644 index fb629c90d9f..00000000000 --- a/spec/migrations/reschedule_set_default_iteration_cadences_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe RescheduleSetDefaultIterationCadences do - let(:namespaces) { table(:namespaces) } - let(:iterations) { table(:sprints) } - - let(:group_1) { namespaces.create!(name: 'test_1', path: 'test_1') } - let!(:group_2) { namespaces.create!(name: 'test_2', path: 'test_2') } - let(:group_3) { namespaces.create!(name: 'test_3', path: 'test_3') } - let(:group_4) { namespaces.create!(name: 'test_4', path: 'test_4') } - let(:group_5) { namespaces.create!(name: 'test_5', path: 'test_5') } - let(:group_6) { namespaces.create!(name: 'test_6', path: 'test_6') } - let(:group_7) { namespaces.create!(name: 'test_7', path: 'test_7') } - let(:group_8) { namespaces.create!(name: 'test_8', path: 'test_8') } - - let!(:iteration_1) { iterations.create!(iid: 1, title: 'iteration 1', group_id: group_1.id, start_date: 2.days.from_now, due_date: 3.days.from_now) } - let!(:iteration_2) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_3.id, start_date: 2.days.from_now, due_date: 3.days.from_now) } - let!(:iteration_3) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_4.id, start_date: 2.days.from_now, due_date: 3.days.from_now) } - let!(:iteration_4) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_5.id, start_date: 2.days.from_now, due_date: 3.days.from_now) } - let!(:iteration_5) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_6.id, start_date: 2.days.from_now, due_date: 3.days.from_now) } - let!(:iteration_6) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_7.id, start_date: 2.days.from_now, due_date: 3.days.from_now) } - let!(:iteration_7) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_8.id, start_date: 2.days.from_now, due_date: 3.days.from_now) } - - around do |example| - freeze_time { Sidekiq::Testing.fake! { example.run } } - end - - it 'schedules the background jobs', :aggregate_failures do - stub_const("#{described_class.name}::BATCH_SIZE", 3) - - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to be(3) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(2.minutes, group_1.id, group_3.id, group_4.id) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(4.minutes, group_5.id, group_6.id, group_7.id) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(6.minutes, group_8.id) - end -end diff --git a/spec/migrations/reseed_merge_trains_enabled_spec.rb b/spec/migrations/reseed_merge_trains_enabled_spec.rb deleted file mode 100644 index 14ed44151d3..00000000000 --- a/spec/migrations/reseed_merge_trains_enabled_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ReseedMergeTrainsEnabled do - describe 'migrate' do - let(:project_ci_cd_settings) { table(:project_ci_cd_settings) } - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - - context 'when on Gitlab.com' do - before do - namespace = namespaces.create!(name: 'hello', path: 'hello/') - project1 = projects.create!(namespace_id: namespace.id) - project2 = projects.create!(namespace_id: namespace.id) - project_ci_cd_settings.create!(project_id: project1.id, merge_pipelines_enabled: true) - project_ci_cd_settings.create!(project_id: project2.id, merge_pipelines_enabled: false) - end - - it 'updates merge_trains_enabled to true for where merge_pipelines_enabled is true' do - expect { migrate! }.to change(project_ci_cd_settings.where(merge_trains_enabled: true), :count).by(1) - end - end - end -end diff --git a/spec/migrations/reseed_repository_storages_weighted_spec.rb b/spec/migrations/reseed_repository_storages_weighted_spec.rb deleted file mode 100644 index d7efff3dfba..00000000000 --- a/spec/migrations/reseed_repository_storages_weighted_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ReseedRepositoryStoragesWeighted do - let(:storages) { { "foo" => {}, "baz" => {} } } - let(:application_settings) do - table(:application_settings).tap do |klass| - klass.class_eval do - serialize :repository_storages - end - end - end - - before do - allow(Gitlab.config.repositories).to receive(:storages).and_return(storages) - end - - let(:repository_storages) { ["foo"] } - let!(:application_setting) { application_settings.create!(repository_storages: repository_storages) } - - context 'with empty repository_storages_weighted column' do - it 'populates repository_storages_weighted properly' do - migrate! - - expect(application_settings.find(application_setting.id).repository_storages_weighted).to eq({ "foo" => 100, "baz" => 0 }) - end - end - - context 'with already-populated repository_storages_weighted column' do - let(:existing_weights) { { "foo" => 100, "baz" => 50 } } - - it 'does not change repository_storages_weighted properly' do - application_setting.repository_storages_weighted = existing_weights - application_setting.save! - - migrate! - - expect(application_settings.find(application_setting.id).repository_storages_weighted).to eq(existing_weights) - end - end -end diff --git a/spec/migrations/save_instance_administrators_group_id_spec.rb b/spec/migrations/save_instance_administrators_group_id_spec.rb deleted file mode 100644 index 0846df18b5e..00000000000 --- a/spec/migrations/save_instance_administrators_group_id_spec.rb +++ /dev/null @@ -1,99 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe SaveInstanceAdministratorsGroupId do - let(:application_settings_table) { table(:application_settings) } - - let(:instance_administrators_group) do - table(:namespaces).create!( - id: 1, - name: 'GitLab Instance Administrators', - path: 'gitlab-instance-administrators-random', - type: 'Group' - ) - end - - let(:self_monitoring_project) do - table(:projects).create!( - id: 2, - name: 'Self Monitoring', - path: 'self_monitoring', - namespace_id: instance_administrators_group.id - ) - end - - context 'when project ID is saved but group ID is not' do - let(:application_settings) do - application_settings_table.create!(instance_administration_project_id: self_monitoring_project.id) - end - - it 'saves instance administrators group ID' do - expect(application_settings.instance_administration_project_id).to eq(self_monitoring_project.id) - expect(application_settings.instance_administrators_group_id).to be_nil - - migrate! - - expect(application_settings.reload.instance_administrators_group_id).to eq(instance_administrators_group.id) - expect(application_settings.instance_administration_project_id).to eq(self_monitoring_project.id) - end - end - - context 'when group ID is saved but project ID is not' do - let(:application_settings) do - application_settings_table.create!(instance_administrators_group_id: instance_administrators_group.id) - end - - it 'does not make changes' do - expect(application_settings.instance_administrators_group_id).to eq(instance_administrators_group.id) - expect(application_settings.instance_administration_project_id).to be_nil - - migrate! - - expect(application_settings.reload.instance_administrators_group_id).to eq(instance_administrators_group.id) - expect(application_settings.instance_administration_project_id).to be_nil - end - end - - context 'when group ID and project ID are both saved' do - let(:application_settings) do - application_settings_table.create!( - instance_administrators_group_id: instance_administrators_group.id, - instance_administration_project_id: self_monitoring_project.id - ) - end - - it 'does not make changes' do - expect(application_settings.instance_administrators_group_id).to eq(instance_administrators_group.id) - expect(application_settings.instance_administration_project_id).to eq(self_monitoring_project.id) - - migrate! - - expect(application_settings.reload.instance_administrators_group_id).to eq(instance_administrators_group.id) - expect(application_settings.instance_administration_project_id).to eq(self_monitoring_project.id) - end - end - - context 'when neither group ID nor project ID is saved' do - let(:application_settings) do - application_settings_table.create! - end - - it 'does not make changes' do - expect(application_settings.instance_administrators_group_id).to be_nil - expect(application_settings.instance_administration_project_id).to be_nil - - migrate! - - expect(application_settings.reload.instance_administrators_group_id).to be_nil - expect(application_settings.instance_administration_project_id).to be_nil - end - end - - context 'when application_settings table has no rows' do - it 'does not fail' do - migrate! - end - end -end diff --git a/spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb b/spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb new file mode 100644 index 00000000000..c66ac1bd7e9 --- /dev/null +++ b/spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe ScheduleAddPrimaryEmailToEmailsIfUserConfirmed, :sidekiq do + let(:migration) { described_class.new } + let(:users) { table(:users) } + + let!(:user_1) { users.create!(name: 'confirmed-user-1', email: 'confirmed-1@example.com', confirmed_at: 1.day.ago, projects_limit: 100) } + let!(:user_2) { users.create!(name: 'confirmed-user-2', email: 'confirmed-2@example.com', confirmed_at: 1.day.ago, projects_limit: 100) } + let!(:user_3) { users.create!(name: 'confirmed-user-3', email: 'confirmed-3@example.com', confirmed_at: 1.day.ago, projects_limit: 100) } + let!(:user_4) { users.create!(name: 'confirmed-user-4', email: 'confirmed-4@example.com', confirmed_at: 1.day.ago, projects_limit: 100) } + + before do + stub_const("#{described_class.name}::BATCH_SIZE", 2) + stub_const("#{described_class.name}::INTERVAL", 2.minutes.to_i) + end + + it 'schedules addition of primary email to emails in delayed batches' do + Sidekiq::Testing.fake! do + freeze_time do + migration.up + + expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, user_1.id, user_2.id) + expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, user_3.id, user_4.id) + expect(BackgroundMigrationWorker.jobs.size).to eq(2) + end + end + end +end diff --git a/spec/migrations/schedule_backfill_push_rules_id_in_projects_spec.rb b/spec/migrations/schedule_backfill_push_rules_id_in_projects_spec.rb deleted file mode 100644 index 7b71110e62d..00000000000 --- a/spec/migrations/schedule_backfill_push_rules_id_in_projects_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe ScheduleBackfillPushRulesIdInProjects do - let(:push_rules) { table(:push_rules) } - - it 'adds global rule association to application settings' do - application_settings = table(:application_settings) - setting = application_settings.create! - sample_rule = push_rules.create!(is_sample: true) - - Sidekiq::Testing.fake! do - disable_migrations_output { migrate! } - end - - setting.reload - expect(setting.push_rule_id).to eq(sample_rule.id) - end - - it 'adds global rule association to last application settings when there is more than one record without failing' do - application_settings = table(:application_settings) - setting_old = application_settings.create! - setting = application_settings.create! - sample_rule = push_rules.create!(is_sample: true) - - Sidekiq::Testing.fake! do - disable_migrations_output { migrate! } - end - - expect(setting_old.reload.push_rule_id).to be_nil - expect(setting.reload.push_rule_id).to eq(sample_rule.id) - end - - it 'schedules worker to migrate project push rules' do - rule_1 = push_rules.create! - rule_2 = push_rules.create! - - Sidekiq::Testing.fake! do - disable_migrations_output { migrate! } - - expect(BackgroundMigrationWorker.jobs.size).to eq(1) - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(5.minutes, rule_1.id, rule_2.id) - end - end -end diff --git a/spec/migrations/schedule_blocked_by_links_replacement_second_try_spec.rb b/spec/migrations/schedule_blocked_by_links_replacement_second_try_spec.rb deleted file mode 100644 index f2a0bdba32a..00000000000 --- a/spec/migrations/schedule_blocked_by_links_replacement_second_try_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleBlockedByLinksReplacementSecondTry do - let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab-org') } - let(:project) { table(:projects).create!(namespace_id: namespace.id, name: 'gitlab') } - let(:issue1) { table(:issues).create!(project_id: project.id, title: 'a') } - let(:issue2) { table(:issues).create!(project_id: project.id, title: 'b') } - let(:issue3) { table(:issues).create!(project_id: project.id, title: 'c') } - let!(:issue_links) do - [ - table(:issue_links).create!(source_id: issue1.id, target_id: issue2.id, link_type: 1), - table(:issue_links).create!(source_id: issue2.id, target_id: issue1.id, link_type: 2), - table(:issue_links).create!(source_id: issue1.id, target_id: issue3.id, link_type: 2) - ] - end - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 1) - end - - it 'schedules jobs for blocked_by links' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration( - 2.minutes, issue_links[1].id, issue_links[1].id) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration( - 4.minutes, issue_links[2].id, issue_links[2].id) - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end -end diff --git a/spec/migrations/schedule_link_lfs_objects_projects_spec.rb b/spec/migrations/schedule_link_lfs_objects_projects_spec.rb deleted file mode 100644 index 29c203c2c31..00000000000 --- a/spec/migrations/schedule_link_lfs_objects_projects_spec.rb +++ /dev/null @@ -1,76 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleLinkLfsObjectsProjects, :migration, :sidekiq do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:fork_networks) { table(:fork_networks) } - let(:fork_network_members) { table(:fork_network_members) } - let(:lfs_objects) { table(:lfs_objects) } - let(:lfs_objects_projects) { table(:lfs_objects_projects) } - - let(:namespace) { namespaces.create!(name: 'GitLab', path: 'gitlab') } - - let(:fork_network) { fork_networks.create!(root_project_id: source_project.id) } - let(:another_fork_network) { fork_networks.create!(root_project_id: another_source_project.id) } - - let(:source_project) { projects.create!(namespace_id: namespace.id) } - let(:another_source_project) { projects.create!(namespace_id: namespace.id) } - let(:project) { projects.create!(namespace_id: namespace.id) } - let(:another_project) { projects.create!(namespace_id: namespace.id) } - - let(:lfs_object) { lfs_objects.create!(oid: 'abc123', size: 100) } - let(:another_lfs_object) { lfs_objects.create!(oid: 'def456', size: 200) } - - let!(:source_project_lop_1) do - lfs_objects_projects.create!( - lfs_object_id: lfs_object.id, - project_id: source_project.id - ) - end - - let!(:source_project_lop_2) do - lfs_objects_projects.create!( - lfs_object_id: another_lfs_object.id, - project_id: source_project.id - ) - end - - let!(:another_source_project_lop_1) do - lfs_objects_projects.create!( - lfs_object_id: lfs_object.id, - project_id: another_source_project.id - ) - end - - let!(:another_source_project_lop_2) do - lfs_objects_projects.create!( - lfs_object_id: another_lfs_object.id, - project_id: another_source_project.id - ) - end - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 2) - - # Create links between projects - fork_network_members.create!(fork_network_id: fork_network.id, project_id: source_project.id, forked_from_project_id: nil) - fork_network_members.create!(fork_network_id: fork_network.id, project_id: project.id, forked_from_project_id: source_project.id) - fork_network_members.create!(fork_network_id: another_fork_network.id, project_id: another_source_project.id, forked_from_project_id: nil) - fork_network_members.create!(fork_network_id: another_fork_network.id, project_id: another_project.id, forked_from_project_id: another_fork_network.root_project_id) - end - - it 'schedules background migration to link LFS objects' do - Sidekiq::Testing.fake! do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes, source_project_lop_1.id, source_project_lop_2.id) - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(4.minutes, another_source_project_lop_1.id, another_source_project_lop_2.id) - end - end -end diff --git a/spec/migrations/schedule_merge_request_cleanup_schedules_backfill_spec.rb b/spec/migrations/schedule_merge_request_cleanup_schedules_backfill_spec.rb deleted file mode 100644 index 319c0802f2c..00000000000 --- a/spec/migrations/schedule_merge_request_cleanup_schedules_backfill_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe ScheduleMergeRequestCleanupSchedulesBackfill, :sidekiq, schema: 20201023114628 do - let(:merge_requests) { table(:merge_requests) } - let(:cleanup_schedules) { table(:merge_request_cleanup_schedules) } - - let(:namespace) { table(:namespaces).create!(name: 'name', path: 'path') } - let(:project) { table(:projects).create!(namespace_id: namespace.id) } - - describe '#up' do - let!(:open_mr) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master') } - - let!(:closed_mr_1) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master', state_id: 2) } - let!(:closed_mr_2) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master', state_id: 2) } - - let!(:merged_mr_1) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master', state_id: 3) } - let!(:merged_mr_2) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master', state_id: 3) } - - before do - stub_const("#{described_class}::BATCH_SIZE", 2) - end - - it 'schedules BackfillMergeRequestCleanupSchedules background jobs' do - Sidekiq::Testing.fake! do - migrate! - - aggregate_failures do - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes, closed_mr_1.id, closed_mr_2.id) - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(4.minutes, merged_mr_1.id, merged_mr_2.id) - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end - end -end diff --git a/spec/migrations/schedule_migrate_security_scans_spec.rb b/spec/migrations/schedule_migrate_security_scans_spec.rb deleted file mode 100644 index ce926241ba6..00000000000 --- a/spec/migrations/schedule_migrate_security_scans_spec.rb +++ /dev/null @@ -1,67 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleMigrateSecurityScans, :sidekiq do - let(:migration) { described_class.new } - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:builds) { table(:ci_builds) } - let(:job_artifacts) { table(:ci_job_artifacts) } - - let(:namespace) { namespaces.create!(name: "foo", path: "bar") } - let(:project) { projects.create!(namespace_id: namespace.id) } - let(:job) { builds.create! } - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 1) - stub_const("#{described_class.name}::INTERVAL", 5.minutes.to_i) - end - - context 'no security job artifacts' do - before do - table(:ci_job_artifacts) - end - - it 'does not schedule migration' do - Sidekiq::Testing.fake! do - migrate! - - expect(BackgroundMigrationWorker.jobs).to be_empty - end - end - end - - context 'has security job artifacts' do - let!(:job_artifact_1) { job_artifacts.create!(project_id: project.id, job_id: job.id, file_type: 5) } - let!(:job_artifact_2) { job_artifacts.create!(project_id: project.id, job_id: job.id, file_type: 8) } - - it 'schedules migration of security scans' do - Sidekiq::Testing.fake! do - freeze_time do - migration.up - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, job_artifact_1.id, job_artifact_1.id) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(10.minutes, job_artifact_2.id, job_artifact_2.id) - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end - end - - context 'has non-security job artifacts' do - let!(:job_artifact_1) { job_artifacts.create!(project_id: project.id, job_id: job.id, file_type: 4) } - let!(:job_artifact_2) { job_artifacts.create!(project_id: project.id, job_id: job.id, file_type: 9) } - - it 'schedules migration of security scans' do - Sidekiq::Testing.fake! do - freeze_time do - migration.up - - expect(BackgroundMigrationWorker.jobs).to be_empty - end - end - end - end -end diff --git a/spec/migrations/schedule_migrate_u2f_webauthn_spec.rb b/spec/migrations/schedule_migrate_u2f_webauthn_spec.rb deleted file mode 100644 index 48f098e34fc..00000000000 --- a/spec/migrations/schedule_migrate_u2f_webauthn_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleMigrateU2fWebauthn do - let(:migration_name) { described_class::MIGRATION } - let(:u2f_registrations) { table(:u2f_registrations) } - let(:webauthn_registrations) { table(:webauthn_registrations) } - - let(:users) { table(:users) } - - let(:user) { users.create!(email: 'email@email.com', name: 'foo', username: 'foo', projects_limit: 0) } - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 1) - end - - context 'when there are u2f registrations' do - let!(:u2f_reg_1) { create_u2f_registration(1, 'reg1') } - let!(:u2f_reg_2) { create_u2f_registration(2, 'reg2') } - - it 'schedules a background migration' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(migration_name).to be_scheduled_delayed_migration(2.minutes, 1, 1) - expect(migration_name).to be_scheduled_delayed_migration(4.minutes, 2, 2) - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end - end - - context 'when there are no u2f registrations' do - it 'does not schedule background migrations' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(0) - end - end - end - end - - def create_u2f_registration(id, name) - device = U2F::FakeU2F.new(FFaker::BaconIpsum.characters(5)) - u2f_registrations.create!({ id: id, - certificate: Base64.strict_encode64(device.cert_raw), - key_handle: U2F.urlsafe_encode64(device.key_handle_raw), - public_key: Base64.strict_encode64(device.origin_public_key_raw), - counter: 5, - name: name, - user_id: user.id }) - end -end diff --git a/spec/migrations/schedule_populate_has_vulnerabilities_spec.rb b/spec/migrations/schedule_populate_has_vulnerabilities_spec.rb deleted file mode 100644 index edae7330b1e..00000000000 --- a/spec/migrations/schedule_populate_has_vulnerabilities_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe SchedulePopulateHasVulnerabilities do - let(:users) { table(:users) } - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:vulnerabilities) { table(:vulnerabilities) } - let(:user) { users.create!(name: 'test', email: 'test@example.com', projects_limit: 5) } - let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') } - let(:vulnerability_base_params) { { title: 'title', state: 2, severity: 0, confidence: 5, report_type: 2, author_id: user.id } } - let!(:project_1) { projects.create!(namespace_id: namespace.id, name: 'foo_1') } - let!(:project_2) { projects.create!(namespace_id: namespace.id, name: 'foo_2') } - let!(:project_3) { projects.create!(namespace_id: namespace.id, name: 'foo_3') } - - around do |example| - freeze_time { Sidekiq::Testing.fake! { example.run } } - end - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 1) - - vulnerabilities.create!(vulnerability_base_params.merge(project_id: project_1.id)) - vulnerabilities.create!(vulnerability_base_params.merge(project_id: project_3.id)) - end - - it 'schedules the background jobs', :aggregate_failures do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to be(2) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(2.minutes, project_1.id) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(4.minutes, project_3.id) - end -end diff --git a/spec/migrations/schedule_populate_issue_email_participants_spec.rb b/spec/migrations/schedule_populate_issue_email_participants_spec.rb deleted file mode 100644 index 3a7a4e4df1e..00000000000 --- a/spec/migrations/schedule_populate_issue_email_participants_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe SchedulePopulateIssueEmailParticipants do - let!(:namespace) { table(:namespaces).create!(name: 'namespace', path: 'namespace') } - let!(:project) { table(:projects).create!(id: 1, namespace_id: namespace.id) } - let!(:issue1) { table(:issues).create!(id: 1, project_id: project.id, service_desk_reply_to: "a@gitlab.com") } - let!(:issue2) { table(:issues).create!(id: 2, project_id: project.id) } - let!(:issue3) { table(:issues).create!(id: 3, project_id: project.id, service_desk_reply_to: "b@gitlab.com") } - let!(:issue4) { table(:issues).create!(id: 4, project_id: project.id, service_desk_reply_to: "c@gitlab.com") } - let!(:issue5) { table(:issues).create!(id: 5, project_id: project.id, service_desk_reply_to: "d@gitlab.com") } - let(:issue_email_participants) { table(:issue_email_participants) } - - it 'correctly schedules background migrations' do - stub_const("#{described_class.name}::BATCH_SIZE", 2) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes, 1, 3) - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(4.minutes, 4, 5) - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end -end diff --git a/spec/migrations/schedule_populate_missing_dismissal_information_for_vulnerabilities_spec.rb b/spec/migrations/schedule_populate_missing_dismissal_information_for_vulnerabilities_spec.rb deleted file mode 100644 index e5934f2171f..00000000000 --- a/spec/migrations/schedule_populate_missing_dismissal_information_for_vulnerabilities_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe SchedulePopulateMissingDismissalInformationForVulnerabilities do - let(:users) { table(:users) } - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:vulnerabilities) { table(:vulnerabilities) } - let(:user) { users.create!(name: 'test', email: 'test@example.com', projects_limit: 5) } - let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') } - let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') } - - let!(:vulnerability_1) { vulnerabilities.create!(title: 'title', state: 2, severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id) } - let!(:vulnerability_2) { vulnerabilities.create!(title: 'title', state: 2, severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id, dismissed_at: Time.now) } - let!(:vulnerability_3) { vulnerabilities.create!(title: 'title', state: 2, severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id, dismissed_by_id: user.id) } - let!(:vulnerability_4) { vulnerabilities.create!(title: 'title', state: 2, severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id, dismissed_at: Time.now, dismissed_by_id: user.id) } - let!(:vulnerability_5) { vulnerabilities.create!(title: 'title', state: 1, severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id) } - - around do |example| - freeze_time { Sidekiq::Testing.fake! { example.run } } - end - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 1) - end - - it 'schedules the background jobs', :aggregate_failures do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to be(3) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(3.minutes, vulnerability_1.id) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(6.minutes, vulnerability_2.id) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(9.minutes, vulnerability_3.id) - end -end diff --git a/spec/migrations/schedule_populate_personal_snippet_statistics_spec.rb b/spec/migrations/schedule_populate_personal_snippet_statistics_spec.rb deleted file mode 100644 index 5f764a1ee8f..00000000000 --- a/spec/migrations/schedule_populate_personal_snippet_statistics_spec.rb +++ /dev/null @@ -1,60 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe SchedulePopulatePersonalSnippetStatistics do - let(:users) { table(:users) } - let(:namespaces) { table(:namespaces) } - let(:snippets) { table(:snippets) } - let(:projects) { table(:projects) } - let!(:user1) { users.create!(id: 1, email: 'user1@example.com', projects_limit: 10, username: 'test1', name: 'Test1', state: 'active') } - let!(:user2) { users.create!(id: 2, email: 'user2@example.com', projects_limit: 10, username: 'test2', name: 'Test2', state: 'active') } - let!(:user3) { users.create!(id: 3, email: 'user3@example.com', projects_limit: 10, username: 'test3', name: 'Test3', state: 'active') } - let!(:namespace1) { namespaces.create!(id: 1, owner_id: user1.id, name: 'test1', path: 'test1') } - let!(:namespace2) { namespaces.create!(id: 2, owner_id: user2.id, name: 'test2', path: 'test2') } - let!(:namespace3) { namespaces.create!(id: 3, owner_id: user3.id, name: 'test3', path: 'test3') } - - def create_snippet(id, user_id, type = 'PersonalSnippet') - params = { - id: id, - type: type, - author_id: user_id, - file_name: 'foo', - content: 'bar' - } - - snippets.create!(params) - end - - it 'correctly schedules background migrations' do - # Creating the snippets in different order - create_snippet(1, user1.id) - create_snippet(2, user2.id) - create_snippet(3, user1.id) - create_snippet(4, user3.id) - create_snippet(5, user3.id) - create_snippet(6, user1.id) - # Creating a project snippet to ensure we don't pick it - create_snippet(7, user1.id, 'ProjectSnippet') - - stub_const("#{described_class}::BATCH_SIZE", 4) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - aggregate_failures do - expect(described_class::MIGRATION) - .to be_scheduled_migration([1, 3, 6, 2]) - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes, [4, 5]) - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end - end -end diff --git a/spec/migrations/schedule_populate_project_snippet_statistics_spec.rb b/spec/migrations/schedule_populate_project_snippet_statistics_spec.rb deleted file mode 100644 index 4ac107c5202..00000000000 --- a/spec/migrations/schedule_populate_project_snippet_statistics_spec.rb +++ /dev/null @@ -1,61 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe SchedulePopulateProjectSnippetStatistics do - let(:users) { table(:users) } - let(:snippets) { table(:snippets) } - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - let(:user1) { users.create!(id: 1, email: 'user1@example.com', projects_limit: 10, username: 'test1', name: 'Test1', state: 'active') } - let(:user2) { users.create!(id: 2, email: 'user2@example.com', projects_limit: 10, username: 'test2', name: 'Test2', state: 'active') } - let(:namespace1) { namespaces.create!(id: 1, owner_id: user1.id, name: 'user1', path: 'user1') } - let(:namespace2) { namespaces.create!(id: 2, owner_id: user2.id, name: 'user2', path: 'user2') } - let(:project1) { projects.create!(id: 1, namespace_id: namespace1.id) } - let(:project2) { projects.create!(id: 2, namespace_id: namespace1.id) } - let(:project3) { projects.create!(id: 3, namespace_id: namespace2.id) } - - def create_snippet(id, user_id, project_id, type = 'ProjectSnippet') - params = { - id: id, - type: type, - author_id: user_id, - project_id: project_id, - file_name: 'foo', - content: 'bar' - } - - snippets.create!(params) - end - - it 'correctly schedules background migrations' do - # Creating the snippets in different order - create_snippet(1, user1.id, project1.id) - create_snippet(2, user2.id, project3.id) - create_snippet(3, user1.id, project1.id) - create_snippet(4, user1.id, project2.id) - create_snippet(5, user2.id, project3.id) - create_snippet(6, user1.id, project1.id) - # Creating a personal snippet to ensure we don't pick it - create_snippet(7, user1.id, nil, 'PersonalSnippet') - - stub_const("#{described_class}::BATCH_SIZE", 4) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - aggregate_failures do - expect(described_class::MIGRATION) - .to be_scheduled_migration([1, 3, 6, 4]) - - expect(described_class::MIGRATION) - .to be_scheduled_delayed_migration(2.minutes, [2, 5]) - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end - end -end diff --git a/spec/migrations/schedule_populate_user_highest_roles_table_spec.rb b/spec/migrations/schedule_populate_user_highest_roles_table_spec.rb deleted file mode 100644 index 0a2ee82b349..00000000000 --- a/spec/migrations/schedule_populate_user_highest_roles_table_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe SchedulePopulateUserHighestRolesTable do - let(:users) { table(:users) } - - def create_user(id, params = {}) - user_params = { - id: id, - state: 'active', - user_type: nil, - bot_type: nil, - ghost: nil, - email: "user#{id}@example.com", - projects_limit: 0 - }.merge(params) - - users.create!(user_params) - end - - it 'correctly schedules background migrations' do - create_user(1) - create_user(2, state: 'blocked') - create_user(3, user_type: 2) - create_user(4) - create_user(5, bot_type: 1) - create_user(6, ghost: true) - create_user(7, ghost: false) - - stub_const("#{described_class.name}::BATCH_SIZE", 2) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, 1, 4) - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration(10.minutes, 7, 7) - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end -end diff --git a/spec/migrations/schedule_recalculate_project_authorizations_second_run_spec.rb b/spec/migrations/schedule_recalculate_project_authorizations_second_run_spec.rb deleted file mode 100644 index 380d107250b..00000000000 --- a/spec/migrations/schedule_recalculate_project_authorizations_second_run_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleRecalculateProjectAuthorizationsSecondRun do - let(:users_table) { table(:users) } - - before do - stub_const("#{described_class}::BATCH_SIZE", 2) - - 1.upto(4) do |i| - users_table.create!(id: i, name: "user#{i}", email: "user#{i}@example.com", projects_limit: 1) - end - end - - it 'schedules background migration' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - expect(described_class::MIGRATION).to be_scheduled_migration(1, 2) - expect(described_class::MIGRATION).to be_scheduled_migration(3, 4) - end - end - end -end diff --git a/spec/migrations/schedule_recalculate_project_authorizations_spec.rb b/spec/migrations/schedule_recalculate_project_authorizations_spec.rb deleted file mode 100644 index a4400c2ac83..00000000000 --- a/spec/migrations/schedule_recalculate_project_authorizations_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleRecalculateProjectAuthorizations do - let(:users_table) { table(:users) } - let(:namespaces_table) { table(:namespaces) } - let(:projects_table) { table(:projects) } - let(:project_authorizations_table) { table(:project_authorizations) } - - let(:user1) { users_table.create!(name: 'user1', email: 'user1@example.com', projects_limit: 1) } - let(:user2) { users_table.create!(name: 'user2', email: 'user2@example.com', projects_limit: 1) } - let(:group) { namespaces_table.create!(id: 1, type: 'Group', name: 'group', path: 'group') } - let(:project) do - projects_table.create!(id: 1, name: 'project', path: 'project', - visibility_level: 0, namespace_id: group.id) - end - - before do - stub_const("#{described_class}::BATCH_SIZE", 1) - - project_authorizations_table.create!(user_id: user1.id, project_id: project.id, access_level: 30) - project_authorizations_table.create!(user_id: user2.id, project_id: project.id, access_level: 30) - end - - it 'schedules background migration' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - expect(described_class::MIGRATION).to be_scheduled_migration([user1.id]) - expect(described_class::MIGRATION).to be_scheduled_migration([user2.id]) - end - end - end - - it 'ignores projects with higher id than maximum group id' do - another_user = users_table.create!(name: 'another user', email: 'another-user@example.com', - projects_limit: 1) - ignored_project = projects_table.create!(id: 2, name: 'ignored-project', path: 'ignored-project', - visibility_level: 0, namespace_id: group.id) - project_authorizations_table.create!(user_id: another_user.id, project_id: ignored_project.id, - access_level: 30) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - expect(described_class::MIGRATION).to be_scheduled_migration([user1.id]) - expect(described_class::MIGRATION).to be_scheduled_migration([user2.id]) - end - end - end -end diff --git a/spec/migrations/schedule_recalculate_project_authorizations_third_run_spec.rb b/spec/migrations/schedule_recalculate_project_authorizations_third_run_spec.rb deleted file mode 100644 index 302ae1d5ebe..00000000000 --- a/spec/migrations/schedule_recalculate_project_authorizations_third_run_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleRecalculateProjectAuthorizationsThirdRun do - let(:users_table) { table(:users) } - - before do - stub_const("#{described_class}::BATCH_SIZE", 2) - - 1.upto(4) do |i| - users_table.create!(id: i, name: "user#{i}", email: "user#{i}@example.com", projects_limit: 1) - end - end - - it 'schedules background migration' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - expect(described_class::MIGRATION).to be_scheduled_migration(1, 2) - expect(described_class::MIGRATION).to be_scheduled_migration(3, 4) - end - end - end -end diff --git a/spec/migrations/schedule_repopulate_historical_vulnerability_statistics_spec.rb b/spec/migrations/schedule_repopulate_historical_vulnerability_statistics_spec.rb deleted file mode 100644 index a65c94cf60e..00000000000 --- a/spec/migrations/schedule_repopulate_historical_vulnerability_statistics_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleRepopulateHistoricalVulnerabilityStatistics do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:project_settings) { table(:project_settings) } - - let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') } - let!(:project_1) { projects.create!(namespace_id: namespace.id, name: 'foo_1') } - let!(:project_2) { projects.create!(namespace_id: namespace.id, name: 'foo_2') } - let!(:project_3) { projects.create!(namespace_id: namespace.id, name: 'foo_3') } - let!(:project_4) { projects.create!(namespace_id: namespace.id, name: 'foo_4') } - - around do |example| - freeze_time { Sidekiq::Testing.fake! { example.run } } - end - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 1) - - project_settings.create!(project_id: project_1.id, has_vulnerabilities: true) - project_settings.create!(project_id: project_2.id, has_vulnerabilities: false) - project_settings.create!(project_id: project_4.id, has_vulnerabilities: true) - end - - it 'schedules the background jobs', :aggregate_failures do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to be(2) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(described_class::DELAY_INTERVAL, [project_1.id], described_class::DAY_COUNT) - expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(2 * described_class::DELAY_INTERVAL, [project_4.id], described_class::DAY_COUNT) - end -end diff --git a/spec/migrations/schedule_update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb b/spec/migrations/schedule_update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb deleted file mode 100644 index 8f265acccae..00000000000 --- a/spec/migrations/schedule_update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb +++ /dev/null @@ -1,79 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleUpdateExistingSubgroupToMatchVisibilityLevelOfParent do - include MigrationHelpers::NamespacesHelpers - let(:migration_class) { described_class::MIGRATION } - let(:migration_name) { migration_class.to_s.demodulize } - - context 'private visibility level' do - it 'correctly schedules background migrations' do - parent = create_namespace('parent', Gitlab::VisibilityLevel::PRIVATE) - create_namespace('child', Gitlab::VisibilityLevel::PUBLIC, parent_id: parent.id) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(1) - expect(migration_name).to be_scheduled_migration_with_multiple_args([parent.id], Gitlab::VisibilityLevel::PRIVATE) - end - end - end - - it 'correctly schedules background migrations for groups and subgroups' do - parent = create_namespace('parent', Gitlab::VisibilityLevel::PRIVATE) - middle_group = create_namespace('middle_group', Gitlab::VisibilityLevel::PRIVATE, parent_id: parent.id) - create_namespace('middle_empty_group', Gitlab::VisibilityLevel::PRIVATE, parent_id: parent.id) - create_namespace('child', Gitlab::VisibilityLevel::PUBLIC, parent_id: middle_group.id) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(1) - expect(migration_name).to be_scheduled_migration_with_multiple_args([middle_group.id, parent.id], Gitlab::VisibilityLevel::PRIVATE) - end - end - end - end - - context 'internal visibility level' do - it 'correctly schedules background migrations' do - parent = create_namespace('parent', Gitlab::VisibilityLevel::INTERNAL) - middle_group = create_namespace('child', Gitlab::VisibilityLevel::INTERNAL, parent_id: parent.id) - create_namespace('child', Gitlab::VisibilityLevel::PUBLIC, parent_id: middle_group.id) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(1) - expect(migration_name).to be_scheduled_migration_with_multiple_args([parent.id, middle_group.id], Gitlab::VisibilityLevel::INTERNAL) - end - end - end - end - - context 'mixed visibility levels' do - it 'correctly schedules background migrations' do - parent1 = create_namespace('parent1', Gitlab::VisibilityLevel::INTERNAL) - create_namespace('child', Gitlab::VisibilityLevel::PUBLIC, parent_id: parent1.id) - parent2 = create_namespace('parent2', Gitlab::VisibilityLevel::PRIVATE) - middle_group = create_namespace('middle_group', Gitlab::VisibilityLevel::INTERNAL, parent_id: parent2.id) - create_namespace('child', Gitlab::VisibilityLevel::PUBLIC, parent_id: middle_group.id) - - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - expect(migration_name).to be_scheduled_migration_with_multiple_args([parent1.id, middle_group.id], Gitlab::VisibilityLevel::INTERNAL) - expect(migration_name).to be_scheduled_migration_with_multiple_args([parent2.id], Gitlab::VisibilityLevel::PRIVATE) - end - end - end - end -end diff --git a/spec/migrations/schedule_update_existing_users_that_require_two_factor_auth_spec.rb b/spec/migrations/schedule_update_existing_users_that_require_two_factor_auth_spec.rb deleted file mode 100644 index a839229ec22..00000000000 --- a/spec/migrations/schedule_update_existing_users_that_require_two_factor_auth_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ScheduleUpdateExistingUsersThatRequireTwoFactorAuth do - let(:users) { table(:users) } - let!(:user_1) { users.create!(require_two_factor_authentication_from_group: true, name: "user1", email: "user1@example.com", projects_limit: 1) } - let!(:user_2) { users.create!(require_two_factor_authentication_from_group: false, name: "user2", email: "user2@example.com", projects_limit: 1) } - let!(:user_3) { users.create!(require_two_factor_authentication_from_group: true, name: "user3", email: "user3@example.com", projects_limit: 1) } - - before do - stub_const("#{described_class.name}::BATCH_SIZE", 1) - end - - it 'schedules jobs for users that require two factor authentication' do - Sidekiq::Testing.fake! do - freeze_time do - migrate! - - expect(described_class::MIGRATION).to be_scheduled_delayed_migration( - 2.minutes, user_1.id, user_1.id) - expect(described_class::MIGRATION).to be_scheduled_delayed_migration( - 4.minutes, user_3.id, user_3.id) - expect(BackgroundMigrationWorker.jobs.size).to eq(2) - end - end - end -end diff --git a/spec/migrations/seed_merge_trains_enabled_spec.rb b/spec/migrations/seed_merge_trains_enabled_spec.rb deleted file mode 100644 index 1cb0e3cf8a6..00000000000 --- a/spec/migrations/seed_merge_trains_enabled_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe SeedMergeTrainsEnabled do - describe 'migrate' do - let(:project_ci_cd_settings) { table(:project_ci_cd_settings) } - let(:projects) { table(:projects) } - let(:namespaces) { table(:namespaces) } - - context 'when on Gitlab.com' do - before do - namespace = namespaces.create!(name: 'hello', path: 'hello/') - project1 = projects.create!(namespace_id: namespace.id) - project2 = projects.create!(namespace_id: namespace.id) - project_ci_cd_settings.create!(project_id: project1.id, merge_pipelines_enabled: true) - project_ci_cd_settings.create!(project_id: project2.id, merge_pipelines_enabled: false) - end - - it 'updates merge_trains_enabled to true for where merge_pipelines_enabled is true' do - migrate! - - expect(project_ci_cd_settings.where(merge_trains_enabled: true).count).to be(1) - end - end - end -end diff --git a/spec/migrations/seed_repository_storages_weighted_spec.rb b/spec/migrations/seed_repository_storages_weighted_spec.rb deleted file mode 100644 index 102107bcc9f..00000000000 --- a/spec/migrations/seed_repository_storages_weighted_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe SeedRepositoryStoragesWeighted do - let(:storages) { { "foo" => {}, "baz" => {} } } - let(:application_settings) do - table(:application_settings).tap do |klass| - klass.class_eval do - serialize :repository_storages - end - end - end - - before do - allow(Gitlab.config.repositories).to receive(:storages).and_return(storages) - end - - let(:application_setting) { application_settings.create! } - let(:repository_storages) { ["foo"] } - - it 'correctly schedules background migrations' do - application_setting.repository_storages = repository_storages - application_setting.save! - - migrate! - - expect(application_settings.find(application_setting.id).repository_storages_weighted).to eq({ "foo" => 100, "baz" => 0 }) - end -end diff --git a/spec/migrations/services_remove_temporary_index_on_project_id_spec.rb b/spec/migrations/services_remove_temporary_index_on_project_id_spec.rb deleted file mode 100644 index d47f6deb2d5..00000000000 --- a/spec/migrations/services_remove_temporary_index_on_project_id_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe ServicesRemoveTemporaryIndexOnProjectId do - let(:migration_instance) { described_class.new } - - it 'adds and removes temporary partial index in up and down methods' do - reversible_migration do |migration| - migration.before -> { - expect(migration_instance.index_exists?(:services, :project_id, name: described_class::INDEX_NAME)).to be true - } - - migration.after -> { - expect(migration_instance.index_exists?(:services, :project_id, name: described_class::INDEX_NAME)).to be false - } - end - end - - describe '#up' do - context 'index does not exist' do - it 'skips removal action' do - migrate! - - expect { migrate! }.not_to change { migration_instance.index_exists?(:services, :project_id, name: described_class::INDEX_NAME) } - end - end - end - - describe '#down' do - context 'index already exists' do - it 'skips creation of duplicated temporary partial index on project_id' do - schema_migrate_down! - - expect { schema_migrate_down! }.not_to change { migration_instance.index_exists?(:services, :project_id, name: described_class::INDEX_NAME) } - end - end - end -end diff --git a/spec/migrations/set_job_waiter_ttl_spec.rb b/spec/migrations/set_job_waiter_ttl_spec.rb deleted file mode 100644 index a051f8a535c..00000000000 --- a/spec/migrations/set_job_waiter_ttl_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe SetJobWaiterTtl, :redis do - it 'sets TTLs where necessary' do - waiter_with_ttl = Gitlab::JobWaiter.new.key - waiter_without_ttl = Gitlab::JobWaiter.new.key - key_with_ttl = "foo:bar" - key_without_ttl = "foo:qux" - - Gitlab::Redis::SharedState.with do |redis| - redis.set(waiter_with_ttl, "zzz", ex: 2000) - redis.set(waiter_without_ttl, "zzz") - redis.set(key_with_ttl, "zzz", ex: 2000) - redis.set(key_without_ttl, "zzz") - - described_class.new.up - - # This is the point of the migration. We know the migration uses a TTL of 21_600 - expect(redis.ttl(waiter_without_ttl)).to be > 20_000 - - # Other TTL's should be untouched by the migration - expect(redis.ttl(waiter_with_ttl)).to be_between(1000, 2000) - expect(redis.ttl(key_with_ttl)).to be_between(1000, 2000) - expect(redis.ttl(key_without_ttl)).to eq(-1) - end - end -end diff --git a/spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb b/spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb index 1fd19ee42b4..e03dd73ec8b 100644 --- a/spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb +++ b/spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration! 'slice_merge_request_diff_commit_migrations' +require_migration! RSpec.describe SliceMergeRequestDiffCommitMigrations, :migration do let(:migration) { described_class.new } diff --git a/spec/migrations/steal_merge_request_diff_commit_users_migration_spec.rb b/spec/migrations/steal_merge_request_diff_commit_users_migration_spec.rb index 3ad0b5a93c2..4fb4ba61a34 100644 --- a/spec/migrations/steal_merge_request_diff_commit_users_migration_spec.rb +++ b/spec/migrations/steal_merge_request_diff_commit_users_migration_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -require_migration! 'steal_merge_request_diff_commit_users_migration' +require_migration! RSpec.describe StealMergeRequestDiffCommitUsersMigration, :migration do let(:migration) { described_class.new } diff --git a/spec/migrations/unconfirm_wrongfully_verified_emails_spec.rb b/spec/migrations/unconfirm_wrongfully_verified_emails_spec.rb deleted file mode 100644 index 5adc866d0a5..00000000000 --- a/spec/migrations/unconfirm_wrongfully_verified_emails_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe UnconfirmWrongfullyVerifiedEmails do - before do - user = table(:users).create!(name: 'user1', email: 'test1@test.com', projects_limit: 1) - table(:emails).create!(email: 'test2@test.com', user_id: user.id) - end - - context 'when email confirmation is enabled' do - before do - table(:application_settings).create!(send_user_confirmation_email: true) - end - - it 'enqueues WrongullyConfirmedEmailUnconfirmer job' do - Sidekiq::Testing.fake! do - migrate! - - jobs = BackgroundMigrationWorker.jobs - expect(jobs.size).to eq(1) - expect(jobs.first["args"].first).to eq(Gitlab::BackgroundMigration::WrongfullyConfirmedEmailUnconfirmer.name.demodulize) - end - end - end - - context 'when email confirmation is disabled' do - before do - table(:application_settings).create!(send_user_confirmation_email: false) - end - - it 'does not enqueue WrongullyConfirmedEmailUnconfirmer job' do - Sidekiq::Testing.fake! do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(0) - end - end - end - - context 'when email application setting record does not exist' do - before do - table(:application_settings).delete_all - end - - it 'does not enqueue WrongullyConfirmedEmailUnconfirmer job' do - Sidekiq::Testing.fake! do - migrate! - - expect(BackgroundMigrationWorker.jobs.size).to eq(0) - end - end - end -end diff --git a/spec/migrations/update_application_setting_npm_package_requests_forwarding_default_spec.rb b/spec/migrations/update_application_setting_npm_package_requests_forwarding_default_spec.rb deleted file mode 100644 index be209536208..00000000000 --- a/spec/migrations/update_application_setting_npm_package_requests_forwarding_default_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe UpdateApplicationSettingNpmPackageRequestsForwardingDefault do - # Create test data - pipeline and CI/CD jobs. - let(:application_settings) { table(:application_settings) } - - before do - application_settings.create!(npm_package_requests_forwarding: false) - end - - # Test just the up migration. - it 'correctly migrates the application setting' do - expect { migrate! }.to change { current_application_setting }.from(false).to(true) - end - - # Test a reversible migration. - it 'correctly migrates up and down the application setting' do - reversible_migration do |migration| - # Expectations will run before the up migration, - # and then again after the down migration - migration.before -> { - expect(current_application_setting).to eq false - } - - # Expectations will run after the up migration. - migration.after -> { - expect(current_application_setting).to eq true - } - end - end - - def current_application_setting - ApplicationSetting.current_without_cache.npm_package_requests_forwarding - end -end diff --git a/spec/migrations/update_fingerprint_sha256_within_keys_spec.rb b/spec/migrations/update_fingerprint_sha256_within_keys_spec.rb deleted file mode 100644 index 22ec3135703..00000000000 --- a/spec/migrations/update_fingerprint_sha256_within_keys_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe UpdateFingerprintSha256WithinKeys do - let(:key_table) { table(:keys) } - - describe '#up' do - it 'the BackgroundMigrationWorker will be triggered and fingerprint_sha256 populated' do - key_table.create!( - id: 1, - user_id: 1, - title: 'test', - key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1016k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=', - fingerprint: 'ba:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d1', - fingerprint_sha256: nil - ) - - expect(Key.first.fingerprint_sha256).to eq(nil) - - described_class.new.up - - expect(BackgroundMigrationWorker.jobs.size).to eq(1) - expect(BackgroundMigrationWorker.jobs.first["args"][0]).to eq("MigrateFingerprintSha256WithinKeys") - expect(BackgroundMigrationWorker.jobs.first["args"][1]).to eq([1, 1]) - end - end -end diff --git a/spec/migrations/update_historical_data_recorded_at_spec.rb b/spec/migrations/update_historical_data_recorded_at_spec.rb deleted file mode 100644 index 95d2bb989fd..00000000000 --- a/spec/migrations/update_historical_data_recorded_at_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe UpdateHistoricalDataRecordedAt do - let(:historical_data_table) { table(:historical_data) } - - it 'reversibly populates recorded_at from created_at or date' do - row1 = historical_data_table.create!( - date: Date.current - 1.day, - created_at: Time.current - 1.day - ) - - row2 = historical_data_table.create!(date: Date.current - 2.days) - row2.update!(created_at: nil) - - reversible_migration do |migration| - migration.before -> { - expect(row1.reload.recorded_at).to eq(nil) - expect(row2.reload.recorded_at).to eq(nil) - } - - migration.after -> { - expect(row1.reload.recorded_at).to eq(row1.created_at) - expect(row2.reload.recorded_at).to eq(row2.date.in_time_zone(Time.zone).change(hour: 12)) - } - end - end -end diff --git a/spec/migrations/update_internal_ids_last_value_for_epics_renamed_spec.rb b/spec/migrations/update_internal_ids_last_value_for_epics_renamed_spec.rb deleted file mode 100644 index d7d1781aaa2..00000000000 --- a/spec/migrations/update_internal_ids_last_value_for_epics_renamed_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_migration! - -RSpec.describe UpdateInternalIdsLastValueForEpicsRenamed, :migration, schema: 20201124185639 do - let(:namespaces) { table(:namespaces) } - let(:users) { table(:users) } - let(:epics) { table(:epics) } - let(:internal_ids) { table(:internal_ids) } - - let!(:author) { users.create!(name: 'test', email: 'test@example.com', projects_limit: 0) } - let!(:group1) { namespaces.create!(type: 'Group', name: 'group1', path: 'group1') } - let!(:group2) { namespaces.create!(type: 'Group', name: 'group2', path: 'group2') } - let!(:group3) { namespaces.create!(type: 'Group', name: 'group3', path: 'group3') } - let!(:epic_last_value1) { internal_ids.create!(usage: 4, last_value: 5, namespace_id: group1.id) } - let!(:epic_last_value2) { internal_ids.create!(usage: 4, last_value: 5, namespace_id: group2.id) } - let!(:epic_last_value3) { internal_ids.create!(usage: 4, last_value: 5, namespace_id: group3.id) } - let!(:epic_1) { epics.create!(iid: 110, title: 'from epic 1', group_id: group1.id, author_id: author.id, title_html: 'any') } - let!(:epic_2) { epics.create!(iid: 5, title: 'from epic 1', group_id: group2.id, author_id: author.id, title_html: 'any') } - let!(:epic_3) { epics.create!(iid: 3, title: 'from epic 1', group_id: group3.id, author_id: author.id, title_html: 'any') } - - it 'updates out of sync internal_ids last_value' do - migrate! - - expect(internal_ids.find_by(usage: 4, namespace_id: group1.id).last_value).to eq(110) - expect(internal_ids.find_by(usage: 4, namespace_id: group2.id).last_value).to eq(5) - expect(internal_ids.find_by(usage: 4, namespace_id: group3.id).last_value).to eq(5) - end -end diff --git a/spec/migrations/update_routes_for_lost_and_found_group_and_orphaned_projects_spec.rb b/spec/migrations/update_routes_for_lost_and_found_group_and_orphaned_projects_spec.rb deleted file mode 100644 index 74e97b82363..00000000000 --- a/spec/migrations/update_routes_for_lost_and_found_group_and_orphaned_projects_spec.rb +++ /dev/null @@ -1,223 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe UpdateRoutesForLostAndFoundGroupAndOrphanedProjects, :migration do - let(:users) { table(:users) } - let(:namespaces) { table(:namespaces) } - let(:members) { table(:members) } - let(:projects) { table(:projects) } - let(:routes) { table(:routes) } - - before do - # Create a Ghost User and its namnespace, but skip the route - ghost_user = users.create!( - name: 'Ghost User', - username: 'ghost', - email: 'ghost@example.com', - user_type: described_class::User::USER_TYPE_GHOST, - projects_limit: 100, - state: :active, - bio: 'This is a "Ghost User"' - ) - - namespaces.create!( - name: 'Ghost User', - path: 'ghost', - owner_id: ghost_user.id, - visibility_level: 20 - ) - - # Create the 'lost-and-found', owned by the Ghost user, but with no route - lost_and_found_group = namespaces.create!( - name: described_class::User::LOST_AND_FOUND_GROUP, - path: described_class::User::LOST_AND_FOUND_GROUP, - type: 'Group', - description: 'Group to store orphaned projects', - visibility_level: 0 - ) - - members.create!( - type: 'GroupMember', - source_id: lost_and_found_group.id, - user_id: ghost_user.id, - source_type: 'Namespace', - access_level: described_class::User::ACCESS_LEVEL_OWNER, - notification_level: 3 - ) - - # Add an orphaned project under 'lost-and-found' but with the wrong path in its route - orphaned_project = projects.create!( - name: 'orphaned_project', - path: 'orphaned_project', - visibility_level: 20, - archived: false, - namespace_id: lost_and_found_group.id - ) - - routes.create!( - source_id: orphaned_project.id, - source_type: 'Project', - path: 'orphaned_project', - name: 'orphaned_project', - created_at: Time.current, - updated_at: Time.current - ) - - # Create another user named ghost which is not the Ghost User - # Also create a 'lost-and-found' group for them and add projects to it - # Purpose: test that the routes added for the 'lost-and-found' group and - # its projects are unique - fake_ghost_user = users.create!( - name: 'Ghost User', - username: 'ghost1', - email: 'ghost1@example.com', - user_type: nil, - projects_limit: 100, - state: :active, - bio: 'This is NOT a "Ghost User"' - ) - - fake_ghost_user_namespace = namespaces.create!( - name: 'Ghost User', - path: 'ghost1', - owner_id: fake_ghost_user.id, - visibility_level: 20 - ) - - routes.create!( - source_id: fake_ghost_user_namespace.id, - source_type: 'Namespace', - path: 'ghost1', - name: 'Ghost User', - created_at: Time.current, - updated_at: Time.current - ) - - fake_lost_and_found_group = namespaces.create!( - name: 'Lost and Found', - path: described_class::User::LOST_AND_FOUND_GROUP, # same path as the lost-and-found group - type: 'Group', - description: 'Fake lost and found group with the same path as the real one', - visibility_level: 20 - ) - - routes.create!( - source_id: fake_lost_and_found_group.id, - source_type: 'Namespace', - path: described_class::User::LOST_AND_FOUND_GROUP, # same path as the lost-and-found group - name: 'Lost and Found', - created_at: Time.current, - updated_at: Time.current - ) - - members.create!( - type: 'GroupMember', - source_id: fake_lost_and_found_group.id, - user_id: fake_ghost_user.id, - source_type: 'Namespace', - access_level: described_class::User::ACCESS_LEVEL_OWNER, - notification_level: 3 - ) - - normal_project = projects.create!( - name: 'normal_project', - path: 'normal_project', - visibility_level: 20, - archived: false, - namespace_id: fake_lost_and_found_group.id - ) - - routes.create!( - source_id: normal_project.id, - source_type: 'Project', - path: "#{described_class::User::LOST_AND_FOUND_GROUP}/normal_project", - name: 'Lost and Found / normal_project', - created_at: Time.current, - updated_at: Time.current - ) - - # Add a project whose route conflicts with the ghost username - # and should force the data migration to pick a new Ghost username and path - ghost_project = projects.create!( - name: 'Ghost Project', - path: 'ghost', - visibility_level: 20, - archived: false, - namespace_id: fake_lost_and_found_group.id - ) - - routes.create!( - source_id: ghost_project.id, - source_type: 'Project', - path: 'ghost', - name: 'Ghost Project', - created_at: Time.current, - updated_at: Time.current - ) - end - - it 'fixes the ghost user username and namespace path' do - ghost_user = users.find_by(user_type: described_class::User::USER_TYPE_GHOST) - ghost_namespace = namespaces.find_by(owner_id: ghost_user.id) - - expect(ghost_user.username).to eq('ghost') - expect(ghost_namespace.path).to eq('ghost') - - disable_migrations_output { migrate! } - - ghost_user = users.find_by(user_type: described_class::User::USER_TYPE_GHOST) - ghost_namespace = namespaces.find_by(owner_id: ghost_user.id) - ghost_namespace_route = routes.find_by(source_id: ghost_namespace.id, source_type: 'Namespace') - - expect(ghost_user.username).to eq('ghost2') - expect(ghost_namespace.path).to eq('ghost2') - expect(ghost_namespace_route.path).to eq('ghost2') - end - - it 'creates the route for the ghost user namespace' do - expect(routes.where(path: 'ghost').count).to eq(1) - expect(routes.where(path: 'ghost1').count).to eq(1) - expect(routes.where(path: 'ghost2').count).to eq(0) - - disable_migrations_output { migrate! } - - expect(routes.where(path: 'ghost').count).to eq(1) - expect(routes.where(path: 'ghost1').count).to eq(1) - expect(routes.where(path: 'ghost2').count).to eq(1) - end - - it 'fixes the path for the lost-and-found group by generating a unique one' do - expect(namespaces.where(path: described_class::User::LOST_AND_FOUND_GROUP).count).to eq(2) - - disable_migrations_output { migrate! } - - expect(namespaces.where(path: described_class::User::LOST_AND_FOUND_GROUP).count).to eq(1) - - lost_and_found_group = namespaces.find_by(name: described_class::User::LOST_AND_FOUND_GROUP) - expect(lost_and_found_group.path).to eq('lost-and-found1') - end - - it 'creates the route for the lost-and-found group' do - expect(routes.where(path: described_class::User::LOST_AND_FOUND_GROUP).count).to eq(1) - expect(routes.where(path: 'lost-and-found1').count).to eq(0) - - disable_migrations_output { migrate! } - - expect(routes.where(path: described_class::User::LOST_AND_FOUND_GROUP).count).to eq(1) - expect(routes.where(path: 'lost-and-found1').count).to eq(1) - end - - it 'updates the route for the orphaned project' do - orphaned_project_route = routes.find_by(path: 'orphaned_project') - expect(orphaned_project_route.name).to eq('orphaned_project') - - disable_migrations_output { migrate! } - - updated_route = routes.find_by(id: orphaned_project_route.id) - expect(updated_route.path).to eq('lost-and-found1/orphaned_project') - expect(updated_route.name).to eq("#{described_class::User::LOST_AND_FOUND_GROUP} / orphaned_project") - end -end diff --git a/spec/migrations/update_timestamp_softwarelicensespolicy_spec.rb b/spec/migrations/update_timestamp_softwarelicensespolicy_spec.rb deleted file mode 100644 index 0210f23f5c5..00000000000 --- a/spec/migrations/update_timestamp_softwarelicensespolicy_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -require_migration! - -RSpec.describe UpdateTimestampSoftwarelicensespolicy do - let(:software_licenses_policy) { table(:software_license_policies) } - let(:projects) { table(:projects) } - let(:licenses) { table(:software_licenses) } - - before do - projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce', namespace_id: 1) - licenses.create!(name: 'MIT') - software_licenses_policy.create!(project_id: projects.first.id, software_license_id: licenses.first.id, created_at: nil, updated_at: nil) - end - - it 'creates timestamps' do - migrate! - - expect(software_licenses_policy.first.created_at).to be_present - expect(software_licenses_policy.first.updated_at).to be_present - end -end |