The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;

use Class::Load qw( load_class );
use FindBin; use lib "$FindBin::Bin/lib";

my $t = load_class('Test::Business::CyberSource')->new;

my $client = $t->resolve( service => '/client/object' );

my $ret0
	= $client->run_transaction(
		$t->resolve(
			service    => '/request/authorization',
			parameters => {
				purchase_totals => $t->resolve(
					service    => '/helper/purchase_totals',
					parameters => {
						total => 3000.37, # magic make me expired
					},
				),
			},
		)
	);

isa_ok( $ret0, 'Business::CyberSource::Response' );

is( $ret0->is_accept,                 0,       'success'            );
is( $ret0->decision,                 'REJECT', 'decision'           );
is( $ret0->reason_code,               202,     'reason_code'        );
is( $ret0->auth->processor_response, '54',     'processor response' );

ok( $ret0->request_id,               'request_id exists'            );
ok( $ret0->request_token,            'request_token exists'         );

is(
	$ret0->reason_text,
	'Expired card. You might also receive this if the expiration date you '
		. 'provided does not match the date the issuing bank has on file'
		,
	'reason_text',
);

my $ret1
	= $client->run_transaction(
		$t->resolve(
			service    => '/request/authorization',
			parameters => {
				purchase_totals => $t->resolve(
					service    => '/helper/purchase_totals',
					parameters => {
						total => 3000.04, # magic 201
					},
				),
			},
		)
	);

isa_ok( $ret1, 'Business::CyberSource::Response' );


is( $ret1->decision,       'REJECT', 'decision'       );
is( $ret1->reason_code,     201,     'reason_code'    );
is(
	$ret1->reason_text,
	'The issuing bank has questions about the request. You do not '
	. 'receive an authorization code programmatically, but you might '
	. 'receive one verbally by calling the processor'
	,
	'reason_text',
);

done_testing;