The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test2::Bundle::Extended;
use Test::Clustericious::Config;

subtest exports => sub {

  imported_ok $_ for qw(
    create_config_ok
    create_directory_ok
    home_directory_ok
    create_config_helper_ok
  );
  
};

subtest create_config_ok => sub {

  use Clustericious::Config;

  my $r;
  
  is(
    intercept { $r = create_config_ok 'Foo' => { foo => 1 } },
    array {
      event Ok => sub {
        call pass => T();
        call name => match qr{^create config for Foo at .*/etc/Foo.conf$};
      };
      end;
    },
    'create_config_ok Foo, { foo => 1 }',
  );
  
  my $foo = Clustericious::Config->new('Foo');
  is $foo->foo, 1, 'foo.foo = 1';
  ok $r, "r = $r";

  is(
    intercept { $r = create_config_ok 'Bar' },
    array {
      event Ok => sub {
        call pass => T();
        call name => match qr{^create config for Bar at .*/etc/Bar.conf$};
      };
      end;
    },
    'create_config_ok Bar',
  );

  my $bar = Clustericious::Config->new('Bar');
  is $bar->bar, 1, 'bar.bar = 1';
  ok $r, "r = $r";

  is(
    intercept { $r = create_config_ok 'Baz' },
    array {
      event Ok => sub {
        call pass => F();
        call name => 'create config for Baz';
      };
      event Diag => sub {};
      event Diag => sub {
        call message => 'unable to locate text for Baz';
      };
      end;
    },
    'create_config_ok Baz',
  );
  
  is $r, F(), "r is false";
  
  is(
    intercept { $r = create_config_ok 'Lomo' => "---\nlomo: 1" },
    array {
      event Ok => sub {
        call pass => T();
        call name => match qr{^create config for Lomo at .*/etc/Lomo.conf$};
      };
      end;
    },
    'create_config_ok Lomo, "..."',
  );

  my $lomo = Clustericious::Config->new('Lomo');
  is $lomo->lomo, 1, 'lomo.lomo = 1';
  ok $r, "r = $r";
  
};

subtest create_directory_ok => sub {

  use File::Glob qw( bsd_glob );
  use File::Spec;

  my $r;
  
  is(
    intercept { $r = create_directory_ok 'foo/bar/baz' },
    array {
      event Ok => sub {
        call pass => T();
        call name => match qr{^create directory .*/foo/bar/baz$};
      };
      end;
    },
    'create_directory_ok foo/bar/baz'
  );
  
  ok -d $r, "r = $r";
  
  my $expected = File::Spec->catfile(bsd_glob '~/foo/bar/baz');
  
  ok -d $expected, "expected = $expected";

  is(
    intercept { $r = create_directory_ok undef },
    array {
      event Ok => sub {
        call pass => F();
        call name => 'create directory [undef]';
      };
      event Diag => sub {};
      end;
    },
    'create_directory_ok undef',
  );

};

subtest home_directory_ok => sub {

  my $r;
  
  is(
    intercept { $r = home_directory_ok },
    array {
      event Ok => sub {
        call pass => T();
        call name => match qr{^home directory };
      };
      end;
    },
    'home_directory_ok',
  );
  
  ok -d $r, "r = $r";

};

subtest create_config_helper_ok => sub {

  my $r;
  
  is(
    intercept { $r = create_config_helper_ok leaf => sub { 42 } },
    array {
      event Ok => sub {
        call pass => T();
        call name => 'create config helper leaf';
      };
      end;
    },
    'create_config_helper_ok',
  );
  
  is $r, T(), "r = $r";
  
  create_config_ok 'Leaf';

  my $leaf = Clustericious::Config->new('Leaf');
  is $leaf->leaf, 42, 'leaf.leaf = 42';

};

done_testing;

__DATA__

@@ etc/Bar.conf
---
bar: 1


@@ etc/Leaf.conf
leaf: <%= leaf %>