1 # Copyright 2015 BibLibre
3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 3 of the License, or (at your option) any later
10 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License along
15 # with Koha; if not, see <http://www.gnu.org/licenses>.
18 use Test::More tests => 57;
19 use t::lib::Mocks qw(mock_preference);
20 use t::lib::TestBuilder;
21 use POSIX qw(strftime);
28 use_ok('C4::UsageStats');
29 use_ok('C4::Context');
31 use_ok( 'C4::AuthoritiesMarc', qw(AddAuthority) );
32 use_ok('C4::Reserves');
33 use_ok('MARC::Record');
34 use_ok('Koha::Acquisition::Orders');
45 my $schema = Koha::Database->new->schema;
46 $schema->storage->txn_begin;
47 my $builder = t::lib::TestBuilder->new;
48 my $dbh = C4::Context->dbh;
50 $dbh->do('DELETE FROM issues');
51 $dbh->do('DELETE FROM biblio');
52 $dbh->do('DELETE FROM items');
53 $dbh->do('DELETE FROM auth_header');
54 $dbh->do('DELETE FROM old_issues');
55 $dbh->do('DELETE FROM old_reserves');
56 $dbh->do('DELETE FROM borrowers');
57 $dbh->do('DELETE FROM aqorders');
58 $dbh->do('DELETE FROM subscription');
60 #################################################
62 #################################################
64 # ---------- Testing NeedUpdate -----------------
66 #Mocking C4::Context->preference("UsageStatsLastUpdateTime") to 0
67 my $now = strftime( "%s", localtime );
68 t::lib::Mocks::mock_preference( "UsageStatsLastUpdateTime", 0 );
70 my $update = C4::UsageStats->NeedUpdate;
71 is( $update, 1, "There is no last update, update needed" );
73 #Mocking C4::Context->preference("UsageStatsLastUpdateTime") to now
74 $now = strftime( "%s", localtime );
75 t::lib::Mocks::mock_preference( "UsageStatsLastUpdateTime", $now );
77 $update = C4::UsageStats->NeedUpdate;
78 is( $update, 0, "Last update just be done, no update needed " );
80 my $nb_of_libraries = Koha::Libraries->count;
82 # ---------- Testing BuildReport ----------------
84 #Test report->library -----------------
86 t::lib::Mocks::mock_preference( "UsageStatsID", 0 );
87 t::lib::Mocks::mock_preference( "UsageStatsLibraryName", 0 );
88 t::lib::Mocks::mock_preference( "UsageStatsLibrariesInfo", 0 );
89 t::lib::Mocks::mock_preference( "UsageStatsLibraryType", 0 );
90 t::lib::Mocks::mock_preference( "UsageStatsCountry", 0 );
91 t::lib::Mocks::mock_preference( "UsageStatsLibraryUrl", 0 );
93 my $report = C4::UsageStats->BuildReport();
95 isa_ok( $report, 'HASH', '$report is a HASH' );
96 isa_ok( $report->{libraries}, 'ARRAY', '$report->{libraries} is an ARRAY' );
97 is( scalar( @{ $report->{libraries} } ), 0, "There are 0 fields in libraries, libraries info are not shared" );
98 is( $report->{installation}->{koha_id}, 0, "UsageStatsID is good" );
99 is( $report->{installation}->{name}, '', "UsageStatsLibraryName is good" );
100 is( $report->{installation}->{url}, '', "UsageStatsLibraryUrl is good" );
101 is( $report->{installation}->{type}, '', "UsageStatsLibraryType is good" );
102 is( $report->{installation}->{country}, '', "UsageStatsCountry is good" );
106 t::lib::Mocks::mock_preference( "UsageStatsID", 1 );
107 t::lib::Mocks::mock_preference( "UsageStatsLibraryName", 'NAME' );
108 t::lib::Mocks::mock_preference( "UsageStatsLibraryUrl", 'URL' );
109 t::lib::Mocks::mock_preference( "UsageStatsLibraryType", 'TYPE' );
110 t::lib::Mocks::mock_preference( "UsageStatsCountry", 'COUNTRY' );
111 t::lib::Mocks::mock_preference( "UsageStatsLibrariesInfo", 1 );
112 t::lib::Mocks::mock_preference( "UsageStatsGeolocation", 1 );
115 $report = C4::UsageStats->BuildReport();
117 isa_ok( $report, 'HASH', '$report is a HASH' );
118 isa_ok( $report->{libraries}, 'ARRAY', '$report->{libraries} is an ARRAY' );
119 is( scalar( @{ $report->{libraries} } ), $nb_of_libraries, "There are 6 fields in $report->{libraries}" );
120 is( $report->{installation}->{koha_id}, 1, "UsageStatsID is good" );
121 is( $report->{installation}->{name}, 'NAME', "UsageStatsLibraryName is good" );
122 is( $report->{installation}->{url}, 'URL', "UsageStatsLibraryUrl is good" );
123 is( $report->{installation}->{type}, 'TYPE', "UsageStatsLibraryType is good" );
124 is( $report->{installation}->{country}, 'COUNTRY', "UsageStatsCountry is good" );
126 #Test report->volumetry ---------------
127 #with original values
128 $report = C4::UsageStats->BuildReport();
130 isa_ok( $report, 'HASH', '$report is a HASH' );
131 isa_ok( $report->{volumetry}, 'HASH', '$report->{volumetry} is a HASH' );
132 is( scalar( keys %{$report->{volumetry}} ), 8, "There are 8 fields in $report->{volumetry}" );
133 is( $report->{volumetry}->{biblio}, 0, "There is no biblio" );
134 is( $report->{volumetry}->{items}, 0, "There is no items" );
135 is( $report->{volumetry}->{auth_header}, 0, "There is no auth_header" );
136 is( $report->{volumetry}->{old_issues}, 0, "There is no old_issues" );
137 is( $report->{volumetry}->{old_reserves}, 0, "There is no old_reserves" );
138 is( $report->{volumetry}->{borrowers}, 0, "There is no borrowers" );
139 is( $report->{volumetry}->{aqorders}, 0, "There is no aqorders" );
140 is( $report->{volumetry}->{subscription}, 0, "There is no subscription" );
142 #after adding objects
143 construct_objects_needed();
145 $report = C4::UsageStats->BuildReport();
147 isa_ok( $report, 'HASH', '$report is a HASH' );
148 isa_ok( $report->{volumetry}, 'HASH', '$report->{volumetry} is a HASH' );
149 is( scalar( keys %{$report->{volumetry}} ), 8, "There are 8 fields in $report->{volumetry}" );
150 is( $report->{volumetry}->{biblio}, 3, "There are 3 biblio" );
151 is( $report->{volumetry}->{items}, 3, "There are 3 items" );
152 is( $report->{volumetry}->{auth_header}, 2, "There are 2 auth_header" );
153 is( $report->{volumetry}->{old_issues}, 1, "There is 1 old_issues" );
154 is( $report->{volumetry}->{old_reserves}, 1, "There is 1 old_reserves" );
155 is( $report->{volumetry}->{borrowers}, 3, "There are 3 borrowers" );
156 is( $report->{volumetry}->{aqorders}, 1, "There is 1 aqorders" );
157 is( $report->{volumetry}->{subscription}, 1, "There is 1 subscription" );
159 #Test report->systempreferences -------
161 mocking_systempreferences_to_a_set_value(0);
163 $report = C4::UsageStats->BuildReport();
164 isa_ok( $report, 'HASH', '$report is a HASH' );
165 isa_ok( $report->{systempreferences}, 'HASH', '$report->{systempreferences} is a HASH' );
166 verif_systempreferences_values( $report, 0 );
169 mocking_systempreferences_to_a_set_value(1);
171 $report = C4::UsageStats->BuildReport();
172 isa_ok( $report, 'HASH', '$report is a HASH' );
173 isa_ok( $report->{systempreferences}, 'HASH', '$report->{systempreferences} is a HASH' );
174 verif_systempreferences_values( $report, 1 );
176 #Test if unwanted syspref are not sent
177 is( $report->{systempreferences}->{useDischarge}, undef, 'useDischarge should not be shared');
178 is( $report->{systempreferences}->{OpacUserJS}, undef, 'OpacUserJS should not be shared');
180 # ---------- Testing ReportToCommunity ----------
182 # ---------- Testing _count ---------------------
187 my $count = $dbh->selectrow_array($query);
189 my $nb_fields = C4::UsageStats::_count('borrowers');
190 is( $nb_fields, $count, "_count return the good number of fields" );
192 #################################################
194 #################################################
206 sub construct_objects_needed {
208 # ---------- 3 borrowers ---------------------
209 my $surname1 = 'Borrower 1';
210 my $surname2 = 'Borrower 2';
211 my $surname3 = 'Borrower 3';
212 my $firstname1 = 'firstname 1';
213 my $firstname2 = 'firstname 2';
214 my $firstname3 = 'firstname 3';
215 my $cardnumber1 = 'test_card1';
216 my $cardnumber2 = 'test_card2';
217 my $cardnumber3 = 'test_card3';
218 my $categorycode = $builder->build({ source => 'Category' })->{categorycode};
219 my $branchcode = $builder->build({ source => 'Branch' })->{branchcode};
222 INSERT INTO borrowers
223 (surname, firstname, cardnumber, branchcode, categorycode)
225 my $insert_sth = $dbh->prepare($query);
226 $insert_sth->execute( $surname1, $firstname1, $cardnumber1, $branchcode, $categorycode );
227 my $borrowernumber1 = $dbh->last_insert_id( undef, undef, 'borrowers', undef );
228 $insert_sth->execute( $surname2, $firstname2, $cardnumber2, $branchcode, $categorycode );
229 my $borrowernumber2 = $dbh->last_insert_id( undef, undef, 'borrowers', undef );
230 $insert_sth->execute( $surname3, $firstname3, $cardnumber3, $branchcode, $categorycode );
231 my $borrowernumber3 = $dbh->last_insert_id( undef, undef, 'borrowers', undef );
233 # ---------- 3 biblios -----------------------
234 my $title1 = 'Title 1';
235 my $title2 = 'Title 2';
236 my $title3 = 'Title 3';
237 my $author1 = 'Author 1';
238 my $author2 = 'Author 2';
239 my $author3 = 'Author 3';
243 (title, author, datecreated)
244 VALUES (?,?, NOW())';
245 $insert_sth = $dbh->prepare($query);
246 $insert_sth->execute( $title1, $author1 );
247 my $biblionumber1 = $dbh->last_insert_id( undef, undef, 'biblio', undef );
248 $insert_sth->execute( $title2, undef );
249 my $biblionumber2 = $dbh->last_insert_id( undef, undef, 'biblio', undef );
250 $insert_sth->execute( $title3, $author3 );
251 my $biblionumber3 = $dbh->last_insert_id( undef, undef, 'biblio', undef );
253 # ---------- 3 biblio items -------------------------
255 INSERT INTO biblioitems
256 (biblionumber, itemtype)
258 $insert_sth = $dbh->prepare($query);
259 $insert_sth->execute( $biblionumber1, 'Book' );
260 my $biblioitemnumber1 = $dbh->last_insert_id( undef, undef, 'biblioitems', undef );
261 $insert_sth->execute( $biblionumber2, 'Music' );
262 my $biblioitemnumber2 = $dbh->last_insert_id( undef, undef, 'biblioitems', undef );
263 $insert_sth->execute( $biblionumber3, 'Book' );
264 my $biblioitemnumber3 = $dbh->last_insert_id( undef, undef, 'biblioitems', undef );
266 # ---------- 3 items -------------------------
267 my $barcode1 = '111111';
268 my $barcode2 = '222222';
269 my $barcode3 = '333333';
273 (biblionumber, biblioitemnumber, barcode, itype)
275 $insert_sth = $dbh->prepare($query);
276 $insert_sth->execute( $biblionumber1, $biblioitemnumber1, $barcode1, 'Book' );
277 my $item_number1 = $dbh->last_insert_id( undef, undef, 'items', undef );
278 $insert_sth->execute( $biblionumber2, $biblioitemnumber2, $barcode2, 'Music' );
279 my $item_number2 = $dbh->last_insert_id( undef, undef, 'items', undef );
280 $insert_sth->execute( $biblionumber3, $biblioitemnumber3, $barcode3, 'Book' );
281 my $item_number3 = $dbh->last_insert_id( undef, undef, 'items', undef );
283 # ---------- Add 2 auth_header
285 INSERT INTO auth_header
286 (authtypecode, marcxml)
288 $insert_sth = $dbh->prepare($query);
289 $insert_sth->execute('atc1');
290 my $authid1 = $dbh->last_insert_id( undef, undef, 'auth_header', undef );
291 $insert_sth->execute('atc2');
292 my $authid2 = $dbh->last_insert_id( undef, undef, 'auth_header', undef );
294 # ---------- Add 1 old_issues
296 INSERT INTO old_issues
297 (issue_id, borrowernumber, branchcode, itemnumber)
298 VALUES ((select coalesce(max(issue_id), 0)+1 from issues),?,?,?)';
299 $insert_sth = $dbh->prepare($query);
300 $insert_sth->execute( $borrowernumber1, $branchcode, $item_number1 );
301 my $issue_id1 = $dbh->last_insert_id( undef, undef, 'old_issues', undef );
303 # ---------- Add 1 old_reserves
306 branchcode => $branchcode,
307 borrowernumber => $borrowernumber1,
308 biblionumber => $biblionumber1,
313 my $biblio = Koha::Biblios->find( $biblionumber1 );
314 my $holds = $biblio->holds;
315 $holds->next->cancel if $holds->count;
317 # ---------- Add 1 aqbudgets
319 INSERT INTO aqbudgets
322 $insert_sth = $dbh->prepare($query);
323 $insert_sth->execute("20.0");
324 my $aqbudgets1 = $dbh->last_insert_id( undef, undef, 'aqbudgets', undef );
326 # ---------- Add 1 aqorders
329 (budget_id, basketno, biblionumber, invoiceid, subscriptionid)
331 $insert_sth = $dbh->prepare($query);
332 $insert_sth->execute( $aqbudgets1, undef, undef, undef, undef );
333 my $aqorders1 = $dbh->last_insert_id( undef, undef, 'aqorders', undef );
335 # --------- Add 1 subscription
337 INSERT INTO subscription
340 $insert_sth = $dbh->prepare($query);
341 $insert_sth->execute($biblionumber1);
342 my $subscription1 = $dbh->last_insert_id( undef, undef, 'subscription', undef );
346 #Change systempreferences values to $set_value
347 sub mocking_systempreferences_to_a_set_value {
348 my $set_value = shift;
353 AcqWarnOnDuplicateInvoice
355 AllowHoldItemTypeSelection
371 AutoCreateAuthorities
372 BiblioAddsAuthorities
375 UseAuthoritiesForTracings
378 IntranetBiblioDefaultView
384 DefaultClassificationSource
385 EasyAnalyticalRecords
392 SpineLabelShowPrintOnBibDetails
393 BlockReturnOfLostItems
394 BlockReturnOfWithdrawnItems
395 CalculateFinesOnReturn
396 AgeRestrictionOverride
399 AllowItemsOnHoldCheckoutSIP
400 AllowItemsOnHoldCheckoutSCO
401 AllowNotForLoanOverride
402 AllowRenewalLimitOverride
406 AutoRemoveOverduesRestrictions
409 HomeOrHoldingBranchReturn
412 ManInvInNoissuesCharge
416 RentalsInNoissuesCharge
418 TransfersMaxDaysWarning
419 UseBranchTransferLimits
420 UseTransportCostMatrix
423 FinesIncludeGracePeriod
425 RefundLostOnReturnControl
426 WhenLostChargeReplacementFee
428 AllowHoldDateInFuture
429 AllowHoldPolicyOverride
430 AllowHoldsOnDamagedItems
431 AllowHoldsOnPatronsPossessions
432 AutoResumeSuspendedHolds
433 canreservefromotherbranches
434 decreaseLoanHighHolds
435 DisplayMultiPlaceHold
436 emailLibrarianWhenHoldIsPlaced
437 ExpireReservesMaxPickUpDelay
438 OPACAllowHoldDateInFuture
439 OPACAllowUserToChooseBranch
440 ReservesControlBranch
444 TransferWhenCancelAllWaitingHolds
445 AllowAllMessageDeletion
446 AllowOfflineCirculation
448 CircAutoPrintQuickSlip
449 DisplayClearScreenButton
450 FilterBeforeOverdueReport
452 itemBarcodeFallbackSearch
453 itemBarcodeInputFilter
454 previousIssuesDefaultSortOrder
455 RecordLocalUseOnReturn
458 todaysIssuesDefaultSortOrder
459 UpdateTotalIssuesOnCirc
461 WaitingNotifyAtCheckin
467 OPACAmazonCoverImages
472 LibraryThingForLibrariesEnabled
475 NovelistSelectEnabled
480 CalendarFirstDayOfWeek
495 HighlightOwnItemsOnOPAC
496 OpacAddMastheadLibraryPulldown
497 OPACDisplay856uAsImage
504 OpacShowFiltersPulldownMobile
505 OPACShowHoldQueueDetails
506 OpacShowRecentComments
507 OPACShowUnusedAuthorities
510 OPACURLOpenInNewWindow
522 OPACPopupAuthorsSearch
532 OpacAllowPublicListCreation
533 OpacAllowSharingPrivateLists
536 OPACViewOthersSuggestions
540 EnableOpacSearchHistory
544 PatronSelfRegistration
547 AutoEmailPrimaryAddress
549 BorrowerRenewalPeriodBase
551 EnhancedMessagingPreferences
552 ExtendedPatronAttributes
553 intranetreadinghistory
555 TalkingTechItivaPhoneNotification
557 IncludeSeeFromInSearches
562 TraceCompleteSubfields
563 TraceSubjectSubdivisions
568 OPACItemsResultsDisplay
570 IntranetNumbersPreferPhrase
571 OPACNumbersPreferPhrase
573 RenewSerialAddsSuggestion
574 RoutingListAddReserves
583 StaffDetailItemSelection
593 t::lib::Mocks::mock_preference( $_, $set_value );
597 #Test if all systempreferences are at $value_to_test
598 sub verif_systempreferences_values {
599 my ( $report, $value_to_test ) = @_;
602 foreach my $key ( keys %{$report->{systempreferences}} ) {
603 if ( $report->{systempreferences}->{$key} ne $value_to_test ) {
605 push @missings, $key;
608 unless ( @missings ) {
609 ok(1, 'All prefs are present');
611 ok(0, 'Some prefs are missing: ' . Dumper(\@missings));
615 $schema->storage->txn_rollback;