MercureUpdatesGeneratorTest.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. declare(strict_types=1);
  3. namespace ShlinkioTest\Shlink\Core\Mercure;
  4. use PHPUnit\Framework\TestCase;
  5. use Shlinkio\Shlink\Core\Entity\ShortUrl;
  6. use Shlinkio\Shlink\Core\Entity\Visit;
  7. use Shlinkio\Shlink\Core\Mercure\MercureUpdatesGenerator;
  8. use Shlinkio\Shlink\Core\Model\ShortUrlMeta;
  9. use Shlinkio\Shlink\Core\Model\Visitor;
  10. use Shlinkio\Shlink\Core\ShortUrl\Helper\ShortUrlStringifier;
  11. use Shlinkio\Shlink\Core\ShortUrl\Transformer\ShortUrlDataTransformer;
  12. use Shlinkio\Shlink\Core\Visit\Transformer\OrphanVisitDataTransformer;
  13. use function Shlinkio\Shlink\Common\json_decode;
  14. class MercureUpdatesGeneratorTest extends TestCase
  15. {
  16. private MercureUpdatesGenerator $generator;
  17. public function setUp(): void
  18. {
  19. $this->generator = new MercureUpdatesGenerator(
  20. new ShortUrlDataTransformer(new ShortUrlStringifier([])),
  21. new OrphanVisitDataTransformer(),
  22. );
  23. }
  24. /**
  25. * @test
  26. * @dataProvider provideMethod
  27. */
  28. public function visitIsProperlySerializedIntoUpdate(string $method, string $expectedTopic, ?string $title): void
  29. {
  30. $shortUrl = ShortUrl::fromMeta(ShortUrlMeta::fromRawData([
  31. 'customSlug' => 'foo',
  32. 'longUrl' => '',
  33. 'title' => $title,
  34. ]));
  35. $visit = Visit::forValidShortUrl($shortUrl, Visitor::emptyInstance());
  36. $update = $this->generator->{$method}($visit);
  37. self::assertEquals([$expectedTopic], $update->getTopics());
  38. self::assertEquals([
  39. 'shortUrl' => [
  40. 'shortCode' => $shortUrl->getShortCode(),
  41. 'shortUrl' => 'http:/' . $shortUrl->getShortCode(),
  42. 'longUrl' => '',
  43. 'dateCreated' => $shortUrl->getDateCreated()->toAtomString(),
  44. 'visitsCount' => 0,
  45. 'tags' => [],
  46. 'meta' => [
  47. 'validSince' => null,
  48. 'validUntil' => null,
  49. 'maxVisits' => null,
  50. ],
  51. 'domain' => null,
  52. 'title' => $title,
  53. ],
  54. 'visit' => [
  55. 'referer' => '',
  56. 'userAgent' => '',
  57. 'visitLocation' => null,
  58. 'date' => $visit->getDate()->toAtomString(),
  59. ],
  60. ], json_decode($update->getData()));
  61. }
  62. public function provideMethod(): iterable
  63. {
  64. yield 'newVisitUpdate' => ['newVisitUpdate', 'https://shlink.io/new-visit', 'the cool title'];
  65. yield 'newShortUrlVisitUpdate' => ['newShortUrlVisitUpdate', 'https://shlink.io/new-visit/foo', null];
  66. }
  67. /**
  68. * @test
  69. * @dataProvider provideOrphanVisits
  70. */
  71. public function orphanVisitIsProperlySerializedIntoUpdate(Visit $orphanVisit): void
  72. {
  73. $update = $this->generator->newOrphanVisitUpdate($orphanVisit);
  74. self::assertEquals(['https://shlink.io/new-orphan-visit'], $update->getTopics());
  75. self::assertEquals([
  76. 'visit' => [
  77. 'referer' => '',
  78. 'userAgent' => '',
  79. 'visitLocation' => null,
  80. 'date' => $orphanVisit->getDate()->toAtomString(),
  81. 'visitedUrl' => $orphanVisit->visitedUrl(),
  82. 'type' => $orphanVisit->type(),
  83. ],
  84. ], json_decode($update->getData()));
  85. }
  86. public function provideOrphanVisits(): iterable
  87. {
  88. $visitor = Visitor::emptyInstance();
  89. yield Visit::TYPE_REGULAR_404 => [Visit::forRegularNotFound($visitor)];
  90. yield Visit::TYPE_INVALID_SHORT_URL => [Visit::forInvalidShortUrl($visitor)];
  91. yield Visit::TYPE_BASE_URL => [Visit::forBasePath($visitor)];
  92. }
  93. }