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

use strict;

use Test::More tests => 3;

BEGIN 
{
  require 't/test-lib.pl';
  use_ok('Rose::DB::Object');
  use_ok('Rose::DB::Object::Manager');
}

if(defined $ENV{'RDBO_NESTED_JOINS'} && Rose::DB::Object::Manager->can('default_nested_joins'))
{
  Rose::DB::Object::Manager->default_nested_joins($ENV{'RDBO_NESTED_JOINS'});
}

our %Have;

#
# Tests
#

foreach my $db_type (qw(mysql))
{
  SKIP:
  {
    skip("$db_type tests", 1)  unless($Have{$db_type});
  }

  next  unless($Have{$db_type});

  Rose::DB->default_type($db_type);

  my $class = ucfirst($db_type) . '::A';

  my $as =
    Rose::DB::Object::Manager->get_objects(
      #debug => 1,
      object_class => $class,
      with_objects => [ 'bs.c' ]);

  is(scalar @$as, 2, "check count - $db_type");
}

BEGIN
{
  our %Have;

  #
  # MySQL
  #

  my $dbh;

  eval
  {
    my $db = Rose::DB->new('mysql_admin');
    $dbh = $db->retain_dbh or die Rose::DB->error;

    # Drop existing tables, ignoring errors
    {
      local $dbh->{'RaiseError'} = 0;
      local $dbh->{'PrintError'} = 0;
      $dbh->do('DROP TABLE rose_db_object_test_b');
      $dbh->do('DROP TABLE rose_db_object_test_a');
      $dbh->do('DROP TABLE rose_db_object_test_c');
    }
  };

  if(!$@ && $dbh)
  {
    $Have{'mysql'} = 1;

    $dbh->do(<<"EOF");
CREATE TABLE rose_db_object_test_a
(
  id   INT PRIMARY KEY, 
  name VARCHAR(255)
)
EOF

    $dbh->do(<<"EOF");
CREATE TABLE rose_db_object_test_c
(
  id   INT PRIMARY KEY,
  name VARCHAR(255));
EOF

    $dbh->do(<<"EOF");
CREATE TABLE rose_db_object_test_b 
(
  id   INT PRIMARY KEY,
  name VARCHAR(255),
  a_id INT NOT NULL REFERENCES a (id),
  c_id INT NOT NULL REFERENCES c (id)
)
EOF

    Rose::DB->default_type('mysql');

    package Mysql::A;
    our @ISA = qw(Rose::DB::Object);

    __PACKAGE__->meta->setup
    (
      table => 'rose_db_object_test_a',

      columns => [ qw(id name) ],

      relationships =>
      [
        bs =>
        {
          type => 'one to many',
          class => 'Mysql::B',
          column_map => { id => 'a_id' },
        },
      ],
    );

    package Mysql::B;
    our @ISA = qw(Rose::DB::Object);

    __PACKAGE__->meta->setup
    (
      table => 'rose_db_object_test_b',

      columns => 
      [
        id => { type => 'serial', primary_key => 1 },
        name => { type => 'varchar', length => 255 },
        a_id => { type => 'integer', not_null => 1 },
        c_id => { type => 'integer', not_null => 1 },
      ],

      foreign_keys =>
      [
        a =>
        {
          class => 'Mysql::A',
          key_columns => { a_id => 'id' },
        },

        c =>
        {
          class => 'Mysql::C',
          key_columns => { a_id => 'id' },
        }
      ],
    );

    package Mysql::C;
    our @ISA = qw(Rose::DB::Object);

    __PACKAGE__->meta->setup
    (
      table => 'rose_db_object_test_c',

      columns => 
      [
        id => { type => 'serial', primary_key => 1 },
        name => { type => 'varchar', length => 255 },
      ]
    );

    $dbh->do("insert into rose_db_object_test_a (id, name) values (1, 'one')");
    $dbh->do("insert into rose_db_object_test_a (id, name) values (2, 'two')");
    $dbh->do("insert into rose_db_object_test_c (id, name) values (1, 'c one')");
    $dbh->do("insert into rose_db_object_test_c (id, name) values (2, 'c two')");
    $dbh->do("insert into rose_db_object_test_b (id, name, a_id, c_id) values (1, 'b one', 1, 1)");

    $dbh->disconnect;
  }
}

END
{
  # Delete test tables

  if($Have{'mysql'})
  {
    # MySQL
    my $dbh = Rose::DB->new('mysql_admin')->retain_dbh()
      or die Rose::DB->error;

    $dbh->do('DROP TABLE rose_db_object_test_b');
    $dbh->do('DROP TABLE rose_db_object_test_a');
    $dbh->do('DROP TABLE rose_db_object_test_c');
    $dbh->disconnect;
  }
}