Bug 23177: (QA follow-up) Move rollback to the end
[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 => 7;
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 => 'Quertyware',
250         }
251     )->store;
252
253     ok($insertGroup, "Create group Qwertyware");
254
255     my $query = "INSERT into itemtypes (itemtype, description, searchcategory, hideinopac) values (?,?,?,?)";
256     my $insertSth = C4::Context->dbh->prepare($query);
257     $insertSth->execute('BKghjklo1', 'One type of book', '', 0);
258     $insertSth->execute('BKghjklo2', 'Another type of book', 'Qwertyware', 0);
259     $insertSth->execute('BKghjklo3', 'Yet another type of book', 'Qwertyware', 0);
260
261     # Azertyware should not exist.
262     my @itemtypes = Koha::ItemTypes->search({ searchcategory => 'Azertyware' });
263     is( @itemtypes, 0, 'Search item types by searchcategory: Invalid category returns nothing');
264
265     @itemtypes = Koha::ItemTypes->search({ searchcategory => 'Qwertyware' });
266     my @got = map { $_->itemtype } @itemtypes;
267     my @expected = ( 'BKghjklo2', 'BKghjklo3' );
268     is_deeply(\@got,\@expected,'Search item types by searchcategory: valid category returns itemtypes');
269
270     # add more data since GetItemTypesCategorized's search is more subtle
271     $insertGroup = Koha::AuthorisedValue->new(
272         {   category         => 'ITEMTYPECAT',
273             authorised_value => 'Varyheavybook',
274         }
275     )->store;
276
277     $insertSth->execute('BKghjklo4', 'Another hidden book', 'Veryheavybook', 1);
278
279     my $hrCat = GetItemTypesCategorized();
280     ok(exists $hrCat->{Qwertyware}, 'GetItemTypesCategorized: fully visible category exists');
281     ok($hrCat->{Veryheavybook} &&
282        $hrCat->{Veryheavybook}->{hideinopac}==1, 'GetItemTypesCategorized: non-visible category hidden' );
283
284     $insertSth->execute('BKghjklo5', 'An hidden book', 'Qwertyware', 1);
285     $hrCat = GetItemTypesCategorized();
286     ok(exists $hrCat->{Qwertyware}, 'GetItemTypesCategorized: partially visible category exists');
287
288     my @only = ( 'BKghjklo1', 'BKghjklo2', 'BKghjklo3', 'BKghjklo4', 'BKghjklo5', 'Qwertyware', 'Veryheavybook' );
289     my @results = ();
290     foreach my $key (@only) {
291         push @results, $key if exists $hrCat->{$key};
292     }
293     @expected = ( 'BKghjklo1', 'Qwertyware', 'Veryheavybook' );
294     is_deeply(\@results,\@expected, 'GetItemTypesCategorized: grouped and ungrouped items returned as expected.');
295 };
296
297 $schema->storage->txn_rollback;