389 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			389 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\User\Controller\Adminhtml;
 | 
						|
 | 
						|
use Magento\Framework\Intl\DateTimeFactory;
 | 
						|
use Magento\Framework\Stdlib\DateTime;
 | 
						|
use Magento\TestFramework\Mail\Template\TransportBuilderMock;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test class for \Magento\User\Controller\Adminhtml\Auth
 | 
						|
 *
 | 
						|
 * @magentoAppArea adminhtml
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Test form existence
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\Forgotpassword::execute
 | 
						|
     */
 | 
						|
    public function testFormForgotpasswordAction()
 | 
						|
    {
 | 
						|
        $this->dispatch('backend/admin/auth/forgotpassword');
 | 
						|
        $expected = 'Password Help';
 | 
						|
        $this->assertStringContainsString($expected, $this->getResponse()->getBody());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test redirection to startup page after success password recovering posting
 | 
						|
     *
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\Forgotpassword::execute
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     */
 | 
						|
    public function testForgotpasswordAction()
 | 
						|
    {
 | 
						|
        $this->getRequest()->setPostValue('email', 'test@test.com');
 | 
						|
        $this->dispatch('backend/admin/auth/forgotpassword');
 | 
						|
        $this->assertRedirect(
 | 
						|
            $this->equalTo(
 | 
						|
                Bootstrap::getObjectManager()->get(
 | 
						|
                    \Magento\Backend\Helper\Data::class
 | 
						|
                )->getHomePageUrl()
 | 
						|
            )
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test email sending for forgotPassword action
 | 
						|
     *
 | 
						|
     * @magentoAdminConfigFixture admin/emails/forgot_email_template admin_emails_forgot_email_template
 | 
						|
     * @magentoAdminConfigFixture admin/emails/forgot_email_identity general
 | 
						|
     * @magentoDataFixture Magento/User/_files/user_with_role.php
 | 
						|
     */
 | 
						|
    public function testEmailSendForgotPasswordAction()
 | 
						|
    {
 | 
						|
        /** @var TransportBuilderMock $transportMock */
 | 
						|
        $transportMock = Bootstrap::getObjectManager()->get(
 | 
						|
            TransportBuilderMock::class
 | 
						|
        );
 | 
						|
        $this->getRequest()->setPostValue('email', 'adminUser@example.com');
 | 
						|
        $this->dispatch('backend/admin/auth/forgotpassword');
 | 
						|
        $this->assertRedirect(
 | 
						|
            $this->equalTo(
 | 
						|
                Bootstrap::getObjectManager()->get(
 | 
						|
                    \Magento\Backend\Helper\Data::class
 | 
						|
                )->getHomePageUrl()
 | 
						|
            )
 | 
						|
        );
 | 
						|
        $message = $transportMock->getSentMessage();
 | 
						|
        $this->assertNotEmpty($message);
 | 
						|
        $this->assertEquals(
 | 
						|
            __('Password Reset Confirmation for %1', ['John Doe'])->render(),
 | 
						|
            $message->getSubject()
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test reset password action
 | 
						|
     *
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::execute
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::_validateResetPasswordLinkToken
 | 
						|
     * @magentoDataFixture Magento/User/_files/dummy_user.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordAction()
 | 
						|
    {
 | 
						|
        /** @var $user \Magento\User\Model\User */
 | 
						|
        $user = Bootstrap::getObjectManager()->create(
 | 
						|
            \Magento\User\Model\User::class
 | 
						|
        )->loadByUsername(
 | 
						|
            'dummy_username'
 | 
						|
        );
 | 
						|
        $this->assertNotEmpty($user->getId(), 'Broken fixture');
 | 
						|
        $resetPasswordToken = Bootstrap::getObjectManager()->get(
 | 
						|
            \Magento\User\Helper\Data::class
 | 
						|
        )->generateResetPasswordLinkToken();
 | 
						|
        $user->changeResetPasswordLinkToken($resetPasswordToken);
 | 
						|
        $user->save();
 | 
						|
 | 
						|
        $this->getRequest()->setQueryValue('token', $resetPasswordToken)->setQueryValue('id', $user->getId());
 | 
						|
        $this->dispatch('backend/admin/auth/resetpassword');
 | 
						|
 | 
						|
        $this->assertEquals('adminhtml', $this->getRequest()->getRouteName());
 | 
						|
        $this->assertEquals('auth', $this->getRequest()->getControllerName());
 | 
						|
        $this->assertEquals('resetpassword', $this->getRequest()->getActionName());
 | 
						|
        $this->assertTrue((bool)strpos($this->getResponse()->getBody(), $resetPasswordToken));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test reset password action extends expiry of token
 | 
						|
     *
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::execute
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::_validateResetPasswordLinkToken
 | 
						|
     * @magentoDataFixture Magento/User/_files/dummy_user.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordActionWithTokenNearExpiry()
 | 
						|
    {
 | 
						|
        /** @var $user \Magento\User\Model\User */
 | 
						|
        $user = Bootstrap::getObjectManager()->create(
 | 
						|
            \Magento\User\Model\User::class
 | 
						|
        )->loadByUsername(
 | 
						|
            'dummy_username'
 | 
						|
        );
 | 
						|
        $this->assertNotEmpty($user->getId(), 'Broken fixture');
 | 
						|
        $resetPasswordToken = Bootstrap::getObjectManager()->get(
 | 
						|
            \Magento\User\Helper\Data::class
 | 
						|
        )->generateResetPasswordLinkToken();
 | 
						|
        $user->changeResetPasswordLinkToken($resetPasswordToken);
 | 
						|
 | 
						|
        $anHourAgo = Bootstrap::getObjectManager()->create(DateTimeFactory::class)
 | 
						|
            ->create()
 | 
						|
            ->sub(\DateInterval::createFromDateString('1 hour'))
 | 
						|
            ->format(DateTime::DATETIME_PHP_FORMAT);
 | 
						|
        $user->setRpTokenCreatedAt($anHourAgo);
 | 
						|
        $user->save();
 | 
						|
 | 
						|
        $this->getRequest()->setQueryValue('token', $resetPasswordToken)->setQueryValue('id', $user->getId());
 | 
						|
        $this->dispatch('backend/admin/auth/resetpassword');
 | 
						|
 | 
						|
        $this->assertEquals('adminhtml', $this->getRequest()->getRouteName());
 | 
						|
        $this->assertEquals('auth', $this->getRequest()->getControllerName());
 | 
						|
        $this->assertEquals('resetpassword', $this->getRequest()->getActionName());
 | 
						|
        $this->assertTrue((bool)strpos($this->getResponse()->getBody(), $resetPasswordToken));
 | 
						|
 | 
						|
        $this->assertNotEquals($anHourAgo, $user->reload()->getRpTokenCreatedAt());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::execute
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPassword::_validateResetPasswordLinkToken
 | 
						|
     */
 | 
						|
    public function testResetPasswordActionWithDummyToken()
 | 
						|
    {
 | 
						|
        $this->getRequest()->setQueryValue('token', 'dummy')->setQueryValue('id', 1);
 | 
						|
        $this->dispatch('backend/admin/auth/resetpassword');
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->equalTo(['Your password reset link has expired.']),
 | 
						|
            \Magento\Framework\Message\MessageInterface::TYPE_ERROR
 | 
						|
        );
 | 
						|
        $this->assertRedirect();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @dataProvider resetPasswordDataProvider
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::execute
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::_validateResetPasswordLinkToken
 | 
						|
     * @magentoDataFixture Magento/User/_files/dummy_user.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordPostAction($password, $passwordConfirmation, $isPasswordChanged)
 | 
						|
    {
 | 
						|
        $objectManager = Bootstrap::getObjectManager();
 | 
						|
 | 
						|
        /** @var $user \Magento\User\Model\User */
 | 
						|
        $user = $objectManager->create(\Magento\User\Model\User::class);
 | 
						|
        $user->loadByUsername('dummy_username');
 | 
						|
        $this->assertNotEmpty($user->getId(), 'Broken fixture');
 | 
						|
 | 
						|
        /** @var \Magento\User\Helper\Data $helper */
 | 
						|
        $helper = $objectManager->get(\Magento\User\Helper\Data::class);
 | 
						|
 | 
						|
        $resetPasswordToken = $helper->generateResetPasswordLinkToken();
 | 
						|
        $user->changeResetPasswordLinkToken($resetPasswordToken);
 | 
						|
        $user->save();
 | 
						|
        $oldPassword = $user->getPassword();
 | 
						|
 | 
						|
        $this->getRequest()->setQueryValue(
 | 
						|
            'token',
 | 
						|
            $resetPasswordToken
 | 
						|
        )->setQueryValue(
 | 
						|
            'id',
 | 
						|
            $user->getId()
 | 
						|
        )->setPostValue(
 | 
						|
            'password',
 | 
						|
            $password
 | 
						|
        )->setPostValue(
 | 
						|
            'confirmation',
 | 
						|
            $passwordConfirmation
 | 
						|
        );
 | 
						|
 | 
						|
        $this->dispatch('backend/admin/auth/resetpasswordpost');
 | 
						|
 | 
						|
        /** @var \Magento\Backend\Helper\Data $backendHelper */
 | 
						|
        $backendHelper = $objectManager->get(\Magento\Backend\Helper\Data::class);
 | 
						|
        if ($isPasswordChanged) {
 | 
						|
            $this->assertRedirect($this->equalTo($backendHelper->getHomePageUrl()));
 | 
						|
        } else {
 | 
						|
            $this->assertRedirect(
 | 
						|
                $this->stringContains('backend/admin/auth/resetpassword')
 | 
						|
            );
 | 
						|
        }
 | 
						|
 | 
						|
        /** @var $user \Magento\User\Model\User */
 | 
						|
        $user = $objectManager->create(\Magento\User\Model\User::class);
 | 
						|
        $user->loadByUsername('dummy_username');
 | 
						|
 | 
						|
        if ($isPasswordChanged) {
 | 
						|
            /** @var \Magento\Framework\Encryption\EncryptorInterface $encryptor */
 | 
						|
            $encryptor = $objectManager->get(\Magento\Framework\Encryption\EncryptorInterface::class);
 | 
						|
            $this->assertTrue($encryptor->validateHash($password, $user->getPassword()));
 | 
						|
        } else {
 | 
						|
            $this->assertEquals($oldPassword, $user->getPassword());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function resetPasswordDataProvider()
 | 
						|
    {
 | 
						|
        $password = uniqid('123q');
 | 
						|
        return [
 | 
						|
            [$password, $password, true],
 | 
						|
            [$password, '', false],
 | 
						|
            [$password, $password . '123', false],
 | 
						|
            ['', '', false],
 | 
						|
            ['', $password, false]
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::execute
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::_validateResetPasswordLinkToken
 | 
						|
     * @magentoDataFixture Magento/User/_files/dummy_user.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordPostActionWithDummyToken()
 | 
						|
    {
 | 
						|
        $this->getRequest()->setQueryValue('token', 'dummy')->setQueryValue('id', 1);
 | 
						|
        $this->dispatch('backend/admin/auth/resetpasswordpost');
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->equalTo(['Your password reset link has expired.']),
 | 
						|
            \Magento\Framework\Message\MessageInterface::TYPE_ERROR
 | 
						|
        );
 | 
						|
 | 
						|
        $objectManager = Bootstrap::getObjectManager();
 | 
						|
 | 
						|
        /** @var \Magento\Backend\Helper\Data $backendHelper */
 | 
						|
        $backendHelper = $objectManager->get(\Magento\Backend\Helper\Data::class);
 | 
						|
 | 
						|
        $this->assertRedirect($this->equalTo($backendHelper->getHomePageUrl()));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::execute
 | 
						|
     * @covers \Magento\User\Controller\Adminhtml\Auth\ResetPasswordPost::_validateResetPasswordLinkToken
 | 
						|
     * @magentoDataFixture Magento/User/_files/dummy_user.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordPostActionWithInvalidPassword()
 | 
						|
    {
 | 
						|
        $objectManager = Bootstrap::getObjectManager();
 | 
						|
 | 
						|
        $user = $objectManager->create(\Magento\User\Model\User::class);
 | 
						|
        $user->loadByUsername('dummy_username');
 | 
						|
        $resetPasswordToken = null;
 | 
						|
        if ($user->getId()) {
 | 
						|
            /** @var \Magento\User\Helper\Data $userHelper */
 | 
						|
            $userHelper = $objectManager->get(\Magento\User\Helper\Data::class);
 | 
						|
 | 
						|
            $resetPasswordToken = $userHelper->generateResetPasswordLinkToken();
 | 
						|
            $user->changeResetPasswordLinkToken($resetPasswordToken);
 | 
						|
            $user->save();
 | 
						|
        }
 | 
						|
 | 
						|
        $newDummyPassword = 'new_dummy_password2';
 | 
						|
 | 
						|
        $this->getRequest()->setQueryValue(
 | 
						|
            'token',
 | 
						|
            $resetPasswordToken
 | 
						|
        )->setQueryValue(
 | 
						|
            'id',
 | 
						|
            $user->getId()
 | 
						|
        )->setPostValue(
 | 
						|
            'password',
 | 
						|
            $newDummyPassword
 | 
						|
        )->setPostValue(
 | 
						|
            'confirmation',
 | 
						|
            'invalid'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->dispatch('backend/admin/auth/resetpasswordpost');
 | 
						|
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->equalTo(['Your password confirmation must match your password.']),
 | 
						|
            \Magento\Framework\Message\MessageInterface::TYPE_ERROR
 | 
						|
        );
 | 
						|
        $this->assertRedirect();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Prepare email mock to test emails
 | 
						|
     *
 | 
						|
     * @param int $occurrenceNumber
 | 
						|
     * @param string $templateId
 | 
						|
     * @param string $sender
 | 
						|
     * @return \PHPUnit\Framework\MockObject\MockObject
 | 
						|
     */
 | 
						|
    protected function prepareEmailMock($occurrenceNumber, $templateId, $sender)
 | 
						|
    {
 | 
						|
        $transportMock = $this->getMockBuilder(\Magento\Framework\Mail\TransportInterface::class)
 | 
						|
            ->setMethods(['sendMessage'])
 | 
						|
            ->getMockForAbstractClass();
 | 
						|
        $transportMock->expects($this->exactly($occurrenceNumber))
 | 
						|
            ->method('sendMessage');
 | 
						|
        $transportBuilderMock = $this->getMockBuilder(\Magento\Framework\Mail\Template\TransportBuilder::class)
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->setMethods(
 | 
						|
                [
 | 
						|
                    'setTemplateModel',
 | 
						|
                    'addTo',
 | 
						|
                    'setFrom',
 | 
						|
                    'setTemplateIdentifier',
 | 
						|
                    'setTemplateVars',
 | 
						|
                    'setTemplateOptions',
 | 
						|
                    'getTransport'
 | 
						|
                ]
 | 
						|
            )
 | 
						|
            ->getMock();
 | 
						|
        $transportBuilderMock->method('setTemplateIdentifier')
 | 
						|
            ->with($templateId)
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->method('setTemplateModel')
 | 
						|
            ->with(\Magento\Email\Model\BackendTemplate::class)
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->method('setTemplateOptions')
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->method('setTemplateVars')
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->method('setFrom')
 | 
						|
            ->with($sender)
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->method('addTo')
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->expects($this->exactly($occurrenceNumber))
 | 
						|
            ->method('getTransport')
 | 
						|
            ->willReturn($transportMock);
 | 
						|
 | 
						|
        return $transportBuilderMock;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Add mocked object to environment
 | 
						|
     *
 | 
						|
     * @param \PHPUnit\Framework\MockObject\MockObject $transportBuilderMock
 | 
						|
     * @param string $originalClassName
 | 
						|
     */
 | 
						|
    protected function addMockToClass(
 | 
						|
        \PHPUnit\Framework\MockObject\MockObject $transportBuilderMock,
 | 
						|
        $originalClassName
 | 
						|
    ) {
 | 
						|
        $userMock = $this->_objectManager->create(
 | 
						|
            $originalClassName,
 | 
						|
            ['transportBuilder' => $transportBuilderMock]
 | 
						|
        );
 | 
						|
        $factoryMock = $this->getMockBuilder(\Magento\User\Model\UserFactory::class)
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->setMethods(
 | 
						|
                [
 | 
						|
                    'create'
 | 
						|
                ]
 | 
						|
            )
 | 
						|
            ->getMock();
 | 
						|
        $factoryMock->method('create')
 | 
						|
            ->willReturn($userMock);
 | 
						|
        $this->_objectManager->addSharedInstance(
 | 
						|
            $factoryMock,
 | 
						|
            \Magento\User\Model\UserFactory::class
 | 
						|
        );
 | 
						|
    }
 | 
						|
}
 |