Bug 11491: add option to supply field names in reports web service output
[koha.git] / t / db_dependent / Holds.t
blob76373e471827209e6d15f690629297e7663e8562
1 #!/usr/bin/perl
3 use Modern::Perl;
5 use t::lib::Mocks;
6 use C4::Context;
7 use C4::Branch;
9 use Test::More tests => 25;
10 use MARC::Record;
11 use C4::Biblio;
12 use C4::Items;
13 use C4::Members;
15 BEGIN {
16 use FindBin;
17 use lib $FindBin::Bin;
18 use_ok('C4::Reserves');
21 my $dbh = C4::Context->dbh;
23 # Start transaction
24 $dbh->{AutoCommit} = 0;
25 $dbh->{RaiseError} = 1;
27 my $borrowers_count = 5;
29 # Setup Test------------------------
30 # Helper biblio.
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
39 my @borrowernumbers;
40 foreach (1..$borrowers_count) {
41 my $borrowernumber = AddMember(
42 firstname => 'my firstname',
43 surname => 'my surname ' . $_,
44 categorycode => 'S',
45 branchcode => 'CPL',
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 ) {
57 AddReserve(
58 $branch,
59 $borrowernumber,
60 $biblionumber,
61 my $constraint = 'a',
62 my $bibitems = q{},
63 my $priority,
64 my $resdate,
65 my $expdate,
66 my $notes = q{},
67 $title,
68 my $checkitem = $itemnumber,
69 my $found,
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);
95 ModReserve({
96 reserve_id => $reserve_id,
97 rank => '4',
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
120 AddReserve(
121 $branch,
122 $borrowernumber,
123 $biblionumber,
124 my $constraint = 'a',
125 my $bibitems = q{},
126 my $priority,
127 my $resdate,
128 my $expdate,
129 my $notes = q{},
130 $title,
131 my $checkitem,
132 my $found,
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');
184 $dbh->do(
185 q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed)
186 VALUES (?, ?, ?, ?)},
188 '*', '*', '*', 25
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);
221 AddReserve(
222 $branch,
223 $borrowernumbers[0],
224 $bibnum,
225 'a',
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);
238 AddReserve(
239 $branch,
240 $borrowernumbers[1],
241 $bibnum,
242 'a',
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);
259 AddReserve(
260 $branch,
261 $borrowernumbers[0],
262 $bibnum,
263 'a',
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';
286 $bib->append_fields(
287 MARC::Field->new('100', ' ', ' ', a => 'Moffat, Steven'),
288 MARC::Field->new('245', ' ', ' ', a => $title),
290 return ($bibnum, $title, $bibitemnum) = AddBiblio($bib, '');