#!/usr/bin/env perl
use_ok(
'Mail::Alias::LocalFile'
);
subtest
'Invalid mta_ prefix as key'
=>
sub
{
my
$aliases
= {
'valid_alias'
=>
'test@example.com'
,
'mta_postmaster'
=>
'postmaster@example.com'
,
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
$result
=
$resolver
->resolve_recipients([
'mta_postmaster'
]);
is(
$result
->{recipients},
''
,
'mta_ prefixed alias keys are not included in recipients'
);
ok(
scalar
grep
{ /ERROR: Alias
keys
with
'mta_'
prefix are not allowed/ } @{
$result
->{warning}},
'Warning is generated for mta_ prefixed alias key'
);
is_deeply(
$result
->{mta_aliases}, [],
'mta_ prefixed alias key is not added to mta_aliases'
);
is_deeply(
$result
->{expanded_addresses}, [],
'Addresses for mta_ prefixed key are not expanded'
);
};
subtest
'Valid mta_ prefix as value'
=>
sub
{
my
$aliases
= {
'hostmaster'
=>
'mta_hostmaster, test@example.com'
,
'simple'
=>
'test2@example.com'
,
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
$result
=
$resolver
->resolve_recipients([
'hostmaster'
]);
ok(!
scalar
grep
{ /ERROR.+hostmaster/ } @{
$result
->{warning}},
'No warning for valid use of mta_ prefix in alias value'
);
like(
$result
->{recipients},
qr/hostmaster/
,
'MTA alias included in recipients (without mta_ prefix)'
);
like(
$result
->{recipients},
qr/test\@example\.com/
,
'Regular email included in recipients'
);
is_deeply(
$result
->{mta_aliases}, [
'hostmaster'
],
'mta_aliases contains correct value with mta_ prefix removed'
);
is_deeply(
$result
->{uniq_email_addresses}, [
'test@example.com'
],
'Regular email is in uniq_email_addresses, but MTA alias is not'
);
};
subtest
'Direct mta_ prefix - should be skipped'
=>
sub
{
my
$aliases
= {
'normal'
=>
'test@example.com'
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
$result
=
$resolver
->resolve_recipients([
'mta_direct'
]);
is_deeply(
$result
->{mta_aliases}, [],
'Direct mta_ prefixed alias is skipped and not added to mta_aliases'
);
is(
$result
->{recipients},
''
,
'Recipients is empty when only direct mta_ prefixed alias is provided'
);
ok(
scalar
grep
{ /ERROR: Alias
keys
with
'mta_'
prefix are not allowed/ } @{
$result
->{warning}},
'Warning generated for direct mta_ prefixed alias'
);
};
subtest
'Mixed valid and invalid mta_ usages'
=>
sub
{
my
$aliases
= {
'valid'
=>
'mta_valid_service, email@example.com'
,
'mta_invalid'
=>
'invalid@example.com'
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
$result
=
$resolver
->resolve_recipients([
'valid'
,
'mta_invalid'
]);
is_deeply(
$result
->{mta_aliases}, [
'valid_service'
],
'Valid mta_ usage correctly processed'
);
ok(
scalar
grep
{ /ERROR: Alias
keys
with
'mta_'
prefix are not allowed/ } @{
$result
->{warning}},
'Warning for invalid mta_ prefix in key'
);
like(
$result
->{recipients},
qr/valid_service/
,
'Valid MTA service in recipients'
);
like(
$result
->{recipients},
qr/email\@example\.com/
,
'Valid email in recipients'
);
unlike(
$result
->{recipients},
qr/invalid\@example\.com/
,
'Invalid email not in recipients'
);
};
subtest
'Mixed direct mta_ prefix with valid alias'
=>
sub
{
my
$aliases
= {
'valid'
=>
'test@example.com'
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
$result
=
$resolver
->resolve_recipients([
'valid'
,
'mta_direct'
]);
is_deeply(
$result
->{mta_aliases}, [],
'Direct mta_ prefixed alias is skipped even when mixed with valid alias'
);
is(
$result
->{recipients},
'test@example.com'
,
'Recipients contains only the valid email'
);
ok(
scalar
grep
{ /ERROR: Alias
keys
with
'mta_'
prefix are not allowed/ } @{
$result
->{warning}},
'Warning generated for direct mta_ prefixed alias in mixed input'
);
};
subtest
'Nested aliases with mta_ prefix in values'
=>
sub
{
my
$aliases
= {
'level1'
=>
'mta_service1, level2'
,
'level2'
=>
'mta_service2, email@example.com'
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
$result
=
$resolver
->resolve_recipients([
'level1'
]);
cmp_bag(
$result
->{mta_aliases}, [
'service1'
,
'service2'
],
'Both nested mta_ services correctly processed'
);
like(
$result
->{recipients},
qr/service1/
,
'First MTA service in recipients'
);
like(
$result
->{recipients},
qr/service2/
,
'Second MTA service in recipients'
);
like(
$result
->{recipients},
qr/email\@example\.com/
,
'Email in recipients'
);
};
subtest
'Alias value matching improper mta_ key'
=>
sub
{
my
$aliases
= {
'valid'
=>
'mta_service, email@example.com'
,
'mta_service'
=>
'service@example.com'
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
$result
=
$resolver
->resolve_recipients([
'valid'
]);
is_deeply(
$result
->{mta_aliases}, [
'service'
],
'mta_ value correctly processed without expanding improper key'
);
like(
$result
->{recipients},
qr/service/
,
'MTA service in recipients'
);
like(
$result
->{recipients},
qr/email\@example\.com/
,
'Email in recipients'
);
unlike(
$result
->{recipients},
qr/service\@example\.com/
,
'Value of improper key not in recipients'
);
};
subtest
'detect_circular_references with mta_ keys'
=>
sub
{
my
$aliases
= {
'normal'
=>
'value'
,
'mta_bad'
=>
'bad_value'
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
@circular
=
$resolver
->detect_circular_references(
$aliases
);
ok(
scalar
grep
{ /ERROR: Alias
keys
with
'mta_'
prefix are not allowed/ } @{
$resolver
->warning},
'detect_circular_references generates warning for mta_ key'
);
};
subtest
'Multiple mta_ values in one alias'
=>
sub
{
my
$aliases
= {
'multi'
=>
'mta_service1, mta_service2, email@example.com'
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
$result
=
$resolver
->resolve_recipients([
'multi'
]);
cmp_bag(
$result
->{mta_aliases}, [
'service1'
,
'service2'
],
'Multiple mta_ services correctly processed'
);
like(
$result
->{recipients},
qr/service1/
,
'First MTA service in recipients'
);
like(
$result
->{recipients},
qr/service2/
,
'Second MTA service in recipients'
);
like(
$result
->{recipients},
qr/email\@example\.com/
,
'Email in recipients'
);
};
subtest
'Multiple direct mta_ prefixed aliases'
=>
sub
{
my
$aliases
= {
'normal'
=>
'test@example.com'
};
my
$resolver
= Mail::Alias::LocalFile->new(
aliases
=>
$aliases
);
my
$result
=
$resolver
->resolve_recipients([
'mta_direct1'
,
'mta_direct2'
]);
is_deeply(
$result
->{mta_aliases}, [],
'Multiple direct mta_ prefixed aliases all skipped'
);
is(
$result
->{recipients},
''
,
'Recipients is empty when only direct mta_ prefixed aliases are provided'
);
my
$warning_count
=
scalar
grep
{ /ERROR: Alias
keys
with
'mta_'
prefix are not allowed/ } @{
$result
->{warning}};
is(
$warning_count
, 2,
'Warnings generated for all direct mta_ prefixed aliases'
);
};
done_testing();