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