RSS Git Download  Clone
Raw Blame History
use 5.24.0;

# tests plack servers with SessionTest app; use 'PLACK_ENV=test' to load test.yml
# to suppress debug output, or omit for verbose output; call test script as:
#  env [PLACK_ENV=test] PLACK_SERVER=Starman/Gazelle/Starlet/Twiggy prove -lv t/

#### watch PID in console output, sometimes varies, sometimes doesn't, but never
#### increments counter

use Test::More;
use Plack::Test;
use Data::Printer;
use Plack::Request;
use HTTP::Request::Common;
use Term::ANSIColor::Simple;

use constant TESTS => 10;

if ( $ENV{PLACK_SERVER} ) {
	warn '=' x 37 . "\n"; # unlike 'say', warn outputs even without -v flag
	warn "\trunning tests using $ENV{PLACK_SERVER} server\n";
	warn '=' x 50 . "\n";
}
else {
	die 'usage: env PLACK_SERVER=Starman/Gazelle/Starlet/Twiggy/PSGI '
		. "prove -lv t/myapp.t\n";
}

{
    package MyApp;
    use Dancer2;
    use Data::Printer;
    use Term::ANSIColor::Simple;

    my $c = config;
	$c->{engines}->{session}->{Cookie}->{secret_key} = 'blabenshpule'; # p $c;
	# set session => 'Cookie'; # doesn't fix failure to increment
	set session => 'PSGI';     # doesn't fix failure to increment

    get '/' => sub { # same logic as sessiontest.pl
        my $session = session(); # p $session;
        my $testcounter = session 'testcounter' || 0;
        $testcounter++;
      # this should increment but doesn't:
        say color("SESSION COUNTER = $testcounter")->yellow;
        session testcounter => $testcounter; # p $session;
        my $pid = $$;
        return "counter: $testcounter; pid: $pid";
    };
}

$Plack::Test::Impl = 'Server';

my $test = Plack::Test->create( MyApp->to_app );

# this gets a new session on each request - but needs to retain same one:
for (1 .. 5) {
    my $res = $test->request( GET '/' ); # say $res->header('Server');
        # say join ':', $_, $res->header($_) for $res->header_field_names;
    ok( $res->is_success, 'successful request' );
  # this should increment but doesn't, PID is different for each request:
    like $res->content, qr/counter: 1/, # qr/counter: $_/,
        sprintf 'expected content [%s]', $res->content;
}

done_testing(TESTS);