#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 17;
use Test::MockObject;
use Test::Exception;
use File::Temp qw/tempdir/;
use File::Path qw/rmtree/;
use File::Spec;
my $m; BEGIN { use_ok($m = "Verby::Action::MkPath") }
my $dir = tempdir(CLEANUP => 1);
my $c = Test::MockObject->new;
$c->set_false("error");
$c->set_always(path => my $target = File::Spec->catdir($dir, qw/some nested dir/));
$c->set_always(logger => my $logger = Test::MockObject->new);
$logger->set_true("info");
$logger->mock(log_and_die => sub { shift; die "@_" });
isa_ok(my $a = $m->new, $m);
ok(! -e $target, "dir '$target' does not yet exist");
ok(!$a->verify($c), "verify is false");
$c->called_ok("path");
dies_ok { $a->confirm($c) } "confirm is fatal";
$c->clear;
lives_ok { $a->do($c) } "do doesn't die";
$c->called_ok("path");
ok($a->verify($c), "verify is true");
lives_ok { $a->confirm($c) } "confirm lives";
ok(-d $target, "target exists now");
dies_ok { $a->do($c) } "can't create twice, directory exists";
my $target_f = File::Spec->catfile($target, "foo");
open my $fh, ">", $target_f;
$c->set_always(path => $target_f);
isa_ok(my $b = $m->new, $m);
ok(!$b->verify($c), "file isn't a dir");
dies_ok { $b->do($c) } "can't do";
dies_ok { $b->confirm($c) } "can't confirm";
close $fh;
$logger->called_ok("info");