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

use strict;
use warnings;

use Test::More;
use Test::Fatal qw( exception success );
use Net::Minecraft::Login;

my $ex;
my $req;
my $res;

sub test_login {
  my (@arg) = @_;
  no warnings 'redefine';
  undef $req;
  undef $res;
  local *Net::Minecraft::Login::_do_request = sub {
    my ( $class, $base, $param, $config ) = @_;
    $req = $param;
    return {
      success => 1,
      status  => 200,
      content => '1343825972000:deprecated:SirCmpwn:7ae9007b9909de05ea58e94199a33b30c310c69c:dba0c48e1c584963b9e93a038a66bb98'
    };
  };
  return ( $res = Net::Minecraft::Login->new()->login(@arg) );
}

sub test_result {
  subtest result_check => sub {
    is( $res->current_version, '1343825972000',                            'Current Version' );
    is( $res->download_ticket, 'deprecated',                               'Download Ticket ( Deprecated )' );
    is( $res->user,            'SirCmpwn',                                 'Fixed username', );
    is( $res->session_id,      '7ae9007b9909de05ea58e94199a33b30c310c69c', 'session id' );
    is( $res->unique_id,       'dba0c48e1c584963b9e93a038a66bb98',         'unique id' );
  };
}

ok( not( $ex = exception { test_login( user => 'Foo', password => 'bar', ) } ), "Login with both args" ) or diag $ex;

ok( defined $req, 'Data in $req' );

is_deeply( $req, { user => 'Foo', password => 'bar', version => '13' }, 'Data structure matches' );

isa_ok( $res, 'Net::Minecraft::LoginResult' );
test_result();

ok( not( $ex = exception { test_login( { user => 'Foo', password => 'bar', } ); } ), "Login with both args ( ref )" ) or diag $ex;

ok( defined $req, 'Data in $req' );

is_deeply( $req, { user => 'Foo', password => 'bar', version => '13' }, 'Data structure matches' );
isa_ok( $res, 'Net::Minecraft::LoginResult' );
test_result();

ok( $ex = exception { test_login() }, "Login without args => Bad" );

note $ex;

ok( $ex = exception { test_login( \1 ) }, "Login 1 arg non-hash ref => Bad" );

note $ex;

ok( $ex = exception { test_login( 1, 2, 3 ) }, "Login with 3 args => bad" );

note $ex;

ok( $ex = exception { test_login( password => bar => ) }, "No user => bad" );

note $ex;

ok( $ex = exception { test_login( user => bar => ) }, "No password => bad" );

note $ex;

ok( $ex = exception { test_login( user => bar => password => bar => foo => quux => ) }, "Unknown params => bad" );

note $ex;
done_testing();