# frozen_string_literal: true require 'spec_helper' RSpec.describe Gitlab::BackgroundMigration::BackfillIntegrationsTypeNew do let(:migration) { described_class.new } let(:integrations) { table(:integrations) } let(:namespaced_integrations) { Gitlab::Integrations::StiType.namespaced_integrations } before do integrations.connection.execute 'ALTER TABLE integrations DISABLE TRIGGER "trigger_type_new_on_insert"' namespaced_integrations.each_with_index do |type, i| integrations.create!(id: i + 1, type: "#{type}Service") end integrations.create!(id: namespaced_integrations.size + 1, type: 'LegacyService') ensure integrations.connection.execute 'ALTER TABLE integrations ENABLE TRIGGER "trigger_type_new_on_insert"' end it 'backfills `type_new` for the selected records' do # We don't want to mock `Kernel.sleep`, so instead we mock it on the migration # class before it gets forwarded. expect(migration).to receive(:sleep).with(0.05).exactly(5).times queries = ActiveRecord::QueryRecorder.new do migration.perform(2, 10, :integrations, :id, 2, 50) end expect(queries.count).to be(16) expect(queries.log.grep(/^SELECT/).size).to be(11) expect(queries.log.grep(/^UPDATE/).size).to be(5) expect(queries.log.grep(/^UPDATE/).join.scan(/WHERE .*/)).to eq([ 'WHERE integrations.id BETWEEN 2 AND 3', 'WHERE integrations.id BETWEEN 4 AND 5', 'WHERE integrations.id BETWEEN 6 AND 7', 'WHERE integrations.id BETWEEN 8 AND 9', 'WHERE integrations.id BETWEEN 10 AND 10' ]) expect(integrations.where(id: 2..10).pluck(:type, :type_new)).to contain_exactly( ['AssemblaService', 'Integrations::Assembla'], ['BambooService', 'Integrations::Bamboo'], ['BugzillaService', 'Integrations::Bugzilla'], ['BuildkiteService', 'Integrations::Buildkite'], ['CampfireService', 'Integrations::Campfire'], ['ConfluenceService', 'Integrations::Confluence'], ['CustomIssueTrackerService', 'Integrations::CustomIssueTracker'], ['DatadogService', 'Integrations::Datadog'], ['DiscordService', 'Integrations::Discord'] ) expect(integrations.where.not(id: 2..10)).to all(have_attributes(type_new: nil)) end end