[Bps-public-commit] rt-extension-rest2 06/07: Test ticket saved searches

sunnavy sunnavy at bestpractical.com
Wed Jul 14 10:05:53 EDT 2021


This is an automated email from the git hooks/post-receive script.

sunnavy pushed a commit to branch saved-searches
in repository rt-extension-rest2.

commit e4442b52ddd28808f631c2e236b6eaee4ab11c6b
Author: sunnavy <sunnavy at bestpractical.com>
AuthorDate: Fri May 28 03:03:26 2021 +0800

    Test ticket saved searches
---
 xt/searches.t | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 215 insertions(+)

diff --git a/xt/searches.t b/xt/searches.t
new file mode 100644
index 0000000..8f3fa7f
--- /dev/null
+++ b/xt/searches.t
@@ -0,0 +1,215 @@
+use strict;
+use warnings;
+use RT::Extension::REST2::Test tests => undef;
+
+my $mech           = RT::Extension::REST2::Test->mech;
+my $auth           = RT::Extension::REST2::Test->authorization_header;
+my $rest_base_path = '/REST/2.0';
+my $user           = RT::Extension::REST2::Test->user;
+
+$user->PrincipalObj->GrantRight( Right => 'ModifySelf' );
+
+my $custom_role = RT::CustomRole->new( RT->SystemUser );
+my ( $ret, $msg ) = $custom_role->Create(
+    Name      => 'Manager',
+    MaxValues => 0,
+);
+ok( $ret, "created custom role: $msg" );
+
+( $ret, $msg ) = $custom_role->AddToObject(1);
+ok( $ret, "added custom role to queue: $msg" );
+my $custom_role_type = $custom_role->GroupType;
+
+my $cf = RT::CustomField->new( RT->SystemUser );
+( $ret, $msg ) = $cf->Create( Name => 'Boss', Type => 'Freeform', LookupType => RT::User->CustomFieldLookupType );
+ok( $ret, "created custom field: $msg" );
+ok( $cf->AddToObject( RT::User->new( RT->SystemUser ) ) );
+
+ok( $user->SetCountry('US') );
+ok( $user->AddCustomFieldValue( Field => $cf, Value => 'root' ) );
+
+my $search1 = RT::SavedSearch->new($user);
+( $ret, $msg ) = $search1->Save(
+    Privacy      => 'RT::User-' . $user->Id,
+    Type         => 'Ticket',
+    Name         => 'My tickets',
+    SearchParams => {
+        RowsPerPage => 50,
+        'Format'    => join( ',',
+            RT->Config->Get('DefaultSearchResultFormat'), '__Requestors.Country__',
+            '__CustomRole.{Manager}.CustomField.{Boss}__' ),
+        'Query' => "Owner = '" . $user->Name . "'",
+    },
+);
+
+ok( $ret, "created $msg" );
+
+my $search2 = RT::SavedSearch->new( RT->SystemUser );
+( $ret, $msg ) = $search2->Save(
+    Privacy      => 'RT::System-1',
+    Type         => 'Ticket',
+    Name         => 'Recently created tickets',
+    SearchParams => {
+        'Format' => RT->Config->Get('DefaultSearchResultFormat'),
+        'Query'  => "Created >= 'yesterday'",
+    },
+);
+
+ok( $ret, "created $msg" );
+
+{
+    my $res = $mech->get( "$rest_base_path/searches", 'Authorization' => $auth, );
+    is( $res->code, 200, 'got /searches' );
+
+    my $content = $mech->json_response;
+    is( $content->{count},             4,  '4 searches' );
+    is( $content->{page},              1,  '1 page' );
+    is( $content->{per_page},          20, '20 per_page' );
+    is( $content->{total},             4,  '4 total' );
+    is( scalar @{ $content->{items} }, 4,  'items count' );
+
+    for my $item ( @{ $content->{items} } ) {
+        ok( $item->{id}, 'search id' );
+        is( $item->{type}, 'search', 'search type' );
+        like( $item->{_url}, qr{$rest_base_path/search/$item->{id}}, 'search url' );
+    }
+
+    is( $content->{items}[-1]{id}, $search1->Id, 'search id' );
+}
+
+{
+    my $res = $mech->get( "$rest_base_path/search/" . $search2->Id, 'Authorization' => $auth, );
+    is( $res->code, 404, 'can not see system search without permission' );
+}
+
+$user->PrincipalObj->GrantRight( Right => 'SuperUser' );
+
+{
+    my $res = $mech->get( "$rest_base_path/search/" . $search2->Id, 'Authorization' => $auth, );
+    is( $res->code, 200, 'can see system search with permission' );
+}
+
+{
+    my $res = $mech->get( "$rest_base_path/searches", 'Authorization' => $auth, );
+    is( $res->code, 200, 'got /searches' );
+
+    my $content = $mech->json_response;
+    is( $content->{count},             5,  '5 searches' );
+    is( $content->{page},              1,  '1 page' );
+    is( $content->{per_page},          20, '20 per_page' );
+    is( $content->{total},             5,  '5 total' );
+    is( scalar @{ $content->{items} }, 5,  'items count' );
+
+    for my $item ( @{ $content->{items} } ) {
+        ok( $item->{id}, 'search id' );
+        is( $item->{type}, 'search', 'search type' );
+        like( $item->{_url}, qr{$rest_base_path/search/$item->{id}}, 'search url' );
+    }
+
+    is( $content->{items}[3]{id}, $search1->Id, 'search id' );
+    is( $content->{items}[4]{id}, $search2->Id, 'search id' );
+}
+
+{
+    my $res = $mech->post_json(
+        "$rest_base_path/searches",
+        [ { field => 'Description', value => 'My tickets' } ],
+        'Authorization' => $auth,
+    );
+    is( $res->code, 200, "got $rest_base_path/searches" );
+
+    my $content = $mech->json_response;
+    is( $content->{count},             1,  '1 search' );
+    is( $content->{page},              1,  '1 page' );
+    is( $content->{per_page},          20, '20 per_page' );
+    is( $content->{total},             1,  '1 total' );
+    is( scalar @{ $content->{items} }, 1,  'items count' );
+
+    is( $content->{items}[0]{id}, $search1->Id, 'search id' );
+}
+
+# Single search
+{
+    my $res = $mech->get( "$rest_base_path/search/" . $search1->Id, 'Authorization' => $auth, );
+    is( $res->code, 200, "got $rest_base_path/search/" . $search1->Id );
+
+    my $content = $mech->json_response;
+    is( $content->{id},          $search1->id,  'id' );
+    is( $content->{Name},        'SavedSearch', 'Name' );
+    is( $content->{Description}, 'My tickets',  'Description' );
+
+    my $links = $content->{_hyperlinks};
+    is( scalar @$links, 2, 'links count' );
+
+    is( $links->[0]{ref},  'self',       'self link ref' );
+    is( $links->[0]{id},   $search1->Id, 'self link id' );
+    is( $links->[0]{type}, 'search',     'self link type' );
+    like( $links->[0]{_url}, qr[$rest_base_path/search/$links->[0]{id}$], 'self link url' );
+
+    is( $links->[1]{ref},  'tickets', 'results link ref' );
+    is( $links->[1]{type}, 'results', 'results link type' );
+    like( $links->[1]{_url}, qr[$rest_base_path/tickets\?search=$content->{id}$], 'results link url' );
+
+    $res = $mech->get( "$rest_base_path/search/My tickets", 'Authorization' => $auth, );
+    is( $res->code, 200, "got $rest_base_path/search/" . $search1->Id );
+    is_deeply( $content, $mech->json_response, 'Access via search name' );
+}
+
+{
+    my $ticket1 = RT::Test->create_ticket(
+        Queue             => 1,
+        Subject           => 'test ticket',
+        Owner             => $user->Id,
+        Requestor         => $user->Id,
+        $custom_role_type => $user->Id
+    );
+    my $ticket2 = RT::Test->create_ticket( Queue => 1, Subject => 'test ticket' );
+    my $res     = $mech->get( "$rest_base_path/tickets?search=" . $search1->Id, 'Authorization' => $auth, );
+    is( $res->code, 200, "got $rest_base_path/tickets?search=" . $search1->Id );
+
+    my $content = $mech->json_response;
+    is( $content->{count},             1,  '1 search' );
+    is( $content->{page},              1,  '1 page' );
+    is( $content->{per_page},          50, '50 per_page' );
+    is( $content->{total},             1,  '1 total' );
+    is( scalar @{ $content->{items} }, 1,  'items count' );
+
+    my $item = $content->{items}[0];
+    is( $item->{id}, $ticket1->Id, 'ticket id' );
+    for my $field ( qw/Requestor Owner Status TimeLeft Subject Priority Created LastUpdated Told Queue/,
+        $custom_role_type )
+    {
+        ok( length $item->{$field}, "$field value not empty" );
+    }
+    is( $item->{Subject},               'test ticket', 'Subject value' );
+    is( $item->{Queue}{Name},           'General',     'Queue name' );
+    is( $item->{Requestor}[0]{id},      $user->Name,   'Requestor id' );
+    is( $item->{Requestor}[0]{Country}, 'US',          'Requestor Country' );
+
+    is( $item->{$custom_role_type}[0]{id},                         $user->Name, 'Manager id' );
+    is( $item->{$custom_role_type}[0]{CustomFields}[0]{name},      'Boss',      'Manager Boss' );
+    is( $item->{$custom_role_type}[0]{CustomFields}[0]{values}[0], 'root',      'Manager Boss name' );
+
+    $res = $mech->get( "$rest_base_path/tickets?search=My tickets", 'Authorization' => $auth, );
+    is( $res->code, 200, "got $rest_base_path/tickets?search=My tickets" );
+    is_deeply( $content, $mech->json_response, 'search tickets via search name' );
+
+    $res = $mech->get( "$rest_base_path/tickets?search=My tickets&per_page=10&fields=id", 'Authorization' => $auth, );
+    is( $res->code, 200, "got $rest_base_path/tickets?search=My tickets" );
+    $content = $mech->json_response;
+    is( $content->{count},             1,  '1 search' );
+    is( $content->{page},              1,  '1 page' );
+    is( $content->{per_page},          10, '10 per_page' );
+    is( $content->{total},             1,  '1 total' );
+    is( scalar @{ $content->{items} }, 1,  'items count' );
+
+    $item = $content->{items}[0];
+    is( $item->{id}, $ticket1->Id, 'ticket id' );
+    for my $field ( qw/Requestor Owner Status TimeLeft Subject Priority Created LastUpdated Told Queue/,
+        $custom_role_type )
+    {
+        ok( !exists $item->{$field}, "$field not exists" );
+    }
+}
+
+done_testing;

-- 
To stop receiving notification emails like this one, please contact
sysadmin at bestpractical.com.


More information about the Bps-public-commit mailing list