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