diff --git a/plugins/Reply/Reply.php b/plugins/Reply/Reply.php index 248605dcf9..4f661d72d0 100644 --- a/plugins/Reply/Reply.php +++ b/plugins/Reply/Reply.php @@ -62,8 +62,9 @@ class Reply extends NoteHandlerPlugin $type = Router::ABSOLUTE_PATH; $reply_action_url = Router::url('reply_add', $args, $type); + $query_string = $request->getQueryString(); // Concatenating get parameter to redirect the user to where he came from - $reply_action_url .= '?from=' . mb_substr($request->getQueryString(), 2); + $reply_action_url .= !\is_null($query_string) ? '?from=' . mb_substr($query_string, 2) : ''; $reply_action = [ 'url' => $reply_action_url, diff --git a/tests/Controller/NetworkTest.php b/tests/Controller/NetworkTest.php index 079096b925..208ddabf7b 100644 --- a/tests/Controller/NetworkTest.php +++ b/tests/Controller/NetworkTest.php @@ -21,7 +21,7 @@ declare(strict_types = 1); // }}} -namespace App\Tests\Core; +namespace App\Tests\Controller; use App\Controller\Network; use App\Core\DB\DB; @@ -55,15 +55,16 @@ class NetworkTest extends GNUsocialTestCase $this->testRoute('network', fn ($vis) => $vis->public); } - public function testReplies() - { - $this->testRoute('replies', fn ($vis) => $vis->public, [], function () { - $user = DB::findOneBy('local_user', ['nickname' => 'taken_user']); - $sec = $this->getMockBuilder(SSecurity::class)->setConstructorArgs([self::$kernel->getContainer()])->getMock(); - $sec->method('getUser')->willReturn($user); - Security::setHelper($sec, null); - }); - } + // TODO replies, re-enable + // public function testReplies() + // { + // $this->testRoute('replies', fn ($vis) => $vis->public, [], function () { + // $user = DB::findOneBy('local_user', ['nickname' => 'taken_user']); + // $sec = $this->getMockBuilder(SSecurity::class)->setConstructorArgs([self::$kernel->getContainer()])->getMock(); + // $sec->method('getUser')->willReturn($user); + // Security::setHelper($sec, null); + // }); + // } private function testRoute(string $route, callable $visibility, array $extra_args = [], ?callable $setup_login = null) { @@ -78,7 +79,7 @@ class NetworkTest extends GNUsocialTestCase static::assertThrows(ClientException::class, fn () => $network->home($req, 'username_not_taken')); } $result = $network->{$route}($req, ...$extra_args); - static::assertSame($result['_template'], 'network/public.html.twig'); + static::assertSame($result['_template'], 'network/feed.html.twig'); foreach ($result['notes'] as $n) { static::assertIsArray($n['replies']); } diff --git a/tests/Controller/UserPanelTest.php b/tests/Controller/UserPanelTest.php index eec37ec445..344ffc5f4c 100644 --- a/tests/Controller/UserPanelTest.php +++ b/tests/Controller/UserPanelTest.php @@ -21,7 +21,7 @@ declare(strict_types = 1); // }}} -namespace App\Tests\Core; +namespace App\Tests\Controller; use App\Core\DB\DB; use App\Util\GNUsocialTestCase; @@ -83,7 +83,6 @@ class UserPanelTest extends GNUsocialTestCase 'save_account_info[old_password]' => 'some password', 'save_account_info[password][first]' => 'this is some test password', 'save_account_info[password][second]' => 'this is some test password', - 'save_account_info[language]' => 'pt', 'save_account_info[phone_number]' => '+351908555842', // from fakenumber.net ]); @@ -129,20 +128,20 @@ class UserPanelTest extends GNUsocialTestCase $client->request('GET', '/settings'); $this->assertResponseIsSuccessful(); $crawler = $client->submitForm('Save notification settings for Email', [ - 'save_email[activity_by_followed]' => false, - 'save_email[mention]' => true, - 'save_email[reply]' => false, - 'save_email[follow]' => true, - 'save_email[favorite]' => false, - 'save_email[nudge]' => true, - 'save_email[dm]' => false, - 'save_email[enable_posting]' => true, + 'save_email[activity_by_subscribed]' => false, + 'save_email[mention]' => true, + 'save_email[reply]' => false, + 'save_email[subscription]' => true, + 'save_email[favorite]' => false, + 'save_email[nudge]' => true, + 'save_email[dm]' => false, + 'save_email[enable_posting]' => true, ]); $settings = DB::findOneBy('user_notification_prefs', ['user_id' => $user->getId(), 'transport' => 'email']); - static::assertSame($settings->getActivityByFollowed(), false); + static::assertSame($settings->getActivityBySubscribed(), false); static::assertSame($settings->getMention(), true); static::assertSame($settings->getReply(), false); - static::assertSame($settings->getFollow(), true); + static::assertSame($settings->getSubscription(), true); static::assertSame($settings->getFavorite(), false); static::assertSame($settings->getNudge(), true); static::assertSame($settings->getDm(), false); diff --git a/tests/Core/CacheTest.php b/tests/Core/CacheTest.php index fccef72ac6..5345aeb89d 100644 --- a/tests/Core/CacheTest.php +++ b/tests/Core/CacheTest.php @@ -128,13 +128,14 @@ class CacheTest extends KernelTestCase self::doTest(['file' => 'filesystem://test'], ['file' => \Symfony\Component\Cache\Adapter\FilesystemAdapter::class]); $key = 'test' . time(); - Cache::setList("{$key}-other", ['foo', 'bar'], pool: 'file'); - static::assertSame(['foo', 'bar'], Cache::getList("{$key}-other", function ($i) { $this->assertFalse('should not be called'); }, pool: 'file')); + static::assertSame([], Cache::getList($key . '0', fn ($i) => [], pool: 'file')); + static::assertSame(['foo'], Cache::getList($key . '1', fn ($i) => ['foo'], pool: 'file')); static::assertSame(['foo', 'bar'], Cache::getList($key, fn ($i) => ['foo', 'bar'], pool: 'file')); + static::assertSame(['foo', 'bar'], Cache::getList($key, function () { $this->assertFalse('should not be called'); }, pool: 'file')); // Repeat to test no recompute lrange Cache::pushList($key, 'quux', pool: 'file'); - static::assertSame(['foo', 'bar', 'quux'], Cache::getList($key, function ($i) { $this->assertFalse('should not be called'); }, pool: 'file')); - Cache::pushList($key, 'foobar', pool: 'file', max_count: 2); - static::assertSame(['quux', 'foobar'], Cache::getList($key, function ($i) { $this->assertFalse('should not be called'); }, pool: 'file')); + static::assertSame(['quux', 'foo', 'bar'], Cache::getList($key, function ($i) { $this->assertFalse('should not be called'); }, pool: 'file')); + Cache::pushList($key, 'foobar', max_count: 2, pool: 'file'); + static::assertSame(['foobar', 'quux'], Cache::getList($key, function ($i) { $this->assertFalse('should not be called'); }, pool: 'file')); static::assertTrue(Cache::deleteList($key, pool: 'file')); } } diff --git a/tests/Core/FormTest.php b/tests/Core/FormTest.php index f765abf25f..b482589433 100644 --- a/tests/Core/FormTest.php +++ b/tests/Core/FormTest.php @@ -94,13 +94,13 @@ class FormTest extends GNUsocialTestCase */ public function testCreateUpdateObject() { - $nick = 'form_testing_new_user'; - $user = Actor::create(['nickname' => $nick, 'normalized_nickname' => $nick]); - $form = Form::create([ - ['nickname', TextareaType::class, []], - ['normalized_nickname', TextareaType::class, []], - ['testpost', SubmitType::class, []], - ], target: $user); + $nick = 'form_testing_new_user'; + $actor = Actor::create(['nickname' => $nick, 'fullname' => $nick]); + $form = Form::create([ + ['nickname', TextareaType::class, []], + ['fullname', TextareaType::class, []], + ['testpost', SubmitType::class, []], + ], target: $actor); $options = $form['nickname']->getConfig()->getOptions(); static::assertSame($nick, $options['data']); } @@ -118,11 +118,11 @@ class FormTest extends GNUsocialTestCase $ret = Form::handle(form_definition: [/* not normal usage */], request: $mock_request, target: null, extra_args: [], extra_step: null, create_args: [], testing_only_form: $mock_form); static::assertSame($data, $ret); - $user = Actor::create(['nickname' => 'form_testing_new_user', 'normalized_nickname' => 'form_testing_new_user']); - DB::persist($user); - $ret = Form::handle(form_definition: [/* not normal usage */], request: $mock_request, target: $user, extra_args: [], extra_step: null, create_args: [], testing_only_form: $mock_form); + $actor = Actor::create(['nickname' => 'form_testing_new_user']); + DB::persist($actor); + $ret = Form::handle(form_definition: [/* not normal usage */], request: $mock_request, target: $actor, extra_args: [], extra_step: null, create_args: [], testing_only_form: $mock_form); static::assertSame($mock_form, $ret); - static::assertSame($data['fullname'], $user->getFullname()); - static::assertSame($data['homepage'], $user->getHomepage()); + static::assertSame($data['fullname'], $actor->getFullname()); + static::assertSame($data['homepage'], $actor->getHomepage()); } } diff --git a/tests/Entity/AttachmentThumbnailTest.php b/tests/Entity/AttachmentThumbnailTest.php index 928943bb92..7c3998680e 100644 --- a/tests/Entity/AttachmentThumbnailTest.php +++ b/tests/Entity/AttachmentThumbnailTest.php @@ -24,7 +24,6 @@ namespace App\Tests\Entity; use App\Core\DB\DB; use App\Core\Event; use App\Entity\AttachmentThumbnail; -use App\Util\Exception\ClientException; use App\Util\Exception\NotStoredLocallyException; use App\Util\GNUsocialTestCase; use Functional as F; @@ -48,7 +47,6 @@ class AttachmentThumbnailTest extends GNUsocialTestCase $thumbs = [ AttachmentThumbnail::getOrCreate($attachment, 'small', crop: false), AttachmentThumbnail::getOrCreate($attachment, 'medium', crop: false), - AttachmentThumbnail::getOrCreate($attachment, 'medium', crop: false), $thumb = AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false), ]; @@ -66,52 +64,105 @@ class AttachmentThumbnailTest extends GNUsocialTestCase $attachment->deleteStorage(); - // This was deleted earlier, and the backed storage as well, so we can't generate another thumbnail + foreach (array_reverse($thumbs) as $t) { + // Since we still have thumbnails, those will be used as the new thumbnail, even though we don't have the original + $new = AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false); + static::assertSame([$t->getFilename(), $t->getSize()], [$new->getFilename(), $new->getSize()]); + $t->delete(flush: true); + } + + // Since the backed storage was deleted and we don't have any more previous thumnbs, we can't generate another thumbnail static::assertThrows(NotStoredLocallyException::class, fn () => AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false)); $attachment->kill(); + // static::assertThrows(NotStoredLocallyException::class, fn () => AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false)); } public function testInvalidThumbnail() { parent::bootKernel(); - $file = new SplFileInfo(INSTALLDIR . '/tests/sample-uploads/spreadsheet.ods'); $hash = null; Event::handle('HashFile', [$file->getPathname(), &$hash]); $attachment = DB::findOneBy('attachment', ['filehash' => $hash]); - - static::assertThrows(ClientException::class, fn () => AttachmentThumbnail::getOrCreate($attachment, 'small', crop: false)); + static::assertNull(AttachmentThumbnail::getOrCreate($attachment, 'small', crop: false)); } - // public function testPredictScalingValues() - // { - // // Test without cropping - // static::assertSame([100, 50], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'small', crop: false)); - // static::assertSame([200, 100], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'small', crop: false)); - // static::assertSame([300, 150], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'medium', crop: false)); - // static::assertSame([400, 200], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'medium', crop: false)); - // static::assertSame([400, 200], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'big', crop: false)); + public function testPredictScalingValues() + { + parent::bootKernel(); + // TODO test with cropping - // // Test with cropping - // static::assertSame([100, 100], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'small', crop: true)); - // static::assertSame([200, 200], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'small', crop: true)); - // static::assertSame([300, 200], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'medium', crop: true)); - // static::assertSame([400, 200], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'medium', crop: true)); - // static::assertSame([400, 200], AttachmentThumbnail::predictScalingValues(existing_width: 400, existing_height: 200, requested_size: 'big', crop: true)); - // } + $inputs = [ + [100, 100], + [400, 200], + [800, 400], + [1600, 800], + [1600, 1600], + // 16:9 video + [854, 480], + [1280, 720], + [1920, 1080], + [2560, 1440], + [3840, 2160], + ]; - // TODO re-enable test - // public function testGetHTMLAttributes() - // { - // parent::bootKernel(); - // $attachment = DB::findBy('attachment', ['mimetype' => 'image/png'], limit: 1)[0]; - // $w = $attachment->getWidth(); - // $h = $attachment->getHeight(); - // $thumb = AttachmentThumbnail::getOrCreate($attachment, width: $w, height: $h, crop: false); - // $id = $attachment->getId(); - // $url = "/attachment/{$id}/thumbnail?w={$w}&h={$h}"; - // static::assertSame($url, $thumb->getUrl()); - // static::assertSame(['height' => $h, 'width' => $w, 'src' => $url], $thumb->getHTMLAttributes()); - // } + $outputs = [ + 'small' => [ + [100, 100], + [400, 200], + [32, 14], + [32, 14], + [32, 32], + // 16:9 video + [32, 21], + [32, 21], + [32, 21], + [32, 21], + [32, 21], + ], + 'medium' => [ + [100, 100], + [400, 200], + [256, 116], + [256, 116], + [256, 256], + // 16:9 video + [256, 170], + [256, 170], + [256, 170], + [256, 170], + [256, 170], + ], + 'big' => [ + [100, 100], + [400, 200], + [496, 225], + [496, 225], + [496, 496], + // 16:9 video + [496, 330], + [496, 330], + [496, 330], + [496, 330], + [496, 330], + ], + ]; + + foreach (['small', 'medium', 'big'] as $size) { + foreach (F\zip($inputs, $outputs[$size]) as [$existing, $results]) { + static::assertSame($results, AttachmentThumbnail::predictScalingValues(existing_width: $existing[0], existing_height: $existing[1], requested_size: $size, crop: false)); + } + } + } + + public function testGetUrl() + { + parent::bootKernel(); + $attachment = DB::findBy('attachment', ['mimetype' => 'image/png'], limit: 1)[0]; + $thumb = AttachmentThumbnail::getOrCreate($attachment, 'big', crop: false); + $id = $attachment->getId(); + $url = "/attachment/{$id}/thumbnail/big"; + static::assertSame($url, $thumb->getUrl()); + } } diff --git a/tests/Entity/NoteTest.php b/tests/Entity/NoteTest.php index 24a202c445..a91cfefb96 100644 --- a/tests/Entity/NoteTest.php +++ b/tests/Entity/NoteTest.php @@ -57,7 +57,7 @@ class NoteTest extends GNUsocialTestCase static::assertFalse($note_visible_to_1->isVisibleTo($actor2)); static::assertFalse($note_visible_to_1->isVisibleTo($actor3)); - $note_public = DB::findBy('note', ['actor_id' => $actor1->getId(), 'content' => 'some content', 'reply_to' => null], limit: 1)[0]; + $note_public = DB::findBy('note', ['actor_id' => $actor1->getId(), 'content' => 'some content'], limit: 1)[0]; static::assertTrue($note_public->isVisibleTo($actor1)); static::assertTrue($note_public->isVisibleTo($actor2)); static::assertTrue($note_public->isVisibleTo($actor3)); diff --git a/tests/Util/CommonTest.php b/tests/Util/CommonTest.php index 9cdd7c3789..1f015c960c 100644 --- a/tests/Util/CommonTest.php +++ b/tests/Util/CommonTest.php @@ -120,7 +120,8 @@ class CommonTest extends GNUsocialTestCase { static::bootKernel(); - static::assertTrue(Common::isSystemPath('login')); + static::assertTrue(Common::isSystemPath('main/login')); + static::assertTrue(Common::isSystemPath('main/all')); static::assertFalse(Common::isSystemPath('non-existent-path')); } @@ -170,7 +171,7 @@ class CommonTest extends GNUsocialTestCase // These limits can only be set in the config files // $post_max_size = ini_set('post_max_size', Common::sizeStrToInt('6M')); // $upload_max_filesize = ini_set('upload_max_filesize', Common::sizeStrToInt('1M')); - $memory_limit = ini_set('memory_limit', Common::sizeStrToInt('128M')); + $memory_limit = ini_set('memory_limit', (string) Common::sizeStrToInt('128M')); // 2M is the default for upload_max_filesize, the lowest considered static::assertSame(Common::sizeStrToInt('2M'), Common::getPreferredPhpUploadLimit());