Skip to content

Commit

Permalink
Add t/Request_Handler_add+del.t
Browse files Browse the repository at this point in the history
  • Loading branch information
ikedas committed Nov 12, 2021
1 parent 7098dfc commit 43c087c
Showing 1 changed file with 243 additions and 0 deletions.
243 changes: 243 additions & 0 deletions t/Request_Handler_add+del.t
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};
}
}

0 comments on commit 43c087c

Please sign in to comment.