From 030652b12f0323b741879989e68ae63784cc7990 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Tue, 21 Oct 2025 15:27:42 +0200 Subject: [PATCH] Bug 40777: Add tests for errors_in_marc --- Koha/Database/DataInconsistency.pm | 39 ++++--- .../Koha/Database/DataInconsistency.t | 107 +++++++++++++++++- 2 files changed, 125 insertions(+), 21 deletions(-) diff --git a/Koha/Database/DataInconsistency.pm b/Koha/Database/DataInconsistency.pm index f3f6a93bf86..42646c2b3d8 100644 --- a/Koha/Database/DataInconsistency.pm +++ b/Koha/Database/DataInconsistency.pm @@ -159,8 +159,8 @@ sub errors_in_marc { } } - my ( $biblio_tag, $biblio_subfield ) = C4::Biblio::GetMarcFromKohaField("biblio.biblionumber"); - my ( $biblioitem_tag, $biblioitem_subfield ) = C4::Biblio::GetMarcFromKohaField("biblioitems.biblioitemnumber"); + my ( $biblio_tag, $biblio_subfield ) = C4::Biblio::GetMarcFromKohaField("biblio.biblionumber"); + my ( $biblioitem_tag, $biblioitem_subfield ) = C4::Biblio::GetMarcFromKohaField("biblioitems.biblioitemnumber"); $biblios = Koha::Biblios->search( { biblionumber => $ids } ); while ( my $biblio = $biblios->next ) { my $record = eval { $biblio->metadata->record; }; @@ -182,27 +182,26 @@ sub errors_in_marc { $biblioitemnumber = $record->subfield( $biblioitem_tag, $biblioitem_subfield ); } if ( $biblionumber != $biblio->biblionumber ) { - push @{ $errors->{ids_not_in_marc} }, - __x( - q{Biblionumber {biblionumber} has '{biblionumber_in_marc}' in {biblio_tag}${biblio_subfield}}, - biblionumber => $biblio->biblionumber, - biblionumber_in_marc => $biblionumber, - biblio_tag => $biblio_tag, - biblio_subfield => $biblio_subfield, - ); + push @{ $errors->{ids_not_in_marc} }, + __x( + q{Biblionumber {biblionumber} has '{biblionumber_in_marc}' in {biblio_tag}${biblio_subfield}}, + biblionumber => $biblio->biblionumber, + biblionumber_in_marc => $biblionumber, + biblio_tag => $biblio_tag, + biblio_subfield => $biblio_subfield, + ); } if ( $biblioitemnumber != $biblio->biblioitem->biblioitemnumber ) { - push @{ $errors->{ids_not_in_marc} }, - __x( - q{Biblionumber {biblionumber} has biblioitemnumber '{biblioitemnumber}' but should be '{biblioitemnumber_in_marc}' in {biblioitem_tag}${biblioitem_subfield}}, - biblionumber => $biblio->biblionumber, - biblioitemnumber => $biblio->biblioitem->biblioitemnumber, - biblioitemnumber_in_marc => $biblionumber, - biblioitem_tag => $biblioitem_tag, - biblioitem_subfield => $biblioitem_subfield, - ); - } + push @{ $errors->{ids_not_in_marc} }, + __x( + q{Biblionumber {biblionumber} has biblioitemnumber '{biblioitemnumber_in_marc}' but should be '{biblioitemnumber}' in {biblioitem_tag}${biblioitem_subfield}}, + biblionumber => $biblio->biblionumber, + biblioitemnumber_in_marc => $biblionumber, + biblioitemnumber => $biblio->biblioitem->biblioitemnumber, + biblioitem_tag => $biblioitem_tag, + biblioitem_subfield => $biblioitem_subfield, + ); } } if (@item_fields_in_marc) { diff --git a/t/db_dependent/Koha/Database/DataInconsistency.t b/t/db_dependent/Koha/Database/DataInconsistency.t index d8767217230..c5c47b76f75 100755 --- a/t/db_dependent/Koha/Database/DataInconsistency.t +++ b/t/db_dependent/Koha/Database/DataInconsistency.t @@ -1,7 +1,8 @@ use Modern::Perl; #use Test::NoWarnings; -use Test::More tests => 3; +use Test::More tests => 4; +use Test::Warn; use Koha::Items; use Koha::Database::DataInconsistency; @@ -264,3 +265,107 @@ subtest 'invalid_item_type' => sub { $schema->storage->txn_rollback(); }; + +subtest 'errors_in_marc' => sub { + + plan tests => 4; + + $schema->storage->txn_begin(); + + my $biblio_ok = $builder->build_sample_biblio; + my $item_ok = $builder->build_sample_item( { biblionumber => $biblio_ok->biblionumber } ); + my $biblio_ko = $builder->build_sample_biblio; + my $item_ko = $builder->build_sample_item( { biblionumber => $biblio_ko->biblionumber } ); + + my $biblios = Koha::Biblios->search( { biblionumber => [ $biblio_ok->biblionumber, $biblio_ko->biblionumber ] } ); + + my $itemtype = $builder->build_object( { class => 'Koha::ItemTypes' } ); + my $deleted_itemtype = $itemtype->itemtype; + $itemtype->delete; + + subtest 'ok' => sub { + plan tests => 3; + my $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios); + ok( !exists $errors->{decoding_errors} ); + ok( !exists $errors->{ids_not_in_marc} ); + ok( !exists $errors->{item_fields_in_marc} ); + }; + + subtest 'ids_not_in_marc' => sub { + plan tests => 2; + $schema->storage->txn_begin(); + my ( $biblio_tag, $biblio_subfield ) = C4::Biblio::GetMarcFromKohaField("biblio.biblionumber"); + my ( $biblioitem_tag, $biblioitem_subfield ) = C4::Biblio::GetMarcFromKohaField("biblioitems.biblioitemnumber"); + my $record = $biblio_ko->metadata->record; + if ( my $field = $record->field($biblio_tag) ) { + $field->update( $biblio_subfield => '-42' ); + } + $biblio_ko->metadata->metadata( $record->as_xml )->store; + + my $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios); + is_deeply( + $errors->{ids_not_in_marc}, + [ + sprintf q{Biblionumber %s has '%s' in %s$%s}, $biblio_ko->biblionumber, '-42', $biblio_tag, + $biblio_subfield + ] + ); + + $record = $biblio_ko->metadata->record; + if ( my $field = $record->field($biblioitem_tag) ) { + $field->update( $biblioitem_subfield => '-42' ); + } + $biblio_ko->metadata->metadata( $record->as_xml )->store; + + $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios); + is_deeply( + $errors->{ids_not_in_marc}, + [ + sprintf( + q{Biblionumber %s has '%s' in %s$%s}, $biblio_ko->biblionumber, '-42', $biblio_tag, + $biblio_subfield + ), + sprintf( + q{Biblionumber %s has biblioitemnumber '%s' but should be '%s' in %s$%s}, $biblio_ko->biblionumber, + '-42', $biblio_ko->biblioitem->biblioitemnumber, $biblioitem_tag, $biblioitem_subfield + ) + ] + ); + + $schema->storage->txn_rollback(); + }; + + subtest 'item_fields_in_marc' => sub { + plan tests => 1; + $schema->storage->txn_begin(); + my ( $item_tag, $item_subfield ) = C4::Biblio::GetMarcFromKohaField("items.itemnumber"); + my $record = $biblio_ko->metadata->record; + $record->append_fields( MARC::Field->new( $item_tag, '', '', $item_subfield => 'booh' ) ); + $biblio_ko->metadata->metadata( $record->as_xml )->store; + + my $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios); + is_deeply( + $errors->{item_fields_in_marc}, + [ sprintf q{Biblionumber %s has item fields (%s) in the marc record}, $biblio_ko->biblionumber, $item_tag ] + ); + + $schema->storage->txn_rollback(); + }; + + subtest 'decoding_errors' => sub { + plan tests => 2; + $schema->storage->txn_begin(); + my $biblio_metadata = $biblio_ko->metadata; + $biblio_metadata->metadata('oops'); + Koha::Object::store($biblio_metadata); + my $errors; + warning_like { + $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios); + } + qr{parser error}; + like( $errors->{decoding_errors}->[0], qr{Invalid data, cannot decode metadata object} ); + $schema->storage->txn_rollback(); + }; + + $schema->storage->txn_rollback(); +}; -- 2.34.1