diff --git a/lib/WebGUI/Shop/ShipDriver/USPS.pm b/lib/WebGUI/Shop/ShipDriver/USPS.pm index 38181777c..f9b9295fd 100644 --- a/lib/WebGUI/Shop/ShipDriver/USPS.pm +++ b/lib/WebGUI/Shop/ShipDriver/USPS.pm @@ -221,22 +221,25 @@ The set of shippable units, which are required to do quantity and cost lookups. sub _calculateInsurance { my ($self, @shippableUnits) = @_; - my $cost = 0; - return $cost unless $self->get('addInsurance') && $self->get('insuranceRates'); + my $insuranceCost = 0; + return $insuranceCost unless $self->get('addInsurance') && $self->get('insuranceRates'); my @insuranceTable = map { my ($value,$cost) = split /:/, $_; [$value, $cost]; } split /\r?\n/, $self->get('insuranceRates'); ##Sort by decreasing value for easy post processing @insuranceTable = sort { $b->[0] <=> $a->[0] } @insuranceTable; - my $insuranceCost = 0; foreach my $package (@shippableUnits) { + my $value = 0; ITEM: foreach my $item (@{ $package }) { - $cost += $item->getSku->getPrice() * $item->get('quantity'); + $value += $item->getSku->getPrice() * $item->get('quantity'); } my $pricePoint; - POINT: foreach $pricePoint (@insuranceTable) { - last POINT if $cost <= $pricePoint->[0]; + POINT: foreach my $point (@insuranceTable) { + if ($value > $point->[0]) { + $pricePoint = $point; + last POINT; + } } - $insuranceCost += $pricePoint->[1]; + $insuranceCost += defined $pricePoint ? $pricePoint->[1] : 0; } return $insuranceCost; } diff --git a/t/Shop/ShipDriver/USPS.t b/t/Shop/ShipDriver/USPS.t index 6f8ad6cf7..eb5a10c24 100644 --- a/t/Shop/ShipDriver/USPS.t +++ b/t/Shop/ShipDriver/USPS.t @@ -24,7 +24,7 @@ use Data::Dumper; use WebGUI::Test; # Must use this before any other WebGUI modules use WebGUI::Session; -plan tests => 46; +plan tests => 51; use_ok('WebGUI::Shop::ShipDriver::USPS') or die 'Unable to load module WebGUI::Shop::ShipDriver::USPS'; @@ -42,8 +42,15 @@ $session->user({user => $user}); # put your tests here -my $storage; my ($driver, $cart); +my $insuranceTable = <getWorking($session); my $home = WebGUI::Asset->getDefault($session); @@ -92,8 +99,16 @@ my $nivBible = $bible->setCollateral('variantsJSON', 'variantId', 'new', } ); +my $gospels = $bible->setCollateral('variantsJSON', 'variantId', 'new', + { + shortdesc => 'Gospels from the new Testament', + price => 1.50, varSku => 'gospels', + weight => 2.0, quantity => 999999, + } +); + $versionTag->commit; -WebGUI::Test->tagsToRollback($versionTag); +addToCleanup($versionTag); ####################################################################### # @@ -283,6 +298,17 @@ $driver->update($properties); $rockHammer->addToCart($rockHammer->getCollateral('variantsJSON', 'variantId', $smallHammer)); my @shippableUnits = $driver->_getShippableUnits($cart); +$properties = $driver->get(); +$properties->{addInsurance} = 1; +$properties->{insuranceRates} = $insuranceTable; +$driver->update($properties); + +is($driver->_calculateInsurance(@shippableUnits), 1, '_calculateInsurance: one item in cart with quantity=1, calculates insurance'); + +$properties->{addInsurance} = 0; +$driver->update($properties); +is($driver->_calculateInsurance(@shippableUnits), 0, '_calculateInsurance: returns 0 if insurance is not enabled'); + my $xml = $driver->buildXML($cart, @shippableUnits); like($xml, qr/addToCart($bible->getCollateral('variantsJSON', 'variantId', $nivBible)); @shippableUnits = $driver->_getShippableUnits($cart); -$xml = $driver->buildXML($cart, @shippableUnits); +is(calculateInsurance($driver), 5, '_calculateInsurance: two items in cart with quantity=1, calculates insurance'); + +$xml = $driver->buildXML($cart, @shippableUnits); $xmlData = XMLin( $xml, KeepRoot => 1, ForceArray => ['Package'], @@ -458,6 +486,8 @@ is($cost, 12.25, '_calculateFromXML calculates shipping cost correctly for 2 ite $bibleItem->setQuantity(2); @shippableUnits = $driver->_getShippableUnits($cart); +is(calculateInsurance($driver), 51, '_calculateInsurance: two items in cart with quantity=2, calculates insurance'); + $cost = $driver->_calculateFromXML({ Package => [ { @@ -481,6 +511,7 @@ is($cost, 19.25, '_calculateFromXML calculates shipping cost correctly for 2 ite $rockHammer2 = $rockHammer->addToCart($rockHammer->getCollateral('variantsJSON', 'variantId', $bigHammer)); $rockHammer2->update({shippingAddressId => $wucAddress->getId}); @shippableUnits = $driver->_getShippableUnits($cart); +is(calculateInsurance($driver), 54, '_calculateInsurance: calculates insurance'); $xml = $driver->buildXML($cart, @shippableUnits); $xmlData = XMLin( $xml, @@ -575,6 +606,12 @@ SKIP: { } +####################################################################### +# +# Test Priority shipping setup +# +####################################################################### + $cart->empty; $properties = $driver->get(); $properties->{shipType} = 'PRIORITY'; @@ -637,6 +674,12 @@ SKIP: { } +####################################################################### +# +# Test EXPRESS shipping setup +# +####################################################################### + $properties = $driver->get(); $properties->{shipType} = 'EXPRESS'; $driver->update($properties); @@ -695,6 +738,11 @@ SKIP: { } +####################################################################### +# +# Test PRIORITY VARIABLE shipping setup +# +####################################################################### $properties = $driver->get(); $properties->{shipType} = 'PRIORITY VARIABLE'; @@ -754,18 +802,11 @@ SKIP: { } - -$properties = $driver->get(); -$properties->{addInsurance} = 1; -$properties->{insuranceTable} = <update($properties); - +####################################################################### +# +# Test PRIORITY VARIABLE shipping setup +# +####################################################################### #---------------------------------------------------------------------------- # Cleanup @@ -779,3 +820,17 @@ END { $cart->delete; } } + +sub calculateInsurance { + my $driver = shift; + $properties = $driver->get(); + $properties->{addInsurance} = 1; + $driver->update($properties); + + my $insurance = $driver->_calculateInsurance(@shippableUnits); + + $properties->{addInsurance} = 0; + $driver->update($properties); + + return $insurance; +}