SecurityManagerTest.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Security\Test\Unit\Model;
  7. use Magento\Framework\HTTP\PhpEnvironment\RemoteAddress;
  8. use Magento\Framework\Stdlib\DateTime\DateTime;
  9. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  10. use Magento\Security\Model\ConfigInterface;
  11. use Magento\Security\Model\SecurityManager;
  12. /**
  13. * Test class for \Magento\Security\Model\SecurityManager testing
  14. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  15. */
  16. class SecurityManagerTest extends \PHPUnit\Framework\TestCase
  17. {
  18. /** @var \Magento\Security\Model\SecurityManager */
  19. protected $model;
  20. /** @var ConfigInterface */
  21. protected $securityConfigMock;
  22. /** @var \Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\CollectionFactory */
  23. protected $passwordResetRequestEventCollectionFactoryMock;
  24. /** @var \Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\Collection */
  25. protected $passwordResetRequestEventCollectionMock;
  26. /** @var \Magento\Security\Model\PasswordResetRequestEventFactory */
  27. protected $passwordResetRequestEventFactoryMock;
  28. /** @var \Magento\Security\Model\PasswordResetRequestEvent */
  29. protected $passwordResetRequestEventMock;
  30. /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */
  31. protected $objectManager;
  32. /**
  33. * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
  34. */
  35. protected $eventManagerMock;
  36. /**
  37. * @var DateTime
  38. */
  39. protected $dateTimeMock;
  40. /*
  41. * @var RemoteAddress
  42. */
  43. protected $remoteAddressMock;
  44. /**
  45. * Init mocks for tests
  46. * @return void
  47. */
  48. public function setUp()
  49. {
  50. $this->objectManager = new ObjectManager($this);
  51. $this->securityConfigMock = $this->getMockBuilder(\Magento\Security\Model\ConfigInterface::class)
  52. ->disableOriginalConstructor()
  53. ->getMock();
  54. $this->passwordResetRequestEventCollectionFactoryMock = $this->createPartialMock(
  55. \Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\CollectionFactory::class,
  56. ['create']
  57. );
  58. $this->passwordResetRequestEventCollectionMock = $this->createPartialMock(
  59. \Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\Collection::class,
  60. ['deleteRecordsOlderThen']
  61. );
  62. $this->passwordResetRequestEventFactoryMock = $this->createPartialMock(
  63. \Magento\Security\Model\PasswordResetRequestEventFactory::class,
  64. ['create']
  65. );
  66. $this->passwordResetRequestEventMock = $this->createPartialMock(
  67. \Magento\Security\Model\PasswordResetRequestEvent::class,
  68. ['setRequestType', 'setAccountReference', 'setIp', 'save']
  69. );
  70. $securityChecker = $this->createMock(\Magento\Security\Model\SecurityChecker\SecurityCheckerInterface::class);
  71. $this->eventManagerMock = $this->getMockForAbstractClass(
  72. \Magento\Framework\Event\ManagerInterface::class,
  73. [],
  74. '',
  75. false,
  76. true,
  77. true,
  78. ['dispatch']
  79. );
  80. $this->dateTimeMock = $this->getMockBuilder(DateTime::class)
  81. ->disableOriginalConstructor()
  82. ->getMock();
  83. $this->remoteAddressMock = $this->getMockBuilder(RemoteAddress::class)
  84. ->disableOriginalConstructor()
  85. ->getMock();
  86. $this->model = $this->objectManager->getObject(
  87. SecurityManager::class,
  88. [
  89. 'securityConfig' => $this->securityConfigMock,
  90. 'passwordResetRequestEventFactory' => $this->passwordResetRequestEventFactoryMock,
  91. 'passwordResetRequestEventCollectionFactory' => $this->passwordResetRequestEventCollectionFactoryMock,
  92. 'eventManager' => $this->eventManagerMock,
  93. 'securityCheckers' => [$securityChecker],
  94. 'dateTime' => $this->dateTimeMock,
  95. 'remoteAddress' => $this->remoteAddressMock
  96. ]
  97. );
  98. }
  99. /**
  100. * @return void
  101. */
  102. public function testConstructorException()
  103. {
  104. $securityChecker = $this->createMock(\Magento\Framework\Message\ManagerInterface::class);
  105. $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
  106. $this->expectExceptionMessage(
  107. (string)__('Incorrect Security Checker class. It has to implement SecurityCheckerInterface')
  108. );
  109. $this->model->__construct(
  110. $this->securityConfigMock,
  111. $this->passwordResetRequestEventFactoryMock,
  112. $this->passwordResetRequestEventCollectionFactoryMock,
  113. $this->eventManagerMock,
  114. $this->dateTimeMock,
  115. $this->remoteAddressMock,
  116. [$securityChecker]
  117. );
  118. }
  119. /**
  120. * @return void
  121. */
  122. public function testPerformSecurityCheck()
  123. {
  124. $requestType = \Magento\Security\Model\PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST;
  125. $accountReference = \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_IP_AND_EMAIL;
  126. $longIp = 12345;
  127. $this->remoteAddressMock->expects($this->once())
  128. ->method('getRemoteAddress')
  129. ->will($this->returnValue($longIp));
  130. $this->passwordResetRequestEventFactoryMock->expects($this->once())
  131. ->method('create')
  132. ->willReturn($this->passwordResetRequestEventMock);
  133. $this->passwordResetRequestEventMock->expects($this->once())
  134. ->method('setRequestType')
  135. ->with($requestType)
  136. ->willReturnSelf();
  137. $this->passwordResetRequestEventMock->expects($this->once())
  138. ->method('setAccountReference')
  139. ->with($accountReference)
  140. ->willReturnSelf();
  141. $this->passwordResetRequestEventMock->expects($this->once())
  142. ->method('setIp')
  143. ->with($longIp)
  144. ->willReturnSelf();
  145. $this->passwordResetRequestEventMock->expects($this->once())
  146. ->method('save')
  147. ->willReturnSelf();
  148. $this->model->performSecurityCheck($requestType, $accountReference);
  149. }
  150. /**
  151. * @return void
  152. */
  153. public function testCleanExpiredRecords()
  154. {
  155. $timestamp = time();
  156. $this->passwordResetRequestEventCollectionFactoryMock->expects($this->once())
  157. ->method('create')
  158. ->willReturn($this->passwordResetRequestEventCollectionMock);
  159. $this->dateTimeMock->expects($this->once())
  160. ->method('gmtTimestamp')
  161. ->willReturn($timestamp);
  162. $this->passwordResetRequestEventCollectionMock->expects($this->once())
  163. ->method('deleteRecordsOlderThen')
  164. ->with(
  165. $timestamp - \Magento\Security\Model\SecurityManager::SECURITY_CONTROL_RECORDS_LIFE_TIME
  166. )
  167. ->willReturnSelf();
  168. $this->model->cleanExpiredRecords();
  169. }
  170. }