X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=t%2Fdb_dependent%2FVirtualShelves.t;h=9f3f1b04c0710ee579e29355a5eb672943e969bd;hb=da7dd4ed8c2462597712a11b0a018db87b1fef87;hp=00cb032ab97e47f2670314cdbc29d82680772472;hpb=9b0bd43f10316d93fa3de24f261730f344df884f;p=koha.git diff --git a/t/db_dependent/VirtualShelves.t b/t/db_dependent/VirtualShelves.t index 00cb032ab9..9f3f1b04c0 100755 --- a/t/db_dependent/VirtualShelves.t +++ b/t/db_dependent/VirtualShelves.t @@ -1,160 +1,190 @@ #!/usr/bin/perl -# # This file is a test script for C4::VirtualShelves.pm # Author : Antoine Farnault, antoine@koha-fr.org -# +# Larger modifications by Jonathan Druart and Marcel de Rooy -use Test; -use strict; -#use warnings; FIXME - Bug 2505 +use Modern::Perl; +use Test::More tests => 71; +use MARC::Record; + +use C4::Biblio qw( AddBiblio DelBiblio ); use C4::Context; -# Making 30 tests. -BEGIN { plan tests => 112 } -# Getting some borrowers from database. my $dbh = C4::Context->dbh; -my $query = qq/ - SELECT borrowernumber - FROM borrowers - LIMIT 10 -/; -my $sth = $dbh->prepare($query); -$sth->execute; -my @borrowers; -while(my $borrower = $sth->fetchrow){ - push @borrowers, $borrower; -} +$dbh->{RaiseError} = 1; +$dbh->{AutoCommit} = 0; -# Getting some itemnumber from database -my $query = qq/ - SELECT itemnumber - FROM items - LIMIT 10 -/; -my $sth = $dbh->prepare($query); -$sth->execute; -my @items; -while(my $item = $sth->fetchrow){ - push @items, $item; +# Getting some borrowers from database. +my $query = q{SELECT borrowernumber FROM borrowers LIMIT 10}; +my $borr_ref=$dbh->selectall_arrayref($query); +if(@$borr_ref==0) { #no borrowers? should not occur of course + $borr_ref->[0][0]=undef; + #but even then, we can run this robust test :) +} +my @borrowers; +foreach(1..10) { + my $t= $_> @$borr_ref ? int(rand()*@$borr_ref): $_-1; #repeat if not enough + push @borrowers, $borr_ref->[$t][0]; } -# Getting some biblionumbers from database -my $query = qq/ - SELECT biblionumber - FROM biblio - LIMIT 10 -/; -my $sth = $dbh->prepare($query); -$sth->execute; +# Creating some biblios my @biblionumbers; -while(my $biblionumber = $sth->fetchrow){ +foreach(0..9) { + my ($biblionumber)= AddBiblio(MARC::Record->new, ''); + #item number ignored push @biblionumbers, $biblionumber; } -# --- -my $delete_virtualshelf = qq/ - DELETE FROM virtualshelves WHERE 1 -/; -my $delete_virtualshelfcontent =qq/ - DELETE FROM virtualshelfcontents WHERE 1 -/; - -my $sth = $dbh->prepare($delete_virtualshelf); -$sth->execute; -my $sth = $dbh->prepare($delete_virtualshelfcontent); -$sth->execute; -# --- - #----------------------------------------------------------------------# # # TESTS START HERE # #----------------------------------------------------------------------# -use C4::VirtualShelves; -my $version = C4::VirtualShelves->VERSION; -print "\n----------Testing C4::VirtualShelves version ".$version."--------\n"; - -ok($version); # First test: the module is loaded & the version is readable. - +use_ok('C4::VirtualShelves'); #-----------------------TEST AddShelf function------------------------# # usage : $shelfnumber = &AddShelf( $shelfname, $owner, $category); -# creating 10 good shelves. +# creating shelves (could be <10 when names are not unique) my @shelves; -for(my $i=0; $i<10;$i++){ - my $ShelfNumber = AddShelf("Shelf_".$i,$borrowers[$i] || '',int(rand(3))+1); - die "test Not ok, remove some shelves before" if ($ShelfNumber == -1); - ok($ShelfNumber); # Shelf creation successful; - push @shelves, $ShelfNumber if ok($ShelfNumber); +for my $i(0..9){ + my $name= randomname(); + my $catg= int(rand(2))+1; + my $ShelfNumber= AddShelf( + { + shelfname => $name, + category => $catg, + }, + $borrowers[$i]); + + if($ShelfNumber>-1) { + ok($ShelfNumber > -1, "created shelf"); # Shelf creation successful; + } + else { + my $t= C4::VirtualShelves::_CheckShelfName( + $name, $catg, $borrowers[$i], 0); + ok($t==0, "Name clash expected on shelf creation"); + } + push @shelves, { + number => $ShelfNumber, + name => $name, + catg => $catg, + owner => $borrowers[$i], + }; #also push the errors } -ok(10,scalar @shelves); # 10 shelves in @shelves; - -# try to create some shelf which already exists. -for(my $i=0;$i<10;$i++){ - my $badNumShelf = AddShelf("Shelf_".$i,$borrowers[$i] || '',''); - ok(-1,$badNumShelf); # AddShelf returns -1 if name already exist. +# try to create shelves with duplicate names +for my $i(0..9){ + if($shelves[$i]->{number}<0) { + ok(1, 'skip duplicate test for earlier name clash'); + next; + } + my @shlf=GetShelf($shelves[$i]->{number}); #number, name, owner, catg, ... + + # A shelf name is not per se unique! + if( $shlf[3]==2 ) { #public list: try to create with same name + my $badNumShelf= AddShelf( { + shelfname=> $shelves[$i]->{name}, + category => 2 + }, $borrowers[$i]); + ok(-1==$badNumShelf, 'do not create public lists with duplicate names'); + #AddShelf returns -1 if name already exist. + DelShelf($badNumShelf) if $badNumShelf>-1; #delete if went wrong.. + } + else { #private list, try to add another one for SAME user (owner) + my $badNumShelf= defined($shlf[2])? AddShelf( + { + shelfname=> $shelves[$i]->{name}, + category => 1, + }, + $shlf[2]): -1; + ok(-1==$badNumShelf, 'do not create private lists with duplicate name for same user'); + DelShelf($badNumShelf) if $badNumShelf>-1; #delete if went wrong.. + } } -#-----------TEST AddToShelf & &AddToShelfFromBiblio & GetShelfContents & DelFromShelf functions--------------# -# usage : &AddToShelf($itemnumber, $shelfnumber); -# usage : $itemlist = &GetShelfContents($shelfnumber); -# usage : $itemlist = GetShelfContents($shelfnumber); - -for(my $i=0; $i<10;$i++){ - my $item = $items[int(rand(9))]; - my $shelfnumber = $shelves[int(rand(9))]; - - my ($itemlistBefore,$countbefore) = GetShelfContents($shelfnumber); - AddToShelf($item,$shelfnumber); - my ($itemlistAfter,$countafter) = GetShelfContents($shelfnumber); - ok($countbefore,$countafter - 1); # the item has been successfuly added. - - - # same thing with AddToShelfFromBiblio - my $biblionumber = $biblionumbers[int(rand(9))]; - &AddToShelfFromBiblio($biblionumber, $shelfnumber); - my ($AfterAgain,$countagain) = GetShelfContents($shelfnumber); - ok($countafter, $countagain -1); +#-----------TEST AddToShelf & GetShelfContents & DelFromShelf functions--------------# +# usage : &AddToShelf($biblionumber, $shelfnumber); +# usage : $biblist = &GetShelfContents($shelfnumber); +# usage : $biblist = GetShelfContents($shelfnumber); + +my %used = (); +for my $i(0..9){ + my $bib = $biblionumbers[int(rand(9))]; + my $shelfnumber = $shelves[int(rand(9))]->{number}; + if($shelfnumber<0) { + ok(1, 'skip add to list-test for shelf -1'); + ok(1, 'skip counting list entries for shelf -1'); + next; + } + + my $key = "$bib\t$shelfnumber"; + my $should_fail = exists($used{$key}) ? 1 : 0; + #FIXME We assume here that we have permission to add.. + #The different permissions could be tested too. + + my ($biblistBefore,$countbefore) = GetShelfContents($shelfnumber); + my $status = AddToShelf($bib,$shelfnumber,$borrowers[$i]); + my ($biblistAfter,$countafter) = GetShelfContents($shelfnumber); + + if ($should_fail) { + ok(!defined($status), 'failed to add to list when we should'); + } else { + ok(defined($status), 'added to list when we should'); + } + + if (defined $status) { + ok($countbefore == $countafter - 1, 'added bib to list'); # the bib has been successfuly added. + } else { + ok($countbefore == $countafter, 'did not add duplicate bib to list'); + } + + $used{$key}++; } #-----------------------TEST ModShelf & GetShelf functions------------------------# # usage : ModShelf($shelfnumber, $shelfname, $owner, $category ) # usage : (shelfnumber,shelfname,owner,category) = GetShelf($shelfnumber); -for(my $i=0; $i<10;$i++){ +for my $i(0..9){ my $rand = int(rand(9)); - my $numA = $shelves[$rand]; - my $shelf = { shelfname => "NewName_".$rand, - owner => $borrowers[$rand], - category => int(rand(3))+1 }; - - ModShelf($numA,$shelf); - my ($numB,$nameB,$ownerB,$categoryB) = GetShelf($numA); - - ok($numA,$numB); - ok($shelf->{shelfname},$nameB); - ok($shelf->{owner},$ownerB); - ok($shelf->{category},$categoryB); + my $numA = $shelves[$rand]->{number}; + if($numA<0) { + ok(1, 'Skip ModShelf test for shelf -1'); + ok(1, 'Skip ModShelf test for shelf -1'); + ok(1, 'Skip ModShelf test for shelf -1'); + next; + } + my $newname= randomname(); + my $shelf = { + shelfname => $newname, + category => 3-$shelves[$rand]->{catg}, # tric: 1->2 and 2->1 + }; + #check name change (with category change) + if(C4::VirtualShelves::_CheckShelfName($newname,$shelf->{category}, + $shelves[$rand]->{owner}, $numA)) { + ModShelf($numA,$shelf); + my ($numB,$nameB,$ownerB,$categoryB) = GetShelf($numA); + ok($numA == $numB, 'modified shelf'); + ok($shelf->{shelfname} eq $nameB, '... and name change took'); + ok($shelf->{category} eq $categoryB, '... and category change took'); + } + else { + ok(1, "No ModShelf for $newname") for 1..3; + } } -#-----------------------TEST DelShelf & DelFromShelf functions------------------------# -# usage : ($status) = &DelShelf($shelfnumber); -# usage : &DelFromShelf( $itemnumber, $shelfnumber); - -for(my $i=0; $i<10;$i++){ - my $shelfnumber = $shelves[$i]; - my $status = DelShelf($shelfnumber); - if($status){ - my ($items,$count) = GetShelfContents($shelfnumber); - ok($status,$count); - foreach (@$items){ # delete all the item in this shelf - DelFromShelf($_{'itemnumber'},$shelfnumber); - } - ok(DelShelf($shelfnumber)); +#----------------------- SOME SUBS --------------------------------------------# + +sub randomname { + my $rv=''; + for(0..19) { + $rv.= ('a'..'z','A'..'Z',0..9) [int(rand()*62)]; } + return $rv; } + +$dbh->rollback;