# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
require 'rails_helper'

describe QueryTicketLevels do
  include_context :shared_donation_charge_context
  describe '.gross_amount_from_tickets' do
    it 'handles free tickets only properly' do
      result = QueryTicketLevels.gross_amount_from_tickets(['ticket_level_id' => free_ticket_level.id, 'quantity'=> 5], nil)
      expect(result).to eq 0
    end

    it 'handles nonfree tickets only properly' do
      result = QueryTicketLevels.gross_amount_from_tickets(['ticket_level_id' => ticket_level.id, 'quantity'=> 5], nil)
      expect(result).to eq 2000
    end

    it 'handles mix of tickets properly' do
      result = QueryTicketLevels.gross_amount_from_tickets(
          [{'ticket_level_id' => ticket_level.id, 'quantity'=> 5},
           {'ticket_level_id' => ticket_level2.id, 'quantity'=> 2},
           {'ticket_level_id' => free_ticket_level.id, 'quantity'=> 4000}], nil)
      expect(result).to eq 3000
    end

    it 'handles mix of tickets properly with discount code properly' do
      result = QueryTicketLevels.gross_amount_from_tickets(
          [{'ticket_level_id' => ticket_level.id, 'quantity'=> 5},
           {'ticket_level_id' => ticket_level2.id, 'quantity'=> 2},
           {'ticket_level_id' => free_ticket_level.id, 'quantity'=> 4000}], event_discount.id)
      expect(result).to eq 2400
    end
  end

  describe '.verify_tickets_available' do
    let(:ticket_level_1){ force_create(:ticket_level, limit: 3)}
    let(:ticket_level_2) { force_create(:ticket_level, limit: 2)}
    let(:tickets) {[
        force_create(:ticket, ticket_level: ticket_level_1, quantity: 1),
        force_create(:ticket, ticket_level: ticket_level_1, quantity: 1)
    ]}

    it 'fails when ticket level is too many' do
      expect { QueryTicketLevels.verify_tickets_available([
          {ticket_level_id: ticket_level_1.id, quantity: 50},
          {ticket_level_id: ticket_level_2.id, quantity: 1}
                                                          ])}.to raise_error(NotEnoughQuantityError)
      expect { QueryTicketLevels.verify_tickets_available([

                          {ticket_level_id: ticket_level_2.id, quantity: 3}
                                                          ])}.to raise_error(NotEnoughQuantityError)
    end

    it 'allows when a full item is at 0 and other is acceptable' do
      expect { QueryTicketLevels.verify_tickets_available([
        {ticket_level_id: ticket_level_1.id, quantity: 0},
        {ticket_level_id: ticket_level_2.id, quantity: 2}
                                                          ])}.to_not raise_error
    end

    it 'allows when only acceptable are passed ' do
      expect { QueryTicketLevels.verify_tickets_available([
                                                              {ticket_level_id: ticket_level_2.id, quantity: 2}
                                                          ])}.to_not raise_error
    end
  end

end