use strict; use warnings; use Test::More; use Plack::Request; use Plack::Test; use Test::Requires 'Test::WWW::Mechanize::PSGI', 'HTTP::Session::Store::OnMemory', 'Plack::Session', 'Data::Section::Simple', 'Amon2::Lite'; use Plack::Builder; our $COMMIT; my $app = do { package MyApp::Web; use Amon2::Lite; sub load_config { +{} } my $session = HTTP::Session::Store::OnMemory->new(); __PACKAGE__->load_plugins( 'Web::HTTPSession' => { state => 'Cookie', store => sub { $session }, }, 'Web::CSRFDefender', { post_only => 1 } ); get '/form' => sub { my $c = shift; $c->render('form.tt'); }; get '/form_get' => sub { my $c = shift; $c->render('form_get.tt'); }; get '/form_no_method' => sub { my $c = shift; $c->render('form_no_method.tt'); }; get '/form_multi' => sub { my $c = shift; $c->render('form_multi.tt'); }; get '/do' => sub { my $c = shift; $COMMIT++; $c->redirect('/finished'); }; post '/do' => sub { my $c = shift; $COMMIT++; $c->redirect('/finished'); }; get '/finished' => sub { Plack::Response->new( 200, [], ['Finished'] ); }; __PACKAGE__->to_app; }; subtest 'post method' => sub { local $COMMIT = 0; my $mech = Test::WWW::Mechanize::PSGI->new( app => $app, ); $mech->get_ok('http://localhost/form'); $mech->content_like( qr[]); $mech->submit_form( form_number => 1, fields => { body => 'yay' } ); is $mech->base, 'http://localhost/finished'; is $COMMIT, 1; }; subtest 'deny' => sub { local $COMMIT = 0; test_psgi app => $app, client => sub { my $cb = shift; my $res = $cb->(HTTP::Request->new(POST => 'http://localhost/do')); is $res->code, '403'; is $COMMIT, 0; }; }; subtest 'get method' => sub { local $COMMIT = 0; my $mech = Test::WWW::Mechanize::PSGI->new( app => $app, ); $mech->get_ok('http://localhost/form_get'); $mech->content_unlike( qr[]); $mech->submit_form( form_number => 1, fields => { body => 'yay' } ); is $mech->base, 'http://localhost/finished'; is $COMMIT, 1; }; subtest 'no method' => sub { local $COMMIT = 0; my $mech = Test::WWW::Mechanize::PSGI->new( app => $app, ); $mech->get_ok('http://localhost/form_no_method'); $mech->content_unlike( qr[]); $mech->submit_form( form_number => 1, fields => { body => 'yay' } ); is $mech->base, 'http://localhost/finished'; is $COMMIT, 1; }; subtest 'multi form' => sub { my $mech = Test::WWW::Mechanize::PSGI->new( app => $app, ); $mech->get_ok('http://localhost/form_multi'); $mech->content_like( qr[
@@ form_get.tt @@ form_no_method.tt @@ form_multi.tt