diff options
Diffstat (limited to 'spec/migrations')
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 |