require 'spec_helper'

describe 'processAccountingQueue.php' do
  before :all do
    @devbox = DevBox.instance
    @script_name = 'processAccountingQueue.php'
  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 '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
      @conf = ConfigHelper.instance
      @active_mq = ActiveMQHelper.new
      @accounting_db = DataBase::AccountingDB.new
      @s3_helper = S3BucketHelper.new
      # Clean up queue and emails
      @active_mq.clean_up
      @s3_helper.clean_up_emails

      @year = @conf[:accounting_year]
      @month = @conf[:accounting_month]
      @period_id = @accounting_db.acc_period_id
      # 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')
      # Publish a queue to process
      @devbox.run_acc_script("publishAccountingQueue.php -m #{@conf[:accounting_month]} -y #{@conf[:accounting_year]} -b 1")

      # Running the processAccountingQueue script
      @devbox.run_acc_script("#{@script_name} -m #{@conf[:accounting_month]} -y #{@conf[:accounting_year]}")
    end

    it 'processes dig_sales_<period_id> queue' do
      EventuallyHelper.eventually do
        dig_sales_queue = @active_mq.queue_by_name("dig_sales_#{@period_id}")
        expect(dig_sales_queue['QueueSize']).to eq(0)
        expect(dig_sales_queue['DispatchCount']).to eq(@dig_sales_amount/1000)
        expect(@accounting_db.get_not_processed_dig_sales.count).to eq(0)
      end
    end

    it 'sends an email using SNS' do
      email_subject = 'Accounting Processing Digital Sales'
      EventuallyHelper.eventually do
        @s3_helper.email_by_subject(email_subject) || raise("#{email_subject} email not found")
      end
      email_text = @s3_helper.read_email(@s3_helper.email_by_subject(email_subject))
      expect(email_text).to include("Done processing digital sales. Total row count:#{@dig_sales_amount}")
    end
  end
end
