MercureHubTest.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. namespace App\Tests\Unit\Service;
  3. use ApiPlatform\Api\IriConverterInterface;
  4. use App\Entity\Organization\Organization;
  5. use App\Service\MercureHub;
  6. use PHPUnit\Framework\TestCase;
  7. use Symfony\Component\Mercure\HubInterface;
  8. use Symfony\Component\Mercure\Update;
  9. use Symfony\Component\Serializer\Encoder\EncoderInterface;
  10. use Symfony\Component\Serializer\SerializerInterface;
  11. class TestableMercureHub extends MercureHub
  12. {
  13. public function createUpdate($accessId, string $data): Update
  14. {
  15. return parent::createUpdate($accessId, $data);
  16. }
  17. }
  18. class MercureHubTest extends TestCase
  19. {
  20. private HubInterface $hub;
  21. private SerializerInterface $serializer;
  22. private EncoderInterface $encoder;
  23. private IriConverterInterface $iriConverter;
  24. public function setUp(): void
  25. {
  26. $this->hub = $this->getMockBuilder(HubInterface::class)->disableOriginalConstructor()->getMock();
  27. $this->serializer = $this->getMockBuilder(SerializerInterface::class)->disableOriginalConstructor()->getMock();
  28. $this->encoder = $this->getMockBuilder(EncoderInterface::class)->disableOriginalConstructor()->getMock();
  29. $this->iriConverter = $this->getMockBuilder(IriConverterInterface::class)->disableOriginalConstructor()->getMock();
  30. }
  31. /**
  32. * @see MercureHub::createUpdate()
  33. */
  34. public function testCreateUpdate(): void
  35. {
  36. $mercureHub = $this
  37. ->getMockBuilder(TestableMercureHub::class)
  38. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  39. ->setMethodsExcept(['createUpdate'])
  40. ->getMock();
  41. $update = $mercureHub->createUpdate(1, "{'foo': 1}");
  42. $this->assertEquals(['access/1'], $update->getTopics());
  43. $this->assertEquals("{'foo': 1}", $update->getData());
  44. $this->assertTrue($update->isPrivate());
  45. }
  46. /**
  47. * @see MercureHub::publish()
  48. */
  49. public function testPublish(): void
  50. {
  51. $mercureHub = $this
  52. ->getMockBuilder(TestableMercureHub::class)
  53. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  54. ->setMethodsExcept(['publish'])
  55. ->getMock();
  56. $entity = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  57. $this->iriConverter->expects(self::once())->method('getIriFromResource')->with($entity)->willReturn('/api/entity/1');
  58. $this->serializer->expects(self::once())->method('serialize')->with($entity, 'jsonld', [])->willReturn("{'foo': 1}");
  59. $this->encoder
  60. ->expects(self::once())
  61. ->method('encode')
  62. ->with([
  63. 'iri' => '/api/entity/1',
  64. 'operation' => 'update',
  65. 'data' => "{'foo': 1}",
  66. ], 'jsonld')
  67. ->willReturn("{'iri':'/api/entity/1','operation':'update','data':'{\'foo\':1}'");
  68. $update = new Update(
  69. 'access/1',
  70. "{'iri':'/api/entity/1','operation':'update','data':'{\'foo\':1}'",
  71. true
  72. );
  73. $mercureHub
  74. ->expects(self::once())
  75. ->method('createUpdate')
  76. ->with(1, "{'iri':'/api/entity/1','operation':'update','data':'{\'foo\':1}'")
  77. ->willReturn($update);
  78. $this->hub->expects(self::once())->method('publish')->with($update);
  79. $mercureHub->publish(1, $entity);
  80. }
  81. /**
  82. * @see MercureHub::publish()
  83. */
  84. public function testPublishInvalidOperation(): void
  85. {
  86. $mercureHub = $this
  87. ->getMockBuilder(TestableMercureHub::class)
  88. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  89. ->setMethodsExcept(['publish'])
  90. ->getMock();
  91. $entity = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  92. $this->expectException(\InvalidArgumentException::class);
  93. $mercureHub->publish(1, $entity, 'foo');
  94. }
  95. /**
  96. * @see MercureHub::publishUpdate()
  97. */
  98. public function testPublishUpdate(): void
  99. {
  100. $mercureHub = $this
  101. ->getMockBuilder(TestableMercureHub::class)
  102. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  103. ->setMethodsExcept(['publishUpdate'])
  104. ->getMock();
  105. $entity = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  106. $mercureHub->expects(self::once())->method('publish')->with(1, $entity, 'update');
  107. $mercureHub->publishUpdate(1, $entity);
  108. }
  109. /**
  110. * @see MercureHub::publishCreate()
  111. */
  112. public function testPublishCreate(): void
  113. {
  114. $mercureHub = $this
  115. ->getMockBuilder(TestableMercureHub::class)
  116. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  117. ->setMethodsExcept(['publishCreate'])
  118. ->getMock();
  119. $entity = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  120. $mercureHub->expects(self::once())->method('publish')->with(1, $entity, 'create');
  121. $mercureHub->publishCreate(1, $entity);
  122. }
  123. /**
  124. * @see MercureHub::publishDelete()
  125. */
  126. public function testPublishDelete(): void
  127. {
  128. $mercureHub = $this
  129. ->getMockBuilder(TestableMercureHub::class)
  130. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  131. ->setMethodsExcept(['publishDelete'])
  132. ->getMock();
  133. $entity = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  134. $mercureHub->expects(self::once())->method('publish')->with(1, $entity, 'delete');
  135. $mercureHub->publishDelete(1, $entity);
  136. }
  137. }