X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fwatch_maildir_v2.t;h=7b46232b36beab4473437f0505b3db5ab705396a;hb=refs%2Fheads%2Fmaster;hp=85130e3c0e432a99dd0b4fe60e7822f624723e7d;hpb=6c2caa791bd5fbf5c4edb1a4a2c1807e527348a7;p=public-inbox.git diff --git a/t/watch_maildir_v2.t b/t/watch_maildir_v2.t index 85130e3c..7b46232b 100644 --- a/t/watch_maildir_v2.t +++ b/t/watch_maildir_v2.t @@ -1,28 +1,27 @@ -# Copyright (C) 2018 all contributors +# Copyright (C) 2018-2021 all contributors # License: AGPL-3.0+ +use strict; use Test::More; -use File::Temp qw/tempdir/; -use PublicInbox::MIME; +use PublicInbox::Eml; use Cwd; use PublicInbox::Config; -my @mods = qw(Filesys::Notify::Simple PublicInbox::V2Writable); -foreach my $mod (@mods) { - eval "require $mod"; - plan skip_all => "$mod missing for watch_maildir_v2.t" if $@; -} - -my $tmpdir = tempdir('watch_maildir-v2-XXXXXX', TMPDIR => 1, CLEANUP => 1); -my $mainrepo = "$tmpdir/v2"; +use PublicInbox::TestCommon; +use PublicInbox::Import; +require_git(2.6); +require_mods(qw(Search::Xapian DBD::SQLite)); +require PublicInbox::V2Writable; +my ($tmpdir, $for_destroy) = tmpdir(); +my $inboxdir = "$tmpdir/v2"; my $maildir = "$tmpdir/md"; my $spamdir = "$tmpdir/spam"; -use_ok 'PublicInbox::WatchMaildir'; +use_ok 'PublicInbox::Watch'; use_ok 'PublicInbox::Emergency'; my $cfgpfx = "publicinbox.test"; my $addr = 'test-public@example.com'; -my @cmd = ('blib/script/public-inbox-init', '-V2', 'test', $mainrepo, +my @cmd = ('-init', '-V2', 'test', $inboxdir, 'http://example.com/v2list', $addr); local $ENV{PI_CONFIG} = "$tmpdir/pi_config"; -is(system(@cmd), 0, 'public-inbox init OK'); +ok(run_script(\@cmd), 'public-inbox init OK'); my $msg = <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 $ibx = $config->lookup_name('test'); +my $orig = <new(\$orig); +my $ibx = $cfg->lookup_name('test'); ok($ibx, 'found inbox by name'); -my $srch = $ibx->search; +$ibx->{-no_fsync} = 1; -PublicInbox::WatchMaildir->new($config)->scan('full'); -my $res = $srch->reopen->query(''); -is($res->{total}, 1, 'got one revision'); +PublicInbox::Watch->new($cfg)->scan('full'); +my $total = scalar @{$ibx->over->recent}; +is($total, 1, 'got one revision'); -# my $git = PublicInbox::Git->new("$mainrepo/git/0.git"); +# my $git = PublicInbox::Git->new("$inboxdir/git/0.git"); # my @list = $git->qx(qw(rev-list refs/heads/master)); # is(scalar @list, 1, 'one revision in rev-list'); @@ -69,8 +69,9 @@ 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'); +PublicInbox::Watch->new($cfg)->scan('full'); +is_deeply($ibx->over->recent, [], 'deleted file'); +is(unlink(glob("$spamdir/cur/*")), 1, 'unlinked trained spam'); # check with scrubbing { @@ -79,17 +80,18 @@ To unsubscribe from this list: send the line "unsubscribe git" in 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]); + PublicInbox::Watch->new($cfg)->scan('full'); + my $msgs = $ibx->over->recent; + is(scalar(@$msgs), 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'); + PublicInbox::Watch->new($cfg)->scan('full'); + $msgs = $ibx->over->recent; + is(scalar(@$msgs), 0, 'inbox is empty again'); + is(unlink(glob("$spamdir/cur/*")), 1, 'unlinked trained spam'); } { @@ -98,13 +100,13 @@ More majordomo info at http://vger.kernel.org/majordomo-info.html\n); my $fail_path = "$fail_bin:$ENV{PATH}"; # for spamc ham mock local $ENV{PATH} = $fail_path; PublicInbox::Emergency->new($maildir)->prepare(\$msg); - $config->{'publicinboxwatch.spamcheck'} = 'spamc'; + $cfg->{'publicinboxwatch.spamcheck'} = 'spamc'; { local $SIG{__WARN__} = sub {}; # quiet spam check warning - PublicInbox::WatchMaildir->new($config)->scan('full'); + PublicInbox::Watch->new($cfg)->scan('full'); } - $res = $srch->reopen->query(''); - is($res->{total}, 0, 'inbox is still empty'); + my $msgs = $ibx->over->recent; + is(scalar(@$msgs), 0, 'inbox is still empty'); is(unlink(glob("$maildir/new/*")), 1); } @@ -114,12 +116,92 @@ More majordomo info at http://vger.kernel.org/majordomo-info.html\n); my $main_path = "$main_bin:$ENV{PATH}"; # for spamc ham mock local $ENV{PATH} = $main_path; 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]); + $cfg->{'publicinboxwatch.spamcheck'} = 'spamc'; + PublicInbox::Watch->new($cfg)->scan('full'); + my $msgs = $ibx->over->recent; + is(scalar(@$msgs), 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 $cfg->{'publicinboxwatch.spamcheck'}; +} + +{ + my $patch = 't/data/0001.patch'; + open my $fh, '<', $patch or die "failed to open $patch: $!\n"; + $msg = do { local $/; <$fh> }; + PublicInbox::Emergency->new($maildir)->prepare(\$msg); + PublicInbox::Watch->new($cfg)->scan('full'); + my $post = $ibx->search->reopen->mset('dfpost:6e006fd7'); + is($post->size, 1, 'diff postimage found'); + my $pre = $ibx->search->mset('dfpre:090d998b6c2c'); + is($pre->size, 1, 'diff preimage found'); + $pre = $ibx->search->mset_to_smsg($ibx, $pre); + $post = $ibx->search->mset_to_smsg($ibx, $post); + is(scalar(@$pre), 1, 'diff preimage found'); + is($post->[0]->{blob}, $pre->[0]->{blob}, 'same message'); +} + +# multiple inboxes in the same maildir +{ + my $v1repo = "$tmpdir/v1"; + my $v1pfx = "publicinbox.v1"; + my $v1addr = 'v1-public@example.com'; + PublicInbox::Import::init_bare($v1repo); + my $raw = <new(\$raw); + my $both = < +Date: Sat, 18 Jun 2016 00:00:00 +0000 + +both +EOF + PublicInbox::Emergency->new($maildir)->prepare(\$both); + PublicInbox::Watch->new($cfg)->scan('full'); + my $mset = $ibx->search->reopen->mset('m:both@b.com'); + my $msgs = $ibx->search->mset_to_smsg($ibx, $mset); + my $v1 = $cfg->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: +List-Id: +Message-ID: +EOF + my $do_not_want = <<'EOF'; +From: +List-Id: +X-Mailing-List: no@example.com +Message-ID: +EOF + my $raw = $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 $cfg = PublicInbox::Config->new(\$raw); + PublicInbox::Watch->new($cfg)->scan('full'); + $ibx = $cfg->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'); + + $raw = $orig."$cfgpfx.watchheader=X-Mailing-List:no\@example.com\n"; + $cfg = PublicInbox::Config->new(\$raw); + PublicInbox::Watch->new($cfg)->scan('full'); + $ibx = $cfg->lookup_name('test'); + $num = $ibx->mm->num_for('do.not.want@example.com'); + ok(defined $num, 'X-Mailing-List matched'); } done_testing;