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