* @link https://www.oxidmodule.com */ declare(strict_types=1); namespace D3\Usermanager\tests\integration\Trigger; use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod; use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception; use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException; use D3\ModCfg\Application\Model\Log\d3NullLogger; use D3\Usermanager\Application\Model\d3usermanager as Manager; use D3\Usermanager\Application\Model\d3usermanagerlist; use D3\Usermanager\Modules\Application\Model\d3_user_usermanager; use D3\Usermanager\tests\integration\d3IntegrationTestCase; use Doctrine\DBAL\Exception as DoctrineException; use Doctrine\DBAL\Query\QueryBuilder; use Exception; use OxidEsales\Eshop\Application\Model\Basket; use OxidEsales\Eshop\Application\Model\Order as Item; use OxidEsales\Eshop\Application\Model\User; use OxidEsales\Eshop\Core\Exception\ArticleInputException; use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; use OxidEsales\Eshop\Core\Exception\DatabaseErrorException; use OxidEsales\Eshop\Core\Exception\NoArticleException; use OxidEsales\Eshop\Core\Exception\OutOfStockException; use OxidEsales\Eshop\Core\Exception\StandardException; use OxidEsales\Eshop\Core\Registry; use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory; use OxidEsales\EshopCommunity\Internal\Framework\Database\QueryBuilderFactoryInterface; use PHPUnit\Framework\MockObject\MockObject; class finalizeOrderTest extends d3IntegrationTestCase { public $sManagerId = 'managerTestId'; public $aArticleIdList = [ 'articleTestIdNo1', ]; public $aCountryIdList = [ 'testCountryId1Pass', ]; public $aOrderIdList = [ 'orderTestIdNo1', ]; public $aOrderArticleIdList = [ 'orderTestIdNo1Article1', ]; public $aPaymentIdList = [ 'paymentTestIdNo1', ]; public $aUserIdList = [ 'userTestIdNo1', ]; public $sCurrentValue = 'current'; public $sExpectedValue = 'expected'; /** * @throws Exception */ public function createTestData() { $this->createManager($this->sManagerId); $this->createArticle( $this->aArticleIdList[0], [ 'oxtitle' => __CLASS__, 'oxparentid' => null, 'oxstock' => 20, ] ); foreach ($this->aCountryIdList as $sId) { $this->createBaseModelObject('oxcountry', $sId, [ 'oxtitle' => __METHOD__ ]); } $this->createOrder( $this->aOrderIdList[0], [ 'oxorderdate' => '2018-01-01 00:00:00', 'oxdelcost' => $this->sCurrentValue, 'oxcurrate' => 1, 'oxbillcountryid' => $this->aCountryIdList[0], 'oxdelcountryid' => '', 'oxbillcompany' => __CLASS__, ], [ $this->aOrderArticleIdList[0] => [ 'oxartnum' => 'expArtNum1', 'oxtitle' => 'expTitle1', 'oxshortdesc' => 'expShortDesc1', 'oxselvariant' => 'expSelVariant1', 'oxpersparam' => 'expPersParam1', 'oxstorno' => '0', 'oxartid' => $this->aArticleIdList[0], ], ] ); $this->createUser( $this->aUserIdList[0], [ 'oxactive' => 1, 'oxcountryid' => $this->aCountryIdList[0], 'oxfname' => __CLASS__, 'oxlname' => $this->sCurrentValue, ] ); $this->createBaseModelObject('oxpayments', $this->aPaymentIdList[0]); $this->getConfiguredManager()->save(); } /** * @throws DoctrineException */ public function cleanTestData() { $this->deleteManager($this->sManagerId); foreach ($this->aCountryIdList as $sId) { $this->deleteBaseModelObject('oxcountry', $sId); } $this->deleteOrder($this->aOrderIdList[0]); $this->deleteArticle($this->aArticleIdList[0]); $this->deleteBaseModelObject('oxpayments', $this->aPaymentIdList[0]); $this->deleteUser($this->aUserIdList[0]); /** @var QueryBuilder $qb */ $qb = ContainerFactory::getInstance()->getContainer()->get(QueryBuilderFactoryInterface::class)->create(); $qb->delete('oxorder') ->where( $qb->expr()->eq( 'oxuserid', $qb->createNamedParameter($this->aUserIdList[0]) ) ); $qb->execute(); } /** * @return mixed|Basket * @throws ArticleInputException * @throws NoArticleException * @throws OutOfStockException */ public function getBasket(): Basket { $basket = oxNew(Basket::class); $basket->addToBasket($this->aArticleIdList[0], 1); $basket->setPayment($this->aPaymentIdList[0]); return $basket; } /** * @return Manager * @throws Exception */ public function getConfiguredManager(): Manager { $oManager = $this->getManagerMock($this->sManagerId); $oManager->assign( [ 'D3_CRONJOBID' => 'testId', 'D3_UM_ORDERFINISHTRIGGERED' => '1', ] ); $oManager->setValue('blActionUserAddFieldValue_status', true); $oManager->setValue('sActionAddField_field', 'oxlname'); $oManager->setValue('sActionAddField_value', $this->sExpectedValue); $oManager->setValue('blCheckInvCountry_status', true); $oManager->setValue('aInvCountryId', [ $this->aCountryIdList[0] ]); $oManager->setValue('blItemExecute', true); return $oManager; } /** * @test * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws StandardException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception * @throws Exception */ public function runTriggerOk() { /** @var d3usermanagerlist|MockObject $usermanagerlistmock */ $usermanagerlistmock = $this->getMockBuilder(d3usermanagerlist::class) ->onlyMethods(['d3GetOrderFinishTriggeredManagerTasks']) ->getMock(); $usermanagerlistmock->offsetSet($this->sManagerId, $this->getConfiguredManager()); $usermanagerlistmock->method('d3GetOrderFinishTriggeredManagerTasks')->willReturnSelf(); $definitions = d3GetOxidDIC()->getDefinitions(); d3GetOxidDIC()->set(d3usermanagerlist::class, $usermanagerlistmock); $set = d3_cfg_mod::get('d3usermanager'); $set->assign([ 'oxactive' => 1 ]); $set->saveNoLicenseRefresh(); $user = oxNew(User::class); $user->load($this->aUserIdList[0]); /** @var Item|MockObject $oItem */ $oItem = $this->getMockBuilder(Item::class) ->onlyMethods( ['validateOrder', 'loadFromBasket', 'executePayment', 'sendOrderByEmail'] ) ->getMock(); $oItem->method('validateOrder')->willReturn(null); $oItem->method('loadFromBasket')->willReturn(null); $oItem->method('executePayment')->willReturn(true); $oItem->method('sendOrderByEmail')->willReturn(Item::ORDER_STATE_OK); $oItem->load($this->aOrderIdList[0]); $oItem->finalizeOrder( $this->getBasket(), $user ); d3GetOxidDIC()->reset(); d3GetOxidDIC()->setDefinitions($definitions); /** @var d3_user_usermanager $oUser */ $oUser = d3GetOxidDIC()->get('d3ox.usermanager.'.User::class); $oUser->load($this->aUserIdList[0]); $this->assertSame( $this->sExpectedValue, $oUser->getFieldData('oxlname') ); $oItem->delete(); } /** * @test * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws StandardException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception * @throws Exception */ public function runTriggerCanceledInvalidRequirementConfig() { d3GetOxidDIC()->set('d3ox.usermanager.Logger', d3GetOxidDIC()->get(d3NullLogger::class)); $manager = $this->getConfiguredManager(); $manager->setValue('aInvCountryId', [ 'notExistingCountryId' ]); $manager->save(); /** @var d3usermanagerlist|MockObject $usermanagerlistmock */ $usermanagerlistmock = $this->getMockBuilder(d3usermanagerlist::class) ->onlyMethods(['d3GetOrderFinishTriggeredManagerTasks']) ->getMock(); $usermanagerlistmock->offsetSet($manager->getId(), $manager); $usermanagerlistmock->method('d3GetOrderFinishTriggeredManagerTasks')->willReturnSelf(); $definitions = d3GetOxidDIC()->getDefinitions(); d3GetOxidDIC()->set(d3usermanagerlist::class, $usermanagerlistmock); $set = d3_cfg_mod::get('d3usermanager'); $set->assign([ 'oxactive' => 1 ]); $set->saveNoLicenseRefresh(); $user = oxNew(User::class); $user->load($this->aUserIdList[0]); /** @var Item|MockObject $oItem */ $oItem = $this->getMockBuilder(Item::class) ->onlyMethods( ['validateOrder', 'loadFromBasket', 'executePayment', 'sendOrderByEmail'] ) ->getMock(); $oItem->method('validateOrder')->willReturn(null); $oItem->method('loadFromBasket')->willReturn(null); $oItem->method('executePayment')->willReturn(true); $oItem->method('sendOrderByEmail')->willReturn(Item::ORDER_STATE_OK); $oItem->load($this->aOrderIdList[0]); $oItem->finalizeOrder( oxNew(Basket::class), $user ); d3GetOxidDIC()->reset(); d3GetOxidDIC()->setDefinitions($definitions); $this->getConfiguredManager()->save(); /** @var d3_user_usermanager $oUser */ $oUser = d3GetOxidDIC()->get('d3ox.usermanager.'.User::class); $oUser->load($this->aUserIdList[0]); $this->assertSame( $this->sCurrentValue, $oUser->getFieldData('oxlname') ); $oItem->delete(); } /** * @test * @throws DatabaseConnectionException * @throws DatabaseErrorException * @throws StandardException * @throws d3ShopCompatibilityAdapterException * @throws d3_cfg_mod_exception * @throws Exception */ public function runTriggerCanceledInvalidActionConfig() { d3GetOxidDIC()->set('d3ox.usermanager.Logger', d3GetOxidDIC()->get(d3NullLogger::class)); $manager = $this->getConfiguredManager(); $manager->setValue('sActionAddField_field', 'invalidFieldName'); $definitions = d3GetOxidDIC()->getDefinitions(); /** @var d3usermanagerlist|MockObject $usermanagerlistmock */ $usermanagerlistmock = $this->getMockBuilder(d3usermanagerlist::class) ->onlyMethods(['d3GetOrderFinishTriggeredManagerTasks']) ->getMock(); $usermanagerlistmock->offsetSet($manager->getId(), $manager); $usermanagerlistmock->method('d3GetOrderFinishTriggeredManagerTasks')->willReturnSelf(); d3GetOxidDIC()->set(d3usermanagerlist::class, $usermanagerlistmock); $set = d3_cfg_mod::get('d3usermanager'); $set->assign([ 'oxactive' => 1 ]); $set->saveNoLicenseRefresh(); $user = oxNew(User::class); $user->load($this->aUserIdList[0]); /** @var Item|MockObject $oItem */ $oItem = $this->getMockBuilder(Item::class) ->onlyMethods( ['validateOrder', 'loadFromBasket', 'executePayment', 'sendOrderByEmail'] ) ->getMock(); $oItem->method('validateOrder')->willReturn(null); $oItem->method('loadFromBasket')->willReturn(null); $oItem->method('executePayment')->willReturn(true); $oItem->method('sendOrderByEmail')->willReturn(Item::ORDER_STATE_OK); $manager = $this->getConfiguredManager(); $manager->setValue('sActionAddField_field', 'invalid'); $manager->save(); $oItem->load($this->aOrderIdList[0]); $oItem->finalizeOrder( oxNew(Basket::class), $user ); d3GetOxidDIC()->reset(); d3GetOxidDIC()->setDefinitions($definitions); $this->getConfiguredManager()->save(); /** @var d3_user_usermanager $oUser */ $oUser = d3GetOxidDIC()->get('d3ox.usermanager.'.User::class); $oUser->load($this->aUserIdList[0]); $this->assertSame( $this->sCurrentValue, $oUser->getFieldData('oxlname') ); $oItem->delete(); } /** * @test * @throws Exception */ public function runDisabledTrigger() { $manager = $this->getConfiguredManager(); $manager->assign(['D3_UM_ORDERFINISHTRIGGERED' => '0']); $manager->save(); /** @var d3usermanagerlist|MockObject $managerListMock */ $managerListMock = $this->getMockBuilder(d3usermanagerlist::class) ->onlyMethods(['d3GetOrderFinishTriggeredManagerTasks']) ->getMock(); $managerListMock->method('d3GetOrderFinishTriggeredManagerTasks')->willReturnSelf(); $definitions = d3GetOxidDIC()->getDefinitions(); d3GetOxidDIC()->set(d3usermanagerlist::class, $managerListMock); $user = oxNew(User::class); $user->load($this->aUserIdList[0]); /** @var Item|MockObject $oItem */ $oItem = $this->getMockBuilder(Item::class) ->onlyMethods( ['validateOrder', 'loadFromBasket', 'executePayment', 'sendOrderByEmail'] ) ->getMock(); $oItem->method('validateOrder')->willReturn(null); $oItem->method('loadFromBasket')->willReturn(null); $oItem->method('executePayment')->willReturn(true); $oItem->method('sendOrderByEmail')->willReturn(Item::ORDER_STATE_OK); // prevent save trigger action in test preparation Registry::getSession()->setVariable(d3_user_usermanager::PREVENTION_SAVEUSER, true); $oItem->load($this->aOrderIdList[0]); $oItem->finalizeOrder( oxNew(Basket::class), $user ); d3GetOxidDIC()->reset(); d3GetOxidDIC()->setDefinitions($definitions); Registry::getSession()->setVariable(d3_user_usermanager::PREVENTION_SAVEUSER, false); /** @var d3_user_usermanager $oUser */ $oUser = d3GetOxidDIC()->get('d3ox.usermanager.'.User::class); $oUser->load($this->aUserIdList[0]); $this->assertSame( $this->sCurrentValue, $oUser->getFieldData('oxlname') ); $oItem->delete(); } }