Bug 24159: Add new tests for get_useDaysMode_effective_value
[koha.git] / t / db_dependent / Koha / CirculationRules.t
1 #!/usr/bin/perl
2
3 # Copyright 2020 Koha Development team
4 #
5 # This file is part of Koha
6 #
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20 use Modern::Perl;
21
22 use Test::More tests => 3;
23 use Test::Exception;
24
25 use Koha::CirculationRules;
26 use Koha::Database;
27
28 use t::lib::TestBuilder;
29 use t::lib::Mocks;
30
31 my $schema = Koha::Database->new->schema;
32 my $builder = t::lib::TestBuilder->new;
33
34 subtest 'set_rule + get_effective_rule' => sub {
35     plan tests => 14;
36
37     $schema->storage->txn_begin;
38
39     my $categorycode = $builder->build_object( { class => 'Koha::Patron::Categories' } )->categorycode;
40     my $itemtype     = $builder->build_object( { class => 'Koha::ItemTypes' } )->itemtype;
41     my $branchcode   = $builder->build_object( { class => 'Koha::Libraries' } )->branchcode;
42     my $branchcode_2 = $builder->build_object( { class => 'Koha::Libraries' } )->branchcode;
43     my $rule_name    = 'maxissueqty';
44     my $default_rule_value = 1;
45
46     my $rule;
47     Koha::CirculationRules->delete;
48
49     throws_ok { Koha::CirculationRules->get_effective_rule }
50     'Koha::Exceptions::MissingParameter',
51     "Exception should be raised if get_effective_rule is called without rule_name parameter";
52
53     $rule = Koha::CirculationRules->get_effective_rule(
54         {
55             branchcode   => $branchcode,
56             categorycode => $categorycode,
57             itemtype     => $itemtype,
58             rule_name    => $rule_name,
59         }
60     );
61     is( $rule, undef, 'Undef should be returned if no rule exist' );
62
63     Koha::CirculationRules->set_rule(
64         {
65             branchcode   => '*',
66             categorycode => '*',
67             itemtype     => '*',
68             rule_name    => $rule_name,
69             rule_value   => $default_rule_value,
70         }
71     );
72
73     $rule = Koha::CirculationRules->get_effective_rule(
74         {
75             branchcode   => undef,
76             categorycode => undef,
77             itemtype     => undef,
78             rule_name    => $rule_name,
79         }
80     );
81     is( $rule->rule_value, $default_rule_value, 'undef means default' );
82     $rule = Koha::CirculationRules->get_effective_rule(
83         {
84             branchcode   => '*',
85             categorycode => '*',
86             itemtype     => '*',
87             rule_name    => $rule_name,
88         }
89     );
90
91     is( $rule->rule_value, $default_rule_value, '* means default' );
92
93     Koha::CirculationRules->set_rule(
94         {
95             branchcode   => '*',
96             categorycode => '*',
97             itemtype     => $itemtype,
98             rule_name    => $rule_name,
99             rule_value   => 2,
100         }
101     );
102
103     $rule = Koha::CirculationRules->get_effective_rule(
104         {
105             branchcode   => $branchcode,
106             categorycode => $categorycode,
107             itemtype     => $itemtype,
108             rule_name    => $rule_name,
109         }
110     );
111     is( $rule->rule_value, 2,
112         'More specific rule is returned when itemtype is given' );
113
114     $rule = Koha::CirculationRules->get_effective_rule(
115         {
116             branchcode   => $branchcode_2,
117             categorycode => '*',
118             itemtype     => '*',
119             rule_name    => $rule_name,
120         }
121     );
122     is( $rule->rule_value, 1,
123         'Default rule is returned if there is no rule for this branchcode' );
124
125     Koha::CirculationRules->set_rule(
126         {
127             branchcode   => '*',
128             categorycode => $categorycode,
129             itemtype     => '*',
130             rule_name    => $rule_name,
131             rule_value   => 3,
132         }
133     );
134
135     $rule = Koha::CirculationRules->get_effective_rule(
136         {
137
138             branchcode   => $branchcode,
139             categorycode => $categorycode,
140             itemtype     => $itemtype,
141             rule_name    => $rule_name,
142         }
143     );
144     is( $rule->rule_value, 3,
145         'More specific rule is returned when categorycode exists' );
146
147     Koha::CirculationRules->set_rule(
148         {
149             branchcode   => '*',
150             categorycode => $categorycode,
151             itemtype     => $itemtype,
152             rule_name    => $rule_name,
153             rule_value   => 4,
154         }
155     );
156     $rule = Koha::CirculationRules->get_effective_rule(
157         {
158             branchcode   => $branchcode,
159             categorycode => $categorycode,
160             itemtype     => $itemtype,
161             rule_name    => $rule_name,
162         }
163     );
164     is( $rule->rule_value, 4,
165         'More specific rule is returned when categorycode and itemtype exist' );
166
167     Koha::CirculationRules->set_rule(
168         {
169             branchcode   => $branchcode,
170             categorycode => '*',
171             itemtype     => '*',
172             rule_name    => $rule_name,
173             rule_value   => 5,
174         }
175     );
176     $rule = Koha::CirculationRules->get_effective_rule(
177         {
178             branchcode   => $branchcode,
179             categorycode => $categorycode,
180             itemtype     => $itemtype,
181             rule_name    => $rule_name,
182         }
183     );
184     is( $rule->rule_value, 5,
185         'More specific rule is returned when branchcode exists' );
186
187     Koha::CirculationRules->set_rule(
188         {
189             branchcode   => $branchcode,
190             categorycode => '*',
191             itemtype     => $itemtype,
192             rule_name    => $rule_name,
193             rule_value   => 6,
194         }
195     );
196     $rule = Koha::CirculationRules->get_effective_rule(
197         {
198             branchcode   => $branchcode,
199             categorycode => $categorycode,
200             itemtype     => $itemtype,
201             rule_name    => $rule_name,
202         }
203     );
204     is( $rule->rule_value, 6,
205         'More specific rule is returned when branchcode and itemtype exists' );
206
207     Koha::CirculationRules->set_rule(
208         {
209             branchcode   => $branchcode,
210             categorycode => $categorycode,
211             itemtype     => '*',
212             rule_name    => $rule_name,
213             rule_value   => 7,
214         }
215     );
216     $rule = Koha::CirculationRules->get_effective_rule(
217         {
218             branchcode   => $branchcode,
219             categorycode => $categorycode,
220             itemtype     => $itemtype,
221             rule_name    => $rule_name,
222         }
223     );
224     is( $rule->rule_value, 7,
225         'More specific rule is returned when branchcode and categorycode exist'
226     );
227
228     Koha::CirculationRules->set_rule(
229         {
230             branchcode   => $branchcode,
231             categorycode => $categorycode,
232             itemtype     => $itemtype,
233             rule_name    => $rule_name,
234             rule_value   => 8,
235         }
236     );
237     $rule = Koha::CirculationRules->get_effective_rule(
238         {
239             branchcode   => $branchcode,
240             categorycode => $categorycode,
241             itemtype     => $itemtype,
242             rule_name    => $rule_name,
243         }
244     );
245     is( $rule->rule_value, 8,
246         'More specific rule is returned when branchcode, categorycode and itemtype exist'
247     );
248
249     my $our_branch_rules = Koha::CirculationRules->search({branchcode => $branchcode});
250     is( $our_branch_rules->count, 4, "We added 8 rules");
251     $our_branch_rules->delete;
252     is( $our_branch_rules->count, 0, "We deleted 8 rules");
253
254     $schema->storage->txn_rollback;
255 };
256
257 subtest 'get_onshelfholds_policy() tests' => sub {
258
259     plan tests => 2;
260
261     $schema->storage->txn_begin;
262
263     my $item = $builder->build_sample_item();
264
265     my $circ_rules = Koha::CirculationRules->new;
266     # Cleanup
267     $circ_rules->search({ rule_name => 'onshelfholds' })->delete;
268
269     $circ_rules->set_rule(
270         {
271             branchcode   => '*',
272             categorycode => '*',
273             itemtype     => '*',
274             rule_name    => 'onshelfholds',
275             rule_value   => 1,
276         }
277     );
278
279     is( $circ_rules->get_onshelfholds_policy({ item => $item }), 1, 'If rule_value is set on a matching rule, return it' );
280     # Delete the rule (i.e. get_effective_rule returns undef)
281     $circ_rules->delete;
282     is( $circ_rules->get_onshelfholds_policy({ item => $item }), 0, 'If no matching rule, fallback to 0' );
283
284     $schema->storage->txn_rollback;
285 };
286
287 subtest 'get_useDaysMode_effective_value' => sub {
288     plan tests => 4;
289
290     $schema->storage->txn_begin;
291
292     my $item_1 = $builder->build_sample_item();
293     my $item_2 = $builder->build_sample_item();
294
295     my $circ_rules =
296       Koha::CirculationRules->search( { rule_name => 'useDaysMode' } )->delete;
297
298     # Default value 'Datedue' at pref level
299     t::lib::Mocks::mock_preference( 'useDaysMode', 'Datedue' );
300
301     is(
302         Koha::CirculationRules->get_useDaysMode_effective_value(
303             {
304                 categorycode => undef,
305                 itemtype     => $item_1->effective_itemtype,
306                 branchcode   => undef
307             }
308         ),
309         'Datedue',
310         'useDaysMode default to pref value if the rule does not exist'
311     );
312
313     Koha::CirculationRules->set_rule(
314         {
315             branchcode   => '*',
316             categorycode => '*',
317             itemtype     => '*',
318             rule_name    => 'useDaysMode',
319             rule_value   => 'Calendar',
320         }
321     );
322     Koha::CirculationRules->set_rule(
323         {
324             branchcode   => '*',
325             categorycode => '*',
326             itemtype     => $item_1->effective_itemtype,
327             rule_name    => 'useDaysMode',
328             rule_value   => 'Days',
329         }
330     );
331
332     is(
333         Koha::CirculationRules->get_useDaysMode_effective_value(
334             {
335                 categorycode => undef,
336                 itemtype     => $item_1->effective_itemtype,
337                 branchcode   => undef
338             }
339         ),
340         'Days',
341         "useDaysMode for item_1 is the specific rule"
342     );
343     is(
344         Koha::CirculationRules->get_useDaysMode_effective_value(
345             {
346                 categorycode => undef,
347                 itemtype     => $item_2->effective_itemtype,
348                 branchcode   => undef
349             }
350         ),
351         'Calendar',
352         "useDaysMode for item_2 is the one defined for the default circ rule"
353     );
354
355     Koha::CirculationRules->set_rule(
356         {
357             branchcode   => '*',
358             categorycode => '*',
359             itemtype     => $item_2->effective_itemtype,
360             rule_name    => 'useDaysMode',
361             rule_value   => '',
362         }
363     );
364
365     is(
366         Koha::CirculationRules->get_useDaysMode_effective_value(
367             {
368                 categorycode => undef,
369                 itemtype     => $item_2->effective_itemtype,
370                 branchcode   => undef
371             }
372         ),
373         'Datedue',
374         'useDaysMode default to pref value if the rule exists but set to""'
375     );
376
377     $schema->storage->txn_rollback;
378 };