require 'spec_helper'

RSpec.describe Shoryuken::Options do
  describe '.add_group' do
    before do
      Shoryuken.groups.clear
      Shoryuken.add_group('group1', 25)
      Shoryuken.add_group('group2', 25)
    end

    specify do
      described_class.add_queue('queue1', 1, 'group1')
      described_class.add_queue('queue2', 2, 'group2')

      expect(described_class.groups['group1'][:queues]).to eq(%w(queue1))
      expect(described_class.groups['group2'][:queues]).to eq(%w(queue2 queue2))
    end
  end

  describe '.ungrouped_queues' do
    before do
      Shoryuken.groups.clear
      Shoryuken.add_group('group1', 25)
      Shoryuken.add_group('group2', 25)
    end

    specify do
      described_class.add_queue('queue1', 1, 'group1')
      described_class.add_queue('queue2', 2, 'group2')

      expect(described_class.ungrouped_queues).to eq(%w(queue1 queue2 queue2))
    end
  end

  describe '.sqs_client_receive_message_opts' do
    before do
      Shoryuken.sqs_client_receive_message_opts
    end

    specify do
      Shoryuken.sqs_client_receive_message_opts = { test: 1 }
      expect(Shoryuken.sqs_client_receive_message_opts).to eq('default' => { test: 1 })

      Shoryuken.sqs_client_receive_message_opts['group1'] = { test: 2 }

      expect(Shoryuken.sqs_client_receive_message_opts).to eq(
        'default' => { test: 1 },
        'group1'  => { test: 2 },
      )
    end
  end

  describe '.register_worker' do
    it 'registers a worker' do
      described_class.worker_registry.clear
      described_class.register_worker('default', TestWorker)
      expect(described_class.worker_registry.workers('default')).to eq([TestWorker])
    end

    it 'registers a batchable worker' do
      described_class.worker_registry.clear
      TestWorker.get_shoryuken_options['batch'] = true
      described_class.register_worker('default', TestWorker)
      expect(described_class.worker_registry.workers('default')).to eq([TestWorker])
    end

    it 'allows multiple workers' do
      described_class.worker_registry.clear
      described_class.register_worker('default', TestWorker)
      expect(described_class.worker_registry.workers('default')).to eq([TestWorker])

      class Test2Worker
        include Shoryuken::Worker

        shoryuken_options queue: 'default'

        def perform(sqs_msg, body); end
      end

      expect(described_class.worker_registry.workers('default')).to eq([Test2Worker])
    end

    it 'raises an exception when mixing batchable with non batchable' do
      described_class.worker_registry.clear
      TestWorker.get_shoryuken_options['batch'] = true
      described_class.register_worker('default', TestWorker)

      expect {
        class BatchableWorker
          include Shoryuken::Worker

          shoryuken_options queue: 'default', batch: true

          def perform(sqs_msg, body); end
        end
      }.to raise_error("Could not register BatchableWorker for default, because TestWorker is already registered for this queue, " \
        "and Shoryuken doesn't support a batchable worker for a queue with multiple workers")
    end
  end
end