The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use strict;
use warnings;

use Data::Dumper;
use English qw( -no_match_vars );
use Test::More;

$|++;

my $user;

use lib "lib";
use Provision::Unix;
use Provision::Unix::User;
my $prov = Provision::Unix->new( debug => 0 );

eval { $user = Provision::Unix::User->new( prov => $prov, fatal => 0 ) };
if ( ! $user ) {
    my $message = $EVAL_ERROR; chop $message;
    $message .= " on " . $OSNAME;
    plan skip_all => $message;
} 
else {
    plan 'no_plan';
};

# basic OO mechanism
ok( defined $user, 'get Provision::Unix::User object' );
ok( $user->isa('Provision::Unix::User'), 'check object class' );

my $gid      = 65530;
my $uid      = 65530;
my $group    = 'provunix';
my $username = 'provuser';

my $group_that_exists = $OSNAME eq 'linux' ? 'daemon' : 'daemon';

# exists_group
ok( $user->exists_group($group_that_exists), 'exists_group +' );

if (`grep '^$group:' /etc/group`) {
    ok( $user->exists_group($group), 'exists_group +' );
}
else {
    if ( $OSNAME ne 'darwin' ) {
        ok( !$user->exists_group($group), 'exists_group -' );
    };
}

SKIP: {
    skip "you are not root", 7 if $EFFECTIVE_USER_ID != 0;

    # destroy group if exists
    if ( $user->exists_group($group) ) {

        ok( $user->destroy_group(
            group => $group,
            gid   => $gid,
            debug => 0,
        ),
        "destroy_group $group if exists" );
    };

    # exists_group -
    if (`grep '^$group:' /etc/group`) {
        ok( $user->exists_group($group), 'exists_group +' );
    }
    else {
        ok( !$user->exists_group($group), 'exists_group -' );
    }

    sleep 3;

    # create group
    ok( $user->create_group(
            group => $group,
            gid   => $gid,
            debug => 0,
        ),
        "create group $group ($gid)"
    );

    # exists_group +
    if (`grep '^$group:' /etc/group`) {
        ok( $user->exists_group($group), 'exists_group +' );
    }
    else {
        ok( !$user->exists_group($group), 'exists_group -' );
    }

    sleep 3;

    # destroy group
    my $r = $user->destroy_group(
        group => $group,
        gid   => $gid,
        debug => 0,
    );
    ok( $r, "destroy_group $group" );

    if (`grep '^$group:' /etc/group`) {
        ok( $user->exists_group($group), 'exists_group +' );
    }
    else {
        ok( !$user->exists_group($group), 'exists_group -' );
    }

}