3 # This file is part of Koha.
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.
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.
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>.
20 use Test
::More tests
=> 6;
23 use t
::lib
::TestBuilder
;
25 use Digest
::MD5
qw( md5_base64 md5_hex );
30 use C4
::Members
::Attributes
qw( GetBorrowerAttributes );
34 use_ok
('Koha::Patron::Modification');
35 use_ok
('Koha::Patron::Modifications');
38 my $schema = Koha
::Database
->new->schema;
39 my $builder = t
::lib
::TestBuilder
->new;
41 subtest
'new() tests' => sub {
45 $schema->storage->txn_begin;
47 Koha
::Patron
::Modifications
->search->delete;
49 # Create new pending modification
50 Koha
::Patron
::Modification
->new(
51 { verification_token
=> '1234567890',
57 ## Get the new pending modification
58 my $borrower = Koha
::Patron
::Modifications
->find(
59 { verification_token
=> '1234567890' } );
61 ## Verify we get the same data
62 is
( $borrower->surname, 'Hall',
63 'Found modification has matching surname' );
66 Koha
::Patron
::Modification
->new(
67 { verification_token
=> '1234567890',
73 'Koha::Exceptions::Patron::Modification::DuplicateVerificationToken',
74 'Attempting to add a duplicate verification raises the correct exception';
76 'Duplicate verification token 1234567890',
77 'Exception carries the right message'
80 $schema->storage->txn_rollback;
83 subtest
'store( extended_attributes ) tests' => sub {
87 $schema->storage->txn_begin;
89 Koha
::Patron
::Modifications
->search->delete;
92 = $builder->build( { source
=> 'Borrower' } )->{borrowernumber
};
93 my $verification_token = md5_hex
( time().{}.rand().{}.$$ );
94 my $valid_json_text = '[{"code":"CODE","value":"VALUE"}]';
95 my $invalid_json_text = '[{"code":"CODE";"value":"VALUE"}]';
97 Koha
::Patron
::Modification
->new(
98 { verification_token
=> $verification_token,
99 borrowernumber
=> $patron,
101 extended_attributes
=> $valid_json_text
105 my $patron_modification
106 = Koha
::Patron
::Modifications
->search( { borrowernumber
=> $patron } )
109 is
( $patron_modification->surname,
110 'Hall', 'Patron modification correctly stored with valid JSON data' );
111 is
( $patron_modification->extended_attributes,
113 'Patron modification correctly stored with valid JSON data' );
115 $verification_token = md5_hex
( time().{}.rand().{}.$$ );
117 Koha
::Patron
::Modification
->new(
118 { verification_token
=> $verification_token,
119 borrowernumber
=> $patron,
121 extended_attributes
=> $invalid_json_text
125 'Koha::Exceptions::Patron::Modification::InvalidData',
126 'Trying to store invalid JSON in extended_attributes field raises exception';
128 is
( $@
, 'The passed extended_attributes is not valid JSON' );
130 $schema->storage->txn_rollback;
133 subtest
'approve tests' => sub {
137 $schema->storage->txn_begin;
139 Koha
::Patron
::Modifications
->search->delete;
141 my $patron_hashref = $builder->build( { source
=> 'Borrower' } );
143 { source
=> 'BorrowerAttributeType', value
=> { code
=> 'CODE_1' } }
146 { source
=> 'BorrowerAttributeType', value
=> { code
=> 'CODE_2' } }
148 my $verification_token = md5_hex
( time().{}.rand().{}.$$ );
150 = '[{"code":"CODE_1","value":"VALUE_1"},{"code":"CODE_2","value":"VALUE_2"}]';
151 my $patron_modification = Koha
::Patron
::Modification
->new(
152 { borrowernumber
=> $patron_hashref->{borrowernumber
},
154 verification_token
=> $verification_token,
155 extended_attributes
=> $valid_json_text
159 ok
( $patron_modification->approve,
160 'Patron modification correctly approved' );
161 my $patron = Koha
::Patrons
->find( $patron_hashref->{borrowernumber
} );
164 $patron_hashref->{firstname
},
165 'Patron modification changed firstname'
167 is
( $patron->firstname, 'Kyle',
168 'Patron modification set the right firstname' );
169 my @patron_attributes = GetBorrowerAttributes
( $patron->borrowernumber );
170 is
( $patron_attributes[0][0]->{code
},
171 'CODE_1', 'Patron modification correctly saved attribute code' );
172 is
( $patron_attributes[0][0]->{value
},
173 'VALUE_1', 'Patron modification correctly saved attribute value' );
175 # Create a new Koha::Patron::Modification, skip extended_attributes to
177 $patron_modification = Koha
::Patron
::Modification
->new(
178 { borrowernumber
=> $patron_hashref->{borrowernumber
},
179 firstname
=> 'Kylie',
180 verification_token
=> $verification_token
184 # Add invalid JSON to extended attributes
185 $patron_modification->extended_attributes(
186 '[{"code":"CODE";"values:VALUES"}]');
187 throws_ok
{ $patron_modification->approve }
188 'Koha::Exceptions::Patron::Modification::InvalidData',
189 'The right exception is thrown if invalid data is on extended_attributes';
191 $patron = Koha
::Patrons
->find( $patron_hashref->{borrowernumber
} );
192 isnt
( $patron->firstname, 'Kylie', 'Patron modification didn\'t apply' );
194 $schema->storage->txn_rollback;
197 subtest
'pending_count() and pending() tests' => sub {
201 $schema->storage->txn_begin;
203 Koha
::Patron
::Modifications
->search->delete;
204 my $library_1 = $builder->build( { source
=> 'Branch' } )->{branchcode
};
205 my $library_2 = $builder->build( { source
=> 'Branch' } )->{branchcode
};
208 { source
=> 'Borrower', value
=> { branchcode
=> $library_1 } } )
212 { source
=> 'Borrower', value
=> { branchcode
=> $library_2 } } )
216 { source
=> 'Borrower', value
=> { branchcode
=> $library_2 } } )
218 my $verification_token_1 = md5_hex
( time().{}.rand().{}.$$ );
219 my $verification_token_2 = md5_hex
( time().{}.rand().{}.$$ );
220 my $verification_token_3 = md5_hex
( time().{}.rand().{}.$$ );
223 my $modification_1 = Koha
::Patron
::Modification
->new(
224 { borrowernumber
=> $patron_1,
227 verification_token
=> $verification_token_1
231 is
( Koha
::Patron
::Modifications
->pending_count,
232 1, 'pending_count() correctly returns 1' );
234 my $modification_2 = Koha
::Patron
::Modification
->new(
235 { borrowernumber
=> $patron_2,
237 firstname
=> 'Sandy',
238 verification_token
=> $verification_token_2
242 my $modification_3 = Koha
::Patron
::Modification
->new(
243 { borrowernumber
=> $patron_3,
245 firstname
=> 'Sandy',
246 verification_token
=> $verification_token_3
250 is
( Koha
::Patron
::Modifications
->pending_count,
251 3, 'pending_count() correctly returns 3' );
253 is
( Koha
::Patron
::Modifications
->pending_count($library_1),
254 1, 'pending_count() correctly returns 1 if filtered by library' );
256 is
( Koha
::Patron
::Modifications
->pending_count($library_2),
257 2, 'pending_count() correctly returns 2 if filtered by library' );
259 $modification_1->approve;
261 is
( Koha
::Patron
::Modifications
->pending_count,
262 2, 'pending_count() correctly returns 2' );
264 $modification_2->approve;
266 is
( Koha
::Patron
::Modifications
->pending_count,
267 1, 'pending_count() correctly returns 1' );
269 $modification_3->approve;
271 is
( Koha
::Patron
::Modifications
->pending_count,
272 0, 'pending_count() correctly returns 0' );
274 $schema->storage->txn_rollback;