MercureHubTest.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace App\Tests\Service;
  3. use ApiPlatform\Core\Api\IriConverterInterface;
  4. use App\Service\MercureHub;
  5. use Doctrine\Entity;
  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. public function testCreateUpdate(): void {
  27. $mercureHub = $this
  28. ->getMockBuilder(TestableMercureHub::class)
  29. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  30. ->setMethodsExcept(['createUpdate'])
  31. ->getMock();
  32. $update = $mercureHub->createUpdate(1, "{'foo': 1}");
  33. $this->assertEquals(['access/1'], $update->getTopics());
  34. $this->assertEquals("{'foo': 1}", $update->getData());
  35. $this->assertEquals(true, $update->isPrivate());
  36. }
  37. public function testPublish(): void
  38. {
  39. $mercureHub = $this
  40. ->getMockBuilder(TestableMercureHub::class)
  41. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  42. ->setMethodsExcept(['publish'])
  43. ->getMock();
  44. $entity = $this->getMockBuilder(Entity::class)->disableOriginalConstructor()->getMock();
  45. $this->iriConverter->expects(self::once())->method('getIriFromItem')->with($entity)->willReturn('/api/entity/1');
  46. $this->serializer->expects(self::once())->method('serialize')->with($entity, 'jsonld', [])->willReturn("{'foo': 1}");
  47. $this->encoder
  48. ->expects(self::once())
  49. ->method('encode')
  50. ->with([
  51. 'iri' => '/api/entity/1',
  52. 'operation' => 'update',
  53. 'data' => "{'foo': 1}"
  54. ], 'jsonld')
  55. ->willReturn("{'iri':'/api/entity/1','operation':'update','data':'{\'foo\':1}'");
  56. $update = new Update(
  57. 'access/1',
  58. "{'iri':'/api/entity/1','operation':'update','data':'{\'foo\':1}'",
  59. true
  60. );
  61. $mercureHub
  62. ->expects(self::once())
  63. ->method('createUpdate')
  64. ->with(1, "{'iri':'/api/entity/1','operation':'update','data':'{\'foo\':1}'")
  65. ->willReturn($update);
  66. $this->hub->expects(self::once())->method('publish')->with($update);
  67. $mercureHub->publish(1, $entity);
  68. }
  69. public function testPublishInvalidOperation(): void
  70. {
  71. $mercureHub = $this
  72. ->getMockBuilder(TestableMercureHub::class)
  73. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  74. ->setMethodsExcept(['publish'])
  75. ->getMock();
  76. $entity = $this->getMockBuilder(Entity::class)->disableOriginalConstructor()->getMock();
  77. $this->expectException(\InvalidArgumentException::class);
  78. $mercureHub->publish(1, $entity, 'foo');
  79. }
  80. public function testPublishUpdate(): void {
  81. $mercureHub = $this
  82. ->getMockBuilder(TestableMercureHub::class)
  83. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  84. ->setMethodsExcept(['publishUpdate'])
  85. ->getMock();
  86. $entity = $this->getMockBuilder(Entity::class)->disableOriginalConstructor()->getMock();
  87. $mercureHub->expects(self::once())->method('publish')->with(1, $entity, 'update');
  88. $mercureHub->publishUpdate(1, $entity);
  89. }
  90. public function testPublishCreate(): void {
  91. $mercureHub = $this
  92. ->getMockBuilder(TestableMercureHub::class)
  93. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  94. ->setMethodsExcept(['publishCreate'])
  95. ->getMock();
  96. $entity = $this->getMockBuilder(Entity::class)->disableOriginalConstructor()->getMock();
  97. $mercureHub->expects(self::once())->method('publish')->with(1, $entity, 'create');
  98. $mercureHub->publishCreate(1, $entity);
  99. }
  100. public function testPublishDelete(): void {
  101. $mercureHub = $this
  102. ->getMockBuilder(TestableMercureHub::class)
  103. ->setConstructorArgs([$this->hub, $this->serializer, $this->encoder, $this->iriConverter])
  104. ->setMethodsExcept(['publishDelete'])
  105. ->getMock();
  106. $entity = $this->getMockBuilder(Entity::class)->disableOriginalConstructor()->getMock();
  107. $mercureHub->expects(self::once())->method('publish')->with(1, $entity, 'delete');
  108. $mercureHub->publishDelete(1, $entity);
  109. }
  110. }