# vim:syntax=perl #------------------------------------------------------------------- # WebGUI is Copyright 2001-2009 Plain Black Corporation. #------------------------------------------------------------------- # Please read the legal notices (docs/legal.txt) and the license # (docs/license.txt) that came with this distribution before using # this software. #------------------------------------------------------------------ # http://www.plainblack.com info@plainblack.com #------------------------------------------------------------------ # Write a little about what this script tests. # # use FindBin; use strict; use lib "$FindBin::Bin/../../lib"; use Test::More; use Test::Deep; use JSON; use HTML::Form; use WebGUI::Test; # Must use this before any other WebGUI modules use WebGUI::Session; #---------------------------------------------------------------------------- # Init my $session = WebGUI::Test->session; #---------------------------------------------------------------------------- # Tests my $tests = 19; plan tests => 1 + $tests; #---------------------------------------------------------------------------- # put your tests here my $loaded = use_ok('WebGUI::Shop::ShipDriver::FlatRate'); my $storage; my ($driver, $cart, $car, $key); my $versionTag; SKIP: { skip 'Unable to load module WebGUI::Shop::ShipDriver::FlatRate', $tests unless $loaded; ####################################################################### # # definition # ####################################################################### my $definition; my $e; ##Exception variable, used throughout the file eval { $definition = WebGUI::Shop::ShipDriver::FlatRate->definition(); }; $e = Exception::Class->caught(); isa_ok($e, 'WebGUI::Error::InvalidParam', 'definition takes an exception to not giving it a session variable'); cmp_deeply( $e, methods( error => 'Must provide a session variable', ), 'definition: requires a session variable', ); $definition = WebGUI::Shop::ShipDriver::FlatRate->definition($session); cmp_deeply( $definition, [ { name => 'Flat Rate', properties => { flatFee => { fieldType => 'float', label => ignore(), hoverHelp => ignore(), defaultValue => 0, }, percentageOfPrice => { fieldType => 'float', label => ignore(), hoverHelp => ignore(), defaultValue => 0, }, pricePerWeight => { fieldType => 'float', label => ignore(), hoverHelp => ignore(), defaultValue => 0, }, pricePerItem => { fieldType => 'float', label => ignore(), hoverHelp => ignore(), defaultValue => 0, }, } }, { name => 'Shipper Driver', properties => { label => { fieldType => 'text', label => ignore(), hoverHelp => ignore(), defaultValue => undef, }, enabled => { fieldType => 'yesNo', label => ignore(), hoverHelp => ignore(), defaultValue => 1, }, groupToUse => { fieldType => 'group', label => ignore(), hoverHelp => ignore(), defaultValue => 7, }, } } ], 'Definition returns an array of hashrefs', ); ####################################################################### # # create # ####################################################################### my $options = { label => 'flat rate, ship weight, items in the cart', enabled => 1, flatFee => 1.00, percentageOfPrice => 5, pricePerWeight => 0.5, pricePerItem => 0.1, }; $driver = WebGUI::Shop::ShipDriver::FlatRate->create($session, $options); isa_ok($driver, 'WebGUI::Shop::ShipDriver::FlatRate'); isa_ok($driver, 'WebGUI::Shop::ShipDriver'); ####################################################################### # # getName # ####################################################################### is (WebGUI::Shop::ShipDriver::FlatRate->getName($session), 'Flat Rate', 'getName returns the human readable name of this driver'); ####################################################################### # # getEditForm # ####################################################################### my $form = $driver->getEditForm; isa_ok($form, 'WebGUI::HTMLForm', 'getEditForm returns an HTMLForm object'); my $html = $form->print; ##Any URL is fine, really my @forms = HTML::Form->parse($html, 'http://www.webgui.org'); is (scalar @forms, 1, 'getEditForm generates just 1 form'); my @inputs = $forms[0]->inputs; is (scalar @inputs, 14, 'getEditForm: the form has 14 controls'); my @interestingFeatures; foreach my $input (@inputs) { my $name = $input->name; my $type = $input->type; push @interestingFeatures, { name => $name, type => $type }; } cmp_deeply( \@interestingFeatures, [ { name => 'webguiCsrfToken', type => 'hidden', }, { name => undef, type => 'submit', }, { name => 'driverId', type => 'hidden', }, { name => 'shop', type => 'hidden', }, { name => 'method', type => 'hidden', }, { name => 'do', type => 'hidden', }, { name => 'label', type => 'text', }, { name => 'enabled', type => 'radio', }, { name => 'groupToUse', type => 'option', }, { name => '__groupToUse_isIn', type => 'hidden', }, { name => 'flatFee', type => 'text', }, { name => 'percentageOfPrice', type => 'text', }, { name => 'pricePerWeight', type => 'text', }, { name => 'pricePerItem', type => 'text', }, ], 'getEditForm made the correct form with all the elements' ); ####################################################################### # # delete # ####################################################################### my $driverId = $driver->getId; $driver->delete; my $count = $session->db->quickScalar('select count(*) from shipper where shipperId=?',[$driverId]); is($count, 0, 'delete deleted the object'); undef $driver; ####################################################################### # # calculate # ####################################################################### $car = WebGUI::Asset->getImportNode($session)->addChild({ className => 'WebGUI::Asset::Sku::Product', title => 'Automobiles', isShippingRequired => 1, }); my $crappyCar = $car->setCollateral('variantsJSON', 'variantId', 'new', { shortdesc => '1987 Ford Escort', varSku => 'crappy-car', price => 600, weight => 1500, quantity => 5, } ); my $goodCar = $car->setCollateral('variantsJSON', 'variantId', 'new', { shortdesc => '2004 Honda MPV minivan', varSku => 'used van', price => 15_000, weight => 2000, quantity => 15, } ); my $reallyNiceCar = $car->setCollateral('variantsJSON', 'variantId', 'new', { shortdesc => 'Cadillac XLR-V', varSku => 'nice-car', price => 90_000, weight => 3000, quantity => 3, } ); $versionTag = WebGUI::VersionTag->getWorking($session); $versionTag->commit; $options = { label => 'flat rate, ship weight', enabled => 1, flatFee => 1.00, percentageOfPrice => 0, pricePerWeight => 100, pricePerItem => 10, }; $driver = WebGUI::Shop::ShipDriver::FlatRate->create($session, $options); $cart = WebGUI::Shop::Cart->newBySession($session); $car->addToCart($car->getCollateral('variantsJSON', 'variantId', $crappyCar)); is($driver->calculate($cart), 1511, 'calculate by weight, perItem and flat fee work'); $car->addToCart($car->getCollateral('variantsJSON', 'variantId', $reallyNiceCar)); is($driver->calculate($cart), 4521, 'calculate by weight, perItem and flat fee work for two items'); $options = { label => 'percentage of price', enabled => 1, flatFee => 0.00, percentageOfPrice => 1/3*100, pricePerWeight => 0, pricePerItem => 0, }; $driver->update($options); is($driver->calculate($cart), 30_200, 'calculate by percentage of price'); $cart->empty(); $driver->update({ label => 'flat fee for shipsSeparately test', enabled => 1, flatFee => 1, percentageOfPrice => 0, pricePerWeight => 0, pricePerItem => 0, }); $key = WebGUI::Asset->getImportNode($session)->addChild({ className => 'WebGUI::Asset::Sku::Product', title => 'Key', isShippingRequired => 1, shipsSeparately => 1, }); my $metalKey = $key->setCollateral('variantsJSON', 'variantId', 'new', { shortdesc => 'metal key', varSku => 'metal-key', price => 1.00, weight => 1.00, quantity => 1e9, } ); my $bioKey = $key->setCollateral('variantsJSON', 'variantId', 'new', { shortdesc => 'biometric key', varSku => 'bio-key', price => 5.00, weight => 1.00, quantity => 1e9, } ); my $boughtCar = $car->addToCart($car->getCollateral('variantsJSON', 'variantId', $reallyNiceCar)); my $firstKey = $key->addToCart($key->getCollateral('variantsJSON', 'variantId', $metalKey)); is($driver->calculate($cart), 2, 'shipsSeparately: returns two, one for ships separately, one for ships bundled'); $boughtCar->adjustQuantity(); is($driver->calculate($cart), 2, '... returns two, one for ships separately, one for ships bundled, even for two items'); $firstKey->adjustQuantity(); is($driver->calculate($cart), 3, '... returns three, two for ships separately, one for ships bundled, even for two items'); $key->update({shipsSeparately => 0}); is($driver->calculate($cart), 1, '... returns one, since all can be bundled together now'); $car->update({shipsSeparately => 1}); $key->update({shipsSeparately => 1}); is($driver->calculate($cart), 4, '... returns four, since all must be shipped separately now'); } #---------------------------------------------------------------------------- # Cleanup END { if (defined $driver && ref $driver eq 'WebGUI::Shop::ShipDriver::FlatRate') { $driver->delete; } if (defined $cart && ref $cart eq 'WebGUI::Shop::Cart') { $cart->delete; } if (defined $car && (ref($car) eq 'WebGUI::Asset::Sku::Product')) { $car->purge; } if (defined $key && (ref($key) eq 'WebGUI::Asset::Sku::Product')) { $key->purge; } if (defined $versionTag) { $versionTag->rollback; } }