107 lines
3.7 KiB
107 lines
3.7 KiB
package NGCP::TestFramework::RequestBuilder;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use HTTP::Request;
|
|
use Cpanel::JSON::XS;
|
|
use Log::Log4perl qw(:easy);
|
|
use Moose;
|
|
use Data::Dumper;
|
|
|
|
has 'base_uri' => (
|
|
isa => 'Str',
|
|
is => 'ro'
|
|
);
|
|
|
|
sub build {
|
|
my ( $self, $args ) = @_;
|
|
|
|
my @methods = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'HEAD', 'CONNECT', 'TRACE'];
|
|
|
|
if ( !$args->{method} && !grep { $_ eq $args->{method} } @methods ) {
|
|
return {
|
|
success => 0,
|
|
message => 'HTTP method missing or incorrect!'
|
|
};
|
|
}
|
|
|
|
if ( !$args->{path} ) {
|
|
return {
|
|
success => 0,
|
|
message => 'Path missing!'
|
|
};
|
|
}
|
|
|
|
$self->_replace_vars($args);
|
|
|
|
my $req = HTTP::Request->new( $args->{method}, $self->base_uri.$args->{path} );
|
|
grep { $req->header( $_ => $args->{header}->{$_} ) } keys %{$args->{header}} if $args->{header};
|
|
$req->content( encode_json( $args->{content} ) ) if $args->{content};
|
|
|
|
return $req;
|
|
}
|
|
|
|
sub _replace_vars {
|
|
my ( $self, $args ) = @_;
|
|
|
|
# substitute variables in path
|
|
if ( $args->{path} =~ /\$\{(.*)\}/ ) {
|
|
$args->{path} =~ s/\$\{(.*)\}/$args->{retain}->{$1}/;
|
|
}
|
|
|
|
# substitute variables in content
|
|
if ( $args->{content} ) {
|
|
if ( ref $args->{content} eq 'HASH' ) {
|
|
foreach my $content_key (keys %{$args->{content}}) {
|
|
if ( $args->{content}->{$content_key} && $args->{content}->{$content_key} =~ /\$\{(.*)\}$/ ) {
|
|
if ( ref $args->{retain}->{$1} eq 'ARRAY' || ref $args->{retain}->{$1} eq 'HASH' ) {
|
|
$args->{content}->{$content_key} = $args->{retain}->{$1};
|
|
}
|
|
else {
|
|
$args->{content}->{$content_key} =~ s/\$\{(.*)\}/$args->{retain}->{$1}/;
|
|
}
|
|
}
|
|
elsif ( $args->{content}->{$content_key} && $args->{content}->{$content_key} =~ /^\$\{(.*)\}\..+/ ) {
|
|
my @splitted_values = split (/\./, $args->{content}->{$content_key});
|
|
$args->{content}->{$content_key} = $self->_retrieve_from_composed_key( \@splitted_values, $args->{retain} );
|
|
}
|
|
}
|
|
}
|
|
elsif ( ref $args->{content} eq 'ARRAY' ) {
|
|
foreach my $content ( @{$args->{content}} ) {
|
|
foreach my $content_key (keys %$content) {
|
|
if ( $content->{$content_key} && $content->{$content_key} =~ /\$\{(.*)\}$/ ) {
|
|
if ( ref $args->{retain}->{$1} eq 'ARRAY' || ref $args->{retain}->{$1} eq 'HASH' ) {
|
|
$content->{$content_key} = $args->{retain}->{$1};
|
|
}
|
|
else {
|
|
$content->{$content_key} =~ s/\$\{(.*)\}/$args->{retain}->{$1}/;
|
|
}
|
|
}
|
|
elsif ( $content->{$content_key} && $content->{$content_key} =~ /^\$\{(.*)\}\..+/ ) {
|
|
my @splitted_values = split (/\./, $content->{$content_key});
|
|
$content->{$content_key} = $self->_retrieve_from_composed_key( \@splitted_values, $args->{retain} );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if ( $args->{content} =~ /\$\{(.*)\}/ ) {
|
|
$args->{content} = $args->{retain}->{$1};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sub _retrieve_from_composed_key {
|
|
my ( $self, $splitted_values, $retained ) = @_;
|
|
|
|
if ( $splitted_values->[0] =~ /\$\{(.*)\}/ ) {
|
|
my $value = $retained->{$1};
|
|
grep { $value = $value->{$splitted_values->[$_]} } (1..(scalar @$splitted_values - 1));
|
|
return $value;
|
|
}
|
|
}
|
|
|
|
1;
|