The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More;

use File::Which qw(which);
plan skip_all => 'could not find git' unless which('git');

use Plack::Request;
use Plack::App::GitSmartHttp;

subtest 'git-upload-pack' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'POST',
            REQUEST_URI    => '/base/foo/git-upload-pack',
            PATH_INFO      => '/base/foo/git-upload-pack',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd,     'service_rpc' );
    is( $path,    '/base/foo' );
    is( $reqfile, 'git-upload-pack' );
};

subtest 'git-upload-pack not_allowed' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'GET',
            REQUEST_URI    => '/base/foo/git-upload-pack',
            PATH_INFO      => '/base/foo/git-upload-pack',
            QUERY_STRING   => '',
            SERVER_NAME    => '',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd, 'not_allowed' );
};

subtest 'get_info_refs' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'GET',
            REQUEST_URI    => '/base/foo/info/refs',
            PATH_INFO      => '/base/foo/info/refs',
            QUERY_STRING   => '',
            SERVER_NAME    => '',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd,     'get_info_refs' );
    is( $path,    '/base/foo' );
    is( $reqfile, 'info/refs' );
};

subtest 'get_text_file' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'GET',
            REQUEST_URI    => '/base/foo/HEAD',
            PATH_INFO      => '/base/foo/HEAD',
            QUERY_STRING   => '',
            SERVER_NAME    => '',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd,     'get_text_file' );
    is( $path,    '/base/foo' );
    is( $reqfile, 'HEAD' );
};

subtest 'get_text_file info/alternates' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'GET',
            REQUEST_URI    => '/base/foo/objects/info/alternates',
            PATH_INFO      => '/base/foo/objects/info/alternates',
            QUERY_STRING   => '',
            SERVER_NAME    => '',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd,     'get_text_file' );
    is( $path,    '/base/foo' );
    is( $reqfile, 'objects/info/alternates' );
};

subtest 'get_text_file info/http-alternates' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'GET',
            REQUEST_URI    => '/base/foo/objects/info/http-alternates',
            PATH_INFO      => '/base/foo/objects/info/http-alternates',
            QUERY_STRING   => '',
            SERVER_NAME    => '',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd,     'get_text_file' );
    is( $path,    '/base/foo' );
    is( $reqfile, 'objects/info/http-alternates' );
};

subtest 'get_info_packs' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'GET',
            REQUEST_URI    => '/base/foo/objects/info/packs',
            PATH_INFO      => '/base/foo/objects/info/packs',
            QUERY_STRING   => '',
            SERVER_NAME    => '',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd,     'get_info_packs' );
    is( $path,    '/base/foo' );
    is( $reqfile, 'objects/info/packs' );
};

subtest 'get_loose_object' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'GET',
            REQUEST_URI =>
              '/base/foo/objects/3b/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccc',
            PATH_INFO =>
              '/base/foo/objects/3b/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccc',
            QUERY_STRING => '',
            SERVER_NAME  => '',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd,     'get_loose_object' );
    is( $path,    '/base/foo' );
    is( $reqfile, 'objects/3b/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccc' );
};

subtest 'get_pack_file' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'GET',
            REQUEST_URI =>
'/base/foo/objects/pack/pack-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbb.pack',
            PATH_INFO =>
'/base/foo/objects/pack/pack-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbb.pack',
            QUERY_STRING => '',
            SERVER_NAME  => '',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd,  'get_pack_file' );
    is( $path, '/base/foo' );
    is( $reqfile,
        'objects/pack/pack-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbb.pack' );
};

subtest 'get_idx_file' => sub {
    my $gsh = Plack::App::GitSmartHttp->new;
    my $req = Plack::Request->new(
        {
            REQUEST_METHOD => 'GET',
            REQUEST_URI =>
'/base/foo/objects/pack/pack-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbb.idx',
            PATH_INFO =>
'/base/foo/objects/pack/pack-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbb.idx',
            QUERY_STRING => '',
            SERVER_NAME  => '',
        }
    );
    my ( $cmd, $path, $reqfile, $rpc ) = $gsh->match_routing($req);
    is( $cmd,  'get_idx_file' );
    is( $path, '/base/foo' );
    is( $reqfile,
        'objects/pack/pack-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbb.idx' );
};

done_testing;