The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use lib "t/lib";

use Test::More;

BEGIN {
    eval {
        require Catalyst::Plugin::Session::State::Cookie;
        Catalyst::Plugin::Session::State::Cookie->VERSION(0.03);
    } or plan skip_all => "Catalyst::Plugin::Session::State::Cookie 0.03 or higher is required for this test";
    
    eval { require Test::WWW::Mechanize::Catalyst }
        or plan skip_all => "Test::WWW::Mechanize::Catalyst is required for this test";

    plan tests => 46;
}

use Test::WWW::Mechanize::Catalyst "RewritingTestApp";

foreach my $use_cookies (1, 0) {
    my $m = Test::WWW::Mechanize::Catalyst->new( $use_cookies ? () : ( cookie_jar => undef ) );

    $m->get_ok( "http://localhost/first_request", "initial request" );

    $m->content_like( qr/counter: 1\b/, "counter at 1" );

    my $second = $m->find_link( text => "second");

    # the first request *always* gets rewritten links because we don't know if the UA supports cookies yet
    like( $second->URI, qr{/-/}, "uri was rewritten for first request" );

    $m->follow_link_ok( { text => "second" }, "go to second page" );

    $m->content_like( qr/counter: 2\b/, "counter at 2" );

    my $third = $m->find_link( text => "third" );

    if ( $use_cookies) {
        unlike( $third->URI, qr{/-/}, "uri has not been rewritten because a cookie was sent" );
    } else {
        like( $third->URI, qr{/-/}, "uri was rewritten" );
    }
    
    $m->follow_link_ok( { text => "third" }, "go to third page" );

    $m->content_like( qr/counter: 3\b/, "counter at 3" );

    no warnings 'redefine', 'once';
    local *Test::WWW::Mechanize::redirect_ok = sub { 0 };

    $m->get( "http://localhost/redirect", "got redirect" );
    my $resp = $m->response;
    is( $resp->code, 302, "got a 302 response" );

    unless ($use_cookies) {
        like( $resp->header("Location"), qr{/-/.+$},
              "Location header has session id with redirect" );
    }

    $m->get( "http://localhost/only_rewrite_redirect", "got redirect" );

    $resp = $m->response;
    is( $resp->code, 302, "got a 302 response" );

    unless ($use_cookies) {
        like( $resp->header("Location"), qr{/-/.+$},
              "Location header has session id with redirect and rewrite_redirect true" );
    }

    $m->get( "http://localhost/dont_rewrite_redirect", "got redirect" );

    $resp = $m->response;
    is( $resp->code, 302, "got a 302 response" );

    unlike( $resp->header("Location"), qr{/-/.+$},
            "Location header does not have session id with redirect and rewrite_redirect false" );

    unless ($use_cookies) {
        $m->get_ok( "http://localhost/only_rewrite_body", "get only_rewrite_body" );

        my $third = $m->find_link( text => "third" );
        like( $third->URI, qr{/-/},
              "body uri was rewritten" );

        $m->get_ok( "http://localhost/dont_rewrite_body", "get dont_rewrite_body" );

        $third = $m->find_link( text => "third" );
        unlike( $third->URI, qr{/-/},
                "body uri was not rewritten" );
    }
}

{
    my $m = Test::WWW::Mechanize::Catalyst->new( cookie_jar => undef );

    $m->get_ok("http://localhost/text_request?plain=0", "get text req as non plaintext");
    $m->content_like( qr/counter: 42\b/, "counter in body" );
    $m->content_like( qr{/-/}, "body rewritten" );

    $m->get_ok("http://localhost/text_request?plain=1", "get text req as plain text");
    $m->content_like( qr/counter: 42\b/, "counter in body" );
    $m->content_unlike( qr{/-/}, "body not rewritten because of wrong content type" );
}