|
Lines 18-25
Link Here
|
| 18 |
# along with Koha; if not, see <http://www.gnu.org/licenses>. |
18 |
# along with Koha; if not, see <http://www.gnu.org/licenses>. |
| 19 |
|
19 |
|
| 20 |
use Modern::Perl; |
20 |
use Modern::Perl; |
| 21 |
use Test::More tests => 160; |
21 |
use Test::More tests => 161; |
| 22 |
use Test::Warn; |
22 |
use Test::Warn; |
|
|
23 |
use Test::Exception; |
| 23 |
use Encode qw( encode_utf8 ); |
24 |
use Encode qw( encode_utf8 ); |
| 24 |
use utf8; |
25 |
use utf8; |
| 25 |
|
26 |
|
|
Lines 842-847
subtest 'test_format_dates' => sub {
Link Here
|
| 842 |
is($missing_criticals_2[2]->{lineraw}, $borrowerline, 'Got the expected third lineraw from check_branch_code with bad dates'); |
843 |
is($missing_criticals_2[2]->{lineraw}, $borrowerline, 'Got the expected third lineraw from check_branch_code with bad dates'); |
| 843 |
}; |
844 |
}; |
| 844 |
|
845 |
|
|
|
846 |
subtest 'patron_attributes' => sub { |
| 847 |
|
| 848 |
plan tests => 4; |
| 849 |
|
| 850 |
t::lib::Mocks::mock_preference('ExtendedPatronAttributes', 1); |
| 851 |
|
| 852 |
my $unique_attribute_type = $builder->build_object( |
| 853 |
{ |
| 854 |
class => 'Koha::Patron::Attribute::Types', |
| 855 |
value => { unique_id=> 1, repeatable => 0 } |
| 856 |
} |
| 857 |
); |
| 858 |
my $repeatable_attribute_type = $builder->build_object( |
| 859 |
{ |
| 860 |
class => 'Koha::Patron::Attribute::Types', |
| 861 |
value => { unique_id => 0, repeatable => 1 } |
| 862 |
} |
| 863 |
); |
| 864 |
my $normal_attribute_type = $builder->build_object( |
| 865 |
{ |
| 866 |
class => 'Koha::Patron::Attribute::Types', |
| 867 |
value => { unique_id => 0, repeatable => 0 } |
| 868 |
} |
| 869 |
); |
| 870 |
my $non_existent_attribute_type = $builder->build_object( |
| 871 |
{ |
| 872 |
class => 'Koha::Patron::Attribute::Types', |
| 873 |
} |
| 874 |
); |
| 875 |
my $non_existent_attribute_type_code = $non_existent_attribute_type->code; |
| 876 |
$non_existent_attribute_type->delete; |
| 877 |
|
| 878 |
# attributes is { code => \@attributes } |
| 879 |
sub build_csv { |
| 880 |
my ($attributes) = @_; |
| 881 |
|
| 882 |
my $csv_headers = 'cardnumber,surname,firstname,branchcode,categorycode,patron_attributes'; |
| 883 |
my @attributes_str = map { my $code = $_; map { sprintf "%s:%s", $code, $_ } @{ $attributes->{$code} } } keys %$attributes; |
| 884 |
my $attributes_str = join ',', @attributes_str; |
| 885 |
my $csv_line = sprintf '1042,John,D,MPL,PT,"%s"', $attributes_str; |
| 886 |
my $filename = make_csv( $temp_dir, $csv_headers, $csv_line ); |
| 887 |
open( my $fh, "<:encoding(utf8)", $filename ) or die "cannot open $filename: $!"; |
| 888 |
return $fh; |
| 889 |
} |
| 890 |
|
| 891 |
{ # Everything good, we create a patron with 3 attributes |
| 892 |
my $attributes = { |
| 893 |
$unique_attribute_type->code => ['my unique attribute 1'], |
| 894 |
$repeatable_attribute_type->code => [ 'my repeatable attribute 1', 'my repeatable attribute 2' ], |
| 895 |
$normal_attribute_type->code => ['my normal attribute 1'], |
| 896 |
}; |
| 897 |
my $fh = build_csv({ %$attributes }); |
| 898 |
my $result = $patrons_import->import_patrons({file => $fh}); |
| 899 |
|
| 900 |
is( $result->{imported}, 1 ); |
| 901 |
|
| 902 |
my $patron = Koha::Patrons->find({cardnumber => "1042"}); |
| 903 |
compare_patron_attributes($patron->extended_attributes->unblessed, { %$attributes } ); |
| 904 |
$patron->delete; |
| 905 |
} |
| 906 |
|
| 907 |
{ |
| 908 |
$builder->build_object( |
| 909 |
{ |
| 910 |
class => 'Koha::Patron::Attributes', |
| 911 |
value => { code => $unique_attribute_type->code, attribute => 'unique' } |
| 912 |
} |
| 913 |
); |
| 914 |
|
| 915 |
my $attributes = { |
| 916 |
$unique_attribute_type->code => ['unique'], |
| 917 |
$normal_attribute_type->code => ['my normal attribute 1'] |
| 918 |
}; |
| 919 |
my $fh = build_csv({ %$attributes }); |
| 920 |
|
| 921 |
throws_ok { |
| 922 |
$patrons_import->import_patrons({file => $fh}); |
| 923 |
} |
| 924 |
'Koha::Exceptions::Patron::Attribute::UniqueIDConstraint'; |
| 925 |
|
| 926 |
my $patron = Koha::Patrons->find({cardnumber => "1042"}); |
| 927 |
is( $patron, undef ); |
| 928 |
|
| 929 |
} |
| 930 |
|
| 931 |
}; |
| 932 |
|
| 933 |
# got is { code => $code, attribute => $attribute } |
| 934 |
# expected is { $code => \@attributes } |
| 935 |
sub compare_patron_attributes { |
| 936 |
my ( $got, $expected ) = @_; |
| 937 |
|
| 938 |
$got = [ map { { code => $_->{code}, attribute => $_->{attribute} } } @$got ]; |
| 939 |
$expected = [ |
| 940 |
map { |
| 941 |
my $code = $_; |
| 942 |
map { { code => $code, attribute => $_ } } @{ $expected->{$code} } |
| 943 |
} keys %$expected |
| 944 |
]; |
| 945 |
for my $v ( $got, $expected ) { |
| 946 |
$v = [ |
| 947 |
sort { |
| 948 |
$a->{code} cmp $b->{code} || $a->{attribute} cmp $b->{attribute} |
| 949 |
} @$v |
| 950 |
]; |
| 951 |
} |
| 952 |
is_deeply($got, $expected); |
| 953 |
} |
| 954 |
|
| 845 |
# ###### Test utility ########### |
955 |
# ###### Test utility ########### |
| 846 |
sub make_csv { |
956 |
sub make_csv { |
| 847 |
my ($temp_dir, @lines) = @_; |
957 |
my ($temp_dir, @lines) = @_; |
| 848 |
- |
|
|