So we can test our Dancer2 route:
my $ua = LWP::UserAgent->new;
my $res = $ua->get("http://127.0.0.1:$port/route/");
ok($res->is_success);
is($res->content, 'my content');
Sometime this is not enough. In the code I'm developing redirect is important as success, how can I test this? Well, I suppose...
my $ua = LWP::UserAgent->new;
my $res = $ua->get("http://127.0.0.1:$port/redirecting_route/");
is($res->code, 302);
But result is:
# got: '200'
# expected: '302'
What's wrong?
You could think (I did, at last) that LWP::UserAgent is just a "tester", something to do "ping" on internet sites and see what come back. It's not, LWP::UserAgent is powerful because it's a complete working browser, like Firefox, Opera, Chrome or IE. It's not good in rendering pages, ok, but the data-flow it can manage is the same you can see while surfing the web.
What a normal browser like Firefox do when there's a redirect?
Simple:
CALL -> 302 -> NEW PAGE -> 200
Though you're giving back a redirect for a route you still want to give a page, a success result, at the end of the navigation chain. LWP::UserAgent follow all the chain without asking for nothing, as your browser, bringing back the final 200 response.
Ok, LWP::UserAgent is cool and I'll use it to fetch good pron, I promise, but now I'm looking for something that check my Dancer2 App doing the right redirect!
Test is just a bit more complex:
my $ua = LWP::UserAgent->new;
my $res = $ua->get("http://127.0.0.1:$port/redirecting_route/");
is($res->is_success and $res->previous);
Call ends with a 200 but a previous URL was registered and we're redirecting from there. You can see this URL in $res->previous but knowing it's there is enough to say we're redirecting.
Something more about the browser powers of LWP::UserAgent?
What if you need to test sessions? How Dancer2 trace client sessions? With a session cookie, obviously. And LWP::UserAgent can manage them too? Obviously again, but remember to give it a cookie_jar to use:
$ua->cookie_jar({file => "cookies.txt"});
Rememeber. With LWP::UserAgent you're not just trying out your site. You're literally surfing it!
my $res = $ua->get("http://127.0.0.1:$port/redirecting_route/");
is($res->is_success and $res->previous);
Call ends with a 200 but a previous URL was registered and we're redirecting from there. You can see this URL in $res->previous but knowing it's there is enough to say we're redirecting.
Something more about the browser powers of LWP::UserAgent?
What if you need to test sessions? How Dancer2 trace client sessions? With a session cookie, obviously. And LWP::UserAgent can manage them too? Obviously again, but remember to give it a cookie_jar to use:
$ua->cookie_jar({file => "cookies.txt"});
Rememeber. With LWP::UserAgent you're not just trying out your site. You're literally surfing it!