Bug 10663: tests for CanBookBeRenewed
[koha.git] / t / db_dependent / Circulation.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4
5 use DateTime;
6 use C4::Biblio;
7 use C4::Branch;
8 use C4::Items;
9 use C4::Members;
10 use C4::Reserves;
11
12 use Test::More tests => 20;
13
14 BEGIN {
15     use_ok('C4::Circulation');
16 }
17
18 my $dbh = C4::Context->dbh;
19
20 # Start transaction
21 $dbh->{AutoCommit} = 0;
22 $dbh->{RaiseError} = 1;
23
24 my $CircControl = C4::Context->preference('CircControl');
25 my $HomeOrHoldingBranch = C4::Context->preference('HomeOrHoldingBranch');
26
27 my $item = {
28     homebranch => 'MPL',
29     holdingbranch => 'MPL'
30 };
31
32 my $borrower = {
33     branchcode => 'MPL'
34 };
35
36 # No userenv, PickupLibrary
37 C4::Context->set_preference('CircControl', 'PickupLibrary');
38 is(
39     C4::Context->preference('CircControl'),
40     'PickupLibrary',
41     'CircControl changed to PickupLibrary'
42 );
43 is(
44     C4::Circulation::_GetCircControlBranch($item, $borrower),
45     $item->{$HomeOrHoldingBranch},
46     '_GetCircControlBranch returned item branch (no userenv defined)'
47 );
48
49 # No userenv, PatronLibrary
50 C4::Context->set_preference('CircControl', 'PatronLibrary');
51 is(
52     C4::Context->preference('CircControl'),
53     'PatronLibrary',
54     'CircControl changed to PatronLibrary'
55 );
56 is(
57     C4::Circulation::_GetCircControlBranch($item, $borrower),
58     $borrower->{branchcode},
59     '_GetCircControlBranch returned borrower branch'
60 );
61
62 # No userenv, ItemHomeLibrary
63 C4::Context->set_preference('CircControl', 'ItemHomeLibrary');
64 is(
65     C4::Context->preference('CircControl'),
66     'ItemHomeLibrary',
67     'CircControl changed to ItemHomeLibrary'
68 );
69 is(
70     $item->{$HomeOrHoldingBranch},
71     C4::Circulation::_GetCircControlBranch($item, $borrower),
72     '_GetCircControlBranch returned item branch'
73 );
74
75 diag('Now, set a userenv');
76 C4::Context->_new_userenv('xxx');
77 C4::Context::set_userenv(0,0,0,'firstname','surname', 'MPL', 'Midway Public Library', '', '', '');
78 is(C4::Context->userenv->{branch}, 'MPL', 'userenv set');
79
80 # Userenv set, PickupLibrary
81 C4::Context->set_preference('CircControl', 'PickupLibrary');
82 is(
83     C4::Context->preference('CircControl'),
84     'PickupLibrary',
85     'CircControl changed to PickupLibrary'
86 );
87 is(
88     C4::Circulation::_GetCircControlBranch($item, $borrower),
89     'MPL',
90     '_GetCircControlBranch returned current branch'
91 );
92
93 # Userenv set, PatronLibrary
94 C4::Context->set_preference('CircControl', 'PatronLibrary');
95 is(
96     C4::Context->preference('CircControl'),
97     'PatronLibrary',
98     'CircControl changed to PatronLibrary'
99 );
100 is(
101     C4::Circulation::_GetCircControlBranch($item, $borrower),
102     $borrower->{branchcode},
103     '_GetCircControlBranch returned borrower branch'
104 );
105
106 # Userenv set, ItemHomeLibrary
107 C4::Context->set_preference('CircControl', 'ItemHomeLibrary');
108 is(
109     C4::Context->preference('CircControl'),
110     'ItemHomeLibrary',
111     'CircControl changed to ItemHomeLibrary'
112 );
113 is(
114     C4::Circulation::_GetCircControlBranch($item, $borrower),
115     $item->{$HomeOrHoldingBranch},
116     '_GetCircControlBranch returned item branch'
117 );
118
119 # Reset initial configuration
120 C4::Context->set_preference('CircControl', $CircControl);
121 is(
122     C4::Context->preference('CircControl'),
123     $CircControl,
124     'CircControl reset to its initial value'
125 );
126
127 # Test C4::Circulation::ProcessOfflinePayment
128 my $sth = C4::Context->dbh->prepare("SELECT COUNT(*) FROM accountlines WHERE amount = '-123.45' AND accounttype = 'Pay'");
129 $sth->execute();
130 my ( $original_count ) = $sth->fetchrow_array();
131
132 C4::Context->dbh->do("INSERT INTO borrowers ( cardnumber, surname, firstname, categorycode, branchcode ) VALUES ( '99999999999', 'Hall', 'Kyle', 'S', 'MPL' )");
133
134 C4::Circulation::ProcessOfflinePayment({ cardnumber => '99999999999', amount => '123.45' });
135
136 $sth->execute();
137 my ( $new_count ) = $sth->fetchrow_array();
138
139 ok( $new_count == $original_count  + 1, 'ProcessOfflinePayment makes payment correctly' );
140
141 C4::Context->dbh->do("DELETE FROM accountlines WHERE borrowernumber IN ( SELECT borrowernumber FROM borrowers WHERE cardnumber = '99999999999' )");
142 C4::Context->dbh->do("DELETE FROM borrowers WHERE cardnumber = '99999999999'");
143
144 {
145     # CanBookBeRenewed tests
146
147     # Generate test biblio
148     my $biblio = MARC::Record->new();
149     my $title = 'Silence in the library';
150     $biblio->append_fields(
151         MARC::Field->new('100', ' ', ' ', a => 'Moffat, Steven'),
152         MARC::Field->new('245', ' ', ' ', a => $title),
153     );
154
155     my ($biblionumber, $biblioitemnumber);
156     ($biblionumber, $biblioitemnumber) = AddBiblio($biblio, '');
157
158     my $barcode = 'R00000342';
159     my $branch = 'MPL';
160
161     my ($item_bibnum, $item_bibitemnum, $itemnumber) =
162         AddItem({ homebranch => $branch,
163                   holdingbranch => $branch,
164                   barcode => $barcode } , $biblionumber);
165
166     # Create a borrower
167     my %renewing_borrower_data = (
168         firstname =>  'Renewal',
169         surname => 'John',
170         categorycode => 'S',
171         branchcode => $branch,
172     );
173
174     my %reserving_borrower_data = (
175         firstname =>  'Reservation',
176         surname => 'Katrin',
177         categorycode => 'S',
178         branchcode => $branch,
179     );
180
181     my $renewing_borrowernumber = AddMember(%renewing_borrower_data);
182     my $reserving_borrowernumber = AddMember(%reserving_borrower_data);
183
184     my $renewing_borrower = GetMember( borrowernumber => $renewing_borrowernumber );
185
186     my $constraint     = 'a';
187     my $bibitems       = '';
188     my $priority       = '1';
189     my $resdate        = undef;
190     my $expdate        = undef;
191     my $notes          = '';
192     my $checkitem      = undef;
193     my $found          = undef;
194
195     my $now = DateTime->now();
196     my $cancelreserve = 1;
197
198     AddIssue( $renewing_borrower, $barcode, $now, $cancelreserve, $now );
199
200 #    my ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
201 #    is( $renewokay, 1, 'Can renew, book not reserved');
202
203     diag("Biblio-level reserve, renewal test");
204     AddReserve(
205         $branch, $reserving_borrowernumber, $biblionumber,
206         $constraint, $bibitems,  $priority, $resdate, $expdate, $notes,
207         $title, $checkitem, $found
208     );
209
210     my ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
211
212     is( $renewokay, 0, '(Bug 10663) Cannot renew, item reserved');
213     is( $error, 'on_reserve', '(Bug 10663) Cannot renew, item reserved (returned error is on_reserve');
214
215     CancelReserve({
216         biblionumber => $biblionumber,
217         borrowernumber => $reserving_borrowernumber,
218     });
219
220
221     diag("Item-level reserve, renewal test");
222     AddReserve(
223         $branch, $reserving_borrowernumber, $biblionumber,
224         $constraint, $bibitems,  $priority, $resdate, $expdate, $notes,
225         $title, $itemnumber, $found
226     );
227
228     ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
229
230     is( $renewokay, 0, '(Bug 10663) Cannot renew, item reserved');
231     is( $error, 'on_reserve', '(Bug 10663) Cannot renew, item reserved (returned error is on_reserve');
232
233     CancelReserve({
234         biblionumber => $biblionumber,
235         borrowernumber => $reserving_borrowernumber,
236         itemnumber => $itemnumber
237     });
238
239 }
240
241
242 $dbh->rollback;