#!perl -w
use strict;
use warnings;
BEGIN {
use lib 't/lib';
use Handel::Test tests => 159;
use_ok('Handel::Checkout');
use_ok('Handel::Subclassing::Checkout');
use_ok('Handel::Subclassing::CheckoutStash');
use_ok('Handel::Subclassing::Stash');
use_ok('Handel::Constants', qw(:checkout));
use_ok('Handel::Exception', ':try');
};
## add a phase and import
{
is(main->can('NEWPHASE'), undef, 'new phase does not exists');
Handel::Checkout->add_phase('NEWPHASE', 23, 1);
can_ok('main', 'NEWPHASE');
is(&main::NEWPHASE, 23, 'new phase in place');
};
## This is a hack, but it works. :-)
&run('Handel::Checkout');
&run('Handel::Subclassing::Checkout');
&run('Handel::Subclassing::CheckoutStash');
sub run {
my ($subclass) = @_;
## Check for Handel::Exception::Argument when we pass something other
## than an array reference
{
try {
local $ENV{'LANGUAGE'} = 'en';
my $checkout = $subclass->new;
$checkout->phases({'1234' => 1});
fail('no exception thrown');
} catch Handel::Exception::Argument with {
pass('caught argument exception');
like(shift, qr/not an array/i, 'not array in message');
} otherwise {
fail('other exception caught');
};
};
## Check for Handel::Exception::Argument when we pass something other
## than an array reference in news' phases option
{
try {
local $ENV{'LANGUAGE'} = 'en';
my $checkout = $subclass->new({phases => {'1234' => 1}});
fail('no exception thrown');
} catch Handel::Exception::Argument with {
pass('caught argument exception');
like(shift, qr/not an array/i, 'not array in message');
} otherwise {
fail('other exception caught');
};
};
## Test for Handel::Exception::Constraint if new constant name already exists
{
try {
local $ENV{'LANGUAGE'} = 'en';
$subclass->add_phase('CHECKOUT_PHASE_INITIALIZE', 99);
fail('no exception thrown');
} catch Handel::Exception::Constraint with {
pass('caught constraint exception');
like(shift, qr/already exists/i, 'already exists in message');
} otherwise {
fail('other exception caught');
};
};
## Test for Handel::Exception::Constraint if new constant value already exists
{
try {
local $ENV{'LANGUAGE'} = 'en';
$subclass->add_phase('CUSTOM_CHECKOUT_PHASE', CHECKOUT_PHASE_INITIALIZE);
fail('no exception thrown');
} catch Handel::Exception::Constraint with {
pass('caught constraint exception');
like(shift, qr/already exists/i, 'already exists in message');
} otherwise {
fail('other exception caught');
};
};
## Test for Handel::Exception::Constraint if new constant already exists in caller
sub CUSTOM_CHECKOUT_PHASE_TEST {};
{
try {
local $ENV{'LANGUAGE'} = 'en';
$subclass->add_phase('CUSTOM_CHECKOUT_PHASE_TEST', 43, 1);
fail('no exception thrown');
} catch Handel::Exception::Constraint with {
pass('caught constraint exception');
like(shift, qr/already exists/i, 'already exists in message');
} otherwise {
fail('other exception caught');
};
};
## Set the phases and make sure they stick
{
my $checkout = $subclass->new;
$checkout->phases([CHECKOUT_PHASE_AUTHORIZE]);
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 1, 'has 1 phase');
is($phases->[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
};
## Set the phases and make sure they stick as string
{
my $checkout = $subclass->new;
$checkout->phases(['CHECKOUT_PHASE_AUTHORIZE']);
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 1, 'has 1 phase');
is($phases->[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
};
## Set the phases using news' phases option and make sure they stick
{
my $checkout = $subclass->new({phases => [CHECKOUT_PHASE_DELIVER]});
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 1, 'has 1 phase');
is($phases->[0], CHECKOUT_PHASE_DELIVER, 'deliver set');
};
## check scalar/list context returns on phases default
{
my $checkout = $subclass->new;
my @phases = $checkout->phases;
ok(scalar @phases >= 1, 'has phases');
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
ok(scalar @{$phases} >= 1, 'has more than one phase');
};
## check scalar/list context returns on set phases
{
my $checkout = $subclass->new({phases => [CHECKOUT_PHASE_DELIVER, CHECKOUT_PHASE_INITIALIZE]});
my @phases = $checkout->phases;
is(scalar @phases, 2, 'has 2 phases');
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 2, 'has 2 phases');
};
## check scalar/list context returns on set phases
{
my $checkout = $subclass->new({phases => ['CHECKOUT_PHASE_DELIVER', 'CHECKOUT_PHASE_INITIALIZE']});
my @phases = $checkout->phases;
is(scalar @phases, 2, 'has 2 phases');
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 2, 'has 2 phases');
};
## Set the phases using a string and make sure they stick
{
my $checkout = $subclass->new;
$checkout->phases('CHECKOUT_PHASE_AUTHORIZE');
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 1, 'has 1 phase');
is($phases->[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
};
## Set the phases using a comma seperated string and make sure they stick
{
my $checkout = $subclass->new;
$checkout->phases('CHECKOUT_PHASE_AUTHORIZE, CHECKOUT_PHASE_DELIVER');
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 2, 'has 2 phases');
is($phases->[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
is($phases->[1], CHECKOUT_PHASE_DELIVER, 'deliver set');
};
## Set the phases using a space seperated string and make sure they stick
{
my $checkout = $subclass->new;
$checkout->phases('CHECKOUT_PHASE_AUTHORIZE CHECKOUT_PHASE_DELIVER');
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 2, 'has 2 phases');
is($phases->[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
is($phases->[1], CHECKOUT_PHASE_DELIVER, 'deliver set');
};
## Set the phases using news' phases option as string and make sure they stick
{
my $checkout = $subclass->new({phases => 'CHECKOUT_PHASE_DELIVER'});
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 1, 'has 1 phase');
is($phases->[0], CHECKOUT_PHASE_DELIVER, 'deliver set');
};
## Set the phases using news' phases option as comma seperated string and make
## sure they stick
{
my $checkout = $subclass->new({phases => 'CHECKOUT_PHASE_AUTHORIZE, CHECKOUT_PHASE_DELIVER'});
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 2, 'has 2 phases');
is($phases->[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
is($phases->[1], CHECKOUT_PHASE_DELIVER, 'deliver set');
};
## Set the phases using news' space option as comma seperated string and make
## sure they stick
{
my $checkout = $subclass->new({phases => 'CHECKOUT_PHASE_AUTHORIZE CHECKOUT_PHASE_DELIVER'});
my $phases = $checkout->phases;
isa_ok($phases, 'ARRAY');
is(scalar @{$phases}, 2, 'has 2 phases');
is($phases->[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
is($phases->[1], CHECKOUT_PHASE_DELIVER, 'deliver set');
};
};