The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

# to run:
# RT_DBA_USER=root RT_DBA_PASSWORD= prove -lv -I/opt/rt3/lib t/sd-rt-hm-single.t
use strict;

# setup for rt
use Prophet::Test;
use App::SD::Test;

BEGIN {
    unless (eval 'use RT::Test tests => "no_declare"; 1') {
        diag $@;
        plan skip_all => 'requires RT 3.8 to run tests.';
    }
}

BEGIN {
    unless ( $ENV{'JIFTY_APP_ROOT'} ) {
        plan skip_all => "You must define a JIFTY_APP_ROOT environment variable which points to your hiveminder source tree";
    }
    require File::Temp;
    eval "use Jifty;";
    push @INC, File::Spec->catdir( Jifty::Util->app_root, "lib" );
}

plan tests => 9;

no warnings 'once';

RT::Handle->InsertData( $RT::EtcPath . '/initialdata' );

eval 'use BTDT::Test; 1;' or die "$@";

my $server = BTDT::Test->make_server;
my $URL    = $server->started_ok;

$URL =~ s|http://|http://onlooker\@example.com:something@|;
my $sd_hm_url = "hm:$URL";

ok( 1, "Loaded the test script" );

my ( $url, $m ) = RT::Test->started_ok;
diag("RT server started at $url");

use RT::Client::REST;
use RT::Client::REST::Ticket;
my $rt = RT::Client::REST->new( server => $url );
$rt->login( username => 'root', password => 'password' );

$url =~ s|http://|http://root:password@|;
my $sd_rt_url = "rt:$url|General|Status!='resolved'";

my $ticket = RT::Client::REST::Ticket->new(
    rt      => $rt,
    queue   => 'General',
    status  => 'new',
    subject => 'Fly Man',
)->store( text => "Ticket Comment" );

# setup for hm
my $root = BTDT::CurrentUser->superuser;
my $as_root = BTDT::Model::User->new( current_user => $root );
$as_root->load_by_cols( email => 'onlooker@example.com' );
my ( $val, $msg ) = $as_root->set_accepted_eula_version( Jifty->config->app('EULAVersion') );
ok( $val, $msg );
my $GOODUSER = BTDT::CurrentUser->new( email => 'onlooker@example.com' );
$GOODUSER->user_object->set_accepted_eula_version( Jifty->config->app('EULAVersion') );
my $task = BTDT::Model::Task->new( current_user => $GOODUSER );
$task->create(
    summary     => "YATTA",
    description => '',
);

my ( $yatta_id, $flyman_id, $flyman_uuid, $yatta_uuid);
my ( $ret, $out, $err );

diag("Pull from Hiveminder");

as_bob {
    local $ENV{SD_REPO} = $ENV{'PROPHET_REPO'};
    ( $ret, $out, $err ) = run_script( 'sd',
        [ 'clone', '--from', $sd_hm_url, '--non-interactive' ] );
    diag($err) if ($err);
    run_output_matches( 'sd', [ 'ticket', 'list', '--regex', '.' ], [qr/^(.*?)(?{ $yatta_id = $1 }) YATTA .*/] );
    $yatta_uuid = get_uuid_for_luid($yatta_id);

    run_output_matches(
        'sd',
        [ 'ticket', 'list', '--regex', '.' ],
        [ "$yatta_id YATTA open" ]
    );
};

diag("Pull from RT");

as_bob {
    local $ENV{SD_REPO} = $ENV{'PROPHET_REPO'};

    diag("Bob pulling from RT");
    ( $ret, $out, $err ) = run_script( 'sd', [ 'pull', '--from', $sd_rt_url ] );
    diag($err) if ($err);
    run_output_matches( 'sd', [ 'ticket', 'list', '--regex', 'Fly Man' ], [qr/^(.*?)(?{ $flyman_id = $1 }) Fly Man new/] );
    $flyman_uuid = get_uuid_for_luid($flyman_id);

    run_output_matches_unordered(
        'sd',
        [ 'ticket',                             'list', '--regex', '.' ],
        [ reverse sort "$yatta_id YATTA open", "$flyman_id Fly Man new" ]
    );
};

diag("Push to RT");

as_bob {
    local $ENV{SD_REPO} = $ENV{'PROPHET_REPO'};
    ( $ret, $out, $err ) = run_script( 'sd', [ 'push', '--to', $sd_rt_url ] );
    diag($err) if ($err);

    my @ids = $rt->search(
        type => 'ticket',
        query => "Subject LIKE 'YATTA'",
    );
    is(@ids, 1, "pushed YATTA ticket to RT");
};