Bug 18179: Forbid list context calls for Koha::Objects->find

Reading https://perlmaven.com/how-to-return-undef-from-a-function
this sound like the more correct behaviour.

Considering:
$template->param(
    stuff => Koha::Stuffs->find( $id ),
    foo   => 1,
);
without this patch, if the $id does not represent any rows in the DB,
stuff will be assigned to 'foo' and $foo will be undef in the template.
That can lead to very bad side-effects.

With this patch we make sure that it will never happen again.

Test plan:
  prove t/db_dependent/Koha/Objects.t
should return green

Signed-off-by: Marc Véron <veron@veron.ch>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
This commit is contained in:
Jonathan Druart 2017-04-18 13:49:18 -03:00 committed by Kyle M Hall
parent 21bddb399d
commit a1fcf1818c
2 changed files with 13 additions and 1 deletions

View file

@ -78,6 +78,8 @@ my $object = Koha::Objects->find( { keypart1 => $keypart1, keypart2 => $keypart2
sub find {
my ( $self, $id ) = @_;
croak 'Cannot use "->find" in list context' if wantarray;
return unless defined($id);
my $result = $self->_resultset()->find($id);

View file

@ -19,7 +19,7 @@
use Modern::Perl;
use Test::More tests => 13;
use Test::More tests => 14;
use Test::Warn;
use Koha::Authority::Types;
@ -43,6 +43,16 @@ my @columns = Koha::Patrons->columns;
my $borrowernumber_exists = grep { /^borrowernumber$/ } @columns;
is( $borrowernumber_exists, 1, 'Koha::Objects->columns should return the table columns' );
subtest 'find' => sub {
plan tests => 2;
my $patron = $builder->build({source => 'Borrower'});
my $patron_object = Koha::Patrons->find( $patron->{borrowernumber} );
is( $patron_object->borrowernumber, $patron->{borrowernumber}, '->find should return the correct object' );
eval { my @patrons = Koha::Patrons->find( $patron->{borrowernumber} ); };
like( $@, qr|^Cannot use "->find" in list context|, "->find should not be called in list context to avoid side-effects" );
};
subtest 'update' => sub {
plan tests => 2;