Group
Extension

Elive/t/soap-group.t

#!perl -T
use warnings; use strict;
use Test::More tests => 18;
use Try::Tiny;
use Test::Fatal;

my $t = Test::More->builder();

use Elive;
use Elive::Entity::User;
use Elive::Entity::Group;

use lib '.';
use t::Elive;

my $class = 'Elive::Entity::Group';

use Carp;
$SIG{__DIE__} = \&Carp::confess;
#
# restrict our user tests to mock connections. Live updates
# are just to dangerous. There is also the possibility that the
# live site is running LDAP, in which case both user and group access
# become read only.
#
my %opt;
$opt{only} = 'mock'
    unless $ENV{ELIVE_TEST_GROUP_UPDATES};

my %result = t::Elive->test_connection(%opt);
my $auth = $result{auth};

my $connection_class = $result{class};
my $connection = $connection_class->connect(@$auth);
Elive->connection($connection);

note "group test url: ".$connection->url;

my @usernames = qw(test_user1 test_user2 test_user3 alice bob trev);
my @users;
my %user_ids;

my $base = t::Elive::generate_id();
my @inserted_users;

foreach my $username (@usernames) {
    my $user = try {Elive::Entity::User->get_by_loginName($username)};

    unless ($user) {
	my %insert_data = (
	    loginName => $username,
	    loginPassword => t::Elive::generate_id(),
	    email => $username.'@acme.org',
	    role => 3,
	    firstName => $username,
	    lastName => 'user'
	    );

	$user = Elive::Entity::User->insert(\%insert_data);
	push (@inserted_users, $user);
    }

    push (@users, $user);
    $user_ids{$username} = $user->userId;
}

my $group_name = 'soap-group.t - basic '.t::Elive::generate_id();

my $group = $class->insert(
    {name => $group_name,
     members => \@users
    });

my $group_spec = '*' . $group->groupId;

is ($group->stringify, $group_spec, "blessed group stringification");
is ($group->stringify( \%$group ), $group_spec, "unblessed group stringification");
is ($group->stringify($users[0]), $users[0]->userId, "blessed user stringification");
is ($group->stringify( \%{$users[0]} ), $users[0]->userId, "unblessed user stringification");
is ($group->stringify($users[0]->userId), $users[0]->userId, "string stringification");

isa_ok($group, $class, 'inserted group');
my @expected_members = sort map {$_->userId} @users;
my @actual_members = sort @{$group->members};
is_deeply(\@actual_members, \@expected_members, 'members after insert');

#
# try out alias, both on insert and update. assumes that we have the
# following aliases set up:
#    groupName => name
#    gourpMembers => members

my $group2 = $class->insert({
	groupName => $group_name.'#2',  # groupName => name
	members => \@users
    });

is($group2->{name}, $group_name.'#2', 'insert alias (groupName aliased to name)');

my @member_ids = sort ($user_ids{alice}, $user_ids{bob});
$group2->update({name => $group_name.'#3', groupMembers => \@member_ids});

is_deeply($group2->{name}, $group_name.'#3', 'update of group name');
my @actual_members2 = sort @{ $group2->{members} };
is_deeply(\@actual_members2, \@member_ids, 'update alias (groupMembers aliased to members)');

#
# try some variations
#
my @members2 = sort ($user_ids{alice}, $user_ids{bob}, $user_ids{trev});
$group2->members(\@members2);
$group2->update;

@actual_members2 = sort @{ $group2->{members} };
is_deeply(\@actual_members2, \@members2, 'update alias#2 (groupMembers aliased to members)');

do {
    #
    # nested groups can be read, but not saved.
    #
    $group2->members->add( $group );
    @actual_members2 = sort @{ $group2->{members} };
    is_deeply(\@actual_members2, [sort (@members2, $group)], 'sub groups');
    my $expected_members_str = join(',', sort ('*'.$group->groupId, @members2));

    is($group2->members->stringify, $expected_members_str, "members stringification");

    #
    # todo: get mock group updates working
    #
    if ($connection_class->isa('t::Elive::MockConnection')) {
	$t->skip('skipping update tests on mock connection')
	    for (1 .. 2);
    }
    else {
	is( exception {$group2->update} => undef, "group update - lives");
	is($group2->members->stringify, $expected_members_str, "members stringification (after update)");
    }

    $group2->members->add( $group2 );
    my @expanded_members = $group2->expand_members;
    is_deeply(\@expanded_members, [sort values %user_ids], 'expanded membership');

    #
    # just to define behavour of attempting to add a circular reference
    # to a group - the command toolkit should detect this and barf.
    #
    if ($connection_class->isa('t::Elive::MockConnection')) {
	$t->skip('skipping circular update test on mock connection')
	    for (1);
    }
    else {
	isnt( exception {$group2->update} => undef, "attempt group update with circular reference - dies");
    }

    $group2->revert;
};

is( exception {$group->delete; $group2->delete} => undef, 'group delete - lives');

foreach (@inserted_users) {
    $_->delete;
}

Elive->disconnect;


Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.