1use strict; 2use warnings; 3 4use RT::Test::Assets tests => undef; 5use Test::Warn; 6 7my $catalog = create_catalog( Name => "BPS" ); 8ok $catalog && $catalog->id, "Created Catalog"; 9 10ok( 11 create_assets( 12 { Name => "Thinkpad T420s", Catalog => $catalog->id }, 13 { Name => "Standing desk", Catalog => $catalog->id }, 14 { Name => "Chair", Catalog => $catalog->id }, 15 ), 16 "Created assets" 17); 18 19my $ticket = RT::Test->create_ticket( 20 Queue => 1, 21 Subject => 'a test ticket', 22); 23ok $ticket->id, "Created ticket"; 24 25diag "RT::URI::asset"; 26{ 27 my %uris = ( 28 # URI => Asset Name 29 "asset:1" => { id => 1, Name => "Thinkpad T420s" }, 30 "asset:01" => { id => 1, Name => "Thinkpad T420s" }, 31 "asset://example.com/2" => { id => 2, Name => "Standing desk" }, 32 "asset:13" => undef, 33 ); 34 35 while (my ($url, $expected) = each %uris) { 36 my $uri = RT::URI->new( RT->SystemUser ); 37 if ($expected) { 38 my $parsed = $uri->FromURI($url); 39 ok $parsed, "Parsed $url"; 40 41 my $asset = $uri->Object; 42 ok $asset, "Got object"; 43 is ref($asset), "RT::Asset", "... it's a RT::Asset"; 44 45 while (my ($field, $value) = each %$expected) { 46 is $asset->$field, $value, "... $field is $value"; 47 } 48 } else { 49 my $parsed; 50 warnings_like { 51 $parsed = $uri->FromURI($url); 52 } [qr/Unable to load asset/, qr/\Q$url\E/], 53 "Caught warnings about unknown URI"; 54 ok !$parsed, "Failed to parse $url, as expected"; 55 } 56 } 57} 58 59diag "RT::Asset link support"; 60{ 61 my $chair = RT::Asset->new( RT->SystemUser ); 62 $chair->LoadByCols( Name => "Chair" ); 63 ok $chair->id, "Loaded asset"; 64 is $chair->URI, "asset://example.com/".$chair->id, "->URI works"; 65 66 my ($link_id, $msg) = $chair->AddLink( Type => 'MemberOf', Target => 'asset:2' ); 67 ok $link_id, "Added link: $msg"; 68 69 my $parents = $chair->MemberOf; 70 my $desk = $parents->First->TargetObj; 71 is $parents->Count, 1, "1 parent"; 72 is $desk->Name, "Standing desk", "Correct parent asset"; 73 74 for my $asset ($chair, $desk) { 75 my $txns = $asset->Transactions; 76 $txns->Limit( FIELD => 'Type', VALUE => 'AddLink' ); 77 is $txns->Count, 1, "1 AddLink txn on asset ".$asset->Name; 78 } 79 80 my ($ok, $err) = $chair->DeleteLink( Type => 'MemberOf', Target => 'asset:1' ); 81 ok !$ok, "Delete link failed on non-existent: $err"; 82 83 my ($deleted, $delete_msg) = $chair->DeleteLink( Type => 'MemberOf', Target => $parents->First->Target ); 84 ok $deleted, "Deleted link: $delete_msg"; 85 86 for my $asset ($chair, $desk) { 87 my $txns = $asset->Transactions; 88 $txns->Limit( FIELD => 'Type', VALUE => 'DeleteLink' ); 89 is $txns->Count, 1, "1 DeleteLink txn on asset ".$asset->Name; 90 } 91}; 92 93diag "Linking to tickets"; 94{ 95 my $laptop = RT::Asset->new( RT->SystemUser ); 96 $laptop->LoadByCols( Name => "Thinkpad T420s" ); 97 98 my ($ok, $msg) = $ticket->AddLink( Type => 'RefersTo', Target => $laptop->URI ); 99 ok $ok, "Ticket refers to asset: $msg"; 100 101 my $links = $laptop->ReferredToBy; 102 is $links->Count, 1, "Found a ReferredToBy link via asset"; 103 104 ($ok, $msg) = $laptop->DeleteLink( Type => 'RefersTo', Base => $ticket->URI ); 105 ok $ok, "Deleted link from opposite side: $msg"; 106} 107 108diag "Linking to tickets, asset leading zeros"; 109{ 110 my $laptop = RT::Asset->new( RT->SystemUser ); 111 $laptop->LoadByCols( Name => "Thinkpad T420s" ); 112 113 my ($ok, $msg) = $ticket->AddLink( Type => 'RefersTo', Target => 'asset:' . '0' . $laptop->Id ); 114 ok $ok, "Ticket refers to asset: $msg"; 115 116 my $links = $laptop->ReferredToBy; 117 is $links->Count, 1, "Found a ReferredToBy link via asset"; 118 119 ($ok, $msg) = $laptop->DeleteLink( Type => 'RefersTo', Base => $ticket->URI ); 120 ok $ok, "Deleted link from opposite side: $msg"; 121} 122 123diag "Links on ->Create"; 124{ 125 my $desk = RT::Asset->new( RT->SystemUser ); 126 $desk->LoadByCols( Name => "Standing desk" ); 127 ok $desk->id, "Loaded standing desk asset"; 128 129 my $asset = create_asset( 130 Name => "Anti-fatigue mat", 131 Catalog => $catalog->id, 132 Parent => $desk->URI, 133 ReferredToBy => [$ticket->id], 134 ); 135 ok $asset->id, "Created asset with Parent link"; 136 137 my $parents = $asset->MemberOf; 138 is $parents->Count, 1, "Found one Parent"; 139 is $parents->First->Target, $desk->URI, "... it's a desk!"; 140 141 my $referrals = $asset->ReferredToBy; 142 is $referrals->Count, 1, "Found one ReferredToBy"; 143 is $referrals->First->Base, $ticket->URI, "... it's the ticket!"; 144} 145 146done_testing; 147