use strict;
use warnings;

use Test::More tests => 113;
use Data::Dumper;

use_ok 'Rex';
use_ok 'Rex::Config';
use_ok 'Rex::Group';
use_ok 'Rex::Task';
use_ok 'Rex::TaskList';
use_ok 'Rex::Commands';
use_ok 'Rex::Commands::Run';
use_ok 'Rex::Commands::Upload';

Rex->import( -feature => 0.31 );
Rex::Commands->import();

user("root3");
password("pass3");
private_key("priv.key3");
public_key("pub.key3");

key_auth();

no warnings;
ok( Rex::TaskList->create()->is_default_auth() == 0, "default auth off" );
use warnings;

group( "foo", "server1", "server2", "server3" );
group( "bar", "serv[01..10]" );

my @servers = Rex::Group->get_group("foo");
ok( $servers[0] eq "server1", "get_group" );
ok( $servers[2] eq "server3", "get_group" );

@servers = Rex::Group->get_group("bar");
@servers = $servers[0]->get_servers;
ok( $servers[0] eq "serv01", "get_group with evaluation" );
ok( $servers[5] eq "serv06", "get_group with evaluation" );

task( "authtest1", group => "foo", sub { } );
task( "authtest2", group => "bar", sub { } );
task( "authtest3", "srv001", sub { } );

my $task       = Rex::TaskList->create()->get_task("authtest3");
my @all_server = @{ $task->server };

for my $server (@all_server) {
  my $auth = $task->merge_auth($server);
  ok( $auth->{user} eq "root3",            "merge_auth - user" );
  ok( $auth->{password} eq "pass3",        "merge_auth - pass" );
  ok( $auth->{public_key} eq "pub.key3",   "merge_auth - pub" );
  ok( $auth->{private_key} eq "priv.key3", "merge_auth - priv" );
  ok( $auth->{auth_type} eq "key",         "merge_auth - auth" );
}

pass_auth();

for my $server (@all_server) {
  my $auth = $task->merge_auth($server);
  ok( $auth->{user} eq "root3",            "merge_auth - user" );
  ok( $auth->{password} eq "pass3",        "merge_auth - pass" );
  ok( $auth->{public_key} eq "pub.key3",   "merge_auth - pub" );
  ok( $auth->{private_key} eq "priv.key3", "merge_auth - priv" );
  ok( $auth->{auth_type} eq "pass",        "merge_auth - auth" );
}

auth( for => "bar", user => "jan", password => "foo" );

$task = Rex::TaskList->create()->get_task("authtest1");

@all_server = @{ $task->server };

for my $server (@all_server) {
  my $auth = $task->merge_auth($server);
  ok( $auth->{user} eq "root3",            "merge_auth - user" );
  ok( $auth->{password} eq "pass3",        "merge_auth - pass" );
  ok( $auth->{public_key} eq "pub.key3",   "merge_auth - pub" );
  ok( $auth->{private_key} eq "priv.key3", "merge_auth - priv" );
}

$task       = Rex::TaskList->create()->get_task("authtest2");
@all_server = @{ $task->server };

for my $server (@all_server) {
  my $auth = $task->merge_auth($server);
  ok( $auth->{user} eq "jan",              "merge_auth - user" );
  ok( $auth->{password} eq "foo",          "merge_auth - pass" );
  ok( $auth->{public_key} eq "pub.key3",   "merge_auth - pub" );
  ok( $auth->{private_key} eq "priv.key3", "merge_auth - priv" );
  ok( $auth->{auth_type} eq "try",         "merge_auth - auth_type" );
  ok( !$auth->{sudo},                      "merge_auth - sudo" );
}

auth(
  for         => "authtest1",
  user        => "deploy",
  password    => "baz",
  private_key => FALSE(),
  public_key  => FALSE(),
  sudo        => TRUE()
);

$task       = Rex::TaskList->create()->get_task("authtest1");
@all_server = @{ $task->server };

for my $server (@all_server) {
  my $auth = $task->merge_auth($server);
  ok( $auth->{user} eq "deploy",       "merge_auth - user" );
  ok( $auth->{password} eq "baz",      "merge_auth - pass" );
  ok( $auth->{public_key} == FALSE(),  "merge_auth - pub" );
  ok( $auth->{private_key} == FALSE(), "merge_auth - priv" );
  ok( $auth->{auth_type} eq "pass",    "merge_auth - auth_type" );
  ok( $auth->{sudo} == TRUE(),         "merge_auth - sudo" );
}

