From 7a7fb940085c5feca19bae104bd3914b16004d5a Mon Sep 17 00:00:00 2001 From: Gerhard Jungwirth Date: Thu, 17 Dec 2015 14:42:04 +0100 Subject: [PATCH] MT#15883 use expand param of rtc API this is important, because it allows us, to be completely independent of their href uris, whom we cannot always trust (the domain part in particular) Change-Id: Ic67f8240dfb50a5ea4948931d7e0554ce7f5ef4e --- lib/NGCP/Panel/Utils/ComxAPIClient.pm | 59 ++++++++++++++++++++++----- t/unit-comxapiclient-collection.t | 38 +++++++++++++++++ 2 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 t/unit-comxapiclient-collection.t diff --git a/lib/NGCP/Panel/Utils/ComxAPIClient.pm b/lib/NGCP/Panel/Utils/ComxAPIClient.pm index 24388fe613..854cb91d37 100644 --- a/lib/NGCP/Panel/Utils/ComxAPIClient.pm +++ b/lib/NGCP/Panel/Utils/ComxAPIClient.pm @@ -133,10 +133,10 @@ sub create_app { sub get_sessions { my ($self, $max_rows) = @_; - my $sessions = $self->_resolve_collection( '/sessions', $max_rows ); - if ('ARRAY' eq ref $sessions && @{ $sessions }) { - for my $session (@{ $sessions }) { - $session->{accounts} = $self->_resolve_collection( $session->{accounts}{href} ); + my $sessions = $self->_resolve_collection_fast( '/sessions', $max_rows ); + if ('ARRAY' eq ref $sessions->{data} && @{ $sessions->{data} }) { + for my $session (@{ $sessions->{data} }) { + $session->{accounts} = $self->_resolve_collection_fast( $session->{accounts}{href} ); } } return $sessions; @@ -155,7 +155,7 @@ sub delete_all_sessions { my ($self) = @_; my $ua = $self->ua; my $resp; - for my $session_data ($self->get_sessions) { + for my $session_data ($self->get_sessions->{data}) { my $session_id = $session_data->{id}; $resp = $ua->delete($self->host . "/sessions/id/$session_id"); last if $resp->code >= 300; @@ -165,13 +165,13 @@ sub delete_all_sessions { sub get_users { my ($self, $max_rows) = @_; - my $users = $self->_resolve_collection( '/users', $max_rows ); + my $users = $self->_resolve_collection_fast( '/users', $max_rows ); return $users; } sub get_networks { my ($self) = @_; - my $networks = $self->_resolve_collection( '/networks' ); + my $networks = $self->_resolve_collection_fast( '/networks' ); return $networks; } @@ -181,17 +181,54 @@ sub _resolve_collection { my $rel_url = $self->_strip_host( $bare_url ); my $res = $ua->get($self->host . $rel_url); my @result; - return [] unless $res->code == 200; + return {code => $res->code, response => $res} unless $res->code == 200; my $collection = JSON::decode_json($res->content); - return [] unless $collection; + return {code => $res->code, response => $res, + error_detail => 'could not decode_json'} unless $collection; + my $item_res; for my $item (@{ $collection->{items} }) { last if (defined $max_rows && $max_rows-- <= 0); my $url = $self->_strip_host( $item->{href} ); - my $item_res = $ua->get($self->host . $url); + $item_res = $ua->get($self->host . $url); my $item_data = decode_json($item_res->content); push @result, $item_data; } - return \@result; + return { + response => $item_res, # latest response + code => $item_res->code, + data => \@result, + total_count => scalar(@result), + }; +} + +sub _resolve_collection_fast { + my ($self, $bare_url, $max_rows) = @_; + my $ua = $self->ua; + my $rel_url = $self->_strip_host( $bare_url ); + $rel_url = + $rel_url . + ( ($rel_url =~ m/\?/) ? '&' : '?' ) . + 'expand=true'; + my $res = $ua->get($self->host . $rel_url); + my @result; + return {code => $res->code, response => $res} unless $res->code == 200; + my $collection = JSON::decode_json($res->content); + return {code => $res->code, response => $res, + error_detail => 'could not decode_json'} unless $collection; + if ('HASH' eq ref $collection) { # everything ok + return { + response => $res, + code => $res->code, + data => $collection->{items}, + total_count => $collection->{total} // (scalar @{ $collection->{items} }), + }; + } else { # unknown error + return { + response => $res, + code => $res->code, + data => $collection, + }; + } } sub _strip_host { diff --git a/t/unit-comxapiclient-collection.t b/t/unit-comxapiclient-collection.t new file mode 100644 index 0000000000..40b3e8a335 --- /dev/null +++ b/t/unit-comxapiclient-collection.t @@ -0,0 +1,38 @@ +use warnings; +use strict; +use Test::More; + +use NGCP::Panel::Utils::ComxAPIClient; + +my $comx_host = $ENV{COMX_HOST} // 'https://rtcengine.sipwise.com/rtcengine/api'; +my $comx_user = $ENV{COMX_USER} // 'gjungwirth@sipwise'; +my $comx_pass = $ENV{COMX_PASS}; +my $comx_netloc = $comx_host =~ s!^https://([^/:]*)(:[0-9]*)?/.*$!$1.($2||":443")!re; # 'rtcengine.sipwise.com:443' + +my $COLLECTION_TARGET = '/users'; + +my $comx = NGCP::Panel::Utils::ComxAPIClient->new( + host => $comx_host, +); +$comx->login($comx_user, $comx_pass, $comx_netloc); +ok($comx->login_status, "Login done"); +is($comx->login_status->{code}, 200, "Login successful"); + +my $users1 = $comx->_resolve_collection($COLLECTION_TARGET); +isa_ok($users1, 'HASH', 'Collection Method 1'); +ok($users1->{response}, 'Collection Method 1 - has response'); +ok($users1->{response}->is_success, 'Collection Method 1 - response successful'); +isa_ok($users1->{data}, 'ARRAY', 'Collection Method 1 - has data'); + +my $users2 = $comx->_resolve_collection_fast($COLLECTION_TARGET); +isa_ok($users2, 'HASH', 'Collection Method 2'); +ok($users2->{response}, 'Collection Method 2 - has response'); +ok($users2->{response}->is_success, 'Collection Method 2 - response successful'); +isa_ok($users2->{data}, 'ARRAY', 'Collection Method 2 - has data'); + +is($users1->{total_count}, $users2->{total_count}, 'total_count is the same'); +map {delete $_->{href}} @{ $users2->{data} }; +is_deeply($users1->{data}, $users2->{data}, 'they are the same'); + +ok(1,"stub, done"); +done_testing; \ No newline at end of file