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