The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use strict;
use warnings;

use Test::More tests => 13;
use Test::DBUnit connection_name => 'test';


BEGIN {
    use_ok('Persistence::Entity::Manager');
    use_ok('Persistence::Entity', ':all');
}


my $emp_entity = Persistence::Entity->new(
    name    => 'emp',
    alias   => 'ur',
    primary_key => ['empno'],
    columns => [
        sql_column(name => 'empno'),
        sql_column(name => 'ename', unique => 1),
        sql_column(name => 'job'),
        sql_column(name => 'deptno'),
    ],
);

my $dept_entity = Persistence::Entity->new(
    name    => 'dept',
    alias   => 'dp',
    primary_key => ['deptno'],
    columns => [
        sql_column(name => 'deptno'),
        sql_column(name => 'dname', unique => 1),
        sql_column(name => 'loc')
    ],
    to_many_relationships => [sql_relationship(target_entity => $emp_entity, join_columns => ['deptno'], order_by => 'deptno, empno')]
);


{
    my $entity_manager = Persistence::Entity::Manager->new(name => 'my_manager', connection_name => 'test');
    $entity_manager->add_entities($dept_entity, $emp_entity);
}

{
    eval {
        $dept_entity->relationship_insert('fake_relation');
    };
    ok($@, 'should catch unknown relation error - insert');

    eval {
        $dept_entity->relationship_merge('fake_relation');
    };
    ok($@, 'should catch unknown relation error - merge');

    eval {
        $dept_entity->relationship_delete('fake_relation');
    };
    ok($@, 'should catch unknown relation error - delete');

    
}


SKIP: {
    
    ::skip('missing env varaibles DB_TEST_CONNECTION, DB_TEST_USERNAME DB_TEST_PASSWORD', 8)
      unless $ENV{DB_TEST_CONNECTION};

    my $connection = DBIx::Connection->new(
      name     => 'test',
      dsn      => $ENV{DB_TEST_CONNECTION},
      username => $ENV{DB_TEST_USERNAME},
      password => $ENV{DB_TEST_PASSWORD},
    ); 


    eval {
        $dept_entity->relationship_merge('emp', {loc => 'dept1'} , [{empno => 11, ename => 'emp11'}, {empno => 12, ename => 'emp12'}]);
    };
    like($@, qr{primary key values}, 'should catch cant get primary key values error - merge');

    eval {
        $dept_entity->relationship_delete('emp', {loc => 'dept1'} , [{empno => 11, ename => 'emp11'}, {empno => 12, ename => 'emp12'}]);
    };
    like($@, qr{primary key values}, 'should catch cant get primary key values error - delete');


    SKIP: {

        my $dbms_name  = $connection->dbms_name;
            skip('Tests are not prepared for ' . $dbms_name , 7)
                unless -d "t/sql/". $connection->dbms_name;
                
        reset_schema_ok("t/sql/". $connection->dbms_name . "/create_schema.sql");
        
        xml_dataset_ok('init');
        
        {
            my @emp = $dept_entity->relationship_query('emp', undef => undef, dname => 'dept3');
            ::is_deeply(\@emp, [
                {the_rowid => 1, deptno => 3, ename => 'emp1', 'job' => undef, empno => 1},
                {the_rowid => 3, deptno => 3, ename => 'emp3', 'job' => undef, empno => 3},
                ], 'should fetch relationship rows');
        }
        
        $dept_entity->relationship_insert('emp', {dname => 'dept1'} , {empno => 11, ename => 'emp11'}, {empno => 12, ename => 'emp12'});
        expected_xml_dataset_ok('insert');
    
        $dept_entity->relationship_merge('emp', {dname => 'dept3'} , {empno => 13, ename => 'emp13'}, {empno => 1, ename => 'emp1', job => 'sales assistant'});
        expected_xml_dataset_ok('merge');
        
        $dept_entity->relationship_delete('emp', {dname => 'dept1'}, {ename => 'emp11'}, {ename => 'emp12'});
        expected_xml_dataset_ok('delete');
    }
}