active_shipping 1.9.2 → 1.10.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6c27b2374a64a55c68a9b78eac1d7feb97550a41
4
- data.tar.gz: 49e411902c19f7db17242a8ee2cd4d8e00a3be2c
3
+ metadata.gz: 6478be87d7d470eaec0ca8142a1bc13bd9385eec
4
+ data.tar.gz: 68dc6e8aa2821f4d86f15543eef680be9a34f798
5
5
  SHA512:
6
- metadata.gz: f9ed243e3a7234568d0c67eb8c2d8c35f887222b69a422b9b4a77a2dc666182540f0d8949e43e9db9282772e0718d0555df33c9dcc50fc3023ad2236abfe2a66
7
- data.tar.gz: ce6824f5dd320b1b94493d660bd0c970e02a1c5fc453fff0f584f4b713b034e78b1cb790715c24ad16facc59f4f7aea2ef4c504f11a654405cd6d7a74098d36e
6
+ metadata.gz: 7a9870708b91d2bbcf436d295cfef6d73537090f9b1de4d3e9372bf58759a977e1e79b1c735b0fbdd460fc25602bb5e40abc00ef405e53bf70c071e7b8d7ec62
7
+ data.tar.gz: f533ab6e93abd4395da473620be33f8330e2ab8c530a95c141b44dd3fc097cd60b85b80604e72229b2e45d0c3c64b1d5775e9ec1f130b26b99610cc3fd875766
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.add_dependency("quantified", "~> 1.0.1")
22
22
  s.add_dependency("activesupport", ">= 3.2", "< 5.1.0")
23
23
  s.add_dependency("active_utils", "~> 3.2.0")
24
- s.add_dependency("nokogiri", ">= 1.6")
24
+ s.add_dependency("nokogiri", "= 1.6.8")
25
25
 
26
26
  s.add_development_dependency("minitest")
27
27
  s.add_development_dependency("rake")
@@ -23,3 +23,4 @@ require 'active_shipping/carriers'
23
23
  require 'active_shipping/errors'
24
24
  require 'active_shipping/external_return_label_request'
25
25
  require 'active_shipping/external_return_label_response'
26
+ require 'active_shipping/address_validation_response'
@@ -0,0 +1,30 @@
1
+ module ActiveShipping
2
+
3
+ # Response object class for calls to {ActiveShipping::Carrier#validate_address}.
4
+ #
5
+ # @!attribute location
6
+ # The Location to be validated
7
+ # @return [String]
8
+ class AddressValidationResponse < Response
9
+ attr_reader :validity, :classification, :candidate_addresses, :options, :params
10
+
11
+ def initialize(success, message, params = {}, options = {})
12
+ @validity = options[:validity]
13
+ @candidate_addresses = options[:candidate_addresses]
14
+ @classification = options[:classification]
15
+ super
16
+ end
17
+
18
+ def address_match?
19
+ @validity == :valid
20
+ end
21
+
22
+ def residential?
23
+ @classification == :residential
24
+ end
25
+
26
+ def commercial?
27
+ @classification == :commercial
28
+ end
29
+ end
30
+ end
@@ -590,7 +590,12 @@ module ActiveShipping
590
590
  message = response_message(xml)
591
591
 
592
592
  if success
593
- origin = nil
593
+ tracking_details_root = xml.at('CompletedTrackDetails')
594
+ success = response_success?(tracking_details_root)
595
+ message = response_message(tracking_details_root)
596
+ end
597
+
598
+ if success
594
599
  delivery_signature = nil
595
600
  shipment_events = []
596
601
 
@@ -599,13 +604,28 @@ module ActiveShipping
599
604
  when 1
600
605
  all_tracking_details.first
601
606
  when 0
602
- raise ActiveShipping::Error, "The response did not contain tracking details"
607
+ message = "The response did not contain tracking details"
608
+ return TrackingResponse.new(
609
+ false,
610
+ message,
611
+ Hash.from_xml(response),
612
+ carrier: @@name,
613
+ xml: response,
614
+ request: last_request
615
+ )
603
616
  else
604
617
  all_unique_identifiers = xml.root.xpath('CompletedTrackDetails/TrackDetails/TrackingNumberUniqueIdentifier').map(&:text)
605
- raise ActiveShipping::Error, "Multiple matches were found. Specify a unqiue identifier: #{all_unique_identifiers.join(', ')}"
618
+ message = "Multiple matches were found. Specify a unqiue identifier: #{all_unique_identifiers.join(', ')}"
619
+ return TrackingResponse.new(
620
+ false,
621
+ message,
622
+ Hash.from_xml(response),
623
+ carrier: @@name,
624
+ xml: response,
625
+ request: last_request
626
+ )
606
627
  end
607
628
 
608
-
609
629
  first_notification = tracking_details.at('Notification')
610
630
  severity = first_notification.at('Severity').text
611
631
  if severity == 'ERROR' || severity == 'FAILURE'
@@ -634,11 +654,11 @@ module ActiveShipping
634
654
  end
635
655
  end
636
656
 
637
- if origin_node = tracking_details.at('OriginLocationAddress')
638
- origin = Location.new(
639
- :country => origin_node.at('CountryCode').text,
640
- :province => origin_node.at('StateOrProvinceCode').text,
641
- :city => origin_node.at('City').text
657
+ origin = if origin_node = tracking_details.at('OriginLocationAddress')
658
+ Location.new(
659
+ country: origin_node.at('CountryCode').text,
660
+ province: origin_node.at('StateOrProvinceCode').text,
661
+ city: origin_node.at('City').text
642
662
  )
643
663
  end
644
664
 
@@ -667,26 +687,29 @@ module ActiveShipping
667
687
 
668
688
  shipment_events << ShipmentEvent.new(description, zoneless_time, location, description, type_code)
669
689
  end
670
- shipment_events = shipment_events.sort_by(&:time)
671
690
 
691
+ shipment_events = shipment_events.sort_by(&:time)
672
692
  end
673
693
 
674
- TrackingResponse.new(success, message, Hash.from_xml(response),
675
- :carrier => @@name,
676
- :xml => response,
677
- :request => last_request,
678
- :status => status,
679
- :status_code => status_code,
680
- :status_description => status_description,
681
- :ship_time => ship_time,
682
- :scheduled_delivery_date => scheduled_delivery_time,
683
- :actual_delivery_date => actual_delivery_time,
684
- :delivery_signature => delivery_signature,
685
- :shipment_events => shipment_events,
686
- :shipper_address => (shipper_address.nil? || shipper_address.unknown?) ? nil : shipper_address,
687
- :origin => origin,
688
- :destination => destination,
689
- :tracking_number => tracking_number
694
+ TrackingResponse.new(
695
+ success,
696
+ message,
697
+ Hash.from_xml(response),
698
+ carrier: @@name,
699
+ xml: response,
700
+ request: last_request,
701
+ status: status,
702
+ status_code: status_code,
703
+ status_description: status_description,
704
+ ship_time: ship_time,
705
+ scheduled_delivery_date: scheduled_delivery_time,
706
+ actual_delivery_date: actual_delivery_time,
707
+ delivery_signature: delivery_signature,
708
+ shipment_events: shipment_events,
709
+ shipper_address: (shipper_address.nil? || shipper_address.unknown?) ? nil : shipper_address,
710
+ origin: origin,
711
+ destination: destination,
712
+ tracking_number: tracking_number
690
713
  )
691
714
  end
692
715
 
@@ -701,13 +724,13 @@ module ActiveShipping
701
724
  end
702
725
 
703
726
  def response_success?(document)
704
- highest_severity = document.root.at('HighestSeverity')
727
+ highest_severity = document.at('HighestSeverity')
705
728
  return false if highest_severity.nil?
706
729
  %w(SUCCESS WARNING NOTE).include?(highest_severity.text)
707
730
  end
708
731
 
709
732
  def response_message(document)
710
- notifications = document.root.at('Notifications')
733
+ notifications = document.at('Notifications')
711
734
  return "" if notifications.nil?
712
735
 
713
736
  "#{notifications.at('Severity').text} - #{notifications.at('Code').text}: #{notifications.at('Message').text}"
@@ -18,7 +18,8 @@ module ActiveShipping
18
18
  :ship_confirm => 'ups.app/xml/ShipConfirm',
19
19
  :ship_accept => 'ups.app/xml/ShipAccept',
20
20
  :delivery_dates => 'ups.app/xml/TimeInTransit',
21
- :void => 'ups.app/xml/Void'
21
+ :void => 'ups.app/xml/Void',
22
+ :validate_address => 'ups.app/xml/XAV'
22
23
  }
23
24
 
24
25
  PICKUP_CODES = HashWithIndifferentAccess.new(
@@ -232,6 +233,21 @@ module ActiveShipping
232
233
  35
233
234
  end
234
235
 
236
+ # Validates a location with the Street Level Validation service
237
+ #
238
+ # @param location [Location] The Location to validate
239
+ # @return [ActiveShipping::AddressValidationResponse] The response from the validation endpoint. This
240
+ # response will determine if the given address is valid or not, its commercial/residential classification,
241
+ # and the cleaned-up address and/or potential candidate addresses if the passed location can't be found
242
+ def validate_address(location, options = {})
243
+ location = upsified_location(location)
244
+ options = @options.merge(options)
245
+ access_request = build_access_request
246
+ address_validation_request = build_address_validation_request(location, options)
247
+ response = commit(:validate_address, save_request(access_request + address_validation_request), options[:test])
248
+ parse_address_validation_response(location, response, options)
249
+ end
250
+
235
251
  protected
236
252
 
237
253
  def upsified_location(location)
@@ -963,6 +979,97 @@ module ActiveShipping
963
979
  end
964
980
  end
965
981
 
982
+ def build_address_validation_request(location, options = {})
983
+ xml_builder = Nokogiri::XML::Builder.new do |xml|
984
+ xml.AddressValidationRequest do
985
+ xml.Request do
986
+ xml.RequestAction('XAV')
987
+ xml.RequestOption('3')
988
+
989
+ if options[:customer_context]
990
+ xml.TransactionReference do
991
+ xml.CustomerContext(options[:customer_context])
992
+ xml.XpciVersion("1.0")
993
+ end
994
+ end
995
+ end
996
+
997
+ xml.AddressKeyFormat do
998
+ xml.AddressLine(location.address1)
999
+ if location.address2.present?
1000
+ xml.AddressLine(location.address2)
1001
+ end
1002
+ xml.PoliticalDivision2(location.city)
1003
+ xml.PoliticalDivision1(location.state)
1004
+ xml.PostcodePrimaryLow(location.postal_code)
1005
+ xml.CountryCode(location.country_code)
1006
+ end
1007
+ end
1008
+ end
1009
+
1010
+ xml_builder.to_xml
1011
+ end
1012
+
1013
+ def parse_address_validation_response(address, response, options={})
1014
+ xml = build_document(response, 'AddressValidationResponse')
1015
+ success = response_success?(xml)
1016
+ message = response_message(xml)
1017
+
1018
+ validity = nil
1019
+ classification_code = nil
1020
+ classification_description = nil
1021
+ addresses = []
1022
+
1023
+ if success
1024
+ if xml.at('AddressClassification/Code').present?
1025
+ classification_code = xml.at('AddressClassification/Code').text
1026
+ end
1027
+
1028
+ classification = case classification_code
1029
+ when "1"
1030
+ :commercial
1031
+ when "2"
1032
+ :residential
1033
+ else
1034
+ :unknown
1035
+ end
1036
+
1037
+ validity = if xml.at("ValidAddressIndicator").present?
1038
+ :valid
1039
+ elsif xml.at("AmbiguousAddressIndicator").present?
1040
+ :ambiguous
1041
+ elsif xml.at("NoCandidatesIndicator").present?
1042
+ :invalid
1043
+ else
1044
+ :unknown
1045
+ end
1046
+
1047
+ addresses = xml.css('AddressKeyFormat').collect { |node| location_from_address_key_format_node(node) }
1048
+ end
1049
+
1050
+ params = Hash.from_xml(response).values.first
1051
+ response = AddressValidationResponse.new(success, message, params, :validity => validity, :classification => classification, :candidate_addresses => addresses, :xml => response, :request => last_request)
1052
+ end
1053
+
1054
+ # Converts from a AddressKeyFormat XML node to a Location
1055
+ def location_from_address_key_format_node(address)
1056
+ return nil unless address
1057
+ country = address.at('CountryCode').try(:text)
1058
+ country = 'US' if country == 'ZZ' # Sometimes returned by SUREPOST in the US
1059
+
1060
+ address_lines = address.css('AddressLine')
1061
+
1062
+ Location.new(
1063
+ :country => country,
1064
+ :postal_code => address.at('PostcodePrimaryLow').try(:text),
1065
+ :province => address.at('PoliticalDivision1').try(:text),
1066
+ :city => address.at('PoliticalDivision2').try(:text),
1067
+ :address1 => address_lines[0].try(:text),
1068
+ :address2 => address_lines[1].try(:text),
1069
+ :address3 => address_lines[2].try(:text),
1070
+ )
1071
+ end
1072
+
966
1073
  def location_from_address_node(address)
967
1074
  return nil unless address
968
1075
  country = address.at('CountryCode').try(:text)
@@ -1,3 +1,3 @@
1
1
  module ActiveShipping
2
- VERSION = "1.9.2"
2
+ VERSION = "1.10.1"
3
3
  end
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <TrackReply xmlns="http://fedex.com/ws/track/v7" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
3
+ <HighestSeverity>SUCCESS</HighestSeverity>
4
+ <Notifications>
5
+ <Severity>SUCCESS</Severity>
6
+ <Source>trck</Source>
7
+ <Code>0</Code>
8
+ <Message>Request was successfully processed.</Message>
9
+ <LocalizedMessage>Request was successfully processed.</LocalizedMessage>
10
+ </Notifications>
11
+ <TransactionDetail>
12
+ <CustomerTransactionId>ActiveShipping</CustomerTransactionId>
13
+ </TransactionDetail>
14
+ <Version>
15
+ <ServiceId>trck</ServiceId>
16
+ <Major>7</Major>
17
+ <Intermediate>0</Intermediate>
18
+ <Minor>0</Minor>
19
+ </Version>
20
+ <CompletedTrackDetails>
21
+ <HighestSeverity>FAILURE</HighestSeverity>
22
+ <Notifications>
23
+ <Severity>FAILURE</Severity>
24
+ <Source>trck</Source>
25
+ <Code>6330</Code>
26
+ <Message>Sorry, we are unable to process your tracking request. Please retry later, or contact Customer Service at 1.800.Go.FedEx(R) 800.463.3339.</Message>
27
+ <LocalizedMessage>Sorry, we are unable to process your tracking request. Please retry later, or contact Customer Service at 1.800.Go.FedEx(R) 800.463.3339.</LocalizedMessage>
28
+ </Notifications>
29
+ <DuplicateWaybill>false</DuplicateWaybill>
30
+ <MoreData>false</MoreData>
31
+ </CompletedTrackDetails>
32
+ </TrackReply>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0"?>
2
+ <AddressValidationRequest>
3
+ <Request>
4
+ <RequestAction>XAV</RequestAction>
5
+ <RequestOption>3</RequestOption>
6
+ </Request>
7
+ <AddressKeyFormat>
8
+ <AddressLine>55 Glenlake Parkway NE</AddressLine>
9
+ <PoliticalDivision2>Atlanta</PoliticalDivision2>
10
+ <PoliticalDivision1>GA</PoliticalDivision1>
11
+ <PostcodePrimaryLow>30328</PostcodePrimaryLow>
12
+ <CountryCode>US</CountryCode>
13
+ </AddressKeyFormat>
14
+ </AddressValidationRequest>
@@ -0,0 +1,25 @@
1
+ <AddressValidationResponse>
2
+ <Response>
3
+ <TransactionReference />
4
+ <ResponseStatusCode>1</ResponseStatusCode>
5
+ <ResponseStatusDescription>Success</ResponseStatusDescription>
6
+ </Response>
7
+ <ValidAddressIndicator />
8
+ <AddressClassification>
9
+ <Code>1</Code>
10
+ <Description>Commercial</Description>
11
+ </AddressClassification>
12
+ <AddressKeyFormat>
13
+ <AddressClassification>
14
+ <Code>1</Code>
15
+ <Description>Commercial</Description>
16
+ </AddressClassification>
17
+ <AddressLine>55 GLENLAKE PKWY</AddressLine>
18
+ <Region>ATLANTA GA 30328-3474</Region>
19
+ <PoliticalDivision2>ATLANTA</PoliticalDivision2>
20
+ <PoliticalDivision1>GA</PoliticalDivision1>
21
+ <PostcodePrimaryLow>30328</PostcodePrimaryLow>
22
+ <PostcodeExtendedLow>3474</PostcodeExtendedLow>
23
+ <CountryCode>US</CountryCode>
24
+ </AddressKeyFormat>
25
+ </AddressValidationResponse>
@@ -0,0 +1,38 @@
1
+ <AddressValidationResponse>
2
+ <Response>
3
+ <TransactionReference />
4
+ <ResponseStatusCode>1</ResponseStatusCode>
5
+ <ResponseStatusDescription>Success</ResponseStatusDescription>
6
+ </Response>
7
+ <AmbiguousAddressIndicator />
8
+ <AddressClassification>
9
+ <Code>1</Code>
10
+ <Description>Commercial</Description>
11
+ </AddressClassification>
12
+ <AddressKeyFormat>
13
+ <AddressClassification>
14
+ <Code>1</Code>
15
+ <Description>Commercial</Description>
16
+ </AddressClassification>
17
+ <AddressLine>55 GLENLAKE PKWY</AddressLine>
18
+ <Region>ATLANTA GA 30328-3474</Region>
19
+ <PoliticalDivision2>ATLANTA</PoliticalDivision2>
20
+ <PoliticalDivision1>GA</PoliticalDivision1>
21
+ <PostcodePrimaryLow>30328</PostcodePrimaryLow>
22
+ <PostcodeExtendedLow>3474</PostcodeExtendedLow>
23
+ <CountryCode>US</CountryCode>
24
+ </AddressKeyFormat>
25
+ <AddressKeyFormat>
26
+ <AddressClassification>
27
+ <Code>2</Code>
28
+ <Description>Residential</Description>
29
+ </AddressClassification>
30
+ <AddressLine>555 GLENVALE</AddressLine>
31
+ <Region>ATLANTA GA 30328-3474</Region>
32
+ <PoliticalDivision2>ATLANTA</PoliticalDivision2>
33
+ <PoliticalDivision1>GA</PoliticalDivision1>
34
+ <PostcodePrimaryLow>30328</PostcodePrimaryLow>
35
+ <PostcodeExtendedLow>3474</PostcodeExtendedLow>
36
+ <CountryCode>US</CountryCode>
37
+ </AddressKeyFormat>
38
+ </AddressValidationResponse>
@@ -0,0 +1,8 @@
1
+ <AddressValidationResponse>
2
+ <Response>
3
+ <TransactionReference />
4
+ <ResponseStatusCode>1</ResponseStatusCode>
5
+ <ResponseStatusDescription>Success</ResponseStatusDescription>
6
+ </Response>
7
+ <NoCandidatesIndicator />
8
+ </AddressValidationResponse>
@@ -316,6 +316,8 @@ class RemoteFedExTest < Minitest::Test
316
316
  end
317
317
  end
318
318
 
319
+ ### create_shipment
320
+
319
321
  def test_cant_obtain_multiple_shipping_labels
320
322
  assert_raises(ActiveShipping::Error,"Multiple packages are not supported yet.") do
321
323
  @carrier.create_shipment(
@@ -318,15 +318,32 @@ class FedExTest < Minitest::Test
318
318
  @carrier.expects(:commit).returns(mock_response)
319
319
 
320
320
  assert_raises ActiveShipping::ResponseContentError do
321
- @carrier.find_rates(
321
+ @carrier.find_rates(
322
322
  location_fixtures[:ottawa],
323
323
  location_fixtures[:beverly_hills],
324
324
  package_fixtures.values_at(:book, :wii),
325
- :test => true
325
+ test: true
326
326
  )
327
327
  end
328
328
  end
329
329
 
330
+ def test_parsing_response_without_notifications
331
+ mock_response = xml_fixture('fedex/reply_without_notifications')
332
+
333
+ @carrier.expects(:commit).returns(mock_response)
334
+
335
+ response = @carrier.find_rates(
336
+ location_fixtures[:ottawa],
337
+ location_fixtures[:beverly_hills],
338
+ package_fixtures.values_at(:book, :wii),
339
+ test: true
340
+ )
341
+
342
+ assert_predicate response, :success?
343
+ end
344
+
345
+ ### find_tracking_info
346
+
330
347
  def test_response_transient_failure
331
348
  mock_response = xml_fixture('fedex/tracking_response_failure_code_9045')
332
349
  @carrier.expects(:commit).returns(mock_response)
@@ -339,7 +356,7 @@ class FedExTest < Minitest::Test
339
356
  assert_equal msg, error.message
340
357
  end
341
358
 
342
- def test_response_terminal_failure
359
+ def test_response_with_failure_nested_in_track_details
343
360
  mock_response = xml_fixture('fedex/tracking_response_failure_code_9080')
344
361
  @carrier.expects(:commit).returns(mock_response)
345
362
 
@@ -351,23 +368,18 @@ class FedExTest < Minitest::Test
351
368
  assert_equal msg, error.message
352
369
  end
353
370
 
354
- def test_parsing_response_without_notifications
355
- mock_response = xml_fixture('fedex/reply_without_notifications')
356
-
371
+ def test_response_with_failure_nested_in_completed_track_details
372
+ mock_response = xml_fixture('fedex/tracking_response_unable_to_process')
357
373
  @carrier.expects(:commit).returns(mock_response)
358
374
 
359
- response = @carrier.find_rates(
360
- location_fixtures[:ottawa],
361
- location_fixtures[:beverly_hills],
362
- package_fixtures.values_at(:book, :wii),
363
- :test => true
364
- )
375
+ error = assert_raises(ActiveShipping::ResponseError) do
376
+ @carrier.find_tracking_info('123456789013')
377
+ end
365
378
 
366
- assert response.success?
379
+ msg = 'FAILURE - 6330: Sorry, we are unable to process your tracking request. Please retry later, or contact Customer Service at 1.800.Go.FedEx(R) 800.463.3339.'
380
+ assert_equal msg, error.message
367
381
  end
368
382
 
369
- ### find_tracking_info
370
-
371
383
  def test_tracking_info_for_delivered_with_signature
372
384
  mock_response = xml_fixture('fedex/tracking_response_delivered_with_signature')
373
385
  @carrier.expects(:commit).returns(mock_response)
@@ -507,7 +519,7 @@ class FedExTest < Minitest::Test
507
519
  mock_response = xml_fixture('fedex/tracking_response_multiple_results')
508
520
  @carrier.expects(:commit).returns(mock_response)
509
521
 
510
- error = assert_raises(ActiveShipping::Error) do
522
+ error = assert_raises(ActiveShipping::ResponseError) do
511
523
  @carrier.find_tracking_info('123456789012')
512
524
  end
513
525
 
@@ -574,6 +586,8 @@ class FedExTest < Minitest::Test
574
586
  assert_empty response.shipment_events
575
587
  end
576
588
 
589
+ ### create_shipment
590
+
577
591
  def test_create_shipment
578
592
  confirm_response = xml_fixture('fedex/create_shipment_response')
579
593
  @carrier.stubs(:commit).returns(confirm_response)
@@ -628,4 +628,32 @@ class UPSTest < Minitest::Test
628
628
  assert_equal 'OZS', request.search('/Package/PackageWeight/UnitOfMeasurement/Code').text
629
629
  assert_equal '8.0', request.search('/Package/PackageWeight/Weight').text
630
630
  end
631
+
632
+ def test_address_validation
633
+ location = Location.new(address1: "55 Glenlake Parkway", city: "Atlanta", state: "GA", zip: "30328", country: "US")
634
+ address_validation_response = xml_fixture('ups/address_validation_response')
635
+ @carrier.expects(:commit).returns(address_validation_response)
636
+ response = @carrier.validate_address(location)
637
+ assert_equal :commercial, response.classification
638
+ assert_equal true, response.address_match?
639
+ end
640
+
641
+ def test_address_validation_ambiguous
642
+ location = Location.new(address1: "55 Glen", city: "Atlanta", state: "GA", zip: "30328", country: "US")
643
+ address_validation_response = xml_fixture('ups/address_validation_response_ambiguous')
644
+ @carrier.expects(:commit).returns(address_validation_response)
645
+ response = @carrier.validate_address(location)
646
+ assert_equal false, response.address_match?
647
+ assert_equal :ambiguous, response.validity
648
+ end
649
+
650
+ def test_address_validation_no_candidates
651
+ location = Location.new(address1: "55 Glenblagahrhadd", city: "Atlanta", state: "GA", zip: "30321", country: "US")
652
+ address_validation_response = xml_fixture('ups/address_validation_response_no_candidates')
653
+ @carrier.expects(:commit).returns(address_validation_response)
654
+ response = @carrier.validate_address(location)
655
+ assert_equal false, response.address_match?
656
+ assert_equal :invalid, response.validity
657
+ end
658
+
631
659
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_shipping
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.2
4
+ version: 1.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-15 00:00:00.000000000 Z
11
+ date: 2017-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: quantified
@@ -62,16 +62,16 @@ dependencies:
62
62
  name: nokogiri
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: '1.6'
67
+ version: 1.6.8
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ">="
72
+ - - '='
73
73
  - !ruby/object:Gem::Version
74
- version: '1.6'
74
+ version: 1.6.8
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: minitest
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -182,6 +182,7 @@ files:
182
182
  - gemfiles/activesupport50.gemfile
183
183
  - gemfiles/activesupport_master.gemfile
184
184
  - lib/active_shipping.rb
185
+ - lib/active_shipping/address_validation_response.rb
185
186
  - lib/active_shipping/carrier.rb
186
187
  - lib/active_shipping/carriers.rb
187
188
  - lib/active_shipping/carriers/australia_post.rb
@@ -299,6 +300,7 @@ files:
299
300
  - test/fixtures/xml/fedex/tracking_response_multiple_results.xml
300
301
  - test/fixtures/xml/fedex/tracking_response_not_found.xml
301
302
  - test/fixtures/xml/fedex/tracking_response_shipment_exception.xml
303
+ - test/fixtures/xml/fedex/tracking_response_unable_to_process.xml
302
304
  - test/fixtures/xml/fedex/tracking_response_with_blank_state.xml
303
305
  - test/fixtures/xml/fedex/unknown_fedex_document_reply.xml
304
306
  - test/fixtures/xml/kunaki/invalid_state_response.xml
@@ -328,6 +330,10 @@ files:
328
330
  - test/fixtures/xml/stamps/track_shipment_request.xml
329
331
  - test/fixtures/xml/stamps/track_shipment_response.xml
330
332
  - test/fixtures/xml/ups/access_request.xml
333
+ - test/fixtures/xml/ups/address_validation_request.xml
334
+ - test/fixtures/xml/ups/address_validation_response.xml
335
+ - test/fixtures/xml/ups/address_validation_response_ambiguous.xml
336
+ - test/fixtures/xml/ups/address_validation_response_no_candidates.xml
331
337
  - test/fixtures/xml/ups/delivered_shipment_with_refund.xml
332
338
  - test/fixtures/xml/ups/delivered_shipment_without_events_tracking_response.xml
333
339
  - test/fixtures/xml/ups/delivery_dates_response.xml
@@ -525,6 +531,7 @@ test_files:
525
531
  - test/fixtures/xml/fedex/tracking_response_multiple_results.xml
526
532
  - test/fixtures/xml/fedex/tracking_response_not_found.xml
527
533
  - test/fixtures/xml/fedex/tracking_response_shipment_exception.xml
534
+ - test/fixtures/xml/fedex/tracking_response_unable_to_process.xml
528
535
  - test/fixtures/xml/fedex/tracking_response_with_blank_state.xml
529
536
  - test/fixtures/xml/fedex/unknown_fedex_document_reply.xml
530
537
  - test/fixtures/xml/kunaki/invalid_state_response.xml
@@ -554,6 +561,10 @@ test_files:
554
561
  - test/fixtures/xml/stamps/track_shipment_request.xml
555
562
  - test/fixtures/xml/stamps/track_shipment_response.xml
556
563
  - test/fixtures/xml/ups/access_request.xml
564
+ - test/fixtures/xml/ups/address_validation_request.xml
565
+ - test/fixtures/xml/ups/address_validation_response.xml
566
+ - test/fixtures/xml/ups/address_validation_response_ambiguous.xml
567
+ - test/fixtures/xml/ups/address_validation_response_no_candidates.xml
557
568
  - test/fixtures/xml/ups/delivered_shipment_with_refund.xml
558
569
  - test/fixtures/xml/ups/delivered_shipment_without_events_tracking_response.xml
559
570
  - test/fixtures/xml/ups/delivery_dates_response.xml