AuthObserverTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\User\Test\Unit\Observer\Backend;
  7. use Magento\Backend\App\ConfigInterface;
  8. use Magento\Backend\Model\Auth\Session;
  9. use Magento\Backend\Model\UrlInterface;
  10. use Magento\Framework\Encryption\EncryptorInterface;
  11. use Magento\Framework\Event;
  12. use Magento\Framework\Event\ManagerInterface as EventManagerInterface;
  13. use Magento\Framework\Event\Observer;
  14. use Magento\Framework\Exception\State\UserLockedException;
  15. use Magento\Framework\Message\Collection;
  16. use Magento\Framework\Message\ManagerInterface;
  17. use Magento\Framework\Message\MessageInterface;
  18. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  19. use Magento\User\Model\Backend\Config\ObserverConfig;
  20. use Magento\User\Model\ResourceModel\User;
  21. use Magento\User\Model\User as ModelUser;
  22. use Magento\User\Model\UserFactory;
  23. use Magento\User\Observer\Backend\AuthObserver;
  24. /**
  25. * Test class for Magento\User\Observer\Backend\AuthObserver
  26. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  27. */
  28. class AuthObserverTest extends \PHPUnit\Framework\TestCase
  29. {
  30. /** @var ObserverConfig */
  31. protected $observerConfig;
  32. /** @var ConfigInterface|\PHPUnit_Framework_MockObject_MockObject */
  33. protected $configInterfaceMock;
  34. /** @var User|\PHPUnit_Framework_MockObject_MockObject */
  35. protected $userMock;
  36. /** @var UrlInterface|\PHPUnit_Framework_MockObject_MockObject */
  37. protected $urlInterfaceMock;
  38. /** @var Session|\PHPUnit_Framework_MockObject_MockObject */
  39. protected $authSessionMock;
  40. /** @var UserFactory|\PHPUnit_Framework_MockObject_MockObject */
  41. protected $userFactoryMock;
  42. /** @var EncryptorInterface|\PHPUnit_Framework_MockObject_MockObject */
  43. protected $encryptorMock;
  44. /** @var ManagerInterface|\PHPUnit_Framework_MockObject_MockObject */
  45. protected $managerInterfaceMock;
  46. /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject */
  47. protected $messageInterfaceMock;
  48. /** @var EventManagerInterface|\PHPUnit_Framework_MockObject_MockObject */
  49. protected $eventManagerMock;
  50. /** @var AuthObserver */
  51. protected $model;
  52. protected function setUp()
  53. {
  54. $this->configInterfaceMock = $this->getMockBuilder(\Magento\Backend\App\ConfigInterface::class)
  55. ->disableOriginalConstructor()
  56. ->setMethods([])
  57. ->getMock();
  58. $this->userMock = $this->getMockBuilder(\Magento\User\Model\ResourceModel\User::class)
  59. ->disableOriginalConstructor()
  60. ->setMethods([])
  61. ->getMock();
  62. $this->urlInterfaceMock = $this->getMockBuilder(\Magento\Backend\Model\UrlInterface::class)
  63. ->disableOriginalConstructor()
  64. ->setMethods([])
  65. ->getMock();
  66. $this->authSessionMock = $this->getMockBuilder(\Magento\Backend\Model\Auth\Session::class)
  67. ->disableOriginalConstructor()
  68. ->setMethods(
  69. [
  70. 'setPciAdminUserIsPasswordExpired',
  71. 'unsPciAdminUserIsPasswordExpired',
  72. 'getPciAdminUserIsPasswordExpired',
  73. 'isLoggedIn',
  74. 'clearStorage'
  75. ]
  76. )->getMock();
  77. $this->userFactoryMock = $this->getMockBuilder(\Magento\User\Model\UserFactory::class)
  78. ->disableOriginalConstructor()
  79. ->setMethods(['create'])
  80. ->getMock();
  81. $this->encryptorMock = $this->getMockBuilder(\Magento\Framework\Encryption\EncryptorInterface::class)
  82. ->disableOriginalConstructor()
  83. ->setMethods([])
  84. ->getMock();
  85. $this->managerInterfaceMock = $this->getMockBuilder(\Magento\Framework\Message\ManagerInterface::class)
  86. ->disableOriginalConstructor()
  87. ->setMethods([])
  88. ->getMock();
  89. $this->messageInterfaceMock = $this->getMockBuilder(\Magento\Framework\Message\MessageInterface::class)
  90. ->disableOriginalConstructor()
  91. ->setMethods([])
  92. ->getMock();
  93. $this->eventManagerMock = $this->getMockBuilder(\Magento\Framework\Event\ManagerInterface::class)
  94. ->disableOriginalConstructor()
  95. ->setMethods([])
  96. ->getMockForAbstractClass();
  97. $helper = new ObjectManager($this);
  98. $this->observerConfig = $helper->getObject(
  99. \Magento\User\Model\Backend\Config\ObserverConfig::class,
  100. [
  101. 'backendConfig' => $this->configInterfaceMock
  102. ]
  103. );
  104. $this->model = $helper->getObject(
  105. \Magento\User\Observer\Backend\AuthObserver::class,
  106. [
  107. 'observerConfig' => $this->observerConfig,
  108. 'userResource' => $this->userMock,
  109. 'url' => $this->urlInterfaceMock,
  110. 'authSession' => $this->authSessionMock,
  111. 'userFactory' => $this->userFactoryMock,
  112. 'encryptor' => $this->encryptorMock,
  113. 'messageManager' => $this->managerInterfaceMock,
  114. 'messageInterface' => $this->messageInterfaceMock,
  115. 'eventManager' => $this->eventManagerMock
  116. ]
  117. );
  118. }
  119. public function testAdminAuthenticate()
  120. {
  121. $password = "myP@sw0rd";
  122. $uid = 123;
  123. $authResult = true;
  124. $lockExpires = false;
  125. $userPassword = [
  126. 'expires' => 1,
  127. 'last_updated' => 1496248367
  128. ];
  129. /** @var Observer|\PHPUnit_Framework_MockObject_MockObject $eventObserverMock */
  130. $eventObserverMock = $this->getMockBuilder(\Magento\Framework\Event\Observer::class)
  131. ->disableOriginalConstructor()
  132. ->setMethods([])
  133. ->getMock();
  134. /** @var Event|\PHPUnit_Framework_MockObject_MockObject */
  135. $eventMock = $this->getMockBuilder(\Magento\Framework\Event::class)
  136. ->disableOriginalConstructor()
  137. ->setMethods(['getPassword', 'getUser', 'getResult'])
  138. ->getMock();
  139. /** @var ModelUser|\PHPUnit_Framework_MockObject_MockObject $userMock */
  140. $userMock = $this->getMockBuilder(\Magento\User\Model\User::class)
  141. ->disableOriginalConstructor()
  142. ->setMethods(['getId', 'getLockExpires', 'getPassword', 'save'])
  143. ->getMock();
  144. $eventObserverMock->expects($this->atLeastOnce())->method('getEvent')->willReturn($eventMock);
  145. $eventMock->expects($this->once())->method('getPassword')->willReturn($password);
  146. $eventMock->expects($this->once())->method('getUser')->willReturn($userMock);
  147. $eventMock->expects($this->once())->method('getResult')->willReturn($authResult);
  148. $userMock->expects($this->atLeastOnce())->method('getId')->willReturn($uid);
  149. $userMock->expects($this->once())->method('getLockExpires')->willReturn($lockExpires);
  150. $this->userMock->expects($this->once())->method('unlock');
  151. $this->userMock->expects($this->once())->method('getLatestPassword')->willReturn($userPassword);
  152. $this->configInterfaceMock
  153. ->expects($this->atLeastOnce())
  154. ->method('getValue')
  155. ->willReturn(1);
  156. /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $collectionMock */
  157. $collectionMock = $this->getMockBuilder(\Magento\Framework\Message\Collection::class)
  158. ->disableOriginalConstructor()
  159. ->setMethods([])
  160. ->getMock();
  161. $this->managerInterfaceMock->expects($this->once())->method('getMessages')->willReturn($collectionMock);
  162. $collectionMock
  163. ->expects($this->once())
  164. ->method('getLastAddedMessage')
  165. ->willReturn($this->messageInterfaceMock);
  166. $this->messageInterfaceMock->expects($this->once())->method('setIdentifier')->willReturnSelf();
  167. $this->authSessionMock->expects($this->once())->method('setPciAdminUserIsPasswordExpired');
  168. $this->encryptorMock->expects($this->once())->method('validateHashVersion')->willReturn(false);
  169. $this->model->execute($eventObserverMock);
  170. }
  171. public function testAdminAuthenticateThrowsException()
  172. {
  173. $password = "myP@sw0rd";
  174. $authResult = true;
  175. $lockExpires = '3015-07-08 11:14:15.638276';
  176. /** @var Observer|\PHPUnit_Framework_MockObject_MockObject $eventObserverMock */
  177. $eventObserverMock = $this->getMockBuilder(\Magento\Framework\Event\Observer::class)
  178. ->disableOriginalConstructor()
  179. ->setMethods([])
  180. ->getMock();
  181. /** @var Event|\PHPUnit_Framework_MockObject_MockObject */
  182. $eventMock = $this->getMockBuilder(\Magento\Framework\Event::class)
  183. ->disableOriginalConstructor()
  184. ->setMethods(['getPassword', 'getUser', 'getResult'])
  185. ->getMock();
  186. /** @var ModelUser|\PHPUnit_Framework_MockObject_MockObject $userMock */
  187. $userMock = $this->getMockBuilder(\Magento\User\Model\User::class)
  188. ->disableOriginalConstructor()
  189. ->setMethods(['getId', 'getLockExpires', 'getPassword'])
  190. ->getMock();
  191. $eventObserverMock->expects($this->atLeastOnce())->method('getEvent')->willReturn($eventMock);
  192. $eventMock->expects($this->once())->method('getPassword')->willReturn($password);
  193. $eventMock->expects($this->once())->method('getUser')->willReturn($userMock);
  194. $eventMock->expects($this->once())->method('getResult')->willReturn($authResult);
  195. $userMock->expects($this->once())->method('getLockExpires')->willReturn($lockExpires);
  196. try {
  197. $this->model->execute($eventObserverMock);
  198. } catch (UserLockedException $expected) {
  199. return;
  200. }
  201. $this->fail('An expected exception has not been raised.');
  202. }
  203. public function testAdminAuthenticateUpdateLockingInfo()
  204. {
  205. $password = "myP@sw0rd";
  206. $uid = 123;
  207. $authResult = false;
  208. $firstFailure = '1965-07-08 11:14:15.638276';
  209. $numOfFailures = 5;
  210. /** @var Observer|\PHPUnit_Framework_MockObject_MockObject $eventObserverMock */
  211. $eventObserverMock = $this->getMockBuilder(\Magento\Framework\Event\Observer::class)
  212. ->disableOriginalConstructor()
  213. ->setMethods([])
  214. ->getMock();
  215. /** @var Event|\PHPUnit_Framework_MockObject_MockObject */
  216. $eventMock = $this->getMockBuilder(\Magento\Framework\Event::class)
  217. ->disableOriginalConstructor()
  218. ->setMethods(['getPassword', 'getUser', 'getResult'])
  219. ->getMock();
  220. /** @var ModelUser|\PHPUnit_Framework_MockObject_MockObject $userMock */
  221. $userMock = $this->getMockBuilder(\Magento\User\Model\User::class)
  222. ->disableOriginalConstructor()
  223. ->setMethods(['getId', 'getFailuresNum', 'getFirstFailure'])
  224. ->getMock();
  225. $eventObserverMock->expects($this->atLeastOnce())->method('getEvent')->willReturn($eventMock);
  226. $eventMock->expects($this->once())->method('getPassword')->willReturn($password);
  227. $eventMock->expects($this->once())->method('getUser')->willReturn($userMock);
  228. $eventMock->expects($this->once())->method('getResult')->willReturn($authResult);
  229. $userMock->expects($this->once())->method('getId')->willReturn($uid);
  230. $this->configInterfaceMock
  231. ->expects($this->atLeastOnce())
  232. ->method('getValue')
  233. ->willReturn(1);
  234. $userMock->expects($this->once())->method('getFailuresNum')->willReturn($numOfFailures);
  235. $userMock->expects($this->once())->method('getFirstFailure')->willReturn($firstFailure);
  236. $this->userMock->expects($this->once())->method('updateFailure');
  237. $this->model->execute($eventObserverMock);
  238. }
  239. }