Bug 12063 - Fix unit tests
[koha.git] / t / db_dependent / Holds / WaitingReserves.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4
5 use C4::Reserves;
6 use Koha::DateUtils;
7
8 use t::lib::Mocks;
9 use t::lib::TestBuilder;
10
11 use Test::More tests => 11;
12
13 use_ok('C4::Reserves');
14
15 my $schema  = Koha::Database->new->schema;
16 $schema->storage->txn_begin;
17
18 my $dbh = C4::Context->dbh;
19 $dbh->{AutoCommit} = 0;
20 $dbh->{RaiseError} = 1;
21 $dbh->do(q{DELETE FROM special_holidays});
22 $dbh->do(q{DELETE FROM repeatable_holidays});
23 $dbh->do("DELETE FROM reserves");
24
25 my $builder = t::lib::TestBuilder->new();
26
27 # Category, branch and patrons
28 $builder->build({
29     source => 'Category',
30     value  => {
31         categorycode => 'XYZ1',
32     },
33 });
34 $builder->build({
35     source => 'Branch',
36     value  => {
37         branchcode => 'LIB1',
38     },
39 });
40
41 $builder->build({
42     source => 'Branch',
43     value  => {
44         branchcode => 'LIB2',
45     },
46 });
47
48 my $patron1 = $builder->build({
49     source => 'Borrower',
50     value  => {
51         categorycode => 'XYZ1',
52         branchcode => 'LIB1',
53     },
54 });
55
56 my $patron2 = $builder->build({
57     source => 'Borrower',
58     value  => {
59         categorycode => 'XYZ1',
60         branchcode => 'LIB2',
61     },
62 });
63
64 my $biblio = $builder->build({
65     source => 'Biblio',
66     value  => {
67         title => 'Title 1',    },
68 });
69
70 my $biblio2 = $builder->build({
71     source => 'Biblio',
72     value  => {
73         title => 'Title 2',    },
74 });
75
76 my $biblio3 = $builder->build({
77     source => 'Biblio',
78     value  => {
79         title => 'Title 3',    },
80 });
81
82 my $biblio4 = $builder->build({
83     source => 'Biblio',
84     value  => {
85         title => 'Title 4',    },
86 });
87
88 my $item1 = $builder->build({
89     source => 'Item',
90     value  => {
91         biblionumber => $biblio->{biblionumber},
92     },
93 });
94
95 my $item2 = $builder->build({
96     source => 'Item',
97     value  => {
98         biblionumber => $biblio2->{biblionumber},
99     },
100 });
101
102 my $item3 = $builder->build({
103     source => 'Item',
104     value  => {
105         biblionumber => $biblio3->{biblionumber},
106     },
107 });
108
109 my $item4 = $builder->build({
110     source => 'Item',
111     value  => {
112         biblionumber => $biblio4->{biblionumber},
113     },
114 });
115
116 my $today = dt_from_string();
117
118 my $reserve1_reservedate = $today->clone;
119 $reserve1_reservedate->subtract(days => 20);
120
121 my $reserve1_expirationdate = $today->clone;
122 $reserve1_expirationdate->add(days => 6);
123
124 my $reserve1 = $builder->build({
125     source => 'Reserve',
126     value => {
127         borrowernumber => $patron1->{borrowernumber},
128         reservedate => $reserve1_reservedate->ymd,
129         expirationdate => undef,
130         biblionumber => $biblio->{biblionumber},
131         branchcode => 'LIB1',
132         priority => 1,
133         found => '',
134     },
135 });
136
137 t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelay', 1);
138 t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 6);
139
140 ModReserveAffect( $item1->{itemnumber}, $patron1->{borrowernumber});
141 my $r = Koha::Holds->find($reserve1->{reserve_id});
142
143 is($r->waitingdate, $today->ymd, 'Waiting date should be set to today' );
144 is($r->expirationdate, $reserve1_expirationdate->ymd, 'Expiration date should be set to today + 6' );
145 is($r->found, 'W', 'Reserve status is now "waiting"' );
146 is($r->priority, 0, 'Priority should be 0' );
147 is($r->itemnumber, $item1->{itemnumber}, 'Item number should be set correctly' );
148
149 my $reserve2 = $builder->build({
150     source => 'Reserve',
151     value => {
152         borrowernumber => $patron2->{borrowernumber},
153         reservedate => $reserve1_reservedate->ymd,
154         expirationdate => undef,
155         biblionumber => $biblio2->{biblionumber},
156         branchcode => 'LIB1',
157         priority => 1,
158         found => '',
159     },
160 });
161
162 ModReserveAffect( $item2->{itemnumber}, $patron2->{borrowernumber}, 1);
163 my $r2 = Koha::Holds->find($reserve2->{reserve_id});
164
165 is($r2->found, 'T', '2nd reserve - Reserve status is now "To transfer"' );
166 is($r2->priority, 0, '2nd reserve - Priority should be 0' );
167 is($r2->itemnumber, $item2->{itemnumber}, '2nd reserve - Item number should be set correctly' );
168
169 my $reserve3 = $builder->build({
170     source => 'Reserve',
171     value => {
172         borrowernumber => $patron2->{borrowernumber},
173         reservedate => $reserve1_reservedate->ymd,
174         expirationdate => undef,
175         biblionumber => $biblio3->{biblionumber},
176         branchcode => 'LIB1',
177         priority => 1,
178         found => '',
179     },
180 });
181
182 my $special_holiday1_dt = $today->clone;
183 $special_holiday1_dt->add(days => 2);
184
185 my $holiday = $builder->build({
186     source => 'SpecialHoliday',
187     value => {
188         branchcode => 'LIB1',
189         day => $special_holiday1_dt->day,
190         month => $special_holiday1_dt->month,
191         year => $special_holiday1_dt->year,
192         title => 'My special holiday',
193         isexception => 0
194     },
195 });
196
197 my $special_holiday2_dt = $today->clone;
198 $special_holiday2_dt->add(days => 4);
199
200 my $holiday2 = $builder->build({
201     source => 'SpecialHoliday',
202     value => {
203         branchcode => 'LIB1',
204         day => $special_holiday2_dt->day,
205         month => $special_holiday2_dt->month,
206         year => $special_holiday2_dt->year,
207         title => 'My special holiday 2',
208         isexception => 0
209     },
210 });
211
212 Koha::Caches->get_instance->flush_all;
213
214 t::lib::Mocks::mock_preference('ExcludeHolidaysFromMaxPickUpDelay', 1);
215 ModReserveAffect( $item3->{itemnumber}, $patron2->{borrowernumber});
216
217 # Add 6 days of pickup delay + 1 day of holiday.
218 my $expected_expiration = $today->clone;
219 $expected_expiration->add(days => 8);
220
221 my $r3 = Koha::Holds->find($reserve3->{reserve_id});
222 is($r3->expirationdate, $expected_expiration->ymd, 'Expiration date should be set to today + 7' );
223
224 my $reserve4_reservedate = $today->clone;
225 my $requested_expiredate = $today->clone()->add(days => 6);
226
227 my $reserve4 = $builder->build({
228     source => 'Reserve',
229     value => {
230         borrowernumber => $patron2->{borrowernumber},
231         reservedate => $reserve4_reservedate->ymd,
232         expirationdate => $requested_expiredate->ymd,
233         biblionumber => $biblio4->{biblionumber},
234         branchcode => 'LIB1',
235         priority => 1,
236         found => '',
237     },
238 });
239
240 t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 10);
241 ModReserveAffect( $item4->{itemnumber}, $patron2->{borrowernumber}, 0, $reserve4->{reserve_id});
242
243 my $r4 = Koha::Holds->find($reserve4->{reserve_id});
244 is($r4->expirationdate, $requested_expiredate->ymd, 'Requested expiration date should be kept' );
245
246 $dbh->rollback;