Usermanager/tests/unit/Modules/Application/Model/d3_order_usermanagerTest.php

375 lines
14 KiB
PHP

<?php
/**
* Copyright (c) D3 Data Development (Inh. Thomas Dartsch)
*
* 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\Usermanager\tests\unit\Modules\Application\Model;
use D3\Usermanager\Application\Model\Actions\d3usermanager_action_setactiveflag;
use D3\Usermanager\Application\Model\d3usermanager;
use D3\Usermanager\Application\Model\d3usermanager_configurationcheck;
use D3\Usermanager\Application\Model\d3usermanager_execute;
use D3\Usermanager\Application\Model\d3usermanagerlist;
use D3\Usermanager\Application\Model\Exceptions\d3usermanager_actionException;
use D3\Usermanager\Application\Model\Exceptions\d3usermanager_requirementException;
use D3\Usermanager\Application\Model\Exceptions\d3usermanager_smartyException;
use D3\Usermanager\Modules\Application\Model\d3_order_usermanager;
use D3\Usermanager\tests\unit\d3UsermanagerUnitTestCase;
use Exception;
use Monolog\Logger;
use OxidEsales\Eshop\Application\Model\Basket;
use OxidEsales\Eshop\Application\Model\Order;
use OxidEsales\Eshop\Application\Model\User;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\UtilsView;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
/**
* @covers \D3\Usermanager\Modules\Application\Model\d3_order_usermanager
*/
class d3_order_usermanagerTest extends d3UsermanagerUnitTestCase
{
/** @var d3_order_usermanager */
protected $_oModel;
/**
* setup basic requirements
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws Exception
*/
public function setUp(): void
{
parent::setUp();
$this->_oModel = d3GetOxidDIC()->get('d3ox.usermanager.'.Order::class);
}
public function tearDown(): void
{
parent::tearDown();
unset($this->_oModel);
}
/**
* @covers \D3\Usermanager\Modules\Application\Model\d3_order_usermanager::finalizeOrder
* @test
* @throws ReflectionException
*/
public function canFinalizeOrder()
{
/** @var d3usermanagerlist $managerList */
$managerList = d3GetOxidDIC()->get(d3usermanagerlist::class);
$managerList->offsetSet('no1', oxNew(d3usermanager::class));
$managerList->offsetSet('no2', oxNew(d3usermanager::class));
/** @var d3usermanagerlist|MockObject $oUserManagerListMock */
$oUserManagerListMock = $this->getMockBuilder(d3usermanagerlist::class)
->onlyMethods(['d3GetOrderFinishTriggeredManagerTasks'])
->getMock();
$oUserManagerListMock->method('d3GetOrderFinishTriggeredManagerTasks')->willReturn($managerList);
d3GetOxidDIC()->set(d3usermanagerlist::class, $oUserManagerListMock);
/** @var d3usermanager_execute|MockObject $oManagerExecuteMock */
$oManagerExecuteMock = $this->getMockBuilder(d3usermanager_execute::class)
->onlyMethods([
'userMeetsConditions',
'exec4user',
])
->setConstructorArgs([oxNew(d3usermanager::class)])
->getMock();
$oManagerExecuteMock->expects($this->exactly(2))->method('userMeetsConditions')->willReturn(true);
$oManagerExecuteMock->expects($this->exactly(2))->method('exec4user');
/** @var d3_order_usermanager|MockObject $oModelMock */
$oModelMock = $this->getMockBuilder(Order::class)
->onlyMethods(['d3UsermanagerGetManagerExecute'])
->getMock();
$oModelMock->method('d3UsermanagerGetManagerExecute')->willReturn($oManagerExecuteMock);
$this->_oModel = $oModelMock;
$this->callMethod(
$this->_oModel,
'finalizeOrder',
[
oxNew(Basket::class),
oxNew(User::class),
]
);
}
/**
* @covers \D3\Usermanager\Modules\Application\Model\d3_order_usermanager::finalizeOrder
* @test
* @param $isAdmin
* @throws ReflectionException
* @dataProvider cannotSaveDataProvider
*/
public function finalizeOrderCantExecuteUnvalidConfiguration($isAdmin)
{
/** @var d3usermanagerlist $managerList */
$managerList = d3GetOxidDIC()->get(d3usermanagerlist::class);
$managerList->offsetSet('no1', oxNew(d3usermanager::class));
$managerList->offsetSet('no2', oxNew(d3usermanager::class));
/** @var d3usermanagerlist|MockObject $oUserManagerListMock */
$oUserManagerListMock = $this->getMockBuilder(d3usermanagerlist::class)
->onlyMethods(['d3GetOrderFinishTriggeredManagerTasks'])
->getMock();
$oUserManagerListMock->method('d3GetOrderFinishTriggeredManagerTasks')->willReturn($managerList);
d3GetOxidDIC()->set(d3usermanagerlist::class, $oUserManagerListMock);
/** @var d3usermanager_requirementException|MockObject $exception */
$exception = $this->getMockBuilder(d3usermanager_requirementException::class)
->disableOriginalConstructor()
->getMock();
/** @var Logger|MockObject $loggerMock */
$loggerMock = $this->getMockBuilder(Logger::class)
->disableOriginalConstructor()
->onlyMethods(['error'])
->getMock();
$loggerMock->expects($this->atLeastOnce())->method('error');
d3GetOxidDIC()->set('d3ox.usermanager.Logger', $loggerMock);
/** @var d3usermanager_execute|MockObject $oManagerExecuteMock */
$oManagerExecuteMock = $this->getMockBuilder(d3usermanager_execute::class)
->onlyMethods([
'userMeetsConditions',
'exec4user',
])
->setConstructorArgs([oxNew(d3usermanager::class)])
->getMock();
$oManagerExecuteMock->expects($this->exactly(2))->method('userMeetsConditions')->willThrowException($exception);
$oManagerExecuteMock->expects($this->never())->method('exec4user');
/** @var UtilsView|MockObject $utilsViewMock */
$utilsViewMock = $this->getMockBuilder(UtilsView::class)
->onlyMethods(['addErrorToDisplay'])
->getMock();
$utilsViewMock->expects($isAdmin ? $this->exactly(2) : $this->never())
->method('addErrorToDisplay')->willReturn(true);
d3GetOxidDIC()->set('d3ox.usermanager.'.UtilsView::class, $utilsViewMock);
/** @var d3_order_usermanager|MockObject $oModelMock */
$oModelMock = $this->getMockBuilder(Order::class)
->onlyMethods([
'd3UsermanagerGetManagerExecute',
'isAdmin',
])
->getMock();
$oModelMock->method('d3UsermanagerGetManagerExecute')->willReturn($oManagerExecuteMock);
$oModelMock->method('isAdmin')->willReturn($isAdmin);
$this->_oModel = $oModelMock;
$this->callMethod(
$this->_oModel,
'finalizeOrder',
[
oxNew(Basket::class),
oxNew(User::class),
]
);
}
/**
* @covers \D3\Usermanager\Modules\Application\Model\d3_order_usermanager::finalizeOrder
* @test
* @param $isAdmin
* @throws ReflectionException
* @dataProvider cannotSaveDataProvider
*/
public function finalizeOrderCantExecuteFetchingError($isAdmin)
{
/** @var d3usermanagerlist $managerList */
$managerList = d3GetOxidDIC()->get(d3usermanagerlist::class);
$managerList->offsetSet('no1', oxNew(d3usermanager::class));
$managerList->offsetSet('no2', oxNew(d3usermanager::class));
/** @var d3usermanagerlist|MockObject $oUserManagerListMock */
$oUserManagerListMock = $this->getMockBuilder(d3usermanagerlist::class)
->onlyMethods(['d3GetOrderFinishTriggeredManagerTasks'])
->getMock();
$oUserManagerListMock->method('d3GetOrderFinishTriggeredManagerTasks')->willReturn($managerList);
d3GetOxidDIC()->set(d3usermanagerlist::class, $oUserManagerListMock);
/** @var d3usermanager_smartyException|MockObject $exception */
$exception = $this->getMockBuilder(d3usermanager_smartyException::class)
->disableOriginalConstructor()
->getMock();
/** @var d3usermanager_execute|MockObject $oManagerExecuteMock */
$oManagerExecuteMock = $this->getMockBuilder(d3usermanager_execute::class)
->onlyMethods([
'userMeetsConditions',
'exec4user',
])
->setConstructorArgs([oxNew(d3usermanager::class)])
->getMock();
$oManagerExecuteMock->expects($this->exactly(2))->method('userMeetsConditions')->willThrowException($exception);
$oManagerExecuteMock->expects($this->never())->method('exec4user');
/** @var UtilsView|MockObject $utilsViewMock */
$utilsViewMock = $this->getMockBuilder(UtilsView::class)
->onlyMethods(['addErrorToDisplay'])
->getMock();
$utilsViewMock->expects($isAdmin ? $this->exactly(2) : $this->never())
->method('addErrorToDisplay')->willReturn(true);
d3GetOxidDIC()->set('d3ox.usermanager.'.UtilsView::class, $utilsViewMock);
/** @var Logger|MockObject $loggerMock */
$loggerMock = $this->getMockBuilder(Logger::class)
->disableOriginalConstructor()
->onlyMethods(['error'])
->getMock();
$loggerMock->expects($this->atLeastOnce())->method('error');
d3GetOxidDIC()->set('d3ox.usermanager.Logger', $loggerMock);
/** @var d3_order_usermanager|MockObject $oModelMock */
$oModelMock = $this->getMockBuilder(Order::class)
->onlyMethods(['d3UsermanagerGetManagerExecute', 'isAdmin'])
->getMock();
$oModelMock->method('d3UsermanagerGetManagerExecute')->willReturn($oManagerExecuteMock);
$oModelMock->method('isAdmin')->willReturn($isAdmin);
$this->_oModel = $oModelMock;
$this->callMethod(
$this->_oModel,
'finalizeOrder',
[
oxNew(Basket::class),
oxNew(User::class),
]
);
}
/**
* @covers \D3\Usermanager\Modules\Application\Model\d3_order_usermanager::d3UsermanagerGetManagerExecute
* @test
* @throws ReflectionException
* @throws Exception
*/
public function canGetManagerExecute()
{
$oManager = d3GetOxidDIC()->get(d3usermanager::class);
$this->assertInstanceOf(
d3usermanager_execute::class,
$this->callMethod(
$this->_oModel,
'd3UsermanagerGetManagerExecute',
[
$oManager,
]
)
);
}
/**
* @return array
*/
public function cannotSaveDataProvider(): array
{
return [
'is admin' => [true],
'is frontend' => [false],
];
}
/**
* @covers \D3\Usermanager\Modules\Application\Model\d3_order_usermanager::d3UserManagerCheckForConfigurationException
* @test
* @param $manuallyCondition
* @param $expectedCheck
* @param $throwExc
* @throws ReflectionException
* @throws Exception
* @dataProvider d3UserManagerCheckForConfigurationExceptionDataProvider
*/
public function d3UserManagerCheckForConfigurationExceptionPass($manuallyCondition, $expectedCheck, $throwExc)
{
/** @var d3usermanager|MockObject $oManagerMock */
$oManagerMock = $this->getMockBuilder(d3usermanager::class)
->onlyMethods(['getValue'])
->getMock();
$getValueMap = [
['blGetStornoArticles', false],
['sManuallyExecMeetCondition', $manuallyCondition],
];
$oManagerMock->method('getValue')->willReturnMap($getValueMap);
/** @var d3usermanager_actionException $expectedExc */
d3GetOxidDIC()->set(d3usermanager_action_setactiveflag::class.'.args.usermanager', $oManagerMock);
d3GetOxidDIC()->set(d3usermanager_action_setactiveflag::class.'.args.user', d3GetOxidDIC()->get('d3ox.usermanager.'.User::class));
d3GetOxidDIC()->set(d3usermanager_actionException::class.'.args.actionobject', d3GetOxidDIC()->get(d3usermanager_action_setactiveflag::class));
$expectedExc = d3GetOxidDIC()->get(d3usermanager_actionException::class);
/** @var d3usermanager_configurationcheck|MockObject $confCheckMock */
$confCheckMock = $this->getMockBuilder(d3usermanager_configurationcheck::class)
->disableOriginalConstructor()
->onlyMethods(['checkThrowingExceptions'])
->getMock();
$throwExc ?
$confCheckMock->expects($this->once())->method('checkThrowingExceptions')->with($this->identicalTo($expectedCheck))->willThrowException($expectedExc) :
$confCheckMock->expects($this->once())->method('checkThrowingExceptions')->with($this->identicalTo($expectedCheck));
d3GetOxidDIC()->set(d3usermanager_configurationcheck::class, $confCheckMock);
if ($throwExc) {
$this->expectException(get_class($expectedExc));
}
$this->callMethod(
$this->_oModel,
'd3UserManagerCheckForConfigurationException',
[$oManagerMock]
);
}
/**
* @return array[]
*/
public function d3UserManagerCheckForConfigurationExceptionDataProvider(): array
{
return [
'requirements and actions throw exception' => [true, d3usermanager_configurationcheck::REQUIREMENTS_AND_ACTIONS, true],
'requirements and actions don\'t throw exception' => [true, d3usermanager_configurationcheck::REQUIREMENTS_AND_ACTIONS, false],
'actions only throw exception' => [false, d3usermanager_configurationcheck::ACTIONS_ONLY, true],
'actions only don\'t throw exception' => [false, d3usermanager_configurationcheck::ACTIONS_ONLY, false],
];
}
/**
* @param $sLicenseKey
* @param d3usermanager $oManager
* @return null
*/
protected function _setModuleLicenseKey($sLicenseKey, $oManager = null)
{
return null;
}
}