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
304 AddReserve( $branchcode, $borrowernumber1, $biblionumber1, '', 1, undef, undef, '', 'Title', undef, undef );
305 my $biblio = Koha::Biblios->find( $biblionumber1 );
306 my $holds = $biblio->holds;
307 $holds->next->cancel if $holds->count;
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 BlockReturnOfLostItems
384 BlockReturnOfWithdrawnItems
385 CalculateFinesOnReturn
386 AgeRestrictionOverride
389 AllowItemsOnHoldCheckoutSIP
390 AllowItemsOnHoldCheckoutSCO
391 AllowNotForLoanOverride
392 AllowRenewalLimitOverride
396 AutoRemoveOverduesRestrictions
399 HomeOrHoldingBranchReturn
402 ManInvInNoissuesCharge
406 RentalsInNoissuesCharge
408 TransfersMaxDaysWarning
409 UseBranchTransferLimits
411 UseTransportCostMatrix
414 FinesIncludeGracePeriod
416 RefundLostOnReturnControl
417 WhenLostChargeReplacementFee
419 AllowHoldDateInFuture
420 AllowHoldPolicyOverride
421 AllowHoldsOnDamagedItems
422 AllowHoldsOnPatronsPossessions
423 AutoResumeSuspendedHolds
424 canreservefromotherbranches
425 decreaseLoanHighHolds
426 DisplayMultiPlaceHold
427 emailLibrarianWhenHoldIsPlaced
428 ExpireReservesMaxPickUpDelay
429 OPACAllowHoldDateInFuture
430 OPACAllowUserToChooseBranch
431 ReservesControlBranch
435 TransferWhenCancelAllWaitingHolds
436 AllowAllMessageDeletion
437 AllowOfflineCirculation
439 CircAutoPrintQuickSlip
440 DisplayClearScreenButton
441 FilterBeforeOverdueReport
443 itemBarcodeFallbackSearch
444 itemBarcodeInputFilter
445 previousIssuesDefaultSortOrder
446 RecordLocalUseOnReturn
449 todaysIssuesDefaultSortOrder
450 UpdateTotalIssuesOnCirc
452 WaitingNotifyAtCheckin
453 AllowSelfCheckReturns
458 OPACAmazonCoverImages
463 IDreamBooksReadometer
466 LibraryThingForLibrariesEnabled
469 NovelistSelectEnabled
475 CalendarFirstDayOfWeek
489 HighlightOwnItemsOnOPAC
490 OpacAddMastheadLibraryPulldown
491 OPACDisplay856uAsImage
498 OpacShowFiltersPulldownMobile
499 OPACShowHoldQueueDetails
500 OpacShowRecentComments
501 OPACShowUnusedAuthorities
504 OPACURLOpenInNewWindow
516 OPACPopupAuthorsSearch
526 AllowPurchaseSuggestionBranchChoice
527 OpacAllowPublicListCreation
528 OpacAllowSharingPrivateLists
531 OPACViewOthersSuggestions
535 EnableOpacSearchHistory
539 PatronSelfRegistration
542 AutoEmailPrimaryAddress
544 BorrowerRenewalPeriodBase
546 EnhancedMessagingPreferences
547 ExtendedPatronAttributes
548 intranetreadinghistory
550 TalkingTechItivaPhoneNotification
552 IncludeSeeFromInSearches
558 TraceCompleteSubfields
559 TraceSubjectSubdivisions
565 OPACItemsResultsDisplay
567 IntranetNumbersPreferPhrase
568 OPACNumbersPreferPhrase
570 RenewSerialAddsSuggestion
571 RoutingListAddReserves
580 StaffDetailItemSelection
590 t::lib::Mocks::mock_preference( $_, $set_value );
594 #Test if all systempreferences are at $value_to_test
595 sub verif_systempreferences_values {
596 my ( $report, $value_to_test ) = @_;
599 foreach my $key ( keys %{$report->{systempreferences}} ) {
600 if ( $report->{systempreferences}->{$key} ne $value_to_test ) {
602 push @missings, $key;
605 unless ( @missings ) {
606 ok(1, 'All prefs are present');
608 ok(0, 'Some prefs are missing: ' . Dumper(\@missings));
612 $schema->storage->txn_rollback;