Replace traits with external data providers in API tests

This commit is contained in:
Alejandro Celaya 2023-06-18 10:36:45 +02:00
parent 3b1f6c69de
commit dc4aab2cab
7 changed files with 60 additions and 41 deletions

View File

@ -148,6 +148,10 @@
"@test:unit:ci",
"@infect:ci:unit"
],
"infect:test:db": [
"@test:db:sqlite:ci",
"@infect:ci:db"
],
"infect:test:api": [
"@test:api:ci",
"@infect:ci:api"

View File

@ -5,24 +5,28 @@ declare(strict_types=1);
namespace ShlinkioApiTest\Shlink\Rest\Action;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\DataProviderExternal;
use PHPUnit\Framework\Attributes\Test;
use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase;
use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait;
use ShlinkioApiTest\Shlink\Rest\Utils\ApiTestDataProviders;
use ShlinkioApiTest\Shlink\Rest\Utils\UrlBuilder;
use function sprintf;
class DeleteShortUrlTest extends ApiTestCase
{
use NotFoundUrlHelpersTrait;
#[Test, DataProvider('provideInvalidUrls')]
#[Test, DataProviderExternal(ApiTestDataProviders::class, 'invalidUrlsProvider')]
public function notFoundErrorIsReturnWhenDeletingInvalidUrl(
string $shortCode,
?string $domain,
string $expectedDetail,
string $apiKey,
): void {
$resp = $this->callApiWithKey(self::METHOD_DELETE, $this->buildShortUrlPath($shortCode, $domain), [], $apiKey);
$resp = $this->callApiWithKey(
self::METHOD_DELETE,
UrlBuilder::buildShortUrlPath($shortCode, $domain),
apiKey: $apiKey,
);
$payload = $this->getJsonResponsePayload($resp);
self::assertEquals(self::STATUS_NOT_FOUND, $resp->getStatusCode());

View File

@ -9,16 +9,16 @@ use GuzzleHttp\Psr7\Query;
use GuzzleHttp\RequestOptions;
use Laminas\Diactoros\Uri;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\DataProviderExternal;
use PHPUnit\Framework\Attributes\Test;
use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase;
use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait;
use ShlinkioApiTest\Shlink\Rest\Utils\ApiTestDataProviders;
use ShlinkioApiTest\Shlink\Rest\Utils\UrlBuilder;
use function sprintf;
class EditShortUrlTest extends ApiTestCase
{
use NotFoundUrlHelpersTrait;
#[Test, DataProvider('provideMeta')]
public function metadataCanBeReset(array $meta): void
{
@ -99,14 +99,14 @@ class EditShortUrlTest extends ApiTestCase
yield 'invalid URL' => ['http://foo', self::STATUS_BAD_REQUEST, 'INVALID_URL'];
}
#[Test, DataProvider('provideInvalidUrls')]
#[Test, DataProviderExternal(ApiTestDataProviders::class, 'invalidUrlsProvider')]
public function tryingToEditInvalidUrlReturnsNotFoundError(
string $shortCode,
?string $domain,
string $expectedDetail,
string $apiKey,
): void {
$url = $this->buildShortUrlPath($shortCode, $domain);
$url = UrlBuilder::buildShortUrlPath($shortCode, $domain);
$resp = $this->callApiWithKey(self::METHOD_PATCH, $url, [RequestOptions::JSON => []], $apiKey);
$payload = $this->getJsonResponsePayload($resp);

View File

@ -7,16 +7,16 @@ namespace ShlinkioApiTest\Shlink\Rest\Action;
use Cake\Chronos\Chronos;
use GuzzleHttp\RequestOptions;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\DataProviderExternal;
use PHPUnit\Framework\Attributes\Test;
use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase;
use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait;
use ShlinkioApiTest\Shlink\Rest\Utils\ApiTestDataProviders;
use ShlinkioApiTest\Shlink\Rest\Utils\UrlBuilder;
use function sprintf;
class ResolveShortUrlTest extends ApiTestCase
{
use NotFoundUrlHelpersTrait;
#[Test, DataProvider('provideDisabledMeta')]
public function shortUrlIsProperlyResolvedEvenWhenNotEnabled(array $disabledMeta): void
{
@ -42,14 +42,18 @@ class ResolveShortUrlTest extends ApiTestCase
yield 'maxVisits reached' => [['maxVisits' => 1]];
}
#[Test, DataProvider('provideInvalidUrls')]
#[Test, DataProviderExternal(ApiTestDataProviders::class, 'invalidUrlsProvider')]
public function tryingToResolveInvalidUrlReturnsNotFoundError(
string $shortCode,
?string $domain,
string $expectedDetail,
string $apiKey,
): void {
$resp = $this->callApiWithKey(self::METHOD_GET, $this->buildShortUrlPath($shortCode, $domain), [], $apiKey);
$resp = $this->callApiWithKey(
self::METHOD_GET,
UrlBuilder::buildShortUrlPath($shortCode, $domain),
apiKey: $apiKey,
);
$payload = $this->getJsonResponsePayload($resp);
self::assertEquals(self::STATUS_NOT_FOUND, $resp->getStatusCode());

View File

@ -7,18 +7,18 @@ namespace ShlinkioApiTest\Shlink\Rest\Action;
use GuzzleHttp\Psr7\Query;
use Laminas\Diactoros\Uri;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\DataProviderExternal;
use PHPUnit\Framework\Attributes\Test;
use Shlinkio\Shlink\Common\Paginator\Paginator;
use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase;
use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait;
use ShlinkioApiTest\Shlink\Rest\Utils\ApiTestDataProviders;
use ShlinkioApiTest\Shlink\Rest\Utils\UrlBuilder;
use function sprintf;
class ShortUrlVisitsTest extends ApiTestCase
{
use NotFoundUrlHelpersTrait;
#[Test, DataProvider('provideInvalidUrls')]
#[Test, DataProviderExternal(ApiTestDataProviders::class, 'invalidUrlsProvider')]
public function tryingToGetVisitsForInvalidUrlReturnsNotFoundError(
string $shortCode,
?string $domain,
@ -27,9 +27,8 @@ class ShortUrlVisitsTest extends ApiTestCase
): void {
$resp = $this->callApiWithKey(
self::METHOD_GET,
$this->buildShortUrlPath($shortCode, $domain, '/visits'),
[],
$apiKey,
UrlBuilder::buildShortUrlPath($shortCode, $domain, '/visits'),
apiKey: $apiKey,
);
$payload = $this->getJsonResponsePayload($resp);

View File

@ -4,14 +4,9 @@ declare(strict_types=1);
namespace ShlinkioApiTest\Shlink\Rest\Utils;
use GuzzleHttp\Psr7\Query;
use Laminas\Diactoros\Uri;
use function sprintf;
trait NotFoundUrlHelpersTrait
class ApiTestDataProviders
{
public static function provideInvalidUrls(): iterable
public static function invalidUrlsProvider(): iterable
{
yield 'invalid shortcode' => ['invalid', null, 'No URL found with short code "invalid"', 'valid_api_key'];
yield 'invalid shortcode without domain' => [
@ -20,7 +15,7 @@ trait NotFoundUrlHelpersTrait
'No URL found with short code "abc123" for domain "example.com"',
'valid_api_key',
];
yield 'invalid shortcode + domain' => [
yield 'invalid shortcode and custom domain' => [
'custom-with-domain',
'example.com',
'No URL found with short code "custom-with-domain" for domain "example.com"',
@ -32,21 +27,11 @@ trait NotFoundUrlHelpersTrait
'No URL found with short code "ghi789"',
'author_api_key',
];
yield 'valid shortcode + domain with invalid API key' => [
yield 'valid shortcode and custom domain with invalid API key' => [
'custom-with-domain',
'some-domain.com',
'No URL found with short code "custom-with-domain" for domain "some-domain.com"',
'domain_api_key',
];
}
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(Query::build(['domain' => $domain]));
}
return (string) $url;
}
}

View File

@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
namespace ShlinkioApiTest\Shlink\Rest\Utils;
use GuzzleHttp\Psr7\Query;
use Laminas\Diactoros\Uri;
use function sprintf;
class UrlBuilder
{
public static 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(Query::build(['domain' => $domain]));
}
return $url->__toString();
}
}