require 'test_helper' class ShipwireTest < ActiveSupport::TestCase include ActiveShipping::Test::Fixtures def setup @carrier = Shipwire.new(:login => 'l', :password => 'p') @items = [{ :sku => 'AF0001', :quantity => 1 }, { :sku => 'AF0002', :quantity => 2 }] end def test_response_with_no_rates_is_unsuccessful @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/no_rates_response')) assert_raises(ResponseError) do @carrier.find_rates( location_fixtures[:ottawa], location_fixtures[:beverly_hills], package_fixtures.values_at(:book, :wii), :order_id => '#1000', :items => @items ) end end def test_successfully_get_international_rates date = DateTime.parse("Mon 01 Aug 2011") @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/international_rates_response')) Timecop.freeze(date) do response = @carrier.find_rates( location_fixtures[:ottawa], location_fixtures[:london], package_fixtures.values_at(:book, :wii), :order_id => '#1000', :items => @items ) assert response.success? assert_equal 1, response.rates.size assert international = response.rates.first assert_equal "INTL", international.service_code assert_equal "UPS", international.carrier assert_equal "UPS Standard", international.service_name assert_equal 2806, international.total_price assert_equal [date + 1.day, date + 7.days], international.delivery_range end end def test_successfully_get_domestic_rates date = DateTime.parse("Mon 01 Aug 2011") @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/rates_response')) Timecop.freeze(date) do response = @carrier.find_rates( location_fixtures[:ottawa], location_fixtures[:beverly_hills], package_fixtures.values_at(:book, :wii), :order_id => '#1000', :items => @items ) assert response.success? assert_equal 3, response.rates.size assert ground = response.rates.find { |r| r.service_code == "GD" } assert_equal "UPS", ground.carrier assert_equal "UPS Ground", ground.service_name assert_equal 773, ground.total_price assert_equal [date + 1.day, date + 7.days], ground.delivery_range assert two_day = response.rates.find { |r| r.service_code == "2D" } assert_equal "UPS", two_day.carrier assert_equal "UPS Second Day Air", two_day.service_name assert_equal 1364, two_day.total_price assert_equal [date + 2.days, date + 2.days], two_day.delivery_range assert one_day = response.rates.find { |r| r.service_code == "1D" } assert_equal "USPS", one_day.carrier assert_equal "USPS Express Mail", one_day.service_name assert_equal 2525, one_day.total_price assert_equal [date + 1.day, date + 1.day], one_day.delivery_range end end def test_gracefully_handle_new_carrier @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/new_carrier_rate_response')) response = @carrier.find_rates( location_fixtures[:ottawa], location_fixtures[:beverly_hills], package_fixtures.values_at(:book, :wii), :order_id => '#1000', :items => @items ) assert response.success? assert_equal 1, response.rates.size assert ground = response.rates.first assert_equal "FESCO", ground.carrier end def test_find_rates_requires_items_option assert_raises(ArgumentError) do @carrier.find_rates( location_fixtures[:ottawa], location_fixtures[:beverly_hills], package_fixtures.values_at(:book, :wii) ) end end def test_validate_credentials_with_valid_credentials @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/no_rates_response')) assert @carrier.valid_credentials? end def test_validate_credentials_with_invalid_credentials response = stub(:code => '401', :body => 'Could not verify Username/EmailAddress and Password combination') @carrier.expects(:ssl_post).raises(ActiveUtils::ResponseError.new(response)) assert !@carrier.valid_credentials? end def test_rate_request_includes_address_name_if_provided name = CGI.escape("Bob Bobsen") @carrier.expects(:ssl_post).with(anything, includes(name)).returns(xml_fixture('shipwire/rates_response')) response = @carrier.find_rates( location_fixtures[:ottawa], location_fixtures[:new_york_with_name], package_fixtures.values_at(:book, :wii), :order_id => '#1000', :items => @items ) assert response.success? end def test_rate_request_does_not_include_address_name_element_if_not_provided name = CGI.escape("") @carrier.expects(:ssl_post).with(anything, Not(regexp_matches(Regexp.new(name)))).returns(xml_fixture('shipwire/rates_response')) response = @carrier.find_rates( location_fixtures[:ottawa], location_fixtures[:new_york], package_fixtures.values_at(:book, :wii), :order_id => '#1000', :items => @items ) assert response.success? end def test_rate_request_without_delivery_estimate @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/rates_response_no_estimate')) response = @carrier.find_rates( location_fixtures[:ottawa], location_fixtures[:new_york], package_fixtures.values_at(:book, :wii), :order_id => '#1000', :items => @items ) assert response.success? assert_equal [], response.rates[0].delivery_range end def test_rate_request_includes_company_if_provided company = CGI.escape("Tampa Company") @carrier.expects(:ssl_post).with(anything, includes(company)).returns(xml_fixture('shipwire/rates_response')) response = @carrier.find_rates( location_fixtures[:ottawa], location_fixtures[:real_home_as_commercial], package_fixtures.values_at(:book, :wii), :order_id => '#1000', :items => @items ) assert response.success? end def test_maximum_address_field_length assert_equal 255, @carrier.maximum_address_field_length end end