|
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 1259-1261
subtest 'strings_map() tests' => sub {
Link Here
|
| 1259 |
|
1261 |
|
| 1260 |
$schema->txn_rollback; |
1262 |
$schema->txn_rollback; |
| 1261 |
}; |
1263 |
}; |
| 1262 |
- |
1264 |
|
|
|
1265 |
subtest 'revert_waiting() tests' => sub { |
| 1266 |
|
| 1267 |
plan tests => 3; |
| 1268 |
|
| 1269 |
subtest 'item-level holds tests' => sub { |
| 1270 |
|
| 1271 |
plan tests => 13; |
| 1272 |
|
| 1273 |
$schema->storage->txn_begin; |
| 1274 |
|
| 1275 |
my $item = $builder->build_sample_item; |
| 1276 |
my $patron = $builder->build_object( |
| 1277 |
{ |
| 1278 |
class => 'Koha::Patrons', |
| 1279 |
value => { branchcode => $item->homebranch } |
| 1280 |
} |
| 1281 |
); |
| 1282 |
|
| 1283 |
# Create item-level hold |
| 1284 |
my $hold = Koha::Holds->find( |
| 1285 |
AddReserve( |
| 1286 |
{ |
| 1287 |
branchcode => $item->homebranch, |
| 1288 |
borrowernumber => $patron->borrowernumber, |
| 1289 |
biblionumber => $item->biblionumber, |
| 1290 |
priority => 1, |
| 1291 |
itemnumber => $item->itemnumber, |
| 1292 |
} |
| 1293 |
) |
| 1294 |
); |
| 1295 |
|
| 1296 |
is( $hold->item_level_hold, 1, 'item_level_hold should be set when AddReserve is called with a specific item' ); |
| 1297 |
|
| 1298 |
my $mock = Test::MockModule->new('Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue'); |
| 1299 |
$mock->mock( |
| 1300 |
'enqueue', |
| 1301 |
sub { |
| 1302 |
my ( $self, $args ) = @_; |
| 1303 |
is_deeply( |
| 1304 |
$args->{biblio_ids}, |
| 1305 |
[ $hold->biblionumber ], |
| 1306 |
"AlterPriority triggers a holds queue update for the related biblio" |
| 1307 |
); |
| 1308 |
} |
| 1309 |
); |
| 1310 |
|
| 1311 |
t::lib::Mocks::mock_preference( 'RealTimeHoldsQueue', 1 ); |
| 1312 |
t::lib::Mocks::mock_preference( 'HoldsLog', 1 ); |
| 1313 |
|
| 1314 |
# Mark it waiting |
| 1315 |
$hold->set_waiting(); |
| 1316 |
|
| 1317 |
isnt( $hold->waitingdate, undef, "'waitingdate' set" ); |
| 1318 |
is( $hold->priority, 0, "'priority' set to 0" ); |
| 1319 |
ok( $hold->is_waiting, 'Hold set to waiting' ); |
| 1320 |
|
| 1321 |
# Revert the waiting status |
| 1322 |
$hold->revert_waiting(); |
| 1323 |
|
| 1324 |
is( $hold->waitingdate, undef, "'waitingdate' reset" ); |
| 1325 |
ok( !$hold->is_waiting, 'Hold no longer set to waiting' ); |
| 1326 |
is( $hold->priority, 1, "'priority' set to 1" ); |
| 1327 |
|
| 1328 |
is( |
| 1329 |
$hold->itemnumber, $item->itemnumber, |
| 1330 |
'Itemnumber should not be removed when the waiting status is revert' |
| 1331 |
); |
| 1332 |
|
| 1333 |
my $log = |
| 1334 |
Koha::ActionLogs->search( { module => 'HOLDS', action => 'MODIFY', object => $hold->reserve_id } )->next; |
| 1335 |
my $expected = sprintf q{'timestamp' => '%s'}, $hold->timestamp; |
| 1336 |
like( $log->info, qr{$expected}, 'Timestamp logged is the current one' ); |
| 1337 |
my $log_count = |
| 1338 |
Koha::ActionLogs->search( { module => 'HOLDS', action => 'MODIFY', object => $hold->reserve_id } )->count; |
| 1339 |
|
| 1340 |
t::lib::Mocks::mock_preference( 'RealTimeHoldsQueue', 0 ); |
| 1341 |
t::lib::Mocks::mock_preference( 'HoldsLog', 0 ); |
| 1342 |
|
| 1343 |
$hold->set_waiting(); |
| 1344 |
|
| 1345 |
# Revert the waiting status, RealTimeHoldsQueue => shouldn't add a test |
| 1346 |
$hold->revert_waiting(); |
| 1347 |
|
| 1348 |
my $log_count_after = |
| 1349 |
Koha::ActionLogs->search( { module => 'HOLDS', action => 'MODIFY', object => $hold->reserve_id } )->count; |
| 1350 |
is( $log_count, $log_count_after, "No logging is added for ->revert_waiting() when HoldsLog is disabled" ); |
| 1351 |
|
| 1352 |
# Set as 'processing' to test the exception behavior |
| 1353 |
$hold->found('P'); |
| 1354 |
throws_ok { $hold->revert_waiting() } |
| 1355 |
'Koha::Exceptions::InvalidStatus', |
| 1356 |
"Hold is not in 'waiting' status, exception thrown"; |
| 1357 |
|
| 1358 |
is( $@->invalid_status, 'hold_not_waiting', "'invalid_status' set the right value" ); |
| 1359 |
|
| 1360 |
$schema->storage->txn_rollback; |
| 1361 |
}; |
| 1362 |
|
| 1363 |
subtest 'biblio-level hold tests' => sub { |
| 1364 |
|
| 1365 |
plan tests => 8; |
| 1366 |
|
| 1367 |
$schema->storage->txn_begin; |
| 1368 |
|
| 1369 |
my $item = $builder->build_sample_item; |
| 1370 |
my $patron = $builder->build_object( |
| 1371 |
{ |
| 1372 |
class => 'Koha::Patrons', |
| 1373 |
value => { branchcode => $item->homebranch } |
| 1374 |
} |
| 1375 |
); |
| 1376 |
|
| 1377 |
# Create biblio-level hold |
| 1378 |
my $hold = Koha::Holds->find( |
| 1379 |
AddReserve( |
| 1380 |
{ |
| 1381 |
branchcode => $item->homebranch, |
| 1382 |
borrowernumber => $patron->borrowernumber, |
| 1383 |
biblionumber => $item->biblionumber, |
| 1384 |
priority => 1, |
| 1385 |
} |
| 1386 |
) |
| 1387 |
); |
| 1388 |
|
| 1389 |
is( |
| 1390 |
$hold->item_level_hold, 0, |
| 1391 |
'item_level_hold should not be set when AddReserve is called without a specific item' |
| 1392 |
); |
| 1393 |
|
| 1394 |
# Mark it waiting |
| 1395 |
$hold->set( { itemnumber => $item->itemnumber } )->set_waiting(); |
| 1396 |
$hold->set_waiting(); |
| 1397 |
|
| 1398 |
isnt( $hold->waitingdate, undef, "'waitingdate' set" ); |
| 1399 |
is( $hold->priority, 0, "'priority' set to 0" ); |
| 1400 |
ok( $hold->is_waiting, 'Hold set to waiting' ); |
| 1401 |
|
| 1402 |
# Revert the waiting status |
| 1403 |
$hold->revert_waiting(); |
| 1404 |
|
| 1405 |
is( $hold->waitingdate, undef, "'waitingdate' reset" ); |
| 1406 |
ok( !$hold->is_waiting, 'Hold no longer set to waiting' ); |
| 1407 |
is( $hold->priority, 1, "'priority' set to 1" ); |
| 1408 |
is( $hold->itemnumber, undef, "'itemnumber' unset" ); |
| 1409 |
|
| 1410 |
$schema->storage->txn_rollback; |
| 1411 |
}; |
| 1412 |
|
| 1413 |
subtest 'priority shift tests' => sub { |
| 1414 |
|
| 1415 |
plan tests => 4; |
| 1416 |
|
| 1417 |
$schema->storage->txn_begin; |
| 1418 |
|
| 1419 |
# Create the items and patrons we need |
| 1420 |
my $library = $builder->build_object( { class => 'Koha::Libraries' } ); |
| 1421 |
my $itype = $builder->build_object( { class => "Koha::ItemTypes", value => { notforloan => 0 } } ); |
| 1422 |
my $item = $builder->build_sample_item( |
| 1423 |
{ |
| 1424 |
itype => $itype->itemtype, |
| 1425 |
library => $library->branchcode |
| 1426 |
} |
| 1427 |
); |
| 1428 |
my $patron_1 = $builder->build_object( { class => "Koha::Patrons" } ); |
| 1429 |
my $patron_2 = $builder->build_object( { class => "Koha::Patrons" } ); |
| 1430 |
my $patron_3 = $builder->build_object( { class => "Koha::Patrons" } ); |
| 1431 |
my $patron_4 = $builder->build_object( { class => "Koha::Patrons" } ); |
| 1432 |
|
| 1433 |
# Place a hold on the title for both patrons |
| 1434 |
my $hold = Koha::Holds->find( |
| 1435 |
C4::Reserves::AddReserve( |
| 1436 |
{ |
| 1437 |
branchcode => $library->branchcode, |
| 1438 |
borrowernumber => $patron_1->borrowernumber, |
| 1439 |
biblionumber => $item->biblionumber, |
| 1440 |
priority => 1, |
| 1441 |
itemnumber => $item->itemnumber, |
| 1442 |
} |
| 1443 |
) |
| 1444 |
); |
| 1445 |
|
| 1446 |
C4::Reserves::AddReserve( |
| 1447 |
{ |
| 1448 |
branchcode => $library->branchcode, |
| 1449 |
borrowernumber => $patron_2->borrowernumber, |
| 1450 |
biblionumber => $item->biblionumber, |
| 1451 |
priority => 1, |
| 1452 |
itemnumber => $item->itemnumber, |
| 1453 |
} |
| 1454 |
); |
| 1455 |
|
| 1456 |
C4::Reserves::AddReserve( |
| 1457 |
{ |
| 1458 |
branchcode => $library->branchcode, |
| 1459 |
borrowernumber => $patron_3->borrowernumber, |
| 1460 |
biblionumber => $item->biblionumber, |
| 1461 |
priority => 1, |
| 1462 |
itemnumber => $item->itemnumber, |
| 1463 |
} |
| 1464 |
); |
| 1465 |
|
| 1466 |
C4::Reserves::AddReserve( |
| 1467 |
{ |
| 1468 |
branchcode => $library->branchcode, |
| 1469 |
borrowernumber => $patron_4->borrowernumber, |
| 1470 |
biblionumber => $item->biblionumber, |
| 1471 |
priority => 1, |
| 1472 |
itemnumber => $item->itemnumber, |
| 1473 |
} |
| 1474 |
); |
| 1475 |
|
| 1476 |
is( $item->biblio->holds->count, 4, '4 holds on the biblio' ); |
| 1477 |
|
| 1478 |
$hold->set_waiting()->discard_changes(); |
| 1479 |
is( $hold->priority, 0, "'priority' set to 0" ); |
| 1480 |
|
| 1481 |
$hold->revert_waiting()->discard_changes(); |
| 1482 |
is( $hold->priority, 1, "'priority' set to 1" ); |
| 1483 |
|
| 1484 |
my $holds = $item->biblio->holds; |
| 1485 |
is_deeply( |
| 1486 |
[ |
| 1487 |
$holds->next->priority, $holds->next->priority, |
| 1488 |
$holds->next->priority, $holds->next->priority, |
| 1489 |
], |
| 1490 |
[ 1, 2, 3, 4 ], |
| 1491 |
'priorities have been reordered' |
| 1492 |
); |
| 1493 |
|
| 1494 |
$schema->storage->txn_rollback; |
| 1495 |
}; |
| 1496 |
}; |