From 5f29fe2895f5bbd4c5b77d7e5b3ee0d6127fbd7a Mon Sep 17 00:00:00 2001 From: Irina Peshinskaya Date: Wed, 14 Jun 2017 14:53:14 +0300 Subject: [PATCH] TT#17638 Take rule data from validated form values Change-Id: Ia4c31a6a0bd72f29021141f72aa11aede6a23157 --- .../Panel/Controller/API/RewriteRuleSets.pm | 2 +- .../Controller/API/RewriteRuleSetsItem.pm | 2 +- lib/NGCP/Panel/Role/API/RewriteRuleSets.pm | 4 +- t/api-rest/api-rewriterules.t | 129 ++++----- t/api-rest/api-rewriterulesets.t | 262 +----------------- 5 files changed, 62 insertions(+), 337 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/RewriteRuleSets.pm b/lib/NGCP/Panel/Controller/API/RewriteRuleSets.pm index 6ab9070d94..e079679334 100644 --- a/lib/NGCP/Panel/Controller/API/RewriteRuleSets.pm +++ b/lib/NGCP/Panel/Controller/API/RewriteRuleSets.pm @@ -60,7 +60,7 @@ sub create_item { return; } if ($rewriterules) { - $self->update_rewriterules( $c, $item, $rewriterules ); + $self->update_rewriterules( $c, $item, $form, $rewriterules ); } $guard->commit; NGCP::Panel::Utils::Rewrite::sip_dialplan_reload($c); diff --git a/lib/NGCP/Panel/Controller/API/RewriteRuleSetsItem.pm b/lib/NGCP/Panel/Controller/API/RewriteRuleSetsItem.pm index 7904a118d1..c3a02fc644 100644 --- a/lib/NGCP/Panel/Controller/API/RewriteRuleSetsItem.pm +++ b/lib/NGCP/Panel/Controller/API/RewriteRuleSetsItem.pm @@ -50,7 +50,7 @@ sub update_item_model { my $rewriterules = delete $resource->{rewriterules}; $item->update($resource); if ($rewriterules) { - $self->update_rewriterules( $c, $item, $rewriterules ); + $self->update_rewriterules( $c, $item, $form, $rewriterules ); } } catch($e) { $c->log->error("Failed to update rewriterule with id '$id': $e"); diff --git a/lib/NGCP/Panel/Role/API/RewriteRuleSets.pm b/lib/NGCP/Panel/Role/API/RewriteRuleSets.pm index 266becfb6d..cfaf302fab 100644 --- a/lib/NGCP/Panel/Role/API/RewriteRuleSets.pm +++ b/lib/NGCP/Panel/Role/API/RewriteRuleSets.pm @@ -114,7 +114,7 @@ sub check_duplicate{ } sub update_rewriterules{ - my($self, $c, $item, $rewriterules ) = @_; + my($self, $c, $item, $form, $rewriterules ) = @_; my $schema = $c->model('DB'); @@ -124,7 +124,7 @@ sub update_rewriterules{ die; } $item->voip_rewrite_rules->delete; - for my $rule (@{ $rewriterules }) { + for my $rule (@{ $form->values->{rewriterules} }) { try { $item->voip_rewrite_rules->create({ priority => $priority++, diff --git a/t/api-rest/api-rewriterules.t b/t/api-rest/api-rewriterules.t index 4bd9b9014f..7d6950aede 100644 --- a/t/api-rest/api-rewriterules.t +++ b/t/api-rest/api-rewriterules.t @@ -19,6 +19,7 @@ $fake_data->set_data_from_script({ rewriterules => { data => { set_id => sub { return shift->get_id('rewriterulesets',@_); }, + #match_pattern => '^111$', match_pattern => '^111$', replace_pattern => '222', description => 'test_api rewrite rule', @@ -35,100 +36,72 @@ $test_machine->DATA_ITEM_STORE($fake_data->process('rewriterules')); $test_machine->form_data_item( ); # create 3 new field pbx devices from DATA_ITEM -$test_machine->check_create_correct( 3, sub{ $_[0]->{description} .= $_[1]->{i}; } ); +my $rules = $test_machine->check_create_correct( 3, sub{ + $_[0]->{description} .= $_[1]->{i}; + #to test inflate/deflate + $_[0]->{match_pattern} = '${caller_in}_' . time().$_[1]->{i}; + $_[0]->{replace_pattern} = '${caller_in}_' . time().$_[1]->{i}; +} ); $test_machine->check_get2put(); $test_machine->check_bundle(); -$test_machine->clear_test_data_all(); - -done_testing; -__DATA__ - - # try to create rule with invalid set_id - $req = HTTP::Request->new('POST', $uri.'/api/rewriterules/'); - $req->header('Content-Type' => 'application/json'); - $req->content(JSON::to_json({ - set_id => 999999, - description => "test rule $t", - direction => "in", - field => "caller", - match_pattern => "test pattern $t", - replace_pattern => "test_replace_$t", - })); - $res = $ua->request($req); +{ + $rules->[1]->{content}->{match_pattern} = '${callee_in}_' . time(); + $rules->[1]->{content}->{replace_pattern} = '${callee_in}_' . time(); + $test_machine->request_put(@{$rules->[1]}{qw/content location/}); + my ($res, $rule, $req) = $test_machine->check_item_get($rules->[1]->{location}); + #While I don't know how to test raw data when we recieve inflated + #so just checked in the DB + #print Dumper $rules->[1]->{content}; + ok(exists $rule->{direction} && $rule->{direction} =~ /^(in|out)$/ , "check existence of direction"); + ok(exists $rule->{field} && $rule->{field} =~ /^(caller|callee)$/, "check existence of field"); + ok(exists $rule->{match_pattern} && length($rule->{match_pattern}) > 0, "check existence of match_pattern"); + ok(exists $rule->{replace_pattern} && length($rule->{replace_pattern}) > 0, "check existence of replace_pattern"); + ok(exists $rule->{description} && length($rule->{description}) > 0, "check existence of description"); + ok(exists $rules->[1]->{content}->{_links}->{'ngcp:rewriterules'}, "check put presence of ngcp:rewriterules relation"); + ok(exists $rules->[1]->{content}->{_links}->{'ngcp:rewriterulesets'}, "check put presence of ngcp:rewriterulesets relation"); +} +# try to create rule with invalid set_id +{ + my ($res, $err) = $test_machine->check_item_post(sub{$_[0]->{set_id} = 999999;}); is($res->code, 422, "create rule with invalid set_id"); - $err = JSON::from_json($res->decoded_content); is($err->{code}, "422", "check error code in body"); like($err->{message}, qr/Invalid 'set_id'/, "check error message in body"); - - # try to create rule with negative set_id - $req = HTTP::Request->new('POST', $uri.'/api/rewriterules/'); - $req->header('Content-Type' => 'application/json'); - $req->content(JSON::to_json({ - set_id => -100, - description => "test rule $t", - direction => "in", - field => "caller", - match_pattern => "test pattern $t", - replace_pattern => "test_replace_$t", - })); - $res = $ua->request($req); +} +# try to create rule with negative set_id +{ + my ($res, $err) = $test_machine->check_item_post(sub{$_[0]->{set_id} = -100;}); is($res->code, 422, "create rule with negative set_id"); - $err = JSON::from_json($res->decoded_content); is($err->{code}, "422", "check error code in body"); like($err->{message}, qr/(Invalid|Validation failed).*'set_id'/, "check error message in body"); - - # try to create rule with missing match_pattern - $req = HTTP::Request->new('POST', $uri.'/api/rewriterules/'); - $req->header('Content-Type' => 'application/json'); - $req->content(JSON::to_json({ - set_id => $rewriteruleset_id, - description => "test rule $t", - direction => "in", - field => "caller", - #match_pattern => "test pattern $t", - replace_pattern => "test_replace_$t", - })); - $res = $ua->request($req); +} +# try to create rule without set_id +{ + my ($res, $err) = $test_machine->check_item_post(sub{ delete $_[0]->{set_id};}); + is($res->code, 422, "create rule without set_id"); + is($err->{code}, "422", "check error code in body"); + like($err->{message}, qr/Required: 'set_id'|set_id.*required/, "check error message in body"); +} +# try to create rule with missing match_pattern +{ + my ($res, $err) = $test_machine->check_item_post(sub{ delete $_[0]->{match_pattern};}); is($res->code, 422, "create rule with missing match_pattern"); - $err = JSON::from_json($res->decoded_content); is($err->{code}, "422", "check error code in body"); like($err->{message}, qr/field='match_pattern'/, "check error message in body"); - - # try to create rule with invalid direction and field - $req = HTTP::Request->new('POST', $uri.'/api/rewriterules/'); - $req->header('Content-Type' => 'application/json'); - $req->content(JSON::to_json({ - set_id => $rewriteruleset_id, - description => "test rule $t", - direction => "foo", - field => "bar", - match_pattern => "test pattern $t", - replace_pattern => "test_replace_$t", - })); - $res = $ua->request($req); +} +# try to create rule with invalid direction and field +{ + my ($res, $err) = $test_machine->check_item_post(sub{ + $_[0]->{direction} = 'foo'; + $_[0]->{field} = 'bar'; + }); is($res->code, 422, "create rule with invalid direction and field"); - $err = JSON::from_json($res->decoded_content); is($err->{code}, "422", "check error code in body"); like($err->{message}, qr/field='direction'/, "check error message in body"); like($err->{message}, qr/field='field'/, "check error message in body"); +} - # try to create rule without set_id - $req = HTTP::Request->new('POST', $uri.'/api/rewriterules/'); - $req->header('Content-Type' => 'application/json'); - $req->content(JSON::to_json({ - #set_id => $rewriteruleset_id, - description => "test rule $t", - direction => "in", - field => "caller", - match_pattern => "test pattern $t", - replace_pattern => "test_replace_$t", - })); - $res = $ua->request($req); - is($res->code, 422, "create rule without set_id"); - $err = JSON::from_json($res->decoded_content); - is($err->{code}, "422", "check error code in body"); - like($err->{message}, qr/Required: 'set_id'|set_id.*required/, "check error message in body"); - +$test_machine->clear_test_data_all(); +done_testing; # vim: set tabstop=4 expandtab: diff --git a/t/api-rest/api-rewriterulesets.t b/t/api-rest/api-rewriterulesets.t index 97980562f2..8e167668a6 100644 --- a/t/api-rest/api-rewriterulesets.t +++ b/t/api-rest/api-rewriterulesets.t @@ -26,7 +26,7 @@ $fake_data->set_data_from_script({ caller_out_dpid => '3', callee_out_dpid => '4', rewriterules => [{ - match_pattern => '^1111$', + match_pattern => '${caller_in}_${callee_in}_' . time().'1', replace_pattern => '2221', description => 'test_api rewrite rule 1', direction => 'in',#out @@ -34,7 +34,7 @@ $fake_data->set_data_from_script({ priority => '2', enabled => '1', },{ - match_pattern => '^1112$', + match_pattern => '${caller_in}_${callee_in}_' . time().'2', replace_pattern => '2222', description => 'test_api rewrite rule 2', direction => 'in',#out @@ -42,7 +42,7 @@ $fake_data->set_data_from_script({ priority => '3', enabled => '1', },{ - match_pattern => '^1113$', + match_pattern => '${caller_in}_${callee_in}_' . time().'3', replace_pattern => '2223', description => 'test_api rewrite rule 3', direction => 'in',#out @@ -65,7 +65,7 @@ $test_machine->form_data_item( ); my $sets = $test_machine->check_create_correct( 3, sub{ $_[0]->{name} .= $_[1]->{i}.time(); } ); $test_machine->check_get2put(); $test_machine->check_bundle(); -print Dumper $sets; +#print Dumper $sets; for(my $i=0; $i < scalar @$sets; $i++){ my $set = $sets->[$i]; my $rewriterules = $sets->[$i]->{content}->{rewriterules}; @@ -74,13 +74,14 @@ for(my $i=0; $i < scalar @$sets; $i++){ my $priority_new = $rewriterules->[$j]->{priority}; diag("Check priority order $i:$j: $priority < $priority_new"); ok($priority < $priority_new) ; + $priority = $priority_new; } } -# try to create model without reseller_id +# try to create ruleset without reseller_id { my ($res, $err) = $test_machine->check_item_post(sub{delete $_[0]->{reseller_id};}); - is($res->code, 422, "create model without reseller_id"); + is($res->code, 422, "create ruleset without reseller_id"); is($err->{code}, "422", "check error code in body"); ok($err->{message} =~ /field='reseller_id'/, "check error message in body"); } @@ -92,232 +93,6 @@ done_testing; __DATA__ - - - - - -use warnings; -use strict; - -use Net::Domain qw(hostfqdn); -use JSON qw(); -use Test::More; -use Test::ForceArray qw/:all/; - -my $uri = $ENV{CATALYST_SERVER} || ('https://'.hostfqdn.':4443'); - -my ($ua, $req, $res); - -use Test::Collection; -$ua = Test::Collection->new()->ua(); - -t, we create a rewriteruleset -$req = HTTP::Request->new('POST', $uri.'/api/rewriterulesets/'); -$req->header('Content-Type' => 'application/json'); -$req->header('Prefer' => 'return=representation'); -my $t = time; -$req->content(JSON::to_json({ - reseller_id => $reseller_id, - description => "testdescription $t", - name => "test rewriteruleset $t", -})); -$res = $ua->request($req); -is($res->code, 201, "create test rewriteruleset"); -my $rewriteruleset_id = $res->header('Location'); -# TODO: get it from body! -> we have no body ... -$rewriteruleset_id =~ s/^.+\/(\d+)$/$1/; -diag("set id is $rewriteruleset_id"); - -# then, we create a rewriterule -$req = HTTP::Request->new('POST', $uri.'/api/rewriterules/'); -$req->header('Content-Type' => 'application/json'); -$req->header('Prefer' => 'return=representation'); -$req->content(JSON::to_json({ - set_id => $rewriteruleset_id, - description => "test rule $t", - direction => "in", - field => "caller", - match_pattern => "test pattern $t", - replace_pattern => "test_replace_$t", -})); -$res = $ua->request($req); -is($res->code, 201, "create test rewriterule"); -my $rule_id = $res->header('Location'); -# TODO: get it from body! -> we have no body ... -$rule_id =~ s/^.+\/(\d+)$/$1/; - -# collection test -my $firstrule = undef; -my @allrules = (); -{ - # create 6 new rewriterules - my %rules = (); - for(my $i = 1; $i <= 6; ++$i) { - $req = HTTP::Request->new('POST', $uri.'/api/rewriterules/'); - $req->header('Content-Type' => 'application/json'); - $req->content(JSON::to_json({ - set_id => $rewriteruleset_id, - description => "test rule $t - $i", - direction => "out", - field => "callee", - match_pattern => "test pattern $t", - #replace_pattern => "test_replace_$t", - replace_pattern => '${caller_in}_' . "$t", - })); - $res = $ua->request($req); - is($res->code, 201, "create test rewriterule $i"); - $rules{$res->header('Location')} = 1; - push @allrules, $res->header('Location'); - $firstrule = $res->header('Location') unless $firstrule; - } - - # try to create ruleset without reseller_id - $req = HTTP::Request->new('POST', $uri.'/api/rewriterulesets/'); - $req->header('Content-Type' => 'application/json'); - $req->content(JSON::to_json({ - #reseller_id => $reseller_id, - description => "testdescription $t", - name => "test rewriteruleset $t", - })); - $res = $ua->request($req); - is($res->code, 422, "create ruleset without reseller_id"); - my $err = JSON::from_json($res->decoded_content); - is($err->{code}, "422", "check error code in body"); - like($err->{message}, qr/Invalid 'reseller_id'/, "check error message in body"); - - # iterate over rules collection to check next/prev links and status - my $nexturi = $uri.'/api/rewriterules/?page=1&rows=5'; - do { - $res = $ua->get($nexturi); - is($res->code, 200, "fetch rules page"); - my $collection = JSON::from_json($res->decoded_content); - my $selfuri = $uri . $collection->{_links}->{self}->{href}; - is($selfuri, $nexturi, "check _links.self.href of collection"); - my $colluri = URI->new($selfuri); - - ok($collection->{total_count} > 0, "check 'total_count' of collection"); - - my %q = $colluri->query_form; - ok(exists $q{page} && exists $q{rows}, "check existence of 'page' and 'row' in 'self'"); - my $page = int($q{page}); - my $rows = int($q{rows}); - if($page == 1) { - ok(!exists $collection->{_links}->{prev}->{href}, "check absence of 'prev' on first page"); - } else { - ok(exists $collection->{_links}->{prev}->{href}, "check existence of 'prev'"); - } - if(($collection->{total_count} / $rows) <= $page) { - ok(!exists $collection->{_links}->{next}->{href}, "check absence of 'next' on last page"); - } else { - ok(exists $collection->{_links}->{next}->{href}, "check existence of 'next'"); - } - - if($collection->{_links}->{next}->{href}) { - $nexturi = $uri . $collection->{_links}->{next}->{href}; - } else { - $nexturi = undef; - } - - ok((ref $collection->{_links}->{'ngcp:rewriterules'} eq "ARRAY" || - ref $collection->{_links}->{'ngcp:rewriterules'} eq "HASH"), - "check if 'ngcp:rewriterules' is array/hash-ref"); - - # remove any entry we find in the collection for later check - if(ref $collection->{_links}->{'ngcp:rewriterules'} eq "HASH") { - my $item = get_embedded_item($collection,'rewriterules'); - ok(exists $item->{_links}->{'ngcp:rewriterules'}, "check presence of ngcp:rewriterules relation"); - ok(exists $item->{_links}->{'ngcp:rewriterulesets'}, "check presence of ngcp:rewriterulesets relation"); - delete $rules{$collection->{_links}->{'ngcp:rewriterules'}->{href}}; - } else { - foreach my $c(@{ $collection->{_links}->{'ngcp:rewriterules'} }) { - delete $rules{$c->{href}}; - } - foreach my $c(@{ $collection->{_embedded}->{'ngcp:rewriterules'} }) { - ok(exists $c->{_links}->{'ngcp:rewriterules'}, "check presence of ngcp:rewriterules (self) relation"); - ok(exists $c->{_links}->{'ngcp:rewriterulesets'}, "check presence of ngcp:rewriterulesets relation"); - - delete $rules{$c->{_links}->{self}->{href}}; - } - } - - } while($nexturi); - - is(scalar(keys %rules), 0, "check if all test rewriterules have been found"); -} - - -# test rule item -{ - $req = HTTP::Request->new('OPTIONS', $uri.'/'.$firstrule); - $res = $ua->request($req); - is($res->code, 200, "check options on item"); - my @hopts = split /\s*,\s*/, $res->header('Allow'); - my $opts = JSON::from_json($res->decoded_content); - ok(exists $opts->{methods} && ref $opts->{methods} eq "ARRAY", "check for valid 'methods' in body"); - foreach my $opt(qw( GET HEAD OPTIONS PUT PATCH DELETE )) { - ok(grep(/^$opt$/, @hopts), "check for existence of '$opt' in Allow header"); - ok(grep(/^$opt$/, @{ $opts->{methods} }), "check for existence of '$opt' in body"); - } - foreach my $opt(qw( POST )) { - ok(!grep(/^$opt$/, @hopts), "check for absence of '$opt' in Allow header"); - ok(!grep(/^$opt$/, @{ $opts->{methods} }), "check for absence of '$opt' in body"); - } - - $req = HTTP::Request->new('GET', $uri.'/'.$firstrule); - $res = $ua->request($req); - is($res->code, 200, "fetch one rule item"); - my $rule = JSON::from_json($res->decoded_content); - ok(exists $rule->{direction} && $rule->{direction} =~ /^(in|out)$/ , "check existence of direction"); - ok(exists $rule->{field} && $rule->{field} =~ /^(caller|callee)$/, "check existence of field"); - ok(exists $rule->{match_pattern} && length($rule->{match_pattern}) > 0, "check existence of match_pattern"); - ok(exists $rule->{replace_pattern} && length($rule->{replace_pattern}) > 0, "check existence of replace_pattern"); - ok(exists $rule->{description} && length($rule->{description}) > 0, "check existence of description"); - - # PUT same result again - my $old_rule = { %$rule }; - delete $rule->{_links}; - delete $rule->{_embedded}; - $req = HTTP::Request->new('PUT', $uri.'/'.$firstrule); - - # check if it fails without content type - $req->remove_header('Content-Type'); - $req->header('Prefer' => "return=minimal"); - $res = $ua->request($req); - is($res->code, 415, "check put missing content type"); - - # check if it fails with unsupported content type - $req->header('Content-Type' => 'application/xxx'); - $res = $ua->request($req); - is($res->code, 415, "check put invalid content type"); - - $req->remove_header('Content-Type'); - $req->header('Content-Type' => 'application/json'); - - # check if it fails with invalid Prefer - $req->header('Prefer' => "return=invalid"); - $res = $ua->request($req); - is($res->code, 400, "check put invalid prefer"); - - $req->remove_header('Prefer'); - $req->header('Prefer' => "return=representation"); - - # check if it fails with missing body - $res = $ua->request($req); - is($res->code, 400, "check put no body"); - - # check if put is ok - $req->content(JSON::to_json($rule)); - $res = $ua->request($req); - is($res->code, 200, "check put successful"); - - my $new_rule = JSON::from_json($res->decoded_content); - is_deeply($old_rule, $new_rule, "check put if unmodified put returns the same"); - - # check if we have the proper links - ok(exists $new_rule->{_links}->{'ngcp:rewriterules'}, "check put presence of ngcp:rewriterules relation"); - ok(exists $new_rule->{_links}->{'ngcp:rewriterulesets'}, "check put presence of ngcp:rewriterulesets relation"); - $req = HTTP::Request->new('PATCH', $uri.'/'.$firstrule); $req->header('Prefer' => 'return=representation'); $req->header('Content-Type' => 'application/json-patch+json'); @@ -356,27 +131,4 @@ my @allrules = (); is($res->code, 422, "check patched invalid field"); } -{ - my $firstr; - foreach my $r(@allrules) { - $req = HTTP::Request->new('DELETE', $uri.'/'.$r); - $res = $ua->request($req); - is($res->code, 204, "check delete of rule"); - $firstr = $r unless $firstr; - } - $req = HTTP::Request->new('GET', $uri.'/'.$firstr); - $res = $ua->request($req); - is($res->code, 404, "check if deleted rule is really gone"); - - $req = HTTP::Request->new('DELETE', $uri.'/api/rewriterulesets/'.$rewriteruleset_id); - $res = $ua->request($req); - is($res->code, 204, "check delete of rewriteruleset"); - - $req = HTTP::Request->new('GET', $uri.'/api/rewriterulesets/'.$rewriteruleset_id); - $res = $ua->request($req); - is($res->code, 404, "check if deleted rewriteruleset is really gone"); -} - -done_testing; - # vim: set tabstop=4 expandtab: