#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use Plack::Test;
use Test::Requires 'MooseX::NonMoose';
{
package Foo::Middleware;
use Moose;
use MooseX::NonMoose;
extends 'Plack::Middleware';
has static_root => (
is => 'ro',
isa => 'Str',
required => 1,
);
sub call {
my $self = shift;
my ($env) = @_;
my $res = $self->app->($env);
unshift @{ $res->[2] }, $self->static_root;
return $res;
}
}
{
package Foo;
use OX;
has static_root => (
is => 'ro',
isa => 'Str',
value => 'root/static',
);
router as {
wrap 'Foo::Middleware' => (
static_root => 'static_root',
);
route '/foo' => sub {
my $req = shift;
return $req->path;
};
};
}
test_psgi
app => Foo->new->to_app,
client => sub {
my $cb = shift;
my $req = HTTP::Request->new(GET => "http://localhost/foo");
my $res = $cb->($req);
is($res->content, 'root/static/foo', "right content");
};
{
package Bar;
use OX;
has static_root => (
is => 'ro',
isa => 'Str',
value => '/static',
);
router as {
wrap sub {
my ($app, $s) = @_;
my $root = $s->param('static_root');
return sub {
my $env = shift;
my $res = $app->($env);
unshift @{ $res->[2] }, $root;
return $res;
};
}, (static_root => 'static_root');
route '/foo' => sub {
my $req = shift;
return $req->path;
};
};
}
test_psgi
app => Bar->new->to_app,
client => sub {
my $cb = shift;
my $req = HTTP::Request->new(GET => "http://localhost/foo");
my $res = $cb->($req);
is($res->content, '/static/foo', "right content");
};
my ($thing1, $thing2);
my ($constructor_count, $destructor_count) = (0, 0);
{
package BazThing;
use Moose;
sub BUILD { $constructor_count++ }
sub DEMOLISH { $destructor_count++ }
}
{
package Baz::Controller;
use Moose;
has thing => (
is => 'ro',
isa => 'BazThing',
required => 1,
);
sub index {
my $self = shift;
my ($r) = @_;
$thing1 = $self->thing;
return 'ok';
}
}
{
package Baz::Middleware;
use Moose;
use MooseX::NonMoose;
extends 'Plack::Middleware';
has thing => (
is => 'ro',
isa => 'BazThing',
required => 1,
);
sub call {
my $self = shift;
my ($env) = @_;
$thing2 = $self->thing;
return $self->app->($env);
}
}
{
package Baz;
use OX;
has thing => (
is => 'ro',
isa => 'BazThing',
lifecycle => 'Request',
);
has root => (
is => 'ro',
isa => 'Baz::Controller',
dependencies => ['thing'],
);
router as {
wrap 'Baz::Middleware' => (
thing => 'thing',
);
route '/' => 'root.index';
};
}
test_psgi
app => Baz->new->to_app,
client => sub {
my $cb = shift;
my $req = HTTP::Request->new(GET => "http://localhost/");
my $res = $cb->($req);
is($res->content, 'ok', "right content");
isa_ok($thing1, 'BazThing');
isa_ok($thing2, 'BazThing');
is($thing1, $thing2);
is($constructor_count, 1);
is($destructor_count, 0);
my $req1_thing = $thing1;
undef $thing1;
undef $thing2;
my $req2 = HTTP::Request->new(GET => "http://localhost/");
my $res2 = $cb->($req);
is($res->content, 'ok', "right content");
isa_ok($thing1, 'BazThing');
isa_ok($thing2, 'BazThing');
is($thing1, $thing2);
isnt($req1_thing, $thing1);
isnt($req1_thing, $thing2);
is($constructor_count, 2);
is($destructor_count, 0);
undef $req1_thing;
undef $thing1;
undef $thing2;
is($destructor_count, 2);
};
done_testing;