QuantityTest.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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\SecurityChecker;
  7. use Magento\Framework\HTTP\PhpEnvironment\RemoteAddress;
  8. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  9. use Magento\Security\Model\ConfigInterface;
  10. use Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\Collection;
  11. use Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\CollectionFactory;
  12. /**
  13. * Test class for \Magento\Security\Model\SecurityChecker\Quantity testing
  14. */
  15. class QuantityTest extends \PHPUnit\Framework\TestCase
  16. {
  17. /**
  18. * @var \Magento\Security\Model\SecurityChecker\Quantity
  19. */
  20. protected $model;
  21. /**
  22. * @var ConfigInterface | \PHPUnit_Framework_MockObject_MockObject
  23. */
  24. protected $securityConfigMock;
  25. /**
  26. * @var CollectionFactory | \PHPUnit_Framework_MockObject_MockObject
  27. */
  28. protected $collectionFactoryMock;
  29. /**
  30. * @var Collection | \PHPUnit_Framework_MockObject_MockObject
  31. */
  32. protected $collectionMock;
  33. /**
  34. * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
  35. */
  36. protected $objectManager;
  37. /*
  38. * @var RemoteAddress
  39. */
  40. protected $remoteAddressMock;
  41. /**
  42. * Init mocks for tests
  43. * @return void
  44. */
  45. public function setUp()
  46. {
  47. $this->objectManager = new ObjectManager($this);
  48. $this->securityConfigMock = $this->getMockBuilder(\Magento\Security\Model\ConfigInterface::class)
  49. ->disableOriginalConstructor()
  50. ->setMethods(['getScopeByEventType'])
  51. ->getMockForAbstractClass();
  52. $this->securityConfigMock->expects($this->any())
  53. ->method('getScopeByEventType')
  54. ->willReturnMap(
  55. [
  56. [0, 1],
  57. [1, 0]
  58. ]
  59. );
  60. $this->collectionFactoryMock = $this->createPartialMock(
  61. \Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\CollectionFactory::class,
  62. ['create']
  63. );
  64. $this->collectionMock = $this->createPartialMock(
  65. \Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\Collection::class,
  66. ['addFieldToFilter', 'filterByLifetime', 'count']
  67. );
  68. $this->remoteAddressMock = $this->getMockBuilder(RemoteAddress::class)
  69. ->disableOriginalConstructor()
  70. ->getMock();
  71. $this->model = $this->objectManager->getObject(
  72. \Magento\Security\Model\SecurityChecker\Quantity::class,
  73. [
  74. 'securityConfig' => $this->securityConfigMock,
  75. 'collectionFactory' => $this->collectionFactoryMock,
  76. 'remoteAddress' => $this->remoteAddressMock
  77. ]
  78. );
  79. }
  80. /**
  81. * @param int $securityEventType
  82. * @param int $requestsMethod
  83. * @dataProvider dataProviderSecurityEventTypeWithRequestsMethod
  84. */
  85. public function testCheck($securityEventType, $requestsMethod)
  86. {
  87. $limitNumberPasswordResetRequests = 10;
  88. $this->prepareTestCheck($requestsMethod, $limitNumberPasswordResetRequests);
  89. $this->collectionMock->expects($this->once())
  90. ->method('count')
  91. ->willReturn($limitNumberPasswordResetRequests - 1);
  92. $this->model->check($securityEventType);
  93. }
  94. /**
  95. * @param int $securityEventType
  96. * @param int $requestsMethod
  97. * @dataProvider dataProviderSecurityEventTypeWithRequestsMethod
  98. * @expectedException \Magento\Framework\Exception\SecurityViolationException
  99. */
  100. public function testCheckException($securityEventType, $requestsMethod)
  101. {
  102. $limitNumberPasswordResetRequests = 10;
  103. $this->prepareTestCheck($requestsMethod, $limitNumberPasswordResetRequests);
  104. $this->collectionMock->expects($this->once())
  105. ->method('count')
  106. ->willReturn($limitNumberPasswordResetRequests);
  107. $this->model->check($securityEventType);
  108. $this->expectExceptionMessage(
  109. 'We received too many requests for password resets. '
  110. . 'Please wait and try again later or contact test@host.com.'
  111. );
  112. }
  113. /**
  114. * @return array
  115. */
  116. public function dataProviderSecurityEventTypeWithRequestsMethod()
  117. {
  118. return [
  119. [
  120. \Magento\Security\Model\PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST,
  121. \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_IP_AND_EMAIL
  122. ],
  123. [
  124. \Magento\Security\Model\PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST,
  125. \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_IP
  126. ],
  127. [
  128. \Magento\Security\Model\PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST,
  129. \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_EMAIL
  130. ],
  131. [
  132. \Magento\Security\Model\PasswordResetRequestEvent::ADMIN_PASSWORD_RESET_REQUEST,
  133. \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_IP_AND_EMAIL
  134. ],
  135. [
  136. \Magento\Security\Model\PasswordResetRequestEvent::ADMIN_PASSWORD_RESET_REQUEST,
  137. \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_IP
  138. ],
  139. [
  140. \Magento\Security\Model\PasswordResetRequestEvent::ADMIN_PASSWORD_RESET_REQUEST,
  141. \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_EMAIL
  142. ]
  143. ];
  144. }
  145. /**
  146. * @param int $requestsMethod
  147. * @param int $limitNumberPasswordResetRequests
  148. */
  149. protected function prepareTestCheck($requestsMethod, $limitNumberPasswordResetRequests)
  150. {
  151. $this->remoteAddressMock->expects($this->any())
  152. ->method('getRemoteAddress')
  153. ->will($this->returnValue(12345));
  154. $this->securityConfigMock->expects($this->any())
  155. ->method('getPasswordResetProtectionType')
  156. ->will($this->returnValue($requestsMethod));
  157. $this->securityConfigMock->expects($this->once())
  158. ->method('getMaxNumberPasswordResetRequests')
  159. ->will($this->returnValue($limitNumberPasswordResetRequests));
  160. $this->securityConfigMock->expects($this->any())
  161. ->method('getCustomerServiceEmail')
  162. ->will($this->returnValue('test@host.com'));
  163. $this->collectionFactoryMock->expects($this->once())
  164. ->method('create')
  165. ->willReturn($this->collectionMock);
  166. $this->collectionMock->expects($this->any())
  167. ->method('addFieldToFilter')
  168. ->willReturnSelf();
  169. $this->collectionMock->expects($this->once())
  170. ->method('filterByLifetime')
  171. ->willReturnSelf();
  172. }
  173. }