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