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

use 5.010;
use strict;
use warnings;
use Log::Any::IfLOG '$log';

use FindBin '$Bin';
use lib $Bin, "$Bin/t";

use Test::More 0.98;
require "testlib.pl";

use vars qw($tmp_dir);

setup();

my %ca = (
    min_new_uid   => 2000,
    min_new_gid   => 3000,
    new_pass      => "123",
    new_gecos     => "user 3",
    new_home      => "$tmp_dir/home",
    new_shell     => "/bin/shell",
    skel_dir      => "$tmp_dir/skel",
);

goto L2;

test_setup_unix_user(
    name          => "create with create_home=0",
    args          => {%ca, user=>"u3", create_home=>0},
    after_do      => {
        uid=>2000, gid=>3000,
        gecos=>"user 3",
        home=>"$tmp_dir/home",
        shell=>"/bin/shell",
        extra => sub {
            ok(!(-d "$tmp_dir/home"), "home not created");
        }
    },
    after_undo    => {
        exists=>0,
        extra => sub {
            ok(!(-d "$tmp_dir/home"), "home doesn't exist");
        }
    },
);

test_setup_unix_user(
    name          => "create with create_home=1 + use_skel=0",
    args          => {%ca, user=>"u3", use_skel=>0},
    after_do      => {
        uid=>2000, gid=>3000,
        extra => sub {
            ok( (-d "$tmp_dir/home"), "home created");
        }
    },
    after_undo    => {
        exists=>0,
        extra => sub {
            ok(!(-d "$tmp_dir/home"), "home removed");
        }
    },
);

test_setup_unix_user(
    name          => "create",
    args          => {%ca, user=>"u3"},
    after_do      => {
        uid=>2000, gid=>3000,
        extra => sub {
            ok( (-d "$tmp_dir/home"), "home created");
            ok( (-f "$tmp_dir/home/.dir1/.file1"), "skeleton file created");
        }
    },
    after_undo    => {
        exists=>0,
        extra => sub {
            ok(!(-d "$tmp_dir/home"), "home removed");
        }
    },
);

test_setup_unix_user(
    name          => "already exists + home !exists + create_home=0 -> noop",
    args          => {%ca, user=>"u1", create_home=>0},
    status        => 304,
);

test_setup_unix_user(
    name          => "already exists -> only create home",
    args          => {%ca, user=>"u1"},
    after_do      => {
        extra => sub {
            ok( (-d "$tmp_dir/u1"), "home created");
            ok( (-f "$tmp_dir/u1/.dir1/.file1"), "skeleton file created");
        }
    },
    after_undo    => {
        extra => sub {
            ok(!(-d "$tmp_dir/u1"), "home removed");
        }
    },
);

L2:
test_setup_unix_user(
    name          => "already exists -> only fix memberships",
    args          => {%ca, user=>"u1", create_home=>0,
                      member_of=>[qw/bin/], not_member_of=>[qw/u2/]},
    after_do      => {
        member_of     => [qw/u1 bin/],
        not_member_of => [qw/u2/],
        extra => sub {
            ok(!(-d "$tmp_dir/u1"), "home not created");
        }
    },
    after_undo    => {
        member_of     => [qw/u1 u2/],
        not_member_of => [qw/bin/],
        extra => sub {
            ok(!(-d "$tmp_dir/u1"), "home not exists");
        }
    },
);

DONE_TESTING:
teardown();