Commit | Line | Data |
9bc6db13 |
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 | |
95a70f01 |
96 | my $it_class = 'DBIx::Class::Cursor'; |
9bc6db13 |
97 | |
98 | sub test_normal_iterator { |
99 | my $it = $film->actors; |
95a70f01 |
100 | isa_ok $it, $it_class; |
9bc6db13 |
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; |
95a70f01 |
114 | isa_ok $it, $it_class; |
9bc6db13 |
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 | |
95a70f01 |
127 | SKIP: { |
128 | skip "dbic iterators don't support slice yet", 12; |
129 | |
130 | |
9bc6db13 |
131 | { |
132 | my @acts = $film->actors->slice(1, 2); |
133 | is @acts, 2, "Slice gives 2 actor"; |
134 | is $acts[0]->name, "Actor 2", "Actor 2"; |
135 | is $acts[1]->name, "Actor 3", "and actor 3"; |
136 | } |
137 | |
138 | { |
139 | my @acts = $film->actors->slice(1); |
140 | is @acts, 1, "Slice of 1 actor"; |
141 | is $acts[0]->name, "Actor 2", "Actor 2"; |
142 | } |
143 | |
144 | { |
145 | my @acts = $film->actors->slice(2, 8); |
146 | is @acts, 1, "Slice off the end"; |
147 | is $acts[0]->name, "Actor 3", "Gets last actor only"; |
148 | } |
149 | |
150 | package Class::DBI::My::Iterator; |
151 | |
152 | use base 'Class::DBI::Iterator'; |
153 | |
154 | sub slice { qw/fred barney/ } |
155 | |
156 | package main; |
157 | |
158 | Actor->iterator_class('Class::DBI::My::Iterator'); |
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 | } # end SKIP block |