@@ -, +, @@ --- Koha/Patrons.pm | 17 ++++++++++++----- t/db_dependent/Koha/Patrons.t | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 8 deletions(-) --- a/Koha/Patrons.pm +++ a/Koha/Patrons.pm @@ -218,22 +218,29 @@ sub anonymise_issue_history { Includes a move to deletedborrowers if move flag set. Just like DBIx, the delete will only succeed when all entries could be - deleted. Returns true or throws an exception. + deleted. Returns number of deletes or throws an exception. A number of + zero deletes is represented as the true value '0E0'. =cut sub delete { my ( $self, $params ) = @_; - my $patrons_deleted; + my $patrons_deleted = 0; $self->_resultset->result_source->schema->txn_do( sub { my ( $set, $params ) = @_; while( my $patron = $set->next ) { $patron->move_to_deleted if $params->{move}; - $patron->delete == 1 || Koha::Exceptions::Patron::FailedDelete->throw; - $patrons_deleted++; + my $delete = $patron->delete; + # throw exception on zero only: if delete threw an exception, we do not come here and -1 is no reason to stop + if( defined($delete) && $delete == 0 ) { + Koha::Exceptions::Patron::FailedDelete->throw; + } elsif( defined($delete) && $delete == 1 ) { + $patrons_deleted++; + } } }, $self, $params ); - return $patrons_deleted; + return if $@; + return $patrons_deleted || '0E0'; } =head3 _type --- a/t/db_dependent/Koha/Patrons.t +++ a/t/db_dependent/Koha/Patrons.t @@ -424,7 +424,7 @@ subtest "delete" => sub { }; subtest 'Koha::Patrons->delete' => sub { - plan tests => 4; + plan tests => 6; my $mod_patron = Test::MockModule->new( 'Koha::Patron' ); my $moved_to_deleted = 0; @@ -438,11 +438,21 @@ subtest 'Koha::Patrons->delete' => sub { is( $set->delete({ move => 1 }), 2, 'Two patrons deleted' ); is( $moved_to_deleted, 2, 'Patrons moved to deletedborrowers' ); - # Add again, test if we can raise an exception - $mod_patron->mock( 'delete', sub { return -1; } ); + # Check return value / rollback + my $mod_object = Test::MockModule->new( 'Koha::Object' ); + my $mock_ret = -1; # no rollback expected + $mod_object->mock( 'delete', sub { return $mock_ret; } ); $patron1 = $builder->build_object({ class => 'Koha::Patrons' }); $id1 = $patron1->borrowernumber; $set = Koha::Patrons->search({ borrowernumber => { '>=' => $id1 }}); + is( $set->delete, '0E0', 'Try -1: no rollback' ); + + undef $mock_ret; # still no rollback expected + $set->_resultset->reset; # needed for reiterate + is( $set->delete, '0E0', 'Try undef: no rollback' ); + + $mock_ret = 0; # this should trigger rollback/exception + $set->_resultset->reset; throws_ok { $set->delete } 'Koha::Exceptions::Patron::FailedDelete', 'Exception raised for deleting patron'; }; --