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

use strict; use warnings;
use IP::Info;
use Test::More;

eval "use Test::LWP::UserAgent";
plan skip_all => "Test::LWP::UserAgent required for testing exception handler" if $@;

my ($apikey, $secret, $sig, $info);
my ($browser, $response, $exception);

$apikey = 'Your_API_Key';
$secret = 'Your_shared_secret';
$sig    = 'Internal_SIG';

my $ok_200_with_data    = "http://api.quova.com/v1/ipinfo/127.0.0.0?apikey=$apikey&sig=$sig";
my $ok_200_without_data = "http://api.quova.com/v1/ipinfo/127.0.0.1?apikey=$apikey&sig=$sig";
my $bad_request_400  = "http://api.quova.com/v1/ipinfo/127.0.0.2?apikey=$apikey&sig=$sig";
my $unauthorized_401 = "http://api.quova.com/v1/ipinfo/127.0.0.3?apikey=$apikey&sig=$sig";
my $forbidden_403    = "http://api.quova.com/v1/ipinfo/127.0.0.4?apikey=$apikey&sig=$sig";
my $not_found_404    = "http://api.quova.com/v1/ipinfo/127.0.0.5?apikey=$apikey&sig=$sig";

$browser = Test::LWP::UserAgent->new(agent => 'Mozilla/5.0');
$browser->map_response(qr{\Q$ok_200_with_data\E},    HTTP::Response->new(200, 'OK', ['Content-Type' => 'text/plain'], 'Data'));
$browser->map_response(qr{\Q$ok_200_without_data\E}, HTTP::Response->new(200, 'OK', ['Content-Type' => 'text/plain'], ''));
$browser->map_response(qr{\Q$bad_request_400\E},  HTTP::Response->new(400));
$browser->map_response(qr{\Q$unauthorized_401\E}, HTTP::Response->new(401));
$browser->map_response(qr{\Q$forbidden_403\E},    HTTP::Response->new(403));
$browser->map_response(qr{\Q$not_found_404\E},    HTTP::Response->new(404));

$info = IP::Info->new(apikey => $apikey, secret => $secret, browser => $browser);
eval { $response = $info->_process($ok_200_with_data)  };
$exception = HTTP::Exception->caught;
ok(!$exception, 'No exception 200 OK with data.');
ok(!Exception::Class->caught('NoDataFoundException'), 'No NoDataFoundException cought.');

eval { $response = $info->_process($ok_200_without_data) };
$exception = HTTP::Exception->caught;
ok(!$exception, 'No exception 200 OK without data.');
ok(Exception::Class->caught('NoDataFoundException'), 'Caught NoDataFoundException.');

eval { $response = $info->_process($bad_request_400) };
$exception = HTTP::Exception->caught;
ok($exception, 'Caught exception 400 Bad Request.');
is($exception->code, 400, 'Expected 400 Bad Request response.');

eval { $response = $info->_process($unauthorized_401) };
$exception = HTTP::Exception->caught;
ok($exception, 'Caught exception 401 Unauthorized.');
is($exception->code, 401, 'Expected 401 Unauthorized response.');

eval { $response = $info->_process($forbidden_403) };
$exception = HTTP::Exception->caught;
ok($exception, 'Caught exception 403 Forbidden.');
is($exception->code, 403, 'Expected 403 Forbidden response.');

eval { $response = $info->_process($not_found_404) };
$exception = HTTP::Exception->caught;
ok($exception, 'Caught exception 404 Not Found.');
is($exception->code, 404, 'Expected 404 Not Found response.');

done_testing();