+
+ $res = $cb->(GET('/public-inbox/atom/'));
+ is($res->code, 200, 'Atom feed');
+ SKIP: {
+ require_mods('XML::TreePP', 1);
+ my $t = XML::TreePP->new->parse($res->content);
+ is(scalar @{$t->{feed}->{entry}}, 50,
+ 'got 50 entries');
+
+ $res = $cb->(GET('/public-inbox/atom/COPYING'));
+ is($res->code, 200, 'file Atom feed');
+ $t = XML::TreePP->new->parse($res->content);
+ ok($t->{feed}->{entry}, 'got entry');
+
+ $res = $cb->(GET('/public-inbox/atom/README.md'));
+ is($res->code, 404, '404 on non-existent file Atom feed');
+ }
+
+ $res = $cb->(GET('/public-inbox/tree/'));
+ is($res->code, 200, 'got 200 for root listing');
+ $got = $res->content;
+ like($got, qr/\bgit ls-tree\b/, 'ls-tree help shown');
+
+ $res = $cb->(GET('/public-inbox/tree/README'));
+ is($res->code, 200, 'got 200 for regular file');
+ $got = $res->content;
+ like($got, qr/\bgit show\b/, 'git show help shown');
+
+ $res = $cb->(GET('/public-inbox/tree/Documentation'));
+ is($res->code, 200, 'got 200 for a directory');
+ $got = $res->content;
+ like($got, qr/\bgit ls-tree\b/, 'ls-tree help shown');
+
+ $res = $cb->(GET('/public-inbox/tree/?h=no-branch'));
+ is($res->code, 404, 'got 404 for non-existent ref root');
+ $res = $cb->(GET('/public-inbox/tree/README?h=no-file'));
+ is($res->code, 404, 'got 404 for non-existent ref README');
+ $res = $cb->(GET('/public-inbox/tree/Documentation?h=no-dir'));
+ is($res->code, 404, 'got 404 for non-existent ref directory');
+
+ $res = $cb->(GET('/public-inbox/tags.atom'));
+ is($res->code, 200, 'Atom feed');
+ SKIP: {
+ require_mods('XML::TreePP', 1);
+ my $t = XML::TreePP->new->parse($res->content);
+ ok(scalar @{$t->{feed}->{entry}}, 'got tag entries');
+ }