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