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::Order');
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';
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
288 $insert_sth = $dbh->prepare($query);
289 $insert_sth->execute('authtypecode1');
290 my $authid1 = $dbh->last_insert_id( undef, undef, 'auth_header', undef );
291 $insert_sth->execute('authtypecode2');
292 my $authid2 = $dbh->last_insert_id( undef, undef, 'auth_header', undef );
294 # ---------- Add 1 old_issues
296 INSERT INTO old_issues
297 (borrowernumber, branchcode, itemnumber)
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
304 AddReserve( $branchcode, $borrowernumber1, $biblionumber1, '', 1, undef, undef, '', 'Title', undef, undef );
305 my $biblio = Koha::Biblios->find( $biblionumber1 );
306 my $holds = $biblio->holds;
307 CancelReserve( { reserve_id => $holds->next->reserve_id } );
309 # ---------- Add 1 aqbudgets
311 INSERT INTO aqbudgets
314 $insert_sth = $dbh->prepare($query);
315 $insert_sth->execute("20.0");
316 my $aqbudgets1 = $dbh->last_insert_id( undef, undef, 'aqbudgets', undef );
318 # ---------- Add 1 aqorders
321 (budget_id, basketno, biblionumber, invoiceid, subscriptionid)
323 $insert_sth = $dbh->prepare($query);
324 $insert_sth->execute( $aqbudgets1, undef, undef, undef, undef );
325 my $aqorders1 = $dbh->last_insert_id( undef, undef, 'aqorders', undef );
327 # --------- Add 1 subscription
329 INSERT INTO subscription
332 $insert_sth = $dbh->prepare($query);
333 $insert_sth->execute($biblionumber1);
334 my $subscription1 = $dbh->last_insert_id( undef, undef, 'subscription', undef );
338 #Change systempreferences values to $set_value
339 sub mocking_systempreferences_to_a_set_value {
340 my $set_value = shift;
345 AcqWarnOnDuplicateInvoice
361 AutoCreateAuthorities
362 BiblioAddsAuthorities
365 UseAuthoritiesForTracings
368 IntranetBiblioDefaultView
374 DefaultClassificationSource
375 EasyAnalyticalRecords
382 SpineLabelShowPrintOnBibDetails
383 BlockReturnOfWithdrawnItems
384 CalculateFinesOnReturn
385 AgeRestrictionOverride
388 AllowItemsOnHoldCheckout
389 AllowItemsOnHoldCheckoutSCO
390 AllowNotForLoanOverride
391 AllowRenewalLimitOverride
395 AutoRemoveOverduesRestrictions
398 HomeOrHoldingBranchReturn
399 InProcessingToShelvingCart
402 ManInvInNoissuesCharge
406 RentalsInNoissuesCharge
409 TransfersMaxDaysWarning
410 UseBranchTransferLimits
412 UseTransportCostMatrix
415 FinesIncludeGracePeriod
417 RefundLostOnReturnControl
418 WhenLostChargeReplacementFee
420 AllowHoldDateInFuture
421 AllowHoldPolicyOverride
422 AllowHoldsOnDamagedItems
423 AllowHoldsOnPatronsPossessions
424 AutoResumeSuspendedHolds
425 canreservefromotherbranches
426 decreaseLoanHighHolds
427 DisplayMultiPlaceHold
428 emailLibrarianWhenHoldIsPlaced
429 ExpireReservesMaxPickUpDelay
430 OPACAllowHoldDateInFuture
431 OPACAllowUserToChooseBranch
432 ReservesControlBranch
436 TransferWhenCancelAllWaitingHolds
437 AllowAllMessageDeletion
438 AllowOfflineCirculation
440 CircAutoPrintQuickSlip
441 DisplayClearScreenButton
442 FilterBeforeOverdueReport
444 itemBarcodeFallbackSearch
445 itemBarcodeInputFilter
446 previousIssuesDefaultSortOrder
447 RecordLocalUseOnReturn
450 todaysIssuesDefaultSortOrder
451 UpdateTotalIssuesOnCirc
453 WaitingNotifyAtCheckin
454 AllowSelfCheckReturns
459 OPACAmazonCoverImages
464 IDreamBooksReadometer
467 LibraryThingForLibrariesEnabled
470 NovelistSelectEnabled
477 CalendarFirstDayOfWeek
491 HighlightOwnItemsOnOPAC
492 OpacAddMastheadLibraryPulldown
493 OPACDisplay856uAsImage
501 OpacShowFiltersPulldownMobile
502 OPACShowHoldQueueDetails
503 OpacShowLibrariesPulldownMobile
504 OpacShowRecentComments
505 OPACShowUnusedAuthorities
508 OPACURLOpenInNewWindow
520 OPACPopupAuthorsSearch
530 AllowPurchaseSuggestionBranchChoice
531 OpacAllowPublicListCreation
532 OpacAllowSharingPrivateLists
535 OPACViewOthersSuggestions
539 EnableOpacSearchHistory
543 PatronSelfRegistration
546 AutoEmailPrimaryAddress
548 BorrowerRenewalPeriodBase
551 EnhancedMessagingPreferences
552 ExtendedPatronAttributes
553 intranetreadinghistory
556 TalkingTechItivaPhoneNotification
558 IncludeSeeFromInSearches
564 TraceCompleteSubfields
565 TraceSubjectSubdivisions
571 OPACItemsResultsDisplay
573 IntranetNumbersPreferPhrase
574 OPACNumbersPreferPhrase
576 RenewSerialAddsSuggestion
577 RoutingListAddReserves
586 StaffDetailItemSelection
596 t::lib::Mocks::mock_preference( $_, $set_value );
600 #Test if all systempreferences are at $value_to_test
601 sub verif_systempreferences_values {
602 my ( $report, $value_to_test ) = @_;
605 foreach my $key ( keys %{$report->{systempreferences}} ) {
606 if ( $report->{systempreferences}->{$key} ne $value_to_test ) {
608 push @missings, $key;
611 unless ( @missings ) {
612 ok(1, 'All prefs are present');
614 ok(0, 'Some prefs are missing: ' . Dumper(\@missings));
618 $schema->storage->txn_rollback;