You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ngcp-panel/t/api-rest/api-events.t

1094 lines
47 KiB

#use Sipwise::Base;
use Net::Domain qw(hostfqdn);
use JSON qw();
use Test::More;
use Data::Dumper;
my $is_local_env = 0;
my $uri = $ENV{CATALYST_SERVER} || ('https://'.hostfqdn.':4443');
my ($ua, $req, $res);
use Test::Collection;
$ua = Test::Collection->new()->ua();
#$ua->add_handler("request_send", sub {
# my ($request, $ua, $h) = @_;
# print $request->method . ' ' . $request->uri . "\n" . ($request->content ? $request->content . "\n" : '') unless $request->header('authorization');
# return undef;
#});
#$ua->add_handler("response_done", sub {
# my ($response, $ua, $h) = @_;
# print $response->decoded_content . "\n" if $response->code != 401;
# return undef;
#});
my $t = time;
my $reseller_id = 1;
$req = HTTP::Request->new('POST', $uri.'/api/domains/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
domain => 'test' . $t . '.example.org',
reseller_id => $reseller_id,
}));
$res = $ua->request($req);
is($res->code, 201, "create test domain");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch created test domain");
my $domain = JSON::from_json($res->decoded_content);
$req = HTTP::Request->new('POST', $uri.'/api/billingprofiles/');
$req->header('Content-Type' => 'application/json');
$req->header('Prefer' => 'return=representation');
$req->content(JSON::to_json({
name => "test profile $t",
handle => "testprofile$t",
reseller_id => $reseller_id,
}));
$res = $ua->request($req);
is($res->code, 201, "create test billing profile");
my $billing_profile_id = $res->header('Location');
$billing_profile_id =~ s/^.+\/(\d+)$/$1/;
$req = HTTP::Request->new('POST', $uri.'/api/subscriberprofilesets/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
name => "subscriber_profile_1_set_".$t,
reseller_id => $reseller_id,
description => "subscriber_profile_1_set_description_".$t,
}));
$res = $ua->request($req);
is($res->code, 201, "POST test subscriberprofileset 1");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch POSTed test subscriberprofileset 1");
my $subscriberprofile1set = JSON::from_json($res->decoded_content);
$req = HTTP::Request->new('POST', $uri.'/api/subscriberprofilesets/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
name => "subscriber_profile_2_set_".$t,
reseller_id => $reseller_id,
description => "subscriber_profile_2_set_description_".$t,
}));
$res = $ua->request($req);
is($res->code, 201, "POST test subscriberprofileset 2");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch POSTed test subscriberprofileset 2");
my $subscriberprofile2set = JSON::from_json($res->decoded_content);
$req = HTTP::Request->new('POST', $uri.'/api/subscriberprofilesets/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
name => "subscriber_profile_3_set_".$t,
reseller_id => $reseller_id,
description => "subscriber_profile_3_set_description_".$t,
}));
$res = $ua->request($req);
is($res->code, 201, "POST test subscriberprofileset 3");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch POSTed test subscriberprofileset 3");
my $subscriberprofile3set = JSON::from_json($res->decoded_content);
$req = HTTP::Request->new('GET', $uri.'/api/subscriberpreferencedefs/');
$res = $ua->request($req);
is($res->code, 200, "fetch profilepreferencedefs");
my $subscriberpreferencedefs = JSON::from_json($res->decoded_content);
my @subscriber_profile_attributes = ();
foreach my $attr (keys %$subscriberpreferencedefs) {
push(@subscriber_profile_attributes,$attr);
}
$req = HTTP::Request->new('POST', $uri.'/api/subscriberprofiles/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
name => "subscriber_profile_1_".$t,
profile_set_id => $subscriberprofile1set->{id},
attributes => \@subscriber_profile_attributes,
description => "subscriber_profile_1_description_".$t,
}));
$res = $ua->request($req);
is($res->code, 201, "POST test subscriberprofile 1");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch POSTed test subscriberprofile 1");
my $subscriberprofile1 = JSON::from_json($res->decoded_content);
$req = HTTP::Request->new('POST', $uri.'/api/subscriberprofiles/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
name => "subscriber_profile_2_".$t,
profile_set_id => $subscriberprofile2set->{id},
attributes => \@subscriber_profile_attributes,
description => "subscriber_profile_2_description_".$t,
}));
$res = $ua->request($req);
is($res->code, 201, "POST test subscriberprofile 2");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch POSTed test subscriberprofile 2");
my $subscriberprofile2 = JSON::from_json($res->decoded_content);
$req = HTTP::Request->new('POST', $uri.'/api/subscriberprofiles/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
name => "subscriber_profile_3_".$t,
profile_set_id => $subscriberprofile3set->{id},
attributes => \@subscriber_profile_attributes,
description => "subscriber_profile_3_description_".$t,
}));
$res = $ua->request($req);
is($res->code, 201, "POST test subscriberprofile 3");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch POSTed test subscriberprofile 3");
my $subscriberprofile3 = JSON::from_json($res->decoded_content);
$req = HTTP::Request->new('POST', $uri.'/api/customercontacts/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
firstname => "cust_contact_first",
lastname => "cust_contact_last",
email => "cust_contact\@custcontact.invalid",
reseller_id => $reseller_id,
}));
$res = $ua->request($req);
is($res->code, 201, "create test customer contact");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch test customer contact");
my $custcontact = JSON::from_json($res->decoded_content);
my %subscriber_map = ();
my %customer_map = ();
goto SKIP;
{ #end_ivr:
my $customer = _create_customer(
type => "sipaccount",
);
my $cc = 800;
my $ac = '1'.(scalar keys %subscriber_map);
my $sn = $t;
my $subscriber = _create_subscriber($customer,
primary_number => { cc => $cc, ac => $ac, sn => $sn },
);
my $call_forwards = set_callforwards($subscriber,{ cfu => {
destinations => [
{ destination => "5678" },
{ destination => "autoattendant", },
],
}});
$call_forwards = set_callforwards($subscriber,{ cfu => {
destinations => [
{ destination => "5678" },
],
}});
_check_event_history("events generated using /api/callforwards: ",$subscriber->{id},"%ivr",[
{ subscriber_id => $subscriber->{id}, type => "start_ivr" },
{ subscriber_id => $subscriber->{id}, type => "end_ivr" },
]);
}
#SKIP:
{ #end_ivr:
my $customer = _create_customer(
type => "sipaccount",
);
my $cc = 800;
my $ac = '1'.(scalar keys %subscriber_map);
my $sn = $t;
my $aliases = [
{ cc => $cc, ac => $ac, sn => $sn.'0001' },
{ cc => $cc, ac => $ac, sn => $sn.'0002' },
];
my $subscriber = _create_subscriber($customer,
primary_number => { cc => $cc, ac => $ac, sn => $sn },
alias_numbers => $aliases,
);
my $call_forwards = set_callforwards($subscriber,{ cfu => {
destinations => [
{ destination => "5678" },
{ destination => "autoattendant", },
],
}});
$call_forwards = set_callforwards($subscriber,{ cfu => {
destinations => [
{ destination => "5678" },
],
}});
_check_event_history("multiple alaises - events generated using /api/callforwards: ",$subscriber->{id},"%ivr",[
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
]);
}
#$t = time;
#SKIP:
{ #end_ivr:
my $customer = _create_customer(
type => "sipaccount",
);
my $cc = 800;
my $ac = '2'.(scalar keys %subscriber_map);
my $sn = $t;
my $aliases = [
{ cc => $cc, ac => $ac, sn => $sn.'0001' },
{ cc => $cc, ac => $ac, sn => $sn.'0002' },
];
my $subscriber = _create_subscriber($customer,
primary_number => { cc => $cc, ac => $ac, sn => $sn },
alias_numbers => $aliases,
);
#my $subscriber = _create_subscriber($customer,
# primary_number => { cc => 888, ac => '2'.(scalar keys %subscriber_map), sn => $t },
# alias_numbers => $aliases,
# );
my $destinationset_1 = _create_cfdestinationset($subscriber,"dest1_$t",[{ destination => "1234",
timeout => '10',
priority => '1',
simple_destination => undef },{ destination => "autoattendant",
timeout => '10',
priority => '1',
simple_destination => undef }
]);
my $destinationset_2 = _create_cfdestinationset($subscriber,"dest2_$t",[{ destination => "1234",
timeout => '10',
priority => '1',
simple_destination => undef },{ destination => "autoattendant",
timeout => '10',
priority => '1',
simple_destination => undef }
]);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t);
my $timeset = _create_cftimeset($subscriber,[{ year => $year + 1900,
month => $mon + 1,
mday => $mday,
wday => $wday + 1,
hour => $hour,
minute => $min}]);
my $mappings = _create_cfmapping($subscriber,{
#cfb => [{ destinationset => $cfdestinationset->{name},
# timeset => $cftimeset->{name}}],
#cfna => [{ destinationset => $cfdestinationset->{name},
# timeset => $cftimeset->{name}}],
#cft => [{ destinationset => $cfdestinationset->{name},
# timeset => $cftimeset->{name}}],
cfb => [],
cfna => [],
cft => [{ destinationset => $destinationset_1->{name},
timeset => $timeset->{name}}],
cfu => [{ destinationset => $destinationset_2->{name},
timeset => $timeset->{name}}],
cfs => [],
cfr => [],
cfo => [],
});
#1. update destination set:
$destinationset_1 = _update_cfdestinationset($destinationset_1,[{ destination => "1234",
timeout => '10',
priority => '1',
simple_destination => undef },
]);
_check_event_history("multiple alaises - events generated by updating /api/cfdestinationsets: ",$subscriber->{id},"%ivr",[
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
]);
#2. update cfmappings:
$mappings = _update_cfmapping($subscriber,"cfu",[]);
_check_event_history("multiple alaises - events generated by updating /api/cfmappings: ",$subscriber->{id},"%ivr",[
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
]);
}
#SKIP:
{ #end_ivr:
my $customer = _create_customer(
type => "sipaccount",
);
my $cc = 800;
my $ac = '3'.(scalar keys %subscriber_map);
my $sn = $t;
my $aliases = [
{ cc => $cc, ac => $ac, sn => $sn.'0001' },
{ cc => $cc, ac => $ac, sn => $sn.'0002' },
];
my $subscriber = _create_subscriber($customer,
primary_number => { cc => $cc, ac => $ac, sn => $sn },
alias_numbers => $aliases,
);
my $call_forwards = set_callforwards($subscriber,{ cfu => {
destinations => [
{ destination => "5678" },
{ destination => "autoattendant", },
],
}});
_update_subscriber($subscriber, status => 'terminated');
_check_event_history("multiple alaises - events generated when terminating the subscriber: ",$subscriber->{id},"%ivr",[
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "start_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn} },
{ subscriber_id => $subscriber->{id}, type => "end_ivr", non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn} },
]);
}
#SKIP:
#cloudpbx = 0 only
#{ #pilot_primary_number, primary_number:
#
# my $customer = _create_customer(
# type => "pbxaccount",
# );
# my $cc = "888";
# my $pilot_ac = undef; #'3'.(scalar keys %subscriber_map);
# my $pilot_sn = $t.(scalar keys %subscriber_map);
# my $pilot_subscriber = _create_subscriber($customer,
# primary_number => { cc => $cc, ac => $pilot_ac, sn => $pilot_sn },
# is_pbx_pilot => JSON::true,
# profile_id => $subscriberprofile1->{id},
# profile_set_id => $subscriberprofile1set->{id},
# );
# my $ac = undef; #'3'.(scalar keys %subscriber_map);
# my $sn = ($t+1).(scalar keys %subscriber_map);
# my $subscriber = _create_subscriber($customer,
# primary_number => { cc => $cc, ac => $ac, sn => $sn },
# profile_id => $subscriberprofile1->{id},
# profile_set_id => $subscriberprofile1set->{id},
# );
# #_update_subscriber($subscriber,
# _check_event_history("start_profile when creating a pbx pilot subscriber: ",$pilot_subscriber->{id},"start_profile",[
# { subscriber_id => $pilot_subscriber->{id}, type => "start_profile",
# subscriber_profile_id => $subscriberprofile1->{id}, subscriber_profile_name => $subscriberprofile1->{name},
# subscriber_profile_set_id => $subscriberprofile1set->{id}, subscriber_profile_set_name => $subscriberprofile1set->{name},
# primary_number_cc => $cc, primary_number_ac => $pilot_ac, primary_number_sn => $pilot_sn,
# pilot_subscriber_id => $pilot_subscriber->{id},
# pilot_subscriber_profile_id => $subscriberprofile1->{id}, pilot_subscriber_profile_name => $subscriberprofile1->{name},
# pilot_subscriber_profile_set_id => $subscriberprofile1set->{id}, pilot_subscriber_profile_set_name => $subscriberprofile1set->{name},
# pilot_primary_number_cc => $cc, pilot_primary_number_ac => $pilot_ac, pilot_primary_number_sn => $pilot_sn,
# },
# ]);
# _check_event_history("start_profile when creating a pbx subscriber: ",$subscriber->{id},"start_profile",[
# { subscriber_id => $subscriber->{id}, type => "start_profile",
# subscriber_profile_id => $subscriberprofile1->{id}, subscriber_profile_name => $subscriberprofile1->{name},
# subscriber_profile_set_id => $subscriberprofile1set->{id}, subscriber_profile_set_name => $subscriberprofile1set->{name},
# primary_number_cc => $cc, primary_number_ac => $ac, primary_number_sn => $sn,
# pilot_subscriber_id => $pilot_subscriber->{id},
# pilot_subscriber_profile_id => $subscriberprofile1->{id}, pilot_subscriber_profile_name => $subscriberprofile1->{name},
# pilot_subscriber_profile_set_id => $subscriberprofile1set->{id}, pilot_subscriber_profile_set_name => $subscriberprofile1set->{name},
# pilot_primary_number_cc => $cc, pilot_primary_number_ac => $pilot_ac, pilot_primary_number_sn => $pilot_sn,
# },
# ]);
#
#}
SKIP:
{ #pilot_primary_number, primary_number, pilot_first_non_primary_alias, susbcriber_first_non_primary_alias:
my $customer = _create_customer(
type => "pbxaccount",
);
my $cc = "888";
my $ac = 5; #'3'.(scalar keys %subscriber_map);
my $sn = $t.(scalar keys %subscriber_map);
my $pilot_aliases = [
{ cc => $cc, ac => $ac, sn => $sn.'0001' },
{ cc => $cc, ac => $ac, sn => $sn.'0002' },
#{ cc => $cc, ac => $ac, sn => $sn.'0003' },
#{ cc => $cc, ac => $ac, sn => $sn.'0004' },
#{ cc => $cc, ac => $ac, sn => $sn.'0005' },
];
my $pilot_subscriber = _create_subscriber($customer,
primary_number => { cc => $cc, ac => $ac, sn => $sn },
alias_numbers => $pilot_aliases,
profile_id => $subscriberprofile1->{id},
profile_set_id => $subscriberprofile1set->{id},
is_pbx_pilot => JSON::true,
);
my $ext = '1';
my $aliases = [
{ cc => $cc, ac => $ac, sn => $sn.'0003' },
{ cc => $cc, ac => $ac, sn => $sn.'0004' },
#{ cc => $cc, ac => $ac, sn => $sn.'0006' },
];
#make sure cloudpbx = 1
my $subscriber = _create_subscriber($customer,
pbx_extension => $ext,
alias_numbers => $aliases,
profile_id => $subscriberprofile1->{id},
profile_set_id => $subscriberprofile1set->{id},
);
#_update_subscriber($subscriber,
my %pilot_event = (
subscriber_id => $pilot_subscriber->{id},
subscriber_profile_id => $subscriberprofile1->{id}, subscriber_profile_name => $subscriberprofile1->{name},
subscriber_profile_set_id => $subscriberprofile1set->{id}, subscriber_profile_set_name => $subscriberprofile1set->{name},
primary_number_cc => $cc, primary_number_ac => $ac, primary_number_sn => $sn,
pilot_subscriber_id => $pilot_subscriber->{id},
pilot_subscriber_profile_id => $subscriberprofile1->{id}, pilot_subscriber_profile_name => $subscriberprofile1->{name},
pilot_subscriber_profile_set_id => $subscriberprofile1set->{id}, pilot_subscriber_profile_set_name => $subscriberprofile1set->{name},
pilot_primary_number_cc => $cc, pilot_primary_number_ac => $ac, pilot_primary_number_sn => $sn,
first_non_primary_alias_username_before => undef,
first_non_primary_alias_username_after => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
pilot_first_non_primary_alias_username_before => undef,
pilot_first_non_primary_alias_username_after => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
primary_alias_username_before => $cc.$ac.$sn,
primary_alias_username_after => $cc.$ac.$sn,
pilot_primary_alias_username_before => $cc.$ac.$sn,
pilot_primary_alias_username_after => $cc.$ac.$sn,
);
_check_event_history("start_profile when creating a pbx pilot subscriber w alias: ",$pilot_subscriber->{id},"%profile",[
{ %pilot_event, ## no critic (ProhibitCommaSeparatedStatements)
type => "start_profile",
old_status => '',
new_status => $subscriberprofile1->{id},
non_primary_alias_username => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
},
{ %pilot_event,
type => "start_profile",
old_status => '',
new_status => $subscriberprofile1->{id},
non_primary_alias_username => $pilot_aliases->[1]->{cc}.$pilot_aliases->[1]->{ac}.$pilot_aliases->[1]->{sn},
},
#{ %pilot_event,
# type => "start_profile",
# non_primary_alias_username => $pilot_aliases->[2]->{cc}.$pilot_aliases->[2]->{ac}.$pilot_aliases->[2]->{sn},
#},
]);
my %subscriber_event = (
subscriber_id => $subscriber->{id},
subscriber_profile_id => $subscriberprofile1->{id}, subscriber_profile_name => $subscriberprofile1->{name},
subscriber_profile_set_id => $subscriberprofile1set->{id}, subscriber_profile_set_name => $subscriberprofile1set->{name},
primary_number_cc => $cc, primary_number_ac => $ac, primary_number_sn => $sn.$ext,
pilot_subscriber_id => $pilot_subscriber->{id},
pilot_subscriber_profile_id => $subscriberprofile1->{id}, pilot_subscriber_profile_name => $subscriberprofile1->{name},
pilot_subscriber_profile_set_id => $subscriberprofile1set->{id}, pilot_subscriber_profile_set_name => $subscriberprofile1set->{name},
pilot_primary_number_cc => $cc, pilot_primary_number_ac => $ac, pilot_primary_number_sn => $sn,
first_non_primary_alias_username_before => undef,
first_non_primary_alias_username_after => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn},
pilot_first_non_primary_alias_username_before => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
pilot_first_non_primary_alias_username_after => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
primary_alias_username_before => $cc.$ac.$sn.$ext,
primary_alias_username_after => $cc.$ac.$sn.$ext,
pilot_primary_alias_username_before => $cc.$ac.$sn,
pilot_primary_alias_username_after => $cc.$ac.$sn,
);
_check_event_history("start_profile when creating a pbx extension subscriber w alias: ",$subscriber->{id},"%profile",[
{ %subscriber_event, ## no critic (ProhibitCommaSeparatedStatements)
type => "start_profile",
old_status => '',
new_status => $subscriberprofile1->{id},
non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn},
},
{ %subscriber_event,
type => "start_profile",
old_status => '',
new_status => $subscriberprofile1->{id},
non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn},
},
]);
my $new_aliases = [
{ cc => $cc, ac => $ac, sn => $sn.'0004' },
{ cc => $cc, ac => $ac, sn => $sn.'0005' },
];
_update_subscriber($subscriber,
alias_numbers => $new_aliases,
profile_id => $subscriberprofile2->{id},
profile_set_id => $subscriberprofile2set->{id},
);
%subscriber_event = (
subscriber_id => $subscriber->{id},
subscriber_profile_id => $subscriberprofile2->{id}, subscriber_profile_name => $subscriberprofile2->{name},
subscriber_profile_set_id => $subscriberprofile2set->{id}, subscriber_profile_set_name => $subscriberprofile2set->{name},
primary_number_cc => $cc, primary_number_ac => $ac, primary_number_sn => $sn.$ext,
pilot_subscriber_id => $pilot_subscriber->{id},
pilot_subscriber_profile_id => $subscriberprofile1->{id}, pilot_subscriber_profile_name => $subscriberprofile1->{name},
pilot_subscriber_profile_set_id => $subscriberprofile1set->{id}, pilot_subscriber_profile_set_name => $subscriberprofile1set->{name},
pilot_primary_number_cc => $cc, pilot_primary_number_ac => $ac, pilot_primary_number_sn => $sn,
first_non_primary_alias_username_before => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn},
first_non_primary_alias_username_after => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
pilot_first_non_primary_alias_username_before => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
pilot_first_non_primary_alias_username_after => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
primary_alias_username_before => $cc.$ac.$sn.$ext,
primary_alias_username_after => $cc.$ac.$sn.$ext,
pilot_primary_alias_username_before => $cc.$ac.$sn,
pilot_primary_alias_username_after => $cc.$ac.$sn,
);
_check_event_history("start/update/end_profile when updating a pbx extension subscriber w alias: ",$subscriber->{id},"%profile",[
{},{},
{ %subscriber_event,
type => "update_profile",
old_status => $subscriberprofile1->{id},
new_status => $subscriberprofile2->{id},
non_primary_alias_username => $aliases->[1]->{cc}.$aliases->[1]->{ac}.$aliases->[1]->{sn},
},
{ %subscriber_event,
type => "start_profile",
old_status => '',
new_status => $subscriberprofile2->{id},
non_primary_alias_username => $new_aliases->[1]->{cc}.$new_aliases->[1]->{ac}.$new_aliases->[1]->{sn},
},
{ %subscriber_event,
type => "end_profile",
old_status => $subscriberprofile1->{id},
new_status => '',
non_primary_alias_username => $aliases->[0]->{cc}.$aliases->[0]->{ac}.$aliases->[0]->{sn},
},
]);
my $new_pilot_aliases = [
{ cc => $cc, ac => $ac, sn => $sn.'0002' },
{ cc => $cc, ac => $ac, sn => $sn.'0003' },
];
_update_subscriber($pilot_subscriber,
alias_numbers => $new_pilot_aliases,
profile_id => $subscriberprofile3->{id},
profile_set_id => $subscriberprofile3set->{id},
);
%pilot_event = (
subscriber_id => $pilot_subscriber->{id},
subscriber_profile_id => $subscriberprofile3->{id}, subscriber_profile_name => $subscriberprofile3->{name},
subscriber_profile_set_id => $subscriberprofile3set->{id}, subscriber_profile_set_name => $subscriberprofile3set->{name},
primary_number_cc => $cc, primary_number_ac => $ac, primary_number_sn => $sn,
pilot_subscriber_id => $pilot_subscriber->{id},
pilot_subscriber_profile_id => $subscriberprofile3->{id}, pilot_subscriber_profile_name => $subscriberprofile3->{name},
pilot_subscriber_profile_set_id => $subscriberprofile3set->{id}, pilot_subscriber_profile_set_name => $subscriberprofile3set->{name},
pilot_primary_number_cc => $cc, pilot_primary_number_ac => $ac, pilot_primary_number_sn => $sn,
first_non_primary_alias_username_before => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
first_non_primary_alias_username_after => $new_pilot_aliases->[0]->{cc}.$new_pilot_aliases->[0]->{ac}.$new_pilot_aliases->[0]->{sn},
pilot_first_non_primary_alias_username_before => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
pilot_first_non_primary_alias_username_after => $new_pilot_aliases->[0]->{cc}.$new_pilot_aliases->[0]->{ac}.$new_pilot_aliases->[0]->{sn},
primary_alias_username_before => $cc.$ac.$sn,
primary_alias_username_after => $cc.$ac.$sn,
pilot_primary_alias_username_before => $cc.$ac.$sn,
pilot_primary_alias_username_after => $cc.$ac.$sn,
);
_check_event_history("start/update/end_profile when updating a pbx pilot subscriber w alias: ",$pilot_subscriber->{id},"%profile",[
{},{},
{ %pilot_event,
type => "update_profile",
old_status => $subscriberprofile1->{id},
new_status => $subscriberprofile3->{id},
non_primary_alias_username => $pilot_aliases->[1]->{cc}.$pilot_aliases->[1]->{ac}.$pilot_aliases->[1]->{sn},
},
{ %pilot_event,
type => "start_profile",
old_status => '',
new_status => $subscriberprofile3->{id},
non_primary_alias_username => $new_pilot_aliases->[1]->{cc}.$new_pilot_aliases->[1]->{ac}.$new_pilot_aliases->[1]->{sn},
},
{ %pilot_event,
type => "end_profile",
old_status => $subscriberprofile1->{id},
new_status => '',
non_primary_alias_username => $pilot_aliases->[0]->{cc}.$pilot_aliases->[0]->{ac}.$pilot_aliases->[0]->{sn},
},
]);
_update_subscriber($subscriber, status => 'terminated');
%subscriber_event = (
subscriber_id => $subscriber->{id},
subscriber_profile_id => $subscriberprofile2->{id}, subscriber_profile_name => $subscriberprofile2->{name},
subscriber_profile_set_id => $subscriberprofile2set->{id}, subscriber_profile_set_name => $subscriberprofile2set->{name},
primary_number_cc => $cc, primary_number_ac => $ac, primary_number_sn => $sn.$ext,
pilot_subscriber_id => $pilot_subscriber->{id},
pilot_subscriber_profile_id => $subscriberprofile3->{id}, pilot_subscriber_profile_name => $subscriberprofile3->{name},
pilot_subscriber_profile_set_id => $subscriberprofile3set->{id}, pilot_subscriber_profile_set_name => $subscriberprofile3set->{name},
pilot_primary_number_cc => $cc, pilot_primary_number_ac => $ac, pilot_primary_number_sn => $sn,
first_non_primary_alias_username_before => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
first_non_primary_alias_username_after => undef,
pilot_first_non_primary_alias_username_before => $new_pilot_aliases->[0]->{cc}.$new_pilot_aliases->[0]->{ac}.$new_pilot_aliases->[0]->{sn},
#would be this:
pilot_first_non_primary_alias_username_after => $new_pilot_aliases->[0]->{cc}.$new_pilot_aliases->[0]->{ac}.$new_pilot_aliases->[0]->{sn},
#but since api termination always returns aliases to the pilot:
#pilot_first_non_primary_alias_username_after => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
#pilot_first_non_primary_alias_username_after => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
primary_alias_username_before => $cc.$ac.$sn.$ext,
primary_alias_username_after => $cc.$ac.$sn.$ext,
pilot_primary_alias_username_before => $cc.$ac.$sn,
pilot_primary_alias_username_after => $cc.$ac.$sn,
);
#_check_event_history("end_profile when terminating a pbx extension subscriber w alias: ",$subscriber->{id},"%profile",[
# {},{},{},{},{},
# { %subscriber_event,
#
# type => "update_profile",
# old_status => $subscriberprofile2->{id},
# new_status => $subscriberprofile3->{id},
#
# non_primary_alias_username => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
# },
# { %subscriber_event,
#
# type => "update_profile",
# old_status => $subscriberprofile2->{id},
# new_status => $subscriberprofile3->{id},
#
# non_primary_alias_username => $new_aliases->[1]->{cc}.$new_aliases->[1]->{ac}.$new_aliases->[1]->{sn},
# },
#]);
_check_event_history("end_profile when terminating a pbx extension subscriber w alias: ",$subscriber->{id},"%profile",[
{},{},{},{},{},
{ %subscriber_event,
type => "end_profile",
old_status => $subscriberprofile2->{id},
new_status => '',
non_primary_alias_username => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
},
{ %subscriber_event,
type => "start_profile",
old_status => '',
new_status => $subscriberprofile3->{id},
non_primary_alias_username => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
},
{ %subscriber_event,
type => "end_profile",
old_status => $subscriberprofile2->{id},
new_status => '',
non_primary_alias_username => $new_aliases->[1]->{cc}.$new_aliases->[1]->{ac}.$new_aliases->[1]->{sn},
},
{ %subscriber_event,
type => "start_profile",
old_status => '',
new_status => $subscriberprofile3->{id},
non_primary_alias_username => $new_aliases->[1]->{cc}.$new_aliases->[1]->{ac}.$new_aliases->[1]->{sn},
},
]);
_update_subscriber($pilot_subscriber, status => 'terminated');
%pilot_event = (
subscriber_id => $pilot_subscriber->{id},
subscriber_profile_id => $subscriberprofile3->{id}, subscriber_profile_name => $subscriberprofile3->{name},
subscriber_profile_set_id => $subscriberprofile3set->{id}, subscriber_profile_set_name => $subscriberprofile3set->{name},
primary_number_cc => $cc, primary_number_ac => $ac, primary_number_sn => $sn,
pilot_subscriber_id => $pilot_subscriber->{id},
pilot_subscriber_profile_id => $subscriberprofile3->{id}, pilot_subscriber_profile_name => $subscriberprofile3->{name},
pilot_subscriber_profile_set_id => $subscriberprofile3set->{id}, pilot_subscriber_profile_set_name => $subscriberprofile3set->{name},
pilot_primary_number_cc => $cc, pilot_primary_number_ac => $ac, pilot_primary_number_sn => $sn,
#would be this:
#$new_pilot_aliases->[0]->{cc}.$new_pilot_aliases->[0]->{ac}.$new_pilot_aliases->[0]->{sn},
#but since api termination always returns aliases to the pilot:
#first_non_primary_alias_username_before => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
pilot_first_non_primary_alias_username_after => $new_pilot_aliases->[0]->{cc}.$new_pilot_aliases->[0]->{ac}.$new_pilot_aliases->[0]->{sn},
first_non_primary_alias_username_after => undef,
#pilot_first_non_primary_alias_username_before => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
pilot_first_non_primary_alias_username_after => $new_pilot_aliases->[0]->{cc}.$new_pilot_aliases->[0]->{ac}.$new_pilot_aliases->[0]->{sn},
pilot_first_non_primary_alias_username_after => undef,
primary_alias_username_before => $cc.$ac.$sn,
primary_alias_username_after => $cc.$ac.$sn,
pilot_primary_alias_username_before => $cc.$ac.$sn,
pilot_primary_alias_username_after => $cc.$ac.$sn,
);
_check_event_history("end_profile when terminating a pbx pilot subscriber w alias: ",$pilot_subscriber->{id},"%profile",[
{},{},{},{},{},
#aliases ordered by id, so by the order they were created:
#id=2:0002
#id=6:0003
#--
#id=4:0004
#id=5:0005
#-->
#id=2:0002
#id=4:0004
#id=5:0005
#id=6:0003
{ %pilot_event,
type => "end_profile",
old_status => $subscriberprofile3->{id},
new_status => '',
non_primary_alias_username => $new_pilot_aliases->[0]->{cc}.$new_pilot_aliases->[0]->{ac}.$new_pilot_aliases->[0]->{sn},
},
{ %pilot_event,
type => "end_profile",
old_status => $subscriberprofile3->{id},
new_status => '',
non_primary_alias_username => $new_aliases->[0]->{cc}.$new_aliases->[0]->{ac}.$new_aliases->[0]->{sn},
},
{ %pilot_event,
type => "end_profile",
old_status => $subscriberprofile3->{id},
new_status => '',
non_primary_alias_username => $new_aliases->[1]->{cc}.$new_aliases->[1]->{ac}.$new_aliases->[1]->{sn},
},
{ %pilot_event,
type => "end_profile",
old_status => $subscriberprofile3->{id},
new_status => '',
non_primary_alias_username => $new_pilot_aliases->[1]->{cc}.$new_pilot_aliases->[1]->{ac}.$new_pilot_aliases->[1]->{sn},
},
]);
}
sub _create_cfmapping {
my ($subscriber,$mappings) = @_;
my $cfmapping_uri = $uri.'/api/cfmappings/'.$subscriber->{id};
$req = HTTP::Request->new('PUT', $cfmapping_uri); #$customer->{id});
$req->header('Content-Type' => 'application/json');
$req->header('Prefer' => 'return=representation');
$req->content(JSON::to_json($mappings));
$res = $ua->request($req);
is($res->code, 200, "create test cfmappings");
$req = HTTP::Request->new('GET', $cfmapping_uri); # . '?page=1&rows=' . (scalar keys %$put_data));
$res = $ua->request($req);
is($res->code, 200, "fetch test cfmappings");
return JSON::from_json($res->decoded_content);
}
sub _update_cfmapping {
my ($subscriber,$cf_type,$mapping) = @_;
my $cfmapping_uri = $uri.'/api/cfmappings/'.$subscriber->{id};
$req = HTTP::Request->new('PATCH', $cfmapping_uri);
$req->header('Content-Type' => 'application/json-patch+json');
$req->header('Prefer' => 'return=representation');
$req->content(JSON::to_json(
[ { op => 'replace', path => '/'.$cf_type, value => $mapping } ]
));
$res = $ua->request($req);
is($res->code, 200, "update test cfmappings");
$req = HTTP::Request->new('GET', $cfmapping_uri);
$res = $ua->request($req);
is($res->code, 200, "fetch updated test cfmappings");
return JSON::from_json($res->decoded_content);
}
sub _create_cftimeset {
my ($subscriber,$times) = @_;
$req = HTTP::Request->new('POST', $uri.'/api/cftimesets/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
name => "cf_time_set_".$t,
subscriber_id => $subscriber->{id},
times => $times,
}));
$res = $ua->request($req);
is($res->code, 201, "create test cftimeset");
my $cftimeset_uri = $uri.'/'.$res->header('Location');
$req = HTTP::Request->new('GET', $cftimeset_uri);
$res = $ua->request($req);
is($res->code, 200, "fetch created test cftimeset");
return JSON::from_json($res->decoded_content);
}
sub _create_cfdestinationset {
my ($subscriber,$name,$destinations) = @_;
$req = HTTP::Request->new('POST', $uri.'/api/cfdestinationsets/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
name => $name,
subscriber_id => $subscriber->{id},
destinations => $destinations,
}));
$res = $ua->request($req);
is($res->code, 201, "create test cfdestinationset");
my $cfdestinationset_uri = $uri.'/'.$res->header('Location');
$req = HTTP::Request->new('GET', $cfdestinationset_uri);
$res = $ua->request($req);
is($res->code, 200, "fetch created test cfdestinationset");
return JSON::from_json($res->decoded_content);
}
sub _update_cfdestinationset {
my ($destinationset,$destinations) = @_;
my $cfdestinationset_uri = $uri.'/api/cfdestinationsets/'.$destinationset->{id};
$req = HTTP::Request->new('PATCH', $cfdestinationset_uri);
$req->header('Content-Type' => 'application/json-patch+json');
$req->header('Prefer' => 'return=representation');
$req->content(JSON::to_json(
[ { op => 'replace', path => '/destinations', value => $destinations } ]
));
$res = $ua->request($req);
is($res->code, 200, "update test cfdestinationset");
$req = HTTP::Request->new('GET', $cfdestinationset_uri);
$res = $ua->request($req);
is($res->code, 200, "fetch updated test cfdestinationset");
return JSON::from_json($res->decoded_content);
}
sub set_callforwards {
my ($subscriber,$call_forwards) = @_;
my $callforward_uri = $uri.'/api/callforwards/'.$subscriber->{id};
$req = HTTP::Request->new('PUT', $callforward_uri); #$customer->{id});
$req->header('Content-Type' => 'application/json');
$req->header('Prefer' => 'return=representation');
$req->content(JSON::to_json($call_forwards));
$res = $ua->request($req);
is($res->code, 200, "set test callforwards");
$req = HTTP::Request->new('GET', $callforward_uri); # . '?page=1&rows=' . (scalar keys %$put_data));
$res = $ua->request($req);
is($res->code, 200, "fetch test callforwards");
return JSON::from_json($res->decoded_content);
}
sub _get_subscriber {
my ($subscriber) = @_;
$req = HTTP::Request->new('GET', $uri.'/api/subscribers/'.$subscriber->{id});
$res = $ua->request($req);
is($res->code, 200, "fetch test subscriber");
$subscriber = JSON::from_json($res->decoded_content);
$subscriber_map{$subscriber->{id}} = $subscriber;
return $subscriber;
}
sub _create_subscriber {
my ($customer,@further_opts) = @_;
$req = HTTP::Request->new('POST', $uri.'/api/subscribers/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
domain_id => $domain->{id},
username => 'subscriber_' . (scalar keys %subscriber_map) . '_'.$t,
password => 'subscriber_password',
customer_id => $customer->{id},
#status => "active",
@further_opts,
}));
$res = $ua->request($req);
is($res->code, 201, "create test subscriber");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch test subscriber");
my $subscriber = JSON::from_json($res->decoded_content);
$subscriber_map{$subscriber->{id}} = $subscriber;
return $subscriber;
}
sub _update_subscriber {
my ($subscriber,@further_opts) = @_;
$req = HTTP::Request->new('PUT', $uri.'/api/subscribers/'.$subscriber->{id});
$req->header('Content-Type' => 'application/json');
$req->header('Prefer' => 'return=representation');
$req->content(JSON::to_json({
%$subscriber, ## no critic (ProhibitCommaSeparatedStatements)
@further_opts,
}));
$res = $ua->request($req);
is($res->code, 200, "update test subscriber");
$subscriber = JSON::from_json($res->decoded_content);
$subscriber_map{$subscriber->{id}} = $subscriber;
return $subscriber;
}
sub _create_customer {
my (@further_opts) = @_;
$req = HTTP::Request->new('POST', $uri.'/api/customers/');
$req->header('Content-Type' => 'application/json');
$req->content(JSON::to_json({
status => "active",
contact_id => $custcontact->{id},
type => "sipaccount",
billing_profile_id => $billing_profile_id,
max_subscribers => undef,
external_id => undef,
#status => "active",
@further_opts,
}));
$res = $ua->request($req);
is($res->code, 201, "create test customer");
$req = HTTP::Request->new('GET', $uri.'/'.$res->header('Location'));
$res = $ua->request($req);
is($res->code, 200, "fetch test customer");
my $customer = JSON::from_json($res->decoded_content);
$customer_map{$customer->{id}} = $customer;
return $customer;
}
sub _check_event_history {
my ($label,$subscriber_id,$type,$expected_events) = @_;
if (defined $subscriber_id) {
$subscriber_id = '&subscriber_id=' . $subscriber_id;
} else {
$subscriber_id = '';
}
if (defined $type) {
$type = '&type=' . $type;
} else {
$type = '';
}
my $total_count = (scalar @$expected_events);
my $i = 0;
my $ok = 1;
my @events = ();
my @requests = ();
my $last_request;
$last_request = _req_to_debug($req) if $req;
my $nexturi = $uri.'/api/events/?page=1&rows=10&order_by_direction=asc&order_by=id'.$subscriber_id.$type;
do {
$req = HTTP::Request->new('GET',$nexturi);
$res = $ua->request($req);
is($res->code, 200, $label . "fetch events collection page");
push(@requests,_req_to_debug($req));
my $collection = JSON::from_json($res->decoded_content);
my $selfuri = $uri . $collection->{_links}->{self}->{href};
my $colluri = URI->new($selfuri);
$ok = ok($collection->{total_count} == $total_count, $label . "check 'total_count' of collection") && $ok;
if($collection->{_links}->{next}->{href}) {
$nexturi = $uri . $collection->{_links}->{next}->{href};
} else {
$nexturi = undef;
}
$collection->{_embedded}->{'ngcp:events'} = [
$collection->{_embedded}->{'ngcp:events'}
] if "HASH" eq ref $collection->{_embedded}->{'ngcp:events'};
my $page_items = {};
foreach my $event (@{ $collection->{_embedded}->{'ngcp:events'} }) {
$ok = _compare_event($event,$expected_events->[$i],$label) && $ok;
delete $event->{'_links'};
push(@events,$event);
$i++
}
} while($nexturi);
ok($i == $total_count,$label . "check if all expected items are listed");
diag(Dumper({last_request => $last_request, collection_requests => \@requests, result => \@events})) if !$ok;
}
sub _compare_event {
my ($got,$expected,$label) = @_;
my $ok = 1;
foreach my $field (keys %$expected) {
$ok = is($got->{$field},$expected->{$field},$label . "check event " . ($got->{$field} // '') . " $field") && $ok;
}
return $ok;
}
sub _req_to_debug {
my $request = shift;
return { request => $request->method . " " . $request->uri,
headers => $request->headers };
}
sub _get_query_string {
my ($filters) = @_;
my $query = '';
foreach my $param (keys %$filters) {
if (length($query) == 0) {
$query .= '?';
} else {
$query .= '&';
}
$query .= $param . '=' . $filters->{$param};
}
return $query;
};
done_testing;