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

use strict;
use warnings;

use AnyEvent;
use Test::More;
use Test::Fork;
use Test::Fatal;
use Juno::Check::RawCommand;
use File::Temp 'tempfile';

{
    local $@ = undef;
    eval 'use System::Command';
    $@ and plan skip_all => 'System::Command is required for this test';
}

plan tests => 6;

like(
    exception { Juno::Check::RawCommand->new },
    qr/^\QAttribute (cmd) is required\E/,
    'Attribute cmd required',
);

is(
    exception { Juno::Check::RawCommand->new( host => 'this', cmd => 'that' ) },
    undef,
    'Successfully created RawCommand check object',
);

my $cv    = AnyEvent->condvar;
my $check = Juno::Check::RawCommand->new(
    hosts     => ['thedude'],
    cmd        => 'pick %h',
    on_success => sub { $cv->send },
);

{
    no warnings qw/redefine once/;
    *System::Command::new = sub {
        my $class = shift;
        my $run   = shift;

        is( $class, 'System::Command', 'Correct class'          );
        is( $run,   'pick thedude',    'Command template works' );

        return bless {}, $class;
    };

    *System::Command::stdout = sub {
        my ( $fh, $file ) = tempfile;
        return $fh;
    };

    *System::Command::stderr = sub {
        my ( $fh, $file ) = tempfile;
        return $fh;
    };

    *System::Command::exit = sub {0};

    # appease System::Command
    *System::Command::_reap = sub {0};
}

isa_ok( $check, 'Juno::Check::RawCommand' );
fork_ok( 2, sub {
    $check->check;
    $cv->recv;
} );