mirror of
https://github.com/shlinkio/shlink.git
synced 2026-03-06 23:33:13 +08:00
Make it impossible to create a short URL with an empty long URL
This commit is contained in:
@@ -56,7 +56,7 @@ class QrCodeActionTest extends TestCase
|
||||
$shortCode = 'abc123';
|
||||
$this->urlResolver->expects($this->once())->method('resolveEnabledShortUrl')->with(
|
||||
ShortUrlIdentifier::fromShortCodeAndDomain($shortCode, ''),
|
||||
)->willReturn(ShortUrl::createEmpty());
|
||||
)->willReturn(ShortUrl::createFake());
|
||||
$delegate = $this->createMock(RequestHandlerInterface::class);
|
||||
$delegate->expects($this->never())->method('handle');
|
||||
|
||||
@@ -78,7 +78,7 @@ class QrCodeActionTest extends TestCase
|
||||
$code = 'abc123';
|
||||
$this->urlResolver->method('resolveEnabledShortUrl')->with(
|
||||
ShortUrlIdentifier::fromShortCodeAndDomain($code, ''),
|
||||
)->willReturn(ShortUrl::createEmpty());
|
||||
)->willReturn(ShortUrl::createFake());
|
||||
$delegate = $this->createMock(RequestHandlerInterface::class);
|
||||
$req = (new ServerRequest())->withAttribute('shortCode', $code)->withQueryParams($query);
|
||||
|
||||
@@ -111,7 +111,7 @@ class QrCodeActionTest extends TestCase
|
||||
$code = 'abc123';
|
||||
$this->urlResolver->method('resolveEnabledShortUrl')->with(
|
||||
ShortUrlIdentifier::fromShortCodeAndDomain($code, ''),
|
||||
)->willReturn(ShortUrl::createEmpty());
|
||||
)->willReturn(ShortUrl::createFake());
|
||||
$delegate = $this->createMock(RequestHandlerInterface::class);
|
||||
|
||||
$resp = $this->action($defaultOptions)->process($req->withAttribute('shortCode', $code), $delegate);
|
||||
|
||||
@@ -70,7 +70,7 @@ class LocateVisitTest extends TestCase
|
||||
{
|
||||
$event = new UrlVisited('123');
|
||||
$this->em->expects($this->once())->method('find')->with(Visit::class, '123')->willReturn(
|
||||
Visit::forValidShortUrl(ShortUrl::createEmpty(), new Visitor('', '', '1.2.3.4', '')),
|
||||
Visit::forValidShortUrl(ShortUrl::createFake(), new Visitor('', '', '1.2.3.4', '')),
|
||||
);
|
||||
$this->em->expects($this->never())->method('flush');
|
||||
$this->dbUpdater->expects($this->once())->method('databaseFileExists')->withAnyParameters()->willReturn(false);
|
||||
@@ -89,7 +89,7 @@ class LocateVisitTest extends TestCase
|
||||
{
|
||||
$event = new UrlVisited('123');
|
||||
$this->em->expects($this->once())->method('find')->with(Visit::class, '123')->willReturn(
|
||||
Visit::forValidShortUrl(ShortUrl::createEmpty(), new Visitor('', '', '1.2.3.4', '')),
|
||||
Visit::forValidShortUrl(ShortUrl::createFake(), new Visitor('', '', '1.2.3.4', '')),
|
||||
);
|
||||
$this->em->expects($this->never())->method('flush');
|
||||
$this->dbUpdater->expects($this->once())->method('databaseFileExists')->withAnyParameters()->willReturn(true);
|
||||
@@ -110,7 +110,7 @@ class LocateVisitTest extends TestCase
|
||||
{
|
||||
$event = new UrlVisited('123');
|
||||
$this->em->expects($this->once())->method('find')->with(Visit::class, '123')->willReturn(
|
||||
Visit::forValidShortUrl(ShortUrl::createEmpty(), new Visitor('', '', '1.2.3.4', '')),
|
||||
Visit::forValidShortUrl(ShortUrl::createFake(), new Visitor('', '', '1.2.3.4', '')),
|
||||
);
|
||||
$this->em->expects($this->never())->method('flush');
|
||||
$this->dbUpdater->expects($this->once())->method('databaseFileExists')->withAnyParameters()->willReturn(true);
|
||||
@@ -148,7 +148,7 @@ class LocateVisitTest extends TestCase
|
||||
|
||||
public function provideNonLocatableVisits(): iterable
|
||||
{
|
||||
$shortUrl = ShortUrl::createEmpty();
|
||||
$shortUrl = ShortUrl::createFake();
|
||||
|
||||
yield 'null IP' => [Visit::forValidShortUrl($shortUrl, new Visitor('', '', null, ''))];
|
||||
yield 'empty IP' => [Visit::forValidShortUrl($shortUrl, new Visitor('', '', '', ''))];
|
||||
@@ -183,11 +183,11 @@ class LocateVisitTest extends TestCase
|
||||
public function provideIpAddresses(): iterable
|
||||
{
|
||||
yield 'no original IP address' => [
|
||||
Visit::forValidShortUrl(ShortUrl::createEmpty(), new Visitor('', '', '1.2.3.4', '')),
|
||||
Visit::forValidShortUrl(ShortUrl::createFake(), new Visitor('', '', '1.2.3.4', '')),
|
||||
null,
|
||||
];
|
||||
yield 'original IP address' => [
|
||||
Visit::forValidShortUrl(ShortUrl::createEmpty(), new Visitor('', '', '1.2.3.4', '')),
|
||||
Visit::forValidShortUrl(ShortUrl::createFake(), new Visitor('', '', '1.2.3.4', '')),
|
||||
'1.2.3.4',
|
||||
];
|
||||
yield 'base url' => [Visit::forBasePath(new Visitor('', '', '1.2.3.4', '')), '1.2.3.4'];
|
||||
|
||||
@@ -59,7 +59,7 @@ class NotifyVisitToMercureTest extends TestCase
|
||||
public function notificationsAreSentWhenVisitIsFound(): void
|
||||
{
|
||||
$visitId = '123';
|
||||
$visit = Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance());
|
||||
$visit = Visit::forValidShortUrl(ShortUrl::createFake(), Visitor::emptyInstance());
|
||||
$update = Update::forTopicAndPayload('', []);
|
||||
|
||||
$this->em->expects($this->once())->method('find')->with(Visit::class, $visitId)->willReturn($visit);
|
||||
@@ -79,7 +79,7 @@ class NotifyVisitToMercureTest extends TestCase
|
||||
public function debugIsLoggedWhenExceptionIsThrown(): void
|
||||
{
|
||||
$visitId = '123';
|
||||
$visit = Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance());
|
||||
$visit = Visit::forValidShortUrl(ShortUrl::createFake(), Visitor::emptyInstance());
|
||||
$update = Update::forTopicAndPayload('', []);
|
||||
$e = new RuntimeException('Error');
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ class NotifyVisitToWebHooksTest extends TestCase
|
||||
public function provideVisits(): iterable
|
||||
{
|
||||
yield 'regular visit' => [
|
||||
Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance()),
|
||||
Visit::forValidShortUrl(ShortUrl::createFake(), Visitor::emptyInstance()),
|
||||
['shortUrl', 'visit'],
|
||||
];
|
||||
yield 'orphan visit' => [Visit::forBasePath(Visitor::emptyInstance()), ['visit'],];
|
||||
|
||||
@@ -210,7 +210,7 @@ class ImportedLinksProcessorTest extends TestCase
|
||||
]),
|
||||
'<comment>Skipped</comment>. Imported <info>4</info> visits',
|
||||
4,
|
||||
ShortUrl::createEmpty(),
|
||||
ShortUrl::createFake(),
|
||||
];
|
||||
yield 'existing short URL with previous imported visits' => [
|
||||
$createImportedUrl([
|
||||
@@ -222,8 +222,8 @@ class ImportedLinksProcessorTest extends TestCase
|
||||
]),
|
||||
'<comment>Skipped</comment>. Imported <info>2</info> visits',
|
||||
2,
|
||||
ShortUrl::createEmpty()->setVisits(new ArrayCollection([
|
||||
Visit::fromImport(ShortUrl::createEmpty(), new ImportedShlinkVisit('', '', $now, null)),
|
||||
ShortUrl::createFake()->setVisits(new ArrayCollection([
|
||||
Visit::fromImport(ShortUrl::createFake(), new ImportedShlinkVisit('', '', $now, null)),
|
||||
])),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -29,8 +29,8 @@ class DeleteShortUrlServiceTest extends TestCase
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$shortUrl = ShortUrl::createEmpty()->setVisits(new ArrayCollection(
|
||||
map(range(0, 10), fn () => Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance())),
|
||||
$shortUrl = ShortUrl::createFake()->setVisits(new ArrayCollection(
|
||||
map(range(0, 10), fn () => Visit::forValidShortUrl(ShortUrl::createFake(), Visitor::emptyInstance())),
|
||||
));
|
||||
$this->shortCode = $shortUrl->getShortCode();
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ class ShortUrlTest extends TestCase
|
||||
'The short code cannot be regenerated on ShortUrls where a custom slug was provided.',
|
||||
];
|
||||
yield 'already persisted' => [
|
||||
ShortUrl::createEmpty()->setId('1'),
|
||||
ShortUrl::createFake()->setId('1'),
|
||||
'The short code can be regenerated only on new ShortUrls which have not been persisted yet.',
|
||||
];
|
||||
}
|
||||
@@ -64,7 +64,7 @@ class ShortUrlTest extends TestCase
|
||||
|
||||
public function provideValidShortUrls(): iterable
|
||||
{
|
||||
yield 'no custom slug' => [ShortUrl::createEmpty()];
|
||||
yield 'no custom slug' => [ShortUrl::createFake()];
|
||||
yield 'imported with custom slug' => [ShortUrl::fromImport(
|
||||
new ImportedShlinkUrl(ImportSource::BITLY, 'longUrl', [], Chronos::now(), null, 'custom-slug', null),
|
||||
true,
|
||||
|
||||
@@ -36,10 +36,10 @@ class ShortUrlListServiceTest extends TestCase
|
||||
public function listedUrlsAreReturnedFromEntityManager(?ApiKey $apiKey): void
|
||||
{
|
||||
$list = [
|
||||
ShortUrl::createEmpty(),
|
||||
ShortUrl::createEmpty(),
|
||||
ShortUrl::createEmpty(),
|
||||
ShortUrl::createEmpty(),
|
||||
ShortUrl::createFake(),
|
||||
ShortUrl::createFake(),
|
||||
ShortUrl::createFake(),
|
||||
ShortUrl::createFake(),
|
||||
];
|
||||
|
||||
$this->repo->expects($this->once())->method('findList')->willReturn($list);
|
||||
|
||||
@@ -38,7 +38,7 @@ class ShortUrlDataTransformerTest extends TestCase
|
||||
$maxVisits = random_int(1, 1000);
|
||||
$now = Chronos::now();
|
||||
|
||||
yield 'no metadata' => [ShortUrl::createEmpty(), [
|
||||
yield 'no metadata' => [ShortUrl::createFake(), [
|
||||
'validSince' => null,
|
||||
'validUntil' => null,
|
||||
'maxVisits' => null,
|
||||
|
||||
@@ -18,7 +18,7 @@ class VisitTest extends TestCase
|
||||
*/
|
||||
public function isProperlyJsonSerialized(string $userAgent, bool $expectedToBePotentialBot): void
|
||||
{
|
||||
$visit = Visit::forValidShortUrl(ShortUrl::createEmpty(), new Visitor($userAgent, 'some site', '1.2.3.4', ''));
|
||||
$visit = Visit::forValidShortUrl(ShortUrl::createFake(), new Visitor($userAgent, 'some site', '1.2.3.4', ''));
|
||||
|
||||
self::assertEquals([
|
||||
'referer' => 'some site',
|
||||
@@ -48,7 +48,7 @@ class VisitTest extends TestCase
|
||||
public function addressIsAnonymizedWhenRequested(bool $anonymize, ?string $address, ?string $expectedAddress): void
|
||||
{
|
||||
$visit = Visit::forValidShortUrl(
|
||||
ShortUrl::createEmpty(),
|
||||
ShortUrl::createFake(),
|
||||
new Visitor('Chrome', 'some site', $address, ''),
|
||||
$anonymize,
|
||||
);
|
||||
|
||||
@@ -86,7 +86,7 @@ class VisitsStatsHelperTest extends TestCase
|
||||
$repo = $this->createMock(ShortUrlRepositoryInterface::class);
|
||||
$repo->expects($this->once())->method('shortCodeIsInUse')->with($identifier, $spec)->willReturn(true);
|
||||
|
||||
$list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance()));
|
||||
$list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createFake(), Visitor::emptyInstance()));
|
||||
$repo2 = $this->createMock(VisitRepository::class);
|
||||
$repo2->method('findVisitsByShortCode')->with(
|
||||
$identifier,
|
||||
@@ -146,7 +146,7 @@ class VisitsStatsHelperTest extends TestCase
|
||||
$repo = $this->createMock(TagRepository::class);
|
||||
$repo->expects($this->once())->method('tagExists')->with($tag, $apiKey)->willReturn(true);
|
||||
|
||||
$list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance()));
|
||||
$list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createFake(), Visitor::emptyInstance()));
|
||||
$repo2 = $this->createMock(VisitRepository::class);
|
||||
$repo2->method('findVisitsByTag')->with($tag, $this->isInstanceOf(VisitsListFiltering::class))->willReturn(
|
||||
$list,
|
||||
@@ -187,7 +187,7 @@ class VisitsStatsHelperTest extends TestCase
|
||||
$repo = $this->createMock(DomainRepository::class);
|
||||
$repo->expects($this->once())->method('domainExists')->with($domain, $apiKey)->willReturn(true);
|
||||
|
||||
$list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance()));
|
||||
$list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createFake(), Visitor::emptyInstance()));
|
||||
$repo2 = $this->createMock(VisitRepository::class);
|
||||
$repo2->method('findVisitsByDomain')->with(
|
||||
$domain,
|
||||
@@ -217,7 +217,7 @@ class VisitsStatsHelperTest extends TestCase
|
||||
$repo = $this->createMock(DomainRepository::class);
|
||||
$repo->expects($this->never())->method('domainExists');
|
||||
|
||||
$list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance()));
|
||||
$list = map(range(0, 1), fn () => Visit::forValidShortUrl(ShortUrl::createFake(), Visitor::emptyInstance()));
|
||||
$repo2 = $this->createMock(VisitRepository::class);
|
||||
$repo2->method('findVisitsByDomain')->with(
|
||||
'DEFAULT',
|
||||
@@ -259,7 +259,7 @@ class VisitsStatsHelperTest extends TestCase
|
||||
/** @test */
|
||||
public function nonOrphanVisitsAreReturnedAsExpected(): void
|
||||
{
|
||||
$list = map(range(0, 3), fn () => Visit::forValidShortUrl(ShortUrl::createEmpty(), Visitor::emptyInstance()));
|
||||
$list = map(range(0, 3), fn () => Visit::forValidShortUrl(ShortUrl::createFake(), Visitor::emptyInstance()));
|
||||
$repo = $this->createMock(VisitRepository::class);
|
||||
$repo->expects($this->once())->method('countNonOrphanVisits')->with(
|
||||
$this->isInstanceOf(VisitsCountFiltering::class),
|
||||
|
||||
@@ -58,7 +58,7 @@ class VisitsTrackerTest extends TestCase
|
||||
|
||||
public function provideTrackingMethodNames(): iterable
|
||||
{
|
||||
yield 'track' => ['track', [ShortUrl::createEmpty(), Visitor::emptyInstance()]];
|
||||
yield 'track' => ['track', [ShortUrl::createFake(), Visitor::emptyInstance()]];
|
||||
yield 'trackInvalidShortUrlVisit' => ['trackInvalidShortUrlVisit', [Visitor::emptyInstance()]];
|
||||
yield 'trackBaseUrlVisit' => ['trackBaseUrlVisit', [Visitor::emptyInstance()]];
|
||||
yield 'trackRegularNotFoundVisit' => ['trackRegularNotFoundVisit', [Visitor::emptyInstance()]];
|
||||
|
||||
Reference in New Issue
Block a user