Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-11-19 11:27:35 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-11-19 11:27:35 +0300
commit7e9c479f7de77702622631cff2628a9c8dcbc627 (patch)
treec8f718a08e110ad7e1894510980d2155a6549197 /spec/migrations
parente852b0ae16db4052c1c567d9efa4facc81146e88 (diff)
Add latest changes from gitlab-org/gitlab@13-6-stable-eev13.6.0-rc42
Diffstat (limited to 'spec/migrations')
-rw-r--r--spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb2
-rw-r--r--spec/migrations/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects_spec.rb2
-rw-r--r--spec/migrations/20201027002551_migrate_services_to_http_integrations_spec.rb26
-rw-r--r--spec/migrations/20201028182809_backfill_jira_tracker_deployment_type2_spec.rb38
-rw-r--r--spec/migrations/cap_designs_filename_length_to_new_limit_spec.rb12
-rw-r--r--spec/migrations/deduplicate_epic_iids_spec.rb36
-rw-r--r--spec/migrations/generate_ci_jwt_signing_key_spec.rb42
-rw-r--r--spec/migrations/migrate_discussion_id_on_promoted_epics_spec.rb2
-rw-r--r--spec/migrations/rename_sitemap_namespace_spec.rb30
-rw-r--r--spec/migrations/rename_sitemap_root_namespaces_spec.rb36
-rw-r--r--spec/migrations/reseed_merge_trains_enabled_spec.rb26
-rw-r--r--spec/migrations/schedule_blocked_by_links_replacement_second_try_spec.rb (renamed from spec/migrations/schedule_blocked_by_links_replacement_spec.rb)4
-rw-r--r--spec/migrations/schedule_merge_request_cleanup_schedules_backfill_spec.rb41
-rw-r--r--spec/migrations/schedule_populate_has_vulnerabilities_spec.rb36
-rw-r--r--spec/migrations/schedule_populate_missing_dismissal_information_for_vulnerabilities_spec.rb37
-rw-r--r--spec/migrations/seed_merge_trains_enabled_spec.rb28
-rw-r--r--spec/migrations/update_historical_data_recorded_at_spec.rb31
17 files changed, 419 insertions, 10 deletions
diff --git a/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb b/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb
index 196f5ead8d2..11398685549 100644
--- a/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb
+++ b/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-require Rails.root.join('db', 'post_migrate', '20190924152703_migrate_issue_trackers_data.rb')
+require_migration!('migrate_issue_trackers_data')
RSpec.describe MigrateIssueTrackersData do
let(:services) { table(:services) }
diff --git a/spec/migrations/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects_spec.rb b/spec/migrations/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects_spec.rb
index e2eacc00e5a..731bc923910 100644
--- a/spec/migrations/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects_spec.rb
+++ b/spec/migrations/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-require Rails.root.join('db', 'post_migrate', '20191015154408_drop_merge_requests_require_code_owner_approval_from_projects.rb')
+require_migration!('drop_merge_requests_require_code_owner_approval_from_projects')
RSpec.describe DropMergeRequestsRequireCodeOwnerApprovalFromProjects do
let(:projects_table) { table(:projects) }
diff --git a/spec/migrations/20201027002551_migrate_services_to_http_integrations_spec.rb b/spec/migrations/20201027002551_migrate_services_to_http_integrations_spec.rb
new file mode 100644
index 00000000000..c1fbde69100
--- /dev/null
+++ b/spec/migrations/20201027002551_migrate_services_to_http_integrations_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20201027002551_migrate_services_to_http_integrations.rb')
+
+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
new file mode 100644
index 00000000000..658b26b1c49
--- /dev/null
+++ b/spec/migrations/20201028182809_backfill_jira_tracker_deployment_type2_spec.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20201028182809_backfill_jira_tracker_deployment_type2.rb')
+
+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/cap_designs_filename_length_to_new_limit_spec.rb b/spec/migrations/cap_designs_filename_length_to_new_limit_spec.rb
index 523c8864b63..382ce2e1da4 100644
--- a/spec/migrations/cap_designs_filename_length_to_new_limit_spec.rb
+++ b/spec/migrations/cap_designs_filename_length_to_new_limit_spec.rb
@@ -32,17 +32,19 @@ RSpec.describe CapDesignsFilenameLengthToNewLimit, :migration, schema: 202005281
end
it 'correctly sets filenames that are above the limit' do
- [
+ designs = [
filename_below_limit,
filename_at_limit,
filename_above_limit
- ].each(&method(:create_design))
+ ].map(&method(:create_design))
migrate!
- expect(designs.find(1).filename).to eq(filename_below_limit)
- expect(designs.find(2).filename).to eq(filename_at_limit)
- expect(designs.find(3).filename).to eq([described_class::MODIFIED_NAME, 3, described_class::MODIFIED_EXTENSION].join)
+ 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
diff --git a/spec/migrations/deduplicate_epic_iids_spec.rb b/spec/migrations/deduplicate_epic_iids_spec.rb
new file mode 100644
index 00000000000..8afb8b06948
--- /dev/null
+++ b/spec/migrations/deduplicate_epic_iids_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20201106134950_deduplicate_epic_iids.rb')
+
+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/generate_ci_jwt_signing_key_spec.rb b/spec/migrations/generate_ci_jwt_signing_key_spec.rb
new file mode 100644
index 00000000000..4cfaa8701aa
--- /dev/null
+++ b/spec/migrations/generate_ci_jwt_signing_key_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require Rails.root.join('db', 'migrate', '20201008013434_generate_ci_jwt_signing_key.rb')
+
+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: Rails.application.secrets.db_key_base[0..31],
+ 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/migrate_discussion_id_on_promoted_epics_spec.rb b/spec/migrations/migrate_discussion_id_on_promoted_epics_spec.rb
index 92a49046193..699e9507f50 100644
--- a/spec/migrations/migrate_discussion_id_on_promoted_epics_spec.rb
+++ b/spec/migrations/migrate_discussion_id_on_promoted_epics_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe MigrateDiscussionIdOnPromotedEpics do
end
def create_epic
- epics.create!(author_id: user.id, iid: 1,
+ epics.create!(author_id: user.id, iid: epics.maximum(:iid).to_i + 1,
group_id: namespace.id,
title: 'Epic with discussion',
title_html: 'Epic with discussion')
diff --git a/spec/migrations/rename_sitemap_namespace_spec.rb b/spec/migrations/rename_sitemap_namespace_spec.rb
new file mode 100644
index 00000000000..83f0721c600
--- /dev/null
+++ b/spec/migrations/rename_sitemap_namespace_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20201102112206_rename_sitemap_namespace.rb')
+
+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
new file mode 100644
index 00000000000..7cbf27849b0
--- /dev/null
+++ b/spec/migrations/rename_sitemap_root_namespaces_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20201019094741_rename_sitemap_root_namespaces.rb')
+
+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/reseed_merge_trains_enabled_spec.rb b/spec/migrations/reseed_merge_trains_enabled_spec.rb
new file mode 100644
index 00000000000..71ef0b47da9
--- /dev/null
+++ b/spec/migrations/reseed_merge_trains_enabled_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20201112195322_reseed_merge_trains_enabled.rb')
+
+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/schedule_blocked_by_links_replacement_spec.rb b/spec/migrations/schedule_blocked_by_links_replacement_second_try_spec.rb
index 36610507921..9cd1b98fbd7 100644
--- a/spec/migrations/schedule_blocked_by_links_replacement_spec.rb
+++ b/spec/migrations/schedule_blocked_by_links_replacement_second_try_spec.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
require 'spec_helper'
-require Rails.root.join('db', 'post_migrate', '20201015073808_schedule_blocked_by_links_replacement')
+require Rails.root.join('db', 'post_migrate', '20201102073808_schedule_blocked_by_links_replacement_second_try')
-RSpec.describe ScheduleBlockedByLinksReplacement do
+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') }
diff --git a/spec/migrations/schedule_merge_request_cleanup_schedules_backfill_spec.rb b/spec/migrations/schedule_merge_request_cleanup_schedules_backfill_spec.rb
new file mode 100644
index 00000000000..fa8dd38619a
--- /dev/null
+++ b/spec/migrations/schedule_merge_request_cleanup_schedules_backfill_spec.rb
@@ -0,0 +1,41 @@
+# 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 'schdules 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_populate_has_vulnerabilities_spec.rb b/spec/migrations/schedule_populate_has_vulnerabilities_spec.rb
new file mode 100644
index 00000000000..edae7330b1e
--- /dev/null
+++ b/spec/migrations/schedule_populate_has_vulnerabilities_spec.rb
@@ -0,0 +1,36 @@
+# 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_missing_dismissal_information_for_vulnerabilities_spec.rb b/spec/migrations/schedule_populate_missing_dismissal_information_for_vulnerabilities_spec.rb
new file mode 100644
index 00000000000..e5934f2171f
--- /dev/null
+++ b/spec/migrations/schedule_populate_missing_dismissal_information_for_vulnerabilities_spec.rb
@@ -0,0 +1,37 @@
+# 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/seed_merge_trains_enabled_spec.rb b/spec/migrations/seed_merge_trains_enabled_spec.rb
new file mode 100644
index 00000000000..2abb064a111
--- /dev/null
+++ b/spec/migrations/seed_merge_trains_enabled_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20201026200736_seed_merge_trains_enabled.rb')
+
+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/update_historical_data_recorded_at_spec.rb b/spec/migrations/update_historical_data_recorded_at_spec.rb
new file mode 100644
index 00000000000..bccc711f339
--- /dev/null
+++ b/spec/migrations/update_historical_data_recorded_at_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require Rails.root.join('db', 'migrate', '20201022094846_update_historical_data_recorded_at.rb')
+
+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