1#!/usr/bin/perl -w
2
3# to run:
4# RT_DBA_USER=root RT_DBA_PASSWORD= prove -lv -I/opt/rt3/lib t/sd-rt-hm.t
5use strict;
6
7# setup for rt
8use Prophet::Test;
9use App::SD::Test;
10
11BEGIN {
12    unless (eval 'use RT::Test tests => "no_declare"; 1') {
13        diag $@;
14        plan skip_all => 'requires RT 3.8 to run tests.';
15    }
16}
17
18BEGIN {
19    unless ( $ENV{'JIFTY_APP_ROOT'} ) {
20        plan skip_all => "You must define a JIFTY_APP_ROOT environment variable which points to your hiveminder source tree";
21    }
22    require File::Temp;
23    eval "use Jifty;";
24    push @INC, File::Spec->catdir( Jifty::Util->app_root, "lib" );
25}
26
27plan tests => 10;
28
29
30no warnings 'once';
31
32RT::Handle->InsertData( $RT::EtcPath . '/initialdata' );
33
34eval 'use BTDT::Test; 1;' or die "$@";
35
36my $server = BTDT::Test->make_server;
37my $URL    = $server->started_ok;
38
39$URL =~ s|http://|http://onlooker\@example.com:something@|;
40my $sd_hm_url = "hm:$URL";
41
42ok( 1, "Loaded the test script" );
43
44my ( $url, $m ) = RT::Test->started_ok;
45diag("RT server started at $url");
46
47use RT::Client::REST;
48use RT::Client::REST::Ticket;
49my $rt = RT::Client::REST->new( server => $url );
50$rt->login( username => 'root', password => 'password' );
51
52$url =~ s|http://|http://root:password@|;
53my $sd_rt_url = "rt:$url|General|Status!='resolved'";
54
55my $ticket = RT::Client::REST::Ticket->new(
56    rt      => $rt,
57    queue   => 'General',
58    status  => 'new',
59    subject => 'Fly Man',
60)->store( text => "Ticket Comment" );
61
62# setup for hm
63my $root = BTDT::CurrentUser->superuser;
64my $as_root = BTDT::Model::User->new( current_user => $root );
65$as_root->load_by_cols( email => 'onlooker@example.com' );
66my ( $val, $msg ) = $as_root->set_accepted_eula_version( Jifty->config->app('EULAVersion') );
67ok( $val, $msg );
68my $GOODUSER = BTDT::CurrentUser->new( email => 'onlooker@example.com' );
69$GOODUSER->user_object->set_accepted_eula_version( Jifty->config->app('EULAVersion') );
70my $task = BTDT::Model::Task->new( current_user => $GOODUSER );
71$task->create(
72    summary     => "YATTA",
73    description => '',
74);
75
76my ( $bob_yatta_id, $bob_flyman_id, $flyman_uuid, $yatta_uuid, $alice_yatta_id, $alice_flyman_id );
77my ( $ret, $out, $err );
78
79as_alice {
80    local $ENV{SD_REPO} = $ENV{PROPHET_REPO};
81    ( $ret, $out, $err ) = run_script('sd',['init', '--non-interactive']);
82    diag($err) if ($err);
83};
84
85as_bob {
86    local $ENV{SD_REPO} = $ENV{PROPHET_REPO};
87    ( $ret, $out, $err ) = run_script( 'sd',
88        [ 'clone', '--from', repo_uri_for('alice'), '--non-interactive' ] );
89    diag($err) if ($err);
90};
91
92# now the tests, bob syncs with rt, alice syncs with hm
93as_alice {
94    local $ENV{SD_REPO} = $ENV{PROPHET_REPO};
95    ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_hm_url ] );
96    diag($err) if ($err);
97    run_output_matches( 'sd', [ 'ticket', 'list', '--regex', '.' ], [qr/^(.*?)(?{ $alice_yatta_id = $1 }) YATTA .*/] );
98    $yatta_uuid = get_uuid_for_luid($alice_yatta_id);
99};
100
101as_bob {
102    local $ENV{SD_REPO} = $ENV{PROPHET_REPO};
103    diag("Bob pulling from RT");
104    ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
105    diag($err) if ($err);
106    run_output_matches( 'sd', [ 'ticket', 'list', '--regex', '.' ], [qr/^(.*?)(?{ $bob_flyman_id = $1 }) Fly Man new/] );
107    diag("Bob pulling from alice");
108    ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', repo_uri_for('alice')] );
109
110    $flyman_uuid = get_uuid_for_luid($bob_flyman_id);
111    my $bob_yatta_id = get_luid_for_uuid($yatta_uuid);
112
113    run_output_matches_unordered(
114        'sd',
115        [ 'ticket',                             'list', '--regex', '.' ],
116        [ reverse sort "$bob_yatta_id YATTA open", "$bob_flyman_id Fly Man new" ]
117    );
118
119
120    diag("Bob pushing to RT");
121    ( $ret, $out, $err ) = run_script( 'sd', [ 'push', '--to', $sd_rt_url ] );
122    diag($err) if ($err);
123
124    my @ids = $rt->search(
125        type => 'ticket',
126        query => "Subject LIKE 'YATTA'",
127    );
128    is(@ids, 1, "pushed YATTA ticket to RT");
129};
130
131as_alice {
132    local $ENV{SD_REPO} = $ENV{'PROPHET_REPO'};
133    ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', repo_uri_for('bob'), '--force' ] );
134
135
136    $alice_flyman_id = get_luid_for_uuid($flyman_uuid);
137
138    run_output_matches_unordered(
139        'sd',
140        [ 'ticket',                             'list', '--regex', '.' ],
141        [ sort "$alice_yatta_id YATTA open", "$alice_flyman_id Fly Man new" ]
142    );
143
144    ( $ret, $out, $err ) = run_script( 'sd', [ 'push', '--to', $sd_rt_url ] );
145
146    ok( $task->load_by_cols( summary => 'Fly Man' ) );
147};
148
149exit(0);
150
151__END__
152
153
154
155use Prophet::Test;
156
157my ($url, $m) = RT::Test->started_ok;
158
159use RT::Client::REST;
160use RT::Client::REST::Ticket;
161my $rt = RT::Client::REST->new( server => $url );
162$rt->login( username => 'root', password => 'password' );
163
164$url =~ s|http://|http://root:password@|;
165warn $url;
166my $sd_rt_url = "rt:$url|General|Status!='resolved'";
167
168my $ticket = RT::Client::REST::Ticket->new(
169        rt => $rt,
170        queue => 'General',
171        status => 'new',
172        subject => 'Fly Man',
173    )->store(text => "Ticket Comment");
174
175diag $ticket->id;
176my ($ret, $out, $err);
177($ret, $out, $err) = run_script('sd', ['pull', '--from', $sd_rt_url]);
178warn $err;
179my ($yatta_uuid, $flyman_uuid);
180run_output_matches('sd', ['ticket', 'list', '--regex', '.'], [qr/(.*?)(?{ $flyman_uuid = $1 }) Fly Man new/]);
181
182
183RT::Client::REST::Ticket->new(
184        rt => $rt,
185        id => $ticket->id,
186        status => 'open',
187    )->store();
188
189($ret, $out, $err) = run_script('sd', ['pull', '--from', $sd_rt_url]);
190
191run_output_matches('sd', ['ticket', 'list', '--regex', '.'], ["$flyman_uuid Fly Man open"]);
192
193# create from sd and push
194
195run_output_matches('sd', ['ticket', 'create', '--summary', 'YATTA', '--status', 'new'], [qr/Created ticket (.*)(?{ $yatta_uuid = $1 })/]);
196
197diag $yatta_uuid;
198
199run_output_matches('sd', ['ticket', 'list', '--regex', '.'],
200                   [ sort
201                    "$yatta_uuid YATTA new",
202                     "$flyman_uuid Fly Man open",
203                   ]);
204
205($ret, $out, $err) = run_script('sd', ['push', '--to', $sd_rt_url]);
206diag $err;
207my @tix = $rt->search(
208        type  => 'ticket',
209        query => "Subject='YATTA'"
210    );
211
212ok(scalar @tix, 'YATTA pushed');
213
214($ret, $out, $err) = run_script('sd', ['pull', '--from', $sd_rt_url]);
215
216run_output_matches('sd', ['ticket', 'list', '--regex', '.'],
217                   [ sort
218                    "$yatta_uuid YATTA new",
219                     "$flyman_uuid Fly Man open",
220                   ]);
221
222RT::Client::REST::Ticket->new(
223        rt => $rt,
224        id => $ticket->id,
225        status => 'stalled',
226    )->store();
227
228($ret, $out, $err) = run_script('sd', ['pull', '--from', $sd_rt_url]);
229
230run_output_matches('sd', ['ticket', 'list', '--regex', '.'],
231                   [ sort
232                    "$yatta_uuid YATTA new",
233                     "$flyman_uuid Fly Man stalled",
234                   ]);
235
236RT::Client::REST::Ticket->new(
237        rt => $rt,
238        id => $tix[0],
239        status => 'open',
240    )->store();
241
242warn "===> bad pull";
243($ret, $out, $err) = run_script('sd', ['pull', '--from', $sd_rt_url]);
244diag $err;
245run_output_matches('sd', ['ticket', 'list', '--regex', '.'],
246                   [ sort
247                    "$yatta_uuid YATTA open",
248                     "$flyman_uuid Fly Man stalled",
249                   ]);
250
251#diag $uuid;
252
2531;
254
255
256
257
258