Bivio::Util::TestUser
# Copyright (c) 2007 bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::Util::TestUser;
use strict;
use Bivio::Base 'Bivio.ShellUtil';
my($_E) = b_use('Type.Email');
b_use('IO.Config')->register(my $_CFG = {
default_password => 'password',
});
sub ADM {
return 'adm';
}
sub DEFAULT_PASSWORD {
return $_CFG->{default_password};
}
sub USAGE {
return <<'EOF';
usage: b-test-user [options] command [args..]
commands
create name_or_email [[password] name]-- RealmAdmin->create_user
format_email base [domain] -- HTTP->generate_local_email if not already an email
init -- test users (adm, etc.)
leave_and_delete [email_re] -- remove user from all realms and delete [
EOF
}
sub create {
sub CREATE {[
[qw(user_or_email String)],
[qw(password Password), sub {shift->DEFAULT_PASSWORD}],
[qw(name RealmName), undef],
]}
my($self, $bp) = shift->parameters(\@_);
$self->initialize_fully;
my($display_name) = $_E->is_valid($bp->{user_or_email})
? $_E->get_local_part($bp->{user_or_email})
: $bp->{user_or_email};
my($uid) = $self->new_other('RealmAdmin')->create_user(
$self->format_email($bp->{user_or_email}),
$display_name,
$bp->{password},
$bp->{name} || b_use('Type.RealmName')->clean_and_trim($display_name),
);
b_use('Type.PageSize')->row_tag_replace($uid, 100, $self->req);
return $uid;
}
sub format_email {
my($self, $base, $domain) = @_;
return $_E->is_valid($base) ? $base
: (b_use('TestLanguage.HTTP')->generate_local_email($base, $domain))[0],
}
sub handle_config {
my(undef, $cfg) = @_;
$_CFG = $cfg;
return;
}
sub init {
my($self) = @_;
$self->initialize_fully->with_realm(undef, sub {
$self->req->with_user($self->ADM => sub {
$self->new_other('SiteForum')->make_admin;
});
return;
});
return;
}
sub init_adm {
my($self) = @_;
return $self->initialize_fully->with_realm(undef, sub {
my($req) = $self->req;
$self->create($self->ADM)
unless $self->model('RealmOwner')->unauth_load({name => $self->ADM});
$req->set_user($self->ADM);
$self->new_other('RealmRole')->make_super_user
unless $req->is_super_user;
return;
});
}
sub leave_and_delete {
sub LEAVE_AND_DELETE {[[qw(name_re Regexp), undef]]}
my($self, $bp) = shift->parameters(\@_);
$self->req->assert_test;
my($uids) = $bp->{name_re} ? _match_users($self, $bp->{name_re})
: [$self->req('auth_user_id')];
return []
unless @$uids;
$self->model('RealmUser')->do_iterate(
sub {
my($it) = @_;
$it->unauth_delete;
return 1;
},
'unauth_iterate_start',
'realm_id',
{user_id => $uids},
);
foreach my $uid (@$uids) {
$self->req->with_user(
$uid,
sub {$self->new_other('RealmAdmin')->put(force => 1)->delete_auth_user},
);
}
return $uids;
}
sub _match_users {
my($self, $re) = @_;
return [sort(
keys(
%{{
@{$self->model('AdmUserList')
->map_iterate(
sub {
my($it) = @_;
return $it->get('Email.email') =~ $re
? ($it->get('User.user_id') => 1)
: ();
},
),
},
}},
),
)];
}
1;