MercureHubTest.php 5.8 KB

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