Reorganize CDBICompat tests - centralize prereq checks in one place
[dbsrgits/DBIx-Class.git] / t / cdbi / 06-hasa.t
CommitLineData
ccee4390 1use strict;
2use Test::More;
3
ccee4390 4@YA::Film::ISA = 'Film';
5
6#local $SIG{__WARN__} = sub { };
7
8INIT {
6a3bf251 9 use lib 't/cdbi/testlib';
10 use Film;
11 use Director;
ccee4390 12}
13
14Film->create_test_film;
15ok(my $btaste = Film->retrieve('Bad Taste'), "We have Bad Taste");
16ok(my $pj = $btaste->Director, "Bad taste has_a() director");
17ok(!ref($pj), ' ... which is not an object');
18
19ok(Film->has_a('Director' => 'Director'), "Link Director table");
20ok(
6a3bf251 21 Director->create(
22 {
23 Name => 'Peter Jackson',
24 Birthday => -300000000,
25 IsInsane => 1
26 }
27 ),
28 'create Director'
ccee4390 29);
30
31$btaste = Film->retrieve('Bad Taste');
32
33ok($pj = $btaste->Director, "Bad taste now has_a() director");
34isa_ok($pj => 'Director');
35is($pj->id, 'Peter Jackson', ' ... and is the correct director');
36
37# Oh no! Its Peter Jacksons even twin, Skippy! Born one minute after him.
38my $sj = Director->create(
6a3bf251 39 {
40 Name => 'Skippy Jackson',
41 Birthday => (-300000000 + 60),
42 IsInsane => 1,
43 }
ccee4390 44);
45
46is($sj->id, 'Skippy Jackson', 'We have a new director');
47
48Film->has_a(CoDirector => 'Director');
49
50$btaste->CoDirector($sj);
51$btaste->update;
52is($btaste->CoDirector->Name, 'Skippy Jackson', 'He co-directed');
53is(
6a3bf251 54 $btaste->Director->Name,
55 'Peter Jackson',
56 "Didnt interfere with each other"
ccee4390 57);
58
59{ # Ensure search can take an object
6a3bf251 60 my @films = Film->search(Director => $pj);
61 is @films, 1, "1 Film directed by $pj";
62 is $films[0]->id, "Bad Taste", "Bad Taste";
ccee4390 63}
64
65inheriting_hasa();
66
67{
68
6a3bf251 69 # Skippy directs a film and Peter helps!
70 $sj = Director->retrieve('Skippy Jackson');
71 $pj = Director->retrieve('Peter Jackson');
ccee4390 72
6a3bf251 73 fail_with_bad_object($sj, $btaste);
74 taste_bad($sj, $pj);
ccee4390 75}
76
77sub inheriting_hasa {
6a3bf251 78 my $btaste = YA::Film->retrieve('Bad Taste');
79 is(ref($btaste->Director), 'Director', 'inheriting has_a()');
80 is(ref($btaste->CoDirector), 'Director', 'inheriting has_a()');
81 is($btaste->CoDirector->Name, 'Skippy Jackson', ' ... correctly');
ccee4390 82}
83
84sub taste_bad {
6a3bf251 85 my ($dir, $codir) = @_;
86 my $tastes_bad = YA::Film->create(
87 {
88 Title => 'Tastes Bad',
89 Director => $dir,
90 CoDirector => $codir,
91 Rating => 'R',
92 NumExplodingSheep => 23
93 }
94 );
95 is($tastes_bad->_Director_accessor, 'Skippy Jackson', 'Director_accessor');
96 is($tastes_bad->Director->Name, 'Skippy Jackson', 'Director');
97 is($tastes_bad->CoDirector->Name, 'Peter Jackson', 'CoDirector');
98 is(
99 $tastes_bad->_CoDirector_accessor,
100 'Peter Jackson',
101 'CoDirector_accessor'
102 );
ccee4390 103}
104
105sub fail_with_bad_object {
6a3bf251 106 my ($dir, $codir) = @_;
107 eval {
108 YA::Film->create(
109 {
110 Title => 'Tastes Bad',
111 Director => $dir,
112 CoDirector => $codir,
113 Rating => 'R',
114 NumExplodingSheep => 23
115 }
116 );
117 };
118 ok $@, $@;
ccee4390 119}
120
121package Foo;
122use base 'CDBase';
123__PACKAGE__->table('foo');
124__PACKAGE__->columns('All' => qw/ id fav /);
125# fav is a film
126__PACKAGE__->db_Main->do( qq{
127 CREATE TABLE foo (
6a3bf251 128 id INTEGER,
129 fav VARCHAR(255)
ccee4390 130 )
131});
132
133
134package Bar;
135use base 'CDBase';
136__PACKAGE__->table('bar');
137__PACKAGE__->columns('All' => qw/ id fav /);
138# fav is a foo
139__PACKAGE__->db_Main->do( qq{
140 CREATE TABLE bar (
6a3bf251 141 id INTEGER,
142 fav INTEGER
ccee4390 143 )
144});
145
146package main;
147Foo->has_a("fav" => "Film");
148Bar->has_a("fav" => "Foo");
149my $foo = Foo->create({ id => 6, fav => 'Bad Taste' });
150my $bar = Bar->create({ id => 2, fav => 6 });
151isa_ok($bar->fav, "Foo");
152isa_ok($foo->fav, "Film");
153
8273e845 154{
6a3bf251 155 my $foo;
156 Foo->add_trigger(after_create => sub { $foo = shift->fav });
157 my $gwh = Foo->create({ id => 93, fav => 'Good Will Hunting' });
158 isa_ok $foo, "Film", "Object in after_create trigger";
ccee4390 159}
160
d9bd5195 161done_testing;