require 'test_helper' class RemoteCanadaPostPWSTest < ActiveSupport::TestCase # All remote tests require Canada Post development environment credentials include ActiveShipping::Test::Credentials include ActiveShipping::Test::Fixtures def setup @login = credentials(:canada_post_pws) refute @login.key?(:platform_id), "The 'canada_post_pws' credentials should NOT include a platform ID" # 1000 grams, 93 cm long, 10 cm diameter, cylinders have different volume calculations @pkg1 = Package.new(1000, [93, 10, 10], :value => 10.00) @line_item1 = line_item_fixture @shipping_opts1 = { :dc => true, :cov => true, :cov_amount => 100.00, :aban => true } @home_params = { :name => "John Smith", :company => "test", :phone => "613-555-1212", :address1 => "123 Elm St.", :city => 'Ottawa', :province => 'ON', :country => 'CA', :postal_code => 'K1P 1J1' } @home = Location.new(@home_params) @dom_params = { :name => "John Smith Sr.", :company => "", :phone => '123-123-1234', :address1 => "5500 Oak Ave", :city => 'Vancouver', :province => 'BC', :country => 'CA', :postal_code => 'V5J 2T4' } @dest_params = { :name => "Frank White", :phone => '123-123-1234', :address1 => '999 Wiltshire Blvd', :city => 'Beverly Hills', :state => 'CA', :country => 'US', :zip => '90210' } @dest = Location.new(@dest_params) @dom_params = { :name => "Mrs. Smith", :company => "", :phone => "604-555-1212", :address1 => "5000 Oak St.", :address2 => "", :city => 'Vancouver', :province => 'BC', :country => 'CA', :postal_code => 'V5J 2N2' } @intl_params = { :name => "Mrs. Yamamoto", :company => "", :phone => "011-123-123-1234", :address1 => "123 Yokohama Road", :address2 => "", :city => 'Tokyo', :province => '', :country => 'JP' } @cp = CanadaPostPWS.new(@login.merge(:endpoint => "https://ct.soa-gw.canadapost.ca/")) @cp.logger = Logger.new(StringIO.new) @customer_number = @login[:customer_number] @DEFAULT_RESPONSE = { :shipping_id => "406951321983787352", :tracking_number => "123456789012", :label_url => "https://ct.soa-gw.canadapost.ca/ers/artifact/#{@login[:api_key]}/20238/0" } rescue NoCredentialsFound => e skip(e.message) end def test_rates opts = {:customer_number => @customer_number} rate_response = @cp.find_rates(@home_params, @dom_params, [@pkg1], opts) assert_kind_of ActiveShipping::RateResponse, rate_response assert_kind_of ActiveShipping::RateEstimate, rate_response.rates.first end def test_rates_with_invalid_customer_raises_exception opts = {:customer_number => "0000000000", :service => "DOM.XP"} assert_raises(ResponseError) do @cp.find_rates(@home_params, @dom_params, [@pkg1], opts) end end def test_tracking pin = "1371134583769923" # valid pin response = @cp.find_tracking_info(pin, {}) assert_equal 'Xpresspost', response.service_name assert response.expected_date.is_a?(Date) assert response.customer_number assert_equal 13, response.shipment_events.count end def test_tracking_when_no_tracking_info_raises_exception pin = "4442172020196022" # valid pin error = assert_raises(ActiveShipping::ResponseError) do @cp.find_tracking_info(pin, {}) end assert_match /No Tracking/, error.message end def test_create_shipment skip "Failing with 'Contract Number is a required field' after API change, skipping because no clue how to fix, might need different creds" opts = {:customer_number => @customer_number, :service => "DOM.XP"} response = @cp.create_shipment(@home_params, @dom_params, @pkg1, @line_item1, opts) assert_kind_of CPPWSShippingResponse, response assert_match /\A\d{17}\z/, response.shipping_id assert_equal "123456789012", response.tracking_number assert_match "https://ct.soa-gw.canadapost.ca/ers/artifact/", response.label_url assert_match @login[:api_key], response.label_url end def test_create_shipment_with_options skip "Failing with 'Contract Number is a required field' after API change, skipping because no clue how to fix, might need different creds" opts = {:customer_number => @customer_number, :service => "USA.EP"}.merge(@shipping_opts1) response = @cp.create_shipment(@home_params, @dest_params, @pkg1, @line_item1, opts) assert_kind_of CPPWSShippingResponse, response assert_match /\A\d{17}\z/, response.shipping_id assert_equal "123456789012", response.tracking_number assert_match "https://ct.soa-gw.canadapost.ca/ers/artifact/", response.label_url assert_match @login[:api_key], response.label_url end def test_retrieve_shipping_label skip "Failing with 'Contract Number is a required field' after API change, skipping because no clue how to fix, might need different creds" opts = {:customer_number => @customer_number, :service => "DOM.XP"} shipping_response = @cp.create_shipment(@home_params, @dom_params, @pkg1, @line_item1, opts) # Looks like it takes Canada Post some time to actually generate the PDF. response = nil 10.times do response = @cp.retrieve_shipping_label(shipping_response) break unless response == "" sleep(0.5) end assert_equal "%PDF", response[0...4] end def test_create_shipment_with_invalid_customer_raises_exception skip "Failing with 'Contract Number is a required field' after API change, skipping because no clue how to fix, might need different creds" opts = {:customer_number => "0000000000", :service => "DOM.XP"} assert_raises(ResponseError) do @cp.create_shipment(@home_params, @dom_params, @pkg1, @line_item1, opts) end end end