RT 4.2.11, ticket#13852
[freeside.git] / rt / t / api / link.t
1 use strict;
2 use warnings;
3
4 use RT::Test nodata => 1, tests => 83;
5 use RT::Test::Web;
6 use Test::Warn;
7
8 use RT::Link;
9 my $link = RT::Link->new(RT->SystemUser);
10
11 ok (ref $link);
12 isa_ok( $link, 'RT::Link');
13 isa_ok( $link, 'RT::Base');
14 isa_ok( $link, 'RT::Record');
15 isa_ok( $link, 'DBIx::SearchBuilder::Record');
16
17 my $queue = RT::Test->load_or_create_queue(Name => 'General');
18 ok($queue->Id, "loaded the General queue");
19
20 my $parent = RT::Ticket->new(RT->SystemUser);
21 my ($pid, undef, $msg) = $parent->Create(
22     Queue   => $queue->id,
23     Subject => 'parent',
24 );
25 ok $pid, 'created a ticket #'. $pid or diag "error: $msg";
26
27 my $child = RT::Ticket->new(RT->SystemUser);
28 ((my $cid), undef, $msg) = $child->Create(
29     Queue   => $queue->id,
30     Subject => 'child',
31 );
32 ok $cid, 'created a ticket #'. $cid or diag "error: $msg";
33
34 {
35     my ($status, $msg);
36     clean_links();
37
38     ($status, $msg) = $parent->AddLink;
39     ok(!$status, "didn't create a link: $msg");
40
41     warning_like {
42         ($status, $msg) = $parent->AddLink( Base => $parent->id );
43     } qr/Can't link a ticket to itself/, "warned about linking a ticket to itself";
44     ok(!$status, "didn't create a link: $msg");
45
46     warning_like {
47         ($status, $msg) = $parent->AddLink( Base => $parent->id, Type => 'HasMember' );
48     } qr/Can't link a ticket to itself/, "warned about linking a ticket to itself";
49     ok(!$status, "didn't create a link: $msg");
50 }
51
52 {
53     clean_links();
54     my ($status, $msg) = $parent->AddLink(
55         Type => 'MemberOf', Base => $child->id,
56     );
57     ok($status, "created a link: $msg");
58
59     my $children = $parent->Members;
60     $children->RedoSearch; $children->GotoFirstItem;
61     is $children->Count, 1, 'link is there';
62
63     my $link = $children->First;
64     ok $link->id, 'correct link';
65
66     is $link->Type,        'MemberOf',  'type';
67     is $link->LocalTarget, $parent->id, 'local target';
68     is $link->LocalBase,   $child->id,  'local base';
69     is $link->Target, 'fsck.com-rt://example.com/ticket/'. $parent->id, 'local target';
70     is $link->Base,   'fsck.com-rt://example.com/ticket/'. $child->id,  'local base';
71
72     isa_ok $link->TargetObj, 'RT::Ticket';
73     is $link->TargetObj->id, $parent->id, 'correct ticket';
74
75     isa_ok $link->TargetURI, 'RT::URI';
76     is $link->TargetURI->Scheme, 'fsck.com-rt', 'correct scheme';
77     is $link->TargetURI->URI,
78         'fsck.com-rt://example.com/ticket/'. $parent->id,
79         'correct URI'
80     ;
81     ok $link->TargetURI->IsLocal, 'local object';
82     is $link->TargetURI->AsHREF,
83         RT::Test::Web->rt_base_url .'Ticket/Display.html?id='. $parent->id,
84         'correct href'
85     ;
86
87     isa_ok $link->BaseObj, 'RT::Ticket';
88     is $link->BaseObj->id, $child->id, 'correct ticket';
89
90     isa_ok $link->BaseURI, 'RT::URI';
91     is $link->BaseURI->Scheme, 'fsck.com-rt', 'correct scheme';
92     is $link->BaseURI->URI,
93         'fsck.com-rt://example.com/ticket/'. $child->id,
94         'correct URI'
95     ;
96     ok $link->BaseURI->IsLocal, 'local object';
97     is $link->BaseURI->AsHREF,
98         RT::Test::Web->rt_base_url .'Ticket/Display.html?id='. $child->id,
99         'correct href'
100     ;
101 }
102
103 {
104     clean_links();
105     my ($status, $msg) = $parent->AddLink(
106         Type => 'MemberOf', Base => $child->URI,
107     );
108     ok($status, "created a link: $msg");
109
110     my $children = $parent->Members;
111     $children->RedoSearch; $children->GotoFirstItem;
112     is $children->Count, 1, 'link is there';
113
114     my $link = $children->First;
115     ok $link->id, 'correct link';
116
117     is $link->Type,        'MemberOf',  'type';
118     is $link->LocalTarget, $parent->id, 'local target';
119     is $link->LocalBase,   $child->id,  'local base';
120     is $link->Target, 'fsck.com-rt://example.com/ticket/'. $parent->id, 'local target';
121     is $link->Base,   'fsck.com-rt://example.com/ticket/'. $child->id,  'local base';
122
123     isa_ok $link->TargetObj, 'RT::Ticket';
124     is $link->TargetObj->id, $parent->id, 'correct ticket';
125
126     isa_ok $link->TargetURI, 'RT::URI';
127     is $link->TargetURI->Scheme, 'fsck.com-rt', 'correct scheme';
128     is $link->TargetURI->URI,
129         'fsck.com-rt://example.com/ticket/'. $parent->id,
130         'correct URI'
131     ;
132     ok $link->TargetURI->IsLocal, 'local object';
133     is $link->TargetURI->AsHREF,
134         RT::Test::Web->rt_base_url .'Ticket/Display.html?id='. $parent->id,
135         'correct href'
136     ;
137
138     isa_ok $link->BaseObj, 'RT::Ticket';
139     is $link->BaseObj->id, $child->id, 'correct ticket';
140
141     isa_ok $link->BaseURI, 'RT::URI';
142     is $link->BaseURI->Scheme, 'fsck.com-rt', 'correct scheme';
143     is $link->BaseURI->URI,
144         'fsck.com-rt://example.com/ticket/'. $child->id,
145         'correct URI'
146     ;
147     ok $link->BaseURI->IsLocal, 'local object';
148     is $link->BaseURI->AsHREF,
149         RT::Test::Web->rt_base_url .'Ticket/Display.html?id='. $child->id,
150         'correct href'
151     ;
152 }
153
154 {
155     clean_links();
156     my ($status, $msg) = $parent->AddLink(
157         Type => 'MemberOf', Base => 't:'. $child->id,
158     );
159     ok($status, "created a link: $msg");
160
161     my $children = $parent->Members;
162     $children->RedoSearch; $children->GotoFirstItem;
163     is $children->Count, 1, 'link is there';
164
165     my $link = $children->First;
166     ok $link->id, 'correct link';
167
168     is $link->Type,        'MemberOf',  'type';
169     is $link->LocalTarget, $parent->id, 'local target';
170     is $link->LocalBase,   $child->id,  'local base';
171     is $link->Target, 'fsck.com-rt://example.com/ticket/'. $parent->id, 'local target';
172     is $link->Base,   'fsck.com-rt://example.com/ticket/'. $child->id,  'local base';
173
174     isa_ok $link->TargetObj, 'RT::Ticket';
175     is $link->TargetObj->id, $parent->id, 'correct ticket';
176
177     isa_ok $link->TargetURI, 'RT::URI';
178     is $link->TargetURI->Scheme, 'fsck.com-rt', 'correct scheme';
179     is $link->TargetURI->URI,
180         'fsck.com-rt://example.com/ticket/'. $parent->id,
181         'correct URI'
182     ;
183     ok $link->TargetURI->IsLocal, 'local object';
184     is $link->TargetURI->AsHREF,
185         RT::Test::Web->rt_base_url .'Ticket/Display.html?id='. $parent->id,
186         'correct href'
187     ;
188
189     isa_ok $link->BaseObj, 'RT::Ticket';
190     is $link->BaseObj->id, $child->id, 'correct ticket';
191
192     isa_ok $link->BaseURI, 'RT::URI';
193     is $link->BaseURI->Scheme, 'fsck.com-rt', 'correct scheme';
194     is $link->BaseURI->URI,
195         'fsck.com-rt://example.com/ticket/'. $child->id,
196         'correct URI'
197     ;
198     ok $link->BaseURI->IsLocal, 'local object';
199     is $link->BaseURI->AsHREF,
200         RT::Test::Web->rt_base_url .'Ticket/Display.html?id='. $child->id,
201         'correct href'
202     ;
203 }
204
205 {
206     clean_links();
207     $child->SetStatus('deleted');
208
209     my ($status, $msg) = $parent->AddLink(
210         Type => 'MemberOf', Base => $child->id,
211     );
212     ok(!$status, "can't link to deleted ticket: $msg");
213
214     $child->SetStatus('new');
215     ($status, $msg) = $parent->AddLink(
216         Type => 'MemberOf', Base => $child->id,
217     );
218     ok($status, "created a link: $msg");
219
220     $child->SetStatus('deleted');
221     my $children = $parent->Members;
222     $children->RedoSearch;
223
224     my $total = 0;
225     $total++ while $children->Next;
226     is( $total, 0, 'Next skips deleted tickets' );
227
228     is( @{ $children->ItemsArrayRef },
229         0, 'ItemsArrayRef skips deleted tickets' );
230
231     # back to active status
232     $child->SetStatus('new');
233 }
234
235 sub clean_links {
236     my $links = RT::Links->new( RT->SystemUser );
237     $links->UnLimit;
238     while ( my $link = $links->Next ) {
239         my ($status, $msg) = $link->Delete;
240         $RT::Logger->error("Couldn't delete a link: $msg")
241             unless $status;
242     }
243 }
244