From f1971bfcdd395996aeaf15c4e549fd8a3499a396 Mon Sep 17 00:00:00 2001 From: Irina Peshinskaya Date: Sun, 29 Jan 2017 23:36:31 +0200 Subject: [PATCH] TT#8680 Consider E164 empty fields Change-Id: I7accdbfc3421eb0fb94e3d9533a87c5489462bed --- lib/NGCP/Panel/Field/E164.pm | 19 ++++++++++++------- lib/NGCP/Panel/Field/E164Range.pm | 18 +++++++++--------- lib/NGCP/Panel/Role/API/Subscribers.pm | 22 ++++++++++++++++++---- t/api-rest/api-subscribers.t | 19 +++++++++++++++++-- 4 files changed, 56 insertions(+), 22 deletions(-) diff --git a/lib/NGCP/Panel/Field/E164.pm b/lib/NGCP/Panel/Field/E164.pm index e8c4e1e194..278446696c 100644 --- a/lib/NGCP/Panel/Field/E164.pm +++ b/lib/NGCP/Panel/Field/E164.pm @@ -14,6 +14,7 @@ has_field 'cc' => ( }, do_label => 0, do_wrapper => 0, + #required => 1, ); has_field 'ac' => ( @@ -25,6 +26,7 @@ has_field 'ac' => ( }, do_label => 0, do_wrapper => 0, + #required => 1, ); has_field 'sn' => ( @@ -36,23 +38,26 @@ has_field 'sn' => ( }, do_label => 0, do_wrapper => 0, + #required => 1, ); sub validate { my $self = shift; + my $cc = $self->field('cc')->value; my $sn = $self->field('sn')->value; - my %sub_errors = map {$_, 1} ( - @{ $self->field('cc')->errors }, - @{ $self->field('ac')->errors }, - @{ $self->field('sn')->errors } ); + my @sub_fields = (qw/cc ac sn/); + my %sub_errors = + map {$_, 1} + map { ($self->field($_) && $self->field($_)->result ) ? @{$self->field($_)->errors} : () } + @sub_fields; for my $sub_error( keys %sub_errors ) { $self->add_error($sub_error); } - $self->field('cc')->clear_errors if $self->field('cc'); - $self->field('ac')->clear_errors if $self->field('ac'); - $self->field('sn')->clear_errors if $self->field('sn'); + for my $sub_field (@sub_fields){ + $self->field($sub_field)->clear_errors if $self->field($sub_field) && $self->field($sub_field)->result; + } if ($self->has_errors) { #dont add more errors diff --git a/lib/NGCP/Panel/Field/E164Range.pm b/lib/NGCP/Panel/Field/E164Range.pm index be464c1290..867ce153b9 100644 --- a/lib/NGCP/Panel/Field/E164Range.pm +++ b/lib/NGCP/Panel/Field/E164Range.pm @@ -51,22 +51,22 @@ has_field 'snlength' => ( sub validate { my $self = shift; + my $cc = $self->field('cc')->value; my $sn = $self->field('snbase')->value; my $snlen = $self->field('snlength')->value; - my %sub_errors = map {$_, 1} ( - @{ $self->field('cc')->errors }, - @{ $self->field('ac')->errors }, - @{ $self->field('snbase')->errors }, - @{ $self->field('snlength')->errors } ); + my @sub_fields = qw/cc ac snbase snlength/; + my %sub_errors = + map {$_, 1} + map { ($self->field($_) && $self->field($_)->result ) ? @{$self->field($_)->errors} : () } + @sub_fields; for my $sub_error( keys %sub_errors ) { $self->add_error($sub_error); } - $self->field('cc')->clear_errors if $self->field('cc'); - $self->field('ac')->clear_errors if $self->field('ac'); - $self->field('snbase')->clear_errors if $self->field('snbase'); - $self->field('snlength')->clear_errors if $self->field('snlength'); + for my $sub_field (@sub_fields){ + $self->field($sub_field)->clear_errors if $self->field($sub_field) && $self->field($sub_field)->result; + } if ($self->has_errors) { #dont add more errors diff --git a/lib/NGCP/Panel/Role/API/Subscribers.pm b/lib/NGCP/Panel/Role/API/Subscribers.pm index fccb995dbd..c6c7d2a14f 100644 --- a/lib/NGCP/Panel/Role/API/Subscribers.pm +++ b/lib/NGCP/Panel/Role/API/Subscribers.pm @@ -254,11 +254,25 @@ sub prepare_resource { $resource->{profile}{id} = delete $resource->{profile_id}; my $subscriber_id = $item ? $item->id : 0; - if(exists $resource->{alias_numbers} && ref $resource->{alias_numbers} ne "ARRAY") { - $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid alias_numbers parameter, must be array."); - return; + if(defined $resource->{e164}) { + if( ref $resource->{e164} ne "HASH"){ + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, 'Invalid primary_number parameter, must be a hash.'); + return; + } + } + if(exists $resource->{alias_numbers}) { + if( ref $resource->{alias_numbers} ne "ARRAY"){ + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, 'Invalid alias_number parameter, must be an array.'); + return; + } + $resource->{alias_numbers} = [ map {{ e164 => $_ }} @{ $resource->{alias_numbers} // [] } ]; + foreach my $alias_number (@{$resource->{alias_numbers}}){ + if( ref $alias_number->{e164} ne "HASH"){ + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, 'Invalid alias_number parameter, must be an array of the hashes.'); + return; + } + } } - $resource->{alias_numbers} = [ map {{ e164 => $_ }} @{ $resource->{alias_numbers} // [] } ]; my $form = $self->get_form($c); return unless $self->validate_form( diff --git a/t/api-rest/api-subscribers.t b/t/api-rest/api-subscribers.t index c6ad97a3b7..91b7c0c2b0 100644 --- a/t/api-rest/api-subscribers.t +++ b/t/api-rest/api-subscribers.t @@ -144,12 +144,12 @@ my $remote_config = $test_machine->init_catalyst_config; #1 $subscriber->{content}->{primary_number} = $intentional_primary_number; ($subscriber_put,$subscriber_get,$preferences_get) = $test_machine->put_and_get($subscriber, $preferences_put); - is($preferences_get->{content}->{cli}, $intentional_cli, "check that cli was preserved on subscriber phones update: $preferences_get->{content}->{cli} == $intentional_cli"); + is($preferences_get->{content}->{cli}, $intentional_cli, "1. check that cli was preserved on subscriber phones update: $preferences_get->{content}->{cli} == $intentional_cli"); #/1 #2 delete $subscriber->{content}->{primary_number}; ($subscriber_put,$subscriber_get,$preferences_get) = $test_machine->put_and_get($subscriber, $preferences_put); - is($preferences_get->{content}->{cli}, $intentional_cli, "check that cli was preserved on subscriber phones update: $preferences_get->{content}->{cli} == $intentional_cli"); + is($preferences_get->{content}->{cli}, $intentional_cli, "2. check that cli was preserved on subscriber phones update: $preferences_get->{content}->{cli} == $intentional_cli"); #/2 #now prepare preferences for zero situation, when synchronization will be restarted again delete $preferences->{content}->{cli}; @@ -244,6 +244,21 @@ if($remote_config->{config}->{features}->{cloudpbx}){ $test_machine->clear_test_data_all();#fake data aren't registered in this test machine, so they will stay. } } +#TT#8680 +{ + diag("8680: check E164 fields format;\n"); + my $data = clone $test_machine->DATA_ITEM; + #TT#9066 + $data->{primary_number} = ["12123132"]; + my($res,$content) = $test_machine->request_post( $data); + $test_machine->http_code_msg(422, "Pimary number should be a hash", $res, $content); + #MT#22853 + my $data = clone $test_machine->DATA_ITEM; + $data->{alias_numbers} = ["49221222899813", "49221222899814", "49221222899814"]; + my($res,$content) = $test_machine->request_post( $data); + $test_machine->http_code_msg(422, "Alias numbers should be the hashs", $res, $content); +} + $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();