Skip to content

Commit

Permalink
Test behavior to track redirect URL
Browse files Browse the repository at this point in the history
  • Loading branch information
acelaya committed Nov 24, 2024
1 parent 86cc2b7 commit 85065c9
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 12 deletions.
1 change: 1 addition & 0 deletions module/Core/src/Visit/Model/Visitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
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
Expand Down
13 changes: 10 additions & 3 deletions module/Core/test/Action/PixelActionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
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;
Expand All @@ -34,12 +36,17 @@ protected function setUp(): void
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);
Expand Down
12 changes: 9 additions & 3 deletions module/Core/test/Action/RedirectActionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
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';
Expand Down Expand Up @@ -50,16 +52,20 @@ public function redirectionIsPerformedToLongUrl(): void
{
$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);
Expand Down
24 changes: 19 additions & 5 deletions module/Core/test/ErrorHandler/NotFoundTrackerMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

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;
Expand All @@ -14,6 +16,8 @@
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;
Expand All @@ -33,12 +37,22 @@ protected function setUp(): void
);
}

#[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),
);

$result = $this->middleware->process($this->request, $this->handler);

$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'];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
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;
Expand Down Expand Up @@ -159,7 +161,10 @@ function () use ($shortUrl, &$currentIteration, $expectedResolveCalls): ShortUrl
$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);
}
Expand Down

0 comments on commit 85065c9

Please sign in to comment.