The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use lib 't/lib';
use Test::More;

BEGIN {
  my @requirements = qw(
    Catalyst::Plugin::Session::State::Cookie
    Test::WWW::Mechanize::Catalyst
    DBD::SQLite
  );

  foreach my $module ( @requirements ) {
    eval "require $module;"
      or plan skip_all => "$module is required for this test";
  }

  $ENV{TESTAPP_SESSION_STORE_JDBI_MONIKER}       = 'DB::Session';
  $ENV{TESTAPP_SESSION_STORE_JDBI_SERIALIZATION} = 0;
}

plan 'no_plan';

use Test::WWW::Mechanize::Catalyst 'TestApp';

my $ua1 = Test::WWW::Mechanize::Catalyst->new;
my $ua2 = Test::WWW::Mechanize::Catalyst->new;
my @all = ($ua1, $ua2);

$ua1->get('http://localhost/db/setup');  # setup database

$_->get_ok('http://localhost/page', 'initial get') for @all;

$ua1->content_contains('please login', 'ua1 not logged in');
$ua2->content_contains('please login', 'ua2 not logged in');

$ua1->get_ok('http://localhost/login', 'log ua1 in');
$ua1->content_contains('logged in', 'ua1 logged in');

$_->get_ok('http://localhost/page', 'get main page') for @all;

$ua1->content_contains('you are logged in', 'ua1 logged in');
$ua2->content_contains('please login', 'ua2 not logged in');

$ua2->get_ok('http://localhost/login', 'log ua2 in');
$ua2->content_contains('logged in', 'ua2 logged in');

$_->get_ok('http://localhost/page', 'get main page') for @all;

$ua1->content_contains('you are logged in', 'ua1 logged in');
$ua2->content_contains('you are logged in', 'ua2 logged in');

$ua2->get_ok('http://localhost/logout', 'log ua2 out');
$ua2->content_like(qr/logged out/, 'ua2 logged out');
$ua2->content_like(qr/after 1 request/, 'ua2 made 1 request for page in the session');

$_->get_ok('http://localhost/page', 'get main page') for @all;

$ua1->content_contains('you are logged in', 'ua1 logged in');
$ua2->content_contains('please login', 'ua2 not logged in');

$ua1->get_ok('http://localhost/logout', 'log ua1 out');
$ua1->content_like(qr/logged out/, 'ua1 logged out');
$ua1->content_like(qr/after 3 request/, 'ua1 made 3 request for page in the session');

$_->get_ok('http://localhost/page', 'get main page') for @all;

$ua1->content_contains('please login', 'ua1 not logged in');
$ua2->content_contains('please login', 'ua2 not logged in');

END { $ua1 && $ua1->get('http://localhost/db/teardown'); }