Bug 20886: Do not cast undef to 0 (TO_JSON)
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Wed, 6 Jun 2018 14:12:24 +0000 (11:12 -0300)
committerNick Clemens <nick@bywatersolutions.com>
Fri, 8 Jun 2018 13:48:12 +0000 (09:48 -0400)
We should not cast undefined values to 0.

Signed-off-by: Andrew Isherwood <andrew.isherwood@ptfs-europe.com>
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This was a bug I introduced. I think the fix is right, and if something
gets broken for this, it means it was making the wrong assumptions on
the data.

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Koha/Object.pm
t/db_dependent/Koha/Object.t

index b9208f0..e35ff0b 100644 (file)
@@ -22,6 +22,7 @@ use Modern::Perl;
 
 use Carp;
 use Mojo::JSON;
+use Scalar::Util qw( looks_like_number );
 use Try::Tiny;
 
 use Koha::Database;
@@ -241,7 +242,9 @@ sub TO_JSON {
                 ? Mojo::JSON->true
                 : Mojo::JSON->false;
         }
-        elsif ( _numeric_column_type( $columns_info->{$col}->{data_type} ) ) {
+        elsif ( _numeric_column_type( $columns_info->{$col}->{data_type} )
+            and looks_like_number( $unblessed->{$col} )
+        ) {
 
             # TODO: Remove once the solution for
             # https://rt.cpan.org/Ticket/Display.html?id=119904
index 7998b05..a00083a 100755 (executable)
@@ -161,7 +161,7 @@ subtest 'discard_changes' => sub {
 
 subtest 'TO_JSON tests' => sub {
 
-    plan tests => 7;
+    plan tests => 8;
 
     $schema->storage->txn_begin;
 
@@ -169,6 +169,7 @@ subtest 'TO_JSON tests' => sub {
     my $borrowernumber = $builder->build(
         { source => 'Borrower',
           value => { lost => 1,
+                     sms_provider_id => undef,
                      gonenoaddress => 0,
                      updated_on => $dt,
                      lastseen   => $dt, } })->{borrowernumber};
@@ -185,6 +186,8 @@ subtest 'TO_JSON tests' => sub {
     ok( $gonenoaddress->isa('JSON::PP::Boolean'), 'Boolean attribute type is correct' );
     is( $gonenoaddress, 0, 'Boolean attribute value is correct (false)' );
 
+    is( $patron->TO_JSON->{sms_provider_id}, undef, 'Undef values should not be casted to 0' );
+
     ok( !isvstring($patron->borrowernumber), 'Integer values are not coded as strings' );
 
     my $rfc3999_regex = qr/