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 => 2 + 6;

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

our %Have;

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

  next  unless($Have{$db_type});

  Rose::DB::Object::Metadata->unregister_all_classes;
  Rose::DB->default_type($db_type);

  my $class_prefix = ucfirst($db_type);

  my $loader = 
    Rose::DB::Object::Loader->new(
      db           => Rose::DB->new,
      class_prefix => $class_prefix);

  my @classes = $loader->make_classes(include_tables => [ qw(rdbo_users rdbo_comments) ]);

  #foreach my $class (@classes)
  #{
  #  print $class->meta->perl_class_definition if($class->can('meta'));
  #}

  my $user_class    = $class_prefix . '::RdboUser';
  my $comment_class = $class_prefix . '::RdboComment';

  ok($user_class->meta->relationship('user1s'), "user1s rel - $db_type");
  ok($user_class->meta->relationship('user2s'), "user2s rel - $db_type");

  ok($comment_class->meta->foreign_key('user1'), "user1 fk - $db_type");
  ok($comment_class->meta->foreign_key('user2'), "user2 fk - $db_type");

  is($comment_class->meta->column('type')->type, 'enum', "enum - $db_type");
  is($comment_class->meta->column('type')->db_type, 'my_type', "custom type - $db_type");
}

BEGIN
{
  our %Have;

  #
  # Pg
  #

  my $dbh;

  eval
  {
    my $db = Rose::DB->new('pg_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 rdbo_comments');
      $dbh->do('DROP TABLE rdbo_users');
      $dbh->do('DROP TYPE my_type');
    }
  };

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

    $dbh->do(<<"EOF");
CREATE TABLE rdbo_users
(
  id INT NOT NULL PRIMARY KEY
)
EOF

    $dbh->do(<<"EOF");
CREATE TYPE my_type AS ENUM ('foo', 'bar')
EOF

    $dbh->do(<<"EOF");
CREATE TABLE rdbo_comments
(
  id        SERIAL NOT NULL PRIMARY KEY,
  user1_id  INTEGER NOT NULL REFERENCES rdbo_users (id),
  user2_id  INTEGER NOT NULL REFERENCES rdbo_users (id),
  type      MY_TYPE
)
EOF

    $dbh->disconnect;
  }
}

END
{
  # Delete test tables

  if($Have{'pg'})
  {
    my $dbh = Rose::DB->new('pg_admin')->retain_dbh()
      or die Rose::DB->error;

    $dbh->do('DROP TABLE rdbo_comments');
    $dbh->do('DROP TABLE rdbo_users');
    $dbh->do('DROP TYPE my_type');

    $dbh->disconnect;
  }
}