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);