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
370 AutoCreateAuthorities
371 BiblioAddsAuthorities
374 UseAuthoritiesForTracings
377 IntranetBiblioDefaultView
383 DefaultClassificationSource
384 EasyAnalyticalRecords
391 SpineLabelShowPrintOnBibDetails
392 BlockReturnOfLostItems
393 BlockReturnOfWithdrawnItems
394 CalculateFinesOnReturn
395 AgeRestrictionOverride
398 AllowItemsOnHoldCheckoutSIP
399 AllowItemsOnHoldCheckoutSCO
400 AllowNotForLoanOverride
401 AllowRenewalLimitOverride
405 AutoRemoveOverduesRestrictions
408 HomeOrHoldingBranchReturn
411 ManInvInNoissuesCharge
415 RentalsInNoissuesCharge
417 TransfersMaxDaysWarning
418 UseBranchTransferLimits
419 UseTransportCostMatrix
422 FinesIncludeGracePeriod
424 RefundLostOnReturnControl
425 WhenLostChargeReplacementFee
427 AllowHoldDateInFuture
428 AllowHoldPolicyOverride
429 AllowHoldsOnDamagedItems
430 AllowHoldsOnPatronsPossessions
431 AutoResumeSuspendedHolds
432 canreservefromotherbranches
433 decreaseLoanHighHolds
434 DisplayMultiPlaceHold
435 emailLibrarianWhenHoldIsPlaced
436 ExpireReservesMaxPickUpDelay
437 OPACAllowHoldDateInFuture
438 OPACAllowUserToChooseBranch
439 ReservesControlBranch
443 TransferWhenCancelAllWaitingHolds
444 AllowAllMessageDeletion
445 AllowOfflineCirculation
447 CircAutoPrintQuickSlip
448 DisplayClearScreenButton
449 FilterBeforeOverdueReport
451 itemBarcodeFallbackSearch
452 itemBarcodeInputFilter
453 previousIssuesDefaultSortOrder
454 RecordLocalUseOnReturn
457 todaysIssuesDefaultSortOrder
458 UpdateTotalIssuesOnCirc
460 WaitingNotifyAtCheckin
466 OPACAmazonCoverImages
471 LibraryThingForLibrariesEnabled
474 NovelistSelectEnabled
479 CalendarFirstDayOfWeek
493 HighlightOwnItemsOnOPAC
494 OpacAddMastheadLibraryPulldown
495 OPACDisplay856uAsImage
502 OpacShowFiltersPulldownMobile
503 OPACShowHoldQueueDetails
504 OpacShowRecentComments
505 OPACShowUnusedAuthorities
508 OPACURLOpenInNewWindow
520 OPACPopupAuthorsSearch
530 OpacAllowPublicListCreation
531 OpacAllowSharingPrivateLists
534 OPACViewOthersSuggestions
538 EnableOpacSearchHistory
542 PatronSelfRegistration
545 AutoEmailPrimaryAddress
547 BorrowerRenewalPeriodBase
549 EnhancedMessagingPreferences
550 ExtendedPatronAttributes
551 intranetreadinghistory
553 TalkingTechItivaPhoneNotification
555 IncludeSeeFromInSearches
561 TraceCompleteSubfields
562 TraceSubjectSubdivisions
567 OPACItemsResultsDisplay
569 IntranetNumbersPreferPhrase
570 OPACNumbersPreferPhrase
572 RenewSerialAddsSuggestion
573 RoutingListAddReserves
582 StaffDetailItemSelection
592 t::lib::Mocks::mock_preference( $_, $set_value );
596 #Test if all systempreferences are at $value_to_test
597 sub verif_systempreferences_values {
598 my ( $report, $value_to_test ) = @_;
601 foreach my $key ( keys %{$report->{systempreferences}} ) {
602 if ( $report->{systempreferences}->{$key} ne $value_to_test ) {
604 push @missings, $key;
607 unless ( @missings ) {
608 ok(1, 'All prefs are present');
610 ok(0, 'Some prefs are missing: ' . Dumper(\@missings));
614 $schema->storage->txn_rollback;