1#!/usr/bin/perl -w
2
3use strict;
4
5use Test::More tests => 1 + (5 * 1);
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(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  my $dbh;
82
83  #
84  # SQLite
85  #
86
87  eval
88  {
89    $dbh = Rose::DB->new('sqlite_admin')->retain_dbh()
90      or die Rose::DB->error;
91  };
92
93  if(!$@ && $dbh)
94  {
95    $Have{'sqlite'} = 1;
96
97    # Drop existing tables and create schema, ignoring errors
98    {
99      local $dbh->{'RaiseError'} = 0;
100      local $dbh->{'PrintError'} = 0;
101
102      $dbh->do('DROP TABLE bars');
103      $dbh->do('DROP TABLE foos');
104    }
105
106    $dbh->do(<<"EOF");
107CREATE TABLE foos
108(
109  id   INTEGER PRIMARY KEY AUTOINCREMENT,
110  foo  VARCHAR(255)
111)
112EOF
113
114    $dbh->do(<<"EOF");
115CREATE TABLE "bars"
116(
117  "foo_id"  INTEGER PRIMARY KEY AUTOINCREMENT REFERENCES foos (id),
118  bar     VARCHAR(255)
119)
120EOF
121
122    $dbh->disconnect;
123  }
124}
125
126END
127{
128  # Delete test tables
129
130  if($Have{'sqlite'})
131  {
132    my $dbh = Rose::DB->new('sqlite_admin')->retain_dbh()
133      or die Rose::DB->error;
134
135    $dbh->do('DROP TABLE bars');
136    $dbh->do('DROP TABLE foos');
137
138    $dbh->disconnect;
139  }
140}
141