App-Easer

 view release on metacpan or  search on metacpan

t/V2/LocalTester.pm  view on Meta::CPAN

package LocalTester;
use v5.24;
use experimental 'signatures';
use Capture::Tiny 'capture';
use App::Easer V2 => 'run';
use Test::More;
use Exporter 'import';
use Data::Dumper;

our @EXPORT = qw< test_run executor >;

sub executor ($cb = undef) {
   return sub ($self) {
      LocalTester::command_execute($self);
      $cb->($self) if $cb;
      return $self->name;
   };
}

sub test_run ($app, $args, $env, $expected_command = 'MAIN') {
   my ($stdout, $stderr, @result, $clean_run, $exception);
   my $self = bless {}, __PACKAGE__;
   local *LocalTester::command_execute = sub ($cmd) {
      my $name = $self->{name} = $cmd->name;
      return unless $name eq ($expected_command // '');
      $self->{conf} = $cmd->config_hash;
      $self->{args} = [$cmd->residual_args];
   };
   eval {
      local @ENV{keys $env->%*};
      while (my ($k, $v) = each $env->%*) {
         if (defined $v) { $ENV{$k} = $v }
         else { delete $ENV{$k} }
      }
      $self->@{qw< stdout stderr result >} = capture {
         scalar run($app, $0, $args->@*)
      };
      1;
   } or do { $self->{exception} = $@ };
   return $self;
} ## end sub test_run

sub stdout_like ($self, $regex, $name = 'stdout') {
   like $self->{stdout} // '', $regex, $name;
   return $self;
}

sub stdout_unlike ($self, $regex, $name = 'stdout') {
   unlike $self->{stdout} // '', $regex, $name;
   return $self;
}

sub diag_stdout ($self) {
   diag $self->{stdout};
   return $self;
}

sub diag_stderr ($self) {
   diag $self->{stderr};
   return $self;
}

sub stderr_like ($self, $regex, $name = 'stderr') {
   like $self->{stderr} // '', $regex, $name;
   return $self;
}

sub name_is ($self, $expected, $test_name = undef) {
   $test_name //= "command name is '$expected'";
   is $self->{name}, $expected, $test_name;
   return $self;
}

sub conf_is ($self, $expected, $name = 'configuration') {
   local $Data::Dumper::Indent = 1;
   local $Data::Dumper::Sortkeys = 1;
   is_deeply $self->{conf}, $expected, $name
      or diag Dumper({ got => $self->{conf}, expected => $expected });
   return $self;
}

sub conf_contains ($self, $expected, $name = 'partial configuration') {
   my $got = { map { $_ => $self->{conf}{$_} } keys $expected->%* };
   is_deeply $got, $expected, $name;
   return $self;
}

sub args_are ($self, $expected, $name = 'residual arguments') {
   is_deeply $self->{args}, $expected, $name;
   return $self;
}

sub result_is ($self, $expected, $name = undef) {
   $name //= "result is '$expected'";
   is $self->{result}, $expected, $name;
   return $self;
}

sub no_exceptions ($self, $name = 'no exceptions raised') {
   ok !exists($self->{exception}), $name
      or diag $self->{exception};
   return $self;
}

sub exception_like ($self, $regex, $name = 'exception') {
   like $self->{exception} // '', $regex, $name;
   return $self;
}

1;



( run in 1.396 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )