The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T

use strict;
use warnings;

use Test::Exception;
use Test::More;
use Data::Dumper;

use Email::ExactTarget;
use Email::ExactTarget::Subscriber;


eval 'use ExactTargetConfig';
$@
	? plan( skip_all => 'Local connection information for ExactTarget required to run tests.' )
	: plan( tests => 9 );

my $config = ExactTargetConfig->new();

# Create an object to communicate with Exact Target.
my $exact_target = Email::ExactTarget->new( %$config );
ok(
	defined( $exact_target ),
	'Create a new Email::ExactTarget object.',
) || diag( explain( $exact_target ) );

# Get a subscriber operations object.
ok(
	my $subscriber_operations = $exact_target->subscriber_operations(),
	"Subscriber operations object retrieved.",
);

# Create new Subscriber objects.
my $subscribers = [];

# (this one should already exist, per our previous tests)
ok(
	my $subscriber1 = Email::ExactTarget::Subscriber->new(),
	'Created Email::ExactTarget::Subscriber object.',
);
lives_ok(
	sub
	{
		$subscriber1->set_attributes(
			{
				'First Name'    => 'John Q.',
				'Last Name'     => 'Public',
				'Email Address' => 'john.q.public@example.com',
			},
			'is_live' => 0,
		);
		$subscriber1->set_lists_status(
			{
				$config->{'test_lists'}->[0] => 'Active',
			},
			'is_live' => 0,
		);
	},
	'Staged changes on the first subscriber.',
);
push( @$subscribers, $subscriber1 );

# (this one will be new)
ok(
	my $subscriber2 = Email::ExactTarget::Subscriber->new(),
	'Created Email::ExactTarget::Subscriber object.',
);
lives_ok(
	sub
	{
		$subscriber2->set_attributes(
			{
				'First Name'    => 'John',
				'Last Name'     => 'Doe',
				'Email Address' => 'john.doe@example.com',
			},
			'is_live' => 0,
		);
		$subscriber2->set_lists_status(
			{
				$config->{'test_lists'}->[1] => 'Active',
			},
			'is_live' => 0,
		);
	},
	'Staged changes on the second subscriber.',
);
push( @$subscribers, $subscriber2 );

# First set of updates to set up the testing environment.
lives_ok(
	sub
	{
		$subscriber_operations->update_or_create( $subscribers );
	},
	"No error found when updating/creating the objects.",
);

# Check that there is no error on the subscriber objects.
foreach my $subscriber ( @$subscribers )
{
	ok(
		!defined( $subscriber->errors() ),
		"No error found on the subscriber object.",
	) || diag( "Errors on the subscriber object:\n" . Dumper( $subscriber->errors() ) );
}