|
Lines 18-23
Link Here
|
| 18 |
use Modern::Perl; |
18 |
use Modern::Perl; |
| 19 |
|
19 |
|
| 20 |
use Test::More tests => 7; |
20 |
use Test::More tests => 7; |
|
|
21 |
use Test::MockModule; |
| 21 |
use Test::Mojo; |
22 |
use Test::Mojo; |
| 22 |
use Test::Warn; |
23 |
use Test::Warn; |
| 23 |
|
24 |
|
|
Lines 26-31
use t::lib::Mocks;
Link Here
|
| 26 |
|
27 |
|
| 27 |
use C4::Auth; |
28 |
use C4::Auth; |
| 28 |
use Koha::Database; |
29 |
use Koha::Database; |
|
|
30 |
use Koha::Exceptions::Patron; |
| 31 |
use Koha::Exceptions::Patron::Attribute; |
| 32 |
use Koha::Patron::Attributes; |
| 29 |
use Koha::Patron::Debarments qw/AddDebarment/; |
33 |
use Koha::Patron::Debarments qw/AddDebarment/; |
| 30 |
|
34 |
|
| 31 |
my $schema = Koha::Database->new->schema; |
35 |
my $schema = Koha::Database->new->schema; |
|
Lines 127-136
subtest 'add() tests' => sub {
Link Here
|
| 127 |
$schema->storage->txn_rollback; |
131 |
$schema->storage->txn_rollback; |
| 128 |
|
132 |
|
| 129 |
subtest 'librarian access tests' => sub { |
133 |
subtest 'librarian access tests' => sub { |
| 130 |
plan tests => 21; |
134 |
plan tests => 22; |
| 131 |
|
135 |
|
| 132 |
$schema->storage->txn_begin; |
136 |
$schema->storage->txn_begin; |
| 133 |
|
137 |
|
|
|
138 |
my $extended_attrs_exception; |
| 139 |
my $type = 'hey'; |
| 140 |
my $code = 'ho'; |
| 141 |
my $attr = "Let's go"; |
| 142 |
|
| 143 |
# Mock early, so existing mandatory attributes don't break all the tests |
| 144 |
my $mocked_patron = Test::MockModule->new('Koha::Patron'); |
| 145 |
$mocked_patron->mock( |
| 146 |
'extended_attributes', |
| 147 |
sub { |
| 148 |
|
| 149 |
if ($extended_attrs_exception) { |
| 150 |
if ( $extended_attrs_exception eq 'Koha::Exceptions::Patron::Attribute::NonRepeatable' |
| 151 |
or $extended_attrs_exception eq 'Koha::Exceptions::Patron::Attribute::UniqueIDConstraint' |
| 152 |
) |
| 153 |
{ |
| 154 |
$extended_attrs_exception->throw( |
| 155 |
attribute => Koha::Patron::Attribute->new( |
| 156 |
{ code => $code, attribute => $attr } |
| 157 |
) |
| 158 |
); |
| 159 |
} |
| 160 |
else { |
| 161 |
$extended_attrs_exception->throw( type => $type ); |
| 162 |
} |
| 163 |
} |
| 164 |
return []; |
| 165 |
} |
| 166 |
); |
| 167 |
|
| 134 |
my $patron = $builder->build_object({ class => 'Koha::Patrons' }); |
168 |
my $patron = $builder->build_object({ class => 'Koha::Patrons' }); |
| 135 |
my $newpatron = $patron->to_api; |
169 |
my $newpatron = $patron->to_api; |
| 136 |
# delete RO attributes |
170 |
# delete RO attributes |
|
Lines 210-215
subtest 'add() tests' => sub {
Link Here
|
| 210 |
->json_like( '/conflict' => qr/(borrowers\.)?cardnumber/ ); } |
244 |
->json_like( '/conflict' => qr/(borrowers\.)?cardnumber/ ); } |
| 211 |
qr/DBD::mysql::st execute failed: Duplicate entry '(.*?)' for key '(borrowers\.)?cardnumber'/; |
245 |
qr/DBD::mysql::st execute failed: Duplicate entry '(.*?)' for key '(borrowers\.)?cardnumber'/; |
| 212 |
|
246 |
|
|
|
247 |
subtest 'extended_attributes handling tests' => sub { |
| 248 |
|
| 249 |
plan tests => 19; |
| 250 |
|
| 251 |
my $patrons_count = Koha::Patrons->search->count; |
| 252 |
|
| 253 |
$extended_attrs_exception = 'Koha::Exceptions::Patron::MissingMandatoryExtendedAttribute'; |
| 254 |
$t->post_ok( |
| 255 |
"//$userid:$password@/api/v1/patrons" => json => { |
| 256 |
"firstname" => "Katrina", |
| 257 |
"surname" => "Fischer", |
| 258 |
"address" => "Somewhere", |
| 259 |
"category_id" => "ST", |
| 260 |
"city" => "Konstanz", |
| 261 |
"library_id" => "MPL" |
| 262 |
} |
| 263 |
)->status_is(400) |
| 264 |
->json_is( '/error' => |
| 265 |
"Missing mandatory extended attribute (type=$type)" ); |
| 266 |
|
| 267 |
is( Koha::Patrons->search->count, $patrons_count, 'No patron added' ); |
| 268 |
|
| 269 |
$extended_attrs_exception = 'Koha::Exceptions::Patron::Attribute::InvalidType'; |
| 270 |
$t->post_ok( |
| 271 |
"//$userid:$password@/api/v1/patrons" => json => { |
| 272 |
"firstname" => "Katrina", |
| 273 |
"surname" => "Fischer", |
| 274 |
"address" => "Somewhere", |
| 275 |
"category_id" => "ST", |
| 276 |
"city" => "Konstanz", |
| 277 |
"library_id" => "MPL" |
| 278 |
} |
| 279 |
)->status_is(400) |
| 280 |
->json_is( '/error' => |
| 281 |
"Tried to use an invalid attribute type. type=$type" ); |
| 282 |
|
| 283 |
is( Koha::Patrons->search->count, $patrons_count, 'No patron added' ); |
| 284 |
|
| 285 |
$extended_attrs_exception = 'Koha::Exceptions::Patron::Attribute::NonRepeatable'; |
| 286 |
$t->post_ok( |
| 287 |
"//$userid:$password@/api/v1/patrons" => json => { |
| 288 |
"firstname" => "Katrina", |
| 289 |
"surname" => "Fischer", |
| 290 |
"address" => "Somewhere", |
| 291 |
"category_id" => "ST", |
| 292 |
"city" => "Konstanz", |
| 293 |
"library_id" => "MPL" |
| 294 |
} |
| 295 |
)->status_is(400) |
| 296 |
->json_is( '/error' => |
| 297 |
"Tried to add more than one non-repeatable attributes. type=$code value=$attr" ); |
| 298 |
|
| 299 |
is( Koha::Patrons->search->count, $patrons_count, 'No patron added' ); |
| 300 |
|
| 301 |
$extended_attrs_exception = 'Koha::Exceptions::Patron::Attribute::UniqueIDConstraint'; |
| 302 |
$t->post_ok( |
| 303 |
"//$userid:$password@/api/v1/patrons" => json => { |
| 304 |
"firstname" => "Katrina", |
| 305 |
"surname" => "Fischer", |
| 306 |
"address" => "Somewhere", |
| 307 |
"category_id" => "ST", |
| 308 |
"city" => "Konstanz", |
| 309 |
"library_id" => "MPL" |
| 310 |
} |
| 311 |
)->status_is(400) |
| 312 |
->json_is( '/error' => |
| 313 |
"Your action breaks a unique constraint on the attribute. type=$code value=$attr" ); |
| 314 |
|
| 315 |
is( Koha::Patrons->search->count, $patrons_count, 'No patron added' ); |
| 316 |
|
| 317 |
$mocked_patron->unmock('extended_attributes'); |
| 318 |
# Temporarily get rid of mandatory attribute types |
| 319 |
Koha::Patron::Attribute::Types->search({ mandatory => 1 })->delete; |
| 320 |
# Create a couple attribute attribute types |
| 321 |
my $repeatable_1 = $builder->build_object( |
| 322 |
{ |
| 323 |
class => 'Koha::Patron::Attribute::Types', |
| 324 |
value => { |
| 325 |
mandatory => 0, |
| 326 |
repeatable => 1, |
| 327 |
unique => 0, |
| 328 |
category_code => 'ST' |
| 329 |
} |
| 330 |
} |
| 331 |
); |
| 332 |
my $repeatable_2 = $builder->build_object( |
| 333 |
{ |
| 334 |
class => 'Koha::Patron::Attribute::Types', |
| 335 |
value => { |
| 336 |
mandatory => 0, |
| 337 |
repeatable => 1, |
| 338 |
unique => 0, |
| 339 |
category_code => 'ST' |
| 340 |
} |
| 341 |
} |
| 342 |
); |
| 343 |
|
| 344 |
my $patron_id = $t->post_ok( |
| 345 |
"//$userid:$password@/api/v1/patrons" => json => { |
| 346 |
"firstname" => "Katrina", |
| 347 |
"surname" => "Fischer", |
| 348 |
"address" => "Somewhere", |
| 349 |
"category_id" => "ST", |
| 350 |
"city" => "Konstanz", |
| 351 |
"library_id" => "MPL", |
| 352 |
"extended_attributes" => [ |
| 353 |
{ type => $repeatable_1->code, value => 'a' }, |
| 354 |
{ type => $repeatable_1->code, value => 'b' }, |
| 355 |
{ type => $repeatable_1->code, value => 'c' }, |
| 356 |
{ type => $repeatable_2->code, value => 'd' }, |
| 357 |
{ type => $repeatable_2->code, value => 'e' } |
| 358 |
] |
| 359 |
} |
| 360 |
)->status_is(201, 'Patron added')->tx->res->json->{patron_id}; |
| 361 |
my $extended_attributes = join( ' ', sort map {$_->attribute} Koha::Patrons->find($patron_id)->extended_attributes->as_list); |
| 362 |
is( $extended_attributes, 'a b c d e', 'Extended attributes are stored correctly'); |
| 363 |
}; |
| 364 |
|
| 213 |
$schema->storage->txn_rollback; |
365 |
$schema->storage->txn_rollback; |
| 214 |
}; |
366 |
}; |
| 215 |
}; |
367 |
}; |
| 216 |
- |
|
|