#!/usr/bin/perl -w use strict; use Test::More tests => 82; BEGIN { require 't/test-lib.pl'; use_ok('Rose::DB::Object'); use_ok('Rose::DB::Object::Manager'); } our(%HAVE, $DID_SETUP); # # Tests # #$Rose::DB::Object::Manager::Debug = 1; foreach my $db_type (qw(mysql pg pg_with_schema informix sqlite)) { SKIP: { skip("$db_type tests", 16) unless($HAVE{$db_type}); } next unless($HAVE{$db_type}); Rose::DB->default_type($db_type); unless($DID_SETUP++) { # # Setup classes # package MD; our @ISA = qw(Rose::DB::Object); MD->meta->table('Rose_db_object_MD'); MD->meta->columns(ID => { primary_key => 1 }); MD->meta->relationships ( 'mdvs' => { type => 'one to many', class => 'MDV', column_map => { ID => 'MD' }, } ); MD->meta->initialize; package MD::Mgr; our @ISA = qw(Rose::DB::Object::Manager); sub object_class { 'MD' } Rose::DB::Object::Manager->make_manager_methods('mds'); package MDV; our @ISA = qw(Rose::DB::Object); MDV->meta->table('Rose_db_object_MDV'); MDV->meta->columns ( ID => { primary_key => 1 }, MD => { type => 'int' }, ); MDV->meta->relationships ( 'md' => { type => 'many to one', class => 'MD', column_map => { MD => 'ID' }, } ); MDV->meta->initialize; } #else #{ # MD->meta->init_with_db(Rose::DB->new); # MDV->meta->init_with_db(Rose::DB->new); #} # Add data my $dbh = MD->init_db->retain_dbh; my $schema = $db_type eq 'pg_with_schema' ? 'Rose_db_object_private.' : ''; for(1 .. 3) { $dbh->do("INSERT INTO ${schema}Rose_db_object_MD (ID) VALUES ($_)"); } for(1 .. 2) { $dbh->do("INSERT INTO ${schema}Rose_db_object_MDV (ID, MD) VALUES ($_, 1)"); } # Run tests my $i = 0; foreach my $arg (qw(MD mdvs.MD t2.MD Rose_db_object_MDV.MD)) { $i++; my $mds = MD::Mgr->get_mds(distinct => 1, with_objects => [ 'mdvs' ], query => [ 'MD' => undef ], sort_by => 'ID'); ok($mds, "get_mds() $i.1 - $db_type"); ok(@$mds == 2, "get_mds() $i.2 - $db_type"); is($mds->[0]->ID, 2, "get_mds() $i.3 - $db_type"); is($mds->[1]->ID, 3, "get_mds() $i.4 - $db_type"); } } 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_MD'); $dbh->do('DROP TABLE Rose_db_object_MDV'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_MD'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_MDV'); $dbh->do('CREATE SCHEMA Rose_db_object_private'); } our $PG_HAS_CHKPASS = pg_has_chkpass(); $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_MD ( ID SERIAL NOT NULL PRIMARY KEY ) EOF $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_MDV ( ID SERIAL NOT NULL PRIMARY KEY, MD INT NOT NULL ) EOF $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_private.Rose_db_object_MD ( ID SERIAL NOT NULL PRIMARY KEY ) EOF $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_private.Rose_db_object_MDV ( ID SERIAL NOT NULL PRIMARY KEY, MD INT NOT NULL ) EOF $dbh->disconnect; } # # MySQL # eval { $dbh = Rose::DB->new('mysql_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { $HAVE{'mysql'} = 1; # Drop existing tables, ignoring errors { local $dbh->{'RaiseError'} = 0; local $dbh->{'PrintError'} = 0; $dbh->do('DROP TABLE Rose_db_object_MD'); $dbh->do('DROP TABLE Rose_db_object_MDV'); } our $PG_HAS_CHKPASS = 1 unless($@); $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_MD ( ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY ) EOF $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_MDV ( ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, MD INT NOT NULL ) EOF $dbh->disconnect; } # # Informix # eval { $dbh = Rose::DB->new('informix_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { $HAVE{'informix'} = 1; # Drop existing tables, ignoring errors { local $dbh->{'RaiseError'} = 0; local $dbh->{'PrintError'} = 0; $dbh->do('DROP TABLE Rose_db_object_MD'); $dbh->do('DROP TABLE Rose_db_object_MDV'); } our $PG_HAS_CHKPASS = 1 unless($@); $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_MD ( ID SERIAL NOT NULL PRIMARY KEY ) EOF $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_MDV ( ID SERIAL NOT NULL PRIMARY KEY, MD INT NOT NULL ) EOF $dbh->disconnect; } # # SQLite # eval { $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { $HAVE{'sqlite'} = 1; # Drop existing tables, ignoring errors { local $dbh->{'RaiseError'} = 0; local $dbh->{'PrintError'} = 0; $dbh->do('DROP TABLE Rose_db_object_MD'); $dbh->do('DROP TABLE Rose_db_object_MDV'); } our $PG_HAS_CHKPASS = 1 unless($@); $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_MD ( ID INTEGER PRIMARY KEY AUTOINCREMENT ) EOF $dbh->do(<<"EOF"); CREATE TABLE Rose_db_object_MDV ( ID INTEGER PRIMARY KEY AUTOINCREMENT, MD INT NOT NULL ) EOF $dbh->disconnect; } } 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_MD'); $dbh->do('DROP TABLE Rose_db_object_MDV'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_MD'); $dbh->do('DROP TABLE Rose_db_object_private.Rose_db_object_MDV'); $dbh->do('DROP SCHEMA Rose_db_object_private CASCADE'); $dbh->disconnect; } 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_MD'); $dbh->do('DROP TABLE Rose_db_object_MDV'); $dbh->disconnect; } if($HAVE{'informix'}) { # Informix my $dbh = Rose::DB->new('informix_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE Rose_db_object_MD'); $dbh->do('DROP TABLE Rose_db_object_MDV'); $dbh->disconnect; } if($HAVE{'sqlite'}) { # SQLite my $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE Rose_db_object_MD'); $dbh->do('DROP TABLE Rose_db_object_MDV'); $dbh->disconnect; } }