Merge the relationship resolution rework
[dbsrgits/DBIx-Class.git] / t / cdbi / 12-filter.t
1 BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
2 use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
3
4 use strict;
5 use warnings;
6
7 use Test::More;
8
9 use lib 't/cdbi/testlib';
10 use Actor;
11 use Film;
12 Film->has_many(actors                => 'Actor');
13 Actor->has_a('film'                  => 'Film');
14 Actor->add_constructor(double_search => 'name = ? AND salary = ?');
15
16 my $film  = Film->create({ Title => 'MY Film' });
17 my $film2 = Film->create({ Title => 'Another Film' });
18
19 my @act = (
20   Actor->create(
21     {
22       name   => 'Actor 1',
23       film   => $film,
24       salary => 10,
25     }
26   ),
27   Actor->create(
28     {
29       name   => 'Actor 2',
30       film   => $film,
31       salary => 20,
32     }
33   ),
34   Actor->create(
35     {
36       name   => 'Actor 3',
37       film   => $film,
38       salary => 30,
39     }
40   ),
41   Actor->create(
42     {
43       name   => 'Actor 4',
44       film   => $film2,
45       salary => 50,
46     }
47   ),
48 );
49
50 eval {
51   my @actors = $film->actors(name => 'Actor 1');
52   is @actors, 1, "Got one actor from restricted has_many";
53   is $actors[0]->name, "Actor 1", "Correct name";
54 };
55 is $@, '', "No errors";
56
57 {
58   my @actors = Actor->double_search("Actor 1", 10);
59   is @actors, 1, "Got one actor";
60   is $actors[0]->name, "Actor 1", "Correct name";
61 }
62
63 {
64   ok my @actors = Actor->salary_between(0, 100), "Range 0 - 100";
65   is @actors, 4, "Got all";
66 }
67
68 {
69   my @actors = Actor->salary_between(100, 200);
70   is @actors, 0, "None in Range 100 - 200";
71 }
72
73 {
74   ok my @actors = Actor->salary_between(0, 10), "Range 0 - 10";
75   is @actors, 1, "Got 1";
76   is $actors[0]->name, $act[0]->name, "Actor 1";
77 }
78
79 {
80   ok my @actors = Actor->salary_between(20, 30), "Range 20 - 20";
81   @actors = sort { $a->salary <=> $b->salary } @actors;
82   is @actors, 2, "Got 2";
83   is $actors[0]->name, $act[1]->name, "Actor 2";
84   is $actors[1]->name, $act[2]->name, "and Actor 3";
85 }
86
87 {
88   ok my @actors = Actor->search(Film => $film), "Search by object";
89   is @actors, 3, "3 actors in film 1";
90 }
91
92 #----------------------------------------------------------------------
93 # Iterators
94 #----------------------------------------------------------------------
95
96 my $it_class = 'DBIx::Class::ResultSet';
97
98 sub test_normal_iterator {
99   my $it = $film->actors;
100   isa_ok $it, $it_class;
101   is $it->count, 3, " - with 3 elements";
102   my $i = 0;
103   while (my $film = $it->next) {
104     is $film->name, $act[ $i++ ]->name, "Get $i";
105   }
106   ok !$it->next, "No more";
107   is $it->first->name, $act[0]->name, "Get first";
108 }
109
110 test_normal_iterator;
111 {
112   Film->has_many(actor_ids => [ Actor => 'id' ]);
113   my $it = $film->actor_ids;
114   isa_ok $it, $it_class;
115   is $it->count, 3, " - with 3 elements";
116   my $i = 0;
117   while (my $film_id = $it->next) {
118     is $film_id, $act[ $i++ ]->id, "Get id $i";
119   }
120   ok !$it->next, "No more";
121   is $it->first, $act[0]->id, "Get first";
122 }
123
124 # make sure nothing gets clobbered;
125 test_normal_iterator;
126
127 {
128   my @acts = $film->actors->slice(1, 2);
129   is @acts, 2, "Slice gives 2 actor";
130   is $acts[0]->name, "Actor 2", "Actor 2";
131   is $acts[1]->name, "Actor 3", "and actor 3";
132 }
133
134 {
135   my @acts = $film->actors->slice(1);
136   is @acts, 1, "Slice of 1 actor";
137   is $acts[0]->name, "Actor 2", "Actor 2";
138 }
139
140 {
141   my @acts = $film->actors->slice(2, 8);
142   is @acts, 1, "Slice off the end";
143   is $acts[0]->name, "Actor 3", "Gets last actor only";
144 }
145
146 package Class::DBI::My::Iterator;
147
148 our @ISA;
149
150 @ISA = ($it_class);
151
152 sub slice { qw/fred barney/ }
153
154 package main;
155
156 Actor->iterator_class('Class::DBI::My::Iterator');
157
158 delete $film->{related_resultsets};
159
160 {
161   my @acts = $film->actors->slice(1, 2);
162   is @acts, 2, "Slice gives 2 results";
163   ok eq_set(\@acts, [qw/fred barney/]), "Fred and Barney";
164
165   ok $film->actors->delete_all, "Can delete via iterator";
166   is $film->actors, 0, "no actors left";
167
168   eval { $film->actors->delete_all };
169   is $@, '', "Deleting again does no harm";
170 }
171
172 done_testing;