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