From dc2a453e940c404fcdfce710b079a024794055fe Mon Sep 17 00:00:00 2001 From: Hugo Sales Date: Sat, 10 Apr 2021 00:27:19 +0000 Subject: [PATCH] [TESTS] Add tests of Common and fix small oddities that pop up --- src/Core/Router/Router.php | 1 + src/Util/Common.php | 43 +++++++-------- tests/Util/Common/CommonTest.php | 33 ------------ tests/Util/CommonTest.php | 93 ++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 54 deletions(-) delete mode 100644 tests/Util/Common/CommonTest.php create mode 100644 tests/Util/CommonTest.php diff --git a/src/Core/Router/Router.php b/src/Core/Router/Router.php index 1eee837b80..13f67cc898 100644 --- a/src/Core/Router/Router.php +++ b/src/Core/Router/Router.php @@ -72,6 +72,7 @@ abstract class Router return self::$url_gen->generate($id, $args, $type); } + /** function match($url) throws Symfony\Component\Routing\Exception\ResourceNotFoundException */ public static function __callStatic(string $name, array $args) { return self::$router->{$name}(...$args); diff --git a/src/Util/Common.php b/src/Util/Common.php index 4f78cb532f..6966580b72 100644 --- a/src/Util/Common.php +++ b/src/Util/Common.php @@ -37,9 +37,9 @@ use App\Core\Security; use App\Entity\GSActor; use App\Entity\LocalUser; use App\Util\Exception\NoLoggedInUser; -use Exception; use Functional as F; use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; use Symfony\Component\Yaml; abstract class Common @@ -69,7 +69,7 @@ abstract class Common { self::$config[$section][$setting] = $value; $diff = self::array_diff_recursive(self::$config, self::$defaults); - $yaml = (new Yaml\Dumper(2))->dump(['parameters' => ['gnusocial' => $diff]], Yaml\Yaml::DUMP_OBJECT_AS_MAP); + $yaml = (new Yaml\Dumper(indentation: 2))->dump(['parameters' => ['gnusocial' => $diff]], Yaml\Yaml::DUMP_OBJECT_AS_MAP); rename(INSTALLDIR . '/social.local.yaml', INSTALLDIR . '/social.local.yaml.back'); file_put_contents(INSTALLDIR . '/social.local.yaml', $yaml); } @@ -132,32 +132,37 @@ abstract class Common try { Router::match('/' . $str); return true; - } catch (Exception $e) { + } catch (ResourceNotFoundException $e) { return false; } } /** * A recursive `array_diff`, while PHP itself doesn't provide one + * + * @param mixed $array1 + * @param mixed $array2 */ - public function array_diff_recursive(array $array1, array $array2) + public static function array_diff_recursive($array1, $array2): array { - $difference = []; + $diff = []; foreach ($array1 as $key => $value) { - if (is_array($value)) { - if (!isset($array2[$key]) || !is_array($array2[$key])) { - $difference[$key] = $value; + if (array_key_exists($key, $array2)) { + if (is_array($value)) { + $recursive_diff = static::array_diff_recursive($value, $array2[$key]); + if (count($recursive_diff)) { + $diff[$key] = $recursive_diff; + } } else { - $new_diff = self::array_diff_recursive($value, $array2[$key]); - if (!empty($new_diff)) { - $difference[$key] = $new_diff; + if ($value != $array2[$key]) { + $diff[$key] = $value; } } - } elseif ((!isset($array2[$key]) || $array2[$key] != $value) && !($array2[$key] === null && $value === null)) { - $difference[$key] = $value; + } else { + $diff[$key] = $value; } } - return $difference ?? false; + return $diff; } /** @@ -223,14 +228,10 @@ abstract class Common /** * Clamps a value between 2 numbers * - * @param int $current - * @param int $min - * @param int $max - * - * @return int clamped value + * @return float|int clamped value */ - public static function clamp(int $current,int $min,int $max): int + public static function clamp(int | float $value, int | float $min, int | float $max): int | float { - return min(max($current,$min),$max); + return min(max($value, $min), $max); } } diff --git a/tests/Util/Common/CommonTest.php b/tests/Util/Common/CommonTest.php deleted file mode 100644 index 9dee04ba31..0000000000 --- a/tests/Util/Common/CommonTest.php +++ /dev/null @@ -1,33 +0,0 @@ -. -// }}} - -namespace App\Tests\Util\Common; - -use App\Util\Common; -use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; - -class CommonTest extends WebTestCase -{ - public function testClamp() - { - static::assertSame(2, Common::clamp(2,0,3)); - static::assertSame(2, Common::clamp(2,2,3)); - static::assertSame(1, Common::clamp(2,0,1)); - static::assertSame(3, Common::clamp(2,3,5)); - } -} diff --git a/tests/Util/CommonTest.php b/tests/Util/CommonTest.php new file mode 100644 index 0000000000..30f54650d8 --- /dev/null +++ b/tests/Util/CommonTest.php @@ -0,0 +1,93 @@ +. +// }}} + +namespace App\Tests\Util\Common; + +use App\Core\Event; +use App\Core\Router\Router; +use App\Util\Common; +use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; +use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; + +class CommonTest extends WebTestCase +{ + public function testClamp() + { + static::assertSame(2, Common::clamp(value: 2, min: 0, max: 3)); + static::assertSame(2, Common::clamp(value: 2, min: 2, max: 3)); + static::assertSame(1, Common::clamp(value: 2, min: 0, max: 1)); + static::assertSame(3, Common::clamp(value: 2, min: 3, max: 5)); + } + + public function testSetConfig() + { + $conf = ['test' => ['hydrogen' => 'helium']]; + $cb = $this->createMock(ContainerBagInterface::class); + static::assertTrue($cb instanceof ContainerBagInterface); + $cb->method('get') + ->willReturnMap([['gnusocial', $conf], ['gnusocial_defaults', $conf]]); + Common::setupConfig($cb); + + if ($exists = file_exists(INSTALLDIR . '/social.local.yaml')) { + copy(INSTALLDIR . '/social.local.yaml', INSTALLDIR . '/social.local.yaml.back_test'); + } else { + touch(INSTALLDIR . '/social.local.yaml'); + } + + static::assertSame('helium', Common::config('test', 'hydrogen')); + Common::setConfig('test', 'hydrogen', 'lithium'); + static::assertSame('lithium', Common::config('test', 'hydrogen')); + + unlink(INSTALLDIR . '/social.local.yaml.back'); + if ($exists) { + rename(INSTALLDIR . '/social.local.yaml.back_test', INSTALLDIR . '/social.local.yaml'); + } + } + + public function testIsSystemPath() + { + static::bootKernel(); + + $router = static::$container->get('router'); + $url_gen = static::$container->get(UrlGeneratorInterface::class); + $event_dispatcher = static::$container->get(EventDispatcherInterface::class); + Router::setRouter($router, $url_gen); + Event::setDispatcher($event_dispatcher); + + static::assertTrue(Common::isSystemPath('login')); + static::assertFalse(Common::isSystemPath('non-existent-path')); + } + + public function testArrayDiffRecursive() + { + static::assertSame(['foo'], Common::array_diff_recursive(['foo'], ['bar'])); + static::assertSame([], Common::array_diff_recursive(['foo'], ['foo'])); + // array_diff(['foo' => []], ['foo' => 'bar']) >>> Array to string conversion + static::assertSame([], Common::array_diff_recursive(['foo' => []], ['foo' => 'bar'])); + static::assertSame([], Common::array_diff_recursive(['foo' => ['bar']], ['foo' => ['bar']])); + static::assertSame(['foo' => [1 => 'quux']], Common::array_diff_recursive(['foo' => ['bar', 'quux']], ['foo' => ['bar']])); + static::assertSame([], Common::array_diff_recursive(['hydrogen' => ['helium' => ['lithium'], 'boron' => 'carbon']], + ['hydrogen' => ['helium' => ['lithium'], 'boron' => 'carbon']])); + static::assertSame(['hydrogen' => ['helium' => ['lithium']]], + Common::array_diff_recursive(['hydrogen' => ['helium' => ['lithium'], 'boron' => 'carbon']], + ['hydrogen' => ['helium' => ['beryllium'], 'boron' => 'carbon']])); + } +}