CommonTest.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. // {{{ License
  3. // This file is part of GNU social - https://www.gnu.org/software/social
  4. //
  5. // GNU social is free software: you can redistribute it and/or modify
  6. // it under the terms of the GNU Affero General Public License as published by
  7. // the Free Software Foundation, either version 3 of the License, or
  8. // (at your option) any later version.
  9. //
  10. // GNU social is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. // GNU Affero General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU Affero General Public License
  16. // along with GNU social. If not, see <http://www.gnu.org/licenses/>.
  17. // }}}
  18. namespace App\Tests\Util;
  19. use App\Core\DB\DB;
  20. use App\Core\Security;
  21. use App\Entity\GSActor;
  22. use App\Entity\LocalUser;
  23. use App\Util\Common;
  24. use App\Util\Exception\NoLoggedInUser;
  25. use App\Util\GNUsocialTestCase;
  26. use Doctrine\ORM\EntityManager;
  27. use Doctrine\ORM\Mapping\ClassMetadataFactory;
  28. use Doctrine\ORM\Mapping\ClassMetadataInfo;
  29. use Jchook\AssertThrows\AssertThrows;
  30. use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
  31. use Symfony\Component\Security\Core\Security as SSecurity;
  32. class CommonTest extends GNUsocialTestCase
  33. {
  34. use AssertThrows;
  35. public function testSetConfig()
  36. {
  37. $conf = ['test' => ['hydrogen' => 'helium']];
  38. $cb = $this->createMock(ContainerBagInterface::class);
  39. static::assertTrue($cb instanceof ContainerBagInterface);
  40. $cb->method('get')
  41. ->willReturnMap([['gnusocial', $conf], ['gnusocial_defaults', $conf]]);
  42. Common::setupConfig($cb);
  43. if ($exists = file_exists(INSTALLDIR . '/social.local.yaml')) {
  44. copy(INSTALLDIR . '/social.local.yaml', INSTALLDIR . '/social.local.yaml.back_test');
  45. } else {
  46. touch(INSTALLDIR . '/social.local.yaml');
  47. }
  48. static::assertSame('helium', Common::config('test', 'hydrogen'));
  49. Common::setConfig('test', 'hydrogen', 'lithium');
  50. static::assertSame('lithium', Common::config('test', 'hydrogen'));
  51. static::assertSame($conf, Common::getConfigDefaults());
  52. unlink(INSTALLDIR . '/social.local.yaml.back');
  53. if ($exists) {
  54. rename(INSTALLDIR . '/social.local.yaml.back_test', INSTALLDIR . '/social.local.yaml');
  55. }
  56. }
  57. /**
  58. * Test Common::user, Common::actor and such. Requires a lot of setup
  59. */
  60. public function testUserAndActorGetters()
  61. {
  62. $client = static::createClient();
  63. static::assertNull(Common::user());
  64. static::assertThrows(NoLoggedInUser::class, fn () => Common::ensureLoggedIn());
  65. static::assertFalse(Common::isLoggedIn());
  66. $metadata = $this->createMock(ClassMetadataInfo::class);
  67. $metadata->method('getTableName')->willReturn('gsactor');
  68. $metadata->method('getMetadataValue')->willReturn('App\Entity\GSActor');
  69. $factory = $this->createMock(ClassMetadataFactory::class);
  70. $factory->method('getAllMetadata')->willReturn([$metadata]);
  71. $actor = GSActor::create(['nickname' => 'nick']);
  72. $actor->setId(0);
  73. $em = $this->createMock(EntityManager::class);
  74. $em->method('find')->willReturn($actor);
  75. $em->method('getMetadataFactory')->willReturn($factory);
  76. DB::setManager($em);
  77. DB::initTableMap();
  78. $user = LocalUser::create(['nickname' => 'nick']);
  79. $user->setId(0);
  80. $sec = $this->getMockBuilder(SSecurity::class)->setConstructorArgs([self::$kernel->getContainer()])->getMock();
  81. $sec->method('getUser')->willReturn($user);
  82. Security::setHelper($sec, null);
  83. // $cookies = $client->loginUser($user)->getCookieJar();
  84. // $cookies->get('MOCKSESSID')->getValue();
  85. static::assertSame($user, Common::user());
  86. static::assertSame($actor, Common::actor());
  87. static::assertSame('nick', Common::userNickname());
  88. static::assertSame(0, Common::userId());
  89. static::assertSame($user, Common::ensureLoggedIn());
  90. static::assertTrue(Common::isLoggedIn());
  91. }
  92. public function testIsSystemPath()
  93. {
  94. static::bootKernel();
  95. static::assertTrue(Common::isSystemPath('login'));
  96. static::assertFalse(Common::isSystemPath('non-existent-path'));
  97. }
  98. public function testArrayDiffRecursive()
  99. {
  100. static::assertSame(['foo'], Common::arrayDiffRecursive(['foo'], ['bar']));
  101. static::assertSame([], Common::arrayDiffRecursive(['foo'], ['foo']));
  102. // array_diff(['foo' => []], ['foo' => 'bar']) >>> Array to string conversion
  103. static::assertSame([], Common::arrayDiffRecursive(['foo' => []], ['foo' => 'bar']));
  104. static::assertSame([], Common::arrayDiffRecursive(['foo' => ['bar']], ['foo' => ['bar']]));
  105. static::assertSame(['foo' => [1 => 'quux']], Common::arrayDiffRecursive(['foo' => ['bar', 'quux']], ['foo' => ['bar']]));
  106. static::assertSame([], Common::arrayDiffRecursive(['hydrogen' => ['helium' => ['lithium'], 'boron' => 'carbon']],
  107. ['hydrogen' => ['helium' => ['lithium'], 'boron' => 'carbon']]));
  108. static::assertSame(['hydrogen' => ['helium' => ['lithium']]],
  109. Common::arrayDiffRecursive(['hydrogen' => ['helium' => ['lithium'], 'boron' => 'carbon']],
  110. ['hydrogen' => ['helium' => ['beryllium'], 'boron' => 'carbon']]));
  111. }
  112. public function testArrayRemoveKeys()
  113. {
  114. static::assertSame([1 => 'helium'], Common::arrayRemoveKeys(['hydrogen', 'helium'], [0]));
  115. static::assertSame(['helium' => 'bar'], Common::arrayRemoveKeys(['hydrogen' => 'foo', 'helium' => 'bar'], ['hydrogen']));
  116. }
  117. public function testSizeStrToInt()
  118. {
  119. static::assertSame(pow(1024, 0), Common::sizeStrToInt('1'));
  120. static::assertSame(pow(1024, 1), Common::sizeStrToInt('1K'));
  121. static::assertSame(pow(1024, 2), Common::sizeStrToInt('1M'));
  122. static::assertSame(3 * pow(1024, 2), Common::sizeStrToInt(''));
  123. static::assertSame(pow(1024, 3), Common::sizeStrToInt('1G'));
  124. static::assertSame(pow(1024, 4), Common::sizeStrToInt('1T'));
  125. static::assertSame(pow(1024, 5), Common::sizeStrToInt('1P'));
  126. static::assertSame(128, Common::sizeStrToInt('128'));
  127. static::assertSame(128 * 1024, Common::sizeStrToInt('128K'));
  128. static::assertSame(128 * 1024, Common::sizeStrToInt('128.5K'));
  129. }
  130. public function testGetPreferredPhpUploadLimit()
  131. {
  132. $post_max_size = ini_set('post_max_size', 1);
  133. $upload_max_filesize = ini_set('upload_max_filesize', 1);
  134. $memory_limit = ini_set('memory_limit', 1);
  135. static::assertSame(1, Common::getPreferredPhpUploadLimit());
  136. ini_set('post_max_size', $post_max_size);
  137. ini_set('upload_max_filesize', $upload_max_filesize);
  138. ini_set('memory_limit', $memory_limit);
  139. }
  140. public function testClamp()
  141. {
  142. static::assertSame(2, Common::clamp(value: 2, min: 0, max: 3));
  143. static::assertSame(2, Common::clamp(value: 2, min: 2, max: 3));
  144. static::assertSame(1, Common::clamp(value: 2, min: 0, max: 1));
  145. static::assertSame(3, Common::clamp(value: 2, min: 3, max: 5));
  146. static::assertSame(3.5, Common::clamp(value: 2.75, min: 3.5, max: 5.1));
  147. }
  148. public function testIsValidHttpUrl()
  149. {
  150. static::assertFalse(Common::isValidHttpUrl(''));
  151. static::assertTrue(Common::isValidHttpUrl('http://gnu.org'));
  152. static::assertFalse(Common::isValidHttpUrl('http://gnu.org', ensure_secure: true));
  153. static::assertTrue(Common::isValidHttpUrl('https://gnu.org'));
  154. static::assertTrue(Common::isValidHttpUrl('https://gnu.org', ensure_secure: true));
  155. }
  156. }