X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fcgi.t;h=366d6594bb007ca2f36d0e69b74b52db9410fe98;hb=6e2da35b9e9e5510e3156b07e91ebc835146758c;hp=1b4b06cb5eb47bb205ae128c9b53ee3e6e167307;hpb=fece7fca6aeac74410a813cffcb0da338017d0ed;p=public-inbox.git diff --git a/t/cgi.t b/t/cgi.t index 1b4b06cb..366d6594 100644 --- a/t/cgi.t +++ b/t/cgi.t @@ -1,57 +1,51 @@ -# Copyright (C) 2014-2019 all contributors +# Copyright (C) 2014-2020 all contributors # License: AGPL-3.0+ # FIXME: this test is too slow and most non-CGI-requirements # should be moved over to things which use test_psgi use strict; use warnings; use Test::More; -use Email::MIME; -use File::Temp qw/tempdir/; -eval { require IPC::Run }; -plan skip_all => "missing IPC::Run for t/cgi.t" if $@; - -use constant CGI => "blib/script/public-inbox.cgi"; -my $tmpdir = tempdir('pi-cgi-XXXXXX', TMPDIR => 1, CLEANUP => 1); +use PublicInbox::Eml; +use PublicInbox::TestCommon; +use PublicInbox::Import; +require_mods(qw(Plack::Handler::CGI Plack::Util)); +my ($tmpdir, $for_destroy) = tmpdir(); my $home = "$tmpdir/pi-home"; my $pi_home = "$home/.public-inbox"; my $pi_config = "$pi_home/config"; my $maindir = "$tmpdir/main.git"; my $addr = 'test-public@example.com'; -my $cfgpfx = "publicinbox.test"; { is(1, mkdir($home, 0755), "setup ~/ for testing"); is(1, mkdir($pi_home, 0755), "setup ~/.public-inbox"); - is(0, system(qw(git init -q --bare), $maindir), "git init (main)"); + PublicInbox::Import::init_bare($maindir); open my $fh, '>', "$maindir/description" or die "open: $!\n"; print $fh "test for public-inbox\n"; close $fh or die "close: $!\n"; - my %cfg = ( - "$cfgpfx.address" => $addr, - "$cfgpfx.inboxdir" => $maindir, - "$cfgpfx.indexlevel" => 'basic', - ); - while (my ($k,$v) = each %cfg) { - is(0, system(qw(git config --file), $pi_config, $k, $v), - "setup $k"); - } + open $fh, '>>', $pi_config or die; + print $fh <new($pi_config); my $ibx = $cfg->lookup_name('test'); -my $im = PublicInbox::InboxWritable->new($ibx)->importer; +my $im = PublicInbox::InboxWritable->new($ibx)->importer(0); { local $ENV{HOME} = $home; # inject some messages: - my $mime = Email::MIME->new(<new(< To: You Cc: $addr @@ -61,10 +55,14 @@ Date: Thu, 01 Jan 1970 00:00:00 +0000 zzzzzz EOF - $im->add($mime); + ok($im->add($mime), 'added initial message'); + + $mime->header_set('Message-ID', ''); + $mime->body_str_set("z\n" x 1024); + ok($im->add($mime), 'added big message'); # deliver a reply, too - my $reply = Email::MIME->new(<new(< To: Me Cc: $addr @@ -78,10 +76,10 @@ Me wrote: what? EOF - $im->add($reply); + ok($im->add($mime), 'added reply'); my $slashy_mid = 'slashy/asdf@example.com'; - my $slashy = Email::MIME->new(<new(< To: Me Cc: $addr @@ -91,7 +89,7 @@ Date: Thu, 01 Jan 1970 00:00:01 +0000 slashy EOF - $im->add($slashy); + ok($im->add($slashy), 'added slash'); $im->done; my $res = cgi_run("/test/slashy/asdf\@example.com/raw"); @@ -105,14 +103,9 @@ EOF my $path = "/test/blahblah\@example.com/t.mbox.gz"; my $res = cgi_run($path); like($res->{head}, qr/^Status: 501 /, "search not-yet-enabled"); - my $indexed; - eval { - require DBD::SQLite; - require PublicInbox::SearchIdx; - my $s = PublicInbox::SearchIdx->new($ibx, 1); - $s->index_sync; - $indexed = 1; - }; + my $cmd = ['-index', $ibx->{inboxdir}, '--max-size=2k']; + my $opt = { 2 => \(my $err) }; + my $indexed = run_script($cmd, undef, $opt); if ($indexed) { $res = cgi_run($path); like($res->{head}, qr/^Status: 200 /, "search returned mbox"); @@ -123,33 +116,34 @@ EOF IO::Uncompress::Gunzip::gunzip(\$in => \$out); like($out, qr/^From /m, "From lines in mbox"); }; + $res = cgi_run('/test/toobig@example.com/'); + like($res->{head}, qr/^Status: 300 /, + 'did not index or return >max-size message'); + like($err, qr/skipping [a-f0-9]{40,}/, + 'warned about skipping large OID'); } else { like($res->{head}, qr/^Status: 501 /, "search not available"); - SKIP: { skip 'DBD::SQLite not available', 2 }; + SKIP: { skip 'DBD::SQLite not available', 4 }; } - my $have_xml_feed = eval { require XML::Feed; 1 } if $indexed; - if ($have_xml_feed) { + my $have_xml_treepp = eval { require XML::TreePP; 1 } if $indexed; + if ($have_xml_treepp) { $path = "/test/blahblah\@example.com/t.atom"; $res = cgi_run($path); like($res->{head}, qr/^Status: 200 /, "atom returned 200"); like($res->{head}, qr!^Content-Type: application/atom\+xml!m, "search returned atom"); - my $p = XML::Feed->parse(\($res->{body})); - is($p->format, "Atom", "parsed atom feed"); - is(scalar $p->entries, 3, "parsed three entries"); + my $t = XML::TreePP->new->parse($res->{body}); + is(scalar @{$t->{feed}->{entry}}, 3, "parsed three entries"); + like($t->{feed}->{-xmlns}, qr/\bAtom\b/, + 'looks like an an Atom feed'); } else { - SKIP: { skip 'DBD::SQLite or XML::Feed missing', 2 }; + SKIP: { skip 'DBD::SQLite or XML::TreePP missing', 2 }; } } done_testing(); -sub run_with_env { - my ($env, @args) = @_; - IPC::Run::run(@args, init => sub { %ENV = (%ENV, %$env) }); -} - sub cgi_run { my %env = ( PATH_INFO => $_[0], @@ -162,7 +156,9 @@ sub cgi_run { HTTP_HOST => 'test.example.com', ); my ($in, $out, $err) = ("", "", ""); - my $rc = run_with_env(\%env, [CGI], \$in, \$out, \$err); + my $rdr = { 0 => \$in, 1 => \$out, 2 => \$err }; + run_script(['.cgi'], \%env, $rdr); + die "unexpected error: \$?=$?" if $?; my ($head, $body) = split(/\r\n\r\n/, $out, 2); - { head => $head, body => $body, rc => $rc, err => $err } + { head => $head, body => $body, err => $err } }