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 tests => 31;

use_ok 'Rex::Task';
use_ok 'Rex::Commands';
Rex::Commands->import;

my $t1 = Rex::Task->new( name => "foo" );

ok( ref($t1) eq "Rex::Task", "create teask object" );

ok( $t1->get_connection_type eq "Local", "get connection type for local" );
ok( $t1->is_local == 1,                  "is task local" );
ok( $t1->is_remote == 0,                 "is task not remote" );

$t1->set_server("192.168.1.1");
ok( $t1->server->[0] eq "192.168.1.1", "get/set server" );

ok( $t1->is_local == 0, "is task not local" );

$t1->set_desc("Description");
ok( $t1->desc eq "Description", "get/set description" );

ok( $t1->get_connection_type eq "SSH", "get connection type for ssh" );
ok( $t1->want_connect == 1,            "want a connection?" );
$t1->modify( "no_ssh", 1 );
ok( $t1->want_connect == 0,             "want no connection?" );
ok( $t1->get_connection_type eq "Fake", "get connection type for fake" );
$t1->modify( "no_ssh", 0 );
ok( $t1->want_connect == 1,            "want a connection?" );
ok( $t1->get_connection_type eq "SSH", "get connection type for ssh" );

$t1->set_user("root");
ok( $t1->user eq "root", "get/set the user" );
$t1->set_password("f00b4r");
ok( $t1->password eq "f00b4r", "get/set the password" );

ok( $t1->name eq "foo", "get task name" );

$t1->set_auth( "user", "foo" );
ok( $t1->user eq "foo", "set auth user" );
$t1->set_auth( "password", "baz" );
ok( $t1->password eq "baz", "set auth password" );

my $test_var = 0;
$t1->set_code(
  sub {
    $test_var = connection()->server;
  }
);

ok( !$t1->connection->is_connected, "connection currently not established" );
$t1->modify( "no_ssh", 1 );
$t1->connect("localtest");
ok( $t1->connection->is_connected, "connection established" );
$t1->run("localtest");
ok( $test_var eq "localtest", "task run" );
$t1->disconnect();

my $before_hook = 0;
$t1->delete_server;
ok( $t1->is_remote == 0, "task is no more remote" );
ok( $t1->is_local == 1,  "task is now local" );

$t1->modify(
  before => sub {
    my $server     = shift;
    my $server_ref = shift;

    $before_hook = 1;
    $$server_ref = "local02";
  }
);

my $server = $t1->current_server;
$t1->run_hook( \$server, "before" );

ok( $before_hook == 1,   "run before hook" );
ok( $t1->is_remote == 1, "task is now remote" );
ok( $t1->is_local == 0,  "task is no more local" );

$t1->modify(
  before => sub {
    my $server     = shift;
    my $server_ref = shift;

    $before_hook = 2;
    $$server_ref = "<local>";
  }
);

$server = $t1->current_server;
$t1->run_hook( \$server, "before" );

ok( $before_hook == 2,   "run before hook - right direction" );
ok( $t1->is_remote == 0, "task is no not remote" );
ok( $t1->is_local == 1,  "task is now local" );