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

use strict;
use warnings;
no warnings qw( uninitialized );

use Test::More;

use List::MoreUtils qw( uniq );
use Data::Dumper;
use WebService::Blekko;

use LWP::Protocol;

my $skip = '';

eval "use YAML";
if ( $@ )
{
    $skip .= "no YAML ";
}

if ( ! LWP::Protocol::implementor( 'https' ) )
{
    $skip .= "no https ";
}

if ( $skip ne '' )
{
    plan skip_all => "$skip, no rw testing.";
    exit 0;
}

my $yaml_file = $ENV{SLASHTAGS_RW_CONFIG} || "$ENV{HOME}/.blekko-api-test";
if ( ! -f $yaml_file )
{
    plan skip_all => "No credentials file, skipping read/write slashtag testing";
    exit 0;
}

plan tests => 71;

my $yaml = YAML::LoadFile( $yaml_file );
my $server = $yaml->{server};
my $user = $yaml->{user};
my $password = $yaml->{password};

my $answer;

my $blekko = WebService::Blekko->new( server => $server,
                                      cookie_jar_file => '$ENV{HOME}/.blekkojson-cookies',
                                      auth => 'webservice-blekko-testing', );
my $badserver = WebService::Blekko->new( server => 'doesnotexist.blekko.com',
                                      cookie_jar_file => '$ENV{HOME}/.blekkojson-cookies',
                                      auth => 'webservice-blekko-testing', );
my $redirserver = WebService::Blekko->new( server => 'bugz.blekko.com',
                                      cookie_jar_file => '$ENV{HOME}/.blekkojson-cookies',
                                      auth => 'webservice-blekko-testing', );
my $four04server = WebService::Blekko->new( server => 'bugz.blekko.com', scheme => 'https',
                                      cookie_jar_file => '$ENV{HOME}/.blekkojson-cookies',
                                      auth => 'webservice-blekko-testing', );
my $nocookiejar = WebService::Blekko->new( server => 'doesnotexist.blekko.com',
                                      auth => 'webservice-blekko-testing', );

# login / logout

$answer = $nocookiejar->login( $user, $password );
ok( $answer->error, "login with nocookiejar fails" );
ok( ! $answer->result, "login with nocookiejar fails" );
ok( $answer->http_code == '200', "login with nocookiejar is 200" );

{
    local $TODO = "Causing HTTP::Message content not bytes at .../LWP/UserAgent.pm line 966";
    eval {
        $answer = $badserver->login( $user, $password );
    };
    ok( $answer->error, "login to badserver is error" );
    ok( ! $answer->result, "login to badserver is no result" );

    eval {
        $answer = $badserver->logout();
    };
    ok( $answer->error, "logout from badserver is error" );
    ok( ! $answer->result, "logout from badserver is no result" );
}

$answer = $redirserver->login( $user, $password );
ok( $answer->error, "login to redirserver is error" );
ok( ! $answer->result, "login to redirserver is no result" );

$answer = $redirserver->logout();
ok( $answer->error, "logout from redirserver is error" );
ok( ! $answer->result, "logout from redirserver is no result" );

$answer = $four04server->login( $user, $password );
ok( $answer->error, "login to four04server fails" );
ok( ! $answer->result, "login to four04server fails" );
ok( $answer->http_code =~ /^(404|301|302)/, "login to four04server is 404 or redir: got ".$answer->http_code );

$answer = $four04server->logout();
ok( $answer->error, "logout from four04server is error" );
ok( ! $answer->result, "logout from four04server is no result" );
ok( $answer->http_code =~ /^(404|301|302)/, "logout from four04server is 404 or redir: got ".$answer->http_code );

$answer = $blekko->login( $user, $password );
ok( ! $answer->error, "login to blekko no error" );
ok( $answer->result, "login to blekko result" );

$answer = $blekko->user_info();
ok( ! $answer->error, "user_info while logged in no error" );
ok( $answer->result eq $user, "user_info while logged in result" );

$answer = $blekko->logout();
ok( ! $answer->error, "logout from blekko no error" );
ok( $answer->result, "logout from blekkoresult" );

$answer = $blekko->user_info();
ok( $answer->error, "user_info while logged out is error" );
ok( ! $answer->result, "user_info while logged out no result" );

$answer = $blekko->logout();
ok( ! $answer->error, "logout twice from blekko no error" );
ok( $answer->result, "logout twice from blekko result" );

$answer = $blekko->login( $user, $password );
ok( $answer->result, "re-login to blekko no error" );
ok( ! $answer->error, "re-login to blekko result" );

# delete_urls / list / add_urls

my @urls = ( 'www.nytimes.com', 'www.huffingtonpost.com' );
my @fullurls = ( 'http://www.nytimes.com/', 'http://www.huffingtonpost.com/' );
my @temp;

# failures first
# XXX urls must be an array ref

$answer = $blekko->delete_urls( 'teaaaasttag1', \@urls );
ok( $answer->error, "deleting urls from non-existant teaaasttag1 is error" );
ok( ! $answer->result, "deleting urls from non-existant teaaasttag1 no result" );
$answer = $blekko->list_urls( 'teaaasttag1' );
ok( $answer->error, "listing urls in non-existant teaaasttag1 is error" );
ok( ! $answer->result, "listing urls in non-existant teaaasttag1 no result" );
$answer = $blekko->add_urls( 'teaaasttag1', \@urls );
ok( $answer->error, "adding urls to non-existing slashtag is error" );
ok( ! $answer->result, "adding urls to non-existing slashtag no result" );

$answer = $blekko->logout();
ok( ! $answer->error, "logout from blekko no errro" );
ok( $answer->result, "logout from blekko result" );

$answer = $blekko->delete_urls( 'testtag1', \@urls );
ok( $answer->error, "deleting urls fails while logged out is error" );
ok( ! $answer->result, "deleting urls fails while logged out no result" );
$answer = $blekko->add_urls( 'testtag1', \@urls );
ok( $answer->error, "adding urls fails while logged out is  error" );
ok( ! $answer->result, "adding urls fails while logged out no result" );

$answer = $blekko->login( $user, $password );
ok( ! $answer->error, "re-login to blekko no errro" );
ok( $answer->result, "re-login to blekko result" );

# now successes
# delete urls, just to be sure they aren't there, delete always succeeds

$answer = $blekko->delete_urls( 'testtag1', \@urls );
ok( ! $answer->error, "deleting urls from testtag1 no error" );
ok( $answer->result, "deleting urls from testtag1 result" );
$answer = $blekko->list_urls( 'testtag1' );
ok( ! $answer->error, "listing urls in testtag1 no error" );
ok( ref $answer->result eq 'ARRAY', "return value from list is array ref" );
@temp = @{$answer->result};
push @temp, @fullurls;
ok( scalar @{$answer->result} == scalar( uniq @temp ) - 2, "deleted urls are not in list of testtag1" );

# add urls

$answer = $blekko->add_urls( 'testtag1', \@urls );
ok( ! $answer->error, "adding urls to testtag1 no error" );
ok( $answer->result, "adding urls to testtag1 result" );
$answer = $blekko->list_urls( 'testtag1' );
ok( ! $answer->error, "listing urls in testtag1 no error" );
ok( ref $answer->result eq 'ARRAY', "return value from list is array ref" );
@temp = @{$answer->result};
push @temp, @fullurls;
ok( scalar @{$answer->result} == scalar( uniq @temp ), "added urls are in list in testtag1" );

# delete urls
# XXX urls must be an array ref

$answer = $blekko->delete_urls( 'testtag1', \@urls );
ok( ! $answer->error, "deleting urls from testtag1 no error" );
ok( $answer->result, "deleting urls from testtag1 result" );
$answer = $blekko->list_urls( 'testtag1' );
ok( ! $answer->error, "listing urls in testtag1 no error" );
ok( ref $answer->result eq 'ARRAY', "return value from list is array ref" );
@temp = @{$answer->result};
push @temp, @fullurls;
ok( scalar @{$answer->result} == scalar( uniq @temp ) - 2, "deleted urls are not in list of testtag1" );

$answer = $blekko->logout();
ok( ! $answer->error, "re-logout from blekko no error" );
ok( $answer->result, "re-logout from blekko result" );

# create_slashtag
# XXX illegal tag name
# XXX urls must be an array ref
# XXX logged in
# XXX tag already exists

$answer = $blekko->login( $user, $password );
ok( ! $answer->error, "re-login to blekko no error" );
ok( $answer->result, "re-login to blekko result" );
my $tagname = sprintf "tag%4.4d", int( rand( 9999 ) );
$answer = $blekko->create_slashtag( $tagname, \@urls, "A test tag" );
ok( ! $answer->error, "create_slashtag $tagname no error" );
ok( $answer->result, "create_slashtag $tagname result" );
$answer = $blekko->list_urls( $tagname );
ok( ! $answer->error, "listing urls in $tagname no error" );
ok( ref $answer->result eq 'ARRAY', "return value from list is array ref" );
ok( scalar @{$answer->result} == scalar @fullurls, "correct number of urls in $tagname" );

# remove_slashtag
{
    $TODO="Needs a bugfix";
    $answer = $blekko->remove_slashtag( $tagname );
    ok( ! $answer->error, "delete $tagname no error" );
    ok( $answer->result, "delete $tagname result" );
}
$answer = $blekko->remove_slashtag( $tagname );
ok( $answer->error, "delete $tagname twice fails error" );
ok( ! $answer->result, "delete $tagname twice fails no result" );