* @link https://www.oxidmodule.com */ declare(strict_types=1); namespace D3\Usermanager\tests\unit\publicDir; use D3\ModCfg\Application\Model\Exception\d3PreventExitException; use D3\Usermanager\Application\Controller\d3usermanager_response; use D3\Usermanager\Application\Model\d3usermanager; use D3\Usermanager\publicDir\d3_usermanager_cron; use D3\Usermanager\tests\unit\d3UsermanagerUnitTestCase; use OxidEsales\Eshop\Core\Config; use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException; use OxidEsales\Eshop\Core\Exception\DatabaseErrorException; use OxidEsales\Eshop\Core\Session; use PHPUnit\Framework\MockObject\MockObject; use ReflectionException; use splitbrain\phpcli\Exception as Exception; use splitbrain\phpcli\Options; /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron */ class d3_usermanager_cronTest extends d3UsermanagerUnitTestCase { /** @var d3_usermanager_cron */ protected $_oController; /** * setup basic requirements * @throws DatabaseConnectionException * @throws DatabaseErrorException */ public function setUp(): void { parent::setUp(); $this->_oController = oxNew(d3_usermanager_cron::class); } public function tearDown(): void { parent::tearDown(); unset($this->_oController); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::__construct * @test * @throws ReflectionException * @dataProvider constructorPassDataProvider */ public function constructorPass($isCli) { $controllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods(['isCLI']) ->disableOriginalConstructor() ->getMock(); $controllerMock->method('isCLI')->willReturn($isCli); $this->callMethod( $controllerMock, '__construct' ); $this->assertInstanceOf( Options::class, $this->getValue( $controllerMock, 'options' ) ); } /** * @return array */ public function constructorPassDataProvider(): array { return [ 'is CLI' => [true], 'no CLI' => [false], ]; } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::isCLI * @test * @throws ReflectionException */ public function isCLIPass() { $this->assertTrue( $this->callMethod( $this->_oController, 'isClI' ) ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::setup * @test * @throws ReflectionException */ public function canSetup() { /** @var Options|MockObject $oModelMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods([ 'registerOption', 'registerCommand', 'registerArgument', ]) ->getMock(); $oOptionsMock->expects($this->exactly(3))->method('registerOption')->willReturn(true); $oOptionsMock->expects($this->exactly(2))->method('registerCommand')->willReturn(true); $oOptionsMock->expects($this->exactly(3))->method('registerArgument')->willReturn(true); $this->callMethod( $this->_oController, 'setup', [ $oOptionsMock, ] ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::parseOptions * @test * @throws ReflectionException */ public function canParseOptions() { /** @var Options|MockObject $oOptionsMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods(['registerOption']) ->setConstructorArgs([$this->getValue($this->_oController, 'colors')]) ->getMock(); $oOptionsMock->expects($this->atLeast(3))->method('registerOption'); $this->setValue( $oOptionsMock, 'args', [] ); $oOptionsMock->parseOptions(); $this->setValue($this->_oController, 'options', $oOptionsMock); $this->callMethod( $this->_oController, 'parseOptions' ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::main * @test * @throws ReflectionException */ public function mainShowVersion() { /** @var Options|MockObject $oOptionsMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods([ 'getOpt', 'getCmd', ]) ->setConstructorArgs([$this->getValue($this->_oController, 'colors')]) ->getMock(); $oOptionsMock->method('getOpt')->will($this->returnCallback( fn ($param) => $param == d3_usermanager_cron::OPTION_VERSION )); $oOptionsMock->expects($this->never())->method('getCmd')->willReturn(false); $this->setValue( $oOptionsMock, 'args', [] ); $oOptionsMock->parseOptions(); /** @var d3_usermanager_cron|MockObject $oControllerMock */ $oControllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods(['info']) ->getMock(); $oControllerMock->expects($this->once())->method('info')->willReturn(true); $this->_oController = $oControllerMock; $this->callMethod( $this->_oController, 'main', [$oOptionsMock] ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::main * @test * @throws ReflectionException */ public function mainUseQuietCmdDefaultNoCJID() { /** @var Options|MockObject $oOptionsMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods([ 'getOpt', 'getCmd', ]) ->setConstructorArgs([$this->getValue($this->_oController, 'colors')]) ->getMock(); $oOptionsMock->method('getOpt')->will($this->returnCallback( fn ($param) => $param == d3_usermanager_cron::OPTION_QUIET )); $oOptionsMock->method('getCmd')->willReturn(false); $this->setValue( $oOptionsMock, 'args', [] ); $oOptionsMock->parseOptions(); /** @var d3_usermanager_cron|MockObject $oControllerMock */ $oControllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods(['translateFixedStrings']) ->getMock(); $oControllerMock->expects($this->once())->method('translateFixedStrings')->willReturn(''); $this->_oController = $oControllerMock; $this->callMethod( $this->_oController, 'main', [$oOptionsMock] ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::main * @test * @throws ReflectionException */ public function mainUseQuietCmdDefaultUnvalidCJID() { /** @var Options|MockObject $oOptionsMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods([ 'getOpt', 'getCmd', 'getArgs', ]) ->setConstructorArgs( [$this->getValue($this->_oController, 'colors')] ) ->getMock(); $oOptionsMock->method('getOpt')->willReturn(false); $oOptionsMock->method('getCmd')->willReturn(false); $oOptionsMock->method('getArgs')->willReturn(['1', '1234561', 'key']); $this->setValue( $oOptionsMock, 'args', ['1', '1234561', 'key'] ); $oOptionsMock->parseOptions(); /** @var d3usermanager_response|MockObject $oResponseMock */ $oResponseMock = $this->getMockBuilder(d3usermanager_response::class) ->onlyMethods(['initCli']) ->getMock(); $oResponseMock->expects($this->never())->method('initCli'); d3GetOxidDIC()->set(d3usermanager_response::class, $oResponseMock); /** @var d3_usermanager_cron|MockObject $oControllerMock */ $oControllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods([ 'translateFixedStrings', 'success', 'error', ]) ->getMock(); $oControllerMock->expects($this->never())->method('translateFixedStrings')->willReturn(''); $oControllerMock->expects($this->never())->method('success')->willReturn(true); $oControllerMock->expects($this->once())->method('error')->willReturn(true); $this->_oController = $oControllerMock; $this->callMethod( $this->_oController, 'main', [$oOptionsMock] ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::main * @test * @throws ReflectionException */ public function mainUseQuietCmdDefaultUnvalidShopId() { /** @var Options|MockObject $oOptionsMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods([ 'getOpt', 'getCmd', 'getArgs', ]) ->setConstructorArgs( [$this->getValue($this->_oController, 'colors')] ) ->getMock(); $oOptionsMock->method('getOpt')->willReturn(false); $oOptionsMock->method('getCmd')->willReturn(false); $oOptionsMock->method('getArgs')->willReturn(['5', '1234561', 'key']); $this->setValue( $oOptionsMock, 'args', ['5', '1234561', 'key'] ); $oOptionsMock->parseOptions(); /** @var Session|MockObject $oSessionMock */ $oSessionMock = $this->getMockBuilder(Session::class) ->onlyMethods(['setVariable']) ->getMock(); $oSessionMock->expects($this->never())->method('setVariable') ->with($this->equalTo('d3usermanager_quiet'))->willReturn(false); d3GetOxidDIC()->set('d3ox.usermanager.'.Session::class, $oSessionMock); /** @var d3usermanager_response|MockObject $oResponseMock */ $oResponseMock = $this->getMockBuilder(d3usermanager_response::class) ->onlyMethods(['initCli']) ->getMock(); $oResponseMock->expects($this->never())->method('initCli'); d3GetOxidDIC()->set(d3usermanager_response::class, $oResponseMock); /** @var Config|MockObject $oConfigMock */ $oConfigMock = $this->getMockBuilder(Config::class) ->onlyMethods(['getShopIds']) ->getMock(); $oConfigMock->method('getShopIds')->willReturn([0, 1, 2]); d3GetOxidDIC()->set('d3ox.usermanager.' . Config::class, $oConfigMock); /** @var d3_usermanager_cron|MockObject $oControllerMock */ $oControllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods([ 'translateFixedStrings', 'success', 'error', ]) ->getMock(); $oControllerMock->expects($this->never())->method('translateFixedStrings')->willReturn(''); $oControllerMock->expects($this->never())->method('success')->willReturn(true); $oControllerMock->expects($this->once())->method('error')->willReturn(true); $this->_oController = $oControllerMock; $this->callMethod( $this->_oController, 'main', [$oOptionsMock] ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::main * @test * @throws ReflectionException */ public function mainUseQuietCmdDefaultValidCJID() { $aAvailableIds = d3GetOxidDIC()->get(d3usermanager::class)->getAvailableCronjobIds(); if (0 === count($aAvailableIds)) { $this->fail('no available cronjob ids for running test'); } /** @var Options|MockObject $oOptionsMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods([ 'getOpt', 'getCmd', 'getArgs', ]) ->setConstructorArgs( [$this->getValue($this->_oController, 'colors')] ) ->getMock(); $oOptionsMock->method('getOpt')->willReturn(false); $oOptionsMock->method('getCmd')->willReturn(false); $oOptionsMock->method('getArgs')->willReturn(['1', end($aAvailableIds)['id'], 'key']); $this->setValue( $oOptionsMock, 'args', ['1', end($aAvailableIds)['id'], 'key'] ); $oOptionsMock->parseOptions(); /** @var d3usermanager_response|MockObject $oResponseMock */ $oResponseMock = $this->getMockBuilder(d3usermanager_response::class) ->onlyMethods(['initCli']) ->getMock(); $oResponseMock->expects($this->once())->method('initCli'); d3GetOxidDIC()->set(d3usermanager_response::class, $oResponseMock); /** @var d3_usermanager_cron|MockObject $oControllerMock */ $oControllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods([ 'translateFixedStrings', 'success', 'error', ]) ->getMock(); $oControllerMock->expects($this->never())->method('translateFixedStrings')->willReturn(''); $oControllerMock->expects($this->once())->method('success')->willReturn(true); $oControllerMock->expects($this->never())->method('error')->willReturn(true); $this->_oController = $oControllerMock; $this->callMethod( $this->_oController, 'main', [$oOptionsMock] ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::main * @test * @throws ReflectionException */ public function mainCmdRun() { /** @var Options|MockObject $oOptionsMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods([ 'getOpt', 'getCmd', ]) ->setConstructorArgs([$this->getValue($this->_oController, 'colors')]) ->getMock(); $oOptionsMock->method('getCmd')->willReturn(d3_usermanager_cron::COMMAND_RUN); $oOptionsMock->method('getOpt')->willReturn(false); $this->setValue( $oOptionsMock, 'args', [] ); $oOptionsMock->parseOptions(); /** @var d3usermanager_response|MockObject $oResponseMock */ $oResponseMock = $this->getMockBuilder(d3usermanager_response::class) ->onlyMethods(['initCli']) ->getMock(); $oResponseMock->expects($this->once())->method('initCli'); d3GetOxidDIC()->set(d3usermanager_response::class, $oResponseMock); /** @var d3_usermanager_cron|MockObject $oControllerMock */ $oControllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods(['success']) ->getMock(); $oControllerMock->expects($this->once())->method('success')->willReturn(true); $this->_oController = $oControllerMock; $this->callMethod( $this->_oController, 'main', [$oOptionsMock] ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::main * @test * @throws ReflectionException */ public function mainCmdStatus() { /** @var d3usermanager_response|MockObject $oResponseMock */ $oResponseMock = $this->getMockBuilder(d3usermanager_response::class) ->onlyMethods(['getLastExecDateInfo']) ->getMock(); $oResponseMock->expects($this->atLeastOnce())->method('getLastExecDateInfo')->willReturn(['content1', 'content2']); d3GetOxidDIC()->set(d3usermanager_response::class, $oResponseMock); /** @var Options|MockObject $oOptionsMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods([ 'getOpt', 'getCmd', ]) ->setConstructorArgs([$this->getValue($this->_oController, 'colors')]) ->getMock(); $oOptionsMock->method('getCmd')->willReturn(d3_usermanager_cron::COMMAND_STATUS); $oOptionsMock->method('getOpt')->willReturn(false); $this->setValue( $oOptionsMock, 'args', [] ); $oOptionsMock->parseOptions(); /** @var d3_usermanager_cron|MockObject $oControllerMock */ $oControllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods(['info']) ->getMock(); $oControllerMock->expects($this->once())->method('info')->willReturn(true); $this->_oController = $oControllerMock; $this->callMethod( $this->_oController, 'main', [$oOptionsMock] ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::main * @test * @throws ReflectionException */ public function mainHandleException() { /** @var Options|MockObject $oOptionsMock */ $oOptionsMock = $this->getMockBuilder(Options::class) ->onlyMethods([ 'getOpt', 'getCmd', ]) ->setConstructorArgs([$this->getValue($this->_oController, 'colors')]) ->getMock(); $oOptionsMock->method('getCmd')->willReturn(d3_usermanager_cron::COMMAND_RUN); $oOptionsMock->method('getOpt')->willReturn(false); $this->setValue( $oOptionsMock, 'args', [] ); $oOptionsMock->parseOptions(); /** @var d3usermanager_response|MockObject $oResponseMock */ $oResponseMock = $this->getMockBuilder(d3usermanager_response::class) ->onlyMethods(['initCli']) ->getMock(); $oResponseMock->expects($this->once())->method('initCli')->willThrowException(new Exception('excMsg')); d3GetOxidDIC()->set(d3usermanager_response::class, $oResponseMock); /** @var d3_usermanager_cron|MockObject $oControllerMock */ $oControllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods(['error']) ->getMock(); $oControllerMock->expects($this->once())->method('error')->willReturn(true); $this->_oController = $oControllerMock; $this->callMethod( $this->_oController, 'main', [$oOptionsMock] ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::execute * @test * @throws ReflectionException */ public function executeThrowRightException() { /** @var d3_usermanager_cron|MockObject $oControllerMock */ $oControllerMock = $this->getMockBuilder(d3_usermanager_cron::class) ->onlyMethods(['main']) ->getMock(); $oControllerMock->method('main')->willReturn(true); $this->_oController = $oControllerMock; $this->expectException(d3PreventExitException::class); $this->callMethod( $this->_oController, 'execute' ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::translateFixedStrings * @test * @throws ReflectionException */ public function translateFixedStringsPassed() { $this->assertSame( 'abc D3_USERMANAGER_CLI_COMMAND def', $this->callMethod( $this->_oController, 'translateFixedStrings', [ 'abc This tool accepts a command as first parameter as outlined below: def', ] ) ); } /** * @covers \D3\Usermanager\publicDir\d3_usermanager_cron::translateFixedStrings * @test * @throws ReflectionException */ public function translateFixedStringsFailed() { $this->assertSame( 'abc This tool accepts a foo command as first parameter as outlined below: def', $this->callMethod( $this->_oController, 'translateFixedStrings', [ 'abc This tool accepts a foo command as first parameter as outlined below: def', ] ) ); } /** * @param $sLicenseKey * @param d3usermanager $oManager * @return null */ protected function _setModuleLicenseKey($sLicenseKey, $oManager = null) { return null; } }