]> Sergey Matveev's repositories - public-inbox.git/blobdiff - t/watch_maildir_v2.t
mda, watch: wire up List-ID header support
[public-inbox.git] / t / watch_maildir_v2.t
index 85130e3c0e432a99dd0b4fe60e7822f624723e7d..99551ceb7d51191c8dac2cab0482ed50e013bac2 100644 (file)
@@ -1,16 +1,18 @@
-# Copyright (C) 2018 all contributors <meta@public-inbox.org>
+# Copyright (C) 2018-2019 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use Test::More;
 use File::Temp qw/tempdir/;
 use PublicInbox::MIME;
 use Cwd;
 use PublicInbox::Config;
-my @mods = qw(Filesys::Notify::Simple PublicInbox::V2Writable);
+require './t/common.perl';
+require_git(2.6);
+my @mods = qw(Search::Xapian DBD::SQLite Filesys::Notify::Simple);
 foreach my $mod (@mods) {
        eval "require $mod";
        plan skip_all => "$mod missing for watch_maildir_v2.t" if $@;
 }
-
+require PublicInbox::V2Writable;
 my $tmpdir = tempdir('watch_maildir-v2-XXXXXX', TMPDIR => 1, CLEANUP => 1);
 my $mainrepo = "$tmpdir/v2";
 my $maildir = "$tmpdir/md";
@@ -38,20 +40,21 @@ ok(POSIX::mkfifo("$maildir/cur/fifo", 0777),
        'create FIFO to ensure we do not get stuck on it :P');
 my $sem = PublicInbox::Emergency->new($spamdir); # create dirs
 
-my $config = PublicInbox::Config->new({
-       "$cfgpfx.address" => $addr,
-       "$cfgpfx.mainrepo" => $mainrepo,
-       "$cfgpfx.watch" => "maildir:$maildir",
-       "$cfgpfx.filter" => 'PublicInbox::Filter::Vger',
-       "publicinboxlearn.watchspam" => "maildir:$spamdir",
-});
+my $orig = <<EOF;
+$cfgpfx.address=$addr
+$cfgpfx.mainrepo=$mainrepo
+$cfgpfx.watch=maildir:$maildir
+$cfgpfx.filter=PublicInbox::Filter::Vger
+publicinboxlearn.watchspam=maildir:$spamdir
+EOF
+my $config = PublicInbox::Config->new(\$orig);
 my $ibx = $config->lookup_name('test');
 ok($ibx, 'found inbox by name');
 my $srch = $ibx->search;
 
 PublicInbox::WatchMaildir->new($config)->scan('full');
-my $res = $srch->reopen->query('');
-is($res->{total}, 1, 'got one revision');
+my ($total, undef) = $srch->reopen->query('');
+is($total, 1, 'got one revision');
 
 # my $git = PublicInbox::Git->new("$mainrepo/git/0.git");
 # my @list = $git->qx(qw(rev-list refs/heads/master));
@@ -70,7 +73,7 @@ my $write_spam = sub {
 $write_spam->();
 is(unlink(glob("$maildir/new/*")), 1, 'unlinked old spam');
 PublicInbox::WatchMaildir->new($config)->scan('full');
-is($srch->reopen->query('')->{total}, 0, 'deleted file');
+is(($srch->reopen->query(''))[0], 0, 'deleted file');
 
 # check with scrubbing
 {
@@ -80,16 +83,16 @@ the body of a message to majordomo\@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
        PublicInbox::Emergency->new($maildir)->prepare(\$msg);
        PublicInbox::WatchMaildir->new($config)->scan('full');
-       $res = $srch->reopen->query('');
-       is($res->{total}, 1, 'got one file back');
-       my $mref = $ibx->msg_by_smsg($res->{msgs}->[0]);
+       my ($nr, $msgs) = $srch->reopen->query('');
+       is($nr, 1, 'got one file back');
+       my $mref = $ibx->msg_by_smsg($msgs->[0]);
        like($$mref, qr/something\n\z/s, 'message scrubbed on import');
 
        is(unlink(glob("$maildir/new/*")), 1, 'unlinked spam');
        $write_spam->();
        PublicInbox::WatchMaildir->new($config)->scan('full');
-       $res = $srch->reopen->query('');
-       is($res->{total}, 0, 'inbox is empty again');
+       ($nr, $msgs) = $srch->reopen->query('');
+       is($nr, 0, 'inbox is empty again');
 }
 
 {
@@ -103,8 +106,8 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
                local $SIG{__WARN__} = sub {}; # quiet spam check warning
                PublicInbox::WatchMaildir->new($config)->scan('full');
        }
-       $res = $srch->reopen->query('');
-       is($res->{total}, 0, 'inbox is still empty');
+       ($nr, $msgs) = $srch->reopen->query('');
+       is($nr, 0, 'inbox is still empty');
        is(unlink(glob("$maildir/new/*")), 1);
 }
 
@@ -116,10 +119,87 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
        PublicInbox::Emergency->new($maildir)->prepare(\$msg);
        $config->{'publicinboxwatch.spamcheck'} = 'spamc';
        PublicInbox::WatchMaildir->new($config)->scan('full');
-       $res = $srch->reopen->query('');
-       is($res->{total}, 1, 'inbox has one mail after spamc OK-ed a message');
-       my $mref = $ibx->msg_by_smsg($res->{msgs}->[0]);
+       ($nr, $msgs) = $srch->reopen->query('');
+       is($nr, 1, 'inbox has one mail after spamc OK-ed a message');
+       my $mref = $ibx->msg_by_smsg($msgs->[0]);
        like($$mref, qr/something\n\z/s, 'message scrubbed on import');
+       delete $config->{'publicinboxwatch.spamcheck'};
+}
+
+{
+       my $patch = 't/data/0001.patch';
+       open my $fh, '<', $patch or die "failed to open $patch: $!\n";
+       $msg = eval { local $/; <$fh> };
+       PublicInbox::Emergency->new($maildir)->prepare(\$msg);
+       PublicInbox::WatchMaildir->new($config)->scan('full');
+       ($nr, $msgs) = $srch->reopen->query('dfpost:6e006fd7');
+       is($nr, 1, 'diff postimage found');
+       my $post = $msgs->[0];
+       ($nr, $msgs) = $srch->query('dfpre:090d998b6c2c');
+       is($nr, 1, 'diff preimage found');
+       is($post->{blob}, $msgs->[0]->{blob}, 'same message');
+}
+
+# multiple inboxes in the same maildir
+{
+       my $v1repo = "$tmpdir/v1";
+       my $v1pfx = "publicinbox.v1";
+       my $v1addr = 'v1-public@example.com';
+       is(system(qw(git init -q --bare), $v1repo), 0, 'v1 init OK');
+       my $cfg2 = <<EOF;
+$orig$v1pfx.address=$v1addr
+$v1pfx.mainrepo=$v1repo
+$v1pfx.watch=maildir:$maildir
+EOF
+       my $config = PublicInbox::Config->new(\$cfg2);
+       my $both = <<EOF;
+From: user\@example.com
+To: $addr, $v1addr
+Subject: both
+Message-Id: <both\@b.com>
+Date: Sat, 18 Jun 2016 00:00:00 +0000
+
+both
+EOF
+       PublicInbox::Emergency->new($maildir)->prepare(\$both);
+       PublicInbox::WatchMaildir->new($config)->scan('full');
+       my ($total, $msgs) = $srch->reopen->query('m:both@b.com');
+       my $v1 = $config->lookup_name('v1');
+       my $msg = $v1->git->cat_file($msgs->[0]->{blob});
+       is($both, $$msg, 'got original message back from v1');
+       $msg = $ibx->git->cat_file($msgs->[0]->{blob});
+       is($both, $$msg, 'got original message back from v2');
+}
+
+{
+       my $want = <<'EOF';
+From: <u@example.com>
+List-Id: <i.want.you.to.want.me>
+Message-ID: <do.want@example.com>
+EOF
+       my $do_not_want = <<'EOF';
+From: <u@example.com>
+List-Id: <do.not.want>
+X-Mailing-List: no@example.com
+Message-ID: <do.not.want@example.com>
+EOF
+       my $cfg = $orig."$cfgpfx.listid=i.want.you.to.want.me\n";
+       PublicInbox::Emergency->new($maildir)->prepare(\$want);
+       PublicInbox::Emergency->new($maildir)->prepare(\$do_not_want);
+       my $config = PublicInbox::Config->new(\$cfg);
+       PublicInbox::WatchMaildir->new($config)->scan('full');
+       $ibx = $config->lookup_name('test');
+       my $num = $ibx->mm->num_for('do.want@example.com');
+       ok(defined $num, 'List-ID matched for watch');
+       $num = $ibx->mm->num_for('do.not.want@example.com');
+       is($num, undef, 'unaccepted List-ID matched for watch');
+
+       $cfg = $orig."$cfgpfx.watchheader=X-Mailing-List:no\@example.com\n";
+       $config = PublicInbox::Config->new(\$cfg);
+       PublicInbox::WatchMaildir->new($config)->scan('full');
+       $ibx = $config->lookup_name('test');
+       $num = $ibx->mm->num_for('do.not.want@example.com');
+       ok(defined $num, 'X-Mailing-List matched');
 }
 
 done_testing;