Created
February 3, 2015 07:56
-
-
Save kimegede/e9cbc05614de03a8a93e to your computer and use it in GitHub Desktop.
Fixing cast numbers in Crud v3 https://github.com/FriendsOfCake/crud/pull/245
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 09c35fd7ffbd874db1857bbcb55f0ba0a436672e Mon Sep 17 00:00:00 2001 | |
From: Kim Egede Jakobsen <kimegede@gmail.com> | |
Date: Mon, 2 Feb 2015 23:00:30 +0100 | |
Subject: [PATCH 1/2] Test showing casting string there will be changed to | |
infinity will fail when json_encoded() | |
--- | |
.../Listener/ApiTransformationListenerTest.php | 43 ++++++++++++++++++++++ | |
1 file changed, 43 insertions(+) | |
diff --git a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | |
index 902fe22..63ca16a 100644 | |
--- a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | |
+++ b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | |
@@ -1438,4 +1438,47 @@ class ApiTransformationListenerTest extends CrudTestCase { | |
$this->assertSame($expected, $result); | |
} | |
+ | |
+/** | |
+ * Testing a huge integer with castNumbers & json_encode() | |
+ * | |
+ * @see http://php.net/manual/en/function.json-last-error.php (JSON_ERROR_INF_OR_NAN) | |
+ * @return void | |
+ */ | |
+ public function testCastNumbersWithInfinity() { | |
+ $listener = $this | |
+ ->getMockBuilder('ApiTransformationListener') | |
+ ->disableOriginalConstructor() | |
+ ->getMock(); | |
+ | |
+ $settings = array( | |
+ 'changeNesting' => false, | |
+ 'changeKeys' => false, | |
+ 'changeTime' => false, | |
+ 'castNumbers' => true, | |
+ 'keyMethods' => array(), | |
+ 'valueMethods' => array('_castNumbers'), | |
+ 'replaceMap' => array() | |
+ ); | |
+ | |
+ $this->setReflectionClassInstance($listener); | |
+ $this->setProtectedProperty('_settings', $settings, $listener); | |
+ | |
+ $data = array( | |
+ 'CastNumber' => array('infinity' => '0113870020e12235'), | |
+ ); | |
+ | |
+ $expected = array( | |
+ 'CastNumber' => array( | |
+ 'infinity' => INF | |
+ ) | |
+ ); | |
+ | |
From 09c35fd7ffbd874db1857bbcb55f0ba0a436672e Mon Sep 17 00:00:00 2001 | |
From: Kim Egede Jakobsen <kimegede@gmail.com> | |
Date: Mon, 2 Feb 2015 23:00:30 +0100 | |
Subject: [PATCH 1/2] Test showing casting string there will be changed to | |
infinity will fail when json_encoded() | |
--- | |
.../Listener/ApiTransformationListenerTest.php | 43 ++++++++++++++++++++++ | |
1 file changed, 43 insertions(+) | |
diff --git a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | |
index 902fe22..63ca16a 100644 | |
--- a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | |
+++ b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | |
@@ -1438,4 +1438,47 @@ class ApiTransformationListenerTest extends CrudTestCase { | |
$this->assertSame($expected, $result); | |
} | |
+ | |
+/** | |
+ * Testing a huge integer with castNumbers & json_encode() | |
+ * | |
+ * @see http://php.net/manual/en/function.json-last-error.php (JSON_ERROR_INF_OR_NAN) | |
+ * @return void | |
+ */ | |
+ public function testCastNumbersWithInfinity() { | |
+ $listener = $this | |
+ ->getMockBuilder('ApiTransformationListener') | |
+ ->disableOriginalConstructor() | |
+ ->getMock(); | |
+ | |
+ $settings = array( | |
+ 'changeNesting' => false, | |
+ 'changeKeys' => false, | |
+ 'changeTime' => false, | |
+ 'castNumbers' => true, | |
+ 'keyMethods' => array(), | |
+ 'valueMethods' => array('_castNumbers'), | |
+ 'replaceMap' => array() | |
+ ); | |
+ | |
+ $this->setReflectionClassInstance($listener); | |
+ $this->setProtectedProperty('_settings', $settings, $listener); | |
+ | |
+ $data = array( | |
+ 'CastNumber' => array('infinity' => '0113870020e12235'), | |
+ ); | |
+ | |
+ $expected = array( | |
+ 'CastNumber' => array( | |
+ 'infinity' => INF | |
+ ) | |
+ ); | |
+ | |
+ $this->callProtectedMethod('_recurse', array(&$data), $listener); | |
+ | |
+ $this->assertSame($expected, $data); | |
+ | |
+ $this->assertFalse(json_encode($expected), 'json encoding INF failed'); | |
+ $this->assertSame(JSON_ERROR_INF_OR_NAN, json_last_error(), 'json encoding INF failed'); | |
+ } | |
} | |
-- | |
1.8.3.2 | |
From fafa20ee517b8fd9636d8ec0ca9dead3b8abbbf5 Mon Sep 17 00:00:00 2001 | |
From: Kim Egede Jakobsen <kimegede@gmail.com> | |
Date: Mon, 2 Feb 2015 23:09:56 +0100 | |
Subject: [PATCH 2/2] Validate numbers is below infinity, before json_encoding | |
it. | |
--- | |
Controller/Crud/Listener/ApiTransformationListener.php | 6 +++++- | |
.../Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | 5 ++--- | |
2 files changed, 7 insertions(+), 4 deletions(-) | |
diff --git a/Controller/Crud/Listener/ApiTransformationListener.php b/Controller/Crud/Listener/ApiTransformationListener.php | |
index 99605bc..4a5a861 100644 | |
--- a/Controller/Crud/Listener/ApiTransformationListener.php | |
+++ b/Controller/Crud/Listener/ApiTransformationListener.php | |
@@ -302,7 +302,11 @@ class ApiTransformationListener extends CrudListener { | |
if (!is_numeric($variable)) { | |
return $variable; | |
} | |
- return $variable + 0; | |
+ | |
+ $hintTyped = $variable + 0; | |
+ | |
+ // Check if variable is below infinity | |
+ return ($hintTyped < INF) ? $hintTyped : $variable; | |
} | |
/** | |
diff --git a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | |
index 63ca16a..6926495 100644 | |
--- a/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | |
+++ b/Test/Case/Controller/Crud/Listener/ApiTransformationListenerTest.php | |
@@ -1470,7 +1470,7 @@ class ApiTransformationListenerTest extends CrudTestCase { | |
$expected = array( | |
'CastNumber' => array( | |
- 'infinity' => INF | |
+ 'infinity' => '0113870020e12235' | |
) | |
); | |
@@ -1478,7 +1478,6 @@ class ApiTransformationListenerTest extends CrudTestCase { | |
$this->assertSame($expected, $data); | |
- $this->assertFalse(json_encode($expected), 'json encoding INF failed'); | |
- $this->assertSame(JSON_ERROR_INF_OR_NAN, json_last_error(), 'json encoding INF failed'); | |
+ $this->assertSame(json_encode($expected), json_encode($data), 'Infinity values does not break json encode'); | |
} | |
} | |
-- | |
1.8.3.2 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment