1#!/usr/bin/perl -w 2 3use strict; 4 5use Test::More tests => 8; 6 7BEGIN 8{ 9 require 't/test-lib.pl'; 10 use_ok('Rose::DB::Object'); 11} 12 13our %Have; 14 15# 16# Tests 17# 18 19#$Rose::DB::Object::Manager::Debug = 1; 20 21SKIP: 22{ 23 skip("pg tests", 7) unless($Have{'pg'}); 24 25 my $db_pg = Rose::DB->new('pg'); 26 my $db_ws = Rose::DB->new('pg_with_schema'); 27 28 # Albums should take on the schema of the db handle 29 my $a1 = Album->new(db => $db_pg, name => 'One', year => 2001)->save; 30 my $a2 = Album->new(db => $db_ws, name => 'One', year => 2002)->save; 31 32 is($a1->id, 1, 'flex schema 1'); 33 is($a2->id, 1, 'flex schema 2'); 34 35 # Album photos should NOT take on the schema of the db handle 36 my $p1 = AlbumPhoto->new(db => $db_pg, album_id => 1, name => '1.1')->save; 37 my $p2 = AlbumPhoto->new(db => $db_ws, album_id => 1, name => '1.2')->save; 38 39 is($p1->id, 1, 'flex schema 1'); 40 is($p2->id, 2, 'flex schema 2'); 41 42 # Make sure both albums read the same album photos table 43 is_deeply([ map { $_->name } sort { $a->id <=> $b->id } $a1->album_photos ], 44 [ '1.1', '1.2' ], 'single photos table 1'); 45 46 is_deeply([ map { $_->name } sort { $a->id <=> $b->id } $a2->album_photos ], 47 [ '1.1', '1.2' ], 'single photos table 2'); 48 49 $a1 = Album->new(id => $a1->id); 50 $a1->load(with => 'album_photos'); 51 52 is_deeply([ map { $_->name } sort { $a->id <=> $b->id } $a1->album_photos ], 53 [ '1.1', '1.2' ], 'single photos table 3'); 54} 55 56BEGIN 57{ 58 our %Have; 59 60 # 61 # PostgreSQL 62 # 63 64 my $dbh; 65 66 eval 67 { 68 $dbh = Rose::DB->new('pg_admin')->retain_dbh() 69 or die Rose::DB->error; 70 }; 71 72 if(!$@ && $dbh) 73 { 74 $Have{'pg'} = 1; 75 $Have{'pg_with_schema'} = 1; 76 77 # Drop existing tables and create schema, ignoring errors 78 { 79 local $dbh->{'RaiseError'} = 0; 80 local $dbh->{'PrintError'} = 0; 81 $dbh->do('DROP TABLE Rose_db_object_private.rdbo_album_photos CASCADE'); 82 $dbh->do('DROP TABLE Rose_db_object_private.rdbo_albums CASCADE'); 83 $dbh->do('DROP TABLE rdbo_albums CASCADE'); 84 $dbh->do('CREATE SCHEMA Rose_db_object_private'); 85 } 86 87 $dbh->do(<<"EOF"); 88CREATE TABLE rdbo_albums 89( 90 id SERIAL PRIMARY KEY, 91 name VARCHAR(32) UNIQUE, 92 artist VARCHAR(32), 93 year INTEGER 94) 95EOF 96 97 $dbh->do(<<"EOF"); 98CREATE TABLE Rose_db_object_private.rdbo_albums 99( 100 id SERIAL PRIMARY KEY, 101 name VARCHAR(32) UNIQUE, 102 artist VARCHAR(32), 103 year INTEGER 104) 105EOF 106 107 $dbh->do(<<"EOF"); 108CREATE TABLE Rose_db_object_private.rdbo_album_photos 109( 110 id SERIAL PRIMARY KEY, 111 album_id INT REFERENCES rdbo_albums (id), 112 name VARCHAR(32) 113) 114EOF 115 116 $dbh->disconnect; 117 118 Rose::DB->default_type('pg'); 119 120 package MyCM; 121 our @ISA = qw(Rose::DB::Object::ConventionManager); 122 sub auto_relationship_name_one_to_many 123 { 124 my($self, $table, $class) = @_; 125 return $self->auto_class_to_relationship_name_plural($class); 126 } 127 128 package Album; 129 our @ISA = qw(Rose::DB::Object); 130 Album->meta->convention_manager('MyCM'); 131 Album->meta->table('rdbo_albums'); 132 Album->meta->auto_initialize; 133 134 package AlbumPhoto; 135 our @ISA = qw(Rose::DB::Object); 136 AlbumPhoto->meta->convention_manager('MyCM'); 137 AlbumPhoto->meta->table('rdbo_album_photos'); 138 AlbumPhoto->meta->schema('Rose_db_object_private'); 139 AlbumPhoto->meta->auto_initialize; 140 } 141} 142 143END 144{ 145 # Delete test table 146 147 if($Have{'pg'}) 148 { 149 # PostgreSQL 150 my $dbh = Rose::DB->new('pg_admin')->retain_dbh() 151 or die Rose::DB->error; 152 153 $dbh->do('DROP TABLE Rose_db_object_private.rdbo_album_photos CASCADE'); 154 $dbh->do('DROP TABLE Rose_db_object_private.rdbo_albums CASCADE'); 155 $dbh->do('DROP TABLE rdbo_albums CASCADE'); 156 $dbh->do('DROP SCHEMA Rose_db_object_private CASCADE'); 157 158 $dbh->disconnect; 159 } 160} 161