# frozen_string_literal: true

require 'spec_helper'

RSpec.describe ContainerRegistry::Migration do
  using RSpec::Parameterized::TableSyntax

  describe '.enabled?' do
    subject { described_class.enabled? }

    it { is_expected.to eq(true) }

    context 'feature flag disabled' do
      before do
        stub_feature_flags(container_registry_migration_phase2_enabled: false)
      end

      it { is_expected.to eq(false) }
    end
  end

  describe '.limit_gitlab_org?' do
    subject { described_class.limit_gitlab_org? }

    it { is_expected.to eq(true) }

    context 'feature flag disabled' do
      before do
        stub_feature_flags(container_registry_migration_limit_gitlab_org: false)
      end

      it { is_expected.to eq(false) }
    end
  end

  describe '.enqueue_waiting_time' do
    subject { described_class.enqueue_waiting_time }

    where(:slow_enabled, :fast_enabled, :expected_result) do
      false | false | 45.minutes
      true  | false | 165.minutes
      false | true  | 0
      true  | true  | 0
    end

    with_them do
      before do
        stub_feature_flags(
          container_registry_migration_phase2_enqueue_speed_slow: slow_enabled,
          container_registry_migration_phase2_enqueue_speed_fast: fast_enabled
        )
      end

      it { is_expected.to eq(expected_result) }
    end
  end

  describe '.capacity' do
    subject { described_class.capacity }

    where(:ff_1_enabled, :ff_2_enabled, :ff_5_enabled,
          :ff_10_enabled, :ff_25_enabled, :ff_40_enabled, :expected_result) do
      false | false | false | false | false | false | 0
      true  | false | false | false | false | false | 1
      false | true  | false | false | false | false | 2
      true  | true  | false | false | false | false | 2
      false | false | true  | false | false | false | 5
      true  | true  | true  | false | false | false | 5
      false | false | false | true  | false | false | 10
      true  | true  | true  | true  | false | false | 10
      false | false | false | false | true  | false | 25
      true  | true  | true  | true  | true  | false | 25
      false | false | false | false | false | true  | 40
      true  | true  | true  | true  | true  | true  | 40
    end

    with_them do
      before do
        stub_feature_flags(
          container_registry_migration_phase2_capacity_1: ff_1_enabled,
          container_registry_migration_phase2_capacity_2: ff_2_enabled,
          container_registry_migration_phase2_capacity_5: ff_5_enabled,
          container_registry_migration_phase2_capacity_10: ff_10_enabled,
          container_registry_migration_phase2_capacity_25: ff_25_enabled,
          container_registry_migration_phase2_capacity_40: ff_40_enabled
        )
      end

      it { is_expected.to eq(expected_result) }
    end
  end

  describe '.max_tags_count' do
    let(:value) { 1 }

    before do
      stub_application_setting(container_registry_import_max_tags_count: value)
    end

    it 'returns the matching application_setting' do
      expect(described_class.max_tags_count).to eq(value)
    end
  end

  describe '.max_retries' do
    let(:value) { 1 }

    before do
      stub_application_setting(container_registry_import_max_retries: value)
    end

    it 'returns the matching application_setting' do
      expect(described_class.max_retries).to eq(value)
    end
  end

  describe '.start_max_retries' do
    let(:value) { 1 }

    before do
      stub_application_setting(container_registry_import_start_max_retries: value)
    end

    it 'returns the matching application_setting' do
      expect(described_class.start_max_retries).to eq(value)
    end
  end

  describe '.max_step_duration' do
    let(:value) { 5.minutes }

    before do
      stub_application_setting(container_registry_import_max_step_duration: value)
    end

    it 'returns the matching application_setting' do
      expect(described_class.max_step_duration).to eq(value)
    end
  end

  describe '.target_plan_name' do
    let(:value) { 'free' }

    before do
      stub_application_setting(container_registry_import_target_plan: value)
    end

    it 'returns the matching application_setting' do
      expect(described_class.target_plan_name).to eq(value)
    end
  end

  describe '.created_before' do
    let(:value) { 1.day.ago }

    before do
      stub_application_setting(container_registry_import_created_before: value)
    end

    it 'returns the matching application_setting' do
      expect(described_class.created_before).to eq(value)
    end
  end

  describe '.pre_import_timeout' do
    let(:value) { 10.minutes }

    before do
      stub_application_setting(container_registry_pre_import_timeout: value)
    end

    it 'returns the matching application_setting' do
      expect(described_class.pre_import_timeout).to eq(value)
    end
  end

  describe '.import_timeout' do
    let(:value) { 10.minutes }

    before do
      stub_application_setting(container_registry_import_timeout: value)
    end

    it 'returns the matching application_setting' do
      expect(described_class.import_timeout).to eq(value)
    end
  end

  describe '.pre_import_tags_rate' do
    let(:value) { 2.5 }

    before do
      stub_application_setting(container_registry_pre_import_tags_rate: value)
    end

    it 'returns the matching application_setting' do
      expect(described_class.pre_import_tags_rate).to eq(value)
    end
  end

  describe '.target_plans' do
    subject { described_class.target_plans }

    where(:target_plan, :result) do
      'free'     | described_class::FREE_TIERS
      'premium'  | described_class::PREMIUM_TIERS
      'ultimate' | described_class::ULTIMATE_TIERS
    end

    with_them do
      before do
        stub_application_setting(container_registry_import_target_plan: target_plan)
      end

      it { is_expected.to eq(result) }
    end
  end

  describe '.all_plans?' do
    subject { described_class.all_plans? }

    it { is_expected.to eq(true) }

    context 'feature flag disabled' do
      before do
        stub_feature_flags(container_registry_migration_phase2_all_plans: false)
      end

      it { is_expected.to eq(false) }
    end
  end

  describe '.delete_container_repository_worker_support?' do
    subject { described_class.delete_container_repository_worker_support? }

    it { is_expected.to eq(true) }

    context 'feature flag disabled' do
      before do
        stub_feature_flags(container_registry_migration_phase2_delete_container_repository_worker_support: false)
      end

      it { is_expected.to eq(false) }
    end
  end

  describe '.dynamic_pre_import_timeout_for' do
    let(:container_repository) { build(:container_repository) }

    subject { described_class.dynamic_pre_import_timeout_for(container_repository) }

    it 'returns the expected seconds' do
      stub_application_setting(container_registry_pre_import_tags_rate: 0.6)
      expect(container_repository).to receive(:tags_count).and_return(50)

      expect(subject).to eq((0.6 * 50).seconds)
    end
  end
end