[TESTS] Add tests of Common and fix small oddities that pop up

This commit is contained in:
Hugo Sales 2021-04-10 00:27:19 +00:00
parent b387ea9aa0
commit dc2a453e94
No known key found for this signature in database
GPG Key ID: 7D0C7EAFC9D835A0
4 changed files with 116 additions and 54 deletions

View File

@ -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);

View File

@ -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);
}
}

View File

@ -1,33 +0,0 @@
<?php
// {{{ License
// This file is part of GNU social - https://www.gnu.org/software/social
//
// GNU social 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.
//
// GNU social 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 GNU social. If not, see <http://www.gnu.org/licenses/>.
// }}}
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));
}
}

93
tests/Util/CommonTest.php Normal file
View File

@ -0,0 +1,93 @@
<?php
// {{{ License
// This file is part of GNU social - https://www.gnu.org/software/social
//
// GNU social 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.
//
// GNU social 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 GNU social. If not, see <http://www.gnu.org/licenses/>.
// }}}
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']]));
}
}