The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# t/08-sha.t
#
# This test script is for the optional external parsing of
# configuration files using Config::Merge.
#
# It specifically tries to address a problem I was having with the SHA1
# hash working correctly on my Mac but not on Ubuntu
#
# vim: syntax=perl

BEGIN {
    use vars qw( $req_cm_err );
    eval 'require Config::Merge;';
    $req_cm_err = $@;
}

use Test::More tests => 6;
use DateTime;
use Path::Class;
use Data::Dumper;
use Carp qw(confess);

my $ver1 = '777fd3790995c010b20a9d7af47ec4d72d472b3e';

my $gitdb1   = 't/08-sha-1.git';
my $cfgdata1 = 't/08-sha-1.conf';
my $gitdb2   = 't/08-sha-2.git';
my $cfgdir2   = 't/08-sha-2.d';

dir($gitdb1)->rmtree;
dir($gitdb2)->rmtree;

package MyConfig2;

use Moose;

extends 'Config::Versioned';

use Data::Dumper;

sub parser {
    my $self     = shift;
    my $params   = shift;
    my $filename = '';

    my $cm    = Config::Merge->new($cfgdir2);
    my $cmref = $cm->();

    my $tree = $self->cm2tree($cmref);

    $params->{comment} = 'import from  using Config::Merge';

    if ( not $self->commit( $tree, $params ) ) {
        die "Error committing import from $filename: $@";
    }
}

sub cm2tree {
    my $self = shift;
    my $cm   = shift;

    if ( ref($cm) eq 'HASH' ) {
        my $ret = {};
        foreach my $key ( keys %{$cm} ) {
            $ret->{$key} = $self->cm2tree( $cm->{$key} );
        }
        return $ret;
    }
    elsif ( ref($cm) eq 'ARRAY' ) {
        my $ret = {};
        my $i   = 0;
        foreach my $entry ( @{$cm} ) {
            $ret->{ $i++ } = $self->cm2tree($entry);
        }
        return $ret;
    }
    else {
        return $cm;
    }
}

package main;

my $cfg1 = Config::Versioned->new(
    {   dbpath      => $gitdb1,
        autocreate  => 1,
        filename    => $cfgdata1,
#        path        => [qw( t )],
        commit_time => DateTime->from_epoch( epoch => 1240341682 ),
        author_name => 'Test User',
        author_mail => 'test@example.com',
    comment => 'import from  using Config::Merge',  # use this string to match other one we're debugging
    }
);
ok( $cfg1, 'cfg1 - created instance' );
is( $cfg1->version,           $ver1, 'cfg1 - check version of HEAD' );
is( $cfg1->get('port.host1'), '123', 'cfg1 - check param port.host1' );

SKIP: {
    skip "Config::Merge not installed", 3 if $req_cm_err;
    my $cfg2 = MyConfig2->new(
        {   dbpath      => $gitdb2,
            commit_time => DateTime->from_epoch( epoch => 1240341682 ),
            author_name => 'Test User',
            author_mail => 'test@example.com',
            autocreate  => 1,
        }
    );

    ok( $cfg2, 'cfg2 - created instance' );
    is( $cfg2->version, $ver1, 'cfg2 - check version of HEAD' );

    is( $cfg2->get('port.host1'), '123', 'cfg2 - check param port.host1' );
}