]> Sergey Matveev's repositories - public-inbox.git/blobdiff - t/psgi_search.t
update copyrights for 2021
[public-inbox.git] / t / psgi_search.t
index 4ff25eb2e9b6d0e617d1edf9e70b4816aabdf15b..8ba431bcae7c92c90f6ab14fbc8d34558f7cffa7 100644 (file)
@@ -1,9 +1,10 @@
-# Copyright (C) 2017-2019 all contributors <meta@public-inbox.org>
+# Copyright (C) 2017-2021 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict;
 use warnings;
 use Test::More;
-use Email::MIME;
+use IO::Uncompress::Gunzip qw(gunzip);
+use PublicInbox::Eml;
 use PublicInbox::Config;
 use PublicInbox::Inbox;
 use PublicInbox::InboxWritable;
@@ -14,6 +15,7 @@ my @mods = qw(DBD::SQLite Search::Xapian HTTP::Request::Common Plack::Test
 require_mods(@mods);
 use_ok($_) for (qw(HTTP::Request::Common Plack::Test));
 use_ok 'PublicInbox::WWW';
+use_ok 'PublicInbox::SearchIdx';
 my ($tmpdir, $for_destroy) = tmpdir();
 
 my $ibx = PublicInbox::Inbox->new({
@@ -27,8 +29,10 @@ my $im = $ibx->importer(0);
 my $digits = '10010260936330';
 my $ua = 'Pine.LNX.4.10';
 my $mid = "$ua.$digits.2460-100000\@penguin.transmeta.com";
-my $mime = PublicInbox::MIME->new(<<EOF);
-Subject: test
+
+# n.b. these headers are not properly RFC2047-encoded
+my $mime = PublicInbox::Eml->new(<<EOF);
+Subject: test Ævar
 Message-ID: <$mid>
 From: Ævar Arnfjörð Bjarmason <avarab\@example>
 To: git\@vger.kernel.org
@@ -36,7 +40,13 @@ To: git\@vger.kernel.org
 EOF
 $im->add($mime);
 
-$mime = PublicInbox::MIME->new(<<'EOF');
+$im->add(PublicInbox::Eml->new(<<""));
+Message-ID: <reply\@asdf>
+From: replier <r\@example.com>
+In-Reply-To: <$mid>
+Subject: mismatch
+
+$mime = PublicInbox::Eml->new(<<'EOF');
 Subject:
 Message-ID: <blank-subject@example.com>
 From: blank subject <blank-subject@example.com>
@@ -45,7 +55,7 @@ To: git@vger.kernel.org
 EOF
 $im->add($mime);
 
-$mime = PublicInbox::MIME->new(<<'EOF');
+$mime = PublicInbox::Eml->new(<<'EOF');
 Message-ID: <no-subject-at-all@example.com>
 From: no subject at all <no-subject-at-all@example.com>
 To: git@vger.kernel.org
@@ -57,11 +67,11 @@ $im->done;
 PublicInbox::SearchIdx->new($ibx, 1)->index_sync;
 
 my $cfgpfx = "publicinbox.test";
-my $config = PublicInbox::Config->new(\<<EOF);
+my $cfg = PublicInbox::Config->new(\<<EOF);
 $cfgpfx.address=git\@vger.kernel.org
 $cfgpfx.inboxdir=$tmpdir
 EOF
-my $www = PublicInbox::WWW->new($config);
+my $www = PublicInbox::WWW->new($cfg);
 test_psgi(sub { $www->call(@_) }, sub {
        my ($cb) = @_;
        my $res;
@@ -76,6 +86,9 @@ test_psgi(sub { $www->call(@_) }, sub {
        ok(index($html, 'by &#198;var Arnfj&#246;r&#240; Bjarmason') >= 0,
                "displayed Ævar's name properly in HTML");
 
+       like($html, qr/download mbox\.gz: .*?"full threads"/s,
+               '"full threads" download option shown');
+
        my $warn = [];
        local $SIG{__WARN__} = sub { push @$warn, @_ };
        $res = $cb->(GET('/test/?q=s:test&l=5e'));
@@ -101,6 +114,8 @@ test_psgi(sub { $www->call(@_) }, sub {
                'subject-less message linked from "/$INBOX/"');
        like($html, qr/\bhref="blank-subject[^>]+>\(no subject\)</,
                'blank subject message linked from "/$INBOX/"');
+       like($html, qr/test &#198;var/,
+               "displayed Ævar's name properly in topic view");
 
        $res = $cb->(GET('/test/?q=tc:git'));
        like($html, qr/\bhref="no-subject-at-all[^>]+>\(no subject\)</,
@@ -113,8 +128,33 @@ test_psgi(sub { $www->call(@_) }, sub {
        $res = $cb->(GET('/test/no-subject-at-all@example.com/t.mbox.gz'));
        like($res->header('Content-Disposition'),
                qr/filename=no-subject\.mbox\.gz/);
+
+       # "full threads" mbox.gz download
+       $res = $cb->(POST('/test/?q=s:test&x=m&t'));
+       is($res->code, 200, 'successful mbox download with threads');
+       gunzip(\($res->content) => \(my $before));
+       is_deeply([ "Message-ID: <$mid>\n", "Message-ID: <reply\@asdf>\n" ],
+               [ grep(/^Message-ID:/m, split(/^/m, $before)) ],
+               'got full thread');
+
+       # clobber has_threadid to emulate old versions:
+       {
+               my $sidx = PublicInbox::SearchIdx->new($ibx, 0);
+               my $xdb = $sidx->idx_acquire;
+               $xdb->set_metadata('has_threadid', '0');
+               $sidx->idx_release;
+       }
+       $cfg->each_inbox(sub { delete $_[0]->{search} });
+       $res = $cb->(GET('/test/?q=s:test'));
+       is($res->code, 200, 'successful search w/o has_threadid');
+       unlike($html, qr/download mbox\.gz: .*?"full threads"/s,
+               '"full threads" download option not shown w/o has_threadid');
+
+       # in case somebody uses curl to bypass <form>
+       $res = $cb->(POST('/test/?q=s:test&x=m&t'));
+       is($res->code, 200, 'successful mbox download w/ threads');
+       gunzip(\($res->content) => \(my $after));
+       isnt($before, $after);
 });
 
 done_testing();
-
-1;