From e0a0df502ee6103e8b3c04b6f74bb72ec334ca7d Mon Sep 17 00:00:00 2001 From: Hugo Sales Date: Tue, 3 Aug 2021 17:53:58 +0000 Subject: [PATCH] [TESTS] Raise test coverage for Attachment controller to 100% --- src/Controller/Attachment.php | 9 +++- tests/Controller/AttachmentTest.php | 84 +++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 tests/Controller/AttachmentTest.php diff --git a/src/Controller/Attachment.php b/src/Controller/Attachment.php index b7343b19e6..8cec064cdf 100644 --- a/src/Controller/Attachment.php +++ b/src/Controller/Attachment.php @@ -44,8 +44,11 @@ class Attachment extends Controller */ private function attachment(int $id, callable $handle) { - if ($id <= 0) { + if ($id <= 0) { // This should never happen coming from the router, but let's bail if it does + // @codeCoverageIgnoreStart + Log::critical("Attachment controller called with {$id}, which should not be possible"); throw new ClientException(_m('No such attachment'), 404); + // @codeCoverageIgnoreEnd } else { if (Event::handle('AttachmentFileInfo', [$id, &$res]) != Event::stop) { // If no one else claims this attachment, use the default representation @@ -56,7 +59,9 @@ class Attachment extends Controller if (!empty($res)) { return $handle($res); } else { + // @codeCoverageIgnoreStart throw new ClientException(_m('No such attachment'), 404); + // @codeCoverageIgnoreEnd } } @@ -112,9 +117,11 @@ class Attachment extends Controller $attachment = DB::findOneBy('attachment', ['id' => $id]); if (!is_null($attachment->getScope())) { + // @codeCoverageIgnoreStart // && ($attachment->scope | VisibilityScope::PUBLIC) != 0 // $user = Common::ensureLoggedIn(); assert(false, 'Attachment scope not implemented'); + // @codeCoverageIgnoreEnd } $default_width = Common::config('thumbnail', 'width'); diff --git a/tests/Controller/AttachmentTest.php b/tests/Controller/AttachmentTest.php new file mode 100644 index 0000000000..866cd6a59d --- /dev/null +++ b/tests/Controller/AttachmentTest.php @@ -0,0 +1,84 @@ +. + +// }}} + +namespace App\Tests\Core; + +use App\Core\DB\DB; +use App\Util\GNUsocialTestCase; + +class AttachmentTest extends GNUsocialTestCase +{ + public function testNoAttachmentID() + { + // This calls static::bootKernel(), and creates a "client" that is acting as the browser + $client = static::createClient(); + $client->request('GET', '/attachment'); + $this->assertResponseStatusCodeSame(404); + $client->request('GET', '/attachment/-1'); + $this->assertResponseStatusCodeSame(404); + $client->request('GET', '/attachment/asd'); + $this->assertResponseStatusCodeSame(404); + $client->request('GET', '/attachment/0'); + // In the meantime, throwing ClientException doesn't actually result in the reaching the UI, as it's intercepted + // by the helpful framework that displays the stack traces and such. This should be easily fixable when we have + // our own error pages + $this->assertSelectorTextContains('.stacktrace', 'ClientException'); + } + + private function testAttachment(string $suffix) + { + $client = static::createClient(); + $attachment = DB::findOneBy('attachment', ['title' => '1x1 JPEG image title']); + $crawler = $client->request('GET', "/attachment/{$attachment->getId()}{$suffix}"); + } + + public function testAttachmentShow() + { + $this->testAttachment(''); + $this->assertResponseIsSuccessful(); + $this->assertSelectorTextContains('figure figcaption', '1x1 JPEG image title'); + } + + public function testAttachmentView() + { + $this->testAttachment('/view'); + $this->assertResponseIsSuccessful(); + } + + public function testAttachmentDownload() + { + $this->testAttachment('/download'); + $this->assertResponseIsSuccessful(); + } + + public function testAttachmentThumbnail() + { + $this->testAttachment('/thumbnail'); + $this->assertResponseIsSuccessful(); + } + + public function testAttachmentThumbnailWrongSize() + { + $this->testAttachment('/thumbnail?w=1&h=1'); + $this->assertSelectorTextContains('.stacktrace', 'ClientException'); + // $this->assertResponseStatusCodeSame(400); + } +}