1#!/usr/bin/perl -w 2 3use strict; 4 5use Test::More tests => 1 + (5 * 4); 6 7BEGIN 8{ 9 require 't/test-lib.pl'; 10 use_ok('Rose::DB::Object::Loader'); 11} 12 13our %Have; 14 15# 16# Tests 17# 18 19#$Rose::DB::Object::Manager::Debug = 1; 20 21foreach my $db_type (qw(mysql pg informix sqlite)) 22{ 23 SKIP: 24 { 25 skip("$db_type tests", 5) unless($Have{$db_type}); 26 } 27 28 next unless($Have{$db_type}); 29 30 Rose::DB::Object::Metadata->unregister_all_classes; 31 Rose::DB->default_type($db_type); 32 33 my $class_prefix = ucfirst($db_type); 34 35 my $loader = 36 Rose::DB::Object::Loader->new( 37 db => Rose::DB->new, 38 class_prefix => $class_prefix); 39 40 my @classes = $loader->make_classes(include_tables => '^(foos|bars)$'); 41 42 #foreach my $class (@classes) 43 #{ 44 # print $class->meta->perl_class_definition if($class->can('meta')); 45 #} 46 47 my $foo_class = $class_prefix . '::Foo'; 48 my $bar_class = $class_prefix . '::Bar'; 49 50 is($foo_class->meta->relationship('bar')->type, 'one to one', "check rel type - $db_type"); 51 52 my $bar = $bar_class->new; 53 my $foo = $foo_class->new(foo => 'xyz'); 54 55 #$Rose::DB::Object::Debug = 1; 56 57 $foo->bar($bar); 58 $foo->bar->bar('some text'); 59 $foo->save; 60 61 my $check_foo = $foo_class->new(id => $foo->id)->load; 62 my $check_bar = $bar_class->new(foo_id => $bar->foo_id)->load; 63 64 is($check_foo->foo, 'xyz', "check foo - $db_type"); 65 is($check_bar->bar, 'some text', "check bar - $db_type"); 66 67 is($bar_class->meta->relationship('foo')->type, 'one to one', "check foo one to one - $db_type"); 68 is($bar_class->meta->relationship('foo')->foreign_key, 69 $bar_class->meta->foreign_key('foo'), "check foo fk rel - $db_type"); 70 71 #foreach my $rel ($bar_class->meta->relationships) 72 #{ 73 # print $rel->name, ' ', $rel->type, "\n"; 74 #} 75} 76 77BEGIN 78{ 79 our %Have; 80 81 # 82 # PostgreSQL 83 # 84 85 my $dbh; 86 87 eval 88 { 89 $dbh = Rose::DB->new('pg_admin')->retain_dbh() 90 or die Rose::DB->error; 91 }; 92 93 if(!$@ && $dbh) 94 { 95 $Have{'pg'} = 1; 96 $Have{'pg_with_schema'} = 1; 97 98 # Drop existing tables and create schema, ignoring errors 99 { 100 local $dbh->{'RaiseError'} = 0; 101 local $dbh->{'PrintError'} = 0; 102 103 $dbh->do('DROP TABLE bars CASCADE'); 104 $dbh->do('DROP TABLE foos CASCADE'); 105 } 106 107 $dbh->do(<<"EOF"); 108CREATE TABLE foos 109( 110 id SERIAL NOT NULL PRIMARY KEY, 111 foo VARCHAR(255) 112) 113EOF 114 115 $dbh->do(<<"EOF"); 116CREATE TABLE bars 117( 118 foo_id INT NOT NULL PRIMARY KEY REFERENCES foos (id), 119 bar VARCHAR(255) 120) 121EOF 122 123 $dbh->disconnect; 124 } 125 126 # 127 # MySQL 128 # 129 130 eval 131 { 132 my $db = Rose::DB->new('mysql_admin'); 133 $dbh = $db->retain_dbh or die Rose::DB->error; 134 135 die "No innodb support" unless(mysql_supports_innodb()); 136 137 # Drop existing tables, ignoring errors 138 { 139 local $dbh->{'RaiseError'} = 0; 140 local $dbh->{'PrintError'} = 0; 141 142 $dbh->do('DROP TABLE bars CASCADE'); 143 $dbh->do('DROP TABLE foos CASCADE'); 144 } 145 }; 146 147 if(!$@ && $dbh) 148 { 149 $Have{'mysql'} = 1; 150 151 $dbh->do(<<"EOF"); 152CREATE TABLE foos 153( 154 id INT AUTO_INCREMENT PRIMARY KEY, 155 foo VARCHAR(255) 156) 157ENGINE=InnoDB 158EOF 159 160 $dbh->do(<<"EOF"); 161CREATE TABLE bars 162( 163 foo_id INT PRIMARY KEY, 164 bar VARCHAR(255), 165 166 INDEX(foo_id), 167 168 FOREIGN KEY (foo_id) REFERENCES foos (id) 169) 170ENGINE=InnoDB 171EOF 172 173 $dbh->disconnect; 174 } 175 176 # 177 # Informix 178 # 179 180 eval 181 { 182 $dbh = Rose::DB->new('informix_admin')->retain_dbh() 183 or die Rose::DB->error; 184 }; 185 186 if(!$@ && $dbh) 187 { 188 $Have{'informix'} = 1; 189 190 # Drop existing tables and create schema, ignoring errors 191 { 192 local $dbh->{'RaiseError'} = 0; 193 local $dbh->{'PrintError'} = 0; 194 195 $dbh->do('DROP TABLE bars CASCADE'); 196 $dbh->do('DROP TABLE foos CASCADE'); 197 } 198 199 $dbh->do(<<"EOF"); 200CREATE TABLE foos 201( 202 id SERIAL NOT NULL PRIMARY KEY, 203 foo VARCHAR(255) 204) 205EOF 206 207 $dbh->do(<<"EOF"); 208CREATE TABLE bars 209( 210 foo_id INT NOT NULL PRIMARY KEY REFERENCES foos (id), 211 bar VARCHAR(255) 212) 213EOF 214 215 $dbh->disconnect; 216 } 217 218 # 219 # SQLite 220 # 221 222 eval 223 { 224 $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() 225 or die Rose::DB->error; 226 }; 227 228 if(!$@ && $dbh) 229 { 230 $Have{'sqlite'} = 1; 231 232 # Drop existing tables and create schema, ignoring errors 233 { 234 local $dbh->{'RaiseError'} = 0; 235 local $dbh->{'PrintError'} = 0; 236 237 $dbh->do('DROP TABLE bars'); 238 $dbh->do('DROP TABLE foos'); 239 } 240 241 $dbh->do(<<"EOF"); 242CREATE TABLE foos 243( 244 id INTEGER PRIMARY KEY AUTOINCREMENT, 245 foo VARCHAR(255) 246) 247EOF 248 249 $dbh->do(<<"EOF"); 250CREATE TABLE bars 251( 252 foo_id INTEGER PRIMARY KEY AUTOINCREMENT REFERENCES foos (id), 253 bar VARCHAR(255) 254) 255EOF 256 257 $dbh->disconnect; 258 } 259} 260 261END 262{ 263 # Delete test table 264 265 if($Have{'pg'}) 266 { 267 # PostgreSQL 268 my $dbh = Rose::DB->new('pg_admin')->retain_dbh() 269 or die Rose::DB->error; 270 271 $dbh->do('DROP TABLE bars CASCADE'); 272 $dbh->do('DROP TABLE foos CASCADE'); 273 274 $dbh->disconnect; 275 } 276 277 if($Have{'mysql'}) 278 { 279 # MySQL 280 my $dbh = Rose::DB->new('mysql_admin')->retain_dbh() 281 or die Rose::DB->error; 282 283 $dbh->do('DROP TABLE bars CASCADE'); 284 $dbh->do('DROP TABLE foos CASCADE'); 285 286 $dbh->disconnect; 287 } 288 289 if($Have{'informix'}) 290 { 291 # Informix 292 my $dbh = Rose::DB->new('informix_admin')->retain_dbh() 293 or die Rose::DB->error; 294 295 $dbh->do('DROP TABLE bars CASCADE'); 296 $dbh->do('DROP TABLE foos CASCADE'); 297 298 $dbh->disconnect; 299 } 300 301 if($Have{'sqlite'}) 302 { 303 # Informix 304 my $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() 305 or die Rose::DB->error; 306 307 $dbh->do('DROP TABLE bars'); 308 $dbh->do('DROP TABLE foos'); 309 310 $dbh->disconnect; 311 } 312} 313