Nick Clemens
77f3d48dee
This patch corrects handling of subfield 0 when copying/moving. Before these patches copying from subfield 0 would copy the entire field. We also correct an error that if moving a single subfield, we can leave behind empty fields with no subfields. They should be deleted. To test: 1 - Define a new MARC Modification template with actions: Delete field 100$0 Add new field 100$0 with value Test Update existing or add new field 100$0 with value TestUpdated Move field 100$0 to 600$0 Copy field 600$0 to 100$0 Copy and replace field 245$0 to 700$0 2 - Define a new record like: LDR 00334nam a22001217a 4500 003 ff 005 20201102111604.0 008 201102b xxu||||| |||| 00| 0 eng d 040 _ _ ‡cvsd 100 1 _ ‡012345‡aKnuth, Donal Ervin‡d1938 245 _ _ ‡012345‡aThe aty of computer programming‡cDonald E. Knuth 650 _ 0 ‡042‡aComputer programming‡9462 3 - Modify this record using the template above 4 - Note that entier 245 is copied to 700, same for 600 field 5 - Apply patch 6 - Now only subfields 0 are copied Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com> Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
810 lines
28 KiB
Perl
Executable file
810 lines
28 KiB
Perl
Executable file
use Modern::Perl;
|
|
|
|
use Test::More tests => 126;
|
|
|
|
use Koha::Database;
|
|
use Koha::SimpleMARC;
|
|
|
|
use t::lib::Mocks;
|
|
|
|
use_ok("MARC::Field");
|
|
use_ok("MARC::Record");
|
|
use_ok("C4::MarcModificationTemplates");
|
|
|
|
my $schema = Koha::Database->new->schema;
|
|
$schema->storage->txn_begin;
|
|
my $dbh = C4::Context->dbh;
|
|
|
|
$dbh->do(q|DELETE FROM marc_modification_templates|);
|
|
|
|
# Creation
|
|
my $template_id = AddModificationTemplate("template_name");
|
|
like( $template_id, qr|^\d+$|, "new template returns an id" );
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'move_field', 1,
|
|
'464', 'u', '', '464', '3',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'move first 464$u to 464$3'
|
|
), 1, "Add first action");
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'update_field', 0,
|
|
'099', 't', 'LIV', '', '',
|
|
'', '', '',
|
|
'if', '200', 'b', 'equals', 'Text', '',
|
|
'Update field 099$t with value LIV if 200$b matches "Text"'
|
|
), 1, "Add second action");
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'copy_field', 0,
|
|
'606', 'a', '', '607', 'a',
|
|
'', '', '',
|
|
'unless', '606', 'a', 'not_equals', '^AJAX', '1',
|
|
'Copy field 606$a to 607$a unless 606$a matches RegEx m^AJAX'
|
|
), 1, "Add third action");
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'add_field', 0,
|
|
'650', 'a', 'Additional', '', '',
|
|
'', '', '',
|
|
'unless', '650', 'a', 'exists', '', '',
|
|
'Add field 650$aAdditional unless 650$a exists'
|
|
), 1, "Add fourth action");
|
|
# Getter
|
|
|
|
my @actions = GetModificationTemplateActions( $template_id );
|
|
is( @actions, 4, "4 actions are inserted");
|
|
|
|
for my $action ( @actions ) {
|
|
isnt( GetModificationTemplateAction( $action->{mmta_id} ), undef, "action with id $action->{mmta_id} exists" );
|
|
}
|
|
|
|
my $first_action = $actions[0];
|
|
is( $first_action->{ordering}, 1, "test ordering for first action" );
|
|
is( $first_action->{action}, 'move_field', "test action for first action" );
|
|
is( $first_action->{from_field}, '464', "test from_field for first action" );
|
|
is( $first_action->{from_subfield}, 'u', "test from_subfield for first action" );
|
|
is( $first_action->{to_field}, '464', "test to_field for first action" );
|
|
is( $first_action->{to_subfield}, '3', "test to_subfield for first action" );
|
|
|
|
my $second_action = $actions[1];
|
|
is( $second_action->{ordering}, 2, "test ordering for second action" );
|
|
is( $second_action->{action}, 'update_field', "test action for second action" );
|
|
is( $second_action->{from_field}, '099',"test from_field for second action" );
|
|
is( $second_action->{from_subfield}, 't', "test from_subfield for second action" );
|
|
is( $second_action->{field_value}, 'LIV', "test firld_value for second action" );
|
|
is( $second_action->{to_field}, '', "test to_field for second action" );
|
|
is( $second_action->{to_subfield}, '', "test to_subfield for second action" );
|
|
is( $second_action->{conditional}, 'if', "test conditional for second action" );
|
|
is( $second_action->{conditional_field}, '200', "test conditional_field for second action" );
|
|
is( $second_action->{conditional_subfield}, 'b', "test conditional_subfield for second action" );
|
|
is( $second_action->{conditional_comparison}, 'equals', "test conditional_comparison for second action" );
|
|
|
|
my $third_action = $actions[2];
|
|
is( $third_action->{ordering}, 3, "test ordering for third action" );
|
|
is( $third_action->{action}, 'copy_field', "test action for third action" );
|
|
is( $third_action->{from_field}, '606', "test from_field for third action" );
|
|
is( $third_action->{from_subfield}, 'a', "test from_subfield for third action" );
|
|
is( $third_action->{to_field}, '607', "test to_field for third action" );
|
|
is( $third_action->{to_subfield}, 'a', "test to_subfield for third action" );
|
|
is( $third_action->{conditional}, 'unless', "test conditional for third action" );
|
|
is( $third_action->{conditional_field}, '606', "test conditional_field for third action" );
|
|
is( $third_action->{conditional_subfield}, 'a', "test conditional_subfield for third action" );
|
|
is( $third_action->{conditional_comparison}, 'not_equals', "test conditional_comparison for third action" );
|
|
is( $third_action->{conditional_value}, '^AJAX', "test conditional_value for third action" );
|
|
|
|
my $fourth_action = $actions[3];
|
|
is( $fourth_action->{ordering}, 4, "test ordering for fourth action" );
|
|
is( $fourth_action->{action}, 'add_field', "test action for fourth action" );
|
|
is( $fourth_action->{from_field}, '650', "test from_field for fourth action" );
|
|
is( $fourth_action->{from_subfield}, 'a', "test from_subfield for fourth action" );
|
|
is( $fourth_action->{to_field}, '', "test to_field for fourth action" );
|
|
is( $fourth_action->{to_subfield}, '', "test to_subfield for fourth action" );
|
|
is( $fourth_action->{conditional}, 'unless', "test conditional for fourth action" );
|
|
is( $fourth_action->{conditional_field}, '650', "test conditional_field for fourth action" );
|
|
is( $fourth_action->{conditional_subfield}, 'a', "test conditional_subfield for fourth action" );
|
|
is( $fourth_action->{conditional_comparison}, 'exists', "test conditional_comparison for fourth action" );
|
|
is( $fourth_action->{conditional_value}, '', "test conditional_value for fourth action" );
|
|
|
|
# Modifications
|
|
is( ModModificationTemplateAction(
|
|
$actions[1]->{mmta_id}, 'update_field', 0,
|
|
'100', 'u', 'LIV', '', '',
|
|
'', '', '',
|
|
'if', '200', 'c', 'equals', 'Text', '',
|
|
'Update field 099$t with value LIV if 200$b matches "Text"'
|
|
), 1, "Modify second action");
|
|
|
|
$second_action = GetModificationTemplateAction( $actions[1]->{mmta_id} );
|
|
is( $second_action->{ordering}, 2, "test ordering for second action modified" );
|
|
is( $second_action->{action}, 'update_field', "test action for second action modified" );
|
|
is( $second_action->{from_field}, '100',"test from_field for second action modified" );
|
|
is( $second_action->{from_subfield}, 'u', "test from_subfield for second action modified" );
|
|
is( $second_action->{field_value}, 'LIV', "test firld_value for second action modified" );
|
|
is( $second_action->{to_field}, '', "test to_field for second action modified" );
|
|
is( $second_action->{to_subfield}, '', "test to_subfield for second action modified" );
|
|
is( $second_action->{conditional}, 'if', "test conditional for second action modified" );
|
|
is( $second_action->{conditional_field}, '200', "test conditional_field for second action modified" );
|
|
is( $second_action->{conditional_subfield}, 'c', "test conditional_subfield for second action modified" );
|
|
is( $second_action->{conditional_comparison}, 'equals', "test conditional_comparison for second action modified" );
|
|
|
|
# Up and down
|
|
is( MoveModificationTemplateAction( $actions[2]->{mmta_id}, 'top' ), '1', 'Move the third action on top' );
|
|
is( MoveModificationTemplateAction( $actions[0]->{mmta_id}, 'bottom' ), '1', 'Move the first action on bottom' );
|
|
|
|
is( GetModificationTemplateAction( $actions[0]->{mmta_id} )->{ordering}, '4', 'First becomes fourth' );
|
|
is( GetModificationTemplateAction( $actions[1]->{mmta_id} )->{ordering}, '2', 'Second stays second' );
|
|
is( GetModificationTemplateAction( $actions[2]->{mmta_id} )->{ordering}, '1', 'Third becomes first' );
|
|
is( GetModificationTemplateAction( $actions[3]->{mmta_id} )->{ordering}, '3', 'Fourth becomes third' );
|
|
|
|
is( MoveModificationTemplateAction( $actions[0]->{mmta_id}, 'up' ), '1', 'Move up the first action (was fourth)' );
|
|
is( MoveModificationTemplateAction( $actions[0]->{mmta_id}, 'up' ), '1', 'Move up the first action (was third)' );
|
|
is( MoveModificationTemplateAction( $actions[2]->{mmta_id}, 'down' ), '1', 'Move down the third action (was first)' );
|
|
|
|
is( GetModificationTemplateAction( $actions[0]->{mmta_id} )->{ordering}, '1', 'First becomes again first' );
|
|
is( GetModificationTemplateAction( $actions[1]->{mmta_id} )->{ordering}, '3', 'Second becomes third' );
|
|
is( GetModificationTemplateAction( $actions[2]->{mmta_id} )->{ordering}, '2', 'Third becomes second' );
|
|
is( GetModificationTemplateAction( $actions[3]->{mmta_id} )->{ordering}, '4', 'Fourth becomes again fourth' );
|
|
|
|
# Cleaning
|
|
is( DelModificationTemplateAction( $actions[0]->{mmta_id} ), 3, "Delete the first action, 2 others are reordered" );
|
|
is( GetModificationTemplateAction( $actions[0]->{mmta_id} ), undef, "first action does not exist anymore" );
|
|
|
|
is( DelModificationTemplate( $template_id ), 1, "The template has been deleted" );
|
|
|
|
is( GetModificationTemplateAction( $actions[1]->{mmta_id} ), undef, "second action does not exist anymore" );
|
|
is( GetModificationTemplateAction( $actions[2]->{mmta_id} ), undef, "third action does not exist anymore" );
|
|
is( GetModificationTemplateAction( $actions[3]->{mmta_id} ), undef, "fourth action does not exist anymore" );
|
|
|
|
is( GetModificationTemplateActions( $template_id ), 0, "There is no action for deleted template" );
|
|
|
|
# ModifyRecordWithTemplate
|
|
t::lib::Mocks::mock_userenv();
|
|
|
|
$template_id = AddModificationTemplate("new_template_test");
|
|
like( $template_id, qr|^\d+$|, "new template returns an id" );
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'delete_field', 0,
|
|
'245', '', '', '', '',
|
|
'', '', '',
|
|
'if', '245', 'a', 'equals', 'Bad title', '',
|
|
'Delete field 245 if 245$a eq "Bad title"'
|
|
), 1, 'Add first action: delete field 245 if 245$a eq "Bad title"');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'copy_field', 0,
|
|
'245', 'a', '', '246', 'a',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'copy field 245$a to 246$a'
|
|
), 1, 'Add second action: copy 245$a to 246$a');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'delete_field', 0,
|
|
'650', 'a', '', '', '',
|
|
'', '', '',
|
|
'if', '650', '9', 'equals', '462', '',
|
|
'Delete field 650$a if 650$9=462'
|
|
), 1, 'Add third action: delete field 650$a if 650$9=462');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'update_field', 0,
|
|
'952', 'p', '3010023917_updated', '', '',
|
|
'', '', '',
|
|
'unless', '650', '9', 'equals', '42', '',
|
|
'Update field 952$p with "3010023917_updated" if 650$9 != 42'
|
|
), 1, 'Add fourth action: update field 952$p with "3010023917_updated" if 650$9 != 42');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'move_field', 0,
|
|
'952', 'd', '', '952', 'e',
|
|
'', '', '',
|
|
'if', '952', 'c', 'equals', '^GEN', '1',
|
|
'Move field 952$d to 952$e if 952$c =~ /^GEN/'
|
|
), 1, 'Add fifth action: move field 952$d to 952$e if 952$c =~ /^GEN/');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'update_field', 0,
|
|
'650', 'a', 'Computer algorithms.', '', '',
|
|
'', '', '',
|
|
'if', '650', '9', 'equals', '499', '',
|
|
'Update field 650$a with "Computer algorithms." to 651 if 650$9 == 499'
|
|
), 1, 'Add sixth action: update field 650$a with "Computer algorithms." if 650$9 == 499');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'move_field', 0,
|
|
'650', '', '', '651', '',
|
|
'', '', '',
|
|
'if', '650', '9', 'equals', '499', '',
|
|
'Move field 650 to 651 if 650$9 == 499'
|
|
), 1, 'Add seventh action: move field 650 to 651 if 650$9 == 499');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'update_field', 0,
|
|
'999', 'a', 'non existent.', '', '',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Update non existent field 999$a with "non existent"'
|
|
), 1, 'Add eighth action: update field non existent 999$a with "non existent."');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'update_field', 0,
|
|
'999', 'a', 'existent - updated.', '', '',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Update existent field 999$a with "existent - updated."'
|
|
), 1, 'Add ninth action: update field non existent 999$a with "existent - updated."');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'add_field', 0,
|
|
'999', 'a', 'additional existent.', '', '',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Add new existent field 999$a with "additional existent"'
|
|
), 1, 'Add tenth action: add additional field existent 999$a with "additional existent."');
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'add_field', 0,
|
|
'007', '', 'vxcdq', '', '',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Add new existent field 999$a with "additional existent"'
|
|
), 1, 'Add eleventh action: add additional field existent 007');
|
|
|
|
my $record = new_record();
|
|
is( ModifyRecordWithTemplate( $template_id, $record ), undef, "The ModifyRecordWithTemplate returns undef" );
|
|
|
|
my $expected_record = expected_record_1();
|
|
is_deeply( $record, $expected_record, "Record modification as expected");
|
|
|
|
$template_id = AddModificationTemplate("another_template_test");
|
|
|
|
# Duplicate 245 => 3x245
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'copy_field', 0,
|
|
'245', '', '', '245', '',
|
|
'', '', '',
|
|
'if', '245', 'a', 'equals', 'Bad title', '',
|
|
'Copy field 245 if 245$a eq "Bad title"'
|
|
), 1, 'Add action: copy field 245 if 245$a eq "Bad title"');
|
|
|
|
$record = new_record();
|
|
is( ModifyRecordWithTemplate( $template_id, $record ), undef, "The ModifyRecordWithTemplate returns undef" );
|
|
|
|
my @fields_245a = Koha::SimpleMARC::read_field({
|
|
record => $record,
|
|
field => '245',
|
|
subfield => 'a',
|
|
});
|
|
is_deeply( \@fields_245a, [
|
|
'The art of computer programming',
|
|
'Bad title',
|
|
'Bad title',
|
|
], 'Copy field has copied the "Bad title"' );
|
|
|
|
# Update first "Bad title"
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'update_field', 1,
|
|
'245', 'a', 'Bad title updated', '', '',
|
|
'', '', '',
|
|
'if', '245', 'a', 'equals', 'Bad title', '',
|
|
'Update first 245$a matching "Bad title" with "Bad title updated"'
|
|
), 1, 'Add action: update field 245$a matching "Bad title" with "Bad title updated');
|
|
|
|
$record = new_record();
|
|
is( ModifyRecordWithTemplate( $template_id, $record ), undef, "The ModifyRecordWithTemplate returns undef" );
|
|
|
|
@fields_245a = Koha::SimpleMARC::read_field({
|
|
record => $record,
|
|
field => '245',
|
|
subfield => 'a',
|
|
});
|
|
is_deeply( \@fields_245a, [
|
|
'The art of computer programming',
|
|
'Bad title updated',
|
|
'Bad title',
|
|
], 'update_field has update first the "Bad title"' );
|
|
|
|
# Duplicate first 245 => 3x245
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'copy_field', 1,
|
|
'245', '', '', '245', '',
|
|
'', '', '',
|
|
'if', '245', 'a', 'equals', '^Bad title', '1',
|
|
'Copy field 245 if 245$a =~ "^Bad title"'
|
|
), 1, 'Add action: copy field 245 if 245$a =~ "^Bad title"');
|
|
|
|
$record = new_record();
|
|
is( ModifyRecordWithTemplate( $template_id, $record ), undef, "The ModifyRecordWithTemplate returns undef" );
|
|
|
|
@fields_245a = Koha::SimpleMARC::read_field({
|
|
record => $record,
|
|
field => '245',
|
|
subfield => 'a',
|
|
});
|
|
is_deeply( \@fields_245a, [
|
|
'The art of computer programming',
|
|
'Bad title updated',
|
|
'Bad title',
|
|
'Bad title updated',
|
|
], 'Copy field has copied first "^Bad title"' );
|
|
|
|
# Delete first ^Bad title
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'delete_field', 1,
|
|
'245', '', '', '', '',
|
|
'', '', '',
|
|
'if', '245', 'a', 'equals', '^Bad title', '1',
|
|
'Delete first 245$a mathing ^Bad title'
|
|
), 1, 'Delete first 245$a mathing ^Bad title');
|
|
|
|
$record = new_record();
|
|
is( ModifyRecordWithTemplate( $template_id, $record ), undef, "The ModifyRecordWithTemplate returns undef" );
|
|
@fields_245a = Koha::SimpleMARC::read_field({
|
|
record => $record,
|
|
field => '245',
|
|
subfield => 'a',
|
|
});
|
|
is_deeply( \@fields_245a, [
|
|
'The art of computer programming',
|
|
'Bad title',
|
|
'Bad title updated',
|
|
], 'delete field has been deleted the right field"' );
|
|
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'delete_field', 0,
|
|
'245', '', '', '', '',
|
|
'', '', '',
|
|
'if', '245', 'a', 'equals', 'updated$', '1',
|
|
'Delete first 245$a mathing updated$'
|
|
), 1, 'Delete first 245$a mathing updated$');
|
|
|
|
$record = new_record();
|
|
is( ModifyRecordWithTemplate( $template_id, $record ), undef, "The ModifyRecordWithTemplate returns undef" );
|
|
@fields_245a = Koha::SimpleMARC::read_field({
|
|
record => $record,
|
|
field => '245',
|
|
subfield => 'a',
|
|
});
|
|
is_deeply( \@fields_245a, [
|
|
'The art of computer programming',
|
|
'Bad title'
|
|
], 'delete field has been deleted the right field"' );
|
|
|
|
subtest 'GetModificationTemplates' => sub {
|
|
plan tests => 1;
|
|
$dbh->do(q|DELETE FROM marc_modification_templates|);
|
|
AddModificationTemplate("zzz");
|
|
AddModificationTemplate("aaa");
|
|
AddModificationTemplate("mmm");
|
|
my @templates = GetModificationTemplates();
|
|
is_deeply( [map{$_->{name}} @templates], ['aaa', 'mmm', 'zzz'] );
|
|
};
|
|
|
|
subtest "not_equals" => sub {
|
|
plan tests => 2;
|
|
$dbh->do(q|DELETE FROM marc_modification_templates|);
|
|
my $template_id = AddModificationTemplate("template_name");
|
|
AddModificationTemplateAction(
|
|
$template_id, 'move_field', 0,
|
|
'650', '', '', '651', '',
|
|
'', '', '',
|
|
'if', '650', '9', 'not_equals', '499', '',
|
|
'Move field 650 to 651 if 650$9 != 499'
|
|
);
|
|
my $record = new_record();
|
|
ModifyRecordWithTemplate( $template_id, $record );
|
|
my $expected_record = expected_record_2();
|
|
is_deeply( $record, $expected_record, '650 has been moved to 651 when 650$9 != 499' );
|
|
|
|
$dbh->do(q|DELETE FROM marc_modification_templates|);
|
|
$template_id = AddModificationTemplate("template_name");
|
|
AddModificationTemplateAction(
|
|
$template_id, 'move_field', 0,
|
|
'650', '', '', '651', '',
|
|
'', '', '',
|
|
'if', '650', 'b', 'not_equals', '499', '',
|
|
'Move field 650 to 651 if 650$b != 499'
|
|
);
|
|
$record = new_record();
|
|
ModifyRecordWithTemplate( $template_id, $record );
|
|
$expected_record = new_record();
|
|
is_deeply( $record, $expected_record, 'None 650 have been moved, no $650$b exists' );
|
|
};
|
|
|
|
subtest "when conditional field doesn't match the from field" => sub {
|
|
plan tests => 3;
|
|
$dbh->do(q|DELETE FROM marc_modification_templates|);
|
|
my $template_id = AddModificationTemplate("template_name");
|
|
AddModificationTemplateAction(
|
|
$template_id, 'delete_field', 0,
|
|
'650', '9', '', '', '',
|
|
'', '', '',
|
|
'if', '245', 'a', 'equals', 'Bad title', '',
|
|
'Delete fields 650$9 if 245$a == "Bad title"'
|
|
);
|
|
my $record = new_record();
|
|
ModifyRecordWithTemplate( $template_id, $record );
|
|
my $expected_record = expected_record_3();
|
|
is_deeply( $record, $expected_record, '650$9 fields have been deleted when 245$a == "Bad title"' );
|
|
|
|
$dbh->do(q|DELETE FROM marc_modification_templates|);
|
|
$template_id = AddModificationTemplate("template_name");
|
|
AddModificationTemplateAction(
|
|
$template_id, 'delete_field', 0,
|
|
'650', '9', '', '', '',
|
|
'', '', '',
|
|
'if', '245', 'a', 'exists', '', '',
|
|
'Delete fields 650$9 if 245$a exists'
|
|
);
|
|
$record = new_record();
|
|
ModifyRecordWithTemplate( $template_id, $record );
|
|
$expected_record = expected_record_3();
|
|
is_deeply( $record, $expected_record, '650$9 fields have been deleted because 245$a exists' );
|
|
|
|
$dbh->do(q|DELETE FROM marc_modification_templates|);
|
|
$template_id = AddModificationTemplate("template_name");
|
|
AddModificationTemplateAction(
|
|
$template_id, 'delete_field', 1,
|
|
'650', '', '', '', '',
|
|
'', '', '',
|
|
'if', '245', 'a', 'exists', '', '',
|
|
'Delete 1st field 650 if 245$a exists'
|
|
);
|
|
$record = new_record();
|
|
ModifyRecordWithTemplate( $template_id, $record );
|
|
$expected_record = expected_record_4();
|
|
is_deeply( $record, $expected_record, '1st 650 field has been deleted because 245$a exists' );
|
|
};
|
|
|
|
sub new_record {
|
|
my $record = MARC::Record->new;
|
|
$record->leader('03174nam a2200445 a 4500');
|
|
my @fields = (
|
|
MARC::Field->new(
|
|
100, '1', ' ',
|
|
a => 'Knuth, Donald Ervin',
|
|
d => '1938',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
a => 'The art of computer programming',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
a => 'Bad title',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
650, ' ', '0',
|
|
a => 'Computer programming.',
|
|
9 => '462',
|
|
),
|
|
MARC::Field->new(
|
|
650, ' ', '0',
|
|
a => 'Computer programming.',
|
|
9 => '499',
|
|
),
|
|
MARC::Field->new(
|
|
952, ' ', ' ',
|
|
p => '3010023917',
|
|
y => 'BK',
|
|
c => 'GEN',
|
|
d => '2001-06-25',
|
|
),
|
|
);
|
|
$record->append_fields(@fields);
|
|
return $record;
|
|
}
|
|
|
|
sub expected_record_1 {
|
|
my $record = MARC::Record->new;
|
|
$record->leader('03174nam a2200445 a 4500');
|
|
my @fields = (
|
|
MARC::Field->new(
|
|
100, '1', ' ',
|
|
a => 'Knuth, Donald Ervin',
|
|
d => '1938',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
a => 'The art of computer programming',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
650, ' ', '0',
|
|
9 => '462',
|
|
),
|
|
MARC::Field->new(
|
|
952, ' ', ' ',
|
|
p => '3010023917_updated',
|
|
y => 'BK',
|
|
c => 'GEN',
|
|
e => '2001-06-25',
|
|
),
|
|
MARC::Field->new(
|
|
246, '', ' ',
|
|
a => 'The art of computer programming',
|
|
),
|
|
MARC::Field->new(
|
|
651, ' ', '0',
|
|
a => 'Computer algorithms.',
|
|
9 => '499',
|
|
),
|
|
MARC::Field->new(
|
|
999, ' ', ' ',
|
|
a => 'existent - updated.',
|
|
),
|
|
MARC::Field->new(
|
|
999, ' ', ' ',
|
|
a => 'additional existent.',
|
|
),
|
|
MARC::Field->new(
|
|
'007', 'vxcdq',
|
|
),
|
|
);
|
|
$record->append_fields(@fields);
|
|
return $record;
|
|
}
|
|
|
|
sub expected_record_2 {
|
|
my $record = MARC::Record->new;
|
|
$record->leader('03174nam a2200445 a 4500');
|
|
my @fields = (
|
|
MARC::Field->new(
|
|
100, '1', ' ',
|
|
a => 'Knuth, Donald Ervin',
|
|
d => '1938',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
a => 'The art of computer programming',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
a => 'Bad title',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
650, ' ', '0',
|
|
a => 'Computer programming.',
|
|
9 => '499',
|
|
),
|
|
MARC::Field->new(
|
|
952, ' ', ' ',
|
|
p => '3010023917',
|
|
y => 'BK',
|
|
c => 'GEN',
|
|
d => '2001-06-25',
|
|
),
|
|
MARC::Field->new(
|
|
651, ' ', '0',
|
|
a => 'Computer programming.',
|
|
9 => '462',
|
|
),
|
|
);
|
|
$record->append_fields(@fields);
|
|
return $record;
|
|
}
|
|
|
|
sub expected_record_3 {
|
|
my $record = MARC::Record->new;
|
|
$record->leader('03174nam a2200445 a 4500');
|
|
my @fields = (
|
|
MARC::Field->new(
|
|
100, '1', ' ',
|
|
a => 'Knuth, Donald Ervin',
|
|
d => '1938',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
a => 'The art of computer programming',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
a => 'Bad title',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
650, ' ', '0',
|
|
a => 'Computer programming.',
|
|
),
|
|
MARC::Field->new(
|
|
650, ' ', '0',
|
|
a => 'Computer programming.',
|
|
),
|
|
MARC::Field->new(
|
|
952, ' ', ' ',
|
|
p => '3010023917',
|
|
y => 'BK',
|
|
c => 'GEN',
|
|
d => '2001-06-25',
|
|
),
|
|
);
|
|
$record->append_fields(@fields);
|
|
return $record;
|
|
}
|
|
|
|
sub expected_record_4 {
|
|
my $record = MARC::Record->new;
|
|
$record->leader('03174nam a2200445 a 4500');
|
|
my @fields = (
|
|
MARC::Field->new(
|
|
100, '1', ' ',
|
|
a => 'Knuth, Donald Ervin',
|
|
d => '1938',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
a => 'The art of computer programming',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
a => 'Bad title',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
650, ' ', '0',
|
|
a => 'Computer programming.',
|
|
9 => '499',
|
|
),
|
|
MARC::Field->new(
|
|
952, ' ', ' ',
|
|
p => '3010023917',
|
|
y => 'BK',
|
|
c => 'GEN',
|
|
d => '2001-06-25',
|
|
),
|
|
);
|
|
$record->append_fields(@fields);
|
|
return $record;
|
|
}
|
|
|
|
# Tests related to use of subfield 0 ($0)
|
|
|
|
sub new_record_0 {
|
|
my $record = MARC::Record->new;
|
|
$record->leader('03174nam a2200445 a 4500');
|
|
my @fields = (
|
|
MARC::Field->new(
|
|
100, '1', ' ',
|
|
0 => '12345',
|
|
a => 'Knuth, Donald Ervin',
|
|
d => '1938',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
0 => '12345',
|
|
a => 'The art of computer programming',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
650, ' ', '0',
|
|
0 => '42',
|
|
a => 'Computer programming.',
|
|
9 => '462',
|
|
),
|
|
);
|
|
$record->append_fields(@fields);
|
|
return $record;
|
|
}
|
|
|
|
sub expected_record_0 {
|
|
my $record = MARC::Record->new;
|
|
$record->leader('03174nam a2200445 a 4500');
|
|
my @fields = (
|
|
MARC::Field->new(
|
|
100, '1', ' ',
|
|
a => 'Knuth, Donald Ervin',
|
|
d => '1938',
|
|
),
|
|
MARC::Field->new(
|
|
245, '1', '4',
|
|
0 => '12345',
|
|
a => 'The art of computer programming',
|
|
c => 'Donald E. Knuth.',
|
|
),
|
|
MARC::Field->new(
|
|
650, ' ', '0',
|
|
0 => '42',
|
|
a => 'Computer programming.',
|
|
9 => '462',
|
|
),
|
|
MARC::Field->new(
|
|
600, ' ', ' ',
|
|
0 => 'TestUpdated',
|
|
),
|
|
MARC::Field->new(
|
|
600, ' ', ' ',
|
|
0 => 'TestUpdated',
|
|
),
|
|
MARC::Field->new(
|
|
100, ' ', ' ',
|
|
0 => 'TestUpdated',
|
|
),
|
|
MARC::Field->new(
|
|
100, ' ', ' ',
|
|
0 => 'TestUpdated',
|
|
),
|
|
MARC::Field->new(
|
|
700, ' ', ' ',
|
|
0 => '12345',
|
|
),
|
|
);
|
|
$record->append_fields(@fields);
|
|
return $record;
|
|
}
|
|
|
|
$record = new_record_0();
|
|
is( ModifyRecordWithTemplate( $template_id, $record ), undef, "The ModifyRecordWithTemplate returns undef" );
|
|
|
|
$template_id = AddModificationTemplate("template_test_subfield_0");
|
|
like( $template_id, qr|^\d+$|, "new template returns an id" );
|
|
|
|
# Delete subfield 100$0
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'delete_field', 0,
|
|
'100', '0', '', '', '',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Action 1: Delete subfield 100$0'
|
|
), 1, 'Action 1: Delete subfield 100$0');
|
|
|
|
# Add new subfield 100$0 with value "Test"
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'add_field', 0,
|
|
'100', '0', 'Test', '', '',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Action 2: Add new subfield 100$0 with value "Test"'
|
|
), 1, 'Action 2: Add new subfield 100$0');
|
|
|
|
# Update existing or add new subfield 100$0 with value "TestUpdated"
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'update_field', 0,
|
|
'100', '0', 'TestUpdated', '', '',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Action 3: Update existing or add new subfield 100$0 with value "TestUpdated"'
|
|
), 1, 'Action 3: Update existing or add new subfield 100$0 with value "TestUpdated"');
|
|
|
|
# Move subfield 100$0 to 600$0
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'move_field', 0,
|
|
'100', '0', '', '600', '0',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Action 4: Move subfield 100$0 to 600$0'
|
|
), 1, 'Action 4: Move subfield 100$0 to 600$0');
|
|
|
|
# Copy subfield 600$0 to 100$0
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'copy_field', 0,
|
|
'600', '0', '', '100', '0',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Action 5: Copy subfield 600$0 to 100$0'
|
|
), 1, 'Action 5: Copy subfield 600$0 to 100$0');
|
|
|
|
# Copy and replace subfield 245$0 to 700$0
|
|
is( AddModificationTemplateAction(
|
|
$template_id, 'copy_and_replace_field', 0,
|
|
'245', '0', '', '700', '0',
|
|
'', '', '',
|
|
'', '', '', '', '', '',
|
|
'Action 6: Copy and replace subfield 245$0 to 700$0'
|
|
), 1, 'Action 6: Copy and replace subfield 245$0 to 700$0');
|
|
|
|
my @actions_0 = GetModificationTemplateActions( $template_id );
|
|
is( @actions_0, 6, "6 actions are inserted");
|
|
|
|
ModifyRecordWithTemplate( $template_id, $record );
|
|
my $expected_record_0 = expected_record_0();
|
|
is_deeply( $record, $expected_record_0, '100$0 has been deleted, added back, updated, moved to 600$0, and copied back to 100$0; finally, 245$0 has been copied and replaced to 700$0' );
|