oxtotp/Tests/Unit/Application/Model/d3backupcodelistTest.php
2024-09-29 23:28:35 +02:00

414 lines
14 KiB
PHP

<?php
/**
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* https://www.d3data.de
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <info@shopmodule.com>
* @link https://www.oxidmodule.com
*/
declare(strict_types=1);
namespace D3\Totp\Tests\Unit\Application\Model;
use D3\TestingTools\Development\CanAccessRestricted;
use D3\Totp\Application\Model\d3backupcode;
use D3\Totp\Application\Model\d3backupcodelist;
use D3\Totp\Tests\Unit\d3TotpUnitTestCase;
use Doctrine\DBAL\ForwardCompatibility\Result;
use Doctrine\DBAL\Query\QueryBuilder;
use OxidEsales\Eshop\Application\Controller\FrontendController;
use OxidEsales\Eshop\Application\Model\User;
use OxidEsales\Eshop\Core\Config;
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Database\ConnectionProviderInterface;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use ReflectionException;
class d3backupcodelistTest extends d3TotpUnitTestCase
{
use CanAccessRestricted;
/** @var d3backupcodelist */
protected d3backupcodelist $_oModel;
/**
* setup basic requirements
*/
public function setUp(): void
{
parent::setUp();
$this->_oModel = oxNew(d3backupcodelist::class);
}
public function tearDown(): void
{
parent::tearDown();
unset($this->_oModel);
}
/**
* @test
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::generateBackupCodes
*/
public function generateBackupCodes()
{
/** @var FrontendController|MockObject $oViewMock */
$oViewMock = $this->d3getMockBuilder(FrontendController::class)
->addMethods(['setBackupCodes'])
->getMock();
$oViewMock->expects($this->once())->method('setBackupCodes')->willReturn(true);
/** @var Config|MockObject $oConfigMock */
$oConfigMock = $this->d3getMockBuilder(Config::class)
->onlyMethods(['getActiveView'])
->getMock();
$oConfigMock->method('getActiveView')->willReturn($oViewMock);
/** @var d3backupcode|MockObject $oBackupCodeMock */
$oBackupCodeMock = $this->d3getMockBuilder(d3backupcode::class)
->onlyMethods(['generateCode'])
->getMock();
$oBackupCodeMock->expects($this->exactly(10))->method('generateCode');
/** @var d3backupcodelist|MockObject $oModelMock */
$oModelMock = $this->d3getMockBuilder(d3backupcodelist::class)
->onlyMethods([
'deleteAllFromUser',
'getD3BackupCodeObject',
'd3GetConfig',
])
->getMock();
$oModelMock->expects($this->once())->method('deleteAllFromUser');
$oModelMock->method('getD3BackupCodeObject')->willReturn($oBackupCodeMock);
$oModelMock->method('d3GetConfig')->willReturn($oConfigMock);
$this->_oModel = $oModelMock;
$this->callMethod($this->_oModel, 'generateBackupCodes', ['123456']);
}
/**
* @test
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::getD3BackupCodeObject
*/
public function getD3BackupCodeObjectReturnsRightObject()
{
$this->assertInstanceOf(
d3backupcode::class,
$this->callMethod($this->_oModel, 'getD3BackupCodeObject')
);
}
/**
* @test
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::d3GetConfig
*/
public function d3GetConfigReturnsRightObject()
{
$this->assertInstanceOf(
Config::class,
$this->callMethod($this->_oModel, 'd3GetConfig')
);
}
/**
* @test
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::save
*/
public function savePass()
{
/** @var d3backupcode|MockObject $oBackupCodeMock */
$oBackupCodeMock = $this->d3getMockBuilder(d3backupcode::class)
->onlyMethods(['save'])
->getMock();
$oBackupCodeMock->expects($this->once())->method('save')->willReturn(true);
$aBackupCodeArray = [
$oBackupCodeMock,
];
/** @var d3backupcodelist|MockObject $oModelMock */
$oModelMock = $this->d3getMockBuilder(d3backupcodelist::class)
->onlyMethods(['getArray'])
->getMock();
$oModelMock->expects($this->once())->method('getArray')->willReturn($aBackupCodeArray);
$this->_oModel = $oModelMock;
$this->callMethod($this->_oModel, 'save');
}
/**
* @test
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::getBaseObject
*/
public function getBaseObjectReturnsRightObject()
{
$oBaseObject = $this->callMethod($this->_oModel, 'getBaseObject');
$this->assertIsObject($oBaseObject);
$this->assertInstanceOf(d3backupcode::class, $oBaseObject);
}
/**
* @test
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::verify
*/
public function verifyFoundTotp()
{
/** @var User|MockObject $oUserMock */
$oUserMock = $this->d3getMockBuilder(User::class)
->onlyMethods(['getId'])
->getMock();
$oUserMock->method('getId')->willReturn('foobar');
$oUserMock->assign(['oxpasssalt' => '6162636465666768696A6B']);
/** @var d3backupcode|MockObject $oBackupCodeMock */
$oBackupCodeMock = $this->d3getMockBuilder(d3backupcode::class)
->onlyMethods(['delete', 'd3TotpGetUserObject'])
->getMock();
$oBackupCodeMock->expects($this->once())->method('delete')->willReturn(true);
$oBackupCodeMock->method('d3TotpGetUserObject')->willReturn($oUserMock);
$resultMock = $this->d3getMockBuilder(Result::class)
->disableOriginalConstructor()
->onlyMethods(['fetchOne'])
->getMock();
$resultMock->method('fetchOne')->willReturn('1');
$qbMock = $this->d3getMockBuilder(QueryBuilder::class)
->setConstructorArgs([ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get()])
->onlyMethods(['execute'])
->getMock();
$qbMock->method('execute')->willReturn($resultMock);
/** @var d3backupcodelist|MockObject $oModelMock */
$oModelMock = $this->d3getMockBuilder(d3backupcodelist::class)
->onlyMethods([
'getQueryBuilder',
'getBaseObject',
'd3GetUser',
])
->getMock();
$oModelMock->method('getQueryBuilder')->willReturn($qbMock);
$oModelMock->method('getBaseObject')->willReturn($oBackupCodeMock);
$oModelMock->method('d3GetUser')->willReturn($oUserMock);
$this->_oModel = $oModelMock;
$this->assertTrue(
$this->callMethod($this->_oModel, 'verify', ['123456'])
);
}
/**
* @test
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::verify
*/
public function verifyNotFoundTotp()
{
/** @var User|MockObject $oUserMock */
$oUserMock = $this->d3getMockBuilder(User::class)
->onlyMethods(['getId'])
->getMock();
$oUserMock->method('getId')->willReturn('foobar');
$oUserMock->assign(['oxpasssalt' => '6162636465666768696A6B']);
/** @var d3backupcode|MockObject $oBackupCodeMock */
$oBackupCodeMock = $this->d3getMockBuilder(d3backupcode::class)
->onlyMethods(['delete', 'd3TotpGetUserObject'])
->getMock();
$oBackupCodeMock->expects($this->never())->method('delete')->willReturn(true);
$oBackupCodeMock->method('d3TotpGetUserObject')->willReturn($oUserMock);
$resultMock = $this->d3getMockBuilder(Result::class)
->disableOriginalConstructor()
->onlyMethods(['fetchOne'])
->getMock();
$resultMock->method('fetchOne')->willReturn('');
$qbMock = $this->d3getMockBuilder(QueryBuilder::class)
->setConstructorArgs([ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get()])
->onlyMethods(['execute'])
->getMock();
$qbMock->method('execute')->willReturn($resultMock);
/** @var d3backupcodelist|MockObject $oModelMock */
$oModelMock = $this->d3getMockBuilder(d3backupcodelist::class)
->onlyMethods([
'getQueryBuilder',
'getBaseObject',
'd3GetUser',
])
->getMock();
$oModelMock->method('getQueryBuilder')->willReturn($qbMock);
$oModelMock->method('getBaseObject')->willReturn($oBackupCodeMock);
$oModelMock->method('d3GetUser')->willReturn($oUserMock);
$this->_oModel = $oModelMock;
$this->assertFalse(
$this->callMethod($this->_oModel, 'verify', ['123456'])
);
}
/**
* @test
* @throws ReflectionException
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @covers \D3\Totp\Application\Model\d3backupcodelist::deleteAllFromUser
*/
public function deleteAllFromUserCodesFound()
{
$qbMock = new QueryBuilder(ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get());
/** @var d3backupcode|MockObject $oBackupCodeMock */
$oBackupCodeMock = $this->d3getMockBuilder(d3backupcode::class)
->onlyMethods(['delete'])
->getMock();
$oBackupCodeMock->expects($this->once())->method('delete')->willReturn(true);
$aBackupCodeArray = [
$oBackupCodeMock,
];
/** @var d3backupcodelist|MockObject $oModelMock */
$oModelMock = $this->d3getMockBuilder(d3backupcodelist::class)
->onlyMethods([
'getArray',
'selectString',
'getQueryBuilder',
])
->getMock();
$oModelMock->expects($this->once())->method('getArray')->willReturn($aBackupCodeArray);
$oModelMock->expects($this->once())->method('selectString')->willReturn(true);
$oModelMock->method('getQueryBuilder')->willReturn($qbMock);
$this->_oModel = $oModelMock;
$this->callMethod($this->_oModel, 'deleteAllFromUser', ['foobar']);
}
/**
* @test
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::deleteAllFromUser
*/
public function deleteAllFromUserNoCodesFound()
{
$qbMock = new QueryBuilder(ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get());
/** @var d3backupcode|MockObject $oBackupCodeMock */
$oBackupCodeMock = $this->d3getMockBuilder(d3backupcode::class)
->onlyMethods(['delete'])
->getMock();
$oBackupCodeMock->expects($this->never())->method('delete')->willReturn(true);
$aBackupCodeArray = [];
/** @var d3backupcodelist|MockObject $oModelMock */
$oModelMock = $this->d3getMockBuilder(d3backupcodelist::class)
->onlyMethods([
'getArray',
'selectString',
'getQueryBuilder',
])
->getMock();
$oModelMock->expects($this->once())->method('getArray')->willReturn($aBackupCodeArray);
$oModelMock->expects($this->once())->method('selectString')->willReturn(true);
$oModelMock->method('getQueryBuilder')->willReturn($qbMock);
$this->_oModel = $oModelMock;
$this->callMethod($this->_oModel, 'deleteAllFromUser', ['foobar']);
}
/**
* @test
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::getAvailableCodeCount
*/
public function getAvailableCodeCountPass()
{
$resultMock = $this->d3getMockBuilder(Result::class)
->disableOriginalConstructor()
->onlyMethods(['fetchOne'])
->getMock();
$resultMock->method('fetchOne')->willReturn(25);
$qbMock = $this->d3getMockBuilder(QueryBuilder::class)
->setConstructorArgs([ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get()])
->onlyMethods(['execute'])
->getMock();
$qbMock->method('execute')->willReturn($resultMock);
/** @var d3backupcodelist|MockObject $oModelMock */
$oModelMock = $this->d3getMockBuilder(d3backupcodelist::class)
->onlyMethods(['getQueryBuilder'])
->getMock();
$oModelMock->method('getQueryBuilder')->willReturn($qbMock);
$this->_oModel = $oModelMock;
$this->assertSame(
25,
$this->callMethod($this->_oModel, 'getAvailableCodeCount', ['foobar'])
);
}
/**
* @test
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::d3GetUser
*/
public function d3GetUserReturnsRightInstance()
{
$this->assertInstanceOf(
User::class,
$this->callMethod($this->_oModel, 'd3GetUser')
);
}
/**
* @test
* @return void
* @throws ReflectionException
* @covers \D3\Totp\Application\Model\d3backupcodelist::getQueryBuilder
*/
public function canGetQueryBuilder(): void
{
$this->assertInstanceOf(
QueryBuilder::class,
$this->callMethod(
$this->_oModel,
'getQueryBuilder'
)
);
}
}