Test behavior to track redirect URL

This commit is contained in:
Alejandro Celaya 2024-11-24 14:05:33 +01:00
parent 86cc2b717c
commit 85065c9330
5 changed files with 45 additions and 12 deletions

View File

@ -12,6 +12,7 @@ use function Shlinkio\Shlink\Core\geolocationFromRequest;
use function Shlinkio\Shlink\Core\ipAddressFromRequest;
use function Shlinkio\Shlink\Core\isCrawler;
use function substr;
use const Shlinkio\Shlink\REDIRECT_URL_REQUEST_ATTRIBUTE;
final readonly class Visitor

View File

@ -16,6 +16,8 @@ use Shlinkio\Shlink\Core\ShortUrl\Model\ShortUrlIdentifier;
use Shlinkio\Shlink\Core\ShortUrl\ShortUrlResolverInterface;
use Shlinkio\Shlink\Core\Visit\RequestTrackerInterface;
use const Shlinkio\Shlink\REDIRECT_URL_REQUEST_ATTRIBUTE;
class PixelActionTest extends TestCase
{
private PixelAction $action;
@ -34,12 +36,17 @@ class PixelActionTest extends TestCase
public function imageIsReturned(): void
{
$shortCode = 'abc123';
$shortUrl = ShortUrl::withLongUrl('http://domain.com/foo/bar');
$request = (new ServerRequest())->withAttribute('shortCode', $shortCode);
$this->urlResolver->expects($this->once())->method('resolveEnabledShortUrl')->with(
ShortUrlIdentifier::fromShortCodeAndDomain($shortCode, ''),
)->willReturn(ShortUrl::withLongUrl('http://domain.com/foo/bar'));
$this->requestTracker->expects($this->once())->method('trackIfApplicable')->withAnyParameters();
)->willReturn($shortUrl);
$this->requestTracker->expects($this->once())->method('trackIfApplicable')->with(
$shortUrl,
$request->withAttribute(REDIRECT_URL_REQUEST_ATTRIBUTE, null),
);
$request = (new ServerRequest())->withAttribute('shortCode', $shortCode);
$response = $this->action->process($request, $this->createMock(RequestHandlerInterface::class));
self::assertInstanceOf(PixelResponse::class, $response);

View File

@ -19,6 +19,8 @@ use Shlinkio\Shlink\Core\ShortUrl\ShortUrlResolverInterface;
use Shlinkio\Shlink\Core\Util\RedirectResponseHelperInterface;
use Shlinkio\Shlink\Core\Visit\RequestTrackerInterface;
use const Shlinkio\Shlink\REDIRECT_URL_REQUEST_ATTRIBUTE;
class RedirectActionTest extends TestCase
{
private const LONG_URL = 'https://domain.com/foo/bar?some=thing';
@ -50,16 +52,20 @@ class RedirectActionTest extends TestCase
{
$shortCode = 'abc123';
$shortUrl = ShortUrl::withLongUrl(self::LONG_URL);
$expectedResp = new Response\RedirectResponse(self::LONG_URL);
$request = (new ServerRequest())->withAttribute('shortCode', $shortCode);
$this->urlResolver->expects($this->once())->method('resolveEnabledShortUrl')->with(
ShortUrlIdentifier::fromShortCodeAndDomain($shortCode, ''),
)->willReturn($shortUrl);
$this->requestTracker->expects($this->once())->method('trackIfApplicable');
$expectedResp = new Response\RedirectResponse(self::LONG_URL);
$this->requestTracker->expects($this->once())->method('trackIfApplicable')->with(
$shortUrl,
$request->withAttribute(REDIRECT_URL_REQUEST_ATTRIBUTE, self::LONG_URL),
);
$this->redirectRespHelper->expects($this->once())->method('buildRedirectResponse')->with(
self::LONG_URL,
)->willReturn($expectedResp);
$request = (new ServerRequest())->withAttribute('shortCode', $shortCode);
$response = $this->action->process($request, $this->createMock(RequestHandlerInterface::class));
self::assertSame($expectedResp, $response);

View File

@ -4,7 +4,9 @@ declare(strict_types=1);
namespace ShlinkioTest\Shlink\Core\ErrorHandler;
use Laminas\Diactoros\Response;
use Laminas\Diactoros\ServerRequestFactory;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
@ -14,6 +16,8 @@ use Shlinkio\Shlink\Core\ErrorHandler\Model\NotFoundType;
use Shlinkio\Shlink\Core\ErrorHandler\NotFoundTrackerMiddleware;
use Shlinkio\Shlink\Core\Visit\RequestTrackerInterface;
use const Shlinkio\Shlink\REDIRECT_URL_REQUEST_ATTRIBUTE;
class NotFoundTrackerMiddlewareTest extends TestCase
{
private NotFoundTrackerMiddleware $middleware;
@ -33,12 +37,22 @@ class NotFoundTrackerMiddlewareTest extends TestCase
);
}
#[Test]
public function delegatesIntoRequestTracker(): void
#[Test, DataProvider('provideResponses')]
public function delegatesIntoRequestTracker(Response $resp, string|null $expectedRedirectUrl): void
{
$this->handler->expects($this->once())->method('handle')->with($this->request);
$this->requestTracker->expects($this->once())->method('trackNotFoundIfApplicable')->with($this->request);
$this->handler->expects($this->once())->method('handle')->with($this->request)->willReturn($resp);
$this->requestTracker->expects($this->once())->method('trackNotFoundIfApplicable')->with(
$this->request->withAttribute(REDIRECT_URL_REQUEST_ATTRIBUTE, $expectedRedirectUrl),
);
$this->middleware->process($this->request, $this->handler);
$result = $this->middleware->process($this->request, $this->handler);
self::assertSame($resp, $result);
}
public static function provideResponses(): iterable
{
yield 'no location response' => [new Response(), null];
yield 'location response' => [new Response\RedirectResponse('the_location'), 'the_location'];
}
}

View File

@ -30,6 +30,8 @@ use Shlinkio\Shlink\Core\Visit\RequestTrackerInterface;
use function Laminas\Stratigility\middleware;
use function str_starts_with;
use const Shlinkio\Shlink\REDIRECT_URL_REQUEST_ATTRIBUTE;
class ExtraPathRedirectMiddlewareTest extends TestCase
{
private MockObject & ShortUrlResolverInterface $resolver;
@ -159,7 +161,10 @@ class ExtraPathRedirectMiddlewareTest extends TestCase
$this->redirectResponseHelper->expects($this->once())->method('buildRedirectResponse')->with(
'the_built_long_url',
)->willReturn(new RedirectResponse(''));
$this->requestTracker->expects($this->once())->method('trackIfApplicable')->with($shortUrl, $request);
$this->requestTracker->expects($this->once())->method('trackIfApplicable')->with(
$shortUrl,
$request->withAttribute(REDIRECT_URL_REQUEST_ATTRIBUTE, 'the_built_long_url'),
);
$this->middleware($options)->process($request, $this->handler);
}