lemonldap-ng/lemonldap-ng-portal/t/lib/Lemonldap/NG/Handler/Test.pm
2019-04-11 11:18:22 +02:00

90 lines
2.3 KiB
Perl

package Lemonldap::NG::Handler::Test;
use File::Temp;
use HTTP::Request::Common;
use Lemonldap::NG::Handler::Server;
use LWP::UserAgent;
use LWP::Protocol::PSGI;
use Plack::Test;
our ( $in, $out, $rin, $rout, $server );
*in = *main::in;
*out = *main::out;
*rin = *main::rin;
*rout = *main::rout;
sub init {
my $tdir = File::Temp::tempdir( CLEANUP => 1 );
my $h = Lemonldap::NG::Handler::Server->new( {} );
$h->init( {
configStorage => {
type => 'File',
dirName => 't',
},
cookieName => 'lemonldap',
securedCookie => 0,
https => 0,
logger => 'Lemonldap::NG::Common::Logger::Std',
domain => 'idp.com',
logLevel => $main::debug,
portal => 'http://auth.idp.com',
configStorage => {
type => 'File',
dirName => 't',
},
localSessionStorage => 'Cache::FileCache',
localSessionStorageOptions => {
namespace => 'lemonldap-ng-session',
cache_root => $tdir,
cache_depth => 0,
},
}
);
$server = Plack::Test->create( $h->run );
}
# Redefine LWP methods for tests
LWP::Protocol::PSGI->register(
sub {
my ($env) = @_;
my $req = Plack::Request->new($env);
my $method = $req->method;
my $url = $req->request_uri;
my $content = $req->content;
print $rin JSON::to_json( [ $method => $url, [], $content ] ) . "\n";
my $res;
$res = <$rout>, 'Get portal response';
return JSON::from_json($res);
}
);
sub run {
while (<$in>) {
chomp;
if (/^END/) {
return;
}
next unless $_;
my ( $req, $res );
$req = HTTP::Request->new( @{ JSON::from_json($_) } );
$res = $server->request($req);
my @flatten = &flatten($res);
print $out JSON::to_json(
[ $res->code, [@flatten], [ $res->content ] ] )
. "\n";
}
}
# Copy from HTTP::Headers code
sub flatten {
my ($self) = @_;
(
map {
my $k = $_;
map { ( $k => $_ ) } $self->header($_);
} $self->header_field_names
);
}
1;