The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 11;

use strict;
use warnings;
use Carp;

use Net::LDAP;
use Net::LDAP::Server::Test;
use Net::LDAP::Entry;

#
# these tests pulled nearly verbatim from the Net::LDAP synopsis
#

my %opts = (port => '10636');

my $host = 'ldap://localhost:' . $opts{port};

ok( my $server = Net::LDAP::Server::Test->new( $opts{port}, auto_schema => 1 ),
    "spawn new server" );

ok( my $ldap = Net::LDAP->new( $host, %opts, ), "new LDAP connection" );

unless ($ldap) {
    my $error = $@;
    diag("stop() server");
    $server->stop();
    croak "Unable to connect to LDAP server $host: $error";
}

ok( my $rc = $ldap->bind(), "LDAP bind()" );

$ldap->add(
    dn => 'ou=test,dc=test,dc=example',
    attrs => [
        id => 'test',
        cn => [qw(cn1 cn2)],
    ],
);

sub fetch_entry {
    my $mesg;
    ok( $mesg = $ldap->search(    # perform a search
            base  => "ou=test,dc=test,dc=example",
            scope => 'base',
            filter => "id=test"
        ),
        "LDAP search()"
    );

    $mesg->code && croak $mesg->error;
    return ($mesg->entries)[0];
}

# test deleting of attribute cns
my $entry = fetch_entry;
$entry->delete(cn => ['cn2']);
$entry->update($ldap);

$entry = fetch_entry;
is_deeply([ $entry->get_value('cn') ], ['cn1']);

# test adding of attribute cns
$entry->add(cn => ['cn2']);
$entry->update($ldap);

$entry = fetch_entry;
is_deeply([ $entry->get_value('cn') ], [qw(cn1 cn2)]);

# test replacing of attribute cns
$entry->replace(cn => [qw(cn3 cn4)]);
$entry->update($ldap);

$entry = fetch_entry;
is_deeply([ $entry->get_value('cn') ], [qw(cn3 cn4)]);

ok( $ldap->unbind, "LDAP unbind()" );