Bug 13969: Replace calls to $sth->fetchrow* with a call to $dbh->selectrow* and Clean...
[koha.git] / t / db_dependent / Review.t
1 #!/usr/bin/perl
2
3 # Copyright 2015 BibLibre
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 3 of the License, or (at your option) any later
10 # version.
11 #
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along
17 # with Koha; if not, see <http://www.gnu.org/licenses>.
18
19 use Modern::Perl;
20 use Test::More tests => 117;
21 use Time::Piece;
22
23 BEGIN {
24     use_ok('C4::Biblio');
25     use_ok('C4::Review');
26     use_ok('Koha::Borrower');
27     use_ok('MARC::Record');
28 }
29
30 can_ok(
31     'C4::Review', qw(
32       getreview
33       savereview
34       updatereview
35       numberofreviews
36       numberofreviewsbybiblionumber
37       getreviews
38       getallreviews
39       approvereview
40       unapprovereview
41       deletereview )
42 );
43
44 my $dbh = C4::Context->dbh;
45 $dbh->{AutoCommit} = 0;
46 $dbh->{RaiseError} = 1;
47 $dbh->do('DELETE FROM reviews');
48 $dbh->do('DELETE FROM borrowers');
49
50 # ---------- Some borrowers for testing -------------------
51 my $categorycode = Koha::Database->new()->schema()->resultset('Category')->first()->categorycode();
52 my $branchcode   = Koha::Database->new()->schema()->resultset('Branch')->first()->branchcode();
53
54 my $b1 = Koha::Borrower->new(
55     {   surname      => 'Borrower 1',
56         branchcode   => $branchcode,
57         categorycode => $categorycode
58     }
59 );
60 $b1->store();
61
62 my $b2 = Koha::Borrower->new(
63     {   surname      => 'Borrower 2',
64         branchcode   => $branchcode,
65         categorycode => $categorycode
66     }
67 );
68 $b2->store();
69
70 my $b3 = Koha::Borrower->new(
71     {   surname      => 'Borrower 3',
72         branchcode   => $branchcode,
73         categorycode => $categorycode
74     }
75 );
76 $b3->store();
77
78 # ---------- Some biblios for testing -------------------
79 my ($biblionumber1) = AddBiblio( MARC::Record->new, '' );
80 my ($biblionumber2) = AddBiblio( MARC::Record->new, '' );
81 my ($biblionumber3) = AddBiblio( MARC::Record->new, '' );
82
83 # ---------- Some reviews for testing -------------------
84 my $rev1 = 'Review 1';
85 my $rev2 = 'Review 2';
86 my $rev3 = 'Review 3';
87
88 # ---------- Testing savereview ---------------------------
89 my $date = Time::Piece::localtime->strftime('%F %T');
90
91 savereview( $biblionumber1, $b1->borrowernumber, $rev1 );
92
93 my $query = '
94   SELECT count(*)
95   FROM reviews
96 ';
97 my $count = $dbh->selectrow_array($query);
98 is( $count, 1, 'There is 1 review' );
99
100 $query = '
101   SELECT reviewid, borrowernumber, biblionumber, review, approved, datereviewed
102   FROM reviews
103 ';
104 my ( $reviewid, $borrowernumber, $biblionumber, $review, $approved, $datereviewed ) = $dbh->selectrow_array($query);
105 is( $borrowernumber, $b1->borrowernumber, 'borrowernumber field is good' );
106 is( $biblionumber,   $biblionumber1,      'biblionumber field is good' );
107 is( $review,         $rev1,               'review field is good' );
108 is( $approved,       0,                   'approved field is 0 by default' );
109 is( $datereviewed,   $date,               'datereviewed field is good' );
110
111 # We add some others reviews
112 savereview( $biblionumber1, $b2->borrowernumber, $rev2 );
113 savereview( $biblionumber3, $b2->borrowernumber, $rev3 );
114
115 # ---------- Testing getreview ----------------------------
116 my $review1 = getreview( $biblionumber1, $b1->borrowernumber );
117 my $review2 = getreview( $biblionumber1, $b2->borrowernumber );
118 my $review3 = getreview( $biblionumber3, $b2->borrowernumber );
119
120 $query = '
121   SELECT count(*)
122   FROM reviews
123 ';
124 $count = $dbh->selectrow_array($query);
125 is( $count, 3, 'There are 3 reviews' );
126
127 isa_ok( $review1, 'HASH', '$review1 is defined as a hash' );
128 is( $review1->{borrowernumber}, $b1->borrowernumber, 'borrowernumber field is good' );
129 is( $review1->{biblionumber},   $biblionumber1,      'biblionumber field is good' );
130 is( $review1->{review},         $rev1,               'review field is good' );
131 is( $review1->{approved},       0,                   'approved field is 0 by default' );
132 cmp_ok( $review1->{datereviewed}, 'ge', $date, 'datereviewed field is good' );
133
134 isa_ok( $review2, 'HASH', '$review2 is defined as a hash' );
135 is( $review2->{borrowernumber}, $b2->borrowernumber, 'borrowernumber field is good' );
136 is( $review2->{biblionumber},   $biblionumber1,      'biblionumber field is good' );
137 is( $review2->{review},         $rev2,               'review field is good' );
138 is( $review2->{approved},       0,                   'approved field is 0 by default' );
139 cmp_ok( $review2->{datereviewed}, 'ge', $date, 'datereviewed field is good' );
140
141 isa_ok( $review3, 'HASH', '$review3 is defined as a hash' );
142 is( $review3->{borrowernumber}, $b2->borrowernumber, 'borrowernumber field is good' );
143 is( $review3->{biblionumber},   $biblionumber3,      'biblionumber field is good' );
144 is( $review3->{review},         $rev3,               'review field is good' );
145 is( $review3->{approved},       0,                   'approved field is 0 by default' );
146 cmp_ok( $review3->{datereviewed}, 'ge', $date, 'datereviewed field is good' );
147
148 # ---------- Testing getreviews ---------------------------
149 my $status = 0;
150 my $reviews = getreviews( $biblionumber1, $status );
151
152 $query = '
153   SELECT count(*)
154   FROM reviews
155   WHERE biblionumber = ?
156     AND approved = ?
157 ';
158 $count = $dbh->selectrow_array( $query, {}, $biblionumber1, $status );
159 is( $count, 2, 'There are 2 reviews corresponding' );
160
161 isa_ok( $reviews, 'ARRAY', '$reviews is defined as an array' );
162
163 isa_ok( $reviews->[0], 'HASH', '$reviews->[0] is defined as a hash' );
164 is( $reviews->[0]->{reviewid},       $review1->{reviewid},       'reviewid field is good' );
165 is( $reviews->[0]->{borrowernumber}, $review1->{borrowernumber}, 'borrowernumber field is good' );
166 is( $reviews->[0]->{biblionumber},   $review1->{biblionumber},   'biblionumber field is good' );
167 is( $reviews->[0]->{review},         $review1->{review},         'review field is good' );
168 is( $reviews->[0]->{approved},       $review1->{approved},       'approved field is 0 by default' );
169 cmp_ok( $reviews->[0]->{datereviewed}, 'ge', $date, 'datereviewed field is good' );
170
171 isa_ok( $reviews->[1], 'HASH', '$reviews->[1] is defined as a hash' );
172 is( $reviews->[1]->{reviewid},       $review2->{reviewid},       'reviewid field is good' );
173 is( $reviews->[1]->{borrowernumber}, $review2->{borrowernumber}, 'borrowernumber field is good' );
174 is( $reviews->[1]->{biblionumber},   $review2->{biblionumber},   'biblionumber field is good' );
175 is( $reviews->[1]->{review},         $review2->{review},         'review field is good' );
176 is( $reviews->[1]->{approved},       $review2->{approved},       'approved field is 0 by default' );
177 cmp_ok( $reviews->[1]->{datereviewed}, 'ge', $date, 'datereviewed field is good' );
178
179 $status = 1;
180 $reviews = getreviews( $biblionumber1, $status );
181 isa_ok( $reviews, 'ARRAY', '$reviews is defined as an array' );
182 is_deeply( $reviews, [], '$reviews is empty, there is no approved review' );
183
184 # ---------- Testing getallreviews ------------------------
185 $status  = 1;
186 $reviews = getallreviews($status);
187 isa_ok( $reviews, 'ARRAY', '$reviews is defined as an array' );
188 is_deeply( $reviews, [], '$reviews is empty, there is no approved review' );
189
190 $status  = 0;
191 $reviews = getallreviews($status);
192
193 $query = '
194   SELECT count(*)
195   FROM reviews
196   WHERE approved = ?
197 ';
198 $count = $dbh->selectrow_array( $query, {}, $status );
199 is( $count, 3, 'There are 3 reviews corresponding' );
200
201 my $count2 = numberofreviews($status);
202 is( $count2, $count, 'number of reviews returned is good' );
203
204 isa_ok( $reviews, 'ARRAY', '$reviews is defined as an array' );
205
206 isa_ok( $reviews->[0], 'HASH', '$reviews->[0] is defined as a hash' );
207 is( $reviews->[0]->{reviewid},       $review1->{reviewid},       'reviewid field is good' );
208 is( $reviews->[0]->{borrowernumber}, $review1->{borrowernumber}, 'borrowernumber field is good' );
209 is( $reviews->[0]->{biblionumber},   $review1->{biblionumber},   'biblionumber field is good' );
210 is( $reviews->[0]->{review},         $review1->{review},         'review field is good' );
211 is( $reviews->[0]->{approved},       $review1->{approved},       'approved field is 0 by default' );
212 cmp_ok( $reviews->[0]->{datereviewed}, 'ge', $date, 'datereviewed field is good' );
213
214 isa_ok( $reviews->[1], 'HASH', '$reviews->[1] is defined as a hash' );
215 is( $reviews->[1]->{reviewid},       $review2->{reviewid},       'reviewid field is good' );
216 is( $reviews->[1]->{borrowernumber}, $review2->{borrowernumber}, 'borrowernumber field is good' );
217 is( $reviews->[1]->{biblionumber},   $review2->{biblionumber},   'biblionumber field is good' );
218 is( $reviews->[1]->{review},         $review2->{review},         'review field is good' );
219 is( $reviews->[1]->{approved},       $review2->{approved},       'approved field is 0 by default' );
220 cmp_ok( $reviews->[1]->{datereviewed}, 'ge', $date, 'datereviewed field is good' );
221
222 isa_ok( $reviews->[2], 'HASH', '$reviews->[2] is defined as a hash' );
223 is( $reviews->[2]->{reviewid},       $review3->{reviewid},       'reviewid field is good' );
224 is( $reviews->[2]->{borrowernumber}, $review3->{borrowernumber}, 'borrowernumber field is good' );
225 is( $reviews->[2]->{biblionumber},   $review3->{biblionumber},   'biblionumber field is good' );
226 is( $reviews->[2]->{review},         $review3->{review},         'review field is good' );
227 is( $reviews->[2]->{approved},       $review3->{approved},       'approved field is 0 by default' );
228 cmp_ok( $reviews->[2]->{datereviewed}, 'ge', $date, 'datereviewed field is good' );
229
230 my $offset    = 1;
231 my $row_count = 1;
232 $reviews = getallreviews( $status, $offset );
233 is( @$reviews, 2, 'There are only 2 Reviews here' );
234 is_deeply( $reviews->[0], $review2, 'We have Review2...' );
235 is_deeply( $reviews->[1], $review3, '...and Review3' );
236
237 $reviews = getallreviews( $status, $offset, $row_count );
238 is( @$reviews, 1, 'There is only 1 Review here' );
239 is_deeply( $reviews->[0], $review2, 'We have only Review2' );
240
241 # ---------- Testing numberofreviews ----------------------
242 $status = 0;
243 $count  = numberofreviews($status);
244 is( $count, 3, 'There are 3 reviews where approved = 0' );
245
246 $status = 1;
247 $count  = numberofreviews($status);
248 is( $count, 0, 'There is no review where approved = 0' );
249
250 $count = numberofreviews();
251 is( $count, 0, 'There is no review where approved = 0 (Default)' );
252
253 # ---------- Testing approvereview ------------------------
254 is( $review1->{approved}, 0, 'review1 is not approved' );
255 approvereview( $review1->{reviewid} );
256 $review1 = getreview( $biblionumber1, $b1->borrowernumber );
257 is( $review1->{approved}, 1, 'review1 is approved' );
258
259 is( $review2->{approved}, 0, 'review2 is not approved' );
260 approvereview( $review2->{reviewid} );
261 $review2 = getreview( $biblionumber1, $b2->borrowernumber );
262 is( $review2->{approved}, 1, 'review2 is approved' );
263
264 is( $review3->{approved}, 0, 'review3 is not approved' );
265 approvereview( $review3->{reviewid} );
266 $review3 = getreview( $biblionumber3, $b2->borrowernumber );
267 is( $review3->{approved}, 1, 'review3 is approved' );
268
269 $status  = 1;
270 $reviews = getallreviews($status);
271
272 $count = numberofreviews($status);
273 is( $count, 3, '3 reviews are approved' );
274
275 $status = 0;
276 $count  = numberofreviews($status);
277 is( $count, 0, 'No review are not approved' );
278
279 # ---------- Testing unapprovereview ----------------------
280 is( $review1->{approved}, 1, 'review1 is approved' );
281 unapprovereview( $review1->{reviewid} );
282 $review1 = getreview( $biblionumber1, $b1->borrowernumber );
283 is( $review1->{approved}, 0, 'review1 is not approved' );
284
285 is( $review2->{approved}, 1, 'review2 is approved' );
286 unapprovereview( $review2->{reviewid} );
287 $review2 = getreview( $biblionumber1, $b2->borrowernumber );
288 is( $review2->{approved}, 0, 'review2 is not approved' );
289
290 is( $review3->{approved}, 1, 'review3 is approved' );
291 unapprovereview( $review3->{reviewid} );
292 $review3 = getreview( $biblionumber3, $b2->borrowernumber );
293 is( $review3->{approved}, 0, 'review3 is not approved' );
294
295 $status  = 0;
296 $reviews = getallreviews($status);
297
298 $count = numberofreviews($status);
299 is( $count, 3, '3 reviews are not approved' );
300
301 $status = 1;
302 $count  = numberofreviews($status);
303 is( $count, 0, 'No review are approved' );
304
305 # ---------- Testing numberofreviewsbybiblionumber --------
306 approvereview( $review1->{reviewid} );
307 approvereview( $review2->{reviewid} );
308 approvereview( $review3->{reviewid} );
309
310 $biblionumber = $biblionumber1;
311 $count        = numberofreviewsbybiblionumber($biblionumber);
312 is( $count, 2, 'There are 2 reviews for biblionumber1 and approved = 1' );
313
314 $biblionumber = $biblionumber2;
315 $count        = numberofreviewsbybiblionumber($biblionumber);
316 is( $count, 0, 'There is no review for biblionumber2 and  approved = 1' );
317
318 $biblionumber = $biblionumber3;
319 $count        = numberofreviewsbybiblionumber($biblionumber);
320 is( $count, 1, 'There 1 review for biblionumber3 and approved = 1' );
321
322 unapprovereview( $review1->{reviewid} );
323 unapprovereview( $review3->{reviewid} );
324
325 $biblionumber = $biblionumber1;
326 $count        = numberofreviewsbybiblionumber($biblionumber);
327 is( $count, 1, 'There is 1 review for biblionumber1 and approved = 1' );
328
329 $biblionumber = $biblionumber2;
330 $count        = numberofreviewsbybiblionumber($biblionumber);
331 is( $count, 0, 'There is no review for biblionumber2 and  approved = 1' );
332
333 $biblionumber = $biblionumber3;
334 $count        = numberofreviewsbybiblionumber($biblionumber);
335 is( $count, 0, 'There is no review for biblionumber3 and approved = 1' );
336
337 # ---------- Testing updatereview -------------------------
338 my $rev1b = 'Review 1 bis';
339 my $rev2b = 'Review 2 bis';
340 my $rev3b = 'Review 3 bis';
341
342 is( $review1->{review}, $rev1, 'review field is "Review 1"' );
343 updatereview( $biblionumber1, $b1->borrowernumber, $rev1b );
344 $review1 = getreview( $biblionumber1, $b1->borrowernumber );
345 is( $review1->{review}, $rev1b, 'review field is "Review 1 bis"' );
346
347 is( $review2->{review}, $rev2, 'review field is "Review 2"' );
348 updatereview( $biblionumber1, $b2->borrowernumber, $rev2b );
349 $review2 = getreview( $biblionumber1, $b2->borrowernumber );
350 is( $review2->{review}, $rev2b, 'review field is "Review 2 bis"' );
351
352 is( $review3->{review}, $rev3, 'review field is "Review 3"' );
353 updatereview( $biblionumber3, $b2->borrowernumber, $rev3b );
354 $review3 = getreview( $biblionumber3, $b2->borrowernumber );
355 is( $review3->{review}, $rev3b, 'review field is "Review 3 bis"' );
356
357 # ---------- Testing deletereview -------------------------
358 my $status0 = 0;
359 my $status1 = 1;
360
361 my $numberOfReviews = numberofreviews($status0) + numberofreviews($status1);
362 is( $numberOfReviews, 3, 'There are 3 reviews in database' );
363
364 deletereview( $review1->{reviewid} );
365 $review1 = getreview( $biblionumber1, $b3->borrowernumber );
366 ok( !defined($review1), 'Review1 is no longer defined' );
367
368 $numberOfReviews = numberofreviews($status0) + numberofreviews($status1);
369 is( $numberOfReviews, 2, 'There are 2 reviews left in database' );
370
371 deletereview( $review2->{reviewid} );
372 $review2 = getreview( $biblionumber2, $b2->borrowernumber );
373 ok( !defined($review2), 'Review2 is no longer defined' );
374
375 $numberOfReviews = numberofreviews($status0) + numberofreviews($status1);
376 is( $numberOfReviews, 1, 'There is 1 review left in database' );
377
378 deletereview( $review3->{reviewid} );
379 $review3 = getreview( $biblionumber3, $b2->borrowernumber );
380 ok( !defined($review3), 'Review3 is no longer defined' );
381
382 $numberOfReviews = numberofreviews($status0) + numberofreviews($status1);
383 is( $numberOfReviews, 0, 'There is no review left in database' );
384
385 $dbh->rollback;