The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use strict;
use warnings;
use Test::More;

# setup library path
use FindBin qw($Bin);
use lib "$Bin/lib";

BEGIN {
    plan skip_all => 'this test needs Test::WWW::Mechanize::Catalyst'
      unless eval "require Test::WWW::Mechanize::Catalyst";
    plan skip_all => 'this test needs Moose'
      unless eval "require Moose";

    plan tests => 47;
}

# make sure testapp works
use ok 'TestApp';

# a live test against TestApp, the test application
use Test::WWW::Mechanize::Catalyst 'TestApp';
my $mech = Test::WWW::Mechanize::Catalyst->new;
$mech->get_ok('http://localhost/', 'get main page');
$mech->content_like(qr/it works/i, 'see if it has our text');

# adaptor
{
    $mech->get_ok('http://localhost/adaptor/isa', 'get the class name');
    $mech->content_like(qr/^TestApp::Backend::SomeClass$/,
                        'adapted class is itself');
}

{
    $mech->get_ok('http://localhost/adaptor/id_twice', 'get id_twice');
    my ($a, $b) = split /\|/, $mech->content;
    is $a, $b, 'same instance both times';

    $mech->get_ok('http://localhost/adaptor/id', 'get id');
    is $mech->content, $a, 'same instance for different request';
}

{
    $mech->get_ok('http://localhost/adaptor/foo', 'get foo');
    $mech->content_like(qr/^bar$/, 'got foo = bar');
}

{
    $mech->get_ok('http://localhost/adaptor/count', 'get count');
    my $a = $mech->content;
    $mech->get_ok('http://localhost/adaptor/count', 'get count (+1)');
    my $b = $mech->content;

    is $b, $a+1, 'same instance across requests';
}
{
    $mech->get_ok('http://localhost/adaptor/count_twice', 'get count_twice');
    my ($a, $b) = split/\|/, $mech->content;
    is $a, 3, '3 count for a';
    is $b, 4, '4 count for b';
}

# factory
{
    $mech->get_ok('http://localhost/factory/isa', 'get the class name');
    $mech->content_like(qr/^TestApp::Backend::SomeClass$/,
                        'adapted class is itself');
}

{
    $mech->get_ok('http://localhost/factory/id_twice', 'get id_twice');
    my ($a, $b) = split /\|/, $mech->content;
    is $b, $a+1, 'different instance both times';

    $mech->get_ok('http://localhost/factory/id', 'get id');
    is $mech->content, $b+1, 'same instance for different request too';

}

{
    $mech->get_ok('http://localhost/factory/foo', 'get foo');
    $mech->content_like(qr/^baz$/, 'got foo = baz');
}
{
    $mech->get_ok('http://localhost/factory/count', 'get count');
    my $a = $mech->content;
    $mech->get_ok('http://localhost/factory/count', 'get count (+1)');
    my $b = $mech->content;

    is $a, 1, '1st request for a';
    is $b, 1, '1st request for b too';
}
{
    $mech->get_ok('http://localhost/factory/count_twice', 'get count_twice');
    my ($a, $b) = split/\|/, $mech->content;
    is $a, 1, '1 count for a';
    is $b, 1, '1 count for b too';
}

# per_request
{
    $mech->get_ok('http://localhost/perrequest/isa', 'get the class name');
    $mech->content_like(qr/^TestApp::Backend::SomeClass$/,
                        'adapted class is itself');
}

{
    $mech->get_ok('http://localhost/perrequest/id_twice', 'get id_twice');
    my ($a, $b) = split /\|/, $mech->content;
    is $a, $b, 'same instance both times';

    $mech->get_ok('http://localhost/perrequest/id', 'get id');
    is $mech->content, $a+1, 'different instance for different request';
}

{
    $mech->get_ok('http://localhost/perrequest/foo', 'get foo');
    $mech->content_like(qr/^quux$/, 'got foo = quux');
}
{
    $mech->get_ok('http://localhost/perrequest/count', 'get count');
    my $a = $mech->content;
    $mech->get_ok('http://localhost/perrequest/count', 'get count (+1)');
    my $b = $mech->content;

    is $a, 1, '1st request for a';
    is $b, 1, '1st request for b too';
}
{
    $mech->get_ok('http://localhost/perrequest/count_twice', 'get count_twice');
    my ($a, $b) = split/\|/, $mech->content;
    is $a, 1, '1 count for a';
    is $b, 2, '2 count for b';
}