require 'spec_helper'

describe 'publishAccountingQueue.php' do
  before :all do
    @devbox = DevBox.instance
    @script_name = 'publishAccountingQueue.php'
    @conf = ConfigHelper.instance
    @active_mq = ActiveMQHelper.new
    @accounting_db = DataBase::AccountingDB.new
    @s3_helper = S3BucketHelper.new
    @s3_helper.clean_up_emails
    @active_mq.clean_up
  end

  context 'with wrong params' do
    it 'requires a Month and a Year' do
      output = @devbox.run_acc_script(@script_name)
      expect(output).to include('Params Month and Year are required')

      output = @devbox.run_acc_script("#{@script_name} -y 2018")
      expect(output).to include('Params Month and Year are required')

      output = @devbox.run_acc_script("#{@script_name} -m 5")
      expect(output).to include('Params Month and Year are required')
    end

    it 'requires a Batch number' do
      output = @devbox.run_acc_script("#{@script_name} -m 5 -y 2018")
      expect(output).to include('Batch number is required')
    end

    it 'refuses any extra params' do
      output = @devbox.run_acc_script("#{@script_name} -m 5 -y 2018 -e extra_param")
      expect(output).to include("Usage: #{@script_name}")
    end
  end

  context 'with right params' do
    before :all do
      # Preparing TEMP_dig_sales_processed table
      @dig_sales_amount = 3000
      @vendors_amount = @accounting_db.get_vendors_amount
      dig_sales = @accounting_db.get_statement_detail_ids([0, @dig_sales_amount])
      expect(dig_sales).not_to be_empty, "query trying to retrieve dig_sales returned nothing"
      @accounting_db.update_dig_sales(dig_sales, 'N')
      command = "#{@script_name} -m #{@conf[:accounting_month]} -y #{@conf[:accounting_year]} -b 1"
      @output = @devbox.run_acc_script(command)
      @period_id = @accounting_db.acc_period_id
    end

    it 'creates vendor_list_<period_id> queue' do
      expect(@output).to be_empty
      expect(@active_mq.queue_by_name("vendor_list_#{@period_id}")).to be
      # 1 message = 10 vendors, so e.g. if we have 1000 vendors, then vendor_list_queue_size should be 100
      expect(@active_mq.queue_by_name("vendor_list_#{@period_id}")['QueueSize']).to be_within(10).of(@vendors_amount/10)
    end

    it 'creates dig_sales_<period_id> queue' do
      expect(@active_mq.queue_by_name("dig_sales_#{@period_id}")).to be
      # 1 message = 1000 dig sales, so for e.g. 3000 then dig_sales_queue_size should be 3
      expect(@active_mq.queue_by_name("dig_sales_#{@period_id}")['QueueSize']).to eq(@dig_sales_amount/1000)
    end

    it 'sends an email using SNS' do
      EventuallyHelper.eventually_true do
        !@s3_helper.all_emails.empty?
      end
      expect(@s3_helper.all_emails).not_to be_empty
      email_text = @s3_helper.read_email(@s3_helper.all_emails.first)
      expect(email_text).to include('Accounting Publish to Queue')
    end
  end
end
