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