Now passing four more tests, has_a and has_many compliance extended
[dbsrgits/DBIx-Class.git] / t / cdbi-t / 12-filter.t
1 use strict;
2 use Test::More;
3
4 BEGIN {
5         eval "use DBD::SQLite";
6         plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 50);
7 }
8
9 use lib 't/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 SKIP: {
97   skip "Compat layer doesn't have iterator support yet", 33;
98
99 sub test_normal_iterator {
100         my $it = $film->actors;
101         isa_ok $it, "Class::DBI::Iterator";
102         is $it->count, 3, " - with 3 elements";
103         my $i = 0;
104         while (my $film = $it->next) {
105                 is $film->name, $act[ $i++ ]->name, "Get $i";
106         }
107         ok !$it->next, "No more";
108         is $it->first->name, $act[0]->name, "Get first";
109 }
110
111 test_normal_iterator;
112 {
113         Film->has_many(actor_ids => [ Actor => 'id' ]);
114         my $it = $film->actor_ids;
115         isa_ok $it, "Class::DBI::Iterator";
116         is $it->count, 3, " - with 3 elements";
117         my $i = 0;
118         while (my $film_id = $it->next) {
119                 is $film_id, $act[ $i++ ]->id, "Get id $i";
120         }
121         ok !$it->next, "No more";
122         is $it->first, $act[0]->id, "Get first";
123 }
124
125 # make sure nothing gets clobbered;
126 test_normal_iterator;
127
128 {
129         my @acts = $film->actors->slice(1, 2);
130         is @acts, 2, "Slice gives 2 actor";
131         is $acts[0]->name, "Actor 2", "Actor 2";
132         is $acts[1]->name, "Actor 3", "and actor 3";
133 }
134
135 {
136         my @acts = $film->actors->slice(1);
137         is @acts, 1, "Slice of 1 actor";
138         is $acts[0]->name, "Actor 2", "Actor 2";
139 }
140
141 {
142         my @acts = $film->actors->slice(2, 8);
143         is @acts, 1, "Slice off the end";
144         is $acts[0]->name, "Actor 3", "Gets last actor only";
145 }
146
147 package Class::DBI::My::Iterator;
148
149 use base 'Class::DBI::Iterator';
150
151 sub slice { qw/fred barney/ }
152
153 package main;
154
155 Actor->iterator_class('Class::DBI::My::Iterator');
156
157 {
158         my @acts = $film->actors->slice(1, 2);
159         is @acts, 2, "Slice gives 2 results";
160         ok eq_set(\@acts, [qw/fred barney/]), "Fred and Barney";
161
162         ok $film->actors->delete_all, "Can delete via iterator";
163         is $film->actors, 0, "no actors left";
164
165         eval { $film->actors->delete_all };
166         is $@, '', "Deleting again does no harm";
167 }
168
169 } # end SKIP block