The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
## t/01-initdb.t
##
## Written 2011 by Scott Hardin for the OpenXPKI project
## Copyright (C) 2010, 2011 by Scott T. Hardin
##
## vim: syntax=perl

use Test::More tests => 22;

use strict;
use warnings;
my $gittestdir = qw( t/01-initdb.git );
my $gittestdir2 = qw( t/01-initdb-2.git );

my $ver1 = '7dd8415a7e1cd131fba134c1da4c603ecf4974e2';
my $ver2 = 'a573e9bbcaeed0be9329b25e2831a930f5b656ca';
my $ver3 = '3b5047486706e55528a2684daef195bb4f9d0923';

BEGIN {
    my $gittestdir = qw( t/01-initdb.git );

    # remove artifacts from previous run
    use Path::Class;
    use DateTime;
    dir($gittestdir)->rmtree;

    # fire it up!
    use_ok(
        'Config::Versioned',
    );
}

##
## BASIC INIT
##

my $cfg = Config::Versioned->new(
        {
            dbpath      => $gittestdir,
            autocreate  => 1,
            filename    => '01-initdb.conf',
            path        => [qw( t )],
            commit_time => DateTime->from_epoch( epoch => 1240341682 ),
            author_name => 'Test User',
            author_mail => 'test@example.com',
        }
);
ok( $cfg, 'create new config instance' );

# Internals: check that the head really points to a commit object
is( $cfg->_git()->head->kind, 'commit', 'head should be a commit' );

is( $cfg->version, $ver1, 'check version (sha1 hash) of first commit' );

# force a re-load of the configuration file we already used to ensure
# that we don't add a commit when there were no changes
$cfg->parser();
is( $cfg->version, $ver1, 're-import should not create new commit' );

# check the internal helper functions
my ( $s1, $k1 ) = $cfg->_get_sect_key('group1.ldap');
is( $s1, 'group1', "_get_sect_key section" );
is( $k1, 'ldap',   "_get_sect_key section" );

my $obj = $cfg->_findobj('group.ldap');
is( $obj, undef, '_findobj for group.ldap should fail' );

$obj = $cfg->_findobj('group1.ldap1');
is( ref($obj), 'Git::PurePerl::Object::Tree',
    '_findobj for group1.ldap1 should return an object' );
is( $obj->kind, 'tree', "_findobj() returns tree" );

$obj = $cfg->_findobj('group1.ldap1.uri');
is( $obj->kind, 'blob', "_findobj() returns blob" );

is( $cfg->get('group1.ldap1.uri'),
    'ldaps://example1.org', "check single attribute" );

$cfg->parser(
    {
        filename    => '01-initdb-2.conf',
        path        => [qw( t )],
        commit_time => DateTime->from_epoch( epoch => 1240351682 ),
        author_name => 'Test User',
        author_mail => 'test@example.com',
    }
);
is( $cfg->version, $ver2, 'check version of second commit' );

$cfg->parser(
    {
        filename    => '01-initdb-3.conf',
        path        => [qw( t )],
        commit_time => DateTime->from_epoch( epoch => 1240361682 ),
        author_name => 'Test User',
        author_mail => 'test@example.com',
    }
);
is( $cfg->version, $ver3, 'check version of third commit' );

# Try to get different versions of some values
is( $cfg->get('group2.ldap2.user'),
    'openxpkiA', "newest version of group2.ldap2.user" );
is( $cfg->get( 'group2.ldap2.user', $ver1 ),
    'openxpki2', "oldest version of group2.ldap2.user" );

# sort 'em just to be on the safe side
my @attrlist = sort( $cfg->listattr('group1.ldap1') );
is_deeply( \@attrlist, [ sort(qw( uri user password )) ], "check attr list" );

is( $cfg->kind('group1.ldap1'), 'tree', 'kind() returns tree');
is( $cfg->kind('group1.ldap1.user'), 'blob', 'kind() returns blob');

# When installing our app that depends on Config::Versioned, we like to
# deliver the empty bare repo directory so it has the correct permissions.
# Currently, the initdb fails when this already exists, so we need some
# sort of force option.
dir($gittestdir2)->rmtree;
mkdir $gittestdir2;

ok(-d $gittestdir2, "Check that $gittestdir2 exists");

eval {
    my $cfg = Config::Versioned->new(
        {
            dbpath      => $gittestdir2,
            autocreate  => 1,
            filename    => '01-initdb.conf',
            path        => [qw( t )],
            commit_time => DateTime->from_epoch( epoch => 1240341682 ),
            author_name => 'Test User',
            author_mail => 'test@example.com',
        }
    );
    1;
};
is($@, "", "Results of eval for new() instance");

ok( $cfg, 'create new config instance for second dir' );