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-owner.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 => 26;
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
45my $root = RT::User->new( $RT::SystemUser );
46$root->LoadByEmail('root@localhost');
47ok $root->id, 'loaded root';
48
49{
50    flush_sd();
51
52    my $ticket = RT::Ticket->new( $RT::SystemUser );
53    my ($tid) = $ticket->Create(
54        Queue => 'General', Status => 'new', Subject => 'Fly Man',
55    );
56    ok $tid, "created ticket #$tid in RT";
57
58    my ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
59
60    my $sd_tid;
61    run_output_matches(
62        'sd', [qw(ticket list --regex .)],
63        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
64    );
65    ok $sd_tid, 'pulled ticket';
66
67    my $info = get_ticket_info($sd_tid);
68    ok !$info->{'metadata'}{'owner'}, 'no owner';
69
70    my ($res) = $ticket->SetStatus('deleted');
71    ok $res, 'deleted ticket in RT';
72}
73
74{
75    flush_sd();
76
77    my $ticket = RT::Ticket->new( $RT::SystemUser );
78    my ($tid) = $ticket->Create(
79        Queue => 'General', Status => 'new', Subject => 'Fly Man',
80        Owner => $root->id,
81    );
82    ok $tid, "created ticket #$tid in RT";
83    is $ticket->Owner, $root->id, 'owner is set';
84
85    my ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
86
87    my $sd_tid;
88    run_output_matches(
89        'sd', [qw(ticket list --regex .)],
90        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
91    );
92    ok $sd_tid, 'pulled ticket';
93
94    my $info = get_ticket_info($sd_tid);
95    is $info->{'metadata'}{'owner'}, 'root@localhost', 'owner is set';
96
97    my ($res) = $ticket->SetStatus('deleted');
98    ok $res, 'deleted ticket in RT';
99}
100
101{
102    flush_sd();
103
104    my $ticket = RT::Ticket->new( $root );
105    my ($tid) = $ticket->Create(
106        Queue => 'General', Status => 'new', Subject => 'Fly Man',
107        Owner => $root->id,
108    );
109    ok $tid, "created ticket #$tid in RT";
110    is $ticket->Owner, $root->id, 'owner is set';
111
112    my ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
113
114    my $sd_tid;
115    run_output_matches(
116        'sd', [qw(ticket list --regex .)],
117        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
118    );
119    ok $sd_tid, 'pulled ticket';
120
121    my ($res, $msg) = $ticket->SetOwner( $RT::Nobody->id );
122    ok $res, 'unset owner in RT' or diag "error: $msg";
123
124    ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
125
126    my $info = get_ticket_info($sd_tid);
127    ok !$info->{'metadata'}{'owner'}, 'owner is not set';
128
129    ($res) = $ticket->SetStatus('deleted');
130    ok $res, 'deleted ticket in RT';
131}
132
133
134{
135    flush_sd();
136
137    my $ticket = RT::Ticket->new( $root );
138    my ($tid) = $ticket->Create(
139        Queue => 'General', Status => 'new', Subject => 'Fly Man',
140    );
141    ok $tid, "created ticket #$tid in RT";
142
143    my ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
144
145    my $sd_tid;
146    run_output_matches(
147        'sd', [qw(ticket list --regex .)],
148        [qr/(.*?)(?{ $sd_tid = $1 }) Fly Man new/]
149    );
150    ok $sd_tid, 'pulled ticket';
151
152    my ($res, $msg) = $ticket->SetOwner( $root->id );
153    ok $res, 'set owner in RT' or diag "error: $msg";
154
155    ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
156
157    my $info = get_ticket_info($sd_tid);
158    is $info->{'metadata'}{'owner'}, 'root@localhost', 'owner is set';
159
160    ($res) = $ticket->SetStatus('deleted');
161    ok $res, 'deleted ticket in RT';
162}
163
164sub flush_sd {
165    rmtree( $ENV{'SD_REPO'} );
166    run_script( 'sd', ['init', '--non-interactive' ] );
167}
168
169