@ -9,149 +9,240 @@ use File::Find::Rule;
use File::Basename ;
use Clone qw/clone/ ;
my $ opt = {
'collections' = > { } ,
my ( $ opt , $ report , $ api_config , $ api_info , $ config , $ test_machine , $ fake_data ) =
( { } , { } , { } , { } ) ;
$ opt = {
'collections' = > { 'callcontrols' = > 1 , } ,
'collections' = > { } ,
'ignore_existence' = > 1 ,
'test_groups' = > { post = > 1 , } , #get2put,get2patch,bundle
} ;
my $ opt_in = { } ;
GetOptions ( $ opt_in ,
"help|h|?" ,
"collections:s" ,
"ignore-existence" ,
) or pod2usage ( 2 ) ;
my @ opt_keys = keys %$ opt_in ;
@ { $ opt } { map { my $ k = $ _ ; $ k =~ s/\-/_/ ; $ k ; } @ opt_keys } = map { my $ v = $ opt_in - > { $ _ } ; $ v = { map { $ _ = > 1 ; } split ( /[^[:alnum:]]+/ , $ v ) } ; $ v ; } @ opt_keys ;
print Dumper $ opt ;
pod2usage ( 1 ) if $ opt - > { help } ;
pod2usage ( 1 ) unless ( 1
# defined $opt->{collections} && defined $opt->{etc}
$ test_machine = Test::Collection - > new (
name = > '' ,
ALLOW_EMPTY_COLLECTION = > 1 ,
QUIET_DELETION = > 0 ,
runas_role = > 'reseller' ,
) ;
$ fake_data = Test::FakeData - > new ;
$ fake_data - > test_machine - > QUIET_DELETION ( 0 ) ;
$ test_machine - > clear_cache ;
get_opt ( ) ;
get_api_config ( ) ;
init_config ( ) ;
init_report ( ) ;
my $ test_machine = Test::Collection - > new ( 'name' = > '' , 'ALLOW_EMPTY_COLLECTION' = > 1 ) ;
my $ fake_data = Test::FakeData - > new ;
$ test_machine - > clear_cache ;
my $ remote_config = $ test_machine - > init_catalyst_config ;
print Dumper $ remote_config ;
my $ data = $ remote_config - > { meta } - > { 'collections' } ;
my % test_exclude = (
'metaconfigdefs' = > 1 ,
'subscriberpreferencedefs' = > 1 ,
'customerpreferencedefs' = > 1 ,
'domainpreferencedefs' = > 1 ,
'peeringserverpreferencedefs' = > 1 ,
'profilepreferencedefs' = > 1 ,
'subscriberpreferences' = > 1 ,
'customerpreferences' = > 1 ,
'domainpreferences' = > 1 ,
'peeringserverpreferences' = > 1 ,
'profilepreferences' = > 1 ,
'pbxdevicepreferencedefs' = > 1 ,
'pbxdeviceprofilepreferencedefs' = > 1 ,
#defs and preferences are tested in context of preferences
'pbxdevicefirmwares' = > 1 , #too hard, fails with timeout on get
#falis with: not ok 163 - ccmapentries: check_get2put: check put successful (Unprocessable Entity: Validation failed. field='mappings', input='ARRAY(0x1a53f278)', errors='Mappings field is required')
'ccmapentries' = > 1 ,
#fails with:
# got: 'https://127.0.0.1:1443/api/customerzonecosts/?page=1&rows=5&start=2016-10-01T000000&end=2016-10-31T235959'
# expected: 'https://127.0.0.1:1443/api/customerzonecosts/?page=1&rows=5'
'customerzonecosts' = > 1 ,
#fails with: Unsupported media type 'application/json', accepting text/plain or text/xml only.)
'pbxdeviceconfigs' = > 1 ,
#fails with: not ok 1131 - rtcapps: check_get2put: check put successful (Unprocessable Entity: Invalid field 'apps'. Must be an array.)
'rtcapps' = > 1 ,
#fails with: not ok 1176 - rtcnetworks: check_get2put: check put successful (Unprocessable Entity: Invalid field 'networks'. Must be an array.)
'rtcnetworks' = > 1 ,
) ;
my % test_exists ;
{
my $ dir = dirname ( $ 0 ) ;
my $ rule = File::Find::Rule - > new
- > mindepth ( 1 )
- > maxdepth ( 1 )
- > name ( 'api-*.t' ) ;
% test_exists = map { $ _ =~ s/\Q$dir\/\E// ; $ _ = > 1 } $ rule - > in ( $ dir ) ;
}
run ( ) ;
my $ res = {
'collections_no_get' = > [] ,
'collections_empty' = > [] ,
'collections_not_empty' = > [] ,
'strange_item_actions' = > { } ,
'no_module_item' = > [] ,
'tests_exists' = > \ % test_exists ,
'tests_exists_skipped' = > [] ,
'checked' = > [] ,
'tests_exclude' = > \ % test_exclude ,
'opt' = > $ opt
} ;
$ test_machine - > clear_test_data_all ( ) ;
done_testing ;
undef $ fake_data ;
undef $ test_machine ;
################################ RUN #############################
print Dumper $ report ;
#------------------------ subs -----------------------
foreach my $ collection ( sort grep { ( ! ( scalar keys $ opt - > { collections } ) ) || $ opt - > { collections } - > { $ _ } } keys % { $ data } ) {
if ( ! $ opt - > { collections } - > { $ collection } ) {
if ( $ test_exists { 'api-' . $ collection . '.t' } && ! $ opt - > { ignore_existence } ) {
push @ { $ res - > { 'tests_exists_skipped' } } , $ collection ;
#we will not test the same twice
next ;
}
next if $ test_exclude { $ collection } ;
}
#print Dumper $data->{$collection}->{allowed_methods_item};
#print Dumper $collection;
sub run {
#my($opt,$report,$api_info,$test_machine,$fake_data,$config)
foreach my $ collection ( sort grep { collection4testing ( $ _ ) } keys % { $ api_info } ) {
my $ item_allowed_actions = { allowed = > { } } ;
if ( $ data - > { $ collection } - > { module_item } ) {
if ( ref $ data - > { $ collection } - > { allowed_methods_item } eq 'HASH' ) {
$ item_allowed_actions = { allowed = > { map { $ _ = > 1 } keys % { $ data - > { $ collection } - > { allowed_methods_item } } } } ;
$ test_machine - > name ( $ collection ) ;
$ test_machine - > NO_ITEM_MODULE ( $ api_info - > { $ collection } - > { module_item } ? 0 : 1 ) ;
$ test_machine - > methods ( {
collection = > { allowed = > { map { $ _ = > 1 } keys % { $ api_info - > { $ collection } - > { allowed_methods } } } } ,
item = > { allowed = > { map { $ _ = > 1 } keys % { $ api_info - > { $ collection } - > { allowed_methods_item } } } } ,
} ) ;
if ( $ opt - > { test_groups } - > { bundle } ) {
$ test_machine - > check_bundle ( ) ;
}
if ( $ opt - > { test_groups } - > { post } ) {
if ( $ test_machine - > { methods } - > { collection } - > { allowed } - > { POST } ) {
#load date
if ( ! $ fake_data - > { data } - > { $ collection } - > { data } ) {
testscript_under_framework ( $ collection ) ;
}
if ( $ fake_data - > { data } - > { $ collection } - > { data } ) {
my $ data = $ fake_data - > { data } - > { $ collection } - > { data } ;
#$data->{json} && ( $data = $data->{json});
#TODO: ALL packages should have information about content_typr
if ( $ data - > { json } && ( $ data = $ data - > { json } ) ) {
$ test_machine - > content_type - > { POST } = 'multipart/form-data' ;
} else {
$ test_machine - > content_type - > { POST } = 'application/json' ;
}
$ fake_data - > process ( $ collection ) ;
$ test_machine - > check_create_correct (
1 ,
$ fake_data - > { data } - > { $ collection } - > { uniquizer_cb } ,
clone $ fake_data - > { data } - > { $ collection } - > { data }
) ;
push @ { $ report - > { post_tested } } , $ collection ;
} else {
push @ { $ report - > { post_untested } } , $ collection ;
}
}
}
if ( $ opt - > { test_groups } - > { get } ) {
if ( $ test_machine - > { methods } - > { collection } - > { allowed } - > { GET } ) {
my $ item = $ test_machine - > get_item_hal ( undef , undef , 1 ) ; #reload
}
}
if ( $ opt - > { test_groups } - > { get2put } ) {
if ( $ test_machine - > { methods } - > { collection } - > { allowed } - > { GET } ) {
my $ item = $ test_machine - > get_item_hal ( undef , undef , 1 ) ; #reload
if ( ! $ test_machine - > IS_EMPTY_COLLECTION ) {
if ( $ test_machine - > { methods } - > { item } - > { allowed } - > { PUT } ) {
$ test_machine - > check_get2put ( ) ;
}
}
}
}
if ( ! $ test_machine - > { methods } - > { collection } - > { allowed } - > { GET } ) {
push @ { $ report - > { 'collections_no_get' } } , $ collection ;
}
if ( ! $ api_info - > { $ collection } - > { module_item } ) {
push @ { $ report - > { 'no_module_item' } } , $ collection ;
}
if ( ! $ test_machine - > IS_EMPTY_COLLECTION ) {
push @ { $ report - > { 'collections_not_empty' } } , $ collection ;
} else {
$ res - > { 'strange_item_actions' } - > { $ collection } = $ data - > { $ collection } - > { allowed_methods_item } ;
push @ { $ report - > { 'collections_empty' } } , $ collection ;
}
} else {
push @ { $ res - > { 'no_module_item' } } , $ collection ;
push @ { $ report - > { 'checked' } } , $ collection ;
}
push @ { $ res - > { 'checked' } } , $ collection ;
$ test_machine - > name ( $ collection ) ;
$ test_machine - > NO_ITEM_MODULE ( $ data - > { $ collection } - > { module_item } ? 0 : 1 ) ;
}
#------------------------ aux -----------------------
sub get_opt { #get $opt
my $ opt_in = { } ;
GetOptions ( $ opt_in ,
"help|h|?" ,
"collections:s" ,
"ignore-existence" ,
"test-groups" ,
) or pod2usage ( 2 ) ;
my @ opt_keys = keys %$ opt_in ;
@ { $ opt } { map { my $ k = $ _ ; $ k =~ s/\-/_/ ; $ k ; } @ opt_keys } = map { my $ v = $ opt_in - > { $ _ } ; $ v = { map { $ _ = > 1 ; } split ( /[^[:alnum:]]+/ , $ v ) } ; $ v ; } @ opt_keys ;
print Dumper $ opt ;
pod2usage ( 1 ) if $ opt - > { help } ;
pod2usage ( 1 ) unless ( 1
# defined $opt->{collections} && defined $opt->{etc}
) ;
}
sub get_api_config { #get api_config
my $ api_config = $ test_machine - > init_catalyst_config ;
$ api_info = $ api_config - > { meta } - > { 'collections' } ;
}
sub init_config { #init config
my % test_exclude = (
'metaconfigdefs' = > 1 ,
'subscriberpreferencedefs' = > 1 ,
'customerpreferencedefs' = > 1 ,
'domainpreferencedefs' = > 1 ,
'peeringserverpreferencedefs' = > 1 ,
'profilepreferencedefs' = > 1 ,
'subscriberpreferences' = > 1 ,
'customerpreferences' = > 1 ,
'domainpreferences' = > 1 ,
'peeringserverpreferences' = > 1 ,
'profilepreferences' = > 1 ,
'pbxdevicepreferencedefs' = > 1 ,
'pbxdeviceprofilepreferencedefs' = > 1 ,
#defs and preferences are tested in context of preferences
'pbxdevicefirmwares' = > 1 , #too hard, fails with timeout on get
#falis with: not ok 163 - ccmapentries: check_get2put: check put successful (Unprocessable Entity: Validation failed. field='mappings', input='ARRAY(0x1a53f278)', errors='Mappings field is required')
'ccmapentries' = > 1 ,
#fails with:
# got: 'https://127.0.0.1:1443/api/customerzonecosts/?page=1&rows=5&start=2016-10-01T000000&end=2016-10-31T235959'
# expected: 'https://127.0.0.1:1443/api/customerzonecosts/?page=1&rows=5'
'customerzonecosts' = > 1 ,
#fails with: Unsupported media type 'application/json', accepting text/plain or text/xml only.)
'pbxdeviceconfigs' = > 1 ,
#fails with: not ok 1131 - rtcapps: check_get2put: check put successful (Unprocessable Entity: Invalid field 'apps'. Must be an array.)
'rtcapps' = > 1 ,
#fails with: not ok 1176 - rtcnetworks: check_get2put: check put successful (Unprocessable Entity: Invalid field 'networks'. Must be an array.)
'rtcnetworks' = > 1 ,
) ;
my % test_exists ;
{
$ test_machine - > methods ( {
collection = > { allowed = > { map { $ _ = > 1 } keys % { $ data - > { $ collection } - > { allowed_methods } } } } ,
item = > $ item_allowed_actions ,
} ) ;
my $ dir = dirname ( $ 0 ) ;
my $ rule = File::Find::Rule - > new
- > mindepth ( 1 )
- > maxdepth ( 1 )
- > name ( 'api-*.t' ) ;
% test_exists = map { $ _ =~ s/\Q$dir\/\E// ; $ _ = > 1 } $ rule - > in ( $ dir ) ;
}
$ config - > { tests_exists } = \ % test_exists ;
$ config - > { tests_exclude } = \ % test_exclude ;
}
$ test_machine - > check_bundle ( ) ;
sub testscript_exists {
my $ collection = shift ;
return $ config - > { tests_exists } - > { 'api-' . $ collection . '.t' } ;
}
if ( $ test_machine - > { methods } - > { collection } - > { allowed } - > { GET } ) {
my $ item = $ test_machine - > get_item_hal ( ) ;
#if($item->{content}->{total_count}){
if ( ! $ test_machine - > IS_EMPTY_COLLECTION ) {
push @ { $ res - > { 'collections_not_empty' } } , $ collection ;
if ( $ data - > { $ collection } - > { allowed_methods } - > { POST } ) {
my $ item_post = clone ( $ item ) ;
delete $ item_post - > { content } - > { id } ;
$ test_machine - > DATA_ITEM_STORE ( $ item_post - > { content } ) ;
$ test_machine - > form_data_item ( ) ;
#test_machine->check_create_correct( 1 );
}
if ( $ test_machine - > { methods } - > { item } - > { allowed } - > { PUT } ) {
$ test_machine - > check_get2put ( ) ;
sub testscript_under_framework {
my $ collection = shift ;
eval {
$ fake_data - > load_data_from_script ( $ collection ) ;
} ;
if ( $@ ) {
print Dumper [ "testscript_under_framework" , $@ ] ;
return 0 ;
}
else {
return 1 ;
}
}
sub collection4testing {
my $ collection = shift ;
my $ r = ( ! ( scalar keys % { $ opt - > { collections } } ) ) || $ opt - > { collections } - > { $ collection } ;
if ( $ r ) {
#by default we run requested collection scripts even when exists
if ( ! $ opt - > { collections } - > { $ collection } ) {
if ( testscript_exists ( $ collection ) && ! $ opt - > { ignore_existence } ) {
push @ { $ report - > { 'tests_exists_skipped' } } , $ collection ;
#we will not test the same twice
$ r = 0 ;
}
} else {
push @ { $ res - > { 'collections_empty' } } , $ collection ;
$ r = 0 if $ config - > { test_exclude } - > { $ collection } ;
}
} else {
push @ { $ res - > { 'collections_no_get' } } , $ collection ;
}
return $ r ;
}
sub init_report {
$ report = {
'collections_no_get' = > [] ,
'collections_empty' = > [] ,
'collections_not_empty' = > [] ,
'strange_item_actions' = > { } ,
'no_module_item' = > [] ,
'tests_exists_skipped' = > [] ,
'checked' = > [] ,
'post_tested' = > [] ,
'post_untested' = > [] ,
'opt' = > $ opt ,
'config' = > $ config ,
} ;
}
$ test_machine - > clear_test_data_all ( ) ;
done_testing ;
undef $ fake_data ;
undef $ test_machine ;
print Dumper $ res ;
#my $item_post = clone($item);
#delete $item_post->{content}->{id};
#$test_machine->DATA_ITEM_STORE($item_post->{content});
#$test_machine->form_data_item();
##$test_machine->check_create_correct( 1, undef, );
# vim: set tabstop=4 expandtab: