-
Notifications
You must be signed in to change notification settings - Fork 151
/
09-has_many.t
126 lines (101 loc) · 3.15 KB
/
09-has_many.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use strict;
use Test::More;
BEGIN {
eval "use DBIx::Class::CDBICompat;";
plan skip_all => 'Class::Trigger and DBIx::ContextualFetch required' if $@;
plan tests => 31;
}
use lib 't/cdbi/testlib';
use Film;
use Actor;
Actor->has_a(Film => 'Film');
Film->has_many(actors => 'Actor', { order_by => 'name' });
is(Actor->primary_column, 'id', "Actor primary OK");
ok(Actor->can('Salary'), "Actor table set-up OK");
ok(Film->can('actors'), " and have a suitable method in Film");
Film->create_test_film;
ok(my $btaste = Film->retrieve('Bad Taste'), "We have Bad Taste");
ok(
my $pvj = Actor->create(
{
Name => 'Peter Vere-Jones',
Film => undef,
Salary => '30_000', # For a voice!
}
),
'create Actor'
);
is $pvj->Name, "Peter Vere-Jones", "PVJ name ok";
is $pvj->Film, undef, "No film";
ok $pvj->set_Film($btaste), "Set film";
$pvj->update;
is $pvj->Film->id, $btaste->id, "Now film";
{
my @actors = $btaste->actors;
is(@actors, 1, "Bad taste has one actor");
is($actors[0]->Name, $pvj->Name, " - the correct one");
}
my %pj_data = (
Name => 'Peter Jackson',
Salary => '0', # it's a labour of love
);
eval { my $pj = Film->add_to_actors(\%pj_data) };
like $@, qr/class/, "add_to_actors must be object method";
eval { my $pj = $btaste->add_to_actors(%pj_data) };
like $@, qr/needs/, "add_to_actors takes hash";
ok(
my $pj = $btaste->add_to_actors(
{
Name => 'Peter Jackson',
Salary => '0', # it's a labour of love
}
),
'add_to_actors'
);
is $pj->Name, "Peter Jackson", "PJ ok";
is $pvj->Name, "Peter Vere-Jones", "PVJ still ok";
{
my @actors = $btaste->actors;
is @actors, 2, " - so now we have 2";
is $actors[0]->Name, $pj->Name, "PJ first";
is $actors[1]->Name, $pvj->Name, "PVJ first";
}
eval {
my @actors = $btaste->actors(Name => $pj->Name);
is @actors, 1, "One actor from restricted (sorted) has_many";
is $actors[0]->Name, $pj->Name, "It's PJ";
};
is $@, '', "No errors";
my $as = Actor->create(
{
Name => 'Arnold Schwarzenegger',
Film => 'Terminator 2',
Salary => '15_000_000'
}
);
eval { $btaste->actors($pj, $pvj, $as) };
ok $@, $@;
is($btaste->actors, 2, " - so we still only have 2 actors");
my @bta_before = Actor->search(Film => 'Bad Taste');
is(@bta_before, 2, "We have 2 actors in bad taste");
ok($btaste->delete, "Delete bad taste");
my @bta_after = Actor->search(Film => 'Bad Taste');
is(@bta_after, 0, " - after deleting there are no actors");
# While we're here, make sure Actors have unreadable mutators and
# unwritable accessors
eval { $as->Name("Paul Reubens") };
ok $@, $@;
eval { my $name = $as->set_Name };
ok $@, $@;
is($as->Name, 'Arnold Schwarzenegger', "Arnie's still Arnie");
# Test infering of the foreign key of a has_many from an existing has_a
{
use Thing;
use OtherThing;
Thing->has_a(that_thing => "OtherThing");
OtherThing->has_many(things => "Thing");
my $other_thing = OtherThing->create({ id => 1 });
Thing->create({ id => 1, that_thing => $other_thing });
Thing->create({ id => 2, that_thing => $other_thing });
is_deeply [sort map { $_->id } $other_thing->things], [1,2];
}