Bug 25723: Use a hasref for lookup
[koha.git] / t / db_dependent / Koha.t
1 #!/usr/bin/perl
2 #
3 # This is to test C4/Koha
4 # It requires a working Koha database with the sample data
5
6 use Modern::Perl;
7 use DateTime::Format::MySQL;
8 use Test::More tests => 6;
9
10 use t::lib::TestBuilder;
11
12 use C4::Context;
13 use Koha::Database;
14 use Koha::DateUtils qw(dt_from_string);
15 use Koha::AuthorisedValue;
16 use Koha::AuthorisedValueCategories;
17
18 BEGIN {
19     use_ok('C4::Koha', qw( :DEFAULT GetDailyQuote GetItemTypesCategorized));
20     use_ok('C4::Members');
21 }
22
23 my $schema  = Koha::Database->new->schema;
24 $schema->storage->txn_begin;
25 my $builder = t::lib::TestBuilder->new;
26 my $dbh = C4::Context->dbh;
27
28 our $itype_1 = $builder->build({ source => 'Itemtype' });
29
30 subtest 'Authorized Values Tests' => sub {
31     plan tests => 3;
32
33     my $data = {
34         category            => 'CATEGORY',
35         authorised_value    => 'AUTHORISED_VALUE',
36         lib                 => 'LIB',
37         lib_opac            => 'LIBOPAC',
38         imageurl            => 'IMAGEURL'
39     };
40
41     my $avc = Koha::AuthorisedValueCategories->find($data->{category});
42     Koha::AuthorisedValueCategory->new({ category_name => $data->{category} })->store unless $avc;
43 # Insert an entry into authorised_value table
44     my $insert_success = Koha::AuthorisedValue->new(
45         {   category         => $data->{category},
46             authorised_value => $data->{authorised_value},
47             lib              => $data->{lib},
48             lib_opac         => $data->{lib_opac},
49             imageurl         => $data->{imageurl}
50         }
51     )->store;
52     ok( $insert_success, "Insert data in database" );
53
54
55 # Clean up
56     if($insert_success){
57         my $query = "DELETE FROM authorised_values WHERE category=? AND authorised_value=? AND lib=? AND lib_opac=? AND imageurl=?;";
58         my $sth = $dbh->prepare($query);
59         $sth->execute($data->{category}, $data->{authorised_value}, $data->{lib}, $data->{lib_opac}, $data->{imageurl});
60     }
61
62     SKIP: {
63         eval { require Test::Deep; import Test::Deep; };
64         skip "Test::Deep required to run the GetAuthorisedValues() tests.", 2 if $@;
65         Koha::AuthorisedValueCategory->new({ category_name => 'BUG10656' })->store;
66         Koha::AuthorisedValue->new(
67             {   category         => 'BUG10656',
68                 authorised_value => 'ZZZ',
69                 lib              => 'Z_STAFF',
70                 lib_opac         => 'A_PUBLIC',
71                 imageurl         => ''
72             }
73         )->store;
74         Koha::AuthorisedValue->new(
75             {   category         => 'BUG10656',
76                 authorised_value => 'AAA',
77                 lib              => 'A_STAFF',
78                 lib_opac         => 'Z_PUBLIC',
79                 imageurl         => ''
80             }
81         )->store;
82
83         # the next one sets lib_opac to NULL; in that case, the staff
84         # display value is meant to be used.
85         Koha::AuthorisedValue->new(
86             {   category         => 'BUG10656',
87                 authorised_value => 'DDD',
88                 lib              => 'D_STAFF',
89                 lib_opac         => undef,
90                 imageurl         => ''
91             }
92         )->store;
93
94         my $authvals = GetAuthorisedValues('BUG10656');
95         cmp_deeply(
96             $authvals,
97             [
98                 {
99                     id => ignore(),
100                     category => 'BUG10656',
101                     authorised_value => 'AAA',
102                     lib => 'A_STAFF',
103                     lib_opac => 'Z_PUBLIC',
104                     imageurl => '',
105                 },
106                 {
107                     id => ignore(),
108                     category => 'BUG10656',
109                     authorised_value => 'DDD',
110                     lib => 'D_STAFF',
111                     lib_opac => undef,
112                     imageurl => '',
113                 },
114                 {
115                     id => ignore(),
116                     category => 'BUG10656',
117                     authorised_value => 'ZZZ',
118                     lib => 'Z_STAFF',
119                     lib_opac => 'A_PUBLIC',
120                     imageurl => '',
121                 },
122             ],
123             'list of authorised values in staff mode sorted by staff label (bug 10656)'
124         );
125         $authvals = GetAuthorisedValues('BUG10656', 1);
126         cmp_deeply(
127             $authvals,
128             [
129                 {
130                     id => ignore(),
131                     category => 'BUG10656',
132                     authorised_value => 'ZZZ',
133                     lib => 'A_PUBLIC',
134                     lib_opac => 'A_PUBLIC',
135                     imageurl => '',
136                 },
137                 {
138                     id => ignore(),
139                     category => 'BUG10656',
140                     authorised_value => 'DDD',
141                     lib => 'D_STAFF',
142                     lib_opac => undef,
143                     imageurl => '',
144                 },
145                 {
146                     id => ignore(),
147                     category => 'BUG10656',
148                     authorised_value => 'AAA',
149                     lib => 'Z_PUBLIC',
150                     lib_opac => 'Z_PUBLIC',
151                     imageurl => '',
152                 },
153             ],
154             'list of authorised values in OPAC mode sorted by OPAC label (bug 10656)'
155         );
156     }
157
158 };
159
160 ### test for C4::Koha->GetDailyQuote()
161 SKIP:
162     {
163         eval { require Test::Deep; import Test::Deep; };
164         skip "Test::Deep required to run the GetDailyQuote tests.", 1 if $@;
165
166         subtest 'Daily Quotes Test' => sub {
167             plan tests => 4;
168
169             SKIP: {
170
171                 skip "C4::Koha can't \'GetDailyQuote\'!", 3 unless can_ok('C4::Koha','GetDailyQuote');
172
173 # Fill the quote table with the default needed and a spare
174 $dbh->do("DELETE FROM quotes WHERE id=3 OR id=25;");
175 my $sql = "INSERT INTO quotes (id,source,text,timestamp) VALUES
176 (25,'Richard Nixon','When the President does it, that means that it is not illegal.',NOW()),
177 (3,'Abraham Lincoln','Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal.',NOW());";
178 $dbh->do($sql);
179
180                 my $expected_quote = {
181                     id          => 3,
182                     source      => 'Abraham Lincoln',
183                     text        => 'Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal.',
184                     timestamp   => re('\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}'),   #'YYYY-MM-DD HH:MM:SS'
185                 };
186
187 # test quote retrieval based on id
188
189                 my $quote = GetDailyQuote('id'=>3);
190                 cmp_deeply ($quote, $expected_quote, "Got a quote based on id.") or
191                     diag('Be sure to run this test on a clean install of sample data.');
192
193 # test quote retrieval based on today's date
194
195                 my $query = 'UPDATE quotes SET timestamp = ? WHERE id = ?';
196                 my $sth = C4::Context->dbh->prepare($query);
197                 $sth->execute(DateTime::Format::MySQL->format_datetime( dt_from_string() ), $expected_quote->{'id'});
198
199                 DateTime::Format::MySQL->format_datetime( dt_from_string() ) =~ m/(\d{4}-\d{2}-\d{2})/;
200                 $expected_quote->{'timestamp'} = re("^$1");
201
202 #        $expected_quote->{'timestamp'} = DateTime::Format::MySQL->format_datetime( dt_from_string() );   # update the timestamp of expected quote data
203
204                 $quote = GetDailyQuote(); # this is the "default" mode of selection
205                 cmp_deeply ($quote, $expected_quote, "Got a quote based on today's date.") or
206                     diag('Be sure to run this test on a clean install of sample data.');
207
208 # test random quote retrieval
209
210                 $quote = GetDailyQuote('random'=>1);
211                 ok ($quote, "Got a random quote.");
212             }
213         };
214 }
215
216
217 subtest 'ISBN tests' => sub {
218     plan tests => 6;
219
220     my $isbn13  = "9780330356473";
221     my $isbn13D = "978-0-330-35647-3";
222     my $isbn10  = "033035647X";
223     my $isbn10D = "0-330-35647-X";
224     is( xml_escape(undef), '',
225         'xml_escape() returns empty string on undef input' );
226     my $str = q{'"&<>'};
227     is(
228         xml_escape($str),
229         '&apos;&quot;&amp;&lt;&gt;&apos;',
230         'xml_escape() works as expected'
231     );
232     is( $str, q{'"&<>'}, '... and does not change input in place' );
233     is( C4::Koha::_isbn_cleanup('0-590-35340-3'),
234         '0590353403', '_isbn_cleanup removes hyphens' );
235     is( C4::Koha::_isbn_cleanup('0590353403 (pbk.)'),
236         '0590353403', '_isbn_cleanup removes parenthetical' );
237     is( C4::Koha::_isbn_cleanup('978-0-321-49694-2'),
238         '0321496949', '_isbn_cleanup converts ISBN-13 to ISBN-10' );
239
240 };
241
242 subtest 'GetItemTypesCategorized test' => sub{
243     plan tests => 9;
244
245     my $avc = Koha::AuthorisedValueCategories->find('ITEMTYPECAT');
246     Koha::AuthorisedValueCategory->new({ category_name => 'ITEMTYPECAT' })->store unless $avc;
247     my $insertGroup = Koha::AuthorisedValue->new(
248         {   category         => 'ITEMTYPECAT',
249             authorised_value => 'Qwertyware',
250             lib              => 'Keyboard software',
251             lib_opac         => 'Computer stuff',
252         }
253     )->store;
254
255     ok($insertGroup, "Create group Qwertyware");
256
257     my $query = "INSERT into itemtypes (itemtype, description, searchcategory, hideinopac) values (?,?,?,?)";
258     my $insertSth = C4::Context->dbh->prepare($query);
259     $insertSth->execute('BKghjklo1', 'One type of book', '', 0);
260     $insertSth->execute('BKghjklo2', 'Another type of book', 'Qwertyware', 0);
261     $insertSth->execute('BKghjklo3', 'Yet another type of book', 'Qwertyware', 0);
262
263     # Azertyware should not exist.
264     my @itemtypes = Koha::ItemTypes->search({ searchcategory => 'Azertyware' });
265     is( @itemtypes, 0, 'Search item types by searchcategory: Invalid category returns nothing');
266
267     @itemtypes = Koha::ItemTypes->search({ searchcategory => 'Qwertyware' });
268     my @got = map { $_->itemtype } @itemtypes;
269     my @expected = ( 'BKghjklo2', 'BKghjklo3' );
270     is_deeply(\@got,\@expected,'Search item types by searchcategory: valid category returns itemtypes');
271
272     # add more data since GetItemTypesCategorized's search is more subtle
273     $insertGroup = Koha::AuthorisedValue->new(
274         {   category         => 'ITEMTYPECAT',
275             authorised_value => 'Veryheavybook',
276             lib              => 'Weighty literature',
277         }
278     )->store;
279
280     $insertSth->execute('BKghjklo4', 'Another hidden book', 'Veryheavybook', 1);
281
282     my $hrCat = GetItemTypesCategorized();
283     ok(exists $hrCat->{Qwertyware}, 'GetItemTypesCategorized: fully visible category exists');
284     ok($hrCat->{Veryheavybook} &&
285        $hrCat->{Veryheavybook}->{hideinopac}==1, 'GetItemTypesCategorized: non-visible category hidden' );
286
287     is( $hrCat->{Veryheavybook}->{description}, 'Weighty literature', 'A category with only lib description passes through');
288     is( $hrCat->{Qwertyware}->{description}, 'Computer stuff', 'A category with lib_opac description uses that');
289
290     $insertSth->execute('BKghjklo5', 'An hidden book', 'Qwertyware', 1);
291     $hrCat = GetItemTypesCategorized();
292     ok(exists $hrCat->{Qwertyware}, 'GetItemTypesCategorized: partially visible category exists');
293
294     my @only = ( 'BKghjklo1', 'BKghjklo2', 'BKghjklo3', 'BKghjklo4', 'BKghjklo5', 'Qwertyware', 'Veryheavybook' );
295     my @results = ();
296     foreach my $key (@only) {
297         push @results, $key if exists $hrCat->{$key};
298     }
299     @expected = ( 'BKghjklo1', 'Qwertyware', 'Veryheavybook' );
300     is_deeply(\@results,\@expected, 'GetItemTypesCategorized: grouped and ungrouped items returned as expected.');
301 };
302
303 $schema->storage->txn_rollback;