Bug 13419: (follow-up) Add tests - remove existing shelves
[koha.git] / t / db_dependent / Utils / Datatables_Virtualshelves.t
1 #!/usr/bin/perl
2
3 # This file is part of Koha.
4 #
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
17
18 use Modern::Perl;
19
20 use Test::More tests => 13;
21
22 use C4::Biblio;
23 use C4::Context;
24 use C4::Branch;
25 use C4::Members;
26
27 use C4::VirtualShelves;
28
29 use_ok( "C4::Utils::DataTables::VirtualShelves" );
30
31 my $dbh = C4::Context->dbh;
32
33 # Start transaction
34 $dbh->{AutoCommit} = 0;
35 $dbh->{RaiseError} = 1;
36
37 $dbh->do(q|DELETE FROM virtualshelves|);
38
39 # Pick a categorycode from the DB
40 my @categories   = C4::Category->all;
41 my $categorycode = $categories[0]->categorycode;
42 my $branchcode   = "ABC";
43 my $branch_data = {
44     add            => 1,
45     branchcode     => $branchcode,
46     branchname     => 'my branchname',
47 };
48 ModBranch( $branch_data );
49
50 my %john_doe = (
51     cardnumber   => '123456',
52     firstname    => 'John',
53     surname      => 'Doe',
54     categorycode => $categorycode,
55     branchcode   => $branchcode,
56     dateofbirth  => '',
57     dateexpiry   => '9999-12-31',
58     userid       => 'john.doe',
59 );
60
61 my %jane_doe = (
62     cardnumber   => '234567',
63     firstname    =>  'Jane',
64     surname      => 'Doe',
65     categorycode => $categorycode,
66     branchcode   => $branchcode,
67     dateofbirth  => '',
68     dateexpiry   => '9999-12-31',
69     userid       => 'jane.doe',
70 );
71 my %john_smith = (
72     cardnumber   => '345678',
73     firstname    =>  'John',
74     surname      => 'Smith',
75     categorycode => $categorycode,
76     branchcode   => $branchcode,
77     dateofbirth  => '',
78     dateexpiry   => '9999-12-31',
79     userid       => 'john.smith',
80 );
81
82 $john_doe{borrowernumber} = AddMember( %john_doe );
83 $jane_doe{borrowernumber} = AddMember( %jane_doe );
84 $john_smith{borrowernumber} = AddMember( %john_smith );
85
86 my $shelf1 = {
87     shelfname => 'my first private list (empty)',
88     category => 1, # private
89     sortfield => 'author',
90 };
91 $shelf1->{shelfnumber} = C4::VirtualShelves::AddShelf( $shelf1, $john_doe{borrowernumber} );
92
93 my $shelf2 = {
94     shelfname => 'my second private list',
95     category => 1, # private
96     sortfield => 'title',
97 };
98 $shelf2->{shelfnumber} = C4::VirtualShelves::AddShelf( $shelf2, $john_doe{borrowernumber} );
99 my $biblionumber1 = _add_biblio('title 1');
100 my $biblionumber2 = _add_biblio('title 2');
101 my $biblionumber3 = _add_biblio('title 3');
102 my $biblionumber4 = _add_biblio('title 4');
103 my $biblionumber5 = _add_biblio('title 5');
104 C4::VirtualShelves::AddToShelf( $biblionumber1, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
105 C4::VirtualShelves::AddToShelf( $biblionumber2, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
106 C4::VirtualShelves::AddToShelf( $biblionumber3, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
107 C4::VirtualShelves::AddToShelf( $biblionumber4, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
108 C4::VirtualShelves::AddToShelf( $biblionumber5, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
109
110 my $shelf3 = {
111     shelfname => 'The first public list',
112     category => 2, # public
113     sortfield => 'author',
114 };
115 $shelf3->{shelfnumber} = C4::VirtualShelves::AddShelf( $shelf3, $jane_doe{borrowernumber} );
116 my $biblionumber6 = _add_biblio('title 6');
117 my $biblionumber7 = _add_biblio('title 7');
118 my $biblionumber8 = _add_biblio('title 8');
119 C4::VirtualShelves::AddToShelf( $biblionumber6, $shelf3->{shelfnumber}, $jane_doe{borrowernumber} );
120 C4::VirtualShelves::AddToShelf( $biblionumber7, $shelf3->{shelfnumber}, $jane_doe{borrowernumber} );
121 C4::VirtualShelves::AddToShelf( $biblionumber8, $shelf3->{shelfnumber}, $jane_doe{borrowernumber} );
122
123 my $shelf4 = {
124     shelfname => 'my second public list',
125     category => 2, # public
126     sortfield => 'title',
127 };
128 $shelf4->{shelfnumber}  = C4::VirtualShelves::AddShelf( $shelf4, $jane_doe{borrowernumber} );
129 my $biblionumber9  = _add_biblio('title 9');
130 my $biblionumber10 = _add_biblio('title 10');
131 my $biblionumber11 = _add_biblio('title 11');
132 my $biblionumber12 = _add_biblio('title 12');
133 C4::VirtualShelves::AddToShelf( $biblionumber9,  $shelf4->{shelfnumber}, $jane_doe{borrowernumber} );
134 C4::VirtualShelves::AddToShelf( $biblionumber10, $shelf4->{shelfnumber}, $jane_doe{borrowernumber} );
135 C4::VirtualShelves::AddToShelf( $biblionumber11, $shelf4->{shelfnumber}, $jane_doe{borrowernumber} );
136 C4::VirtualShelves::AddToShelf( $biblionumber12, $shelf4->{shelfnumber}, $jane_doe{borrowernumber} );
137
138 my $shelf5 = {
139     shelfname => 'my third private list',
140     category => 1, # private
141     sortfield => 'title',
142 };
143 $shelf5->{shelfnumber} = C4::VirtualShelves::AddShelf( $shelf5, $jane_doe{borrowernumber} );
144 my $biblionumber13 = _add_biblio('title 13');
145 my $biblionumber14 = _add_biblio('title 14');
146 my $biblionumber15 = _add_biblio('title 15');
147 my $biblionumber16 = _add_biblio('title 16');
148 my $biblionumber17 = _add_biblio('title 17');
149 my $biblionumber18 = _add_biblio('title 18');
150 C4::VirtualShelves::AddToShelf( $biblionumber13, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
151 C4::VirtualShelves::AddToShelf( $biblionumber14, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
152 C4::VirtualShelves::AddToShelf( $biblionumber15, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
153 C4::VirtualShelves::AddToShelf( $biblionumber16, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
154 C4::VirtualShelves::AddToShelf( $biblionumber17, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
155 C4::VirtualShelves::AddToShelf( $biblionumber18, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
156
157 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 6', category => 2}, $john_smith{borrowernumber} );
158 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 7', category => 2}, $john_smith{borrowernumber} );
159 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 8', category => 2}, $john_smith{borrowernumber} );
160 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 9', category => 2}, $john_smith{borrowernumber} );
161 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 10', category => 2}, $john_smith{borrowernumber} );
162 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 11', category => 2}, $john_smith{borrowernumber} );
163 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 12', category => 2}, $john_smith{borrowernumber} );
164 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 13', category => 2}, $john_smith{borrowernumber} );
165 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 14', category => 2}, $john_smith{borrowernumber} );
166 C4::VirtualShelves::AddShelf( { shelfname => 'another public list 15', category => 2}, $john_smith{borrowernumber} );
167
168
169
170 # Set common datatables params
171 my %dt_params = (
172     iDisplayLength   => 10,
173     iDisplayStart    => 0
174 );
175 my $search_results;
176
177 C4::Context->_new_userenv ('DUMMY_SESSION_ID');
178 C4::Context::set_userenv($john_doe{borrowernumber}, $john_doe{userid}, 'usercnum', 'First name', 'Surname', 'MYLIBRARY', 'My Library', 0);
179
180 # Search private lists by title
181 $search_results = C4::Utils::DataTables::VirtualShelves::search({
182     shelfname => "ist",
183     dt_params => \%dt_params,
184     type => 1,
185 });
186
187 is( $search_results->{ iTotalRecords }, 2,
188     "There should be 2 private shelves in total" );
189
190 is( $search_results->{ iTotalDisplayRecords }, 2,
191     "There should be 2 private shelves with title like '%ist%" );
192
193 is( @{ $search_results->{ shelves } }, 2,
194     "There should be 2 private shelves returned" );
195
196 # Search by type only
197 $search_results = C4::Utils::DataTables::VirtualShelves::search({
198     dt_params => \%dt_params,
199     type => 2,
200 });
201 is( $search_results->{ iTotalRecords }, 12,
202     "There should be 12 public shelves in total" );
203
204 is( $search_results->{ iTotalDisplayRecords }, 12,
205     "There should be 12 private shelves" );
206
207 is( @{ $search_results->{ shelves } }, 10,
208     "There should be 10 public shelves returned" );
209
210 # Search by owner
211 $search_results = C4::Utils::DataTables::VirtualShelves::search({
212     owner => "jane",
213     dt_params => \%dt_params,
214     type => 2,
215 });
216 is( $search_results->{ iTotalRecords }, 12,
217     "There should be 12 public shelves in total" );
218
219 is( $search_results->{ iTotalDisplayRecords }, 2,
220     "There should be 1 public shelves for jane" );
221
222 is( @{ $search_results->{ shelves } }, 2,
223     "There should be 1 public shelf returned" );
224
225 # Search by owner and shelf name
226 $search_results = C4::Utils::DataTables::VirtualShelves::search({
227     owner => "smith",
228     shelfname => "public list 1",
229     dt_params => \%dt_params,
230     type => 2,
231 });
232 is( $search_results->{ iTotalRecords }, 12,
233     "There should be 12 public shelves in total" );
234
235 is( $search_results->{ iTotalDisplayRecords }, 6,
236     "There should be 6 public shelves for john with name like %public list 1%" );
237
238 is( @{ $search_results->{ shelves } }, 6,
239     "There should be 6 public chalves returned" );
240
241 sub _add_biblio {
242     my ( $title ) = @_;
243     my $biblio = MARC::Record->new();
244     $biblio->append_fields(
245         MARC::Field->new('245', ' ', ' ', a => $title),
246     );
247     my ($biblionumber, $biblioitemnumber) = AddBiblio($biblio, '');
248     return $biblionumber;
249 }
250
251 1;