Mojo-SMTP-Client

 view release on metacpan or  search on metacpan

t/02_smtp.t  view on Meta::CPAN

use strict;
use Test::More;
use Mojo::SMTP::Client;
use Mojo::Exception;
use Mojo::IOLoop::TLS;
use Socket 'CRLF';
use lib 't/lib';
use Utils;

if ($^O eq 'MSWin32') {
	plan skip_all => 'fork() support required';
}

my $tls = &Mojo::IOLoop::TLS::TLS;

# 1
my ($pid, $sock, $host, $port) = Utils::make_smtp_server($tls);
my $smtp = Mojo::SMTP::Client->new(address => $host, port => $port, tls => $tls, tls_verify => 0);
syswrite($sock, join(CRLF, '220 host.net', '220 hello ok', '220 from ok', '220 to ok', '220 quit ok').CRLF);

my $resp = $smtp->send(hello => 'mymail.host', from => '', to => 'jorik@gmail.com', quit => 1);
isa_ok($resp, 'Mojo::SMTP::Client::Response');
ok(!$resp->error, 'no error') or diag $resp->error;
is($resp->code, 220, 'right response code');
is($resp->message, 'quit ok', 'right message');
is($resp->to_string, '220 quit ok'.CRLF, 'stringify message');

my @expected_cmd = (
	'CONNECT',
	'EHLO mymail.host',
	'MAIL FROM:<>',
	'RCPT TO:<jorik@gmail.com>',
	'QUIT'
);

for (0..4) {
	is(scalar(<$sock>), $expected_cmd[$_].CRLF, "right cmd was sent: $expected_cmd[$_]");
}
close $sock;
kill 15, $pid;

# 2
($pid, $sock, $host, $port) = Utils::make_smtp_server();
$smtp = Mojo::SMTP::Client->new(address => $host, port => $port, inactivity_timeout => 0.5, autodie => 1, tls_verify => 0);
eval {
	$smtp->send(quit => 1);
};
ok(my $e = $@, 'timed out');
isa_ok($e, 'Mojo::SMTP::Client::Exception::Stream');
close $sock;
kill 15, $pid;

# 3
($pid, $sock, $host, $port) = Utils::make_smtp_server();
$smtp = Mojo::SMTP::Client->new(address => $host, port => $port, autodie => 1, tls_verify => 0);
syswrite($sock, '500 host.net is busy'.CRLF);
eval {
	$smtp->send();
};
ok($e = $@, 'bad response');
isa_ok($e, 'Mojo::SMTP::Client::Exception::Response');
close $sock;
kill 15, $pid;

# 4
($pid, $sock, $host, $port) = Utils::make_smtp_server();
$smtp = Mojo::SMTP::Client->new(address => $host, port => $port, autodie => 1, tls_verify => 0);
syswrite($sock, join(CRLF, '220 host.net', '220 hello ok', '220 from ok', '220 to ok', '220 quit ok').CRLF);

$smtp->on(response => sub {
	my $cmd = $_[1];
	
	if ($cmd == Mojo::SMTP::Client::CMD_EHLO) {
		Mojo::Exception->throw("Throwed from response callback");
	}
});

eval {
	$smtp->send(hello => 'mymail.host', from => '', to => 'jorik@gmail.com', quit => 1);
};
$e = $@;
is(ref $e, 'Mojo::Exception', 'got right exception');
is($e->message, 'Throwed from response callback', 'with right message');

close $sock;
kill 15, $pid;

done_testing;



( run in 0.540 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )