MDL-63225 webservice: Return proper debuginfo on WS exceptions
authorJuan Leyva <juanleyvadelgado@gmail.com>
Fri, 24 Aug 2018 11:58:17 +0000 (12:58 +0100)
committerJuan Leyva <juanleyvadelgado@gmail.com>
Tue, 2 Oct 2018 11:14:33 +0000 (13:14 +0200)
In order to make developers easy, we should give some clues about the type of the data generating exceptions.

lib/externallib.php
lib/tests/externallib_test.php

index 50a88f1..1796191 100644 (file)
@@ -397,8 +397,9 @@ class external_api {
                     return (bool)$response;
                 }
             }
+            $responsetype = gettype($response);
             $debuginfo = 'Invalid external api response: the value is "' . $response .
-                    '", the server was expecting "' . $description->type . '" type';
+                    '" of PHP type "' . $responsetype . '", the server was expecting "' . $description->type . '" type';
             try {
                 return validate_param($response, $description->type, $description->allownull, $debuginfo);
             } catch (invalid_parameter_exception $e) {
index 2f1aaf6..e7480dc 100644 (file)
@@ -256,6 +256,27 @@ class core_externallib_testcase extends advanced_testcase {
         $settings->set_filter($currentfilter);
     }
 
+    /**
+     * Test for clean_returnvalue() for testing that returns the PHP type.
+     */
+    public function test_clean_returnvalue_return_php_type() {
+
+        $returndesc = new external_single_structure(
+            array(
+                'value' => new external_value(PARAM_RAW, 'Some text', VALUE_OPTIONAL, null, NULL_NOT_ALLOWED)
+            )
+        );
+
+        // Check return type on exception because the external values does not allow NULL values.
+        $testdata = array('value' => null);
+        try {
+            $cleanedvalue = external_api::clean_returnvalue($returndesc, $testdata);
+        } catch (moodle_exception $e) {
+            $this->assertInstanceOf('invalid_response_exception', $e);
+            $this->assertContains('of PHP type "NULL"', $e->debuginfo);
+        }
+    }
+
     /**
      * Test for clean_returnvalue().
      */