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 Data::Dumper;
use Test::Exception;
use Test::More;

use Email::ExactTarget;


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

my $config = ExactTargetConfig->new();

# Retrieve the list of addresses to use for testing.
my $emails_to_delete = [];
foreach my $line ( <DATA> )
{
	chomp( $line );
	next if !defined( $line ) || substr( $line, 0, 1 ) eq '#' || $line !~ /\w/;
	push( @$emails_to_delete, $line );
}
isnt(
	scalar( @$emails_to_delete ),
	0,
	'Find emails to delete.'
);

# 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.
my $subscriber_operations = $exact_target->subscriber_operations();

# Retrieve the subscriber objects.
my $subscribers = retrieve_subscribers(
	$subscriber_operations,
	$emails_to_delete,
);

# Delete the subscribers.
my $all_subscribers_deleted;
lives_ok(
	sub
	{
		$all_subscribers_deleted = $subscriber_operations->delete_permanently(
			[ values %$subscribers ],
		);
	},
	"Delete the subscribers.",
);
ok(
	$all_subscribers_deleted,
	'No error is found when processing the output of the entire batch.',
);

# Check that there's errors on the subscriber objects only when the email
# did not exist in the database.
subtest(
	'The subscriber objects have no errors.',
	sub
	{
		while ( my ( $email, $subscriber ) = each %$subscribers )
		{
			my $errors = $subscriber->errors();
			my $email = $subscriber->get_attribute( 'Email Address' );
			ok(
				!defined( $errors ),
				"The subscriber object for $email has no errors.",
			) || diag( "Errors on the subscriber object:\n" . Dumper( $errors ) );
		}
	}
);

# Retrieve the subscribers again. Now that we've deleted them all, there should
# be no result.
$subscribers = retrieve_subscribers(
	$subscriber_operations,
	$emails_to_delete,
);
is(
	scalar( keys %$subscribers ),
	0,
	"The subscribers do not exist in ExactTarget's database anymore.",
);


sub retrieve_subscribers
{
	my ( $subscriber_operations, $emails_to_delete ) = @_;

	# Retrieve the subscriber objects.
	my $subscribers_list;
	lives_ok(
		sub
		{
			$subscribers_list = $subscriber_operations->retrieve(
				'email' => $emails_to_delete,
			);
		},
		'Retrieve the Email::ExactTarget::Subscriber objects.',
	);
	
	# Return a hash associating emails with the corresponding subscriber objects.
	return
	{
		map
		{
			$_->get_attribute('Email Address') => $_
		}
		@$subscribers_list
	};
}


__DATA__
# Email to delete
john.q.public@example.com
john.doe@example.com
john.public@example.com