9 use Test
::More tests
=> 25;
17 use lib
$FindBin::Bin
;
18 use_ok
('C4::Reserves');
21 my $dbh = C4
::Context
->dbh;
24 $dbh->{AutoCommit
} = 0;
25 $dbh->{RaiseError
} = 1;
27 my $borrowers_count = 5;
29 # Setup Test------------------------
31 diag
("Creating biblio instance for testing.");
32 my ($bibnum, $title, $bibitemnum) = create_helper_biblio
();
34 # Helper item for that biblio.
35 diag
("Creating item instance for testing.");
36 my ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem
({ homebranch
=> 'CPL', holdingbranch
=> 'CPL' } , $bibnum);
38 # Create some borrowers
40 foreach (1..$borrowers_count) {
41 my $borrowernumber = AddMember
(
42 firstname
=> 'my firstname',
43 surname
=> 'my surname ' . $_,
47 push @borrowernumbers, $borrowernumber;
50 my $biblionumber = $bibnum;
52 my @branches = GetBranchesLoop
();
53 my $branch = $branches[0][0]{value
};
55 # Create five item level holds
56 foreach my $borrowernumber ( @borrowernumbers ) {
68 my $checkitem = $itemnumber,
74 my $reserves = GetReservesFromBiblionumber
({ biblionumber
=> $biblionumber });
75 is
( scalar(@
$reserves), $borrowers_count, "Test GetReserves()" );
78 my ( $reservedate, $borrowernumber, $branchcode, $reserve_id ) = GetReservesFromItemnumber
($itemnumber);
79 ok
($reserve_id, "Test GetReservesFromItemnumber()");
82 my ( $reserve ) = GetReservesFromBorrowernumber
($borrowernumbers[0]);
83 ok
( $reserve->{'borrowernumber'} eq $borrowernumbers[0], "Test GetReservesFromBorrowernumber()");
86 ok
( GetReserveCount
( $borrowernumbers[0] ), "Test GetReserveCount()" );
89 CancelReserve
({ 'reserve_id' => $reserve_id });
90 $reserves = GetReservesFromBiblionumber
({ biblionumber
=> $biblionumber });
91 is
( scalar(@
$reserves), $borrowers_count - 1, "Test CancelReserve()" );
94 ( $reservedate, $borrowernumber, $branchcode, $reserve_id ) = GetReservesFromItemnumber
($itemnumber);
96 reserve_id
=> $reserve_id,
98 branchcode
=> $branch,
99 itemnumber
=> $itemnumber,
100 suspend_until
=> C4
::Dates
->new("2013-01-01","iso")->output(),
102 $reserve = GetReserve
( $reserve_id );
103 ok
( $reserve->{'priority'} eq '4', "Test GetReserve(), priority changed correctly" );
104 ok
( $reserve->{'suspend'}, "Test GetReserve(), suspend hold" );
105 ok
( $reserve->{'suspend_until'} eq '2013-01-01 00:00:00', "Test GetReserve(), suspend until date" );
107 ToggleSuspend
( $reserve_id );
108 $reserve = GetReserve
( $reserve_id );
109 ok
( !$reserve->{'suspend'}, "Test ToggleSuspend(), no date" );
111 ToggleSuspend
( $reserve_id, '2012-01-01' );
112 $reserve = GetReserve
( $reserve_id );
113 ok
( $reserve->{'suspend_until'} eq '2012-01-01 00:00:00', "Test ToggleSuspend(), with date" );
115 AutoUnsuspendReserves
();
116 $reserve = GetReserve
( $reserve_id );
117 ok
( !$reserve->{'suspend'}, "Test AutoUnsuspendReserves()" );
119 # Add a new hold for the borrower whose hold we canceled earlier, this time at the bib level
124 my $constraint = 'a',
134 ( $reserve ) = GetReservesFromBorrowernumber
($borrowernumber);
135 my $reserveid = C4
::Reserves
::GetReserveId
(
137 biblionumber
=> $biblionumber,
138 borrowernumber
=> $borrowernumber
141 is
( $reserveid, $reserve->{reserve_id
}, "Test GetReserveId" );
142 ModReserveMinusPriority
( $itemnumber, $reserve->{'reserve_id'} );
143 ( $reserve ) = GetReservesFromBorrowernumber
($borrowernumber);
144 ok
( $reserve->{'itemnumber'} eq $itemnumber, "Test ModReserveMinusPriority()" );
147 my $reserve2 = GetReserveInfo
( $reserve->{'reserve_id'} );
148 ok
( $reserve->{'reserve_id'} eq $reserve2->{'reserve_id'}, "Test GetReserveInfo()" );
151 $reserves = GetReservesFromBiblionumber
({ biblionumber
=> $biblionumber, all_dates
=> 1 });
152 $reserve = $reserves->[1];
153 AlterPriority
( 'top', $reserve->{'reserve_id'} );
154 $reserve = GetReserve
( $reserve->{'reserve_id'} );
155 ok
( $reserve->{'priority'} eq '1', "Test AlterPriority(), move to top" );
157 AlterPriority
( 'down', $reserve->{'reserve_id'} );
158 $reserve = GetReserve
( $reserve->{'reserve_id'} );
159 ok
( $reserve->{'priority'} eq '2', "Test AlterPriority(), move down" );
161 AlterPriority
( 'up', $reserve->{'reserve_id'} );
162 $reserve = GetReserve
( $reserve->{'reserve_id'} );
163 ok
( $reserve->{'priority'} eq '1', "Test AlterPriority(), move up" );
165 AlterPriority
( 'bottom', $reserve->{'reserve_id'} );
166 $reserve = GetReserve
( $reserve->{'reserve_id'} );
167 ok
( $reserve->{'priority'} eq '5', "Test AlterPriority(), move to bottom" );
169 # Regression test for bug 2394
171 # If IndependentBranches is ON and canreservefromotherbranches is OFF,
172 # a patron is not permittedo to request an item whose homebranch (i.e.,
173 # owner of the item) is different from the patron's own library.
174 # However, if canreservefromotherbranches is turned ON, the patron can
175 # create such hold requests.
177 # Note that canreservefromotherbranches has no effect if
178 # IndependentBranches is OFF.
180 my ($foreign_bibnum, $foreign_title, $foreign_bibitemnum) = create_helper_biblio
();
181 my ($foreign_item_bibnum, $foreign_item_bibitemnum, $foreign_itemnumber)
182 = AddItem
({ homebranch
=> 'MPL', holdingbranch
=> 'MPL' } , $foreign_bibnum);
183 $dbh->do('DELETE FROM issuingrules');
185 q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed)
186 VALUES (?, ?, ?, ?)},
191 # make sure some basic sysprefs are set
192 t
::lib
::Mocks
::mock_preference
('ReservesControlBranch', 'homebranch');
193 t
::lib
::Mocks
::mock_preference
('item-level_itypes', 1);
195 # if IndependentBranches is OFF, a CPL patron can reserve an MPL item
196 t
::lib
::Mocks
::mock_preference
('IndependentBranches', 0);
198 CanItemBeReserved
($borrowernumbers[0], $foreign_itemnumber),
199 'CPL patron allowed to reserve MPL item with IndependentBranches OFF (bug 2394)'
202 # if IndependentBranches is OFF, a CPL patron cannot reserve an MPL item
203 t
::lib
::Mocks
::mock_preference
('IndependentBranches', 1);
204 t
::lib
::Mocks
::mock_preference
('canreservefromotherbranches', 0);
206 ! CanItemBeReserved
($borrowernumbers[0], $foreign_itemnumber),
207 'CPL patron NOT allowed to reserve MPL item with IndependentBranches ON ... (bug 2394)'
210 # ... unless canreservefromotherbranches is ON
211 t
::lib
::Mocks
::mock_preference
('canreservefromotherbranches', 1);
213 CanItemBeReserved
($borrowernumbers[0], $foreign_itemnumber),
214 '... unless canreservefromotherbranches is ON (bug 2394)'
217 # Regression test for bug 11336
218 ($bibnum, $title, $bibitemnum) = create_helper_biblio
();
219 my ( $hold1, $hold2 );
220 ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem
({ homebranch
=> 'CPL', holdingbranch
=> 'CPL' } , $bibnum);
230 my $reserveid1 = C4
::Reserves
::GetReserveId
(
232 biblionumber
=> $bibnum,
233 borrowernumber
=> $borrowernumbers[0]
237 ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem
({ homebranch
=> 'CPL', holdingbranch
=> 'CPL' } , $bibnum);
246 my $reserveid2 = C4
::Reserves
::GetReserveId
(
248 biblionumber
=> $bibnum,
249 borrowernumber
=> $borrowernumbers[1]
253 CancelReserve
({ reserve_id
=> $reserveid1 });
255 $reserve2 = GetReserve
( $reserveid2 );
256 is
( $reserve2->{priority
}, 1, "After cancelreserve, the 2nd reserve becomes the first on the waiting list" );
258 ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem
({ homebranch
=> 'CPL', holdingbranch
=> 'CPL' } , $bibnum);
267 my $reserveid3 = C4
::Reserves
::GetReserveId
(
269 biblionumber
=> $bibnum,
270 borrowernumber
=> $borrowernumbers[0]
274 my $reserve3 = GetReserve
( $reserveid3 );
275 is
( $reserve3->{priority
}, 2, "New reserve for patron 0, the reserve has a priority = 2" );
277 ModReserve
({ reserve_id
=> $reserveid2, rank
=> 'del' });
278 $reserve3 = GetReserve
( $reserveid3 );
279 is
( $reserve3->{priority
}, 1, "After ModReserve, the 3rd reserve becomes the first on the waiting list" );
282 # Helper method to set up a Biblio.
283 sub create_helper_biblio
{
284 my $bib = MARC
::Record
->new();
285 my $title = 'Silence in the library';
287 MARC
::Field
->new('100', ' ', ' ', a
=> 'Moffat, Steven'),
288 MARC
::Field
->new('245', ' ', ' ', a
=> $title),
290 return ($bibnum, $title, $bibitemnum) = AddBiblio
($bib, '');