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
362 UseAuthoritiesForTracings
365 IntranetBiblioDefaultView
371 DefaultClassificationSource
372 EasyAnalyticalRecords
379 SpineLabelShowPrintOnBibDetails
380 BlockReturnOfWithdrawnItems
381 CalculateFinesOnReturn
382 AgeRestrictionOverride
385 AllowItemsOnHoldCheckout
386 AllowItemsOnHoldCheckoutSCO
387 AllowNotForLoanOverride
388 AllowRenewalLimitOverride
392 AutoRemoveOverduesRestrictions
395 HomeOrHoldingBranchReturn
396 InProcessingToShelvingCart
399 ManInvInNoissuesCharge
403 RentalsInNoissuesCharge
406 TransfersMaxDaysWarning
407 UseBranchTransferLimits
409 UseTransportCostMatrix
412 FinesIncludeGracePeriod
414 RefundLostOnReturnControl
415 WhenLostChargeReplacementFee
417 AllowHoldDateInFuture
418 AllowHoldPolicyOverride
419 AllowHoldsOnDamagedItems
420 AllowHoldsOnPatronsPossessions
421 AutoResumeSuspendedHolds
422 canreservefromotherbranches
423 decreaseLoanHighHolds
424 DisplayMultiPlaceHold
425 emailLibrarianWhenHoldIsPlaced
426 ExpireReservesMaxPickUpDelay
427 OPACAllowHoldDateInFuture
428 OPACAllowUserToChooseBranch
429 ReservesControlBranch
433 TransferWhenCancelAllWaitingHolds
434 AllowAllMessageDeletion
435 AllowOfflineCirculation
437 CircAutoPrintQuickSlip
438 DisplayClearScreenButton
439 FilterBeforeOverdueReport
441 itemBarcodeFallbackSearch
442 itemBarcodeInputFilter
443 previousIssuesDefaultSortOrder
444 RecordLocalUseOnReturn
447 todaysIssuesDefaultSortOrder
448 UpdateTotalIssuesOnCirc
450 WaitingNotifyAtCheckin
451 AllowSelfCheckReturns
456 OPACAmazonCoverImages
461 IDreamBooksReadometer
464 LibraryThingForLibrariesEnabled
467 NovelistSelectEnabled
474 CalendarFirstDayOfWeek
488 HighlightOwnItemsOnOPAC
489 OpacAddMastheadLibraryPulldown
490 OPACDisplay856uAsImage
498 OpacShowFiltersPulldownMobile
499 OPACShowHoldQueueDetails
500 OpacShowLibrariesPulldownMobile
501 OpacShowRecentComments
502 OPACShowUnusedAuthorities
505 OPACURLOpenInNewWindow
517 OPACPopupAuthorsSearch
527 AllowPurchaseSuggestionBranchChoice
528 OpacAllowPublicListCreation
529 OpacAllowSharingPrivateLists
532 OPACViewOthersSuggestions
536 EnableOpacSearchHistory
540 PatronSelfRegistration
543 AutoEmailPrimaryAddress
545 BorrowerRenewalPeriodBase
548 EnhancedMessagingPreferences
549 ExtendedPatronAttributes
550 intranetreadinghistory
553 TalkingTechItivaPhoneNotification
555 IncludeSeeFromInSearches
561 TraceCompleteSubfields
562 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));