]> git.mxchange.org Git - friendica.git/commitdiff
Add support for toString/Serializable
authorPhilipp <admin@philipp.info>
Sat, 21 Jan 2023 16:19:35 +0000 (17:19 +0100)
committerPhilipp <admin@philipp.info>
Sat, 21 Jan 2023 18:42:48 +0000 (19:42 +0100)
src/Core/Config/Util/ConfigFileTransformer.php
tests/Util/SerializableObjectDouble.php [new file with mode: 0644]
tests/datasets/config/transformer/object_valid.node.config.php [new file with mode: 0644]
tests/src/Core/Config/Util/ConfigFileTransformerTest.php

index 45e7a5522ba20a57e9755343f9d9b87ab9c1bd6f..f159721644106fb9018d9058f3104c0aa948e7c2 100644 (file)
@@ -214,6 +214,17 @@ class ConfigFileTransformer
                        case "NULL":
                                return "null";
                        case "object":
+                               if (method_exists($value, '__toString')) {
+                                       return sprintf('\'%s\'', $value);
+                               } elseif ($value instanceof \Serializable) {
+                                       try {
+                                               return $value->serialize();
+                                       } catch (\Exception $e) {
+                                               throw new \InvalidArgumentException(sprintf('Cannot serialize %s.', gettype($value)), $e);
+                                       }
+                               } else {
+                                       throw new \InvalidArgumentException(sprintf('%s is an object without stringify.', gettype($value)));
+                               }
                        case "resource":
                        case "resource (closed)":
                                throw new \InvalidArgumentException(sprintf('%s in configs are not supported yet.', gettype($value)));
diff --git a/tests/Util/SerializableObjectDouble.php b/tests/Util/SerializableObjectDouble.php
new file mode 100644 (file)
index 0000000..5c40a04
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @copyright Copyright (C) 2010-2023, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Test\Util;
+
+class SerializableObjectDouble implements \Serializable#
+{
+       public function serialize()
+       {
+               return '\'serialized\'';
+       }
+
+       public function unserialize($data)
+       {
+               return '\'unserialized\'';
+       }
+}
diff --git a/tests/datasets/config/transformer/object_valid.node.config.php b/tests/datasets/config/transformer/object_valid.node.config.php
new file mode 100644 (file)
index 0000000..bfe61f3
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+
+use Friendica\Test\Util\SerializableObjectDouble;
+use ParagonIE\HiddenString\HiddenString;
+
+return [
+       'object' => [
+               'toString' => new HiddenString('test'),
+               'serializable' => new SerializableObjectDouble(),
+       ],
+];
index bb156cf2827f49da05ec3f80f67ee98a10ef9851..e7e8770b6ac4f22380c6cfd224225ebf976f385e 100644 (file)
@@ -23,6 +23,9 @@ namespace Friendica\Test\src\Core\Config\Util;
 
 use Friendica\Core\Config\Util\ConfigFileTransformer;
 use Friendica\Test\MockedTest;
+use Friendica\Test\Util\SerializableObjectDouble;
+use ParagonIE\HiddenString\HiddenString;
+use function PHPUnit\Framework\assertEquals;
 
 class ConfigFileTransformerTest extends MockedTest
 {
@@ -45,9 +48,34 @@ class ConfigFileTransformerTest extends MockedTest
                                'configFile' => (dirname(__DIR__, 4) . '/datasets/config/transformer/object.node.config.php'),
                                'assertException' => true,
                        ],
-                       'ressource_invalid' => [
+                       'ressource' => [
                                'configFile' => (dirname(__DIR__, 4) . '/datasets/config/transformer/ressource.node.config.php'),
-                               'assertException' => true,
+                               'assertException' => false,
+                               'assertion' => <<<EOF
+<?php
+
+return [
+       'ressource' => [
+               'ressources_not_allowed' => '',
+       ],
+];
+
+EOF,
+                       ],
+                       'object_valid' => [
+                               'configFile' => (dirname(__DIR__, 4) . '/datasets/config/transformer/object_valid.node.config.php'),
+                               'assertException' => false,
+                               'assertion' => <<<EOF
+<?php
+
+return [
+       'object' => [
+               'toString' => 'test',
+               'serializable' => 'serialized',
+       ],
+];
+
+EOF,
                        ],
                        'test_types' => [
                                'configFile' => (dirname(__DIR__, 4) . '/datasets/config/transformer/types.node.config.php'),
@@ -63,7 +91,7 @@ class ConfigFileTransformerTest extends MockedTest
         *
         * @dataProvider dataTests
         */
-       public function testConfigFile(string $configFile, bool $assertException = false)
+       public function testConfigFile(string $configFile, bool $assertException = false, $assertion = null)
        {
                $dataArray = include $configFile;
 
@@ -73,6 +101,10 @@ class ConfigFileTransformerTest extends MockedTest
 
                $newConfig = ConfigFileTransformer::encode($dataArray);
 
-               self::assertEquals(file_get_contents($configFile), $newConfig);
+               if (empty($assertion)) {
+                       self::assertEquals(file_get_contents($configFile), $newConfig);
+               } else {
+                       self::assertEquals($assertion, $newConfig);
+               }
        }
 }