3 # This file is part of Koha.
5 # Copyright 2014 - Biblibre SARL
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.
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.
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>.
22 use Test::More tests => 41;
27 use_ok('t::lib::TestBuilder');
30 my $schema = Koha::Database->new->schema;
31 $schema->storage->txn_begin;
33 my $builder = t::lib::TestBuilder->new();
35 is( $builder->build(), undef, 'build without arguments returns undef' );
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 $@;
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)
48 my $my_overduerules_transport_type = {
49 message_transport_type => {
50 message_transport_type => 'my msg_t_t',
53 branchcode => 'codeB',
54 categorycode => 'codeC',
56 categorycode => undef,
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,
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'
69 $overduerules_transport_type->{branchcode},
70 $my_overduerules_transport_type->{branchcode}->{branchcode},
71 'build stores the branchcode correctly'
74 $overduerules_transport_type->{categorycode},
75 $my_overduerules_transport_type->{categorycode}->{categorycode},
76 'build stores the categorycode correctly'
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'
84 $overduerules_transport_type->{_fk}->{branchcode}->{branchcode},
85 $my_overduerules_transport_type->{branchcode}->{branchcode},
86 'build stores the foreign key branchcode correctly'
89 $overduerules_transport_type->{_fk}->{categorycode}->{categorycode},
90 $my_overduerules_transport_type->{categorycode}->{categorycode},
91 'build stores the foreign key categorycode correctly'
94 $overduerules_transport_type->{_fk}->{branchcode},
95 $overduerules_transport_type->{_fk}->{categorycode},
96 'build links the branchcode and the categorycode correctly'
99 $overduerules_transport_type->{_fk}->{overduerules_id}->{letter2},
101 'build generates values if they are not given'
104 my $my_user_permission = $t::lib::TestBuilder::default_value->{UserPermission};
105 my $user_permission = $builder->build({
106 source => 'UserPermission',
109 $user_permission->{borrowernumber},
111 'build generates a borrowernumber correctly'
114 $user_permission->{module_bit},
115 $my_user_permission->{module_bit}->{module_bit}->{bit},
116 'build stores the default value correctly'
119 $user_permission->{code},
120 $my_user_permission->{module_bit}->{code},
121 'build stores the default value correctly'
124 $user_permission->{borrowernumber},
125 $user_permission->{_fk}->{borrowernumber}->{borrowernumber},
126 'build links the foreign key correctly'
129 $user_permission->{_fk}->{borrowernumber}->{surname},
130 $my_user_permission->{borrowernumber}->{surname},
131 'build stores the foreign key value correctly'
134 $user_permission->{_fk}->{borrowernumber}->{address},
135 $my_user_permission->{borrowernumber}->{address},
136 'build stores the foreign key value correctly'
139 $user_permission->{_fk}->{borrowernumber}->{city},
140 $my_user_permission->{borrowernumber}->{city},
141 'build stores the foreign key value correctly'
144 $user_permission->{_fk}->{borrowernumber}->{_fk}->{branchcode}->{branchcode},
145 $my_user_permission->{borrowernumber}->{branchcode}->{branchcode},
146 'build stores the foreign key value correctly'
149 $user_permission->{_fk}->{borrowernumber}->{_fk}->{branchcode}->{branchname},
150 $my_user_permission->{borrowernumber}->{branchcode}->{branchname},
151 'build stores the foreign key value correctly'
154 $user_permission->{_fk}->{borrowernumber}->{_fk}->{categorycode}->{categorycode},
155 $my_user_permission->{borrowernumber}->{categorycode}->{categorycode},
156 'build stores the foreign key value correctly'
159 $user_permission->{_fk}->{borrowernumber}->{_fk}->{categorycode}->{hidelostitems},
160 $my_user_permission->{borrowernumber}->{categorycode}->{hidelostitems},
161 'build stores the foreign key value correctly'
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'
169 $user_permission->{_fk}->{borrowernumber}->{_fk}->{categorycode}->{defaultprivacy},
170 $my_user_permission->{borrowernumber}->{categorycode}->{defaultprivacy},
171 'build stores the foreign key value correctly'
174 $user_permission->{_fk}->{borrowernumber}->{privacy},
175 $my_user_permission->{borrowernumber}->{privacy},
176 'build stores the foreign key value correctly'
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'
184 $user_permission->{_fk}->{module_bit}->{code},
185 $my_user_permission->{module_bit}->{code},
186 'build stores the foreign key value correctly'
189 $user_permission->{_fk}->{module_bit},
190 $user_permission->{_fk}->{code},
191 'build links the codes correctly'
194 $user_permission->{_fk}->{borrowernumber}->{cardnumber},
196 'build generates values if they are not given'
199 $user_permission->{_fk}->{borrowernumber}->{_fk}->{branchcode}->{branchaddress1},
201 'build generates values if they are not given'
204 $user_permission->{_fk}->{borrowernumber}->{_fk}->{categorycode}->{description},
206 'build generates values if they are not given'
209 $user_permission->{_fk}->{module_bit}->{description},
211 'build generates values if they are not given'
214 $user_permission->{_fk}->{module_bit}->{_fk}->{module_bit}->{flag},
216 'build generates values if they are not given'
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' );
227 my $rs_aqbookseller = $builder->schema->resultset('Aqbookseller');
228 my $bookseller = $builder->build({
229 source => 'Aqbookseller',
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' );
238 $bookseller = $builder->build({
239 source => 'Aqbookseller',
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' );
246 $bookseller = $builder->build({
247 source => 'Aqbookseller',
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' );
254 subtest 'Auto-increment values tests' => sub {
258 # Pick a table with AI PK
259 my $source = 'Biblio'; # table
260 my $column = 'biblionumber'; # ai column
262 my $col_info = $schema->source( $source )->column_info( $column );
263 is( $col_info->{is_auto_increment}, 1, "biblio.biblionumber is detected as autoincrement");
266 my $biblio_1 = $builder->build({ source => $source });
268 my $ai_value = $biblio_1->{ biblionumber };
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");
277 $schema->storage->txn_rollback;