1#!/usr/bin/perl -w
2
3# to run:
4# RT_DBA_USER=root RT_DBA_PASSWORD= prove -lv -I/opt/rt3/lib t/pull-watchers.t
5use strict;
6use warnings;
7
8use Prophet::Test;
9use File::Path qw(rmtree);
10
11BEGIN {
12    unless (eval 'use RT::Test tests => "no_declare"; 1') {
13        diag $@ if $ENV{'TEST_VERBOSE'};
14        plan skip_all => 'requires RT 3.8 or newer to run tests.';
15    }
16}
17
18plan tests => 91;
19use App::SD::Test;
20
21no warnings 'once';
22
23RT::Handle->InsertData( $RT::EtcPath . '/initialdata' );
24use Prophet::Test;
25
26BEGIN {
27    require File::Temp;
28    $ENV{'PROPHET_REPO'} = $ENV{'SD_REPO'}
29        = File::Temp::tempdir( CLEANUP => 1 ) . '/_svb';
30    diag "export SD_REPO=" . $ENV{'PROPHET_REPO'} . "\n";
31}
32
33my $IMAGE_FILE = qw|t/data/bplogo.gif|;
34
35my ( $url, $m ) = RT::Test->started_ok;
36
37use RT::Client::REST;
38use RT::Client::REST::Ticket;
39my $rt = RT::Client::REST->new( server => $url );
40$rt->login( username => 'root', password => 'password' );
41
42$url =~ s|http://|http://root:password@|;
43my $sd_rt_url = "rt:$url|General|Status!='resolved'";
44
45# create without requestor pull
46{
47    flush_sd();
48
49    my $ticket = RT::Ticket->new( $RT::SystemUser );
50    my ($tid) = $ticket->Create(
51        Queue => 'General', Status => 'new', Subject => 'Fly Man',
52    );
53    ok $tid, "created ticket #$tid in RT";
54
55    my ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
56
57    my $flyman_id;
58    run_output_matches(
59        'sd', [qw(ticket list --regex .)],
60        [qr/(.*?)(?{ $flyman_id = $1 }) Fly Man new/]
61    );
62    ok $flyman_id, 'pulled ticket';
63
64    my ($res) = $ticket->SetStatus('deleted');
65    ok $res, 'deleted ticket in RT';
66}
67
68# create with requestor, pull
69{
70    flush_sd();
71
72    my $ticket = RT::Ticket->new( $RT::SystemUser );
73    my ($rt_tid) = $ticket->Create(
74        Queue => 'General', Status => 'new', Subject => 'Fly Man',
75        Requestor => 'test@localhost',
76    );
77    ok $rt_tid, "created ticket #$rt_tid in RT";
78
79    my ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
80
81    my $sd_tid;
82    run_output_matches(
83        'sd', [qw(ticket list --regex .)],
84        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
85    );
86    ok $sd_tid, 'pulled ticket';
87
88    my $info = get_ticket_info($sd_tid);
89    is $info->{'metadata'}{'reporter'}, 'test@localhost',
90        'correct requestor';
91
92    my ($res) = $ticket->SetStatus('deleted');
93    ok $res, 'deleted ticket in RT';
94}
95
96# create with requestor+requestor, pull
97{
98    flush_sd();
99
100    my $ticket = RT::Ticket->new( $RT::SystemUser );
101    my ($rt_tid) = $ticket->Create(
102        Queue => 'General', Status => 'new', Subject => 'Fly Man',
103        Requestor => ['test@localhost', 'another@localhost'],
104    );
105    ok $rt_tid, "created ticket #$rt_tid in RT";
106
107    my ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
108
109    my $sd_tid;
110    run_output_matches(
111        'sd', [qw(ticket list --regex .)],
112        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
113    );
114    ok $sd_tid, 'pulled ticket';
115
116    my $info = get_ticket_info($sd_tid);
117    is $info->{'metadata'}{'reporter'}, 'another@localhost, test@localhost',
118        'correct requestors';
119
120    my ($res) = $ticket->SetStatus('deleted');
121    ok $res, 'deleted ticket in RT';
122}
123
124# create, add requestor, pull
125{
126    my $ticket = RT::Ticket->new( $RT::SystemUser );
127    my ($rt_tid) = $ticket->Create(
128        Queue => 'General', Status => 'new', Subject => 'Fly Man',
129        Requestor => 'test@localhost',
130    );
131    ok $rt_tid, "created ticket #$rt_tid in RT";
132
133    my ($res) = $ticket->AddWatcher( Type => 'Requestor', Email => 'another@localhost' );
134    ok $res, "added requestor";
135
136    flush_sd();
137    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
138
139    my $sd_tid;
140    run_output_matches(
141        'sd', [qw(ticket list --regex .)],
142        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
143    );
144    ok $sd_tid, 'pulled ticket';
145
146    my $info = get_ticket_info($sd_tid);
147    is $info->{'metadata'}{'reporter'}, 'another@localhost, test@localhost',
148        'correct requestor';
149
150    ($res) = $ticket->SetStatus('deleted');
151    ok $res, 'deleted ticket in RT';
152}
153
154# create, pull, add requestor, pull
155{
156    flush_sd();
157
158    my $ticket = RT::Ticket->new( $RT::SystemUser );
159    my ($rt_tid) = $ticket->Create(
160        Queue => 'General', Status => 'new', Subject => 'Fly Man',
161        Requestor => 'test@localhost',
162    );
163    ok $rt_tid, "created ticket #$rt_tid in RT";
164
165    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
166
167    my $sd_tid;
168    run_output_matches(
169        'sd', [qw(ticket list --regex .)],
170        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
171    );
172    ok $sd_tid, 'pulled ticket';
173
174    my $info = get_ticket_info($sd_tid);
175    is $info->{'metadata'}{'reporter'}, 'test@localhost',
176        'correct requestor';
177
178    my ($res) = $ticket->AddWatcher( Type => 'Requestor', Email => 'another@localhost' );
179    ok $res, "added requestor";
180
181    ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
182
183    $info = get_ticket_info($sd_tid);
184    is $info->{'metadata'}{'reporter'}, 'another@localhost, test@localhost',
185        'correct requestor';
186
187    ($res) = $ticket->SetStatus('deleted');
188    ok $res, 'deleted ticket in RT';
189}
190
191# create without requestor, pull, add requestor, pull
192{
193    flush_sd();
194
195    my $ticket = RT::Ticket->new( $RT::SystemUser );
196    my ($rt_tid) = $ticket->Create(
197        Queue => 'General', Status => 'new', Subject => 'Fly Man',
198    );
199    ok $rt_tid, "created ticket #$rt_tid in RT";
200
201    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
202
203    my $sd_tid;
204    run_output_matches(
205        'sd', [qw(ticket list --regex .)],
206        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
207    );
208    ok $sd_tid, 'pulled ticket';
209
210    my $info = get_ticket_info($sd_tid);
211    ok !$info->{'metadata'}{'reporter'}, 'correct requestor';
212
213    my ($res) = $ticket->AddWatcher( Type => 'Requestor', Email => 'another@localhost' );
214    ok $res, "added requestor";
215
216    ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
217
218    $info = get_ticket_info($sd_tid);
219    is $info->{'metadata'}{'reporter'}, 'another@localhost',
220        'correct requestor';
221
222    ($res) = $ticket->SetStatus('deleted');
223    ok $res, 'deleted ticket in RT';
224}
225
226# create without requestor, add requestor, pull
227{
228    flush_sd();
229
230    my $ticket = RT::Ticket->new( $RT::SystemUser );
231    my ($rt_tid) = $ticket->Create(
232        Queue => 'General', Status => 'new', Subject => 'Fly Man',
233    );
234    ok $rt_tid, "created ticket #$rt_tid in RT";
235
236    my ($res) = $ticket->AddWatcher( Type => 'Requestor', Email => 'another@localhost' );
237    ok $res, "added requestor";
238
239    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
240
241    my $sd_tid;
242    run_output_matches(
243        'sd', [qw(ticket list --regex .)],
244        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
245    );
246    ok $sd_tid, 'pulled ticket';
247
248    my $info = get_ticket_info($sd_tid);
249    is $info->{'metadata'}{'reporter'}, 'another@localhost',
250        'correct requestor';
251
252    ($res) = $ticket->SetStatus('deleted');
253    ok $res, 'deleted ticket in RT';
254}
255
256# create, pull, del requestor, pull
257{
258    flush_sd();
259
260    my $ticket = RT::Ticket->new( $RT::SystemUser );
261    my ($rt_tid) = $ticket->Create(
262        Queue => 'General', Status => 'new', Subject => 'Fly Man',
263        Requestor => 'test@localhost',
264    );
265    ok $rt_tid, "created ticket #$rt_tid in RT";
266
267    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
268
269    my $sd_tid;
270    run_output_matches(
271        'sd', [qw(ticket list --regex .)],
272        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
273    );
274    ok $sd_tid, 'pulled ticket';
275
276    my $info = get_ticket_info($sd_tid);
277    is $info->{'metadata'}{'reporter'}, 'test@localhost',
278        'correct requestor';
279
280    my ($res) = $ticket->DeleteWatcher( Type => 'Requestor', Email => 'test@localhost' );
281    ok $res, "deleted requestor";
282
283    ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
284
285    $info = get_ticket_info($sd_tid);
286    ok !$info->{'metadata'}{'reporter'}, 'correct requestor';
287
288    ($res) = $ticket->SetStatus('deleted');
289    ok $res, 'deleted ticket in RT';
290}
291
292# create with cc, pull
293{
294    flush_sd();
295
296    my $ticket = RT::Ticket->new( $RT::SystemUser );
297    my ($rt_tid) = $ticket->Create(
298        Queue => 'General', Status => 'new', Subject => 'Fly Man',
299        Cc => 'test@localhost',
300    );
301    ok $rt_tid, "created ticket #$rt_tid in RT";
302
303    my ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
304
305    my $sd_tid;
306    run_output_matches(
307        'sd', [qw(ticket list --regex .)],
308        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
309    );
310    ok $sd_tid, 'pulled ticket';
311
312    my $info = get_ticket_info($sd_tid);
313    is $info->{'metadata'}{'cc'}, 'test@localhost',
314        'correct cc';
315
316    my ($res) = $ticket->SetStatus('deleted');
317    ok $res, 'deleted ticket in RT';
318}
319
320# create with cc+cc, pull
321{
322    flush_sd();
323
324    my $ticket = RT::Ticket->new( $RT::SystemUser );
325    my ($rt_tid) = $ticket->Create(
326        Queue => 'General', Status => 'new', Subject => 'Fly Man',
327        Cc => ['test@localhost', 'another@localhost'],
328    );
329    ok $rt_tid, "created ticket #$rt_tid in RT";
330
331    my ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
332
333    my $sd_tid;
334    run_output_matches(
335        'sd', [qw(ticket list --regex .)],
336        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
337    );
338    ok $sd_tid, 'pulled ticket';
339
340    my $info = get_ticket_info($sd_tid);
341    is $info->{'metadata'}{'cc'}, 'another@localhost, test@localhost',
342        'correct ccs';
343
344    my ($res) = $ticket->SetStatus('deleted');
345    ok $res, 'deleted ticket in RT';
346}
347
348# create, add cc, pull
349{
350    flush_sd();
351
352    my $ticket = RT::Ticket->new( $RT::SystemUser );
353    my ($rt_tid) = $ticket->Create(
354        Queue => 'General', Status => 'new', Subject => 'Fly Man',
355        Cc => 'test@localhost',
356    );
357    ok $rt_tid, "created ticket #$rt_tid in RT";
358
359    my ($res) = $ticket->AddWatcher( Type => 'Cc', Email => 'another@localhost' );
360    ok $res, "added cc";
361
362    flush_sd();
363    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
364
365    my $sd_tid;
366    run_output_matches(
367        'sd', [qw(ticket list --regex .)],
368        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
369    );
370    ok $sd_tid, 'pulled ticket';
371
372    my $info = get_ticket_info($sd_tid);
373    is $info->{'metadata'}{'cc'}, 'another@localhost, test@localhost',
374        'correct cc';
375
376    ($res) = $ticket->SetStatus('deleted');
377    ok $res, 'deleted ticket in RT';
378}
379
380# create, pull, add cc, pull
381{
382    flush_sd();
383
384    my $ticket = RT::Ticket->new( $RT::SystemUser );
385    my ($rt_tid) = $ticket->Create(
386        Queue => 'General', Status => 'new', Subject => 'Fly Man',
387        Cc => 'test@localhost',
388    );
389    ok $rt_tid, "created ticket #$rt_tid in RT";
390
391    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
392
393    my $sd_tid;
394    run_output_matches(
395        'sd', [qw(ticket list --regex .)],
396        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
397    );
398    ok $sd_tid, 'pulled ticket';
399
400    my $info = get_ticket_info($sd_tid);
401    is $info->{'metadata'}{'cc'}, 'test@localhost',
402        'correct cc';
403
404    my ($res) = $ticket->AddWatcher( Type => 'Cc', Email => 'another@localhost' );
405    ok $res, "added cc";
406
407    ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
408
409    $info = get_ticket_info($sd_tid);
410    is $info->{'metadata'}{'cc'}, 'another@localhost, test@localhost',
411        'correct cc';
412
413    ($res) = $ticket->SetStatus('deleted');
414    ok $res, 'deleted ticket in RT';
415}
416
417# create without cc, pull, add cc, pull
418{
419    flush_sd();
420
421    my $ticket = RT::Ticket->new( $RT::SystemUser );
422    my ($rt_tid) = $ticket->Create(
423        Queue => 'General', Status => 'new', Subject => 'Fly Man',
424    );
425    ok $rt_tid, "created ticket #$rt_tid in RT";
426
427    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
428
429    my $sd_tid;
430    run_output_matches(
431        'sd', [qw(ticket list --regex .)],
432        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
433    );
434    ok $sd_tid, 'pulled ticket';
435
436    my $info = get_ticket_info($sd_tid);
437    ok !$info->{'metadata'}{'cc'}, 'correct cc';
438
439    my ($res) = $ticket->AddWatcher( Type => 'Cc', Email => 'another@localhost' );
440    ok $res, "added cc";
441
442    ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
443
444    $info = get_ticket_info($sd_tid);
445    is $info->{'metadata'}{'cc'}, 'another@localhost',
446        'correct cc';
447
448    ($res) = $ticket->SetStatus('deleted');
449    ok $res, 'deleted ticket in RT';
450}
451
452# create without cc, add cc, pull
453{
454    flush_sd();
455
456    my $ticket = RT::Ticket->new( $RT::SystemUser );
457    my ($rt_tid) = $ticket->Create(
458        Queue => 'General', Status => 'new', Subject => 'Fly Man',
459    );
460    ok $rt_tid, "created ticket #$rt_tid in RT";
461
462    my ($res) = $ticket->AddWatcher( Type => 'Cc', Email => 'another@localhost' );
463    ok $res, "added cc";
464
465    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
466
467    my $sd_tid;
468    run_output_matches(
469        'sd', [qw(ticket list --regex .)],
470        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
471    );
472    ok $sd_tid, 'pulled ticket';
473
474    my $info = get_ticket_info($sd_tid);
475    is $info->{'metadata'}{'cc'}, 'another@localhost',
476        'correct cc';
477
478    ($res) = $ticket->SetStatus('deleted');
479    ok $res, 'deleted ticket in RT';
480}
481
482# create, pull, del cc, pull
483{
484    flush_sd();
485
486    my $ticket = RT::Ticket->new( $RT::SystemUser );
487    my ($rt_tid) = $ticket->Create(
488        Queue => 'General', Status => 'new', Subject => 'Fly Man',
489        Cc => 'test@localhost',
490    );
491    ok $rt_tid, "created ticket #$rt_tid in RT";
492
493    my ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
494
495    my $sd_tid;
496    run_output_matches(
497        'sd', [qw(ticket list --regex .)],
498        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
499    );
500    ok $sd_tid, 'pulled ticket';
501
502    my $info = get_ticket_info($sd_tid);
503    is $info->{'metadata'}{'cc'}, 'test@localhost',
504        'correct cc';
505
506    my ($res) = $ticket->DeleteWatcher( Type => 'Cc', Email => 'test@localhost' );
507    ok $res, "deleted cc";
508
509    ($ret, $out, $err) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
510
511    $info = get_ticket_info($sd_tid);
512    ok !$info->{'metadata'}{'cc'}, 'correct cc';
513
514    ($res) = $ticket->SetStatus('deleted');
515    ok $res, 'deleted ticket in RT';
516}
517
518sub flush_sd {
519    rmtree( $ENV{'SD_REPO'} );
520    run_script( 'sd', ['init', '--non-interactive' ] );
521}
522
523