f7f522738a478edbacb8cd682d08d86a50bc97db
[koha.git] / t / db_dependent / AdditionalField.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4 use Test::More tests => 34;
5
6 use C4::Context;
7 use Koha::AdditionalField;
8
9 my $dbh = C4::Context->dbh;
10 $dbh->{AutoCommit} = 0;
11 $dbh->{RaiseError} = 1;
12
13 $dbh->do( q|DELETE FROM additional_fields| );
14 $dbh->do( q|DELETE FROM additional_field_values| );
15
16 my $afs = Koha::AdditionalField->all;
17 is( scalar( @$afs ), 0, "all: there is no additional field" );
18
19 my $af1_name = q|af1|;
20 my $af1 = Koha::AdditionalField->new({
21     tablename => 'subscription',
22     name => $af1_name,
23     authorised_values_category => '',
24     marcfield => '',
25     searchable => 1,
26 });
27 is ( $af1->name, $af1_name, "new: name value is kept" );
28
29 $af1->insert;
30 like ( $af1->id, qr|^\d+$|, "new: populate id value" );
31
32 my $af2_name = q|af2|;
33 my $af2_marcfield = q|200$a|;
34 my $af2_searchable = 1;
35 my $af2_tablename = q|subscription|;
36 my $af2_avc = q|LOST|;
37 my $af2 = Koha::AdditionalField->new({
38     tablename => $af2_tablename,
39     name => $af2_name,
40     authorised_value_category => $af2_avc,
41     marcfield => $af2_marcfield,
42     searchable => $af2_searchable,
43 });
44 $af2->insert;
45 my $af2_id = $af2->id;
46 $af2 = Koha::AdditionalField->new({ id => $af2_id })->fetch;
47 is( ref($af2) , q|Koha::AdditionalField|, "fetch: return an object" );
48 is( $af2->id, $af2_id, "fetch: id for af2" );
49 is( $af2->tablename, $af2_tablename, "fetch: tablename for af2" );
50 is( $af2->name, $af2_name, "fetch: name for af2" );
51 is( $af2->authorised_value_category, $af2_avc, "fetch: authorised_value_category for af2" );
52 is( $af2->marcfield, $af2_marcfield, "fetch: marcfield for af2" );
53 is( $af2->searchable, $af2_searchable, "fetch: searchable for af2" );
54
55 my $af3 = Koha::AdditionalField->new({
56     tablename => 'a_table',
57     name => q|af3|,
58     authorised_value_category => '',
59     marcfield => '',
60     searchable => 1,
61 });
62 $af3->insert;
63
64 my $af_common = Koha::AdditionalField->new({
65     tablename => 'subscription',
66     name => q|common|,
67     authorised_value_category => '',
68     marcfield => '',
69     searchable => 1,
70 });
71 $af_common->insert;
72
73 # update
74 $af3->{tablename} = q|another_table|;
75 $af3->{name} = q|af3_mod|;
76 $af3->{authorised_value_category} = q|LOST|;
77 $af3->{marcfield} = q|200$a|;
78 $af3->{searchable} = 0;
79 my $updated = $af3->update;
80 $af3 = Koha::AdditionalField->new({ id => $af3->id })->fetch;
81 is( $updated, 1, "update: return number of affected rows" );
82 is( $af3->tablename, q|a_table|, "update: tablename is *not* updated, there is no sense to copy a field to another table" );
83 is( $af3->name, q|af3_mod|, "update: name" );
84 is( $af3->authorised_value_category, q|LOST|, "update: authorised_value_category" );
85 is( $af3->marcfield, q|200$a|, "update: marcfield" );
86 is( $af3->searchable, q|0|, "update: searchable" );
87
88 # fetch all
89 $afs = Koha::AdditionalField->all;
90 is( scalar( @$afs ), 4, "all: got 4 additional fields" );
91 $afs = Koha::AdditionalField->all({tablename => 'subscription'});
92 is( scalar( @$afs ), 3, "all: got 3 additional fields for the subscription table" );
93 $afs = Koha::AdditionalField->all({searchable => 1});
94 is( scalar( @$afs ), 3, "all: got 3 searchable additional fields" );
95 $af3->delete;
96 $afs = Koha::AdditionalField->all;
97 is( scalar( @$afs ), 3, "all: got 3 additional fields after deleting one" );
98
99
100 # Testing additional field values
101
102 ## Creating 2 subscriptions
103 use C4::Acquisition;
104 use C4::Biblio;
105 use C4::Budgets;
106 use C4::Serials;
107
108 my $booksellerid = C4::Bookseller::AddBookseller(
109     {
110         name => "my vendor",
111         address1 => "bookseller's address",
112         phone => "0123456",
113         active => 1
114     }
115 );
116
117 my ($biblionumber, $biblioitemnumber) = AddBiblio(MARC::Record->new, '');
118 my $budgetid;
119 my $bpid = AddBudgetPeriod({
120     budget_period_startdate => '01-01-2015',
121     budget_period_enddate   => '12-31-2015',
122     budget_description      => "budget desc"
123 });
124
125 my $budget_id = AddBudget({
126     budget_code        => "ABCD",
127     budget_amount      => "123.132",
128     budget_name        => "Périodiques",
129     budget_notes       => "This is a note",
130     budget_description => "Serials",
131     budget_active      => 1,
132     budget_period_id   => $bpid
133 });
134
135 my $subscriptionid1 = NewSubscription(
136     undef,      "",     undef, undef, $budget_id, $biblionumber, '01-01-2013',undef,
137     undef,      undef,  undef, undef, undef,      undef,         undef,  undef,
138     undef,      undef,  undef, undef, undef,      undef,         undef,  undef,
139     undef,      undef,  undef, undef, undef,      undef,         undef,  1,
140     "notes",    undef,  undef, undef, undef,      undef,         undef,  0,
141     "intnotes", 0,      undef, undef, 0,          undef,         '31-12-2013',
142 );
143
144 my $subscriptionid2 = NewSubscription(
145     undef,      "",     undef, undef, $budget_id, $biblionumber, '01-01-2013',undef,
146     undef,      undef,  undef, undef, undef,      undef,         undef,  undef,
147     undef,      undef,  undef, undef, undef,      undef,         undef,  undef,
148     undef,      undef,  undef, undef, undef,      undef,         undef,  1,
149     "notes",    undef,  undef, undef, undef,      undef,         undef,  0,
150     "intnotes", 0,      undef, undef, 0,          undef,         '31-12-2013',
151 );
152
153 # insert
154 my $af1_values = {
155     $subscriptionid1 => "value_for_af1_$subscriptionid1",
156     $subscriptionid2 => "value_for_af1_$subscriptionid2",
157 };
158 $af1->{values} = $af1_values;
159 $af1->insert_values;
160
161 my $af2_values = {
162     $subscriptionid1 => "old_value_for_af2_$subscriptionid1",
163     $subscriptionid2 => "old_value_for_af2_$subscriptionid2",
164 };
165 $af2->{values} = $af2_values;
166 $af2->insert_values;
167 my $new_af2_values = {
168     $subscriptionid1 => "value_for_af2_$subscriptionid1",
169     $subscriptionid2 => "value_for_af2_$subscriptionid2",
170 };
171 $af2->{values} = $new_af2_values;
172 $af2->insert_values; # Insert should replace old values
173
174 my $common_values = {
175     $subscriptionid1 => 'common_value',
176     $subscriptionid2 => 'common_value',
177 };
178
179 $af_common->{values} = $common_values;
180 $af_common->insert_values;
181
182 # fetch_values
183 $af1 = Koha::AdditionalField->new({ id => $af1->id })->fetch;
184 $af2 = Koha::AdditionalField->new({ id => $af2->id })->fetch;
185
186 $af1->fetch_values;
187 is_deeply ( $af1->values, {$subscriptionid1 => qq|value_for_af1_$subscriptionid1|, $subscriptionid2 => qq|value_for_af1_$subscriptionid2| }, "fetch_values: without argument, returns 2 records" );
188 $af1->fetch_values({ record_id => $subscriptionid1 });
189 is_deeply ( $af1->values, {$subscriptionid1 => qq|value_for_af1_$subscriptionid1|}, "fetch_values: values for af1 and subscription1" );
190 $af2->fetch_values({ record_id => $subscriptionid2 });
191 is_deeply ( $af2->values, {$subscriptionid2 => qq|value_for_af2_$subscriptionid2|}, "fetch_values: values for af2 and subscription2" );
192
193 # fetch_all_values
194 eval{
195     $af1->fetch_all_values;
196 };
197 like ( $@, qr|^BAD CALL|, 'fetch_all_values: fail if called with a blessed object' );
198
199 my $fetched_values = Koha::AdditionalField->fetch_all_values({ tablename => 'subscription' });
200 my $expected_values = {
201     $subscriptionid1 => {
202         $af1_name => qq|value_for_af1_$subscriptionid1|,
203         $af2_name => qq|value_for_af2_$subscriptionid1|,
204         'common' => q|common_value|,
205     },
206     $subscriptionid2 => {
207         $af1_name => qq|value_for_af1_$subscriptionid2|,
208         $af2_name => qq|value_for_af2_$subscriptionid2|,
209         'common' => q|common_value|,
210     }
211 };
212 is_deeply ( $fetched_values, $expected_values, "fetch_all_values: values for table subscription" );
213
214 my $expected_values_1 = {
215     $subscriptionid1 => {
216         $af1_name => qq|value_for_af1_$subscriptionid1|,
217         $af2_name => qq|value_for_af2_$subscriptionid1|,
218         common => q|common_value|,
219     }
220 };
221 my $fetched_values_1 = Koha::AdditionalField->fetch_all_values({ tablename => 'subscription', record_id => $subscriptionid1 });
222 is_deeply ( $fetched_values_1, $expected_values_1, "fetch_all_values: values for subscription1" );
223
224 # get_matching_record_ids
225 eval{
226     $af1->get_matching_record_ids;
227 };
228 like ( $@, qr|^BAD CALL|, 'get_matching_record_ids: fail if called with a blessed object' );
229
230 my $matching_record_ids = Koha::AdditionalField->get_matching_record_ids;
231 is_deeply ( $matching_record_ids, [], "get_matching_record_ids: return [] if no argument given" );
232 $matching_record_ids = Koha::AdditionalField->get_matching_record_ids({ tablename => 'subscription' });
233 is_deeply ( $matching_record_ids, [], "get_matching_record_ids: return [] if no field given" );
234
235 my $fields = [
236     {
237         name => $af1_name,
238         value => qq|value_for_af1_$subscriptionid1|
239     }
240 ];
241 $matching_record_ids = Koha::AdditionalField->get_matching_record_ids({ tablename => 'subscription', fields => $fields });
242 is_deeply ( $matching_record_ids, [ $subscriptionid1 ], "get_matching_record_ids: field $af1_name: value_for_af1_$subscriptionid1 matches subscription1" );
243
244 $fields = [
245     {
246         name => $af1_name,
247         value => qq|value_for_af1_$subscriptionid1|
248     },
249     {
250         name => $af2_name,
251         value => qq|value_for_af2_$subscriptionid1|,
252     }
253 ];
254 $matching_record_ids = Koha::AdditionalField->get_matching_record_ids({ tablename => 'subscription', fields => $fields });
255 is_deeply ( $matching_record_ids, [ $subscriptionid1 ], "get_matching_record_ids: fields $af1_name:value_for_af1_$subscriptionid1 and $af2_name:value_for_af2_$subscriptionid1 match subscription1" );
256
257 $fields = [
258     {
259         name => 'common',
260         value => q|common_value|,
261     }
262 ];
263 $matching_record_ids = Koha::AdditionalField->get_matching_record_ids({ tablename => 'subscription', fields => $fields });
264 my $exists = grep /$subscriptionid1/, @$matching_record_ids;
265 is ( $exists, 1, "get_matching_record_ids: field common: common_value matches subscription1" );
266 $exists = grep /$subscriptionid2/, @$matching_record_ids;
267 is ( $exists, 1, "get_matching_record_ids: field common: common_value matches subscription2 too" );
268 $exists = grep /not_existent_id/, @$matching_record_ids;
269 is ( $exists, 0, "get_matching_record_ids: field common: common_value does not inexistent id" );
270
271 $dbh->rollback;