4 # This file is part of Koha.
6 # Koha is free software; you can redistribute it and/or modify it
7 # under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3 of the License, or
9 # (at your option) any later version.
11 # Koha is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with Koha; if not, see <http://www.gnu.org/licenses>.
21 use Test::More tests => 4;
30 use t::lib::TestBuilder;
32 my $schema = Koha::Database->new->schema;
33 $schema->storage->txn_begin;
35 my $builder = t::lib::TestBuilder->new;
37 # TODO create a subroutine in t::lib::Mocks
38 my $userenv_patron = $builder->build( { source => 'Borrower', }, );
39 C4::Context->_new_userenv('DUMMY SESSION');
40 C4::Context->set_userenv(
41 $userenv_patron->{borrowernumber},
42 $userenv_patron->{userid},
43 'usercnum', 'First name', 'Surname',
44 $userenv_patron->{_fk}{branchcode}{branchcode},
45 $userenv_patron->{_fk}{branchcode}{branchname}, 0
48 my $anonymous = $builder->build( { source => 'Borrower', }, );
50 t::lib::Mocks::mock_preference( 'AnonymousPatron', $anonymous->{borrowernumber} );
52 subtest 'patron privacy is 1 (default)' => sub {
54 my $patron = $builder->build(
55 { source => 'Borrower',
56 value => { privacy => 1, }
59 my $item = $builder->build(
67 my $issue = $builder->build(
70 borrowernumber => $patron->{borrowernumber},
71 itemnumber => $item->{itemnumber},
76 my ( $returned, undef, undef ) = C4::Circulation::AddReturn( $item->{barcode}, undef, undef, undef, '2010-10-10' );
77 is( $returned, 1, 'The item should have been returned' );
78 my ( $rows_affected, $err ) = C4::Circulation::AnonymiseIssueHistory('2010-10-11');
79 ok( $rows_affected > 0, 'AnonymiseIssueHistory should affect at least 1 row' );
80 is( $err, undef, 'AnonymiseIssueHistory should not return any error if success' );
82 my $dbh = C4::Context->dbh;
83 my ($borrowernumber_used_to_anonymised) = $dbh->selectrow_array(q|
84 SELECT borrowernumber FROM old_issues where itemnumber = ?
85 |, undef, $item->{itemnumber});
86 is( $borrowernumber_used_to_anonymised, $anonymous->{borrowernumber}, 'With privacy=1, the issue should have been anonymised' );
90 subtest 'patron privacy is 0 (forever)' => sub {
93 my $patron = $builder->build(
94 { source => 'Borrower',
95 value => { privacy => 0, }
98 my $item = $builder->build(
106 my $issue = $builder->build(
109 borrowernumber => $patron->{borrowernumber},
110 itemnumber => $item->{itemnumber},
115 my ( $returned, undef, undef ) = C4::Circulation::AddReturn( $item->{barcode}, undef, undef, undef, '2010-10-10' );
116 is( $returned, 1, 'The item should have been returned' );
117 my ( $rows_affected, $err ) = C4::Circulation::AnonymiseIssueHistory('2010-10-11');
118 is( $err, undef, 'AnonymiseIssueHistory should not return any error if success' );
120 my $dbh = C4::Context->dbh;
121 my ($borrowernumber_used_to_anonymised) = $dbh->selectrow_array(q|
122 SELECT borrowernumber FROM old_issues where itemnumber = ?
123 |, undef, $item->{itemnumber});
124 is( $borrowernumber_used_to_anonymised, $patron->{borrowernumber}, 'With privacy=0, the issue should not be anonymised' );
127 t::lib::Mocks::mock_preference( 'AnonymousPatron', '' );
129 subtest 'AnonymousPatron is not defined' => sub {
131 my $patron = $builder->build(
132 { source => 'Borrower',
133 value => { privacy => 1, }
136 my $item = $builder->build(
144 my $issue = $builder->build(
147 borrowernumber => $patron->{borrowernumber},
148 itemnumber => $item->{itemnumber},
153 my ( $returned, undef, undef ) = C4::Circulation::AddReturn( $item->{barcode}, undef, undef, undef, '2010-10-10' );
154 is( $returned, 1, 'The item should have been returned' );
155 my ( $rows_affected, $err ) = C4::Circulation::AnonymiseIssueHistory('2010-10-11');
156 ok( $rows_affected > 0, 'AnonymiseIssueHistory should affect at least 1 row' );
157 is( $err, undef, 'AnonymiseIssueHistory should not return any error if success' );
159 my $dbh = C4::Context->dbh;
160 my ($borrowernumber_used_to_anonymised) = $dbh->selectrow_array(q|
161 SELECT borrowernumber FROM old_issues where itemnumber = ?
162 |, undef, $item->{itemnumber});
163 is( $borrowernumber_used_to_anonymised, undef, 'With AnonymousPatron is not defined, the issue should have been anonymised anyway' );
166 subtest 'Test StoreLastBorrower' => sub {
169 t::lib::Mocks::mock_preference( 'StoreLastBorrower', '1' );
171 my $patron = $builder->build(
173 source => 'Borrower',
174 value => { privacy => 1, }
178 my $item = $builder->build(
188 my $issue = $builder->build(
192 borrowernumber => $patron->{borrowernumber},
193 itemnumber => $item->{itemnumber},
198 my $item_object = Koha::Items->find( $item->{itemnumber} );
199 my $patron_object = $item_object->last_returned_by();
200 is( $patron_object, undef, 'Koha::Item::last_returned_by returned undef' );
202 my ( $returned, undef, undef ) = C4::Circulation::AddReturn( $item->{barcode}, undef, undef, undef, '2010-10-10' );
204 $item_object = Koha::Items->find( $item->{itemnumber} );
205 $patron_object = $item_object->last_returned_by();
206 is( ref($patron_object), 'Koha::Borrower', 'Koha::Item::last_returned_by returned Koha::Borrower' );
208 $patron = $builder->build(
210 source => 'Borrower',
211 value => { privacy => 1, }
215 $issue = $builder->build(
219 borrowernumber => $patron->{borrowernumber},
220 itemnumber => $item->{itemnumber},
225 ( $returned, undef, undef ) = C4::Circulation::AddReturn( $item->{barcode}, undef, undef, undef, '2010-10-10' );
227 $item_object = Koha::Items->find( $item->{itemnumber} );
228 $patron_object = $item_object->last_returned_by();
229 is( $patron_object->id, $patron->{borrowernumber}, 'Second patron to return item replaces the first' );
231 $patron = $builder->build(
233 source => 'Borrower',
234 value => { privacy => 1, }
237 $patron_object = Koha::Borrowers->find( $patron->{borrowernumber} );
239 $item_object->last_returned_by($patron_object);
240 $item_object = Koha::Items->find( $item->{itemnumber} );
241 my $patron_object2 = $item_object->last_returned_by();
242 is( $patron_object->id, $patron_object2->id,
243 'Calling last_returned_by with Borrower object sets last_returned_by to that borrower' );
245 $patron_object->delete;
246 $item_object = Koha::Items->find( $item->{itemnumber} );
247 is( $item_object->last_returned_by, undef, 'last_returned_by should return undef if the last patron to return the item has been deleted' );
249 t::lib::Mocks::mock_preference( 'StoreLastBorrower', '0' );
250 $patron = $builder->build(
252 source => 'Borrower',
253 value => { privacy => 1, }
257 $issue = $builder->build(
261 borrowernumber => $patron->{borrowernumber},
262 itemnumber => $item->{itemnumber},
266 ( $returned, undef, undef ) = C4::Circulation::AddReturn( $item->{barcode}, undef, undef, undef, '2010-10-10' );
268 $item_object = Koha::Items->find( $item->{itemnumber} );
269 is( $item_object->last_returned_by, undef, 'Last patron to return item should not be stored if StoreLastBorrower if off' );
272 $schema->storage->txn_rollback;