|
Lines 19-25
Link Here
|
| 19 |
|
19 |
|
| 20 |
use Modern::Perl; |
20 |
use Modern::Perl; |
| 21 |
|
21 |
|
| 22 |
use Test::More tests => 20; |
22 |
use Test::More tests => 27; |
| 23 |
|
23 |
|
| 24 |
use Test::MockModule; |
24 |
use Test::MockModule; |
| 25 |
use Test::Exception; |
25 |
use Test::Exception; |
|
Lines 34-39
use Koha::Items;
Link Here
|
| 34 |
use Koha::Database; |
34 |
use Koha::Database; |
| 35 |
use Koha::DateUtils qw( dt_from_string ); |
35 |
use Koha::DateUtils qw( dt_from_string ); |
| 36 |
use Koha::Statistics; |
36 |
use Koha::Statistics; |
|
|
37 |
use Koha::Recalls; |
| 37 |
|
38 |
|
| 38 |
use t::lib::TestBuilder; |
39 |
use t::lib::TestBuilder; |
| 39 |
use t::lib::Mocks; |
40 |
use t::lib::Mocks; |
|
Lines 68-73
is( Koha::Items->search->count, $nb_of_items + 2, 'The 2 items should have been
Link Here
|
| 68 |
my $retrieved_item_1 = Koha::Items->find( $new_item_1->itemnumber ); |
69 |
my $retrieved_item_1 = Koha::Items->find( $new_item_1->itemnumber ); |
| 69 |
is( $retrieved_item_1->barcode, $new_item_1->barcode, 'Find a item by id should return the correct item' ); |
70 |
is( $retrieved_item_1->barcode, $new_item_1->barcode, 'Find a item by id should return the correct item' ); |
| 70 |
|
71 |
|
|
|
72 |
subtest 'search' => sub { |
| 73 |
|
| 74 |
plan tests => 9; |
| 75 |
$schema->storage->txn_begin; |
| 76 |
|
| 77 |
my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); |
| 78 |
my $patron_2 = $builder->build_object( { class => 'Koha::Patrons' } ); |
| 79 |
t::lib::Mocks::mock_userenv( { branchcode => $patron->branchcode } ); |
| 80 |
|
| 81 |
my $library_1 = $builder->build( { source => 'Branch' } ); |
| 82 |
my $library_2 = $builder->build( { source => 'Branch' } ); |
| 83 |
|
| 84 |
my $biblio = $builder->build_sample_biblio(); |
| 85 |
|
| 86 |
my $item_1 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 87 |
my $item_2 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 88 |
|
| 89 |
my $available_items = Koha::Items->search( |
| 90 |
{ |
| 91 |
_status => 'available', |
| 92 |
biblionumber => $biblio->biblionumber, |
| 93 |
} |
| 94 |
); |
| 95 |
|
| 96 |
ok( $available_items->count == 2, "Filtered to 2 available items" ); |
| 97 |
|
| 98 |
my $item_3 = $builder->build_sample_item( |
| 99 |
{ |
| 100 |
biblionumber => $biblio->biblionumber, |
| 101 |
itemlost => 1, |
| 102 |
} |
| 103 |
); |
| 104 |
|
| 105 |
my $item_4 = $builder->build_sample_item( |
| 106 |
{ |
| 107 |
biblionumber => $biblio->biblionumber, |
| 108 |
damaged => 1, |
| 109 |
} |
| 110 |
); |
| 111 |
|
| 112 |
my $item_5 = $builder->build_sample_item( |
| 113 |
{ |
| 114 |
biblionumber => $biblio->biblionumber, |
| 115 |
withdrawn => 1, |
| 116 |
} |
| 117 |
); |
| 118 |
|
| 119 |
my $item_6 = $builder->build_sample_item( |
| 120 |
{ |
| 121 |
biblionumber => $biblio->biblionumber, |
| 122 |
notforloan => 1, |
| 123 |
} |
| 124 |
); |
| 125 |
|
| 126 |
my $lost_items = Koha::Items->search( |
| 127 |
{ |
| 128 |
_status => 'lost', |
| 129 |
biblionumber => $biblio->biblionumber, |
| 130 |
} |
| 131 |
); |
| 132 |
|
| 133 |
my $damaged_items = Koha::Items->search( |
| 134 |
{ |
| 135 |
_status => 'damaged', |
| 136 |
biblionumber => $biblio->biblionumber, |
| 137 |
} |
| 138 |
); |
| 139 |
|
| 140 |
my $withdrawn_items = Koha::Items->search( |
| 141 |
{ |
| 142 |
_status => 'withdrawn', |
| 143 |
biblionumber => $biblio->biblionumber, |
| 144 |
} |
| 145 |
); |
| 146 |
|
| 147 |
my $notforloan_items = Koha::Items->search( |
| 148 |
{ |
| 149 |
_status => 'not_for_loan', |
| 150 |
biblionumber => $biblio->biblionumber, |
| 151 |
} |
| 152 |
); |
| 153 |
|
| 154 |
ok( $lost_items->count == 1, "Filtered to 1 lost item" ); |
| 155 |
ok( $damaged_items->count == 1, "Filtered to 1 damaged item" ); |
| 156 |
ok( $withdrawn_items->count == 1, "Filtered to 1 withdrawn item" ); |
| 157 |
ok( $notforloan_items->count == 1, "Filtered to 1 notforloan item" ); |
| 158 |
|
| 159 |
C4::Circulation::AddIssue( $patron, $item_1->barcode ); |
| 160 |
|
| 161 |
my $checked_out_items = Koha::Items->search( |
| 162 |
{ |
| 163 |
_status => 'checked_out', |
| 164 |
biblionumber => $biblio->biblionumber, |
| 165 |
} |
| 166 |
); |
| 167 |
|
| 168 |
ok( $checked_out_items->count == 1, "Filtered to 1 checked out item" ); |
| 169 |
|
| 170 |
my $transfer_1 = $builder->build_object( |
| 171 |
{ |
| 172 |
class => 'Koha::Item::Transfers', |
| 173 |
value => { |
| 174 |
itemnumber => $item_2->itemnumber, |
| 175 |
frombranch => $library_1->{branchcode}, |
| 176 |
tobranch => $library_2->{branchcode}, |
| 177 |
} |
| 178 |
} |
| 179 |
); |
| 180 |
|
| 181 |
my $in_transit_items = Koha::Items->search( |
| 182 |
{ |
| 183 |
_status => 'in_transit', |
| 184 |
biblionumber => $biblio->biblionumber, |
| 185 |
} |
| 186 |
); |
| 187 |
|
| 188 |
ok( $in_transit_items->count == 1, "Filtered to 1 in transit item" ); |
| 189 |
|
| 190 |
my $item_7 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 191 |
|
| 192 |
my $hold_1 = $builder->build( |
| 193 |
{ |
| 194 |
source => 'Reserve', |
| 195 |
value => { |
| 196 |
itemnumber => $item_7->itemnumber, reservedate => dt_from_string, |
| 197 |
} |
| 198 |
} |
| 199 |
); |
| 200 |
|
| 201 |
my $on_hold_items = Koha::Items->search( |
| 202 |
{ |
| 203 |
_status => 'on_hold', |
| 204 |
biblionumber => $biblio->biblionumber, |
| 205 |
} |
| 206 |
); |
| 207 |
|
| 208 |
ok( $on_hold_items->count == 1, "Filtered to 1 on hold item" ); |
| 209 |
|
| 210 |
my $item_8 = $builder->build_sample_item( |
| 211 |
{ |
| 212 |
biblionumber => $biblio->biblionumber, |
| 213 |
restricted => 1, |
| 214 |
} |
| 215 |
); |
| 216 |
|
| 217 |
my $restricted_items = Koha::Items->search( |
| 218 |
{ |
| 219 |
_status => 'restricted', |
| 220 |
biblionumber => $biblio->biblionumber, |
| 221 |
} |
| 222 |
); |
| 223 |
|
| 224 |
ok( $restricted_items->count == 1, "Filtered to 1 restricted item" ); |
| 225 |
|
| 226 |
$schema->storage->txn_rollback; |
| 227 |
}; |
| 228 |
|
| 71 |
subtest 'store' => sub { |
229 |
subtest 'store' => sub { |
| 72 |
plan tests => 8; |
230 |
plan tests => 8; |
| 73 |
|
231 |
|
|
Lines 2222-2224
subtest 'filter_by_bookable' => sub {
Link Here
|
| 2222 |
|
2380 |
|
| 2223 |
$schema->storage->txn_rollback; |
2381 |
$schema->storage->txn_rollback; |
| 2224 |
}; |
2382 |
}; |
| 2225 |
- |
2383 |
|
|
|
2384 |
subtest 'filter_by_checked_out' => sub { |
| 2385 |
plan tests => 4; |
| 2386 |
|
| 2387 |
$schema->storage->txn_begin; |
| 2388 |
|
| 2389 |
my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); |
| 2390 |
t::lib::Mocks::mock_userenv( { branchcode => $patron->branchcode } ); |
| 2391 |
|
| 2392 |
my $biblio = $builder->build_sample_biblio(); |
| 2393 |
my $item_1 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 2394 |
my $item_2 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 2395 |
|
| 2396 |
is( $biblio->items->filter_by_checked_out->count, 0, "Filtered 0 checked out items" ); |
| 2397 |
|
| 2398 |
C4::Circulation::AddIssue( $patron, $item_1->barcode ); |
| 2399 |
|
| 2400 |
is( $biblio->items->filter_by_checked_out->count, 1, "Filtered 1 checked out items" ); |
| 2401 |
|
| 2402 |
C4::Circulation::AddIssue( $patron, $item_2->barcode ); |
| 2403 |
|
| 2404 |
is( $biblio->items->filter_by_checked_out->count, 2, "Filtered 2 checked out items" ); |
| 2405 |
|
| 2406 |
# Do the returns |
| 2407 |
C4::Circulation::AddReturn( $item_1->barcode ); |
| 2408 |
C4::Circulation::AddReturn( $item_2->barcode ); |
| 2409 |
|
| 2410 |
is( $biblio->items->filter_by_checked_out->count, 0, "Filtered 0 checked out items" ); |
| 2411 |
|
| 2412 |
$schema->storage->txn_rollback; |
| 2413 |
|
| 2414 |
}; |
| 2415 |
|
| 2416 |
subtest 'filter_by_in_transit' => sub { |
| 2417 |
plan tests => 3; |
| 2418 |
|
| 2419 |
$schema->storage->txn_begin; |
| 2420 |
|
| 2421 |
my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); |
| 2422 |
t::lib::Mocks::mock_userenv( { branchcode => $patron->branchcode } ); |
| 2423 |
|
| 2424 |
my $library_1 = $builder->build( { source => 'Branch' } ); |
| 2425 |
my $library_2 = $builder->build( { source => 'Branch' } ); |
| 2426 |
|
| 2427 |
my $biblio = $builder->build_sample_biblio(); |
| 2428 |
my $item_1 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 2429 |
my $item_2 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 2430 |
|
| 2431 |
is( $biblio->items->filter_by_in_transit->count, 0, "Filtered 0 in transit items" ); |
| 2432 |
|
| 2433 |
my $transfer_1 = $builder->build_object( |
| 2434 |
{ |
| 2435 |
class => 'Koha::Item::Transfers', |
| 2436 |
value => { |
| 2437 |
itemnumber => $item_1->itemnumber, |
| 2438 |
frombranch => $library_1->{branchcode}, |
| 2439 |
tobranch => $library_2->{branchcode}, |
| 2440 |
} |
| 2441 |
} |
| 2442 |
); |
| 2443 |
|
| 2444 |
is( $biblio->items->filter_by_in_transit->count, 1, "Filtered 1 in transit items" ); |
| 2445 |
|
| 2446 |
my $transfer_2 = $builder->build_object( |
| 2447 |
{ |
| 2448 |
class => 'Koha::Item::Transfers', |
| 2449 |
value => { |
| 2450 |
itemnumber => $item_2->itemnumber, |
| 2451 |
frombranch => $library_2->{branchcode}, |
| 2452 |
tobranch => $library_1->{branchcode}, |
| 2453 |
} |
| 2454 |
} |
| 2455 |
); |
| 2456 |
|
| 2457 |
is( $biblio->items->filter_by_in_transit->count, 2, "Filtered 2 in transit items" ); |
| 2458 |
|
| 2459 |
$schema->storage->txn_rollback; |
| 2460 |
|
| 2461 |
}; |
| 2462 |
|
| 2463 |
subtest 'filter_by_has_holds' => sub { |
| 2464 |
plan tests => 3; |
| 2465 |
|
| 2466 |
$schema->storage->txn_begin; |
| 2467 |
|
| 2468 |
my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); |
| 2469 |
t::lib::Mocks::mock_userenv( { branchcode => $patron->branchcode } ); |
| 2470 |
|
| 2471 |
my $library_1 = $builder->build( { source => 'Branch' } ); |
| 2472 |
my $library_2 = $builder->build( { source => 'Branch' } ); |
| 2473 |
|
| 2474 |
my $biblio = $builder->build_sample_biblio(); |
| 2475 |
my $item_1 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 2476 |
my $item_2 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 2477 |
|
| 2478 |
is( $biblio->items->filter_by_has_holds->count, 0, "Filtered to 0 holds" ); |
| 2479 |
|
| 2480 |
my $hold_1 = $builder->build( |
| 2481 |
{ |
| 2482 |
source => 'Reserve', |
| 2483 |
value => { |
| 2484 |
itemnumber => $item_1->itemnumber, reservedate => dt_from_string, |
| 2485 |
} |
| 2486 |
} |
| 2487 |
); |
| 2488 |
|
| 2489 |
is( $biblio->items->filter_by_has_holds->count, 1, "Filtered to 1 hold" ); |
| 2490 |
|
| 2491 |
my $hold_2 = $builder->build( |
| 2492 |
{ |
| 2493 |
source => 'Reserve', |
| 2494 |
value => { |
| 2495 |
itemnumber => $item_2->itemnumber, reservedate => dt_from_string, |
| 2496 |
} |
| 2497 |
} |
| 2498 |
); |
| 2499 |
|
| 2500 |
is( $biblio->items->filter_by_has_holds->count, 2, "Filtered to 2 holds" ); |
| 2501 |
|
| 2502 |
$schema->storage->txn_rollback; |
| 2503 |
|
| 2504 |
}; |
| 2505 |
|
| 2506 |
subtest 'filter_by_in_bundle' => sub { |
| 2507 |
plan tests => 3; |
| 2508 |
|
| 2509 |
$schema->storage->txn_begin; |
| 2510 |
|
| 2511 |
my $library = $builder->build( { source => 'Branch' } ); |
| 2512 |
my $biblio = $builder->build_sample_biblio(); |
| 2513 |
|
| 2514 |
my $item_1 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 2515 |
my $item_2 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 2516 |
my $item_3 = $builder->build_sample_item( { biblionumber => $biblio->biblionumber, } ); |
| 2517 |
|
| 2518 |
is( $biblio->items->filter_by_in_bundle->count, 0, "0 items in a bundle for this record" ); |
| 2519 |
|
| 2520 |
my $in_bundle = $item_1->in_bundle; |
| 2521 |
|
| 2522 |
my $host_item = $builder->build_sample_item(); |
| 2523 |
$schema->resultset('ItemBundle')->create( { host => $host_item->itemnumber, item => $item_1->itemnumber } ); |
| 2524 |
|
| 2525 |
$in_bundle = $item_1->in_bundle; |
| 2526 |
|
| 2527 |
is( $biblio->items->filter_by_in_bundle->count, 1, "1 item in a bundle for this record" ); |
| 2528 |
$schema->resultset('ItemBundle')->create( { host => $host_item->itemnumber, item => $item_2->itemnumber } ); |
| 2529 |
|
| 2530 |
$in_bundle = $item_2->in_bundle; |
| 2531 |
|
| 2532 |
is( $biblio->items->filter_by_in_bundle->count, 2, "2 items in a bundle for this record" ); |
| 2533 |
|
| 2534 |
$schema->storage->txn_rollback; |
| 2535 |
|
| 2536 |
}; |
| 2537 |
|
| 2538 |
subtest 'filter_by_has_recalls' => sub { |
| 2539 |
plan tests => 2; |
| 2540 |
|
| 2541 |
$schema->storage->txn_begin; |
| 2542 |
|
| 2543 |
my $library = $builder->build_object( { class => 'Koha::Libraries' } ); |
| 2544 |
|
| 2545 |
$biblio = $builder->build_sample_biblio( { author => 'Hall, Daria' } ); |
| 2546 |
my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); |
| 2547 |
t::lib::Mocks::mock_userenv( { branchcode => $patron->branchcode } ); |
| 2548 |
|
| 2549 |
my $item = $builder->build_sample_item( |
| 2550 |
{ |
| 2551 |
biblionumber => $biblio->biblionumber, |
| 2552 |
library => $library->branchcode, |
| 2553 |
} |
| 2554 |
); |
| 2555 |
|
| 2556 |
C4::Circulation::AddIssue( $patron, $item->barcode ); |
| 2557 |
|
| 2558 |
is( $biblio->items->filter_by_has_recalls->count, 0, "0 items with recalls on this record" ); |
| 2559 |
|
| 2560 |
Koha::Recalls->add_recall( { biblio => $item->biblio, item => $item, patron => $patron } ); |
| 2561 |
|
| 2562 |
is( $biblio->items->filter_by_has_recalls->count, 1, "1 item with recalls on this record" ); |
| 2563 |
|
| 2564 |
$schema->storage->txn_rollback; |
| 2565 |
|
| 2566 |
}; |
| 2567 |
|
| 2568 |
subtest 'filter_by_available' => sub { |
| 2569 |
plan tests => 6; |
| 2570 |
|
| 2571 |
$schema->storage->txn_begin; |
| 2572 |
|
| 2573 |
my $library = $builder->build_object( { class => 'Koha::Libraries' } ); |
| 2574 |
my $biblio = $builder->build_sample_biblio(); |
| 2575 |
my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); |
| 2576 |
t::lib::Mocks::mock_userenv( { branchcode => $patron->branchcode } ); |
| 2577 |
|
| 2578 |
my $item_1 = $builder->build_sample_item( |
| 2579 |
{ |
| 2580 |
biblionumber => $biblio->biblionumber, |
| 2581 |
library => $library->branchcode, |
| 2582 |
itemlost => 0, |
| 2583 |
withdrawn => 0, |
| 2584 |
damaged => 0, |
| 2585 |
notforloan => 0, |
| 2586 |
onloan => undef, |
| 2587 |
} |
| 2588 |
); |
| 2589 |
|
| 2590 |
my $item_2 = $builder->build_sample_item( |
| 2591 |
{ |
| 2592 |
biblionumber => $biblio->biblionumber, |
| 2593 |
library => $library->branchcode, |
| 2594 |
itemlost => 0, |
| 2595 |
withdrawn => 0, |
| 2596 |
damaged => 0, |
| 2597 |
notforloan => 0, |
| 2598 |
onloan => undef, |
| 2599 |
} |
| 2600 |
); |
| 2601 |
|
| 2602 |
my $item_3 = $builder->build_sample_item( |
| 2603 |
{ |
| 2604 |
biblionumber => $biblio->biblionumber, |
| 2605 |
library => $library->branchcode, |
| 2606 |
itemlost => 0, |
| 2607 |
withdrawn => 0, |
| 2608 |
damaged => 0, |
| 2609 |
notforloan => 0, |
| 2610 |
onloan => undef, |
| 2611 |
} |
| 2612 |
); |
| 2613 |
|
| 2614 |
my $item_4 = $builder->build_sample_item( |
| 2615 |
{ |
| 2616 |
biblionumber => $biblio->biblionumber, |
| 2617 |
library => $library->branchcode, |
| 2618 |
itemlost => 0, |
| 2619 |
withdrawn => 0, |
| 2620 |
damaged => 0, |
| 2621 |
notforloan => 0, |
| 2622 |
onloan => undef, |
| 2623 |
} |
| 2624 |
); |
| 2625 |
|
| 2626 |
my $item_5 = $builder->build_sample_item( |
| 2627 |
{ |
| 2628 |
biblionumber => $biblio->biblionumber, |
| 2629 |
library => $library->branchcode, |
| 2630 |
itemlost => 0, |
| 2631 |
withdrawn => 0, |
| 2632 |
damaged => 0, |
| 2633 |
notforloan => 0, |
| 2634 |
onloan => undef, |
| 2635 |
} |
| 2636 |
); |
| 2637 |
|
| 2638 |
# Create items with varying states |
| 2639 |
# Test: Initial available items |
| 2640 |
is( |
| 2641 |
$biblio->items->filter_by_available->count, |
| 2642 |
5, |
| 2643 |
"Filtered to 4 available items" |
| 2644 |
); |
| 2645 |
|
| 2646 |
# Mark item_1 as lost |
| 2647 |
$item_1->itemlost(3)->store; |
| 2648 |
C4::Circulation::LostItem( $item_1->itemnumber, 1 ); |
| 2649 |
|
| 2650 |
is( |
| 2651 |
$biblio->items->filter_by_available->count, |
| 2652 |
4, |
| 2653 |
"Filtered to 4 available items, 1 is lost" |
| 2654 |
); |
| 2655 |
|
| 2656 |
#Mark item_2 as damaged |
| 2657 |
$item_2->damaged(1)->store; |
| 2658 |
|
| 2659 |
is( |
| 2660 |
$biblio->items->filter_by_available->count, |
| 2661 |
3, |
| 2662 |
"Filtered to 3 available items, 1 is lost, 1 is damaged" |
| 2663 |
); |
| 2664 |
|
| 2665 |
#Mark item_3 as withdrawn |
| 2666 |
$item_3->withdrawn(1)->store; |
| 2667 |
|
| 2668 |
is( |
| 2669 |
$biblio->items->filter_by_available->count, |
| 2670 |
2, |
| 2671 |
"Filtered to 2 available items, 1 is lost, 1 is damaged, 1 is withdrawn" |
| 2672 |
); |
| 2673 |
|
| 2674 |
#Checkout item_4 |
| 2675 |
C4::Circulation::AddIssue( $patron, $item_4->barcode ); |
| 2676 |
is( |
| 2677 |
$biblio->items->filter_by_available->count, |
| 2678 |
1, |
| 2679 |
"Filtered to 1 available items, 1 is lost, 1 is damaged, 1 is withdrawn, 1 is checked out" |
| 2680 |
); |
| 2681 |
|
| 2682 |
#Mark item_5 as notforloan |
| 2683 |
$item_5->notforloan(1)->store; |
| 2684 |
is( |
| 2685 |
$biblio->items->filter_by_available->count, |
| 2686 |
0, |
| 2687 |
"Filtered to 0 available items, 1 is lost, 1 is damaged, 1 is withdrawn, 1 is checked out, 1 is notforloan" |
| 2688 |
); |
| 2689 |
|
| 2690 |
$schema->storage->txn_rollback; |
| 2691 |
}; |