| #!perl -w |
| # Copyright (C) all contributors <meta@public-inbox.org> |
| # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> |
| use v5.12; |
| use PublicInbox::Eml; |
| use PublicInbox::TestCommon; |
| my ($tmpdir, $for_destroy) = tmpdir(); |
| my $v1dir = "$tmpdir/v1.git"; |
| require_mods 'psgi'; |
| use_ok 'PublicInbox::WWW'; |
| my $ibx = create_inbox 'test', tmpdir => $v1dir, sub { |
| my ($im, $ibx) = @_; |
| $im->add(PublicInbox::Eml->new(<<EOF)) or BAIL_OUT; |
| From: Me <me\@example.com> |
| To: You <you\@example.com> |
| Cc: $ibx->{-primary_address} |
| Message-Id: <blah\@example.com> |
| Subject: hihi |
| Date: Thu, 01 Jan 1970 00:00:00 +0000 |
| |
| zzzzzz |
| EOF |
| }; |
| my $cfg = cfg_new $tmpdir, <<EOF; |
| [publicinbox "test"] |
| address = $ibx->{-primary_address} |
| inboxdir = $v1dir |
| EOF |
| my $www = PublicInbox::WWW->new($cfg); |
| my $app = builder(sub { |
| enable('Head'); |
| mount('/a' => builder(sub { sub { $www->call(@_) } })); |
| mount('/b' => builder(sub { sub { $www->call(@_) } })); |
| }); |
| |
| test_psgi($app, sub { |
| my ($cb) = @_; |
| my $res; |
| # Atom feed: |
| $res = $cb->(GET('/a/test/new.atom')); |
| like($res->content, qr!\bhttp://[^/]+/a/test/!, |
| 'URLs which exist in Atom feed are mount-aware'); |
| unlike($res->content, qr!\b\Qhttp://[^/]+/test/\E!, |
| 'No URLs which are not mount-aware'); |
| |
| $res = $cb->(GET('/a/test/_/text/mirror/')); |
| like($res->content, qr!git clone --mirror\s+.*?http://[^/]+/a/test\b!s, |
| 'clone URL in /text/mirror is mount-aware'); |
| |
| $res = $cb->(GET('/a/test/blah%40example.com/raw')); |
| is($res->code, 200, 'OK with URLMap mount'); |
| like($res->content, |
| qr/^Message-Id: <blah\@example\.com>\n/sm, |
| 'headers appear in /raw'); |
| |
| # redirects |
| $res = $cb->(GET('/a/test/m/blah%40example.com.html')); |
| is($res->header('Location'), |
| 'http://localhost/a/test/blah@example.com/', |
| 'redirect functions properly under mount'); |
| |
| $res = $cb->(GET('/test/blah%40example.com/')); |
| is($res->code, 404, 'intentional 404 with URLMap mount'); |
| }); |
| |
| SKIP: { |
| require_mods(qw(DBD::SQLite Xapian IO::Uncompress::Gunzip), 3); |
| require_ok 'PublicInbox::SearchIdx'; |
| PublicInbox::SearchIdx->new($ibx, 1)->index_sync; |
| test_psgi($app, sub { |
| my ($cb) = @_; |
| my $res = $cb->(GET('/a/test/blah@example.com/t.mbox.gz')); |
| my $gz = $res->content; |
| my $raw; |
| IO::Uncompress::Gunzip::gunzip(\$gz => \$raw); |
| like($raw, qr!^Message-Id:\x20<blah\@example\.com>\n!sm, |
| 'headers appear in /t.mbox.gz mboxrd'); |
| }); |
| } |
| |
| done_testing(); |