SecurityAdvisoryWorkerTest.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php declare(strict_types=1);
  2. namespace Packagist\WebBundle\Tests;
  3. use Doctrine\ORM\EntityManager;
  4. use Doctrine\ORM\EntityRepository;
  5. use Packagist\WebBundle\Entity\Job;
  6. use Packagist\WebBundle\Entity\SecurityAdvisory;
  7. use Packagist\WebBundle\SecurityAdvisory\RemoteSecurityAdvisory;
  8. use Packagist\WebBundle\SecurityAdvisory\SecurityAdvisorySourceInterface;
  9. use Packagist\WebBundle\Service\Locker;
  10. use Packagist\WebBundle\Service\SecurityAdvisoryWorker;
  11. use PHPUnit\Framework\TestCase;
  12. use Psr\Log\NullLogger;
  13. use Seld\Signal\SignalHandler;
  14. use Symfony\Bridge\Doctrine\RegistryInterface;
  15. class SecurityAdvisoryWorkerTest extends TestCase
  16. {
  17. /** @var SecurityAdvisoryWorker */
  18. private $worker;
  19. /** @var SecurityAdvisorySourceInterface&\PHPUnit\Framework\MockObject\MockObject */
  20. private $source;
  21. /** @var EntityManager&\PHPUnit\Framework\MockObject\MockObject */
  22. private $em;
  23. /** @var \PHPUnit\Framework\MockObject\MockObject */
  24. private $securityAdvisoryRepository;
  25. protected function setUp(): void
  26. {
  27. $this->source = $this->getMockBuilder(SecurityAdvisorySourceInterface::class)->disableOriginalConstructor()->getMock();
  28. $locker = $this->getMockBuilder(Locker::class)->disableOriginalConstructor()->getMock();
  29. $doctrine = $this->getMockBuilder(RegistryInterface::class)->disableOriginalConstructor()->getMock();
  30. $this->worker = new SecurityAdvisoryWorker($locker, new NullLogger(), $doctrine, ['test' => $this->source]);
  31. $this->em = $this->getMockBuilder(EntityManager::class)->disableOriginalConstructor()->getMock();
  32. $doctrine
  33. ->method('getManager')
  34. ->willReturn($this->em);
  35. $locker
  36. ->method('lockSecurityAdvisory')
  37. ->willReturn(true);
  38. $this->securityAdvisoryRepository = $this->getMockBuilder(EntityRepository::class)->disableOriginalConstructor()->getMock();
  39. $doctrine
  40. ->method('getRepository')
  41. ->with($this->equalTo(SecurityAdvisory::class))
  42. ->willReturn($this->securityAdvisoryRepository);
  43. }
  44. public function testProcess(): void
  45. {
  46. $advisory1Existing = $this->getMockBuilder(RemoteSecurityAdvisory::class)->disableOriginalConstructor()->getMock();
  47. $advisory2New = $this->getMockBuilder(RemoteSecurityAdvisory::class)->disableOriginalConstructor()->getMock();
  48. $advisories = [
  49. $advisory1Existing,
  50. $advisory2New,
  51. ];
  52. $advisory1Existing
  53. ->method('getId')
  54. ->willReturn('remote-id-1');
  55. $existingAdvisory1 = $this->getMockBuilder(SecurityAdvisory::class)->disableOriginalConstructor()->getMock();
  56. $existingAdvisory1
  57. ->method('getRemoteId')
  58. ->willReturn('remote-id-1');
  59. $existingAdvisory1
  60. ->expects($this->once())
  61. ->method('updateAdvisory')
  62. ->with($this->equalTo($advisory1Existing));
  63. $existingAdvisory2ToBeDeleted = $this->getMockBuilder(SecurityAdvisory::class)->disableOriginalConstructor()->getMock();
  64. $existingAdvisory2ToBeDeleted
  65. ->method('getRemoteId')
  66. ->willReturn('to-be-deleted');
  67. $this->source
  68. ->expects($this->once())
  69. ->method('getAdvisories')
  70. ->willReturn($advisories);
  71. $this->em
  72. ->expects($this->once())
  73. ->method('persist');
  74. $this->em
  75. ->expects($this->once())
  76. ->method('remove')
  77. ->with($this->equalTo($existingAdvisory2ToBeDeleted));
  78. $this->securityAdvisoryRepository
  79. ->method('findBy')
  80. ->with($this->equalTo(['source' => 'test']))
  81. ->willReturn([$existingAdvisory1, $existingAdvisory2ToBeDeleted]);
  82. $job = new Job();
  83. $job->setPayload(['source' => 'test']);
  84. $this->worker->process($job, SignalHandler::create());
  85. }
  86. public function testProcessNone(): void
  87. {
  88. $this->source
  89. ->expects($this->once())
  90. ->method('getAdvisories')
  91. ->willReturn([]);
  92. $this->em
  93. ->expects($this->never())
  94. ->method('persist');
  95. $this->securityAdvisoryRepository
  96. ->method('findBy')
  97. ->with($this->equalTo(['source' => 'test']))
  98. ->willReturn([]);
  99. $job = new Job();
  100. $job->setPayload(['source' => 'test']);
  101. $this->worker->process($job, SignalHandler::create());
  102. }
  103. public function testProcessFailed(): void
  104. {
  105. $this->source
  106. ->expects($this->once())
  107. ->method('getAdvisories')
  108. ->willReturn(null);
  109. $this->em
  110. ->expects($this->never())
  111. ->method('flush');
  112. $this->securityAdvisoryRepository
  113. ->expects($this->never())
  114. ->method('findBy');
  115. $job = new Job();
  116. $job->setPayload(['source' => 'test']);
  117. $this->worker->process($job, SignalHandler::create());
  118. }
  119. }