Bug 36687: (RM follow-up) Fix unit tests
[koha.git] / t / db_dependent / Holds / LocalHoldsPriority.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4
5 use t::lib::Mocks;
6 use C4::Context;
7
8 use Test::More tests => 7;
9 use MARC::Record;
10
11 use Koha::Patrons;
12 use Koha::Holds;
13 use C4::Biblio;
14 use C4::Items;
15 use Koha::Database;
16
17 use t::lib::TestBuilder;
18
19 BEGIN {
20     use FindBin;
21     use lib $FindBin::Bin;
22     use_ok('C4::Reserves', qw( AddReserve CheckReserves ));
23 }
24
25 my $schema = Koha::Database->schema;
26 $schema->storage->txn_begin;
27
28 my $builder = t::lib::TestBuilder->new;
29
30 my $library1 = $builder->build({ source => 'Branch', });
31 my $library2 = $builder->build({ source => 'Branch', });
32 my $library3 = $builder->build({ source => 'Branch', });
33 my $library4 = $builder->build({ source => 'Branch', });
34 my $itemtype = $builder->build(
35     {
36         source => 'Itemtype',
37         value  => { notforloan => 0, rentalcharge => 0 }
38     }
39 )->{itemtype};
40
41
42
43 my $borrowers_count = 5;
44
45 my $biblio = $builder->build_sample_biblio();
46 my $item = Koha::Item->new(
47     {
48         biblionumber  => $biblio->biblionumber,
49         homebranch    => $library4->{branchcode},
50         holdingbranch => $library3->{branchcode},
51         itype         => $itemtype,
52         exclude_from_local_holds_priority => 0,
53     },
54 )->store;
55
56 my @branchcodes = ( $library1->{branchcode}, $library2->{branchcode}, $library3->{branchcode}, $library4->{branchcode}, $library3->{branchcode}, $library4->{branchcode} );
57 my $patron_category = $builder->build({ source => 'Category', value => {exclude_from_local_holds_priority => 0} });
58 # Create some borrowers
59 my @borrowernumbers;
60 foreach ( 0 .. $borrowers_count-1 ) {
61     my $borrowernumber = Koha::Patron->new({
62         firstname    => 'my firstname',
63         surname      => 'my surname ' . $_,
64         categorycode => $patron_category->{categorycode},
65         branchcode   => $branchcodes[$_],
66     })->store->borrowernumber;
67     push @borrowernumbers, $borrowernumber;
68 }
69
70 # Create five item level holds
71 my $i = 1;
72 foreach my $borrowernumber (@borrowernumbers) {
73     AddReserve(
74         {
75             branchcode     => $branchcodes[$i],
76             borrowernumber => $borrowernumber,
77             biblionumber   => $biblio->biblionumber,
78             priority       => $i,
79         }
80     );
81
82     $i++;
83 }
84
85 my ($status, $reserve, $all_reserves);
86
87 t::lib::Mocks::mock_preference( 'LocalHoldsPriority', 0 );
88 ($status, $reserve, $all_reserves) = CheckReserves($item);
89 ok( $reserve->{borrowernumber} eq $borrowernumbers[0], "Received expected results with LocalHoldsPriority disabled" );
90
91 t::lib::Mocks::mock_preference( 'LocalHoldsPriority', 1 );
92
93 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'PickupLibrary' );
94 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'homebranch' );
95 ($status, $reserve, $all_reserves) = CheckReserves($item);
96 ok( $reserve->{borrowernumber} eq $borrowernumbers[2], "Received expected results with PickupLibrary/homebranch" );
97
98 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'PickupLibrary' );
99 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'holdingbranch' );
100 ($status, $reserve, $all_reserves) = CheckReserves($item);
101 ok( $reserve->{borrowernumber} eq $borrowernumbers[1], "Received expected results with PickupLibrary/holdingbranch" );
102
103 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'HomeLibrary' );
104 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'holdingbranch' );
105 ($status, $reserve, $all_reserves) = CheckReserves($item);
106 ok( $reserve->{borrowernumber} eq $borrowernumbers[2], "Received expected results with HomeLibrary/holdingbranch" );
107
108 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'HomeLibrary' );
109 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'homebranch' );
110 ($status, $reserve, $all_reserves) = CheckReserves($item);
111 ok( $reserve->{borrowernumber} eq $borrowernumbers[3], "Received expected results with HomeLibrary/homebranch" );
112
113 $schema->storage->txn_rollback;
114
115 subtest "exclude from local holds" => sub {
116     plan tests => 3;
117
118     $schema->storage->txn_begin;
119
120     t::lib::Mocks::mock_preference( 'LocalHoldsPriority', 1 );
121     t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'HomeLibrary' );
122     t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'homebranch' );
123
124     my $category_ex = $builder->build_object({ class => 'Koha::Patron::Categories', value => {exclude_from_local_holds_priority => 1} });
125     my $category_nex = $builder->build_object({ class => 'Koha::Patron::Categories', value => {exclude_from_local_holds_priority => 0} });
126
127     my $lib1 = $builder->build_object({ class => 'Koha::Libraries' });
128     my $lib2 = $builder->build_object({ class => 'Koha::Libraries' });
129
130     my $item1 = $builder->build_sample_item({exclude_from_local_holds_priority => 0, homebranch => $lib1->branchcode});
131     my $item2 = $builder->build_sample_item({exclude_from_local_holds_priority => 1, homebranch => $lib1->branchcode});
132
133     my $patron_ex_l2 = $builder->build_object({ class => 'Koha::Patrons', value => {branchcode => $lib2->branchcode, categorycode => $category_ex->categorycode}});
134     my $patron_ex_l1 = $builder->build_object({ class => 'Koha::Patrons', value => {branchcode => $lib1->branchcode, categorycode => $category_ex->categorycode}});
135     my $patron_nex_l2 = $builder->build_object({ class => 'Koha::Patrons', value => {branchcode => $lib2->branchcode, categorycode => $category_nex->categorycode}});
136     my $patron_nex_l1 = $builder->build_object({ class => 'Koha::Patrons', value => {branchcode => $lib1->branchcode, categorycode => $category_nex->categorycode}});
137
138     AddReserve(
139         {
140             branchcode     => $patron_nex_l2->branchcode,
141             borrowernumber => $patron_nex_l2->borrowernumber,
142             biblionumber   => $item1->biblionumber,
143             priority       => 1,
144         }
145     );
146     AddReserve(
147         {
148             branchcode     => $patron_ex_l1->branchcode,
149             borrowernumber => $patron_ex_l1->borrowernumber,
150             biblionumber   => $item1->biblionumber,
151             priority       => 2,
152         }
153     );
154     AddReserve(
155         {
156             branchcode     => $patron_nex_l1->branchcode,
157             borrowernumber => $patron_nex_l1->borrowernumber,
158             biblionumber   => $item1->biblionumber,
159             priority       => 3,
160         }
161     );
162
163     my ($status, $reserve, $all_reserves);
164     ($status, $reserve, $all_reserves) = CheckReserves($item1);
165     is($reserve->{borrowernumber}, $patron_nex_l1->borrowernumber, "Patron not excluded with local holds priorities is next checkout");
166
167     Koha::Holds->delete;
168
169     AddReserve(
170         {
171             branchcode     => $patron_nex_l2->branchcode,
172             borrowernumber => $patron_nex_l2->borrowernumber,
173             biblionumber   => $item1->biblionumber,
174             priority       => 1,
175         }
176     );
177     AddReserve(
178         {
179             branchcode     => $patron_ex_l1->branchcode,
180             borrowernumber => $patron_ex_l1->borrowernumber,
181             biblionumber   => $item1->biblionumber,
182             priority       => 2,
183         }
184     );
185
186     ($status, $reserve, $all_reserves) = CheckReserves($item1);
187     is($reserve->{borrowernumber}, $patron_nex_l2->borrowernumber, "Local patron is excluded from priority");
188
189     Koha::Holds->delete;
190
191     AddReserve(
192         {
193             branchcode     => $patron_nex_l2->branchcode,
194             borrowernumber => $patron_nex_l2->borrowernumber,
195             biblionumber   => $item2->biblionumber,
196             priority       => 1,
197         }
198     );
199     AddReserve(
200         {
201             branchcode     => $patron_nex_l1->branchcode,
202             borrowernumber => $patron_nex_l1->borrowernumber,
203             biblionumber   => $item2->biblionumber,
204             priority       => 2,
205         }
206     );
207
208     ($status, $reserve, $all_reserves) = CheckReserves($item2);
209     is($reserve->{borrowernumber}, $patron_nex_l2->borrowernumber, "Patron from other library is next checkout because item is excluded");
210
211     $schema->storage->txn_rollback;
212 };