TT#34567 Add phonebook testing script

Change-Id: Ibada1cf383e6cf60c9d50d5a09393cd916848bf5
changes/23/20123/12
Irina Peshinskaya 8 years ago
parent bf2e05e934
commit 7eb649b02a

@ -0,0 +1,328 @@
use strict;
use warnings;
use Test::Collection;
use Test::FakeData;
use Test::More;
use Data::Dumper;
use Clone qw/clone/;
use feature 'state';
#use NGCP::Panel::Utils::Subscriber;
my $test_machine = Test::Collection->new(
name => 'phonebookentries',
QUIET_DELETION => 1,
);
my $subscriber_test_machine = Test::Collection->new(
name => 'subscribers',
QUIET_DELETION => 1,
);
my $fake_data = Test::FakeData->new;
$test_machine->methods->{collection}->{allowed} = {map {$_ => 1} qw(GET HEAD OPTIONS POST)};
$test_machine->methods->{item}->{allowed} = {map {$_ => 1} qw(GET HEAD OPTIONS PUT PATCH DELETE)};
$fake_data->set_data_from_script({
'phonebookentries' => {
'data' => {
customer_id => sub { return shift->get_id('customers',@_); },
reseller_id => sub { return shift->get_id('resellers',@_); },
subscriber_id => sub { return shift->get_id('subscribers',@_); },
name => 'api_test phonebook username',
number => '111222333',
shared => '1',
},
},
});
$subscriber_test_machine->DATA_ITEM_STORE($fake_data->process('subscribers'));
$subscriber_test_machine->form_data_item();
$test_machine->DATA_ITEM_STORE($fake_data->process('phonebookentries'));
$test_machine->form_data_item();
my $remote_config = $test_machine->init_catalyst_config;
$test_machine->QUERY_PARAMS('reseller_id='.$fake_data->{data}->{phonebookentries}->{data}->{reseller_id});
my $admin_phonebookentries_created = $test_machine->check_create_correct(2, sub {
delete $_[0]->{customer_id};
delete $_[0]->{subscriber_id};
delete $_[0]->{shared};
$_[0]->{number} = time() + seq();
} );
$test_machine->check_bundle();
$test_machine->QUERY_PARAMS('');
{
$fake_data->{data}->{subscribers}->{data}->{administrative} = 1;
my $subscriberadmin = $fake_data->create('subscribers')->[0];
$fake_data->{data}->{subscribers}->{data}->{administrative} = 0;
my $subscriber = $fake_data->create('subscribers')->[0];
diag("create subscriber of other customer of other reseller");
my $fake_data_other = Test::FakeData->new(keep_db_data => 1);
$fake_data_other->{data}->{customers}->{data}->{external_id} = 'not_default_one';
$fake_data_other->{data}->{customercontacts}->{data}->{email} = 'not_default_one@email.com';
$fake_data_other->{data}->{contracts}->{data}->{external_id} = 'not_default_one';
$fake_data_other->{data}->{resellers}->{data}->{name} = 'not_default_one';
my $subscriber_other_customer = $fake_data_other->create('subscribers')->[0];
diag("create subscriber_other_phonebookentries");
my $subscriber_other_phonebookentries = $test_machine->check_create_correct(2, sub {
delete $_[0]->{customer_id};
delete $_[0]->{reseller_id};
$_[0]->{subscriber_id} = $subscriber_other_customer->{content}->{customer_id};
$_[0]->{number} = time() + seq();
} );
diag("create customer_other_phonebookentries");
my $customer_other_phonebookentries = $test_machine->check_create_correct(2, sub {
delete $_[0]->{subscriber_id};
delete $_[0]->{reseller_id};
$_[0]->{customer_id} = $subscriber_other_customer->{content}->{customer_id};
$_[0]->{number} = time() + seq();
} );
diag("create reseller_other_phonebookentries");
my $reseller_other_phonebookentries = $test_machine->check_create_correct(2, sub {
delete $_[0]->{subscriber_id};
delete $_[0]->{customer_id};
$_[0]->{reseller_id} = $fake_data_other->get_id('resellers',@_),
$_[0]->{number} = time() + seq();
} );
#------------------------- ADMIN
my ($res,$content);
$test_machine->runas('admin');
diag("\n\n\nADMIN :");
diag("create items one-by-one:");
my $admin_phonebookentries_created = $test_machine->check_create_correct(2, sub {
delete $_[0]->{customer_id};
delete $_[0]->{subscriber_id};
delete $_[0]->{shared};
$_[0]->{number} = time() + seq();
} );
test_phonebook_collection($admin_phonebookentries_created,'/api/phonebookentries/?reseller_id='.$fake_data->{data}->{phonebookentries}->{data}->{reseller_id});
#------------------------- RESELLER
{
my $reseller_admin = $test_machine->get_item_hal('admins','/api/admins/?login=api_test');
if (!(exists $reseller_admin->{total_count} && $reseller_admin->{total_count})) {
$fake_data->test_machine($test_machine);#because we removed shared certs when runas admin
my $data = $fake_data->process('admins');
$data->{login} = 'api_test';
$data->{password} = 'api_test';
($res,$content) = $test_machine->request_post($data, '/api/admins/');
$test_machine->http_code_msg(201, "create reseller",$res,$content);
$test_machine->set_reseller_credentials($data);
}
}
$test_machine->runas('reseller');
diag("\n\n\nRESELLER :");
diag("reseller: attempt to create using other reseller_id");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{subscriber_id};
delete $_[0]->{customer_id};
$_[0]->{reseller_id} = $fake_data_other->get_id('resellers');
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "reseller: attempt to create using other reseller customer_id:",$res,$content,
"Unknown reseller_id value '".$fake_data_other->get_id('resellers')."'");
diag("reseller: attempt to create using other reseller customer_id");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{subscriber_id};
delete $_[0]->{reseller_id};
$_[0]->{customer_id} = $subscriber_other_customer->{content}->{customer_id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "reseller: attempt to create using other reseller customer_id:",$res,$content,
"Unknown customer_id value '".$subscriber_other_customer->{content}->{customer_id}."'");
diag("reseller: attempt to create using other reseller subscriber_id");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{customer_id};
delete $_[0]->{reseller_id};
$_[0]->{subscriber_id} = $subscriber_other_customer->{content}->{id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "reseller: attempt to create using other reseller customer_id:",$res,$content,
"Unknown subscriber_id value '".$subscriber_other_customer->{content}->{id}."'");
diag("create items one-by-one:");
my $reseller_phonebookentries_created = $test_machine->check_create_correct(1, sub {
delete $_[0]->{reseller_id};
delete $_[0]->{subscriber_id};
delete $_[0]->{shared};
$_[0]->{number} = time() + seq();
} );
push @$reseller_phonebookentries_created, @{
$test_machine->check_create_correct(1, sub {
delete $_[0]->{customer_id};
delete $_[0]->{subscriber_id};
delete $_[0]->{shared};
$_[0]->{number} = time() + seq();
} )
},@{
$test_machine->check_create_correct(1, sub {
delete $_[0]->{customer_id};
delete $_[0]->{reseller_id};
$_[0]->{number} = time() + seq();
} )
};
test_phonebook_collection($reseller_phonebookentries_created,'/api/phonebookentries/?customer_id='.$fake_data->{data}->{phonebookentries}->{data}->{customer_id});
#------------------------- SUBSCRIBERADMIN
$test_machine->set_subscriber_credentials($subscriberadmin->{content});
$test_machine->runas('subscriber');
diag("\n\n\nSUBSCRIBERADMIN ".$subscriberadmin->{content}->{id}.":");
diag("subscriberadmin: attempt to create using other customer subscriber:");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{customer_id};
delete $_[0]->{reseller_id};
$_[0]->{subscriber_id} = $subscriber_other_customer->{content}->{id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "Check that we can't create a phonebook entry in a name of other customers subscriber",$res,$content,
"Unknown subscriber_id value '".$subscriber_other_customer->{content}->{id}."'");
diag("subscriberadmin: attempt to create using other customer_id:");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{subscriber_id};
delete $_[0]->{reseller_id};
$_[0]->{customer_id} = $subscriber_other_customer->{content}->{customer_id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "subscriberadmin: attempt to create using customer_id:",$res,$content,
"Unknown customer_id value '".$subscriber_other_customer->{content}->{customer_id}."'");
diag("subscriberadmin: attempt to create using reseller_id:");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{subscriber_id};
delete $_[0]->{customer_id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "subscriberadmin: attempt to create using reseller_id",$res,$content,
"'customer_id' or 'subscriber_id' should be specified.");
diag("subscriberadmin: attempt to create using reseller_id and customer_id together:");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{subscriber_id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "subscriberadmin: attempt to create using reseller_id and customer_id together:",$res,$content,
"Only one of either 'customer_id' or 'subscriber_id' should be specified");
diag("create items one-by-one:");
my $subscriberadmin_phonebookentries_created = $test_machine->check_create_correct(2, sub {
delete $_[0]->{customer_id};
delete $_[0]->{reseller_id};
$_[0]->{subscriber_id} = $subscriberadmin->{content}->{id};
$_[0]->{number} = time() + seq();
} );
test_phonebook_collection($subscriberadmin_phonebookentries_created, '/api/phonebookentries/?subscriber_id='.$subscriberadmin->{content}->{id});
#------------------------- SUBSCRIBER
$test_machine->set_subscriber_credentials($subscriber->{content});
$test_machine->runas('subscriber');
diag("\n\n\nSUBSCRIBER ".$subscriber->{content}->{id}.":");
diag("subscriber: attempt to create using other customer subscriber:");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{customer_id};
delete $_[0]->{reseller_id};
$_[0]->{subscriber_id} = $subscriber_other_customer->{content}->{id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "Check that we can't create a phonebook entry in a name of other customers subscriber",$res,$content,
"Unknown subscriber_id value '".$subscriber_other_customer->{content}->{id}."'");
diag("subscriber: attempt to create using other customer_id:");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{subscriber_id};
delete $_[0]->{reseller_id};
$_[0]->{customer_id} = $subscriber_other_customer->{content}->{customer_id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "subscriber: attempt to create using customer_id:",$res,$content,
"'subscriber_id' should be specified.");
diag("subscriber: attempt to create using reseller_id:");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{subscriber_id};
delete $_[0]->{customer_id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "subscriber: attempt to create using reseller_id",$res,$content,
"'subscriber_id' should be specified.");
diag("subscriber: attempt to create using reseller_id and customer_id together:");
($res,$content) = $test_machine->check_item_post(sub {
delete $_[0]->{subscriber_id};
$_[0]->{number} = time() + seq();
});
$test_machine->http_code_msg(422, "subscriber: attempt to create using reseller_id and customer_id together:",$res,$content,
"'subscriber_id' should be specified.");
diag("create items one-by-one:");
my $subscriber_phonebookentries_created = $test_machine->check_create_correct(2, sub {
delete $_[0]->{customer_id};
delete $_[0]->{reseller_id};
$_[0]->{subscriber_id} = $subscriber->{content}->{id};
$_[0]->{number} = time() + seq();
} );
test_phonebook_collection($subscriber_phonebookentries_created, '/api/phonebookentries/?subscriber_id='.$subscriber->{content}->{id});
}
$fake_data->clear_test_data_all();
$test_machine->clear_test_data_all();#fake data aren't registered in this test machine, so they will stay.
$fake_data->clear_test_data_all();
undef $test_machine;
undef $fake_data;
done_testing;
sub test_phonebook_collection{
my ($list,$collection_uri) = @_;
$collection_uri //= 'api/phonebookentries';
diag("collection_uri: $collection_uri;");
my $content_type = 'text/csv';
my $content_type_old = clone $test_machine->content_type;
$test_machine->content_type->{POST} = $content_type;
diag("get collection:");
$test_machine->get_collection_hal('phonebookentries',$collection_uri);
my ($req,$res,$content);
$req = $test_machine->get_request_get( $collection_uri );
$req->header('Accept' => $content_type);
diag("download csv:");
$res = $test_machine->request($req);
my $csv_data = $res->content;
my $filename = "phonebook_list.csv";
$test_machine->http_code_msg(200, "check response code", $res, $csv_data);
ok(length($csv_data) > 0, "Check that downloaded csv is not empty.");
diag("upload csv with purge_existing = 0:");
($res,$content) = $test_machine->request_post($csv_data, $collection_uri);#
$test_machine->http_code_msg(201, "check file upload", $res, $content);
$test_machine->content_type(clone $content_type_old);
diag("go through list:");
foreach my $entry (@$list) {
$test_machine->check_get2put($entry);
$test_machine->request_delete($entry->{location});
}
$test_machine->content_type->{POST} = $content_type;
diag("upload csv with purge_existing = 1:");
($res,$content) = $test_machine->request_post($csv_data, $collection_uri.($collection_uri !~/\?/?'?':'&').'purge_existing=true');#
$test_machine->http_code_msg(201, "check file upload", $res, $content);
$test_machine->content_type(clone $content_type_old);
}
sub seq{
my ($number) = @_;
state $seq = 0;
$number //= 0;
return $number + $seq++;
}
# vim: set tabstop=4 expandtab:

@ -58,7 +58,7 @@ $fake_data->set_data_from_script({
$num++;
my ($self,$collection_name,$test_machine) = @_;
my $pilot = $test_machine->get_item_hal('subscribers','/api/subscribers/?customer_id='.$self->data->{$collection_name}->{data}->{customer_id}.'&'.'is_pbx_pilot=1');
if($pilot->{total_count} <= 0){
if(!$pilot->{total_count} || $pilot->{total_count} <= 0){
undef $pilot;
}
return $test_machine->check_create_correct(1, sub{

@ -23,6 +23,9 @@ use Storable;
use Carp qw(cluck longmess shortmess);
use IO::Uncompress::Unzip;
use File::Temp qw();
use Log::Log4perl;
Log::Log4perl::init('/etc/ngcp-panel/logging.conf');
my $tmpfilename : shared;
@ -49,7 +52,11 @@ has 'local_test' => (
isa => 'Str',
default => sub {$ENV{LOCAL_TEST} // ''},
);
has 'logger' => (
is => 'rw',
isa => 'Log::Log4perl::Logger',
default => sub { Log::Log4perl->get_logger('NGCP::Panel'); },
);
has 'DEBUG' => (
is => 'rw',
isa => 'Bool',
@ -123,6 +130,14 @@ has 'subscriber_pass' => (
is => 'rw',
isa => 'Str',
);
has 'reseller_admin_user' => (
is => 'rw',
isa => 'Str',
);
has 'reseller_admin_pass' => (
is => 'rw',
isa => 'Str',
);
has 'embedded_resources' => (
is => 'rw',
isa => 'ArrayRef',
@ -191,6 +206,16 @@ has 'QUERY_PARAMS' =>(
isa => 'Str',
default => '',
);
has 'PAGE' =>(
is => 'rw',
isa => 'Str',
default => '1',
);
has 'ROWS' =>(
is => 'rw',
isa => 'Str',
default => '1',
);
has 'URI_CUSTOM_STORE' =>(
is => 'rw',
isa => 'Str',
@ -334,6 +359,14 @@ sub clear_cert {
delete $self->{ua};
return $self;
}
sub ssl_auth_allowed {
my $self = shift;
my($role) = @_;
if ($role eq 'admin' || $role eq 'default' || $role eq 'reseller') {
return 1;
}
return 0;
}
sub runas {
my $self = shift;
@ -345,9 +378,13 @@ sub runas {
$self->base_uri($base_url);
$uri //= $self->base_uri;
$uri =~ s/^https?:\/\/|\/$//g;
$self->runas_role($role);
#print Dumper ["runas",$uri, $realm, $user, $pass];
#print Dumper ["runas",$uri, $realm, $user, $pass,"requested",$role_in,"old",$self->runas_role];
if ($role_in ne $self->runas_role) {
$self->clear_cert;
$self->ua($self->_create_ua(0));
}
$self->ua->credentials( $uri, $realm, $user, $pass);
$self->runas_role($role);
$self->init_ssl_cert($self->ua, $role);
diag("runas: $role;");
return $self;
@ -360,13 +397,13 @@ sub get_role_credentials{
$role //= $self->runas_role // 'default';
my ($realm,$port);
if($role eq 'default' || $role eq 'admin'){
$user //= $ENV{API_USER} // 'administrator';
$pass //= $ENV{API_PASS} // 'administrator';
$user = $ENV{API_USER} // 'administrator';
$pass = $ENV{API_PASS} // 'administrator';
$realm = 'api_admin_http';
$port = '1443';
}elsif($role eq 'reseller'){
$user //= $ENV{API_USER_RESELLER} // 'api_test';
$pass //= $ENV{API_PASS_RESELLER} // 'api_test';
$user = $self->reseller_admin_user // $ENV{API_USER_RESELLER} // 'api_test';
$pass = $self->reseller_admin_pass // $ENV{API_PASS_RESELLER} // 'api_test';
$realm = 'api_admin_http';
$port = '1443';
}elsif($role eq 'subscriber'){
@ -384,6 +421,12 @@ sub set_subscriber_credentials{
$self->subscriber_pass($data->{webpassword});
}
sub set_reseller_credentials{
my($self,$data) = @_;
$self->reseller_admin_user($data->{login});
$self->reseller_admin_pass($data->{password});
}
sub clear_data_created{
my($self) = @_;
$self->DATA_CREATED({
@ -424,6 +467,12 @@ sub get_uri_collection{
$name //= $self->name;
return $self->normalize_uri("/api/".$name.($name ? "/" : "").($self->QUERY_PARAMS ? "?".$self->QUERY_PARAMS : ""));
}
sub get_uri_collection_paged{
my($self,$name) = @_;
my $uri = $self->get_uri_collection($name);
return $uri.($uri !~/\?/ ? '?':'&').'page='.($self->PAGE // '1').'&rows='.($self->ROWS // '1');
}
sub get_uri_get{
my($self,$query_string, $name) = @_;
$name //= $self->name;
@ -457,7 +506,7 @@ sub get_item_hal{
}
if(!$resitem){
my ($reshal, $location,$total_count,$reshal_collection);
$uri //= $self->get_uri_collection($name)."?page=1&rows=1";
$uri //= $self->get_uri_collection_paged($name);
#print "uri=$uri;";
my($res,$list_collection,$req) = $self->check_item_get($self->normalize_uri($uri));
($reshal,$location,$total_count,$reshal_collection) = $self->get_hal_from_collection($list_collection,$name,$number);
@ -626,8 +675,9 @@ sub request{
my $res = $self->ua->request($req);
diag(sprintf($self->name_prefix."request:%s: %s", $req->method, $req->uri));
#draft of the debug mode
if($self->DEBUG){
if(1 && $self->DEBUG){
if($res->code >= 400){
print longmess();
print Dumper $req;
print Dumper $res;
print Dumper $self->get_response_content($res);
@ -863,32 +913,36 @@ sub check_methods{
sub check_list_collection{
my($self, $check_embedded_cb) = @_;
my $nexturi = $self->get_uri_collection."?page=1&rows=5";
my $nexturi = $self->get_uri_collection_paged;
my @href = ();
my $test_info_prefix = "$self->{name}: check_list_collection: ";
do {
#print "nexturi=$nexturi;\n";
my ($res,$list_collection) = $self->check_item_get($nexturi);
my $selfuri = $self->normalize_uri($list_collection->{_links}->{self}->{href});
is($selfuri, $nexturi, "$self->{name}: check _links.self.href of collection");
my $sub_sort_params = sub {my $str = $_[0]; return (substr $str, 0, (index $str, '?') + 1) . join('&', sort split /&/, substr $str, ((index $str, '?') + 1))};
$selfuri = $sub_sort_params->($selfuri);
$nexturi = $sub_sort_params->($nexturi);
is($selfuri, $nexturi, $test_info_prefix."check _links.self.href of collection");
my $colluri = URI->new($selfuri);
if(($list_collection->{total_count} && $list_collection->{total_count} > 0 ) || !$self->ALLOW_EMPTY_COLLECTION){
ok($list_collection->{total_count} > 0, "$self->{name}: check 'total_count' of collection");
ok($list_collection->{total_count} > 0, $test_info_prefix."check 'total_count' of collection");
}
my %q = $colluri->query_form;
ok(exists $q{page} && exists $q{rows}, "$self->{name}: check existence of 'page' and 'row' in 'self'");
ok(exists $q{page} && exists $q{rows}, $test_info_prefix."check existence of 'page' and 'row' in 'self'");
my $page = int($q{page});
my $rows = int($q{rows});
ok($rows != 0, "check existence of the 'rows'");
ok($rows != 0, $test_info_prefix."check existence of the 'rows'");
if($page == 1) {
ok(!exists $list_collection->{_links}->{prev}->{href}, "$self->{name}: check absence of 'prev' on first page");
ok(!exists $list_collection->{_links}->{prev}->{href}, $test_info_prefix."check absence of 'prev' on first page");
} else {
ok(exists $list_collection->{_links}->{prev}->{href}, "$self->{name}: check existence of 'prev'");
ok(exists $list_collection->{_links}->{prev}->{href}, $test_info_prefix."check existence of 'prev'");
}
if(($rows != 0) && ($list_collection->{total_count} / $rows) <= $page) {
ok(!exists $list_collection->{_links}->{next}->{href}, "$self->{name}: check absence of 'next' on last page");
ok(!exists $list_collection->{_links}->{next}->{href}, $test_info_prefix."check absence of 'next' on last page");
} else {
ok(exists $list_collection->{_links}->{next}->{href}, "$self->{name}: check existence of 'next'");
ok(exists $list_collection->{_links}->{next}->{href}, $test_info_prefix."check existence of 'next'");
}
if($list_collection->{_links}->{next}->{href}) {
@ -899,8 +953,10 @@ sub check_list_collection{
my $hal_name = $self->get_hal_name;
if(($list_collection->{total_count} && $list_collection->{total_count} > 0 ) || !$self->ALLOW_EMPTY_COLLECTION){
ok(((ref $list_collection->{_links}->{$hal_name} eq "ARRAY" ) ||
(ref $list_collection->{_links}->{$hal_name} eq "HASH" ) ), "$self->{name}: check if 'ngcp:".$self->name."' is array/hash-ref");
if (! ok(((ref $list_collection->{_links}->{$hal_name} eq "ARRAY" ) ||
(ref $list_collection->{_links}->{$hal_name} eq "HASH" ) ), $test_info_prefix."check if 'ngcp:".$self->name."' is array/hash-ref")) {
diag($list_collection->{_links}->{$hal_name});
}
}
@ -1176,12 +1232,12 @@ sub check_create_correct{
for(my $i = 1; $i <= $number; ++$i) {
my $created_info={};
my ($res, $content, $req, $content_post) = $self->check_item_post( $uniquizer_cb , $data_in, { i => $i } );
my $location = $res->header('Location');
if(exists $self->methods->{'item'}->{allowed}->{'GET'}){
$self->http_code_msg(201, "create test item '".$self->name."' $i",$res,$content);
$self->http_code_msg(201, "create test item '".$self->name."' $i. Location: ".($location // ''),$res,$content);
}else{
$self->http_code_msg(200, "create test item '".$self->name."' $i",$res,$content);
$self->http_code_msg(200, "create test item '".$self->name."' $i. Location: ".($location // ''),$res,$content);
}
my $location = $res->header('Location');
if($location){
#some interfaces (e.g. subscribers) don't provide hal after creation - is it correct, by the way?
my $get ={};

@ -199,7 +199,6 @@ sub build_data{
'data_callbacks' => {
'uniquizer_cb' => sub { Test::FakeData::string_uniquizer(\$_[0]->{login}); },
},
'uniquizer_cb' => sub { Test::FakeData::string_uniquizer(\$_[0]->{login}); },
},
'applyrewrites' => {
'data' => {

Loading…
Cancel
Save