AuthTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\User\Controller\Adminhtml;
  7. use Magento\TestFramework\Mail\Template\TransportBuilderMock;
  8. use Magento\TestFramework\Helper\Bootstrap;
  9. /**
  10. * Test class for \Magento\User\Controller\Adminhtml\Auth
  11. *
  12. * @magentoAppArea adminhtml
  13. */
  14. class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController
  15. {
  16. /**
  17. * Test form existence
  18. * @covers \Magento\User\Controller\Adminhtml\Auth\Forgotpassword::execute
  19. */
  20. public function testFormForgotpasswordAction()
  21. {
  22. $this->dispatch('backend/admin/auth/forgotpassword');
  23. $expected = 'Password Help';
  24. $this->assertContains($expected, $this->getResponse()->getBody());
  25. }
  26. /**
  27. * Test redirection to startup page after success password recovering posting
  28. *
  29. * @covers \Magento\User\Controller\Adminhtml\Auth\Forgotpassword::execute
  30. * @magentoDbIsolation enabled
  31. */
  32. public function testForgotpasswordAction()
  33. {
  34. $this->getRequest()->setPostValue('email', 'test@test.com');
  35. $this->dispatch('backend/admin/auth/forgotpassword');
  36. $this->assertRedirect(
  37. $this->equalTo(
  38. Bootstrap::getObjectManager()->get(
  39. \Magento\Backend\Helper\Data::class
  40. )->getHomePageUrl()
  41. )
  42. );
  43. }
  44. /**
  45. * Test email sending for forgotPassword action
  46. *
  47. * @magentoAdminConfigFixture admin/emails/forgot_email_template admin_emails_forgot_email_template
  48. * @magentoAdminConfigFixture admin/emails/forgot_email_identity general
  49. * @magentoDataFixture Magento/User/_files/user_with_role.php
  50. */
  51. public function testEmailSendForgotPasswordAction()
  52. {
  53. /** @var TransportBuilderMock $transportMock */
  54. $transportMock = Bootstrap::getObjectManager()->get(
  55. TransportBuilderMock::class
  56. );
  57. $this->getRequest()->setPostValue('email', 'adminUser@example.com');
  58. $this->dispatch('backend/admin/auth/forgotpassword');
  59. $this->assertRedirect(
  60. $this->equalTo(
  61. Bootstrap::getObjectManager()->get(
  62. \Magento\Backend\Helper\Data::class
  63. )->getHomePageUrl()
  64. )
  65. );
  66. $message = $transportMock->getSentMessage();
  67. $this->assertNotEmpty($message);
  68. $this->assertEquals(
  69. __('Password Reset Confirmation for %1', ['John Doe'])->render(),
  70. $message->getSubject()
  71. );
  72. }
  73. /**
  74. * Test reset password action
  75. *
  76. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::execute
  77. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::_validateResetPasswordLinkToken
  78. * @magentoDataFixture Magento/User/_files/dummy_user.php
  79. */
  80. public function testResetPasswordAction()
  81. {
  82. /** @var $user \Magento\User\Model\User */
  83. $user = Bootstrap::getObjectManager()->create(
  84. \Magento\User\Model\User::class
  85. )->loadByUsername(
  86. 'dummy_username'
  87. );
  88. $this->assertNotEmpty($user->getId(), 'Broken fixture');
  89. $resetPasswordToken = Bootstrap::getObjectManager()->get(
  90. \Magento\User\Helper\Data::class
  91. )->generateResetPasswordLinkToken();
  92. $user->changeResetPasswordLinkToken($resetPasswordToken);
  93. $user->save();
  94. $this->getRequest()->setQueryValue('token', $resetPasswordToken)->setQueryValue('id', $user->getId());
  95. $this->dispatch('backend/admin/auth/resetpassword');
  96. $this->assertEquals('adminhtml', $this->getRequest()->getRouteName());
  97. $this->assertEquals('auth', $this->getRequest()->getControllerName());
  98. $this->assertEquals('resetpassword', $this->getRequest()->getActionName());
  99. $this->assertTrue((bool)strpos($this->getResponse()->getBody(), $resetPasswordToken));
  100. }
  101. /**
  102. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::execute
  103. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::_validateResetPasswordLinkToken
  104. */
  105. public function testResetPasswordActionWithDummyToken()
  106. {
  107. $this->getRequest()->setQueryValue('token', 'dummy')->setQueryValue('id', 1);
  108. $this->dispatch('backend/admin/auth/resetpassword');
  109. $this->assertSessionMessages(
  110. $this->equalTo(['Your password reset link has expired.']),
  111. \Magento\Framework\Message\MessageInterface::TYPE_ERROR
  112. );
  113. $this->assertRedirect();
  114. }
  115. /**
  116. * @dataProvider resetPasswordDataProvider
  117. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::execute
  118. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::_validateResetPasswordLinkToken
  119. * @magentoDataFixture Magento/User/_files/dummy_user.php
  120. */
  121. public function testResetPasswordPostAction($password, $passwordConfirmation, $isPasswordChanged)
  122. {
  123. $objectManager = Bootstrap::getObjectManager();
  124. /** @var $user \Magento\User\Model\User */
  125. $user = $objectManager->create(\Magento\User\Model\User::class);
  126. $user->loadByUsername('dummy_username');
  127. $this->assertNotEmpty($user->getId(), 'Broken fixture');
  128. /** @var \Magento\User\Helper\Data $helper */
  129. $helper = $objectManager->get(\Magento\User\Helper\Data::class);
  130. $resetPasswordToken = $helper->generateResetPasswordLinkToken();
  131. $user->changeResetPasswordLinkToken($resetPasswordToken);
  132. $user->save();
  133. $oldPassword = $user->getPassword();
  134. $this->getRequest()->setQueryValue(
  135. 'token',
  136. $resetPasswordToken
  137. )->setQueryValue(
  138. 'id',
  139. $user->getId()
  140. )->setPostValue(
  141. 'password',
  142. $password
  143. )->setPostValue(
  144. 'confirmation',
  145. $passwordConfirmation
  146. );
  147. $this->dispatch('backend/admin/auth/resetpasswordpost');
  148. /** @var \Magento\Backend\Helper\Data $backendHelper */
  149. $backendHelper = $objectManager->get(\Magento\Backend\Helper\Data::class);
  150. if ($isPasswordChanged) {
  151. $this->assertRedirect($this->equalTo($backendHelper->getHomePageUrl()));
  152. } else {
  153. $this->assertRedirect(
  154. $this->stringContains('backend/admin/auth/resetpassword')
  155. );
  156. }
  157. /** @var $user \Magento\User\Model\User */
  158. $user = $objectManager->create(\Magento\User\Model\User::class);
  159. $user->loadByUsername('dummy_username');
  160. if ($isPasswordChanged) {
  161. /** @var \Magento\Framework\Encryption\EncryptorInterface $encryptor */
  162. $encryptor = $objectManager->get(\Magento\Framework\Encryption\EncryptorInterface::class);
  163. $this->assertTrue($encryptor->validateHash($password, $user->getPassword()));
  164. } else {
  165. $this->assertEquals($oldPassword, $user->getPassword());
  166. }
  167. }
  168. public function resetPasswordDataProvider()
  169. {
  170. $password = uniqid('123q');
  171. return [
  172. [$password, $password, true],
  173. [$password, '', false],
  174. [$password, $password . '123', false],
  175. ['', '', false],
  176. ['', $password, false]
  177. ];
  178. }
  179. /**
  180. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::execute
  181. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::_validateResetPasswordLinkToken
  182. * @magentoDataFixture Magento/User/_files/dummy_user.php
  183. */
  184. public function testResetPasswordPostActionWithDummyToken()
  185. {
  186. $this->getRequest()->setQueryValue('token', 'dummy')->setQueryValue('id', 1);
  187. $this->dispatch('backend/admin/auth/resetpasswordpost');
  188. $this->assertSessionMessages(
  189. $this->equalTo(['Your password reset link has expired.']),
  190. \Magento\Framework\Message\MessageInterface::TYPE_ERROR
  191. );
  192. $objectManager = Bootstrap::getObjectManager();
  193. /** @var \Magento\Backend\Helper\Data $backendHelper */
  194. $backendHelper = $objectManager->get(\Magento\Backend\Helper\Data::class);
  195. $this->assertRedirect($this->equalTo($backendHelper->getHomePageUrl()));
  196. }
  197. /**
  198. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::execute
  199. * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::_validateResetPasswordLinkToken
  200. * @magentoDataFixture Magento/User/_files/dummy_user.php
  201. */
  202. public function testResetPasswordPostActionWithInvalidPassword()
  203. {
  204. $objectManager = Bootstrap::getObjectManager();
  205. $user = $objectManager->create(\Magento\User\Model\User::class);
  206. $user->loadByUsername('dummy_username');
  207. $resetPasswordToken = null;
  208. if ($user->getId()) {
  209. /** @var \Magento\User\Helper\Data $userHelper */
  210. $userHelper = $objectManager->get(\Magento\User\Helper\Data::class);
  211. $resetPasswordToken = $userHelper->generateResetPasswordLinkToken();
  212. $user->changeResetPasswordLinkToken($resetPasswordToken);
  213. $user->save();
  214. }
  215. $newDummyPassword = 'new_dummy_password2';
  216. $this->getRequest()->setQueryValue(
  217. 'token',
  218. $resetPasswordToken
  219. )->setQueryValue(
  220. 'id',
  221. $user->getId()
  222. )->setPostValue(
  223. 'password',
  224. $newDummyPassword
  225. )->setPostValue(
  226. 'confirmation',
  227. 'invalid'
  228. );
  229. $this->dispatch('backend/admin/auth/resetpasswordpost');
  230. $this->assertSessionMessages(
  231. $this->equalTo(['Your password confirmation must match your password.']),
  232. \Magento\Framework\Message\MessageInterface::TYPE_ERROR
  233. );
  234. $this->assertRedirect();
  235. }
  236. /**
  237. * Prepare email mock to test emails
  238. *
  239. * @param int $occurrenceNumber
  240. * @param string $templateId
  241. * @param string $sender
  242. * @return \PHPUnit_Framework_MockObject_MockObject
  243. */
  244. protected function prepareEmailMock($occurrenceNumber, $templateId, $sender)
  245. {
  246. $transportMock = $this->getMockBuilder(\Magento\Framework\Mail\TransportInterface::class)
  247. ->setMethods(['sendMessage'])
  248. ->getMockForAbstractClass();
  249. $transportMock->expects($this->exactly($occurrenceNumber))
  250. ->method('sendMessage');
  251. $transportBuilderMock = $this->getMockBuilder(\Magento\Framework\Mail\Template\TransportBuilder::class)
  252. ->disableOriginalConstructor()
  253. ->setMethods(
  254. [
  255. 'setTemplateModel',
  256. 'addTo',
  257. 'setFrom',
  258. 'setTemplateIdentifier',
  259. 'setTemplateVars',
  260. 'setTemplateOptions',
  261. 'getTransport'
  262. ]
  263. )
  264. ->getMock();
  265. $transportBuilderMock->method('setTemplateIdentifier')
  266. ->with($templateId)
  267. ->willReturnSelf();
  268. $transportBuilderMock->method('setTemplateModel')
  269. ->with(\Magento\Email\Model\BackendTemplate::class)
  270. ->willReturnSelf();
  271. $transportBuilderMock->method('setTemplateOptions')
  272. ->willReturnSelf();
  273. $transportBuilderMock->method('setTemplateVars')
  274. ->willReturnSelf();
  275. $transportBuilderMock->method('setFrom')
  276. ->with($sender)
  277. ->willReturnSelf();
  278. $transportBuilderMock->method('addTo')
  279. ->willReturnSelf();
  280. $transportBuilderMock->expects($this->exactly($occurrenceNumber))
  281. ->method('getTransport')
  282. ->willReturn($transportMock);
  283. return $transportBuilderMock;
  284. }
  285. /**
  286. * Add mocked object to environment
  287. *
  288. * @param \PHPUnit_Framework_MockObject_MockObject $transportBuilderMock
  289. * @param string $originalClassName
  290. */
  291. protected function addMockToClass(
  292. \PHPUnit_Framework_MockObject_MockObject $transportBuilderMock,
  293. $originalClassName
  294. ) {
  295. $userMock = $this->_objectManager->create(
  296. $originalClassName,
  297. ['transportBuilder' => $transportBuilderMock]
  298. );
  299. $factoryMock = $this->getMockBuilder(\Magento\User\Model\UserFactory::class)
  300. ->disableOriginalConstructor()
  301. ->setMethods(
  302. [
  303. 'create'
  304. ]
  305. )
  306. ->getMock();
  307. $factoryMock->method('create')
  308. ->willReturn($userMock);
  309. $this->_objectManager->addSharedInstance(
  310. $factoryMock,
  311. \Magento\User\Model\UserFactory::class
  312. );
  313. }
  314. }