#!perl
#
use strict;
use warnings;

use Test::More;
use Data::Dumper;
use IO::Socket;
use RT::Client::REST;
plan tests => 5;

my $server = IO::Socket::INET->new(
    Type   => SOCK_STREAM,
    Reuse  => 1,
    Listen => 10,
) or die "Could not set up TCP server: $@";

my $port = $server->sockport;

my $pid = fork;
die "cannot fork: $!" unless defined $pid;

if ( 0 == $pid ) {    # Child
    {
        my $response =
            "HTTP/1.1 302 Redirect\r\n"
          . "Location: http://127.0.0.1:$port\r\n"
          . "Content-Type: text/plain; charset=utf-8\r\n\r\n"
          . "RT/42foo 200 this is a fake successful response header
header line 1
header line 2

response text";
        my $client = $server->accept;
        $client->write($response);
    }
    {
        my $response =
            "HTTP/1.1 302 Redirect\r\n"
          . "Location: http://127.0.0.1:$port\r\n"
          . "Content-Type: text/plain; charset=utf-8\r\n\r\n"
          . "random string";
        my $client = $server->accept;
        $client->write($response);
    }
    exit;
}

my $rt = RT::Client::REST->new(
    server          => "http://127.0.0.1:$port",
    timeout         => 2,
    verbose_errors  => 1,
    user_agent_args => {
        agent        => 'Secret agent',
        max_redirect => 0,
    },
);

is $rt->user_agent->agent, 'Secret agent', 'Ua correctly initialized';
is $rt->user_agent->max_redirect, 0,
  'Ua correctly initialized with max redirect';
ok $rt->verbose_errors, 'Verbose errors set';

eval {
    my $res = $rt->_submit(
        'ticket/1',
        undef,
        {
            user => 'a',
            pass => 'b',
        }
    );
};
like $@, qr{fetching .*/REST/1.0/ticket/1}, 'Double redirect dies meaningfully';

$pid = fork;
die "cannot fork: $!" unless defined $pid;

if ( 0 == $pid ) {    # Child
    {
        my $response =
            "HTTP/1.1 200 OK\r\n"
          . "Location: http://127.0.0.1:$port\r\n"
          . "Content-Type: text/plain; charset=utf-8\r\n\r\n"
          . 'response text';
        my $client = $server->accept;
        $client->write($response);
    }
    exit;
}
eval {
    my $res = $rt->_submit(
        'ticket/1',
        undef,
        {
            user => 'a',
            pass => 'b',
        }
    );
};
like $@, qr{Malformed.*/REST/1.0/ticket/1}, 'Random data is reported correctly';