Bug 7317: Interlibrary loans framework for Koha.
[koha.git] / t / db_dependent / Illrequest / Config.t
1 #!/usr/bin/perl
2
3 # This file is part of Koha.
4 #
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
17
18 use Modern::Perl;
19
20 use Koha::Database;
21 use t::lib::Mocks;
22 use t::lib::TestBuilder;
23 use Test::MockObject;
24 use Test::Exception;
25
26 use Test::More tests => 5;
27
28 my $schema = Koha::Database->new->schema;
29 my $builder = t::lib::TestBuilder->new;
30 use_ok('Koha::Illrequest::Config');
31
32 my $base_limits = {
33     branch => { CPL => { count => 1, method => 'annual' } },
34     brw_cat => { A => { count => -1, method => 'active' } },
35     default => { count => 10, method => 'annual' },
36 };
37
38 my $base_censorship = { censor_notes_staff => 1, censor_reply_date => 1 };
39
40 subtest 'Basics' => sub {
41
42     plan tests => 19;
43
44     $schema->storage->txn_begin;
45
46     t::lib::Mocks::mock_preference("UnmediatedILL", 0);
47     t::lib::Mocks::mock_config("interlibrary_loans", {});
48
49     my $config = Koha::Illrequest::Config->new;
50     isa_ok($config, "Koha::Illrequest::Config",
51            "Correctly create and load a config object.");
52
53     # backend:
54     is($config->backend, undef, "backend: Undefined backend is undefined.");
55     is($config->backend("Mock"), "Mock", "backend: setter works.");
56     is($config->backend, "Mock", "backend: setter is persistent.");
57
58     # backend_dir:
59     is($config->backend_dir, undef, "backend_dir: Undefined backend_dir is undefined.");
60     is($config->backend_dir("/tmp/"), "/tmp/", "backend_dir: setter works.");
61     is($config->backend_dir, "/tmp/", "backend_dir: setter is persistent.");
62
63     # partner_code:
64     is($config->partner_code, "ILLLIBS", "partner_code: Undefined partner_code is undefined.");
65     is($config->partner_code("ILLLIBSTST"), "ILLLIBSTST", "partner_code: setter works.");
66     is($config->partner_code, "ILLLIBSTST", "partner_code: setter is persistent.");
67
68     # limits:
69     is_deeply($config->limits, {}, "limits: Undefined limits is empty hash.");
70     is_deeply($config->limits($base_limits), $base_limits, "limits: setter works.");
71     is_deeply($config->limits, $base_limits, "limits: setter is persistent.");
72
73     # censorship:
74     is_deeply($config->censorship, { censor_notes_staff => 0, censor_reply_date => 0 },
75               "censorship: Undefined censorship is default values.");
76     is_deeply($config->censorship($base_censorship), $base_censorship, "censorship: setter works.");
77     is_deeply($config->censorship, $base_censorship, "censorship: setter is persistent.");
78
79     # getLimitRules
80     dies_ok( sub { $config->getLimitRules("FOO") }, "getLimitRules: die if not correct type.");
81     is_deeply($config->getLimitRules("brw_cat"), {
82         A => { count => -1, method => 'active' },
83         default => { count => 10, method => 'annual' },
84     }, "getLimitRules: fetch brw_cat limits.");
85     is_deeply($config->getLimitRules("branch"), {
86         CPL => { count => 1, method => 'annual' },
87         default => { count => 10, method => 'annual' },
88     }, "getLimitRules: fetch brw_cat limits.");
89
90     $schema->storage->txn_rollback;
91 };
92
93 # _load_unit_config:
94
95 subtest '_load_unit_config' => sub {
96
97     plan tests => 10;
98
99     $schema->storage->txn_begin;
100
101     my $config = Koha::Illrequest::Config->new;
102
103     dies_ok(
104         sub { Koha::Illrequest::Config::_load_unit_config({
105             id => 'durineadu', type => 'baz'
106         }) },
107         "_load_unit_config: die if ID is not default, and type is not branch or brw_cat."
108     );
109     is_deeply(
110         Koha::Illrequest::Config::_load_unit_config({
111             unit => {}, id => 'default', config => {}, test => 1
112         }), {}, "_load_unit_config: invocation without id returns unmodified config."
113     );
114
115     is_deeply(
116         Koha::Illrequest::Config::_load_unit_config({
117             unit => { api_key => 'foo', api_auth => 'bar' },
118             id => "CPL", type => 'branch', config => {}
119         }),
120         { credentials => { api_keys => { CPL => { api_key => 'foo', api_auth => 'bar' } } } },
121         "_load_unit_config: add auth values."
122     );
123
124     # Populate request_limits
125     is_deeply(
126         Koha::Illrequest::Config::_load_unit_config({
127             unit => { request_limit => [ 'heelo', 1234 ] },
128             id => "CPL", type => 'branch', config => {}
129         }), {}, "_load_unit_config: invalid request_limit structure."
130     );
131     is_deeply(
132         Koha::Illrequest::Config::_load_unit_config({
133             unit => { request_limit => { method => 'eudiren', count => '-5465' } },
134             id => "CPL", type => 'branch', config => {}
135         }), {}, "_load_unit_config: invalid method & count."
136     );
137     is_deeply(
138         Koha::Illrequest::Config::_load_unit_config({
139             unit => { request_limit => { method => 'annual', count => 6 } },
140             id => "default", config => {}
141         }),
142         { limits => { default => { method => 'annual', count => 6 } } },
143         "_load_unit_config: correct default request_limits."
144     );
145
146     # Populate prefix
147     is_deeply(
148         Koha::Illrequest::Config::_load_unit_config({
149             unit => { prefix => 'Foo-ill' },
150             id => "default", config => {}
151         }),
152         { prefixes => { default => 'Foo-ill' } },
153         "_load_unit_config: correct default prefix."
154     );
155     is_deeply(
156         Koha::Illrequest::Config::_load_unit_config({
157             unit => { prefix => 'Foo-ill' },
158             id => "A", config => {}, type => 'brw_cat'
159         }),
160         { prefixes => { brw_cat => { A => 'Foo-ill' } } },
161         "_load_unit_config: correct brw_cat prefix."
162     );
163
164     # Populate digital_recipient
165     is_deeply(
166         Koha::Illrequest::Config::_load_unit_config({
167             unit => { digital_recipient => 'borrower' },
168             id => "default", config => {}
169         }),
170         { digital_recipients => { default => 'borrower' } },
171         "_load_unit_config: correct default digital_recipient."
172     );
173     is_deeply(
174         Koha::Illrequest::Config::_load_unit_config({
175             unit => { digital_recipient => 'branch' },
176             id => "A", config => {}, type => 'brw_cat'
177         }),
178         { digital_recipients => { brw_cat => { A => 'branch' } } },
179         "_load_unit_config: correct brw_cat digital_recipient."
180     );
181
182     $schema->storage->txn_rollback;
183 };
184
185 # _load_configuration:
186
187 # We have already tested _load_unit_config, so we are reasonably confident
188 # that the per-branch, per-borrower_category & default sections parsing is
189 # good.
190 #
191 # Now we need to ensure that Arrays & Hashes are handled correctly, that
192 # censorship & ill partners are loaded correctly and that the backend
193 # directory is set correctly.
194
195 subtest '_load_configuration' => sub {
196
197     plan tests => 9;
198
199     $schema->storage->txn_begin;
200
201     my $config = Koha::Illrequest::Config->new;
202
203     # Return basic configuration
204     is_deeply(
205         Koha::Illrequest::Config::_load_configuration({}, 0),
206         {
207             backend_directory  => undef,
208             censorship         => {
209                 censor_notes_staff => 0,
210                 censor_reply_date => 0,
211             },
212             limits             => {},
213             digital_recipients => {},
214             prefixes           => {},
215             partner_code       => 'ILLLIBS',
216             raw_config         => {},
217         },
218         "load_configuration: return the base configuration."
219     );
220
221     # Return correct backend_dir
222     is_deeply(
223         Koha::Illrequest::Config::_load_configuration({ backend_directory => '/tmp/' }, 0),
224         {
225             backend_directory  => '/tmp/',
226             censorship         => {
227                 censor_notes_staff => 0,
228                 censor_reply_date => 0,
229             },
230             limits             => {},
231             digital_recipients => {},
232             prefixes           => {},
233             partner_code       => 'ILLLIBS',
234             raw_config         => { backend_directory => '/tmp/' },
235         },
236         "load_configuration: return the correct backend_dir."
237     );
238
239     # Map over branch configs
240     my $xml_config = {
241         backend_directory => '/tmp/',
242         branch => [
243             { code => '1', request_limit => { method => 'annual', count => 1 } },
244             { code => '2', prefix => '2-prefix' },
245             { code => '3', digital_recipient => 'branch' }
246         ]
247     };
248     is_deeply(
249         Koha::Illrequest::Config::_load_configuration($xml_config, 0),
250         {
251             backend_directory  => '/tmp/',
252             censorship         => {
253                 censor_notes_staff => 0,
254                 censor_reply_date => 0,
255             },
256             limits             => { branch => { 1 => { method => 'annual', count => 1 } } },
257             digital_recipients => { branch => { 3 => 'branch' } },
258             prefixes           => { branch => { 2 => '2-prefix' } },
259             partner_code       => 'ILLLIBS',
260             raw_config         => $xml_config,
261         },
262         "load_configuration: multi branch config parsed correctly."
263     );
264     # Single branch config
265     $xml_config = {
266         backend_directory => '/tmp/',
267         branch => {
268             code => '1',
269             request_limit => { method => 'annual', count => 1 },
270             prefix => '2-prefix',
271             digital_recipient => 'branch',
272         }
273     };
274     is_deeply(
275         Koha::Illrequest::Config::_load_configuration($xml_config, 0),
276         {
277             backend_directory  => '/tmp/',
278             censorship         => {
279                 censor_notes_staff => 0,
280                 censor_reply_date => 0,
281             },
282             limits             => { branch => { 1 => { method => 'annual', count => 1 } } },
283             digital_recipients => { branch => { 1 => 'branch' } },
284             prefixes           => { branch => { 1 => '2-prefix' } },
285             partner_code       => 'ILLLIBS',
286             raw_config         => $xml_config,
287         },
288         "load_configuration: single branch config parsed correctly."
289     );
290
291     # Map over borrower_category settings
292     $xml_config = {
293         backend_directory => '/tmp/',
294         borrower_category => [
295             { code => 'A', request_limit => { method => 'annual', count => 1 } },
296             { code => 'B', prefix => '2-prefix' },
297             { code => 'C', digital_recipient => 'branch' }
298         ]
299     };
300     is_deeply(
301         Koha::Illrequest::Config::_load_configuration($xml_config, 0),
302         {
303             backend_directory  => '/tmp/',
304             censorship         => {
305                 censor_notes_staff => 0,
306                 censor_reply_date => 0,
307             },
308             limits             => { brw_cat => { A => { method => 'annual', count => 1 } } },
309             digital_recipients => { brw_cat => { C => 'branch' } },
310             prefixes           => { brw_cat => { B => '2-prefix' } },
311             partner_code       => 'ILLLIBS',
312             raw_config         => $xml_config,
313         },
314         "load_configuration: multi borrower_category config parsed correctly."
315     );
316     # Single borrower_category config
317     $xml_config = {
318         backend_directory => '/tmp/',
319         borrower_category => {
320             code => '1',
321             request_limit => { method => 'annual', count => 1 },
322             prefix => '2-prefix',
323             digital_recipient => 'branch',
324         }
325     };
326     is_deeply(
327         Koha::Illrequest::Config::_load_configuration($xml_config, 0),
328         {
329             backend_directory  => '/tmp/',
330             censorship         => {
331                 censor_notes_staff => 0,
332                 censor_reply_date => 0,
333             },
334             limits             => { brw_cat => { 1 => { method => 'annual', count => 1 } } },
335             digital_recipients => { brw_cat => { 1 => 'branch' } },
336             prefixes           => { brw_cat => { 1 => '2-prefix' } },
337             partner_code       => 'ILLLIBS',
338             raw_config         => $xml_config,
339         },
340         "load_configuration: single borrower_category config parsed correctly."
341     );
342
343     # Default Configuration
344     $xml_config = {
345         backend_directory => '/tmp/',
346         request_limit => { method => 'annual', count => 1 },
347         prefix => '2-prefix',
348         digital_recipient => 'branch',
349     };
350     is_deeply(
351         Koha::Illrequest::Config::_load_configuration($xml_config, 0),
352         {
353             backend_directory  => '/tmp/',
354             censorship         => {
355                 censor_notes_staff => 0,
356                 censor_reply_date => 0,
357             },
358             limits             => { default => { method => 'annual', count => 1 } },
359             digital_recipients => { default => 'branch' },
360             prefixes           => { default => '2-prefix' },
361             partner_code       => 'ILLLIBS',
362             raw_config         => $xml_config,
363         },
364         "load_configuration: parse the default configuration."
365     );
366
367     # Censorship
368     $xml_config = {
369         backend_directory => '/tmp/',
370         staff_request_comments => 'hide',
371         reply_date => 'hide'
372     };
373     is_deeply(
374         Koha::Illrequest::Config::_load_configuration($xml_config, 0),
375         {
376             backend_directory  => '/tmp/',
377             censorship         => {
378                 censor_notes_staff => 1,
379                 censor_reply_date => 1,
380             },
381             limits             => {},
382             digital_recipients => {},
383             prefixes           => {},
384             partner_code       => 'ILLLIBS',
385             raw_config         => $xml_config,
386         },
387         "load_configuration: parse censorship settings configuration."
388     );
389
390     # Partner library category
391     is_deeply(
392         Koha::Illrequest::Config::_load_configuration({ partner_code => 'FOOBAR' }),
393         {
394             backend_directory  => undef,
395             censorship         => {
396                 censor_notes_staff => 0,
397                 censor_reply_date => 0,
398             },
399             limits             => {},
400             digital_recipients => {},
401             prefixes           => {},
402             partner_code       => 'FOOBAR',
403             raw_config         => { partner_code => 'FOOBAR' },
404         },
405         "load_configuration: Set partner code."
406     );
407
408     $schema->storage->txn_rollback;
409 };
410
411
412 subtest 'Final tests' => sub {
413
414     plan tests => 10;
415
416     $schema->storage->txn_begin;
417
418     t::lib::Mocks::mock_preference("UnmediatedILL", 0);
419     t::lib::Mocks::mock_config("interlibrary_loans", {});
420
421     my $config = Koha::Illrequest::Config->new;
422
423     # getPrefixes (error & undef):
424     dies_ok( sub { $config->getPrefixes("FOO") }, "getPrefixes: die if not correct type.");
425     is_deeply($config->getPrefixes("brw_cat"), { default => undef},
426               "getPrefixes: Undefined brw_cat prefix is undefined.");
427     is_deeply($config->getPrefixes("branch"), { default => undef},
428               "getPrefixes: Undefined branch prefix is undefined.");
429
430     # getDigitalRecipients (error & undef):
431     dies_ok( sub { $config->getDigitalRecipients("FOO") },
432              "getDigitalRecipients: die if not correct type.");
433     is_deeply($config->getDigitalRecipients("brw_cat"), { default => undef},
434               "getDigitalRecipients: Undefined brw_cat dig rec is undefined.");
435     is_deeply($config->getDigitalRecipients("branch"), { default => undef},
436               "getDigitalRecipients: Undefined branch dig rec is undefined.");
437
438     $config->{configuration} = Koha::Illrequest::Config::_load_configuration({
439             backend_directory => '/tmp/',
440             prefix => 'DEFAULT-prefix',
441             digital_recipient => 'branch',
442             borrower_category => [
443                 { code => 'B', prefix => '2-prefix' },
444                 { code => 'C', digital_recipient => 'branch' }
445             ],
446             branch => [
447                 { code => '1', prefix => 'T-prefix' },
448                 { code => '2', digital_recipient => 'borrower' }
449             ]
450         }, 0
451     );
452
453     # getPrefixes (values):
454     is_deeply($config->getPrefixes("brw_cat"),
455               { B => '2-prefix', default => 'DEFAULT-prefix' },
456               "getPrefixes: return configuration brw_cat prefixes.");
457     is_deeply($config->getPrefixes("branch"),
458               { 1 => 'T-prefix', default => 'DEFAULT-prefix' },
459               "getPrefixes: return configuration branch prefixes.");
460
461     # getDigitalRecipients (values):
462     is_deeply($config->getDigitalRecipients("brw_cat"),
463               { C => 'branch', default => 'branch' },
464               "getDigitalRecipients: return brw_cat digital_recipients.");
465     is_deeply($config->getDigitalRecipients("branch"),
466               { 2 => 'borrower', default => 'branch' },
467               "getDigitalRecipients: return branch digital_recipients.");
468
469     $schema->storage->txn_rollback;
470 };
471
472
473 1;