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