Bug 12803 - Add ability to skip closed libraries when generating the holds queue
[koha.git] / t / db_dependent / TestBuilder.t
1 #!/usr/bin/perl
2
3 # This file is part of Koha.
4 #
5 # Copyright 2014 - Biblibre SARL
6 #
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20 use Modern::Perl;
21
22 use Test::More tests => 41;
23
24 use Koha::Database;
25
26 BEGIN {
27     use_ok('t::lib::TestBuilder');
28 }
29
30 my $schema  = Koha::Database->new->schema;
31 $schema->storage->txn_begin;
32
33 my $builder = t::lib::TestBuilder->new();
34
35 is( $builder->build(), undef, 'build without arguments returns undef' );
36
37 my @sources    = $builder->schema->sources;
38 my @source_in_failure;
39 for my $source (@sources) {
40     eval { $builder->build( { source => $source } ); };
41     push @source_in_failure, $source if $@;
42 }
43 is( @source_in_failure, 0, 'TestBuilder should be able to create an object for every sources' );
44 if ( @source_in_failure ) {
45     diag ("The following sources have not been generated correctly: " . join ', ', @source_in_failure)
46 }
47
48 my $my_overduerules_transport_type = {
49     message_transport_type => {
50         message_transport_type => 'my msg_t_t',
51     },
52     overduerules_id => {
53         branchcode   => 'codeB',
54         categorycode => 'codeC',
55     },
56     categorycode => undef,
57 };
58 $my_overduerules_transport_type->{categorycode} = $my_overduerules_transport_type->{branchcode};
59 my $overduerules_transport_type = $builder->build({
60     source => 'OverduerulesTransportType',
61     value  => $my_overduerules_transport_type,
62 });
63 is(
64     $overduerules_transport_type->{message_transport_type},
65     $my_overduerules_transport_type->{message_transport_type}->{message_transport_type},
66     'build stores the message_transport_type correctly'
67 );
68 is(
69     $overduerules_transport_type->{branchcode},
70     $my_overduerules_transport_type->{branchcode}->{branchcode},
71     'build stores the branchcode correctly'
72 );
73 is(
74     $overduerules_transport_type->{categorycode},
75     $my_overduerules_transport_type->{categorycode}->{categorycode},
76     'build stores the categorycode correctly'
77 );
78 is(
79     $overduerules_transport_type->{_fk}->{message_transport_type}->{message_transport_type},
80     $my_overduerules_transport_type->{message_transport_type}->{message_transport_type},
81     'build stores the foreign key message_transport_type correctly'
82 );
83 is(
84     $overduerules_transport_type->{_fk}->{branchcode}->{branchcode},
85     $my_overduerules_transport_type->{branchcode}->{branchcode},
86     'build stores the foreign key branchcode correctly'
87 );
88 is(
89     $overduerules_transport_type->{_fk}->{categorycode}->{categorycode},
90     $my_overduerules_transport_type->{categorycode}->{categorycode},
91     'build stores the foreign key categorycode correctly'
92 );
93 is_deeply(
94     $overduerules_transport_type->{_fk}->{branchcode},
95     $overduerules_transport_type->{_fk}->{categorycode},
96     'build links the branchcode and the categorycode correctly'
97 );
98 isnt(
99     $overduerules_transport_type->{_fk}->{overduerules_id}->{letter2},
100     undef,
101     'build generates values if they are not given'
102 );
103
104 my $my_user_permission = $t::lib::TestBuilder::default_value->{UserPermission};
105 my $user_permission = $builder->build({
106     source => 'UserPermission',
107 });
108 isnt(
109     $user_permission->{borrowernumber},
110     undef,
111     'build generates a borrowernumber correctly'
112 );
113 is(
114     $user_permission->{module_bit},
115     $my_user_permission->{module_bit}->{module_bit}->{bit},
116     'build stores the default value correctly'
117 );
118 is(
119     $user_permission->{code},
120     $my_user_permission->{module_bit}->{code},
121     'build stores the default value correctly'
122 );
123 is(
124     $user_permission->{borrowernumber},
125     $user_permission->{_fk}->{borrowernumber}->{borrowernumber},
126     'build links the foreign key correctly'
127 );
128 is(
129     $user_permission->{_fk}->{borrowernumber}->{surname},
130     $my_user_permission->{borrowernumber}->{surname},
131     'build stores the foreign key value correctly'
132 );
133 is(
134     $user_permission->{_fk}->{borrowernumber}->{address},
135     $my_user_permission->{borrowernumber}->{address},
136     'build stores the foreign key value correctly'
137 );
138 is(
139     $user_permission->{_fk}->{borrowernumber}->{city},
140     $my_user_permission->{borrowernumber}->{city},
141     'build stores the foreign key value correctly'
142 );
143 is(
144     $user_permission->{_fk}->{borrowernumber}->{_fk}->{branchcode}->{branchcode},
145     $my_user_permission->{borrowernumber}->{branchcode}->{branchcode},
146     'build stores the foreign key value correctly'
147 );
148 is(
149     $user_permission->{_fk}->{borrowernumber}->{_fk}->{branchcode}->{branchname},
150     $my_user_permission->{borrowernumber}->{branchcode}->{branchname},
151     'build stores the foreign key value correctly'
152 );
153 is(
154     $user_permission->{_fk}->{borrowernumber}->{_fk}->{categorycode}->{categorycode},
155     $my_user_permission->{borrowernumber}->{categorycode}->{categorycode},
156     'build stores the foreign key value correctly'
157 );
158 is(
159     $user_permission->{_fk}->{borrowernumber}->{_fk}->{categorycode}->{hidelostitems},
160     $my_user_permission->{borrowernumber}->{categorycode}->{hidelostitems},
161     'build stores the foreign key value correctly'
162 );
163 is(
164     $user_permission->{_fk}->{borrowernumber}->{_fk}->{categorycode}->{category_type},
165     $my_user_permission->{borrowernumber}->{categorycode}->{category_type},
166     'build stores the foreign key value correctly'
167 );
168 is(
169     $user_permission->{_fk}->{borrowernumber}->{_fk}->{categorycode}->{defaultprivacy},
170     $my_user_permission->{borrowernumber}->{categorycode}->{defaultprivacy},
171     'build stores the foreign key value correctly'
172 );
173 is(
174     $user_permission->{_fk}->{borrowernumber}->{privacy},
175     $my_user_permission->{borrowernumber}->{privacy},
176     'build stores the foreign key value correctly'
177 );
178 is(
179     $user_permission->{_fk}->{module_bit}->{_fk}->{module_bit}->{bit},
180     $my_user_permission->{module_bit}->{module_bit}->{bit},
181     'build stores the foreign key value correctly'
182 );
183 is(
184     $user_permission->{_fk}->{module_bit}->{code},
185     $my_user_permission->{module_bit}->{code},
186     'build stores the foreign key value correctly'
187 );
188 is_deeply(
189     $user_permission->{_fk}->{module_bit},
190     $user_permission->{_fk}->{code},
191     'build links the codes correctly'
192 );
193 isnt(
194     $user_permission->{_fk}->{borrowernumber}->{cardnumber},
195     undef,
196     'build generates values if they are not given'
197 );
198 isnt(
199     $user_permission->{_fk}->{borrowernumber}->{_fk}->{branchcode}->{branchaddress1},
200     undef,
201     'build generates values if they are not given'
202 );
203 isnt(
204     $user_permission->{_fk}->{borrowernumber}->{_fk}->{categorycode}->{description},
205     undef,
206     'build generates values if they are not given'
207 );
208 isnt(
209     $user_permission->{_fk}->{module_bit}->{description},
210     undef,
211     'build generates values if they are not given'
212 );
213 isnt(
214     $user_permission->{_fk}->{module_bit}->{_fk}->{module_bit}->{flag},
215     undef,
216     'build generates values if they are not given'
217 );
218
219
220 my $nb_basket = $builder->schema->resultset('Aqbasket')->search();
221 isnt( $nb_basket, 0, 'add stores the generated entries correctly' );
222 $builder->clear( { source => 'Aqbasket' } );
223 $nb_basket = $builder->schema->resultset('Aqbasket')->search();
224 is( $nb_basket, 0, 'clear removes all the entries correctly' );
225
226
227 my $rs_aqbookseller = $builder->schema->resultset('Aqbookseller');
228 my $bookseller = $builder->build({
229     source  => 'Aqbookseller',
230     only_fk => 1,
231 });
232 delete $bookseller->{_fk};
233 my $bookseller_from_db = $rs_aqbookseller->find($bookseller);
234 is( $bookseller_from_db, undef, 'build with only_fk = 1 does not store the entry' );
235 my $bookseller_result = $rs_aqbookseller->create($bookseller);
236 is( $bookseller_result->in_storage, 1, 'build with only_fk = 1 creates the foreign keys correctly' );
237
238 $bookseller = $builder->build({
239     source  => 'Aqbookseller',
240 });
241 ok( length( $bookseller->{phone} ) <= 30, 'The length for a generated string should not be longer than the size of the DB field' );
242 delete $bookseller->{_fk};
243 $bookseller_from_db = $rs_aqbookseller->find($bookseller);
244 is( $bookseller_from_db->in_storage, 1, 'build without the parameter only_sk stores the entry correctly' );
245
246 $bookseller = $builder->build({
247     source  => 'Aqbookseller',
248     only_fk => 0,
249 });
250 delete $bookseller->{_fk};
251 $bookseller_from_db = $rs_aqbookseller->find($bookseller);
252 is( $bookseller_from_db->in_storage, 1, 'build with only_fk = 0 stores the entry correctly' );
253
254 subtest 'Auto-increment values tests' => sub {
255
256     plan tests => 2;
257
258     # Pick a table with AI PK
259     my $source  = 'Biblio'; # table
260     my $column  = 'biblionumber'; # ai column
261
262     my $col_info = $schema->source( $source )->column_info( $column );
263     is( $col_info->{is_auto_increment}, 1, "biblio.biblionumber is detected as autoincrement");
264
265     # Create a biblio
266     my $biblio_1 = $builder->build({ source => $source });
267     # Get the AI value
268     my $ai_value = $biblio_1->{ biblionumber };
269     # Create a biblio
270     my $biblio_2 = $builder->build({ source => $source });
271     # Get the next AI value
272     my $next_ai_value = $biblio_2->{ biblionumber };
273     is( $ai_value + 1, $next_ai_value, "AI values are consecutive");
274
275 };
276
277 $schema->storage->txn_rollback;
278
279 1;