Bug 10332: Data could exist in the courses table.
[koha.git] / t / db_dependent / VirtualShelves.t
1 #!/usr/bin/perl
2
3 #
4 # This file is a test script for C4::VirtualShelves.pm
5 # Author : Antoine Farnault, antoine@koha-fr.org
6 #
7
8 use Modern::Perl;
9 use Test::More tests => 82;
10 use MARC::Record;
11
12 use C4::Biblio qw( AddBiblio DelBiblio );
13 use C4::Context;
14
15 # Getting some borrowers from database.
16 my $dbh = C4::Context->dbh;
17 my $query = q{
18     SELECT borrowernumber
19     FROM   borrowers
20     LIMIT  10
21 };
22 my $sth = $dbh->prepare($query);
23 $sth->execute;
24 my @borrowers;
25 while(my $borrower = $sth->fetchrow){
26     push @borrowers, $borrower;
27 }
28
29 # Creating some biblios
30 my @biblionumbers;
31 foreach(0..9) {
32     my ($biblionumber)= AddBiblio(MARC::Record->new, '');
33         #item number ignored
34     push @biblionumbers, $biblionumber;
35 }
36
37 # FIXME Why are you deleting my shelves? See bug 10386.
38 my $delete_virtualshelf = q{
39     DELETE FROM  virtualshelves WHERE 1
40 };
41 my $delete_virtualshelfcontent = q{
42     DELETE  FROM  virtualshelfcontents WHERE 1
43 };
44
45 $sth = $dbh->prepare($delete_virtualshelf);
46 $sth->execute;
47 $sth = $dbh->prepare($delete_virtualshelfcontent);
48 $sth->execute;
49 # ---
50
51 #----------------------------------------------------------------------#
52 #
53 #           TESTS START HERE
54 #
55 #----------------------------------------------------------------------#
56
57 use_ok('C4::VirtualShelves');
58
59 #-----------------------TEST AddShelf function------------------------#
60 # usage : $shelfnumber = &AddShelf( $shelfname, $owner, $category);
61
62 # creating 10 good shelves.
63 my @shelves;
64 for(my $i=0; $i<10;$i++){
65      my $ShelfNumber = AddShelf(
66     {shelfname=>"Shelf_".$i, category=>int(rand(2))+1 }, $borrowers[$i] );
67      die "test Not ok, remove some shelves before" if ($ShelfNumber == -1);
68      ok($ShelfNumber > -1, "created shelf");   # Shelf creation successful;
69      push @shelves, $ShelfNumber if $ShelfNumber > -1;
70 }
71
72 ok(10 == scalar @shelves, 'created 10 lists'); # 10 shelves in @shelves;
73
74 # try to create some shelf which already exists.
75 for(my $i=0;$i<10;$i++){
76     my @shlf=GetShelf($shelves[$i]);
77
78     # FIXME This test still needs some attention
79     # A shelf name is not per se unique ! See report 10386
80     #temporary hack: Original test only for public list
81     if( $shlf[3]==2 ) {
82         my $badNumShelf= AddShelf(
83             {shelfname=>"Shelf_".$i, category => 2}, $borrowers[$i]);
84         ok(-1==$badNumShelf, 'do not create public lists with duplicate names');
85             #AddShelf returns -1 if name already exist.
86     }
87     else {
88         ok(1==1, "This trivial test cannot fail :)"); #leave count intact
89     }
90 }
91
92 #-----------TEST AddToShelf & GetShelfContents &  DelFromShelf functions--------------#
93 # usage : &AddToShelf($biblionumber, $shelfnumber);
94 # usage : $biblist = &GetShelfContents($shelfnumber);
95 # usage : $biblist = GetShelfContents($shelfnumber);
96
97 my %used = ();
98 for(my $i=0; $i<10;$i++){
99     my $bib = $biblionumbers[int(rand(9))];
100     my $shelfnumber = $shelves[int(rand(9))];
101
102     my $key = "$bib\t$shelfnumber";
103     my $should_fail = exists($used{$key}) ? 1 : 0;
104
105     my ($biblistBefore,$countbefore) = GetShelfContents($shelfnumber);
106     my $status = AddToShelf($bib,$shelfnumber,$borrowers[$i]);
107     my ($biblistAfter,$countafter) = GetShelfContents($shelfnumber);
108
109     if ($should_fail) {
110         ok(!defined($status), 'failed to add to list when we should');
111     } else {
112         ok(defined($status), 'added to list when we should');
113     }
114
115     if (defined $status) {
116         ok($countbefore == $countafter - 1, 'added bib to list');  # the bib has been successfuly added.
117     } else {
118         ok($countbefore == $countafter,     'did not add duplicate bib to list');  # the bib has been successfuly added.
119     }
120
121     $used{$key}++;
122
123 }
124
125 #-----------------------TEST ModShelf & GetShelf functions------------------------#
126 # usage : ModShelf($shelfnumber, $shelfname, $owner, $category )
127 # usage : (shelfnumber,shelfname,owner,category) = GetShelf($shelfnumber);
128
129 for(my $i=0; $i<10;$i++){
130     my $rand = int(rand(9));
131     my $numA = $shelves[$rand];
132     my $shelf = { shelfname => "NewName_".$rand,
133     category =>  int(rand(2))+1 };
134
135     ModShelf($numA,$shelf);
136     my ($numB,$nameB,$ownerB,$categoryB) = GetShelf($numA);
137
138     ok($numA == $numB, 'modified shelf');
139     ok($shelf->{shelfname} eq $nameB,     '... and name change took');
140     ok($shelf->{category}  eq $categoryB, '... and category change took');
141 }
142
143 #-----------------------TEST DelShelf & DelFromShelf functions------------------------#
144 # usage : ($status) = &DelShelf($shelfnumber);
145
146 for(my $i=0; $i<10;$i++){
147     my $shelfnumber = $shelves[$i];
148     my $status = DelShelf($shelfnumber);
149     ok(1 == $status, "deleted shelf $shelfnumber and its contents");
150 }
151
152 #----------------------- CLEANUP ----------------------------------------------#
153 DelBiblio($_) for @biblionumbers;