qpsmtpd/t/plugin_tests/rcpt_ok

101 lines
2.9 KiB
Perl

#!perl -w
use strict;
use warnings;
use Qpsmtpd::Constants;
sub register_tests {
my $self = shift;
$self->register_test('test_get_rcpt_host');
$self->register_test('test_is_in_rcpthosts');
$self->register_test('test_is_in_morercpthosts');
$self->register_test('test_hook_rcpt');
}
sub test_hook_rcpt {
my $self = shift;
my $transaction = $self->qp->transaction;
my $address = Qpsmtpd::Address->parse('<user@localhost>');
my ($r, $mess) = $self->hook_rcpt( $transaction, $address );
cmp_ok( $r, '==', OK, "localhost");
$address = Qpsmtpd::Address->parse('<user@example.com>');
($r, $mess) = $self->hook_rcpt( $transaction, $address );
cmp_ok( $r, '==', DENY, "example.com");
$self->qp->connection->relay_client(1);
($r, $mess) = $self->hook_rcpt( $transaction, $address );
cmp_ok( $r, '==', OK, "example.com");
$self->qp->connection->relay_client(0);
}
sub test_is_in_rcpthosts {
my $self = shift;
my @hosts = $self->qp->config('rcpthosts');
my $host = $hosts[0];
if ( $host ) {
ok( $self->is_in_rcpthosts( $host ), "is_in_rcpthosts, $host");
}
else {
ok(1, "is_in_rcpthosts (skip, no entries)" );
}
ok( $self->is_in_rcpthosts( 'localhost' ), "is_in_rcpthosts +");
ok( ! $self->is_in_rcpthosts( 'example.com' ), "is_in_rcpthosts -");
}
sub test_is_in_morercpthosts {
my $self = shift;
my $ref = $self->qp->config('morercpthosts', 'map');
my ($domain) = keys %$ref;
if ( $domain ) {
ok( $self->is_in_morercpthosts( $domain ), "$domain");
}
else {
ok(1, "is_in_morercpthosts (skip, no entries)" );
}
ok( ! $self->is_in_morercpthosts( 'example.com' ), "missing -");
}
sub test_get_rcpt_host {
my $self = shift;
my $address = Qpsmtpd::Address->parse('<me@example.com>');
cmp_ok( $self->get_rcpt_host( $address ), 'eq', 'example.com', "+" );
$address = Qpsmtpd::Address->parse('<me@exaMple.com>');
cmp_ok( $self->get_rcpt_host( $address ), 'eq', 'example.com', "+" );
$address = Qpsmtpd::Address->parse('<root@example.com>');
cmp_ok( $self->get_rcpt_host( $address ), 'eq', 'example.com', "+" );
$address = Qpsmtpd::Address->parse('<postmaster>');
my $local_hostname = $self->get_rcpt_host( $address );
if ( $local_hostname eq 'some.host.example.org' ) {
cmp_ok( $self->get_rcpt_host( $address ), 'eq', 'some.host.example.org',
"special postmaster +" );
}
else {
ok( 1, "special postmaster + ($local_hostname)" );
}
# I think this is a bug. Qpsmtpd::Address fails to parse <abuse>
$address = Qpsmtpd::Address->parse('<abuse>');
ok( ! $self->get_rcpt_host( $address ), "missing host" );
$address = Qpsmtpd::Address->parse('<>');
ok( ! $self->get_rcpt_host( $address ), "null recipient" );
$address = Qpsmtpd::Address->parse('<@example.com>');
ok( ! $self->get_rcpt_host( $address ), "missing user" );
}