The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Moxy;
use HTTP::Request;
use Test::More tests => 4;
use HTTP::Session::State::Test;
use HTTP::Session::Store::Test;
use CGI;
use HTTP::Request::Common;

Moxy->load_plugins(qw/RefererCutter/);
my $m = Moxy->new(
    {
        global => {
            assets_path => File::Spec->catfile( $FindBin::Bin, '..', 'assets' ),
            'log' => {
                level => 'info',
            },
        },
    }
);
my $session_store = HTTP::Session::Store::Test->new();

# display the id/pw input form when you got a 401
{
    my $res = HTTP::Response->new(401);
    $res->header('WWW-Authenticate' => 'Basic realm="secret"');
    $res->request(
        HTTP::Request->new('GET', '/', HTTP::Headers->new(
            'Host' => 'example.com',
        ))
    );
    $m->run_hook('status_handler' => { response => $res, session => session()});
    like($res->content, qr{<input type="text" name="host" value="example.com" />});
}

# save id/pw
{
    my $req = POST 'http://basicauth.moxy/http://example.com/',
      [ 'id' => 'dankogai', 'pw' => 'kogaidan' ],
      ;
    my $res = $m->run_hook_and_get_response('url_handle' => { request => $req, session => session()});
    is $res->code, 302, 'save id/pw';
    is($res->header('Location'), 'http://example.com/', 'location');
}

# request filter works?
{
    my $req = GET '/',
        Headers => [
            'Host' => 'example.com',
        ],
      ;
    $m->run_hook(
        'request_filter' => {
            request          => $req,
            session          => session(),
            mobile_attribute => HTTP::MobileAttribute->new( $req->headers )
        }
    );
    is($req->authorization_basic, 'dankogai:kogaidan', 'authorization basic');
}

sub session {
    HTTP::Session->new(
        state => HTTP::Session::State::Test->new(
            session_id => 'fkldsaaljasdfafaa',
            permissive => 1,
        ),
        store   => $session_store,
        request => CGI->new(),
    )
}