# 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
