-
Notifications
You must be signed in to change notification settings - Fork 103
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
243 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,243 @@ | ||
# -*- indent-tabs-mode: nil; -*- | ||
# vim:ft=perl:et:sw=4 | ||
|
||
use strict; | ||
use warnings; | ||
use English qw(-no_match_vars); | ||
use File::Temp qw(); | ||
use Test::More; | ||
|
||
use Sympa::DatabaseManager; | ||
use Sympa::List; | ||
use Sympa::Spindle::ProcessRequest; | ||
|
||
BEGIN { | ||
eval 'use DBD::SQLite'; | ||
} | ||
unless ($DBD::SQLite::VERSION) { | ||
plan skip_all => 'DBD::SQLite required'; | ||
} | ||
|
||
{ | ||
no warnings 'redefine'; | ||
*Sympa::send_notify_to_listmaster = sub {1}; | ||
*Sympa::Log::syslog = sub {1}; | ||
} | ||
|
||
my $listname = 'test'; | ||
|
||
my $tempdir = File::Temp->newdir(CLEANUP => ($ENV{TEST_DEBUG} ? 0 : 1)); | ||
%Conf::Conf = ( | ||
domain => 'mail.example.org', | ||
listmaster => '[email protected]', | ||
lang => 'en-US', | ||
db_type => 'SQLite', | ||
db_name => ':memory:', | ||
update_db_field_types => 'auto', | ||
|
||
queuesubscribe => $tempdir . '/auth', | ||
bounce_path => $tempdir . '/bounce', | ||
); | ||
mkdir $Conf::Conf{queuesubscribe}; | ||
mkdir $Conf::Conf{bounce_path}; | ||
mkdir $Conf::Conf{bounce_path} . '/' . $listname . '@' . $Conf::Conf{domain}; | ||
|
||
Sympa::DatabaseManager::probe_db(); | ||
|
||
my $fake_list = bless { | ||
name => $listname, | ||
domain => $Conf::Conf{'domain'}, | ||
admin => {available_user_options => {reception => [qw(mail)],},}, | ||
} => 'Sympa::List'; | ||
|
||
#FIXME | ||
$SIG{__WARN__} = sub { | ||
print @_ unless 0 == index $_[0], 'Use of uninitialized value'; | ||
}; | ||
|
||
# Now do testing | ||
|
||
my $member_none = '[email protected]'; | ||
my $member1 = ['[email protected]', 'Member 1']; | ||
my $owner_none = '[email protected]'; | ||
my $owner1 = ['owner', '[email protected]', 'Owner 1']; | ||
my $editor_none = '[email protected]'; | ||
my $editor1 = ['editor', '[email protected]', 'Editor 1']; | ||
my $editor2 = ['editor', '[email protected]', 'Editor 2']; | ||
my $editor3 = ['editor', '[email protected]', 'Editor 3']; | ||
|
||
do_test( | ||
request => { | ||
action => 'add', | ||
email => $member1->[0], | ||
gecos => $member1->[1], | ||
}, | ||
result => [[qw(user list_not_open)]], | ||
data => [], | ||
name => 'add subscriber: List not open' | ||
); | ||
$fake_list->{'admin'}{'status'} = 'open'; | ||
do_test( | ||
request => { | ||
action => 'add', | ||
email => $member1->[0], | ||
gecos => $member1->[1], | ||
}, | ||
data => [$member1], | ||
name => 'add subscriber' | ||
); | ||
do_test( | ||
request => { | ||
action => 'add', | ||
email => $member1->[0], | ||
gecos => $member1->[1], | ||
}, | ||
result => [[qw(user already_subscriber)]], | ||
data => [$member1], | ||
name => 'add subscriber: Already subscriber' | ||
); | ||
do_test( | ||
request => { | ||
action => 'add', | ||
role => 'owner', | ||
email => $owner1->[1], | ||
gecos => $owner1->[2], | ||
}, | ||
data => [$owner1], | ||
name => 'add owner' | ||
); | ||
do_test( | ||
request => { | ||
action => 'add', | ||
role => 'editor', | ||
email => $editor1->[1], | ||
gecos => $editor1->[2], | ||
}, | ||
data => [$editor1, $owner1], | ||
name => 'add moderator' | ||
); | ||
do_test( | ||
request => { | ||
action => 'add', | ||
role => 'owner', | ||
email => $owner1->[1], | ||
}, | ||
result => [[qw(user already_user)]], | ||
data => [$editor1, $owner1], | ||
name => 'add owner: Already owner' | ||
); | ||
do_test( | ||
request => { | ||
action => 'add', | ||
role => 'editor', | ||
email => [map { $_->[1] } ($editor1, $editor2, $editor3)], | ||
gecos => [map { $_->[2] } ($editor1, $editor2, $editor3)], | ||
}, | ||
result => [[qw(user already_user)], [qw(notice add_performed)]], | ||
data => [$editor1, $editor2, $editor3, $owner1], | ||
name => 'add moderators' | ||
); | ||
|
||
do_test( | ||
request => { | ||
action => 'del', | ||
email => $member_none, | ||
}, | ||
result => [[qw(user user_not_subscriber)]], | ||
data => [$member1], | ||
name => 'del subscriber: Not a subscriber' | ||
); | ||
do_test( | ||
request => { | ||
action => 'del', | ||
email => $member1->[0], | ||
}, | ||
data => [], | ||
name => 'del subscriber' | ||
); | ||
do_test( | ||
request => { | ||
action => 'del', | ||
role => 'owner', | ||
email => $owner_none, | ||
}, | ||
result => [[qw(user user_not_admin)]], | ||
data => [$editor1, $editor2, $editor3, $owner1], | ||
name => 'del owner: Not a owner' | ||
); | ||
do_test( | ||
request => { | ||
action => 'del', | ||
role => 'owner', | ||
email => $owner1->[1], | ||
}, | ||
data => [$editor1, $editor2, $editor3], | ||
name => 'del owner' | ||
); | ||
do_test( | ||
request => { | ||
action => 'del', | ||
role => 'editor', | ||
email => | ||
[$editor_none, map { $_->[1] } ($editor1, $editor2, $editor3)], | ||
}, | ||
result => [[qw(user user_not_admin)], [qw(notice removed)]], | ||
data => [], | ||
name => 'del moderators' | ||
); | ||
|
||
done_testing(); | ||
|
||
sub do_test { | ||
my %options = @_; | ||
|
||
my @stash; | ||
my $spindle = Sympa::Spindle::ProcessRequest->new( | ||
context => $fake_list, | ||
%{$options{request}}, | ||
sender => $Conf::Conf{listmaster}, | ||
stash => \@stash, | ||
scenario_context => {skip => 1}, | ||
); | ||
die unless $spindle and $spindle->spin; | ||
|
||
if ($options{result}) { | ||
unless ( | ||
grep { | ||
my $s = $_; | ||
grep { $_->[0] eq $s->[1] and $_->[1] eq $s->[2] } | ||
@{$options{result}} | ||
} @stash | ||
) { | ||
fail $options{name}; | ||
diag 'No result ' . join "\n", | ||
map { sprintf '"%s" "%s"', @$_ } @{$options{result}}; | ||
diag join "\n", map { join ',', @$_ } @stash; | ||
} | ||
} elsif ( | ||
grep { | ||
$_->[1] ne 'notice' | ||
} @stash | ||
) { | ||
fail $options{name}; | ||
diag join "\n", map { join ',', @$_ } @stash; | ||
} | ||
|
||
return unless $options{data}; | ||
|
||
my $sdm = Sympa::DatabaseManager->instance or die; | ||
if ('member' eq ($options{request}->{role} // 'member')) { | ||
is_deeply $sdm->do_prepared_query( | ||
q{SELECT user_subscriber, comment_subscriber | ||
FROM subscriber_table | ||
ORDER BY user_subscriber} | ||
)->fetchall_arrayref, $options{data}, $options{name}; | ||
} else { | ||
is_deeply $sdm->do_prepared_query( | ||
q{SELECT role_admin, user_admin, comment_admin | ||
FROM admin_table | ||
ORDER BY user_admin} | ||
)->fetchall_arrayref, $options{data}, $options{name}; | ||
} | ||
} | ||
|