[dancer-users] Plack::Test with Cookies

Dave Cross dave at dave.org.uk
Fri Jan 15 15:57:15 GMT 2016


I've been writing tests for a Dancer2 app. I'm using Plack::Test. One  
thing that I wanted to test was that logged in users get a different  
view of the app to logged out visitors. For that I need to set cookies  
on the requests that I'm sending to the test app.

I found this advent calendar article by SawyerX which looked very useful.

   http://advent.perldancer.org/2014/12

Following the instructions in that article, I did this:

   my $res = $test->request(POST '/login', [ \%test_user_creds ]);

   $jar->extract_cookies($res);

I can look at $jar->as_string before and after that line, and I seen  
the session cookie being added to the jar.

Later I do this:

   my $req = GET "/$private_page";
   $jar->add_cookie_header($req);
   my $res = $test->request( $req );

This doesn't work. And it doesn't work because the session cookies  
don't get added to the request object. $jar is a HTTP::Cookies object,  
so I looked at the add_cookie_header() method, to find this code at  
the start:

   my $self = shift;
   my $request = shift || return;
   my $url = $request->uri;
   my $scheme = $url->scheme;
   unless ($scheme =~ /^https?\z/) {
       return;
   }

This is where my test goes wrong. My request is just "/$private_page"  
- it doesn't have a $scheme (or, indeed, a hostname). And I guess it's  
obvious that add_cookie_header needs a domain in order to know which  
cookies from the jar to add (my jar only has the correct cookies - but  
the method can't know that).

Looking at the cookie jar, I see that the cookies have been given the  
domain "localhost.local". Can I just add "http://localhost.local" to  
the front of my request URL? Is that guaranteed to work in all test  
environments?

Am I missing something here or did that code in the advent calendar  
article never work?

Any advice much appreciated.

Cheers,

Dave...



More information about the dancer-users mailing list