# https://metacpan.org/dist/Dancer2/view/lib/Dancer2/Manual/Testing.pod use strict; use warnings; BEGIN { # set test env otherwise get development config settings - unless explicitly # set at command-line: "DANCER_ENVIRONMENT=development prove -lv t/" $ENV{DANCER_ENVIRONMENT} ||= $ENV{PLACK_ENV} ||= 'test'; } use Test::More; use Plack::Test; use Data::Printer; use HTTP::Cookies; use HTTP::Request::Common; use_ok('DocsLib'); my $test = Plack::Test->create( DocsLib->to_app ); # p $test->app; exit; my $jar = HTTP::Cookies->new(); my $url = 'http://localhost/infolib'; my %hx_request_headers = ( HX_Target => 'content-div', # ← optional: element id to swap HX_Trigger => 'save-button', # ← optional: id/name of the triggering element HX_Request => 'true', # ← required by htmx ); subtest 'Landing page' => sub { my $res = $test->request( GET '/infolib/' ); ok( $res->is_redirect, '[GET /] redirect' ); }; # see DraftReporter/t/routes.t and dancyland blog.t =================================== subtest 'Login' => sub { my $request = POST '/login', [ password => 't3st' ] ; my $response = $test->request( $request ); ok( $response->is_redirect, '[POST /login] redirect' ); # handle cookies for next request: $jar->extract_cookies($response); # my @cookies; # $cookie_jar->scan( sub { @cookies = @_ }); p @cookies; }; { # create HTTP::Request object and add cookies to it: my $req = GET $url . '/', # full url to match cookie expectation %hx_request_headers; $jar->add_cookie_header( $req ); # p $req->dump; # resubmit GET '/', should get 'new_document' link: my $res = $test->request( $req ); # p $res; like( $res->as_string, qr/new_document/, 'have link for new document' ); } { my %data = ( title => 'title', content => 'some content' ); my $req = POST $url . '/create', \%data, # full url to match cookie expectation %hx_request_headers; $jar->add_cookie_header( $req ); # p $req->dump; my $res = $test->request( $req ); # p $res; exit; # successful input gets redirect ok( $res->is_redirect, '[POST /create] redirect' ); } #exit; { my $req = GET $url . '/id/1', # full url to match cookie expectation %hx_request_headers; my $res = $test->request( $req ); # p $res; like( $res->as_string, qr/some content/, 'have expected content' ); } { my %data = ( title => 'Ripples They Cause in the World', content => q!It is with great sadness that we announce the passing of Shadowcat co-founder, Matt S. Trout! ); my $req = POST $url . '/create', \%data, # full url to match cookie expectation %hx_request_headers; $jar->add_cookie_header( $req ); my $res = $test->request( $req ); # p $res; # successful input gets redirect ok( $res->is_redirect, '[POST /create] redirect' ); } { my $req = GET $url . '/id/2', # full url to match cookie expectation %hx_request_headers; # don't need to add cookies here as route isn't protected by login my $res = $test->request( $req ); # p $res; like( $res->as_string, qr/Ripples They Cause in the World/, 'search by id returned expected content' ); } # search: { my $req = POST $url . '/search' , [ search => 'Shadowcat' ], # full url to match cookie expectation %hx_request_headers; # don't need to add cookies here as route isn't protected by login my $res = $test->request( $req ); # p $res; like( $res->as_string, qr/Ripples/, 'search by free-text returned expected content' ); } # edit: { my $req = POST $url . '/edit/1', # full url to match cookie expectation %hx_request_headers; $jar->add_cookie_header( $req ); my $res = $test->request( $req ); # p $res; like( $res->as_string, qr{/update/1}, 'contains update link' ); like( $res->as_string, qr/some content/, 'has expected content' ); } # submit update: { my $req = POST $url . '/update/1', [ content => 'other content', title => 'title' ], %hx_request_headers; $jar->add_cookie_header( $req ); my $res = $test->request( $req ); # p $res; # successful input gets redirect ok( $res->is_redirect, '[POST /update] redirect' ); # have to retrieve update manually due to redirect: $req = GET $url . '/id/1', # full url to match cookie expectation %hx_request_headers; $res = $test->request( $req ); # p $res; like( $res->as_string, qr/other content/, 'has updated content' ); # original text not found: unlike( $res->as_string, qr/some content/, 'lacks original content' ); } done_testing (14);