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 POSIX qw(strftime);
27 use_ok('C4::UsageStats');
28 use_ok('C4::Context');
30 use_ok( 'C4::AuthoritiesMarc', qw(AddAuthority) );
31 use_ok('C4::Reserves');
32 use_ok('MARC::Record');
33 use_ok('Koha::Acquisition::Order');
44 my $dbh = C4::Context->dbh;
45 $dbh->{AutoCommit} = 0;
46 $dbh->{RaiseError} = 1;
48 $dbh->do('DELETE FROM issues');
49 $dbh->do('DELETE FROM biblio');
50 $dbh->do('DELETE FROM items');
51 $dbh->do('DELETE FROM auth_header');
52 $dbh->do('DELETE FROM old_issues');
53 $dbh->do('DELETE FROM old_reserves');
54 $dbh->do('DELETE FROM borrowers');
55 $dbh->do('DELETE FROM aqorders');
56 $dbh->do('DELETE FROM subscription');
58 #################################################
60 #################################################
62 # ---------- Testing NeedUpdate -----------------
64 #Mocking C4::Context->preference("UsageStatsLastUpdateTime") to 0
65 my $now = strftime( "%s", localtime );
66 t::lib::Mocks::mock_preference( "UsageStatsLastUpdateTime", 0 );
68 my $update = C4::UsageStats->NeedUpdate;
69 is( $update, 1, "There is no last update, update needed" );
71 #Mocking C4::Context->preference("UsageStatsLastUpdateTime") to now
72 $now = strftime( "%s", localtime );
73 t::lib::Mocks::mock_preference( "UsageStatsLastUpdateTime", $now );
75 $update = C4::UsageStats->NeedUpdate;
76 is( $update, 0, "Last update just be done, no update needed " );
78 my $nb_of_libraries = Koha::Libraries->count;
80 # ---------- Testing BuildReport ----------------
82 #Test report->library -----------------
84 t::lib::Mocks::mock_preference( "UsageStatsID", 0 );
85 t::lib::Mocks::mock_preference( "UsageStatsLibraryName", 0 );
86 t::lib::Mocks::mock_preference( "UsageStatsLibrariesInfo", 0 );
87 t::lib::Mocks::mock_preference( "UsageStatsLibraryType", 0 );
88 t::lib::Mocks::mock_preference( "UsageStatsCountry", 0 );
89 t::lib::Mocks::mock_preference( "UsageStatsLibraryUrl", 0 );
91 my $report = C4::UsageStats->BuildReport();
93 isa_ok( $report, 'HASH', '$report is a HASH' );
94 isa_ok( $report->{libraries}, 'ARRAY', '$report->{libraries} is an ARRAY' );
95 is( scalar( @{ $report->{libraries} } ), 0, "There are 0 fields in libraries, libraries info are not shared" );
96 is( $report->{installation}->{koha_id}, 0, "UsageStatsID is good" );
97 is( $report->{installation}->{name}, '', "UsageStatsLibraryName is good" );
98 is( $report->{installation}->{url}, '', "UsageStatsLibraryUrl is good" );
99 is( $report->{installation}->{type}, '', "UsageStatsLibraryType is good" );
100 is( $report->{installation}->{country}, '', "UsageStatsCountry is good" );
104 t::lib::Mocks::mock_preference( "UsageStatsID", 1 );
105 t::lib::Mocks::mock_preference( "UsageStatsLibraryName", 'NAME' );
106 t::lib::Mocks::mock_preference( "UsageStatsLibraryUrl", 'URL' );
107 t::lib::Mocks::mock_preference( "UsageStatsLibraryType", 'TYPE' );
108 t::lib::Mocks::mock_preference( "UsageStatsCountry", 'COUNTRY' );
109 t::lib::Mocks::mock_preference( "UsageStatsLibrariesInfo", 1 );
110 t::lib::Mocks::mock_preference( "UsageStatsGeolocation", 1 );
113 $report = C4::UsageStats->BuildReport();
115 isa_ok( $report, 'HASH', '$report is a HASH' );
116 isa_ok( $report->{libraries}, 'ARRAY', '$report->{libraries} is an ARRAY' );
117 is( scalar( @{ $report->{libraries} } ), $nb_of_libraries, "There are 6 fields in $report->{libraries}" );
118 is( $report->{installation}->{koha_id}, 1, "UsageStatsID is good" );
119 is( $report->{installation}->{name}, 'NAME', "UsageStatsLibraryName is good" );
120 is( $report->{installation}->{url}, 'URL', "UsageStatsLibraryUrl is good" );
121 is( $report->{installation}->{type}, 'TYPE', "UsageStatsLibraryType is good" );
122 is( $report->{installation}->{country}, 'COUNTRY', "UsageStatsCountry is good" );
124 #Test report->volumetry ---------------
125 #with original values
126 $report = C4::UsageStats->BuildReport();
128 isa_ok( $report, 'HASH', '$report is a HASH' );
129 isa_ok( $report->{volumetry}, 'HASH', '$report->{volumetry} is a HASH' );
130 is( scalar( keys %{$report->{volumetry}} ), 8, "There are 8 fields in $report->{volumetry}" );
131 is( $report->{volumetry}->{biblio}, 0, "There is no biblio" );
132 is( $report->{volumetry}->{items}, 0, "There is no items" );
133 is( $report->{volumetry}->{auth_header}, 0, "There is no auth_header" );
134 is( $report->{volumetry}->{old_issues}, 0, "There is no old_issues" );
135 is( $report->{volumetry}->{old_reserves}, 0, "There is no old_reserves" );
136 is( $report->{volumetry}->{borrowers}, 0, "There is no borrowers" );
137 is( $report->{volumetry}->{aqorders}, 0, "There is no aqorders" );
138 is( $report->{volumetry}->{subscription}, 0, "There is no subscription" );
140 #after adding objects
141 construct_objects_needed();
143 $report = C4::UsageStats->BuildReport();
145 isa_ok( $report, 'HASH', '$report is a HASH' );
146 isa_ok( $report->{volumetry}, 'HASH', '$report->{volumetry} is a HASH' );
147 is( scalar( keys %{$report->{volumetry}} ), 8, "There are 8 fields in $report->{volumetry}" );
148 is( $report->{volumetry}->{biblio}, 3, "There are 3 biblio" );
149 is( $report->{volumetry}->{items}, 3, "There are 3 items" );
150 is( $report->{volumetry}->{auth_header}, 2, "There are 2 auth_header" );
151 is( $report->{volumetry}->{old_issues}, 1, "There is 1 old_issues" );
152 is( $report->{volumetry}->{old_reserves}, 1, "There is 1 old_reserves" );
153 is( $report->{volumetry}->{borrowers}, 3, "There are 3 borrowers" );
154 is( $report->{volumetry}->{aqorders}, 1, "There is 1 aqorders" );
155 is( $report->{volumetry}->{subscription}, 1, "There is 1 subscription" );
157 #Test report->systempreferences -------
159 mocking_systempreferences_to_a_set_value(0);
161 $report = C4::UsageStats->BuildReport();
162 isa_ok( $report, 'HASH', '$report is a HASH' );
163 isa_ok( $report->{systempreferences}, 'HASH', '$report->{systempreferences} is a HASH' );
164 verif_systempreferences_values( $report, 0 );
167 mocking_systempreferences_to_a_set_value(1);
169 $report = C4::UsageStats->BuildReport();
170 isa_ok( $report, 'HASH', '$report is a HASH' );
171 isa_ok( $report->{systempreferences}, 'HASH', '$report->{systempreferences} is a HASH' );
172 verif_systempreferences_values( $report, 1 );
174 #Test if unwanted syspref are not sent
175 is( $report->{systempreferences}->{useDischarge}, undef, 'useDischarge should not be shared');
176 is( $report->{systempreferences}->{OpacUserJS}, undef, 'OpacUserJS should not be shared');
178 # ---------- Testing ReportToCommunity ----------
180 # ---------- Testing _count ---------------------
185 my $count = $dbh->selectrow_array($query);
187 my $nb_fields = C4::UsageStats::_count('borrowers');
188 is( $nb_fields, $count, "_count return the good number of fields" );
190 #################################################
192 #################################################
204 sub construct_objects_needed {
206 # ---------- 3 borrowers ---------------------
207 my $surname1 = 'Borrower 1';
208 my $surname2 = 'Borrower 2';
209 my $surname3 = 'Borrower 3';
210 my $firstname1 = 'firstname 1';
211 my $firstname2 = 'firstname 2';
212 my $firstname3 = 'firstname 3';
213 my $cardnumber1 = 'test_card1';
214 my $cardnumber2 = 'test_card2';
215 my $cardnumber3 = 'test_card3';
216 my $categorycode = Koha::Database->new()->schema()->resultset('Category')->first()->categorycode();
217 my $branchcode = Koha::Database->new()->schema()->resultset('Branch')->first()->branchcode();
220 INSERT INTO borrowers
221 (surname, firstname, cardnumber, branchcode, categorycode)
223 my $insert_sth = $dbh->prepare($query);
224 $insert_sth->execute( $surname1, $firstname1, $cardnumber1, $branchcode, $categorycode );
225 my $borrowernumber1 = $dbh->last_insert_id( undef, undef, 'borrowers', undef );
226 $insert_sth->execute( $surname2, $firstname2, $cardnumber2, $branchcode, $categorycode );
227 my $borrowernumber2 = $dbh->last_insert_id( undef, undef, 'borrowers', undef );
228 $insert_sth->execute( $surname3, $firstname3, $cardnumber3, $branchcode, $categorycode );
229 my $borrowernumber3 = $dbh->last_insert_id( undef, undef, 'borrowers', undef );
231 # ---------- 3 biblios -----------------------
232 my $title1 = 'Title 1';
233 my $title2 = 'Title 2';
234 my $title3 = 'Title 3';
235 my $author1 = 'Author 1';
236 my $author2 = 'Author 2';
237 my $author3 = 'Author 3';
243 $insert_sth = $dbh->prepare($query);
244 $insert_sth->execute( $title1, $author1 );
245 my $biblionumber1 = $dbh->last_insert_id( undef, undef, 'biblio', undef );
246 $insert_sth->execute( $title2, undef );
247 my $biblionumber2 = $dbh->last_insert_id( undef, undef, 'biblio', undef );
248 $insert_sth->execute( $title3, $author3 );
249 my $biblionumber3 = $dbh->last_insert_id( undef, undef, 'biblio', undef );
251 # ---------- 3 biblio items -------------------------
253 INSERT INTO biblioitems
254 (biblionumber, itemtype)
256 $insert_sth = $dbh->prepare($query);
257 $insert_sth->execute( $biblionumber1, 'Book' );
258 my $biblioitemnumber1 = $dbh->last_insert_id( undef, undef, 'biblioitems', undef );
259 $insert_sth->execute( $biblionumber2, 'Music' );
260 my $biblioitemnumber2 = $dbh->last_insert_id( undef, undef, 'biblioitems', undef );
261 $insert_sth->execute( $biblionumber3, 'Book' );
262 my $biblioitemnumber3 = $dbh->last_insert_id( undef, undef, 'biblioitems', undef );
264 # ---------- 3 items -------------------------
265 my $barcode1 = '111111';
266 my $barcode2 = '222222';
267 my $barcode3 = '333333';
271 (biblionumber, biblioitemnumber, barcode, itype)
273 $insert_sth = $dbh->prepare($query);
274 $insert_sth->execute( $biblionumber1, $biblioitemnumber1, $barcode1, 'Book' );
275 my $item_number1 = $dbh->last_insert_id( undef, undef, 'items', undef );
276 $insert_sth->execute( $biblionumber2, $biblioitemnumber2, $barcode2, 'Music' );
277 my $item_number2 = $dbh->last_insert_id( undef, undef, 'items', undef );
278 $insert_sth->execute( $biblionumber3, $biblioitemnumber3, $barcode3, 'Book' );
279 my $item_number3 = $dbh->last_insert_id( undef, undef, 'items', undef );
281 # ---------- Add 2 auth_header
283 INSERT INTO auth_header
286 $insert_sth = $dbh->prepare($query);
287 $insert_sth->execute('authtypecode1');
288 my $authid1 = $dbh->last_insert_id( undef, undef, 'auth_header', undef );
289 $insert_sth->execute('authtypecode2');
290 my $authid2 = $dbh->last_insert_id( undef, undef, 'auth_header', undef );
292 # ---------- Add 1 old_issues
294 INSERT INTO old_issues
295 (borrowernumber, branchcode, itemnumber)
297 $insert_sth = $dbh->prepare($query);
298 $insert_sth->execute( $borrowernumber1, $branchcode, $item_number1 );
299 my $issue_id1 = $dbh->last_insert_id( undef, undef, 'old_issues', undef );
301 # ---------- Add 1 old_reserves
302 AddReserve( $branchcode, $borrowernumber1, $biblionumber1, '', 1, undef, undef, '', 'Title', undef, undef );
303 my $biblio = Koha::Biblios->find( $biblionumber1 );
304 my $holds = $biblio->holds;
305 CancelReserve( { reserve_id => $holds->next->reserve_id } );
307 # ---------- Add 1 aqbudgets
309 INSERT INTO aqbudgets
312 $insert_sth = $dbh->prepare($query);
313 $insert_sth->execute("20.0");
314 my $aqbudgets1 = $dbh->last_insert_id( undef, undef, 'aqbudgets', undef );
316 # ---------- Add 1 aqorders
319 (budget_id, basketno, biblionumber, invoiceid, subscriptionid)
321 $insert_sth = $dbh->prepare($query);
322 $insert_sth->execute( $aqbudgets1, undef, undef, undef, undef );
323 my $aqorders1 = $dbh->last_insert_id( undef, undef, 'aqorders', undef );
325 # --------- Add 1 subscription
327 INSERT INTO subscription
330 $insert_sth = $dbh->prepare($query);
331 $insert_sth->execute($biblionumber1);
332 my $subscription1 = $dbh->last_insert_id( undef, undef, 'subscription', undef );
336 #Change systempreferences values to $set_value
337 sub mocking_systempreferences_to_a_set_value {
338 my $set_value = shift;
343 AcqWarnOnDuplicateInvoice
359 AutoCreateAuthorities
360 BiblioAddsAuthorities
363 UseAuthoritiesForTracings
366 IntranetBiblioDefaultView
372 DefaultClassificationSource
373 EasyAnalyticalRecords
380 SpineLabelShowPrintOnBibDetails
381 BlockReturnOfWithdrawnItems
382 CalculateFinesOnReturn
383 AgeRestrictionOverride
386 AllowItemsOnHoldCheckout
387 AllowItemsOnHoldCheckoutSCO
388 AllowNotForLoanOverride
389 AllowRenewalLimitOverride
393 AutoRemoveOverduesRestrictions
396 HomeOrHoldingBranchReturn
397 InProcessingToShelvingCart
400 ManInvInNoissuesCharge
404 RentalsInNoissuesCharge
407 TransfersMaxDaysWarning
408 UseBranchTransferLimits
410 UseTransportCostMatrix
413 FinesIncludeGracePeriod
415 RefundLostOnReturnControl
416 WhenLostChargeReplacementFee
418 AllowHoldDateInFuture
419 AllowHoldPolicyOverride
420 AllowHoldsOnDamagedItems
421 AllowHoldsOnPatronsPossessions
422 AutoResumeSuspendedHolds
423 canreservefromotherbranches
424 decreaseLoanHighHolds
425 DisplayMultiPlaceHold
426 emailLibrarianWhenHoldIsPlaced
427 ExpireReservesMaxPickUpDelay
428 OPACAllowHoldDateInFuture
429 OPACAllowUserToChooseBranch
430 ReservesControlBranch
434 TransferWhenCancelAllWaitingHolds
435 AllowAllMessageDeletion
436 AllowOfflineCirculation
438 CircAutoPrintQuickSlip
439 DisplayClearScreenButton
440 FilterBeforeOverdueReport
442 itemBarcodeFallbackSearch
443 itemBarcodeInputFilter
444 previousIssuesDefaultSortOrder
445 RecordLocalUseOnReturn
448 todaysIssuesDefaultSortOrder
449 UpdateTotalIssuesOnCirc
451 WaitingNotifyAtCheckin
452 AllowSelfCheckReturns
457 OPACAmazonCoverImages
462 IDreamBooksReadometer
465 LibraryThingForLibrariesEnabled
468 NovelistSelectEnabled
475 CalendarFirstDayOfWeek
489 HighlightOwnItemsOnOPAC
490 OpacAddMastheadLibraryPulldown
491 OPACDisplay856uAsImage
499 OpacShowFiltersPulldownMobile
500 OPACShowHoldQueueDetails
501 OpacShowLibrariesPulldownMobile
502 OpacShowRecentComments
503 OPACShowUnusedAuthorities
506 OPACURLOpenInNewWindow
518 OPACPopupAuthorsSearch
528 AllowPurchaseSuggestionBranchChoice
529 OpacAllowPublicListCreation
530 OpacAllowSharingPrivateLists
533 OPACViewOthersSuggestions
537 EnableOpacSearchHistory
541 PatronSelfRegistration
544 AutoEmailPrimaryAddress
546 BorrowerRenewalPeriodBase
549 EnhancedMessagingPreferences
550 ExtendedPatronAttributes
551 intranetreadinghistory
554 TalkingTechItivaPhoneNotification
556 IncludeSeeFromInSearches
562 TraceCompleteSubfields
563 TraceSubjectSubdivisions
569 OPACItemsResultsDisplay
571 IntranetNumbersPreferPhrase
572 OPACNumbersPreferPhrase
574 RenewSerialAddsSuggestion
575 RoutingListAddReserves
584 StaffDetailItemSelection
594 t::lib::Mocks::mock_preference( $_, $set_value );
598 #Test if all systempreferences are at $value_to_test
599 sub verif_systempreferences_values {
600 my ( $report, $value_to_test ) = @_;
603 foreach my $key ( keys %{$report->{systempreferences}} ) {
604 if ( $report->{systempreferences}->{$key} ne $value_to_test ) {
606 push @missings, $key;
609 unless ( @missings ) {
610 ok(1, 'All prefs are present');
612 ok(0, 'Some prefs are missing: ' . Dumper(\@missings));