* @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; } }