3 use Test::More tests => 9;
6 use_ok("MARC::Record");
7 use_ok("Koha::SimpleMARC");
10 my $record = MARC::Record->new;
11 $record->leader('03174nam a2200445 a 4500');
15 a => 'Knuth, Donald Ervin',
20 a => 'The art of computer programming',
21 c => 'Donald E. Knuth.',
25 a => 'Computer programming.',
36 $record->append_fields(@fields);
41 subtest 'field_exists' => sub {
43 my $record = new_record;
45 field_exists( { record => $record, field => '650', subfield => 'a' } ),
50 field_exists( { record => $record, field => '650', subfield => 'b' } ),
52 '650$b does not exist'
55 $record->append_fields(
58 a => 'Computer algorithms.',
64 field_exists( { record => $record, field => '650', subfield => 'a' } ),
66 '650$a exists, field_exists returns the 2 field numbers'
71 subtest 'read_field' => sub {
73 subtest 'read subfield' => sub {
75 my $record = new_record;
76 $record->append_fields(
79 a => 'Computer algorithms.',
85 read_field( { record => $record, field => '650', subfield => 'a' } );
86 is_deeply( $fields_650a[0], 'Computer programming.', 'first 650$a' );
87 is_deeply( $fields_650a[1], 'Computer algorithms.', 'second 650$a' );
99 ['Computer programming.'],
113 ['Computer algorithms.'],
128 'There is no 3 650$a'
131 subtest 'read field' => sub {
133 my $record = new_record;
134 $record->append_fields(
137 a => 'Computer algorithms.',
150 [ 'Computer programming.', '462', 'Computer algorithms.', '463' ],
151 'Get the all subfield values for field 650'
163 [ 'Computer programming.', '462' ],
164 'Get the all subfield values for the first field 650'
169 { record => $record, field => '650', field_numbers => [2] }
172 [ 'Computer algorithms.', '463' ],
173 'Get the all subfield values for the second field 650'
178 { record => $record, field => '650', field_numbers => [3] }
182 'Get the all subfield values for the third field 650 which does not exist'
188 subtest 'update_field' => sub {
190 subtest 'update subfield' => sub {
192 my $record = new_record;
199 values => ['3010023918']
205 { record => $record, field => '952', subfield => 'p' }
209 'update existing subfield 952$p'
211 delete_field( { record => $record, field => '952' } );
217 values => ['3010023918']
231 { record => $record, field => '952', subfield => 'p' }
235 'create subfield 952$p'
239 { record => $record, field => '952', subfield => 'y' }
242 'create subfield 952$k on existing 952 field'
245 $record->append_fields(
257 values => ['3010023919']
261 read_field( { record => $record, field => '952', subfield => 'p' } );
264 [ '3010023919', '3010023919' ],
265 'update all subfields 952$p with the same value'
273 values => [ '3010023917', '3010023918' ]
277 read_field( { record => $record, field => '952', subfield => 'p' } );
280 [ '3010023917', '3010023918' ],
281 'update all subfields 952$p with the different values'
286 # copy_field - subfield
287 subtest 'copy_field' => sub {
289 subtest 'copy subfield' => sub {
291 my $record = new_record;
292 $record->append_fields(
295 a => 'Computer algorithms.',
303 from_subfield => 'a',
311 { record => $record, field => '245', subfield => 'a' }
314 ['The art of computer programming'],
315 'After copy 245$a still exists'
320 { record => $record, field => '246', subfield => 'a' }
323 ['The art of computer programming'],
324 '246$a is a new field'
326 delete_field( { record => $record, field => '246' } );
329 { record => $record, field => '246', subfield => 'a' }
332 '246$a does not exist anymore'
339 from_subfield => 'a',
345 read_field( { record => $record, field => '651', subfield => 'a' } );
348 [ 'Computer programming.', 'Computer algorithms.' ],
349 'Copy multivalued field'
351 delete_field( { record => $record, field => '651' } );
357 from_subfield => 'a',
366 { record => $record, field => '651', subfield => 'a' }
369 ['Computer programming.'],
370 'Copy first field 650$a'
372 delete_field( { record => $record, field => '652' } );
378 from_subfield => 'a',
387 { record => $record, field => '651', subfield => 'a' }
390 ['Computer programming.', 'Computer algorithms.'],
391 'Copy second field 650$a'
393 delete_field( { record => $record, field => '651' } );
399 from_subfield => 'a',
402 regex => { search => 'Computer', replace => 'The art of' }
406 read_field( { record => $record, field => '651', subfield => 'a' } );
409 [ 'The art of programming.', 'The art of algorithms.' ],
410 'Copy field using regex'
412 delete_field( { record => $record, field => '651' } );
418 from_subfield => 'a',
421 regex => { search => 'Computer', replace => 'The mistake of' }
425 read_field( { record => $record, field => '651', subfield => 'a' } );
428 [ 'The mistake of programming.', 'The mistake of algorithms.' ],
429 'Copy fields using regex on existing fields'
431 delete_field( { record => $record, field => '651' } );
437 from_subfield => 'a',
440 regex => { search => 'Computer', replace => 'The art of' }
444 read_field( { record => $record, field => '651', subfield => 'a' } );
447 [ 'The art of programming.', 'The art of algorithms.', ],
448 'Copy all fields using regex'
450 delete_field( { record => $record, field => '651' } );
456 from_subfield => 'a',
459 regex => { search => 'Computer', replace => 'The art of' },
464 read_field( { record => $record, field => '651', subfield => 'a' } );
467 [ 'The art of programming.', ],
468 'Copy first field using regex'
470 delete_field( { record => $record, field => '651' } );
472 # Copy with regex modifiers
473 $record = new_record;
474 $record->append_fields(
477 a => 'Computer algorithms.',
485 from_subfield => 'a',
488 regex => { search => 'o', replace => 'foo' }
492 read_field( { record => $record, field => '652', subfield => 'a' } );
495 [ 'Cfoomputer programming.', 'Cfoomputer algorithms.' ],
496 'Copy field using regex'
503 from_subfield => 'a',
506 regex => { search => 'o', replace => 'foo', modifiers => 'g' }
510 read_field( { record => $record, field => '653', subfield => 'a' } );
513 [ 'Cfoomputer prfoogramming.', 'Cfoomputer algfoorithms.' ],
514 'Copy field using regex'
521 from_subfield => 'a',
524 regex => { search => 'O', replace => 'foo', modifiers => 'i' }
528 read_field( { record => $record, field => '654', subfield => 'a' } );
531 [ 'Cfoomputer programming.', 'Cfoomputer algorithms.' ],
532 'Copy field using regex'
539 from_subfield => 'a',
542 regex => { search => 'O', replace => 'foo', modifiers => 'gi' }
546 read_field( { record => $record, field => '655', subfield => 'a' } );
549 [ 'Cfoomputer prfoogramming.', 'Cfoomputer algfoorithms.' ],
550 'Copy field using regex'
553 $record = new_record;
554 $record->append_fields(
566 from_subfield => 'd',
572 read_field( { record => $record, field => '952', subfield => 'd' } );
573 # FIXME We need a new action "duplicate" if we don't want to modify the original field
576 [ '2001-06-25', '2001-06-25', '2001-06-25' ],
577 'copy 952$d into others 952 field'
584 from_subfield => '1',
590 read_field( { record => $record, field => '999', subfield => '9' } );
591 is_deeply( \@fields_9999, [],
592 'copy a nonexistent subfield does not create a new one' );
594 $record = new_record;
599 from_subfield => 'a',
602 regex => { search => '^', replace => 'BEGIN ' }
608 { record => $record, field => '245', subfield => 'a' }
611 ['The art of computer programming', 'BEGIN The art of computer programming'],
612 'Update a subfield: add a string at the beginning'
615 $record = new_record;
620 from_subfield => 'a',
623 regex => { search => '$', replace => ' END' }
629 { record => $record, field => '245', subfield => 'a' }
632 ['The art of computer programming', 'The art of computer programming END'],
633 'Update a subfield: add a string at the end'
636 $record = new_record;
641 from_subfield => 'c',
650 { record => $record, field => '650' }
653 [ 'Computer programming.', '462', 'Donald E. Knuth.' ],
654 'Copy a subfield to an existent field but inexistent subfield'
657 $record = new_record;
662 from_subfield => 'c',
671 { record => $record, field => '650' }
674 [ 'Computer programming.', '462', 'Donald E. Knuth.' ],
675 'Copy a subfield to an existent field / subfield'
679 subtest 'copy field' => sub {
681 my $record = new_record;
682 $record->append_fields(
692 { record => $record, from_field => '952', to_field => '953' } );
693 my @fields_952 = read_field( { record => $record, field => '952' } );
697 { record => $record, field => '952', field_numbers => [1] }
700 [ '3010023917', 'BK', 'GEN', '2001-06-25' ],
701 "copy all: original first field still exists"
706 { record => $record, field => '952', field_numbers => [2] }
709 [ '3010023918', 'CD' ],
710 "copy all: original second field still exists"
715 { record => $record, field => '953', field_numbers => [1] }
718 [ '3010023917', 'BK', 'GEN', '2001-06-25' ],
719 "copy all: first original fields has been copied"
724 { record => $record, field => '953', field_numbers => [2] }
727 [ '3010023918', 'CD' ],
728 "copy all: second original fields has been copied"
731 #- copy only the first field
743 { record => $record, field => '953', field_numbers => [1] }
746 [ '3010023917', 'BK', 'GEN', '2001-06-25' ],
747 "copy first: first original fields has been copied"
752 { record => $record, field => '953', field_numbers => [2] }
755 [ '3010023918', 'CD' ],
756 "copy first: second original fields has been copied"
759 [ read_field( { record => $record, field => '954' } ) ],
760 [ '3010023917', 'BK', 'GEN', '2001-06-25' ],
761 "copy first: only first, first 953 has been copied"
764 $record = new_record;
765 $record->append_fields(
773 #- copy all fields and modify values using a regex
779 regex => { search => '30100', replace => '42424' }
785 { record => $record, field => '952', field_numbers => [1] }
788 [ '3010023917', 'BK', 'GEN', '2001-06-25' ],
789 "copy all with regex: original first field still exists"
794 { record => $record, field => '952', field_numbers => [2] }
797 [ '3010023918', 'CD' ],
798 "copy all with regex: original second field still exists"
803 { record => $record, field => '953', field_numbers => [1] }
806 [ '4242423917', 'BK', 'GEN', '2001-06-25' ],
807 "copy all wirh regex: first original fields has been copied"
812 { record => $record, field => '953', field_numbers => [2] }
815 [ '4242423918', 'CD' ],
816 "copy all with regex: second original fields has been copied"
826 read_field( { record => $record, field => '999', subfield => '9' } );
827 is_deeply( \@fields_9999, [],
828 'copy a nonexistent field does not create a new one' );
830 $record = new_record;
842 { record => $record, field => '650', field_numbers => [2] }
845 [ 'The art of computer programming', 'Donald E. Knuth.' ],
846 'Copy a field to existent fields should create a new field'
851 { record => $record, field => '650', field_numbers => [1] }
854 [ 'Computer programming.', '462' ],
855 'Copy a field to existent fields should create a new field, the original one should not have been updated'
860 # move_field - subfields
861 subtest 'move_field' => sub {
863 subtest 'move subfield' => sub {
865 my $record = new_record;
866 my ( @fields_952d, @fields_952c, @fields_954c, @fields_954p );
867 $record->append_fields(
878 from_subfield => 'c',
884 read_field( { record => $record, field => '952', subfield => 'c' } );
886 read_field( { record => $record, field => '954', subfield => 'c' } );
887 is_deeply( \@fields_952c, [], 'The 952$c has moved' );
888 is_deeply( \@fields_954c, ['GEN'], 'Now 954$c exists' );
894 from_subfield => 'p',
899 ); # Move the first field
901 read_field( { record => $record, field => '952', subfield => 'p' } );
903 read_field( { record => $record, field => '954', subfield => 'p' } );
904 is_deeply( \@fields_952p, ['3010023917'], 'One of 952$p has moved' );
905 is_deeply( \@fields_954p, ['3010023917'], 'Now 954$p exists' );
907 $record = new_record;
908 $record->append_fields(
920 from_subfield => 'p',
926 read_field( { record => $record, field => '952', subfield => 'p' } );
928 read_field( { record => $record, field => '954', subfield => 'p' } );
929 is_deeply( \@fields_952p, [], 'All 952$p have moved' );
932 [ '3010023917', '3010023917' ],
940 from_subfield => '1',
946 read_field( { record => $record, field => '999', subfield => '9' } );
947 is_deeply( \@fields_9999, [],
948 'move a nonexistent subfield does not create a new one' );
951 subtest 'move field' => sub {
954 # move_field - fields
955 my $record = new_record;
956 $record->append_fields(
966 { record => $record, from_field => '952', to_field => '953' } );
967 is_deeply( [ read_field( { record => $record, field => '952' } ) ],
968 [], "original fields don't exist" );
972 { record => $record, field => '953', field_numbers => [1] }
975 [ '3010023917', 'BK', 'GEN', '2001-06-25' ],
976 "first original fields has been copied"
981 { record => $record, field => '953', field_numbers => [2] }
984 [ '3010023917', 'BK' ],
985 "second original fields has been copied"
988 #- Move only the first field
998 [ read_field( { record => $record, field => '953' } ) ],
999 [ '3010023917', 'BK' ],
1000 "only first, the second 953 still exists"
1003 [ read_field( { record => $record, field => '954' } ) ],
1004 [ '3010023917', 'BK', 'GEN', '2001-06-25' ],
1005 "only first, first 953 has been copied"
1008 $record = new_record;
1009 $record->append_fields(
1017 #- Move all fields and modify values using a regex
1021 from_field => '952',
1023 regex => { search => 'BK', replace => 'DVD' }
1026 is_deeply( [ read_field( { record => $record, field => '952' } ) ],
1027 [], "use a regex, original fields don't exist" );
1031 { record => $record, field => '953', field_numbers => [1] }
1034 [ '3010023917', 'DVD', 'GEN', '2001-06-25' ],
1035 "use a regex, first original fields has been copied"
1040 { record => $record, field => '953', field_numbers => [2] }
1043 [ '3010023917', 'DVD' ],
1044 "use a regex, second original fields has been copied"
1050 from_field => '111',
1055 read_field( { record => $record, field => '999', subfield => '9' } );
1056 is_deeply( \@fields_9999, [],
1057 'move a nonexistent field does not create a new one' );
1063 subtest 'delete_field' => sub {
1065 subtest 'delete subfield' => sub {
1067 my $record = new_record;
1068 $record->append_fields(
1081 field_numbers => [1]
1085 read_field( { record => $record, field => '952', subfield => 'p' } );
1086 is_deeply( \@fields_952p, ['3010023917'], 'Delete first 952$p' );
1088 $record = new_record;
1089 $record->append_fields(
1096 delete_field( { record => $record, field => '952', subfield => 'p' } );
1098 read_field( { record => $record, field => '952', subfield => 'p' } );
1099 is_deeply( \@fields_952p, [], 'Delete all 952$p' );
1102 subtest 'delete field' => sub {
1104 my $record = new_record;
1105 delete_field( { record => $record, field => '952' } );
1106 my @fields_952 = read_field( { record => $record, field => '952' } );
1107 is_deeply( \@fields_952, [], 'Delete all 952, 1 deleted' );
1109 $record = new_record;
1110 $record->append_fields(
1117 delete_field( { record => $record, field => '952' } );
1118 @fields_952 = read_field( { record => $record, field => '952' } );
1119 is_deeply( \@fields_952, [], 'Delete all 952, 2 deleted' );