The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
# vim: softtabstop=4 tabstop=4 shiftwidth=4 ft=perl expandtab smarttab
#
 BEGIN {
    unless ($ENV{TEST_AUTHOR}) {
        print qq{1..0 # SKIP these tests only run with TEST_AUTHOR set\n};
        exit
    }
}

use strict;
use warnings 'all';

use lib 't/lib';

use BZ::Client::Test;
use Test::More;

# use Data::Dumper;
# $Data::Dumper::Indent   = 1;
# $Data::Dumper::Sortkeys = 1;

# these next three lines need more thought
use Test::RequiresInternet ( 'landfill.bugzilla.org' => 443 );
my @bugzillas = do 't/servers.cfg';

plan tests => (scalar @bugzillas * 10);

for my $server (@bugzillas) {
    diag(sprintf 'Server version: %s', $server->{version} || '???' );
    my $tester = BZ::Client::Test->new( %$server, logDirectory => '/tmp/bz' );

  SKIP: {
        skip( 'No Bugzilla server configured, skipping', 10 )
          if $tester->isSkippingIntegrationTests();

        my $client = $tester->client();

        # check client isnt logged in before log in
      diag( sprintf 'apikey: %s', $server->{testApiKey} || 'NaN' );

      SKIP: {
            skip( 'Always logged in when using apikey', 1 )
              if $server->{testApiKey};
            ok( !$client->is_logged_in(),
                'The client is NOT already logged in' )
              or
              BAIL_OUT( 'Already logged in? cannot proceed' . Dumper($client) );
        }

        # try to login
        {
            my $ret;
            eval { $ret = $client->login(); };

            if ($@) {
                my $err = $@;
                my $msg;
                if ( ref($err) eq 'BZ::Client::Exception' ) {
                    $msg =
                      'Error: '
                      . ( defined( $err->http_code() )   ? $err->http_code()   : 'undef' ) . ', '
                      . ( defined( $err->xmlrpc_code() ) ? $err->xmlrpc_code() : 'undef' ) . ', '
                      . ( defined( $err->message() )     ? $err->message()     : 'undef' );
                }
                else {
                    $msg = "Error: $err";
                }
                ok( 0, 'No errors from ->login' ) or diag($msg);
            }
            else {
                ok( 1, 'No errors from ->login' );
            }

            ok( $ret,                    '->login returned true' )
                or diag 'Expected true, got: ' . ( defined $ret ? $ret : 'undef' );
            ok( $client->is_logged_in(), 'The client IS now logged in' )
              or BAIL_OUT('Not logged in, cannot proceed');

        }

        # logout when logged in
        {
            my $ret;
            eval { $ret = $client->logout(); };

            if ($@) {
                my $err = $@;
                my $msg;
                if ( ref($err) eq 'BZ::Client::Exception' ) {
                    $msg =
                      'Error: '
                      . ( defined( $err->http_code() )   ? $err->http_code()   : 'undef' ) . ', '
                      . ( defined( $err->xmlrpc_code() ) ? $err->xmlrpc_code() : 'undef' ) . ', '
                      . ( defined( $err->message() )     ? $err->message()     : 'undef' );
                }
                else {
                    $msg = "Error: $err";
                }
                ok( 0, 'No errors from ->logout when already logged in' ) or diag($msg);
            }
            else {
                ok( 1, 'No errors from ->logout when already logged in' );
            }

            ok( $ret, '->logout returned true when already logged in' )
                or diag 'Expected true, got: ' . ( defined $ret ? $ret : 'undef' );
            diag( sprintf 'apikey: %s', $server->{testApiKey} || 'NaN' );

          SKIP: {
                skip( 'Always logged in when using apikey', 1 )
                  if $server->{testApiKey};
                ok( !$client->is_logged_in(),
                    'The client is no longer logged in.' );
            }
        }

        # logout when not logged in
        {
            my $ret;
            eval { $ret = $client->logout(); };

            if ($@) {
                my $err = $@;
                my $msg;
                if ( ref($err) eq 'BZ::Client::Exception' ) {
                    $msg =
                      'Error: '
                      . ( defined( $err->http_code() )   ? $err->http_code()   : 'undef' ) . ', '
                      . ( defined( $err->xmlrpc_code() ) ? $err->xmlrpc_code() : 'undef' ) . ', '
                      . ( defined( $err->message() )     ? $err->message()     : 'undef' );
                }
                else {
                    $msg = "Error: $err";
                }
                ok( 0, 'No errors from ->logout when not logged in' ) or diag($msg);
            }
            else {
                ok( 1, 'No errors from ->logout when not logged in' );
            }

            ok( $ret, '->logout when not logged in, returned true' )
                or diag 'Expected true, got: ' . ( defined $ret ? $ret : 'undef' );
            diag( sprintf 'apikey: %s', $server->{testApiKey} || 'NaN' );
          SKIP: {
                skip( 'Always logged in when using apikey', 1 )
                  if $server->{testApiKey};
                ok( !$client->is_logged_in(),
                    'The client is STILL not logged in.' );
            }

        }

    }

}

1