From fe652c67f4e4499069cdde576f233c617d394ad7 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 2 Feb 2020 13:15:08 +0100 Subject: [PATCH] Covered with API tests getting invalid short URLs by short code and domain --- .../Action/DeleteShortUrlActionTest.php | 20 +++++++---- .../Action/EditShortUrlActionTest.php | 22 +++++++++---- .../Action/EditShortUrlTagsActionTest.php | 23 +++++++++---- .../test-api/Action/GetVisitsActionTest.php | 20 +++++++---- .../Action/ResolveShortUrlActionTest.php | 22 +++++++++---- .../Utils/NotFoundUrlHelpersTrait.php | 33 +++++++++++++++++++ 6 files changed, 107 insertions(+), 33 deletions(-) create mode 100644 module/Rest/test-api/Utils/NotFoundUrlHelpersTrait.php diff --git a/module/Rest/test-api/Action/DeleteShortUrlActionTest.php b/module/Rest/test-api/Action/DeleteShortUrlActionTest.php index 539c6296..ef32190b 100644 --- a/module/Rest/test-api/Action/DeleteShortUrlActionTest.php +++ b/module/Rest/test-api/Action/DeleteShortUrlActionTest.php @@ -5,15 +5,22 @@ declare(strict_types=1); namespace ShlinkioApiTest\Shlink\Rest\Action; use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase; +use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait; class DeleteShortUrlActionTest extends ApiTestCase { - /** @test */ - public function notFoundErrorIsReturnWhenDeletingInvalidUrl(): void - { - $expectedDetail = 'No URL found with short code "invalid"'; + use NotFoundUrlHelpersTrait; - $resp = $this->callApiWithKey(self::METHOD_DELETE, '/short-urls/invalid'); + /** + * @test + * @dataProvider provideInvalidUrls + */ + public function notFoundErrorIsReturnWhenDeletingInvalidUrl( + string $shortCode, + ?string $domain, + string $expectedDetail + ): void { + $resp = $this->callApiWithKey(self::METHOD_DELETE, $this->buildShortUrlPath($shortCode, $domain)); $payload = $this->getJsonResponsePayload($resp); $this->assertEquals(self::STATUS_NOT_FOUND, $resp->getStatusCode()); @@ -21,7 +28,8 @@ class DeleteShortUrlActionTest extends ApiTestCase $this->assertEquals('INVALID_SHORTCODE', $payload['type']); $this->assertEquals($expectedDetail, $payload['detail']); $this->assertEquals('Short URL not found', $payload['title']); - $this->assertEquals('invalid', $payload['shortCode']); + $this->assertEquals($shortCode, $payload['shortCode']); + $this->assertEquals($domain, $payload['domain'] ?? null); } /** @test */ diff --git a/module/Rest/test-api/Action/EditShortUrlActionTest.php b/module/Rest/test-api/Action/EditShortUrlActionTest.php index aeb1b990..d7d425dc 100644 --- a/module/Rest/test-api/Action/EditShortUrlActionTest.php +++ b/module/Rest/test-api/Action/EditShortUrlActionTest.php @@ -10,12 +10,14 @@ use GuzzleHttp\RequestOptions; use Laminas\Diactoros\Uri; use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase; +use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait; use function GuzzleHttp\Psr7\build_query; use function sprintf; class EditShortUrlActionTest extends ApiTestCase { use ArraySubsetAsserts; + use NotFoundUrlHelpersTrait; /** * @test @@ -69,12 +71,17 @@ class EditShortUrlActionTest extends ApiTestCase return $matchingShortUrl['meta'] ?? null; } - /** @test */ - public function tryingToEditInvalidUrlReturnsNotFoundError(): void - { - $expectedDetail = 'No URL found with short code "invalid"'; - - $resp = $this->callApiWithKey(self::METHOD_PATCH, '/short-urls/invalid', [RequestOptions::JSON => []]); + /** + * @test + * @dataProvider provideInvalidUrls + */ + public function tryingToEditInvalidUrlReturnsNotFoundError( + string $shortCode, + ?string $domain, + string $expectedDetail + ): void { + $url = $this->buildShortUrlPath($shortCode, $domain); + $resp = $this->callApiWithKey(self::METHOD_PATCH, $url, [RequestOptions::JSON => []]); $payload = $this->getJsonResponsePayload($resp); $this->assertEquals(self::STATUS_NOT_FOUND, $resp->getStatusCode()); @@ -82,7 +89,8 @@ class EditShortUrlActionTest extends ApiTestCase $this->assertEquals('INVALID_SHORTCODE', $payload['type']); $this->assertEquals($expectedDetail, $payload['detail']); $this->assertEquals('Short URL not found', $payload['title']); - $this->assertEquals('invalid', $payload['shortCode']); + $this->assertEquals($shortCode, $payload['shortCode']); + $this->assertEquals($domain, $payload['domain'] ?? null); } /** @test */ diff --git a/module/Rest/test-api/Action/EditShortUrlTagsActionTest.php b/module/Rest/test-api/Action/EditShortUrlTagsActionTest.php index f120adf8..0433a388 100644 --- a/module/Rest/test-api/Action/EditShortUrlTagsActionTest.php +++ b/module/Rest/test-api/Action/EditShortUrlTagsActionTest.php @@ -6,9 +6,12 @@ namespace ShlinkioApiTest\Shlink\Rest\Action; use GuzzleHttp\RequestOptions; use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase; +use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait; class EditShortUrlTagsActionTest extends ApiTestCase { + use NotFoundUrlHelpersTrait; + /** @test */ public function notProvidingTagsReturnsBadRequest(): void { @@ -24,12 +27,17 @@ class EditShortUrlTagsActionTest extends ApiTestCase $this->assertEquals('Invalid data', $payload['title']); } - /** @test */ - public function providingInvalidShortCodeReturnsBadRequest(): void - { - $expectedDetail = 'No URL found with short code "invalid"'; - - $resp = $this->callApiWithKey(self::METHOD_PUT, '/short-urls/invalid/tags', [RequestOptions::JSON => [ + /** + * @test + * @dataProvider provideInvalidUrls + */ + public function providingInvalidShortCodeReturnsBadRequest( + string $shortCode, + ?string $domain, + string $expectedDetail + ): void { + $url = $this->buildShortUrlPath($shortCode, $domain, '/tags'); + $resp = $this->callApiWithKey(self::METHOD_PUT, $url, [RequestOptions::JSON => [ 'tags' => ['foo', 'bar'], ]]); $payload = $this->getJsonResponsePayload($resp); @@ -39,7 +47,8 @@ class EditShortUrlTagsActionTest extends ApiTestCase $this->assertEquals('INVALID_SHORTCODE', $payload['type']); $this->assertEquals($expectedDetail, $payload['detail']); $this->assertEquals('Short URL not found', $payload['title']); - $this->assertEquals('invalid', $payload['shortCode']); + $this->assertEquals($shortCode, $payload['shortCode']); + $this->assertEquals($domain, $payload['domain'] ?? null); } /** @test */ diff --git a/module/Rest/test-api/Action/GetVisitsActionTest.php b/module/Rest/test-api/Action/GetVisitsActionTest.php index df4ee6cc..cee466a3 100644 --- a/module/Rest/test-api/Action/GetVisitsActionTest.php +++ b/module/Rest/test-api/Action/GetVisitsActionTest.php @@ -6,18 +6,25 @@ namespace ShlinkioApiTest\Shlink\Rest\Action; use Laminas\Diactoros\Uri; use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase; +use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait; use function GuzzleHttp\Psr7\build_query; use function sprintf; class GetVisitsActionTest extends ApiTestCase { - /** @test */ - public function tryingToGetVisitsForInvalidUrlReturnsNotFoundError(): void - { - $expectedDetail = 'No URL found with short code "invalid"'; + use NotFoundUrlHelpersTrait; - $resp = $this->callApiWithKey(self::METHOD_GET, '/short-urls/invalid/visits'); + /** + * @test + * @dataProvider provideInvalidUrls + */ + public function tryingToGetVisitsForInvalidUrlReturnsNotFoundError( + string $shortCode, + ?string $domain, + string $expectedDetail + ): void { + $resp = $this->callApiWithKey(self::METHOD_GET, $this->buildShortUrlPath($shortCode, $domain, '/visits')); $payload = $this->getJsonResponsePayload($resp); $this->assertEquals(self::STATUS_NOT_FOUND, $resp->getStatusCode()); @@ -25,7 +32,8 @@ class GetVisitsActionTest extends ApiTestCase $this->assertEquals('INVALID_SHORTCODE', $payload['type']); $this->assertEquals($expectedDetail, $payload['detail']); $this->assertEquals('Short URL not found', $payload['title']); - $this->assertEquals('invalid', $payload['shortCode']); + $this->assertEquals($shortCode, $payload['shortCode']); + $this->assertEquals($domain, $payload['domain'] ?? null); } /** diff --git a/module/Rest/test-api/Action/ResolveShortUrlActionTest.php b/module/Rest/test-api/Action/ResolveShortUrlActionTest.php index 27d9dd69..d76d7946 100644 --- a/module/Rest/test-api/Action/ResolveShortUrlActionTest.php +++ b/module/Rest/test-api/Action/ResolveShortUrlActionTest.php @@ -7,11 +7,14 @@ namespace ShlinkioApiTest\Shlink\Rest\Action; use Cake\Chronos\Chronos; use GuzzleHttp\RequestOptions; use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase; +use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait; use function sprintf; class ResolveShortUrlActionTest extends ApiTestCase { + use NotFoundUrlHelpersTrait; + /** * @test * @dataProvider provideDisabledMeta @@ -40,12 +43,16 @@ class ResolveShortUrlActionTest extends ApiTestCase yield 'maxVisits reached' => [['maxVisits' => 1]]; } - /** @test */ - public function tryingToResolveInvalidUrlReturnsNotFoundError(): void - { - $expectedDetail = 'No URL found with short code "invalid"'; - - $resp = $this->callApiWithKey(self::METHOD_GET, '/short-urls/invalid'); + /** + * @test + * @dataProvider provideInvalidUrls + */ + public function tryingToResolveInvalidUrlReturnsNotFoundError( + string $shortCode, + ?string $domain, + string $expectedDetail + ): void { + $resp = $this->callApiWithKey(self::METHOD_GET, $this->buildShortUrlPath($shortCode, $domain)); $payload = $this->getJsonResponsePayload($resp); $this->assertEquals(self::STATUS_NOT_FOUND, $resp->getStatusCode()); @@ -53,6 +60,7 @@ class ResolveShortUrlActionTest extends ApiTestCase $this->assertEquals('INVALID_SHORTCODE', $payload['type']); $this->assertEquals($expectedDetail, $payload['detail']); $this->assertEquals('Short URL not found', $payload['title']); - $this->assertEquals('invalid', $payload['shortCode']); + $this->assertEquals($shortCode, $payload['shortCode']); + $this->assertEquals($domain, $payload['domain'] ?? null); } } diff --git a/module/Rest/test-api/Utils/NotFoundUrlHelpersTrait.php b/module/Rest/test-api/Utils/NotFoundUrlHelpersTrait.php new file mode 100644 index 00000000..fab658f0 --- /dev/null +++ b/module/Rest/test-api/Utils/NotFoundUrlHelpersTrait.php @@ -0,0 +1,33 @@ + ['invalid', null, 'No URL found with short code "invalid"']; + yield 'invalid shortcode + domain' => [ + 'abc123', + 'example.com', + 'No URL found with short code "abc123" for domain "example.com"', + ]; + } + + public function buildShortUrlPath(string $shortCode, ?string $domain, string $suffix = ''): string + { + $url = new Uri(sprintf('/short-urls/%s%s', $shortCode, $suffix)); + if ($domain !== null) { + $url = $url->withQuery(build_query(['domain' => $domain])); + } + + return (string) $url; + } +}