178 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Security\Model;
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests for \Magento\Security\Model\UserExpirationManager
 | 
						|
 * @magentoAppArea adminhtml
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class UserExpirationManagerTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var \Magento\Framework\ObjectManagerInterface
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Backend\Model\Auth
 | 
						|
     */
 | 
						|
    private $auth;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Backend\Model\Auth\Session
 | 
						|
     */
 | 
						|
    private $authSession;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Security\Model\AdminSessionInfo
 | 
						|
     */
 | 
						|
    private $adminSessionInfo;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Security\Model\UserExpirationManager
 | 
						|
     */
 | 
						|
    private $userExpirationManager;
 | 
						|
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 | 
						|
        $this->auth = $this->objectManager->create(\Magento\Backend\Model\Auth::class);
 | 
						|
        $this->authSession = $this->objectManager->create(\Magento\Backend\Model\Auth\Session::class);
 | 
						|
        $this->adminSessionInfo = $this->objectManager->create(\Magento\Security\Model\AdminSessionInfo::class);
 | 
						|
        $this->auth->setAuthStorage($this->authSession);
 | 
						|
        $this->userExpirationManager =
 | 
						|
            $this->objectManager->create(\Magento\Security\Model\UserExpirationManager::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Security/_files/expired_users.php
 | 
						|
     */
 | 
						|
    public function testUserIsExpired()
 | 
						|
    {
 | 
						|
        $adminUserNameFromFixture = 'adminUserExpired';
 | 
						|
        $user = $this->loadUserByUsername($adminUserNameFromFixture);
 | 
						|
        static::assertTrue($this->userExpirationManager->isUserExpired($user->getId()));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Security/_files/expired_users.php
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     */
 | 
						|
    public function testDeactivateExpiredUsersWithExpiredUser()
 | 
						|
    {
 | 
						|
        $adminUsernameFromFixture = 'adminUserNotExpired';
 | 
						|
        $this->loginUser($adminUsernameFromFixture);
 | 
						|
        $user = $this->loadUserByUsername($adminUsernameFromFixture);
 | 
						|
        $adminSessionInfoId = $this->authSession->getAdminSessionInfoId();
 | 
						|
        $this->expireUser($user);
 | 
						|
        $this->userExpirationManager->deactivateExpiredUsersById([$user->getId()]);
 | 
						|
        $this->adminSessionInfo->load($adminSessionInfoId, 'id');
 | 
						|
        $user->reload();
 | 
						|
        $userExpirationModel = $this->loadExpiredUserModelByUser($user);
 | 
						|
        static::assertEquals(0, $user->getIsActive());
 | 
						|
        static::assertNull($userExpirationModel->getId());
 | 
						|
        static::assertEquals(AdminSessionInfo::LOGGED_OUT, (int)$this->adminSessionInfo->getStatus());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Security/_files/expired_users.php
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     */
 | 
						|
    public function testDeactivateExpiredUsersWithNonExpiredUser()
 | 
						|
    {
 | 
						|
        $adminUsernameFromFixture = 'adminUserNotExpired';
 | 
						|
        $this->loginUser($adminUsernameFromFixture);
 | 
						|
        $user = $this->loadUserByUsername($adminUsernameFromFixture);
 | 
						|
        $adminSessionInfoId = $this->authSession->getAdminSessionInfoId();
 | 
						|
        $this->userExpirationManager->deactivateExpiredUsersById([$user->getId()]);
 | 
						|
        $user->reload();
 | 
						|
        $userExpirationModel = $this->loadExpiredUserModelByUser($user);
 | 
						|
        $this->adminSessionInfo->load($adminSessionInfoId, 'id');
 | 
						|
        static::assertEquals(1, $user->getIsActive());
 | 
						|
        static::assertEquals($user->getId(), $userExpirationModel->getId());
 | 
						|
        static::assertEquals(AdminSessionInfo::LOGGED_IN, (int)$this->adminSessionInfo->getStatus());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test deactivating without inputting a user.
 | 
						|
     *
 | 
						|
     * @magentoDataFixture Magento/Security/_files/expired_users.php
 | 
						|
     */
 | 
						|
    public function testDeactivateExpiredUsers()
 | 
						|
    {
 | 
						|
        $notExpiredUser = $this->loadUserByUsername('adminUserNotExpired');
 | 
						|
        $expiredUser = $this->loadUserByUsername('adminUserExpired');
 | 
						|
        $this->userExpirationManager->deactivateExpiredUsers();
 | 
						|
        $notExpiredUserExpirationModel = $this->loadExpiredUserModelByUser($notExpiredUser);
 | 
						|
        $expiredUserExpirationModel = $this->loadExpiredUserModelByUser($expiredUser);
 | 
						|
 | 
						|
        static::assertNotNull($notExpiredUserExpirationModel->getId());
 | 
						|
        static::assertNull($expiredUserExpirationModel->getId());
 | 
						|
        $notExpiredUser->reload();
 | 
						|
        $expiredUser->reload();
 | 
						|
        static::assertEquals($notExpiredUser->getIsActive(), 1);
 | 
						|
        static::assertEquals($expiredUser->getIsActive(), 0);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Login the given user and return a user model.
 | 
						|
     *
 | 
						|
     * @param string $username
 | 
						|
     * @throws \Magento\Framework\Exception\AuthenticationException
 | 
						|
     */
 | 
						|
    private function loginUser(string $username)
 | 
						|
    {
 | 
						|
        $this->auth->login(
 | 
						|
            $username,
 | 
						|
            \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param $username
 | 
						|
     * @return \Magento\User\Model\User
 | 
						|
     */
 | 
						|
    private function loadUserByUsername(string $username): \Magento\User\Model\User
 | 
						|
    {
 | 
						|
        /** @var \Magento\User\Model\User $user */
 | 
						|
        $user = $this->objectManager->create(\Magento\User\Model\User::class);
 | 
						|
        $user->loadByUsername($username);
 | 
						|
        return $user;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Expire the given user and return the UserExpiration model.
 | 
						|
     *
 | 
						|
     * @param \Magento\User\Model\User $user
 | 
						|
     * @throws \Exception
 | 
						|
     */
 | 
						|
    private function expireUser(\Magento\User\Model\User $user)
 | 
						|
    {
 | 
						|
        $expireDate = new \DateTime();
 | 
						|
        $expireDate->modify('-10 days');
 | 
						|
        /** @var \Magento\Security\Api\Data\UserExpirationInterface $userExpiration */
 | 
						|
        $userExpiration = $this->objectManager->create(\Magento\Security\Api\Data\UserExpirationInterface::class);
 | 
						|
        $userExpiration->setId($user->getId())
 | 
						|
            ->setExpiresAt($expireDate->format('Y-m-d H:i:s'))
 | 
						|
            ->save();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param \Magento\User\Model\User $user
 | 
						|
     * @return \Magento\Security\Model\UserExpiration
 | 
						|
     */
 | 
						|
    private function loadExpiredUserModelByUser(\Magento\User\Model\User $user): \Magento\Security\Model\UserExpiration
 | 
						|
    {
 | 
						|
        /** @var \Magento\Security\Model\UserExpiration $expiredUserModel */
 | 
						|
        $expiredUserModel = $this->objectManager->create(\Magento\Security\Model\UserExpiration::class);
 | 
						|
        $expiredUserModel->load($user->getId());
 | 
						|
        return $expiredUserModel;
 | 
						|
    }
 | 
						|
}
 |