PageRenderTime 40ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 1ms

/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/AuthTest.php

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