Bug 10290: UT: VirtualShelves.t needs to create its own data
[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 ($biblionumber1, $biblioitemnumber1)   = AddBiblio(MARC::Record->new, '');
31 my ($biblionumber2, $biblioitemnumber2)   = AddBiblio(MARC::Record->new, '');
32 my ($biblionumber3, $biblioitemnumber3)   = AddBiblio(MARC::Record->new, '');
33 my ($biblionumber4, $biblioitemnumber4)   = AddBiblio(MARC::Record->new, '');
34 my ($biblionumber5, $biblioitemnumber5)   = AddBiblio(MARC::Record->new, '');
35 my ($biblionumber6, $biblioitemnumber6)   = AddBiblio(MARC::Record->new, '');
36 my ($biblionumber7, $biblioitemnumber7)   = AddBiblio(MARC::Record->new, '');
37 my ($biblionumber8, $biblioitemnumber8)   = AddBiblio(MARC::Record->new, '');
38 my ($biblionumber9, $biblioitemnumber9)   = AddBiblio(MARC::Record->new, '');
39 my ($biblionumber10, $biblioitemnumber10) = AddBiblio(MARC::Record->new, '');
40 my @biblionumbers = (
41     $biblionumber1, $biblionumber2, $biblionumber3, $biblionumber4, $biblionumber5,
42     $biblionumber6, $biblionumber7, $biblionumber8, $biblionumber9, $biblionumber10,
43 );
44
45 # ---
46 my $delete_virtualshelf = q{
47     DELETE FROM  virtualshelves WHERE 1
48 };
49 my $delete_virtualshelfcontent = q{
50     DELETE  FROM  virtualshelfcontents WHERE 1
51 };
52
53 $sth = $dbh->prepare($delete_virtualshelf);
54 $sth->execute;
55 $sth = $dbh->prepare($delete_virtualshelfcontent);
56 $sth->execute;
57 # ---
58
59 #----------------------------------------------------------------------#
60 #
61 #           TESTS START HERE
62 #
63 #----------------------------------------------------------------------#
64
65 use_ok('C4::VirtualShelves');
66
67 #-----------------------TEST AddShelf function------------------------#
68 # usage : $shelfnumber = &AddShelf( $shelfname, $owner, $category);
69
70 # creating 10 good shelves.
71 my @shelves;
72 for(my $i=0; $i<10;$i++){
73      my $ShelfNumber = AddShelf(
74     {shelfname=>"Shelf_".$i, category=>int(rand(2))+1 }, $borrowers[$i] );
75      die "test Not ok, remove some shelves before" if ($ShelfNumber == -1);
76      ok($ShelfNumber > -1, "created shelf");   # Shelf creation successful;
77      push @shelves, $ShelfNumber if $ShelfNumber > -1;
78 }
79
80 ok(10 == scalar @shelves, 'created 10 lists'); # 10 shelves in @shelves;
81
82 # try to create some shelf which already exists.
83 for(my $i=0;$i<10;$i++){
84     my @shlf=GetShelf($shelves[$i]);
85     my $badNumShelf = AddShelf(
86     {shelfname=>"Shelf_".$i, category=>$shlf[3] }, $borrowers[$i]);
87     ok(-1 == $badNumShelf, 'do not create lists with duplicate names');   # AddShelf returns -1 if name already exist.
88 }
89
90 #-----------TEST AddToShelf & GetShelfContents &  DelFromShelf functions--------------#
91 # usage : &AddToShelf($biblionumber, $shelfnumber);
92 # usage : $biblist = &GetShelfContents($shelfnumber);
93 # usage : $biblist = GetShelfContents($shelfnumber);
94
95 my %used = ();
96 for(my $i=0; $i<10;$i++){
97     my $bib = $biblionumbers[int(rand(9))];
98     my $shelfnumber = $shelves[int(rand(9))];
99
100     my $key = "$bib\t$shelfnumber";
101     my $should_fail = exists($used{$key}) ? 1 : 0;
102
103     my ($biblistBefore,$countbefore) = GetShelfContents($shelfnumber);
104     my $status = AddToShelf($bib,$shelfnumber,$borrowers[$i]);
105     my ($biblistAfter,$countafter) = GetShelfContents($shelfnumber);
106
107     if ($should_fail) {
108         ok(!defined($status), 'failed to add to list when we should');
109     } else {
110         ok(defined($status), 'added to list when we should');
111     }
112
113     if (defined $status) {
114         ok($countbefore == $countafter - 1, 'added bib to list');  # the bib has been successfuly added.
115     } else {
116         ok($countbefore == $countafter,     'did not add duplicate bib to list');  # the bib has been successfuly added.
117     }
118
119     $used{$key}++;
120
121 }
122
123 #-----------------------TEST ModShelf & GetShelf functions------------------------#
124 # usage : ModShelf($shelfnumber, $shelfname, $owner, $category )
125 # usage : (shelfnumber,shelfname,owner,category) = GetShelf($shelfnumber);
126
127 for(my $i=0; $i<10;$i++){
128     my $rand = int(rand(9));
129     my $numA = $shelves[$rand];
130     my $shelf = { shelfname => "NewName_".$rand,
131     category =>  int(rand(2))+1 };
132
133     ModShelf($numA,$shelf);
134     my ($numB,$nameB,$ownerB,$categoryB) = GetShelf($numA);
135
136     ok($numA == $numB, 'modified shelf');
137     ok($shelf->{shelfname} eq $nameB,     '... and name change took');
138     ok($shelf->{category}  eq $categoryB, '... and category change took');
139 }
140
141 #-----------------------TEST DelShelf & DelFromShelf functions------------------------#
142 # usage : ($status) = &DelShelf($shelfnumber);
143
144 for(my $i=0; $i<10;$i++){
145     my $shelfnumber = $shelves[$i];
146     my $status = DelShelf($shelfnumber);
147     ok(1 == $status, "deleted shelf $shelfnumber and its contents");
148 }
149
150 END {
151     DelBiblio( $biblionumber1 );
152     DelBiblio( $biblionumber2 );
153     DelBiblio( $biblionumber3 );
154     DelBiblio( $biblionumber4 );
155     DelBiblio( $biblionumber5 );
156     DelBiblio( $biblionumber6 );
157     DelBiblio( $biblionumber7 );
158     DelBiblio( $biblionumber8 );
159     DelBiblio( $biblionumber9 );
160     DelBiblio( $biblionumber10 );
161 };