package POE::Component::Client::REST::Test::HTTP;
use Moose;
use Sub::Exporter -setup => {exports => [qw(json_responder)]};
use Carp qw(croak);
use HTTP::Response;
use JSON;
use POE;
sub json_responder {
my $content = encode_json(shift);
my $res = HTTP::Response->new(200);
$res->header('Content-Type' => 'application/json');
$res->header('Content-Encoding' => 'UTF-8');
$res->content_length(bytes::length($content));
$res->content($content);
return sub { $res };
}
has responses => (
is => 'ro',
isa => 'ArrayRef',
default => sub { {} },
);
has Alias => (
is => 'ro',
isa => 'Str',
default => "TESTYBlAH"
);
sub BUILD {
my ($self, $args) = @_;
POE::Session->create(object_states => [$self => {
map { substr($_,1) => $_ }
grep { /^_.*/ }
$self->meta->get_method_list()
}]);
}
sub __start {
$poe_kernel->alias_set($_[OBJECT]->Alias);
}
sub _request {
my ($self, $sender, $state, $request) = @_[OBJECT, SENDER, ARG0, ARG1];
my $path = $request->uri->path;
my $r = $self->responses;
while (@$r) {
my $regex = shift(@$r);
my $sub = shift(@$r);
if ($path =~ $regex) {
$poe_kernel->post($sender, $state, [$request], [$sub->($request)]);
return;
}
}
croak "No handler for $path";
}
sub _shutdown {
$poe_kernel->alias_remove($_[OBJECT]->Alias);
}
sub replace {
my ($self, $rest) = @_;
$poe_kernel->post($rest->http, 'shutdown');
$rest->meta->find_attribute_by_name('http')->set_value($rest, $self->Alias);
}
1;