|
Lines 20-26
Link Here
|
| 20 |
use Modern::Perl; |
20 |
use Modern::Perl; |
| 21 |
|
21 |
|
| 22 |
use Test::NoWarnings; |
22 |
use Test::NoWarnings; |
| 23 |
use Test::More tests => 15; |
23 |
use Test::More tests => 16; |
| 24 |
|
24 |
|
| 25 |
use Test::Exception; |
25 |
use Test::Exception; |
| 26 |
use Test::MockModule; |
26 |
use Test::MockModule; |
|
Lines 29-34
use t::lib::Mocks;
Link Here
|
| 29 |
use t::lib::TestBuilder; |
29 |
use t::lib::TestBuilder; |
| 30 |
use t::lib::Mocks; |
30 |
use t::lib::Mocks; |
| 31 |
|
31 |
|
|
|
32 |
use C4::Reserves qw(AddReserve); |
| 33 |
|
| 32 |
use Koha::ActionLogs; |
34 |
use Koha::ActionLogs; |
| 33 |
use Koha::DateUtils qw(dt_from_string); |
35 |
use Koha::DateUtils qw(dt_from_string); |
| 34 |
use Koha::Holds; |
36 |
use Koha::Holds; |
|
Lines 1161-1163
subtest 'change_type() tests' => sub {
Link Here
|
| 1161 |
|
1163 |
|
| 1162 |
$schema->storage->txn_rollback; |
1164 |
$schema->storage->txn_rollback; |
| 1163 |
}; |
1165 |
}; |
| 1164 |
- |
1166 |
|
|
|
1167 |
subtest 'revert_waiting() tests' => sub { |
| 1168 |
|
| 1169 |
plan tests => 3; |
| 1170 |
|
| 1171 |
subtest 'item-level holds tests' => sub { |
| 1172 |
|
| 1173 |
plan tests => 13; |
| 1174 |
|
| 1175 |
$schema->storage->txn_begin; |
| 1176 |
|
| 1177 |
my $item = $builder->build_sample_item; |
| 1178 |
my $patron = $builder->build_object( |
| 1179 |
{ |
| 1180 |
class => 'Koha::Patrons', |
| 1181 |
value => { branchcode => $item->homebranch } |
| 1182 |
} |
| 1183 |
); |
| 1184 |
|
| 1185 |
# Create item-level hold |
| 1186 |
my $hold = Koha::Holds->find( |
| 1187 |
AddReserve( |
| 1188 |
{ |
| 1189 |
branchcode => $item->homebranch, |
| 1190 |
borrowernumber => $patron->borrowernumber, |
| 1191 |
biblionumber => $item->biblionumber, |
| 1192 |
priority => 1, |
| 1193 |
itemnumber => $item->itemnumber, |
| 1194 |
} |
| 1195 |
) |
| 1196 |
); |
| 1197 |
|
| 1198 |
is( $hold->item_level_hold, 1, 'item_level_hold should be set when AddReserve is called with a specific item' ); |
| 1199 |
|
| 1200 |
my $mock = Test::MockModule->new('Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue'); |
| 1201 |
$mock->mock( |
| 1202 |
'enqueue', |
| 1203 |
sub { |
| 1204 |
my ( $self, $args ) = @_; |
| 1205 |
is_deeply( |
| 1206 |
$args->{biblio_ids}, |
| 1207 |
[ $hold->biblionumber ], |
| 1208 |
"AlterPriority triggers a holds queue update for the related biblio" |
| 1209 |
); |
| 1210 |
} |
| 1211 |
); |
| 1212 |
|
| 1213 |
t::lib::Mocks::mock_preference( 'RealTimeHoldsQueue', 1 ); |
| 1214 |
t::lib::Mocks::mock_preference( 'HoldsLog', 1 ); |
| 1215 |
|
| 1216 |
# Mark it waiting |
| 1217 |
$hold->set_waiting(); |
| 1218 |
|
| 1219 |
isnt( $hold->waitingdate, undef, "'waitingdate' set" ); |
| 1220 |
is( $hold->priority, 0, "'priority' set to 0" ); |
| 1221 |
ok( $hold->is_waiting, 'Hold set to waiting' ); |
| 1222 |
|
| 1223 |
# Revert the waiting status |
| 1224 |
$hold->revert_waiting(); |
| 1225 |
|
| 1226 |
is( $hold->waitingdate, undef, "'waitingdate' reset" ); |
| 1227 |
ok( !$hold->is_waiting, 'Hold no longer set to waiting' ); |
| 1228 |
is( $hold->priority, 1, "'priority' set to 1" ); |
| 1229 |
|
| 1230 |
is( |
| 1231 |
$hold->itemnumber, $item->itemnumber, |
| 1232 |
'Itemnumber should not be removed when the waiting status is revert' |
| 1233 |
); |
| 1234 |
|
| 1235 |
my $log = |
| 1236 |
Koha::ActionLogs->search( { module => 'HOLDS', action => 'MODIFY', object => $hold->reserve_id } )->next; |
| 1237 |
my $expected = sprintf q{'timestamp' => '%s'}, $hold->timestamp; |
| 1238 |
like( $log->info, qr{$expected}, 'Timestamp logged is the current one' ); |
| 1239 |
my $log_count = |
| 1240 |
Koha::ActionLogs->search( { module => 'HOLDS', action => 'MODIFY', object => $hold->reserve_id } )->count; |
| 1241 |
|
| 1242 |
t::lib::Mocks::mock_preference( 'RealTimeHoldsQueue', 0 ); |
| 1243 |
t::lib::Mocks::mock_preference( 'HoldsLog', 0 ); |
| 1244 |
|
| 1245 |
$hold->set_waiting(); |
| 1246 |
|
| 1247 |
# Revert the waiting status, RealTimeHoldsQueue => shouldn't add a test |
| 1248 |
$hold->revert_waiting(); |
| 1249 |
|
| 1250 |
my $log_count_after = |
| 1251 |
Koha::ActionLogs->search( { module => 'HOLDS', action => 'MODIFY', object => $hold->reserve_id } )->count; |
| 1252 |
is( $log_count, $log_count_after, "No logging is added for ->revert_waiting() when HoldsLog is disabled" ); |
| 1253 |
|
| 1254 |
# Set as 'processing' to test the exception behavior |
| 1255 |
$hold->found('P'); |
| 1256 |
throws_ok { $hold->revert_waiting() } |
| 1257 |
'Koha::Exceptions::InvalidStatus', |
| 1258 |
"Hold is not in 'waiting' status, exception thrown"; |
| 1259 |
|
| 1260 |
is( $@->invalid_status, 'hold_not_waiting', "'invalid_status' set the right value" ); |
| 1261 |
|
| 1262 |
$schema->storage->txn_rollback; |
| 1263 |
}; |
| 1264 |
|
| 1265 |
subtest 'biblio-level hold tests' => sub { |
| 1266 |
|
| 1267 |
plan tests => 8; |
| 1268 |
|
| 1269 |
$schema->storage->txn_begin; |
| 1270 |
|
| 1271 |
my $item = $builder->build_sample_item; |
| 1272 |
my $patron = $builder->build_object( |
| 1273 |
{ |
| 1274 |
class => 'Koha::Patrons', |
| 1275 |
value => { branchcode => $item->homebranch } |
| 1276 |
} |
| 1277 |
); |
| 1278 |
|
| 1279 |
# Create biblio-level hold |
| 1280 |
my $hold = Koha::Holds->find( |
| 1281 |
AddReserve( |
| 1282 |
{ |
| 1283 |
branchcode => $item->homebranch, |
| 1284 |
borrowernumber => $patron->borrowernumber, |
| 1285 |
biblionumber => $item->biblionumber, |
| 1286 |
priority => 1, |
| 1287 |
} |
| 1288 |
) |
| 1289 |
); |
| 1290 |
|
| 1291 |
is( |
| 1292 |
$hold->item_level_hold, 0, |
| 1293 |
'item_level_hold should not be set when AddReserve is called without a specific item' |
| 1294 |
); |
| 1295 |
|
| 1296 |
# Mark it waiting |
| 1297 |
$hold->set( { itemnumber => $item->itemnumber } )->set_waiting(); |
| 1298 |
$hold->set_waiting(); |
| 1299 |
|
| 1300 |
isnt( $hold->waitingdate, undef, "'waitingdate' set" ); |
| 1301 |
is( $hold->priority, 0, "'priority' set to 0" ); |
| 1302 |
ok( $hold->is_waiting, 'Hold set to waiting' ); |
| 1303 |
|
| 1304 |
# Revert the waiting status |
| 1305 |
$hold->revert_waiting(); |
| 1306 |
|
| 1307 |
is( $hold->waitingdate, undef, "'waitingdate' reset" ); |
| 1308 |
ok( !$hold->is_waiting, 'Hold no longer set to waiting' ); |
| 1309 |
is( $hold->priority, 1, "'priority' set to 1" ); |
| 1310 |
is( $hold->itemnumber, undef, "'itemnumber' unset" ); |
| 1311 |
|
| 1312 |
$schema->storage->txn_rollback; |
| 1313 |
}; |
| 1314 |
|
| 1315 |
subtest 'priority shift tests' => sub { |
| 1316 |
|
| 1317 |
plan tests => 4; |
| 1318 |
|
| 1319 |
$schema->storage->txn_begin; |
| 1320 |
|
| 1321 |
# Create the items and patrons we need |
| 1322 |
my $library = $builder->build_object( { class => 'Koha::Libraries' } ); |
| 1323 |
my $itype = $builder->build_object( { class => "Koha::ItemTypes", value => { notforloan => 0 } } ); |
| 1324 |
my $item = $builder->build_sample_item( |
| 1325 |
{ |
| 1326 |
itype => $itype->itemtype, |
| 1327 |
library => $library->branchcode |
| 1328 |
} |
| 1329 |
); |
| 1330 |
my $patron_1 = $builder->build_object( { class => "Koha::Patrons" } ); |
| 1331 |
my $patron_2 = $builder->build_object( { class => "Koha::Patrons" } ); |
| 1332 |
my $patron_3 = $builder->build_object( { class => "Koha::Patrons" } ); |
| 1333 |
my $patron_4 = $builder->build_object( { class => "Koha::Patrons" } ); |
| 1334 |
|
| 1335 |
# Place a hold on the title for both patrons |
| 1336 |
my $hold = Koha::Holds->find( |
| 1337 |
C4::Reserves::AddReserve( |
| 1338 |
{ |
| 1339 |
branchcode => $library->branchcode, |
| 1340 |
borrowernumber => $patron_1->borrowernumber, |
| 1341 |
biblionumber => $item->biblionumber, |
| 1342 |
priority => 1, |
| 1343 |
itemnumber => $item->itemnumber, |
| 1344 |
} |
| 1345 |
) |
| 1346 |
); |
| 1347 |
|
| 1348 |
C4::Reserves::AddReserve( |
| 1349 |
{ |
| 1350 |
branchcode => $library->branchcode, |
| 1351 |
borrowernumber => $patron_2->borrowernumber, |
| 1352 |
biblionumber => $item->biblionumber, |
| 1353 |
priority => 1, |
| 1354 |
itemnumber => $item->itemnumber, |
| 1355 |
} |
| 1356 |
); |
| 1357 |
|
| 1358 |
C4::Reserves::AddReserve( |
| 1359 |
{ |
| 1360 |
branchcode => $library->branchcode, |
| 1361 |
borrowernumber => $patron_3->borrowernumber, |
| 1362 |
biblionumber => $item->biblionumber, |
| 1363 |
priority => 1, |
| 1364 |
itemnumber => $item->itemnumber, |
| 1365 |
} |
| 1366 |
); |
| 1367 |
|
| 1368 |
C4::Reserves::AddReserve( |
| 1369 |
{ |
| 1370 |
branchcode => $library->branchcode, |
| 1371 |
borrowernumber => $patron_4->borrowernumber, |
| 1372 |
biblionumber => $item->biblionumber, |
| 1373 |
priority => 1, |
| 1374 |
itemnumber => $item->itemnumber, |
| 1375 |
} |
| 1376 |
); |
| 1377 |
|
| 1378 |
is( $item->biblio->holds->count, 4, '4 holds on the biblio' ); |
| 1379 |
|
| 1380 |
$hold->set_waiting()->discard_changes(); |
| 1381 |
is( $hold->priority, 0, "'priority' set to 0" ); |
| 1382 |
|
| 1383 |
$hold->revert_waiting()->discard_changes(); |
| 1384 |
is( $hold->priority, 1, "'priority' set to 1" ); |
| 1385 |
|
| 1386 |
my $holds = $item->biblio->holds; |
| 1387 |
is_deeply( |
| 1388 |
[ |
| 1389 |
$holds->next->priority, $holds->next->priority, |
| 1390 |
$holds->next->priority, $holds->next->priority, |
| 1391 |
], |
| 1392 |
[ 1, 2, 3, 4 ], |
| 1393 |
'priorities have been reordered' |
| 1394 |
); |
| 1395 |
|
| 1396 |
$schema->storage->txn_rollback; |
| 1397 |
}; |
| 1398 |
}; |