viewvcs: handle exceptions in on_destroy cb
[public-inbox.git] / t / psgi_mount.t
blob7117cda3090e1355f0b44b5c11e903ca7e074ba1
1 #!perl -w
2 # Copyright (C) all contributors <meta@public-inbox.org>
3 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
4 use v5.12;
5 use PublicInbox::Eml;
6 use PublicInbox::TestCommon;
7 my ($tmpdir, $for_destroy) = tmpdir();
8 my $v1dir = "$tmpdir/v1.git";
9 require_mods 'psgi';
10 use_ok 'PublicInbox::WWW';
11 my $ibx = create_inbox 'test', tmpdir => $v1dir, sub {
12         my ($im, $ibx) = @_;
13         $im->add(PublicInbox::Eml->new(<<EOF)) or BAIL_OUT;
14 From: Me <me\@example.com>
15 To: You <you\@example.com>
16 Cc: $ibx->{-primary_address}
17 Message-Id: <blah\@example.com>
18 Subject: hihi
19 Date: Thu, 01 Jan 1970 00:00:00 +0000
21 zzzzzz
22 EOF
24 my $cfg = cfg_new $tmpdir, <<EOF;
25 [publicinbox "test"]
26         address = $ibx->{-primary_address}
27         inboxdir = $v1dir
28 EOF
29 my $www = PublicInbox::WWW->new($cfg);
30 my $app = builder(sub {
31         enable('Head');
32         mount('/a' => builder(sub { sub { $www->call(@_) } }));
33         mount('/b' => builder(sub { sub { $www->call(@_) } }));
34 });
36 test_psgi($app, sub {
37         my ($cb) = @_;
38         my $res;
39         # Atom feed:
40         $res = $cb->(GET('/a/test/new.atom'));
41         like($res->content, qr!\bhttp://[^/]+/a/test/!,
42                 'URLs which exist in Atom feed are mount-aware');
43         unlike($res->content, qr!\b\Qhttp://[^/]+/test/\E!,
44                 'No URLs which are not mount-aware');
46         $res = $cb->(GET('/a/test/_/text/mirror/'));
47         like($res->content, qr!git clone --mirror\s+.*?http://[^/]+/a/test\b!s,
48                 'clone URL in /text/mirror is mount-aware');
50         $res = $cb->(GET('/a/test/blah%40example.com/raw'));
51         is($res->code, 200, 'OK with URLMap mount');
52         like($res->content,
53                 qr/^Message-Id: <blah\@example\.com>\n/sm,
54                 'headers appear in /raw');
56         # redirects
57         $res = $cb->(GET('/a/test/m/blah%40example.com.html'));
58         is($res->header('Location'),
59                 'http://localhost/a/test/blah@example.com/',
60                 'redirect functions properly under mount');
62         $res = $cb->(GET('/test/blah%40example.com/'));
63         is($res->code, 404, 'intentional 404 with URLMap mount');
64 });
66 SKIP: {
67         require_mods(qw(DBD::SQLite Xapian IO::Uncompress::Gunzip), 3);
68         require_ok 'PublicInbox::SearchIdx';
69         PublicInbox::SearchIdx->new($ibx, 1)->index_sync;
70         test_psgi($app, sub {
71                 my ($cb) = @_;
72                 my $res = $cb->(GET('/a/test/blah@example.com/t.mbox.gz'));
73                 my $gz = $res->content;
74                 my $raw;
75                 IO::Uncompress::Gunzip::gunzip(\$gz => \$raw);
76                 like($raw, qr!^Message-Id:\x20<blah\@example\.com>\n!sm,
77                         'headers appear in /t.mbox.gz mboxrd');
78         });
81 done_testing();