Merge branch 'new/bug11137' into 3.14.x
[koha.git] / t / db_dependent / Serials / GetNextDate.t
1 #!/usr/bin/perl
2
3 use C4::Context;
4 use Test::More tests => 84;
5 use Modern::Perl;
6
7 my $dbh = C4::Context->dbh;
8 $dbh->{RaiseError} = 1;
9 $dbh->{AutoCommit} = 0;
10
11 use C4::Serials::Frequency;
12 use C4::Serials;
13
14 # TEST CASE 1 - 1 issue per day, no irregularities
15 my $frequency = {
16     description => "One issue per day",
17     unit => 'day',
18     issuesperunit => 1,
19     unitsperissue => 1,
20 };
21 my $id = AddSubscriptionFrequency($frequency);
22
23 my $subscription = {
24     periodicity => $id,
25     firstacquidate => '1970-01-01',
26     irregularity => '',
27     countissuesperunit => 1,
28 };
29 my $publisheddate = $subscription->{firstacquidate};
30
31 $publisheddate = GetNextDate($subscription, $publisheddate);
32 is($publisheddate, '1970-01-02');
33 $publisheddate = GetNextDate($subscription, $publisheddate);
34 is($publisheddate, '1970-01-03');
35 $publisheddate = GetNextDate($subscription, $publisheddate);
36 is($publisheddate, '1970-01-04');
37
38 # TEST CASE 2 - 1 issue per day, irregularities
39 $subscription = {
40     periodicity => $id,
41     firstacquidate => '1970-01-01',
42     irregularity => '2;4',  # Skip the second and fourth issues
43     countissuesperunit => 1,
44 };
45 $publisheddate = $subscription->{firstacquidate};
46 $publisheddate = GetNextDate($subscription, $publisheddate);
47 is($publisheddate, '1970-01-03');
48 $publisheddate = GetNextDate($subscription, $publisheddate);
49 is($publisheddate, '1970-01-05');
50 $publisheddate = GetNextDate($subscription, $publisheddate);
51 is($publisheddate, '1970-01-06');
52
53 # TEST CASE 3 - 2 issues per day, no irregularity
54 $id = AddSubscriptionFrequency({
55     description => "Two issues per day",
56     unit => 'day',
57     issuesperunit => 2,
58     unitsperissue => 1,
59 });
60 $subscription = {
61     periodicity => $id,
62     firstacquidate => '1970-01-01',
63     irregularity => '',
64     countissuesperunit => 1,
65 };
66 $publisheddate = $subscription->{firstacquidate};
67 $publisheddate = GetNextDate($subscription, $publisheddate);
68 is($publisheddate, '1970-01-01');
69 $publisheddate = GetNextDate($subscription, $publisheddate);
70 is($publisheddate, '1970-01-02');
71 $publisheddate = GetNextDate($subscription, $publisheddate);
72 is($publisheddate, '1970-01-02');
73 $publisheddate = GetNextDate($subscription, $publisheddate);
74 is($publisheddate, '1970-01-03');
75
76 # TEST CASE 4 - 2 issues per day, irregularities
77 $subscription = {
78     periodicity => $id,
79     firstacquidate => '1970-01-01',
80     irregularity => '3;5;6',
81     countissuesperunit => 1,
82 };
83 $publisheddate = $subscription->{firstacquidate};
84 $publisheddate = GetNextDate($subscription, $publisheddate);
85 is($publisheddate, '1970-01-01');
86 $publisheddate = GetNextDate($subscription, $publisheddate);
87 is($publisheddate, '1970-01-02');
88 $publisheddate = GetNextDate($subscription, $publisheddate);
89 is($publisheddate, '1970-01-04');
90 $publisheddate = GetNextDate($subscription, $publisheddate);
91 is($publisheddate, '1970-01-04');
92 $publisheddate = GetNextDate($subscription, $publisheddate);
93 is($publisheddate, '1970-01-05');
94
95 # TEST CASE 5 - 1 issue every 2 days, no irregularity
96 $id = AddSubscriptionFrequency({
97     description => "one issue every two days",
98     unit => 'day',
99     issuesperunit => 1,
100     unitsperissue => 2,
101 });
102 $subscription = {
103     periodicity => $id,
104     firstacquidate => '1970-01-01',
105     irregularity => '',
106     countissuesperunit => 1,
107 };
108 $publisheddate = $subscription->{firstacquidate};
109 $publisheddate = GetNextDate($subscription, $publisheddate);
110 is($publisheddate, '1970-01-03');
111 $publisheddate = GetNextDate($subscription, $publisheddate);
112 is($publisheddate, '1970-01-05');
113
114 # TEST CASE 6 - 1 issue every 2 days, irregularities
115 $subscription = {
116     periodicity => $id,
117     firstacquidate => '1970-01-01',
118     irregularity => '3',
119     countissuesperunit => 1,
120 };
121 $publisheddate = $subscription->{firstacquidate};
122 $publisheddate = GetNextDate($subscription, $publisheddate);
123 is($publisheddate, '1970-01-03');
124 $publisheddate = GetNextDate($subscription, $publisheddate);
125 is($publisheddate, '1970-01-07');
126 $publisheddate = GetNextDate($subscription, $publisheddate);
127 is($publisheddate, '1970-01-09');
128
129 # TEST CASE 7 - 1 issue per week, no irregularity
130 $id = AddSubscriptionFrequency({
131     description => "one issue per week",
132     unit => 'week',
133     issuesperunit => 1,
134     unitsperissue => 1,
135 });
136 $subscription = {
137     periodicity => $id,
138     firstacquidate => '1970-01-01',
139     irregularity => '',
140     countissuesperunit => 1,
141 };
142 $publisheddate = $subscription->{firstacquidate};
143 $publisheddate = GetNextDate($subscription, $publisheddate);
144 is($publisheddate, '1970-01-08');
145 $publisheddate = GetNextDate($subscription, $publisheddate);
146 is($publisheddate, '1970-01-15');
147
148 # TEST CASE 8 - 1 issue per week, irregularities
149 $subscription = {
150     periodicity => $id,
151     firstacquidate => '1970-01-01',
152     irregularity => '3',
153     countissuesperunit => 1,
154 };
155 $publisheddate = $subscription->{firstacquidate};
156 $publisheddate = GetNextDate($subscription, $publisheddate);
157 is($publisheddate, '1970-01-08');
158 $publisheddate = GetNextDate($subscription, $publisheddate);
159 is($publisheddate, '1970-01-22');
160 $publisheddate = GetNextDate($subscription, $publisheddate);
161 is($publisheddate, '1970-01-29');
162
163 # TEST CASE 9 - 1 issue every 2 weeks, no irregularity
164 $id = AddSubscriptionFrequency({
165     description => "one issue every 2 weeks",
166     unit => 'week',
167     issuesperunit => 1,
168     unitsperissue => 2,
169 });
170 $subscription = {
171     periodicity => $id,
172     firstacquidate => '1970-01-01',
173     irregularity => '',
174     countissuesperunit => 1,
175 };
176 $publisheddate = $subscription->{firstacquidate};
177 $publisheddate = GetNextDate($subscription, $publisheddate);
178 is($publisheddate, '1970-01-15');
179 $publisheddate = GetNextDate($subscription, $publisheddate);
180 is($publisheddate, '1970-01-29');
181 $publisheddate = GetNextDate($subscription, $publisheddate);
182 is($publisheddate, '1970-02-12');
183
184 # TEST CASE 10 - 1 issue every 2 weeks, irregularities
185 $subscription = {
186     periodicity => $id,
187     firstacquidate => '1970-01-01',
188     irregularity => '3',
189     countissuesperunit => 1,
190 };
191 $publisheddate = $subscription->{firstacquidate};
192 $publisheddate = GetNextDate($subscription, $publisheddate);
193 is($publisheddate, '1970-01-15');
194 $publisheddate = GetNextDate($subscription, $publisheddate);
195 is($publisheddate, '1970-02-12');
196 $publisheddate = GetNextDate($subscription, $publisheddate);
197 is($publisheddate, '1970-02-26');
198
199 # TEST CASE 11 - 2 issues per week, no irregularity
200 $id = AddSubscriptionFrequency({
201     description => "two issues per week",
202     unit => 'week',
203     issuesperunit => 2,
204     unitsperissue => 1,
205 });
206 $subscription = {
207     periodicity => $id,
208     firstacquidate => '1970-01-01',
209     irregularity => '',
210     countissuesperunit => 1,
211 };
212 $publisheddate = $subscription->{firstacquidate};
213 $publisheddate = GetNextDate($subscription, $publisheddate);
214 is($publisheddate, '1970-01-01');
215 # when more than 1 issue per week, date is automatically set to monday
216 # because we can't guess the right day
217 $publisheddate = GetNextDate($subscription, $publisheddate);
218 is($publisheddate, '1970-01-05');
219 $publisheddate = GetNextDate($subscription, $publisheddate);
220 is($publisheddate, '1970-01-05');
221 $publisheddate = GetNextDate($subscription, $publisheddate);
222 is($publisheddate, '1970-01-12');
223
224 # TEST CASE 12 - 2 issues per week, irregularities
225 $subscription = {
226     periodicity => $id,
227     firstacquidate => '1970-01-01',
228     irregularity => '3;5;6',
229     countissuesperunit => 1,
230 };
231 $publisheddate = $subscription->{firstacquidate};
232 $publisheddate = GetNextDate($subscription, $publisheddate);
233 is($publisheddate, '1970-01-01');
234 $publisheddate = GetNextDate($subscription, $publisheddate);
235 is($publisheddate, '1970-01-05');
236 $publisheddate = GetNextDate($subscription, $publisheddate);
237 is($publisheddate, '1970-01-19');
238 $publisheddate = GetNextDate($subscription, $publisheddate);
239 is($publisheddate, '1970-01-19');
240 $publisheddate = GetNextDate($subscription, $publisheddate);
241 is($publisheddate, '1970-01-26');
242
243 # TEST CASE 13 - 1 issue per month, no irregularity
244 $id = AddSubscriptionFrequency({
245     description => "1 issue per month",
246     unit => 'month',
247     issuesperunit => 1,
248     unitsperissue => 1,
249 });
250 $subscription = {
251     periodicity => $id,
252     firstacquidate => '1970-01-01',
253     irregularity => '',
254     countissuesperunit => 1,
255 };
256 $publisheddate = $subscription->{firstacquidate};
257 $publisheddate = GetNextDate($subscription, $publisheddate);
258 is($publisheddate, '1970-02-01');
259 $publisheddate = GetNextDate($subscription, $publisheddate);
260 is($publisheddate, '1970-03-01');
261 $publisheddate = GetNextDate($subscription, $publisheddate);
262 is($publisheddate, '1970-04-01');
263
264 # TEST CASE 14 - 1 issue per month, irregularities
265 $subscription = {
266     periodicity => $id,
267     firstacquidate => '1970-01-01',
268     irregularity => '2;4',
269     countissuesperunit => 1,
270 };
271 $publisheddate = $subscription->{firstacquidate};
272 $publisheddate = GetNextDate($subscription, $publisheddate);
273 is($publisheddate, '1970-03-01');
274 $publisheddate = GetNextDate($subscription, $publisheddate);
275 is($publisheddate, '1970-05-01');
276 $publisheddate = GetNextDate($subscription, $publisheddate);
277 is($publisheddate, '1970-06-01');
278
279 # TEST CASE 15 - 1 issue every 2 months, no irregularity
280 $id = AddSubscriptionFrequency({
281     description => "1 issue every 2 months",
282     unit => 'month',
283     issuesperunit => 1,
284     unitsperissue => 2,
285 });
286 $subscription = {
287     periodicity => $id,
288     firstacquidate => '1970-01-01',
289     irregularity => '',
290     countissuesperunit => 1,
291 };
292 $publisheddate = $subscription->{firstacquidate};
293 $publisheddate = GetNextDate($subscription, $publisheddate);
294 is($publisheddate, '1970-03-01');
295 $publisheddate = GetNextDate($subscription, $publisheddate);
296 is($publisheddate, '1970-05-01');
297 $publisheddate = GetNextDate($subscription, $publisheddate);
298 is($publisheddate, '1970-07-01');
299
300 # TEST CASE 16 - 1 issue every 2 months, irregularities
301 $subscription = {
302     periodicity => $id,
303     firstacquidate => '1970-01-01',
304     irregularity => '2;3',
305     countissuesperunit => 1,
306 };
307 $publisheddate = $subscription->{firstacquidate};
308 $publisheddate = GetNextDate($subscription, $publisheddate);
309 is($publisheddate, '1970-07-01');
310 $publisheddate = GetNextDate($subscription, $publisheddate);
311 is($publisheddate, '1970-09-01');
312 $publisheddate = GetNextDate($subscription, $publisheddate);
313 is($publisheddate, '1970-11-01');
314
315 # TEST CASE 17 - 2 issues per month, no irregularity
316 $id = AddSubscriptionFrequency({
317     description => "2 issues per month",
318     unit => 'month',
319     issuesperunit => 2,
320     unitsperissue => 1,
321 });
322 $subscription = {
323     periodicity => $id,
324     firstacquidate => '1970-01-01',
325     irregularity => '',
326     countissuesperunit => 1,
327 };
328 $publisheddate = $subscription->{firstacquidate};
329 $publisheddate = GetNextDate($subscription, $publisheddate);
330 is($publisheddate, '1970-01-01');
331 $publisheddate = GetNextDate($subscription, $publisheddate);
332 is($publisheddate, '1970-02-01');
333 $publisheddate = GetNextDate($subscription, $publisheddate);
334 is($publisheddate, '1970-02-01');
335 $publisheddate = GetNextDate($subscription, $publisheddate);
336 is($publisheddate, '1970-03-01');
337
338 # TEST CASE 18 - 2 issues per month, irregularities
339 $subscription = {
340     periodicity => $id,
341     firstacquidate => '1970-01-01',
342     irregularity => '3;5;6',
343     countissuesperunit => 1,
344 };
345 $publisheddate = $subscription->{firstacquidate};
346 $publisheddate = GetNextDate($subscription, $publisheddate);
347 is($publisheddate, '1970-01-01');
348 $publisheddate = GetNextDate($subscription, $publisheddate);
349 is($publisheddate, '1970-02-01');
350 $publisheddate = GetNextDate($subscription, $publisheddate);
351 is($publisheddate, '1970-04-01');
352 $publisheddate = GetNextDate($subscription, $publisheddate);
353 is($publisheddate, '1970-04-01');
354 $publisheddate = GetNextDate($subscription, $publisheddate);
355 is($publisheddate, '1970-05-01');
356
357 # TEST CASE 19 - 1 issue per year, no irregularity
358 $id = AddSubscriptionFrequency({
359     description => "1 issue per year",
360     unit => 'year',
361     issuesperunit => 1,
362     unitsperissue => 1,
363 });
364 $subscription = {
365     periodicity => $id,
366     firstacquidate => '1970-01-01',
367     irregularity => '',
368     countissuesperunit => 1,
369 };
370 $publisheddate = $subscription->{firstacquidate};
371 $publisheddate = GetNextDate($subscription, $publisheddate);
372 is($publisheddate, '1971-01-01');
373 $publisheddate = GetNextDate($subscription, $publisheddate);
374 is($publisheddate, '1972-01-01');
375 $publisheddate = GetNextDate($subscription, $publisheddate);
376 is($publisheddate, '1973-01-01');
377
378 # TEST CASE 20 - 1 issue per year, irregularities
379 $subscription = {
380     periodicity => $id,
381     firstacquidate => '1970-01-01',
382     irregularity => '2;4',
383     countissuesperunit => 1,
384 };
385 $publisheddate = $subscription->{firstacquidate};
386 $publisheddate = GetNextDate($subscription, $publisheddate);
387 is($publisheddate, '1972-01-01');
388 $publisheddate = GetNextDate($subscription, $publisheddate);
389 is($publisheddate, '1974-01-01');
390 $publisheddate = GetNextDate($subscription, $publisheddate);
391 is($publisheddate, '1975-01-01');
392
393 # TEST CASE 21 - 1 issue every 2 years, no irregularity
394 $id = AddSubscriptionFrequency({
395     description => "1 issue every 2 years",
396     unit => 'year',
397     issuesperunit => 1,
398     unitsperissue => 2,
399 });
400 $subscription = {
401     periodicity => $id,
402     firstacquidate => '1970-01-01',
403     irregularity => '',
404     countissuesperunit => 1,
405 };
406 $publisheddate = $subscription->{firstacquidate};
407 $publisheddate = GetNextDate($subscription, $publisheddate);
408 is($publisheddate, '1972-01-01');
409 $publisheddate = GetNextDate($subscription, $publisheddate);
410 is($publisheddate, '1974-01-01');
411 $publisheddate = GetNextDate($subscription, $publisheddate);
412 is($publisheddate, '1976-01-01');
413
414 # TEST CASE 22 - 1 issue every 2 years, irregularities
415 $subscription = {
416     periodicity => $id,
417     firstacquidate => '1970-01-01',
418     irregularity => '2;4',
419     countissuesperunit => 1,
420 };
421 $publisheddate = $subscription->{firstacquidate};
422 $publisheddate = GetNextDate($subscription, $publisheddate);
423 is($publisheddate, '1974-01-01');
424 $publisheddate = GetNextDate($subscription, $publisheddate);
425 is($publisheddate, '1978-01-01');
426 $publisheddate = GetNextDate($subscription, $publisheddate);
427 is($publisheddate, '1980-01-01');
428
429 # TEST CASE 23 - 2 issues per year, no irregularity
430 $id = AddSubscriptionFrequency({
431     description => "1 issue every 2 years",
432     unit => 'year',
433     issuesperunit => 2,
434     unitsperissue => 1,
435 });
436 $subscription = {
437     periodicity => $id,
438     firstacquidate => '1970-01-01',
439     irregularity => '',
440     countissuesperunit => 1,
441 };
442 $publisheddate = $subscription->{firstacquidate};
443 $publisheddate = GetNextDate($subscription, $publisheddate);
444 is($publisheddate, '1970-01-01');
445 $publisheddate = GetNextDate($subscription, $publisheddate);
446 is($publisheddate, '1971-01-01');
447 $publisheddate = GetNextDate($subscription, $publisheddate);
448 is($publisheddate, '1971-01-01');
449 $publisheddate = GetNextDate($subscription, $publisheddate);
450 is($publisheddate, '1972-01-01');
451
452 # TEST CASE 24 - 2 issues per year, irregularities
453 $subscription = {
454     periodicity => $id,
455     firstacquidate => '1970-01-01',
456     irregularity => '3;5;6',
457     countissuesperunit => 1,
458 };
459 $publisheddate = $subscription->{firstacquidate};
460 $publisheddate = GetNextDate($subscription, $publisheddate);
461 is($publisheddate, '1970-01-01');
462 $publisheddate = GetNextDate($subscription, $publisheddate);
463 is($publisheddate, '1971-01-01');
464 $publisheddate = GetNextDate($subscription, $publisheddate);
465 is($publisheddate, '1973-01-01');
466 $publisheddate = GetNextDate($subscription, $publisheddate);
467 is($publisheddate, '1973-01-01');
468 $publisheddate = GetNextDate($subscription, $publisheddate);
469 is($publisheddate, '1974-01-01');
470
471 # TEST CASE 25 - Irregular
472 $id = AddSubscriptionFrequency({
473     description => "Irregular",
474     unit => '',
475     issuesperunit => 1,
476     unitsperissue => 1,
477 });
478 $subscription = {
479     periodicity => $id,
480     firstacquidate => '1970-01-01',
481     irregularity => '',
482     countissuesperunit => 1,
483 };
484 $publisheddate = $subscription->{firstacquidate};
485 # GetNextDate always return the same date if subscription is irregular
486 $publisheddate = GetNextDate($subscription, $publisheddate);
487 is($publisheddate, '1970-01-01');
488 $publisheddate = GetNextDate($subscription, $publisheddate);
489 is($publisheddate, '1970-01-01');
490
491 $dbh->rollback;