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 |
}; |