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