AnsibleModule

 view release on metacpan or  search on metacpan

lib/Test/AnsibleModule.pm  view on Meta::CPAN

package Test::AnsibleModule;

use Mojo::Base -base;
use Test::More;
use Mojo::JSON qw/decode_json encode_json/;
use Mojo::Asset::File;
use Carp qw/croak/;
use Data::Dumper qw/Dumper/;
$Data::Dumper::Sortkeys++;

has 'last_response';
has 'success';

sub fail_ok {
  my $self = shift;
  my $rc   = $self->exec_module(@_);
  $self->_test('ok', $rc, 'Returned non-zero return code');
}

sub is_response {
  my $self = shift;
  my $res  = shift;
  $self->_test('is', Dumper($self->last_response), Dumper($res), @_);
}

sub run_ok {
  my $self = shift;
  my $rc   = $self->exec_module(@_);
  $self->_test('ok', !$rc,
    'Response code is success (' . $self->last_response->{msg} . ')');
}

sub exec_module {
  my $self   = shift;
  my $module = shift;
  my $args   = ref $_[0] ? $_[0] : {@_};

  my $file = Mojo::Asset::File->new;
  $file->add_chunk(encode_json($args));
  my $p;

  open($p, "-|", join(" ", $module, $file->path))
    // croak "Could not run module: $!";
  my $response = "";

  while (my $line = <$p>) {
    $response .= $line;
  }
  my $res = decode_json($response);
  $self->last_response($res);
  close $p;
  return $? >> 8;
}

sub _test {
  my ($self, $name, @args) = @_;
  local $Test::Builder::Level = $Test::Builder::Level + 2;
  return $self->success(!!Test::More->can($name)->(@args));
}


1;

=head1 NAME

Test::AnsibleModule - Test your ansible modules.

=head1 SYNOPSIS



( run in 1.647 second using v1.01-cache-2.11-cpan-39bf76dae61 )