X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fplack.t;h=f0dc4bbb515777299d437d13ec801f6494fdf94f;hb=a09f678d8254064af7ca6dcfb3c3f84b5ae37b51;hp=26b03660d0ab110b822e02fbc3b2e10238c63f27;hpb=3d41aa23f35501ca92aab8aa42980fa73f7fa74f;p=public-inbox.git diff --git a/t/plack.t b/t/plack.t index 26b03660..f0dc4bbb 100644 --- a/t/plack.t +++ b/t/plack.t @@ -1,23 +1,21 @@ -# Copyright (C) 2014-2018 all contributors +# Copyright (C) 2014-2019 all contributors # License: AGPL-3.0+ use strict; use warnings; use Test::More; use Email::MIME; -use File::Temp qw/tempdir/; +use PublicInbox::TestCommon; my $psgi = "./examples/public-inbox.psgi"; -my $tmpdir = tempdir('pi-plack-XXXXXX', TMPDIR => 1, CLEANUP => 1); +my ($tmpdir, $for_destroy) = tmpdir(); my $pi_config = "$tmpdir/config"; my $maindir = "$tmpdir/main.git"; my $addr = 'test-public@example.com'; my $cfgpfx = "publicinbox.test"; my @mods = qw(HTTP::Request::Common Plack::Test URI::Escape); -foreach my $mod (@mods) { - eval "require $mod"; - plan skip_all => "$mod missing for plack.t" if $@; -} +require_mods(@mods); use_ok 'PublicInbox::Import'; use_ok 'PublicInbox::Git'; +my @ls; foreach my $mod (@mods) { use_ok $mod; } { @@ -28,7 +26,7 @@ foreach my $mod (@mods) { use_ok $mod; } close $fh or die "close: $!\n"; my %cfg = ( "$cfgpfx.address" => $addr, - "$cfgpfx.mainrepo" => $maindir, + "$cfgpfx.inboxdir" => $maindir, "$cfgpfx.url" => 'http://example.com/test/', "$cfgpfx.newsgroup" => 'inbox.test', ); @@ -45,7 +43,7 @@ To: You Cc: $addr Message-Id: Subject: hihi -Date: Thu, 01 Jan 1970 00:00:00 +0000 +Date: Fri, 02 Oct 1993 00:00:00 +0000 zzzzzz EOF @@ -53,8 +51,10 @@ EOF my $im = PublicInbox::Import->new($git, 'test', $addr); $im->add($mime); $im->done; - my $rev = `git --git-dir="$maindir" rev-list HEAD`; + my $rev = $git->qx(qw(rev-list HEAD)); like($rev, qr/\A[a-f0-9]{40}/, "good revision committed"); + @ls = $git->qx(qw(ls-tree -r --name-only HEAD)); + chomp @ls; } my $app = eval { local $ENV{PI_CONFIG} = $pi_config; @@ -89,7 +89,8 @@ EOF my $to = "$from/"; my $res = $cb->(GET($from)); is(301, $res->code, 'is permanent redirect'); - is($to, $res->header('Location'), 'redirect location matches'); + is($to, $res->header('Location'), + 'redirect location matches with trailing slash'); }); my $pfx = 'http://example.com/test'; @@ -125,15 +126,19 @@ EOF 'atom URL generated'); like($res->content, qr!href="blah\@example\.com/"!, 'index generated'); + like($res->content, qr!1993-10-02!, 'date set'); }); test_psgi($app, sub { my ($cb) = @_; my $res = $cb->(GET($pfx . '/atom.xml')); is(200, $res->code, 'success response received for atom'); - like($res->content, - qr!link\s+href="\Q$pfx\E/blah\@example\.com/"!s, + my $body = $res->content; + like($body, qr!link\s+href="\Q$pfx\E/blah\@example\.com/"!s, 'atom feed generated correct URL'); + like($body, qr/test for public-inbox/, + "set title in XML feed"); + like($body, qr/zzzzzz/, 'body included'); }); test_psgi($app, sub { @@ -198,6 +203,54 @@ EOF "$sfx redirected to /mbox.gz"); }); } + test_psgi($app, sub { + my ($cb) = @_; + # for a while, we used to support /$INBOX/$X40/ + # when we "compressed" long Message-IDs to SHA-1 + # Now we're stuck supporting them forever :< + foreach my $path (@ls) { + $path =~ tr!/!!d; + my $from = "http://example.com/test/$path/"; + my $res = $cb->(GET($from)); + is(301, $res->code, 'is permanent redirect'); + like($res->header('Location'), + qr!/test/blah\@example\.com/!, + 'redirect from x40 MIDs works'); + } + }); + + # dumb HTTP clone/fetch support + test_psgi($app, sub { + my ($cb) = @_; + my $path = '/test/info/refs'; + my $req = HTTP::Request->new('GET' => $path); + my $res = $cb->($req); + is(200, $res->code, 'refs readable'); + my $orig = $res->content; + + $req->header('Range', 'bytes=5-10'); + $res = $cb->($req); + is(206, $res->code, 'got partial response'); + is($res->content, substr($orig, 5, 6), 'partial body OK'); + + $req->header('Range', 'bytes=5-'); + $res = $cb->($req); + is(206, $res->code, 'got partial another response'); + is($res->content, substr($orig, 5), 'partial body OK past end'); + }); + + # things which should fail + test_psgi($app, sub { + my ($cb) = @_; + + my $res = $cb->(PUT('/')); + is(405, $res->code, 'no PUT to / allowed'); + $res = $cb->(PUT('/test/')); + is(405, $res->code, 'no PUT /$INBOX allowed'); + + # TODO + # $res = $cb->(GET('/')); + }); } done_testing();