# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Issuables::ClearGroupsIssueCounterWorker do
  describe '#perform' do
    let_it_be(:user) { create(:user) }
    let_it_be(:parent_group) { create(:group) }
    let_it_be(:root_group) { create(:group, parent: parent_group) }
    let_it_be(:subgroup) { create(:group, parent: root_group) }

    let(:count_service) { Groups::OpenIssuesCountService }
    let(:instance1) { instance_double(count_service) }
    let(:instance2) { instance_double(count_service) }

    it_behaves_like 'an idempotent worker' do
      let(:job_args) { [[root_group.id]] }
      let(:exec_times) { IdempotentWorkerHelper::WORKER_EXEC_TIMES }

      it 'clears the cached issue count in given groups and ancestors' do
        expect(count_service).to receive(:new)
          .exactly(exec_times).times.with(root_group).and_return(instance1)
        expect(count_service).to receive(:new)
          .exactly(exec_times).times.with(parent_group).and_return(instance2)
        expect(count_service).not_to receive(:new).with(subgroup)

        [instance1, instance2].all? do |instance|
          expect(instance).to receive(:clear_all_cache_keys).exactly(exec_times).times
        end

        subject
      end
    end

    it 'does not call count service or rise error when group_ids is empty' do
      expect(count_service).not_to receive(:new)
      expect(Gitlab::ErrorTracking).not_to receive(:log_exception)

      described_class.new.perform([])
    end
  end
end
