The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#-*-perl-*-
#$Id: 003_objs.t 419 2014-05-10 20:10:23Z maj $
use Test::More tests => 35;
use Module::Build;
use lib '../lib';
use strict;
use warnings;

#$SIG{__DIE__} = sub { print $_[0] };

no warnings qw(once);
my $build;
my ($user,$pass);

eval {
    $build = Module::Build->current;
    $user = $build->notes('user');
    $pass = $build->notes('pass');
};
my $TEST_SERVER = $build ? $build->notes('test_server') : 'http://127.0.0.1:7474';
my $num_live_tests = 34;


use_ok('REST::Neo4p');

my $not_connected;

eval {
  REST::Neo4p->connect($TEST_SERVER,$user,$pass);
};
if ( my $e = REST::Neo4p::CommException->caught() ) {
  $not_connected = 1;
  diag "Test server unavailable : tests skipped";
}

SKIP : {
    skip 'no connection to neo4j',$num_live_tests if $not_connected;
    ok my $node = REST::Neo4p::Node->new(), 'create new node';
    isa_ok($node, 'REST::Neo4p::Entity');
    isa_ok($node, 'REST::Neo4p::Node');
    ok $node->remove, "remove the node";

    ok my $node2 = REST::Neo4p::Node->new({ a => 1 }), 'create node with props';
    is $node2->get_property('a'), 1, 'property created';
    1;
    ok $node2->set_property( { foo => 'bar', goob => 12 } ), 'set props';
    is_deeply [$node2->get_property('foo','goob')], ['bar',12], 'get props singly';
    is_deeply $node2->get_properties, { a => 1, foo => 'bar', goob => 12 }, 'get all props at once';
    ok my $node1 = REST::Neo4p::Node->new(), 'make node1';
    ok my $rel12 = $node1->relate_to($node2, 'is_a'), 'relate n1 to n2';
    ok my $rel21 = $node2->relate_to($node1, 'parent', { type => 'adoptive' }), 'relate n2 to n1, with property';
    is $rel12->type, 'is_a', 'get rel12 type';
    is $rel21->type, 'parent', 'get rel21 type';
    is $rel21->get_property('type'), 'adoptive', 'rel21 property retrieved';
    is_deeply $rel21->get_properties, { type => 'adoptive' }, 'rel21 all props at once';

    ok my @relns = $node1->get_relationships, 'get all relationships on n1';
    is scalar @relns, 2, '1 in and 1 out';
    for (@relns) {
	isa_ok($_, 'REST::Neo4p::Relationship');
    }
    ok @relns = $node1->get_relationships('in'), 'get incoming relationships';
    is ${$relns[0]}, $$rel21, 'got incoming reln';
    ok @relns = $node1->get_relationships('out'), 'get outgoing relationships';
    is ${$relns[0]}, $$rel12, 'got outgoing reln';

    # start_node, end_node (0.127)
    isa_ok($rel21->start_node, 'REST::Neo4p::Node');
    isa_ok($rel21->end_node, 'REST::Neo4p::Node');
    is $rel21->start_node->id, $node2->id, 'got start node';
    is $rel21->end_node->id, $node1->id, 'got end node';
    is $rel12->start_node->id, $node1->id, 'got start node';
    is $rel12->end_node->id, $node2->id, 'got end node';
    
    CLEANUP : {    
	ok $rel12->remove, 'remove relationship n1 to n2';
	ok $rel21->remove, 'remove relationship n2 to n1';
	ok $node1->remove, 'remove n1';
	ok $node2->remove, 'remove n2';
    }


}