#!/usr/bin/perl -w use strict; use Test::More tests => 2 + (2 * 24); BEGIN { require 't/test-lib.pl'; use_ok('Rose::DB::Object'); use_ok('Rose::DB::Object::Loader'); } our(%HAVE, $DID_SETUP); $DID_SETUP = 0; # dumb # # Tests # #$Rose::DB::Object::Manager::Debug = 1; my $i = 1; foreach my $db_type (qw(pg pg_with_schema)) { SKIP: { skip("$db_type tests", 24) unless($HAVE{$db_type}); } next unless($HAVE{$db_type}); $i++; Rose::DB->default_type($db_type); Rose::DB::Object::Metadata->unregister_all_classes; my $class_prefix = ucfirst($db_type eq 'pg_with_schema' ? 'pgws' : $db_type); #$Rose::DB::Object::Metadata::Debug = 1; my $loader = Rose::DB::Object::Loader->new( db => Rose::DB->new, class_prefix => $class_prefix); my @classes = $loader->make_classes(include_tables => '(?i)Rose_db_object_test2?'); my $object_class = $class_prefix . '::RoseDbObjectTest'; ## ## Run tests ## if($db_type eq 'pg') { is_deeply(scalar $object_class->meta->primary_key->sequence_names, [ 'rose_db_object_test_id1_seq', 'rdbo_seq2' ], "pk sequence names 1 - $db_type"); } elsif($db_type eq 'pg_with_schema') { is_deeply(scalar $object_class->meta->primary_key->sequence_names, [ 'rose_db_object_private.rose_db_object_test_id1_seq', 'rose_db_object_private.rdbo_seq2' ], "pk sequence names 1 - $db_type"); } else { SKIP { skip("non-pg tests", 1); } } my $o = $object_class->new(name => "Sled $i"); $o->save; is($o->id1, 1, "pk 1 - $db_type"); is($o->id2, 1, "pk 2 - $db_type"); $o = $object_class->new(name => "Kite $i"); $o->save; is($o->id1, 2, "pk 3 - $db_type"); is($o->id2, 2, "pk 4 - $db_type"); my @seqs = $o->meta->primary_key->sequence_names; is(scalar @seqs, 2, "sequences 1 - $db_type"); is($seqs[0], ($db_type eq 'pg_with_schema' ? 'rose_db_object_private.' : '') . 'rose_db_object_test_id1_seq', "sequences 2 - $db_type"); is($seqs[1], ($db_type eq 'pg_with_schema' ? 'rose_db_object_private.' : '') . 'rdbo_seq2', "sequences 3 - $db_type"); $object_class .= '2'; if($db_type eq 'pg') { is_deeply(scalar $object_class->meta->primary_key->sequence_names, [ undef, 'rdbo_seq2_2' ], "pk sequence names 2 - $db_type"); } elsif($db_type eq 'pg_with_schema') { is_deeply(scalar $object_class->meta->primary_key->sequence_names, [ undef, 'rose_db_object_private.rdbo_seq2_2' ], "pk sequence names 2 - $db_type"); } else { SKIP { skip("non-pg tests", 1); } } $o = $object_class->new(id1 => 10, name => "Sled $i"); $o->save; is($o->id1, 10, "pk 5 - $db_type"); is($o->id2, 1, "pk 6 - $db_type"); $o = $object_class->new(id1 => 20, name => "Kite $i"); $o->save; is($o->id1, 20, "pk 7 - $db_type"); is($o->id2, 2, "pk 8 - $db_type"); @seqs = $o->meta->primary_key->sequence_names; is(scalar @seqs, 2, "sequences 4 - $db_type"); ok(!defined $seqs[0], "sequences 5 - $db_type"); is($seqs[1], ($db_type eq 'pg_with_schema' ? 'rose_db_object_private.' : '') . 'rdbo_seq2_2', "sequences 6 - $db_type"); if($db_type eq 'pg') { $o = MyPgObject->new(name => "Barn $i"); $o->save; is($o->id1, 3, "pk 9 - $db_type"); is($o->id2, 3, "pk 10 - $db_type"); $o = MyPgObject2->new(id1 => 30, name => "Barn $i"); $o->save; is($o->id1, 30, "pk 9 - $db_type"); is($o->id2, 3, "pk 10 - $db_type"); is_deeply(scalar MyPgObject->meta->primary_key->sequence_names, [ 'rose_db_object_test_id1_seq', 'rdbo_seq2' ], "pk sequence names 3 - $db_type"); is_deeply(scalar MyPgObject->meta->primary_key_sequence_names(MyPgObject->init_db), [ 'rose_db_object_test_id1_seq', 'rdbo_seq2' ], "pk sequence names 4 - $db_type"); is_deeply(scalar MyPgObject2->meta->primary_key->sequence_names, [ undef, 'rdbo_seq2_2' ], "pk sequence names 5 - $db_type"); is_deeply(scalar MyPgObject2->meta->primary_key_sequence_names(MyPgObject2->init_db), [ undef, 'rdbo_seq2_2' ], "pk sequence names 6 - $db_type"); } elsif($db_type eq 'pg_with_schema') { $o = MyPgWSObject->new(name => "Barn $i"); $o->save; is($o->id1, 3, "pk 9 - $db_type"); is($o->id2, 3, "pk 10 - $db_type"); $o = MyPgWSObject2->new(id1 => 30, name => "Barn $i"); $o->save; is($o->id1, 30, "pk 9 - $db_type"); is($o->id2, 3, "pk 10 - $db_type"); is_deeply(scalar MyPgWSObject->meta->primary_key->sequence_names, [ 'Rose_db_object_private.rose_db_object_test_id1_seq', 'Rose_db_object_private.rdbo_seq2' ], "pk sequence names 3 - $db_type"); is_deeply(scalar MyPgWSObject->meta->primary_key_sequence_names(MyPgWSObject->init_db), [ 'Rose_db_object_private.rose_db_object_test_id1_seq', 'Rose_db_object_private.rdbo_seq2' ], "pk sequence names 4 - $db_type"); is_deeply(scalar MyPgWSObject2->meta->primary_key->sequence_names, [ undef, 'Rose_db_object_private.rdbo_seq2_2' ], "pk sequence names 5 - $db_type"); is_deeply(scalar MyPgWSObject2->meta->primary_key_sequence_names(MyPgWSObject2->init_db), [ undef, 'Rose_db_object_private.rdbo_seq2_2' ], "pk sequence names 6 - $db_type"); } else { SKIP { skip("non-pg tests", 8); } } } BEGIN { our %HAVE; # # PostgreSQL # my $dbh; eval { $dbh = Rose::DB->new('pg_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { $HAVE{'pg'} = 1; $HAVE{'pg_with_schema'} = 1; # Drop existing tables and create schema, ignoring errors { local $dbh->{'RaiseError'} = 0; local $dbh->{'PrintError'} = 0; $dbh->do('DROP TABLE Rose_db_object_test'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_test'); $dbh->do('DROP TABLE Rose_db_object_test2 CASCADE'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_test2 CASCADE'); $dbh->do('CREATE SCHEMA Rose_db_object_private'); $dbh->do('DROP SEQUENCE rdbo_seq2'); $dbh->do('DROP SEQUENCE rdbo_seq2_2'); $dbh->do('DROP SEQUENCE Rose_db_object_private.rdbo_seq2'); $dbh->do('DROP SEQUENCE Rose_db_object_private.rdbo_seq2_2'); $dbh->do('CREATE SEQUENCE rdbo_seq2'); $dbh->do('CREATE SEQUENCE rdbo_seq2_2'); $dbh->do('CREATE SEQUENCE Rose_db_object_private.rdbo_seq2'); $dbh->do('CREATE SEQUENCE Rose_db_object_private.rdbo_seq2_2'); } $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_test ( id1 SERIAL NOT NULL, id2 INT NOT NULL DEFAULT nextval('rdbo_seq2'), name VARCHAR(255), PRIMARY KEY (id1, id2) ) EOF $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_private.Rose_db_object_test ( id1 SERIAL NOT NULL, id2 INT NOT NULL DEFAULT nextval('Rose_db_object_private.rdbo_seq2'), name VARCHAR(255), PRIMARY KEY (id1, id2) ) EOF $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_test2 ( id1 INT NOT NULL, id2 INT NOT NULL DEFAULT nextval('rdbo_seq2_2'), name VARCHAR(255), PRIMARY KEY (id1, id2) ) EOF $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_private.Rose_db_object_test2 ( id1 INT NOT NULL, id2 INT NOT NULL DEFAULT nextval('Rose_db_object_private.rdbo_seq2_2'), name VARCHAR(255), PRIMARY KEY (id1, id2) ) EOF $dbh->disconnect; package MyPgObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } MyPgObject->meta->table('Rose_db_object_test'); MyPgObject->meta->columns(id1 => { type => 'serial' }, qw(id2 name)); MyPgObject->meta->column('id2')->default_value_sequence_name('rdbo_seq2'); MyPgObject->meta->primary_key_columns(qw(id1 id2)); MyPgObject->meta->initialize; package MyPgWSObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg_with_schema') } MyPgWSObject->meta->table('Rose_db_object_test'); MyPgWSObject->meta->columns(qw(id1 id2 name)); MyPgWSObject->meta->primary_key_columns(qw(id1 id2)); MyPgWSObject->meta->primary_key->sequence_names( 'Rose_db_object_private.rose_db_object_test_id1_seq', 'Rose_db_object_private.rdbo_seq2'); MyPgWSObject->meta->initialize; package MyPgObject2; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } MyPgObject2->meta->table('Rose_db_object_test2'); MyPgObject2->meta->columns(qw(id1 id2 name)); MyPgObject2->meta->column('id2')->default_value_sequence_name('rdbo_seq2_2'); MyPgObject2->meta->primary_key_columns(qw(id1 id2)); MyPgObject2->meta->initialize; package MyPgWSObject2; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg_with_schema') } MyPgWSObject2->meta->table('Rose_db_object_test2'); MyPgWSObject2->meta->columns(qw(id1 id2 name)); MyPgWSObject2->meta->primary_key_columns(qw(id1 id2)); MyPgWSObject2->meta->primary_key->sequence_names( undef, 'Rose_db_object_private.rdbo_seq2_2'); MyPgWSObject2->meta->initialize; } } END { # Delete test table if($HAVE{'pg'}) { # PostgreSQL my $dbh = Rose::DB->new('pg_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE Rose_db_object_test CASCADE'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_test CASCADE'); $dbh->do('DROP TABLE Rose_db_object_test2 CASCADE'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_test2 CASCADE'); $dbh->do('DROP SEQUENCE rdbo_seq2'); $dbh->do('DROP SEQUENCE rdbo_seq2_2'); $dbh->do('DROP SEQUENCE Rose_db_object_private.rdbo_seq2'); $dbh->do('DROP SEQUENCE Rose_db_object_private.rdbo_seq2_2'); $dbh->do('DROP SCHEMA Rose_db_object_private CASCADE'); $dbh->disconnect; } }