require 'spec_helper'

describe Spree::Calculator::PostalService do

	let(:postal_service_calculator) { described_class.new }

  describe 'return description' do
    context 'in english' do
      before { I18n.locale = :en }
      specify do
        postal_service_calculator.description.should == 'Postal Service'
      end
    end

    context 'in any language' do
      before { I18n.locale = :pt }
      specify do
        postal_service_calculator.description.should == Spree.t(:postal_service)
      end
    end
  end

	describe ':using the default weight-price table: [1 2 5 10 20] => [6 9 12 15 18]' do
		context '#compute:' do
			it 'gives 15.0 when total price is 100 and weight is 10kg' do
				create_our_package(:weight => 10.0, :price => 100.0, :quantity => 1)
				postal_service_calculator.compute(@shipment).should == 15.0
			end

			it 'gives 25.0 when total price is 40 and weight is 10kg' do
				create_our_package(:weight => 10.0, :price => 40.0, :quantity => 1)
				postal_service_calculator.compute(@shipment).should == 25.0
			end

			it 'gives 6 when total price is 60 and weight is less than 1kg' do
				create_our_package(:weight => 0.5, :price => 60.0, :quantity => 1)
				postal_service_calculator.compute(@shipment).should == 6.0
			end

			it 'gives 16 when total price is 40 and weight is less than 1kg' do
				create_our_package(:weight => 0.5, :price => 40.0, :quantity => 1)
				postal_service_calculator.compute(@shipment).should == 16.0
			end

			it 'gives 30 when total price is 200 and weight is 25kg (split into two)' do
				create_our_package(:weight => 25.0, :price => 200.0, :quantity => 1)
				postal_service_calculator.preferred_max_price = 250
				postal_service_calculator.compute(@shipment).should == 30.0
			end

			it 'gives 12 when total price is 100, there are three items and their weight is unknown' do
				order = create(:order)
				[30.0, 40.0, 30.0].each do |price|
					create(:line_item,
						:price => price,
						:quantity => 1,
						:order => order,
						:variant => create(:variant, :weight => nil))
				end
				order.line_items.reload
				shipment = create(:shipment, :order => order)

				postal_service_calculator.compute(shipment).should == 12.0
			end

			it 'gives 0 when total price is more than the MAX, for any number of items' do
				create_our_package(:weight => 25.0, :price => 350.0, :quantity => 1)
				postal_service_calculator.preferred_max_price = 300
				postal_service_calculator.compute(@shipment).should == 0.0
			end
		end
	end

	describe 'when preferred max weight, length and width are 18 kg, 120 cm and 60 cm' do
		context '#available?' do
			it 'is false when item weighs more than 18kg' do
			  create_our_package(:weight => 20, :height => 70, :width => 30, :depth => 30)
			  postal_service_calculator.available?(@shipment).should be_false
			end

			it 'is false when item is longer than 120cm' do
			  create_our_package(:weight => 10, :height => 130, :width => 30, :depth => 30)
			  postal_service_calculator.available?(@shipment).should be_false
			end

			it 'is false when item is wider than 60cm' do
			  create_our_package(:weight => 10, :height => 80, :width => 70, :depth => 30)
			  postal_service_calculator.available?(@shipment).should be_false
			end
		end

		context '#item_oversized?' do
			it 'is true if the longest side is more than 120cm' do
			  create_our_package(:weight => 10, :height => 130, :width => 40, :depth => 30)
			  postal_service_calculator.item_oversized?(@variant).should be_true
			end

			it 'is true if the second longest side is more than 60cm' do
			  create_our_package(:weight => 10, :height => 80, :width => 70, :depth => 30)
			  postal_service_calculator.item_oversized?(@variant).should be_true
			end
		end
	end

	def create_our_package(args={})
		order = create(:order)

		params = {}
		params.merge!(:weight => args[:weight]) if args[:weight]
		params.merge!(:height => args[:height]) if args[:height]
		params.merge!(:width  => args[:width])  if args[:width]
		params.merge!(:depth  => args[:depth])  if args[:depth]
		@variant = create(:variant, params)

		params = { :variant => @variant, :order => order }
		params.merge!(:price => args[:price])       if args[:price]
		params.merge!(:quantity => args[:quantity]) if args[:quantity]
		line_item = create(:line_item, params)

		order = line_item.order
		order.line_items.reload
		@shipment = create(:shipment, :order => order)
	end
end