Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
FrequencyTest.php
Go to the documentation of this file.
1 <?php
8 
13 
17 class FrequencyTest extends \PHPUnit\Framework\TestCase
18 {
22  protected $model;
23 
28 
33 
37  protected $collectionMock;
38 
42  protected $dateTimeMock;
43 
47  protected $objectManager;
48 
49  /*
50  * @var RemoteAddress
51  */
52  protected $remoteAddressMock;
53 
58  public function setUp()
59  {
60  $this->objectManager = new ObjectManager($this);
61  $this->securityConfigMock = $this->getMockBuilder(\Magento\Security\Model\ConfigInterface::class)
62  ->setMethods(['getScopeByEventType'])
63  ->disableOriginalConstructor()
64  ->getMockForAbstractClass();
65  $this->securityConfigMock->expects($this->any())
66  ->method('getScopeByEventType')
67  ->willReturnMap(
68  [
69  [0, 1],
70  [1, 0]
71  ]
72  );
73 
74  $this->collectionFactoryMock = $this->createPartialMock(
75  \Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\CollectionFactory::class,
76  ['create']
77  );
78 
79  $this->collectionMock = $this->createPartialMock(
80  \Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\Collection::class,
81  ['addFieldToFilter', 'filterLastItem', 'getFirstItem']
82  );
83 
84  $this->dateTimeMock = $this->getMockBuilder(DateTime::class)
85  ->disableOriginalConstructor()
86  ->getMock();
87 
88  $this->remoteAddressMock = $this->getMockBuilder(RemoteAddress::class)
89  ->disableOriginalConstructor()
90  ->getMock();
91 
92  $this->model = $this->objectManager->getObject(
93  \Magento\Security\Model\SecurityChecker\Frequency::class,
94  [
95  'securityConfig' => $this->securityConfigMock,
96  'collectionFactory' => $this->collectionFactoryMock,
97  'dateTime' => $this->dateTimeMock,
98  'remoteAddress' => $this->remoteAddressMock
99  ]
100  );
101  }
102 
108  public function testCheck($securityEventType, $requestsMethod)
109  {
110  $limitTimeBetweenPasswordResetRequests = 600;
111  $timestamp = time();
112 
113  $this->prepareTestCheck($requestsMethod, $limitTimeBetweenPasswordResetRequests);
114 
115  $this->dateTimeMock->expects($this->once())
116  ->method('gmtTimestamp')
117  ->willReturn($timestamp);
118 
120  $record = $this->objectManager->getObject(\Magento\Security\Model\PasswordResetRequestEvent::class);
121  $record->setCreatedAt(
122  date("Y-m-d H:i:s", $timestamp - $limitTimeBetweenPasswordResetRequests)
123  );
124 
125  $this->collectionMock->expects($this->once())
126  ->method('getFirstItem')
127  ->willReturn($record);
128 
129  $this->model->check($securityEventType);
130  }
131 
138  public function testCheckException($securityEventType, $requestsMethod)
139  {
140  $limitTimeBetweenPasswordResetRequests = 600;
141  $timestamp = time();
142 
143  $this->prepareTestCheck($requestsMethod, $limitTimeBetweenPasswordResetRequests);
144 
145  $this->dateTimeMock->expects($this->once())
146  ->method('gmtTimestamp')
147  ->willReturn($timestamp);
148 
150  $record = $this->objectManager->getObject(\Magento\Security\Model\PasswordResetRequestEvent::class);
151  $record->setCreatedAt(
152  date("Y-m-d H:i:s", $timestamp - $limitTimeBetweenPasswordResetRequests + 1)
153  );
154 
155  $this->collectionMock->expects($this->once())
156  ->method('getFirstItem')
157  ->willReturn($record);
158 
159  $this->model->check($securityEventType);
160 
161  $this->expectExceptionMessage(
162  'We received too many requests for password resets. '
163  . 'Please wait and try again later or contact [email protected].'
164  );
165  }
166 
171  {
172  return [
173  [
175  \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_IP_AND_EMAIL
176  ],
177  [
179  \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_IP
180  ],
181  [
183  \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_EMAIL
184  ],
185  [
187  \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_IP_AND_EMAIL
188  ],
189  [
191  \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_IP
192  ],
193  [
195  \Magento\Security\Model\Config\Source\ResetMethod::OPTION_BY_EMAIL
196  ],
197  ];
198  }
199 
204  protected function prepareTestCheck($requestsMethod, $limitTimeBetweenPasswordResetRequests)
205  {
206  $this->remoteAddressMock->expects($this->once())
207  ->method('getRemoteAddress')
208  ->will($this->returnValue(12345));
209 
210  $this->securityConfigMock->expects($this->any())
211  ->method('getPasswordResetProtectionType')
212  ->will($this->returnValue($requestsMethod));
213 
214  $this->securityConfigMock->expects($this->once())
215  ->method('getMinTimeBetweenPasswordResetRequests')
216  ->will($this->returnValue($limitTimeBetweenPasswordResetRequests));
217 
218  $this->securityConfigMock->expects($this->any())
219  ->method('getCustomerServiceEmail')
220  ->will($this->returnValue('[email protected]'));
221 
222  $this->collectionFactoryMock->expects($this->once())
223  ->method('create')
224  ->willReturn($this->collectionMock);
225 
226  $this->collectionMock->expects($this->any())
227  ->method('addFieldToFilter')
228  ->willReturnSelf();
229 
230  $this->collectionMock->expects($this->once())
231  ->method('filterLastItem')
232  ->willReturnSelf();
233  }
234 }
prepareTestCheck($requestsMethod, $limitTimeBetweenPasswordResetRequests)