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 Module::Runtime qw( use_module );
use FindBin; use lib "$FindBin::Bin/lib";

my $dtc = use_module('Business::CyberSource::Request::Authorization');

my $t = new_ok( use_module('Test::Business::CyberSource') );

my @test_pairs = (
	[ '4111111111111111' => '001' ],
	[ '5555555555554444' => '002' ],
	[ '3566111111111113' => '007' ],
);

foreach ( @test_pairs ) {
	my ( $acct_num, $type_code ) = @{ $_ };

	my $dto = new_ok( $dtc => [{
		reference_code  => my $code = $dtc . '->new',
		purchase_totals => $t->resolve( service => '/helper/purchase_totals'),
		bill_to         => $t->resolve( service  => '/helper/bill_to'),
		card            => $t->resolve(
			service    => '/helper/card',
			parameters => {
				account_number => $acct_num,
			},
		),
	}]);

	can_ok( $dto, 'serialize' );

	isa_ok $dto->bill_to,         'Business::CyberSource::RequestPart::BillTo';
	isa_ok $dto->purchase_totals, 'Business::CyberSource::RequestPart::PurchaseTotals';
	isa_ok $dto->card,            'Business::CyberSource::RequestPart::Card';

	my %expected = (
		billTo => {
			firstName   => 'Caleb',
			lastName    => 'Cushing',
			country     => 'US',
			ipAddress   => '192.168.100.2',
			street1     => 'somewhere',
			state       => 'TX',
			email       => 'xenoterracide@gmail.com',
			city        => 'Houston',
			postalCode => '77064',
		},
		card => {
			accountNumber   => $acct_num,
			cardType        => $type_code,
			cvIndicator     => 1,
			cvNumber        => 1111,
			expirationMonth => 5,
			expirationYear  => 2025,
			fullName        => 'Caleb Cushing',
		},
		ccAuthService => {
			run => 'true',
		},
		purchaseTotals => {
			currency         => 'USD',
			grandTotalAmount => 3000.00,
		},
		merchantReferenceCode => $code,
	);

	is_deeply $dto->serialize, \%expected, 'serialize';

	is( ref( $dto->serialize ), 'HASH', 'serialize returns a hashref'     );
	is( $dto->reference_code, $code,       $dtc .'->reference_code'       );
}

done_testing;