From 9c46e373bedd26f9501f687842434b0e4ae9c8b0 Mon Sep 17 00:00:00 2001
From: Tomas Cohen Arazi <tomascohen@theke.io>
Date: Fri, 27 Dec 2019 15:21:30 -0300
Subject: [PATCH] Bug 23893: Catch dt_from_string exceptions

This patch adds exception handling to the attributes_from_api() method.
This can happen with invalid date/datetimes, for example.

Tests are added:

1. Apply this patch
2. Run:
   $ kshell
  k$ prove t/db_dependent/Koha/Object.t
=> SUCCESS: Tests pass!
3. Sign off :-D

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
---
 Koha/Object.pm               |  7 +++-
 t/db_dependent/Koha/Object.t | 70 +++++++++++++++++++++++++++++++++++-
 2 files changed, 75 insertions(+), 2 deletions(-)

diff --git a/Koha/Object.pm b/Koha/Object.pm
index 64e6b33e74..e258606554 100644
--- a/Koha/Object.pm
+++ b/Koha/Object.pm
@@ -500,7 +500,12 @@ sub attributes_from_api {
           : $key;
 
         if ( _date_or_datetime_column_type( $columns_info->{$koha_field_name}->{data_type} ) ) {
-            $value = dt_from_string($value, 'rfc3339');
+            try {
+                $value = dt_from_string($value, 'rfc3339');
+            }
+            catch {
+                Koha::Exceptions::BadParameter->throw( parameter => $key );
+            };
         }
 
         $params->{$koha_field_name} = $value;
diff --git a/t/db_dependent/Koha/Object.t b/t/db_dependent/Koha/Object.t
index 4474b3ac21..b3c57bdac9 100755
--- a/t/db_dependent/Koha/Object.t
+++ b/t/db_dependent/Koha/Object.t
@@ -17,7 +17,7 @@
 
 use Modern::Perl;
 
-use Test::More tests => 16;
+use Test::More tests => 17;
 use Test::Exception;
 use Test::Warn;
 use DateTime;
@@ -385,6 +385,74 @@ subtest 'new_from_api() tests' => sub {
     $schema->storage->txn_rollback;
 };
 
+subtest 'attributes_from_api() tests' => sub {
+
+    plan tests => 8;
+
+    my $patron = Koha::Patron->new();
+
+    use Data::Printer colored => 1;
+
+    my $attrs = $patron->attributes_from_api(
+        {
+            updated_on  => '2019-12-27T14:53:00'
+        }
+    );
+
+    ok( exists $attrs->{updated_on},
+        'No translation takes place if no mapping' );
+    is(
+        ref( $attrs->{updated_on} ),
+        'DateTime',
+        'Given a string, a timestamp field is converted into a DateTime object'
+    );
+
+    $attrs = $patron->attributes_from_api(
+        {
+            last_seen  => '2019-12-27T14:53:00'
+        }
+    );
+
+    ok( exists $attrs->{lastseen},
+        'Translation takes place because of the defined mapping' );
+    is(
+        ref( $attrs->{lastseen} ),
+        'DateTime',
+        'Given a string, a datetime field is converted into a DateTime object'
+    );
+
+    $attrs = $patron->attributes_from_api(
+        {
+            date_of_birth  => '2019-12-27'
+        }
+    );
+
+    ok( exists $attrs->{dateofbirth},
+        'Translation takes place because of the defined mapping' );
+    is(
+        ref( $attrs->{dateofbirth} ),
+        'DateTime',
+        'Given a string, a date field is converted into a DateTime object'
+    );
+
+    throws_ok
+        {
+            $attrs = $patron->attributes_from_api(
+                {
+                    date_of_birth => '20141205',
+                }
+            );
+        }
+        'Koha::Exceptions::BadParameter',
+        'Bad date throws an exception';
+
+    is(
+        $@->parameter,
+        'date_of_birth',
+        'Exception parameter is the API field name, not the DB one'
+    );
+};
+
 subtest "Test update method" => sub {
     plan tests => 6;
 
-- 
2.21.0 (Apple Git-122.2)