remove dupclicates, add tests

This commit is contained in:
Daniel Seifert 2022-12-28 00:09:24 +01:00
parent 506bbd648e
commit d88dee4876
Signed by: DanielS
GPG Key ID: 6A513E13AEE66170
6 changed files with 731 additions and 587 deletions

View File

@ -16,93 +16,28 @@ declare(strict_types=1);
namespace D3\Linkmobility4OXID\Application\Controller\Admin;
use D3\Linkmobility4OXID\Application\Model\Exceptions\noRecipientFoundException;
use D3\Linkmobility4OXID\Application\Model\Exceptions\successfullySentException;
use D3\Linkmobility4OXID\Application\Model\MessageTypes\Sms;
use D3\Linkmobility4OXID\Application\Model\OrderRecipients;
use D3\LinkmobilityClient\Response\ResponseInterface;
use D3\LinkmobilityClient\ValueObject\Recipient;
use D3\TestingTools\Production\IsMockable;
use InvalidArgumentException;
use OxidEsales\Eshop\Application\Controller\Admin\AdminController;
use OxidEsales\Eshop\Application\Model\Order;
use OxidEsales\Eshop\Core\Language;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\UtilsView;
class AdminOrder extends AdminController
class AdminOrder extends AdminSendController
{
use IsMockable;
protected $_sThisTemplate = 'd3adminorder.tpl';
/**
* @var Sms
*/
protected $sms;
/** @var Order */
protected $item;
/**
* @var Order
*/
protected $order;
/** @var OrderRecipients */
protected $itemRecipients;
public function __construct()
{
$this->order = $order = $this->d3GetMockableOxNewObject(Order::class);
$order->load($this->getEditObjectId());
$this->addTplParam('recipient', $this->getRecipientFromCurrentOrder());
$this->item = $this->d3GetMockableOxNewObject(Order::class);
$this->itemRecipients = $this->d3GetMockableOxNewObject(OrderRecipients::class, $this->item);
parent::__construct();
}
/**
* @return Recipient|false
*/
public function getRecipientFromCurrentOrder()
{
try {
return $this->d3GetMockableOxNewObject(OrderRecipients::class, $this->order)->getSmsRecipient();
} catch (noRecipientFoundException $e) {
/** @var string $message */
$message = $this->d3GetMockableRegistryObject(Language::class)->translateString($e->getMessage());
$this->d3GetMockableRegistryObject(UtilsView::class)->addErrorToDisplay($message);
}
return false;
}
/**
* @return void
*/
public function send(): void
{
$utilsView = $this->d3GetMockableRegistryObject(UtilsView::class);
try {
$utilsView->addErrorToDisplay($this->sendMessage());
} catch (noRecipientFoundException|InvalidArgumentException $e) {
$utilsView->addErrorToDisplay($e);
}
}
/**
* @return string
* @throws InvalidArgumentException
*/
protected function getMessageBody(): string
{
$messageBody = $this->d3GetMockableRegistryObject(Request::class)
->getRequestEscapedParameter('messagebody');
if (false === is_string($messageBody) || strlen(trim($messageBody)) <= 1) {
throw $this->d3GetMockableOxNewObject(
InvalidArgumentException::class,
Registry::getLang()->translateString('D3LM_EXC_MESSAGE_NO_LENGTH')
);
}
return $messageBody;
}
/**
@ -111,34 +46,9 @@ class AdminOrder extends AdminController
*/
protected function sendMessage(): string
{
$order = $this->d3GetMockableOxNewObject(Order::class);
$order->load($this->getEditObjectId());
$sms = $this->d3GetMockableOxNewObject(Sms::class, $this->getMessageBody());
return $sms->sendOrderMessage($order) ?
return $sms->sendOrderMessage($this->item) ?
(string) $this->getSuccessSentMessage($sms) :
$this->getUnsuccessfullySentMessage($sms);
}
/**
* @param Sms $sms
* @return successfullySentException
*/
protected function getSuccessSentMessage(Sms $sms): successfullySentException
{
$smsCount = $sms->getResponse() ? $sms->getResponse()->getSmsCount() : 0;
return $this->d3GetMockableOxNewObject(successfullySentException::class, $smsCount);
}
/**
* @param Sms $sms
* @return string
*/
protected function getUnsuccessfullySentMessage(Sms $sms): string
{
$errorMsg = $sms->getResponse() instanceof ResponseInterface ? $sms->getResponse()->getErrorMessage() : 'no response';
/** @var string $format */
$format = Registry::getLang()->translateString('D3LM_EXC_MESSAGE_UNEXPECTED_ERR_SEND');
return sprintf($format, $errorMsg);
}
}

View File

@ -0,0 +1,132 @@
<?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 <support@shopmodule.com>
* @link https://www.oxidmodule.com
*/
declare(strict_types=1);
namespace D3\Linkmobility4OXID\Application\Controller\Admin;
use D3\Linkmobility4OXID\Application\Model\Exceptions\noRecipientFoundException;
use D3\Linkmobility4OXID\Application\Model\Exceptions\successfullySentException;
use D3\Linkmobility4OXID\Application\Model\MessageTypes\Sms;
use D3\Linkmobility4OXID\Application\Model\OrderRecipients;
use D3\Linkmobility4OXID\Application\Model\UserRecipients;
use D3\LinkmobilityClient\Response\ResponseInterface;
use D3\LinkmobilityClient\ValueObject\Recipient;
use D3\TestingTools\Production\IsMockable;
use InvalidArgumentException;
use OxidEsales\Eshop\Application\Controller\Admin\AdminController;
use OxidEsales\Eshop\Application\Model\Order;
use OxidEsales\Eshop\Application\Model\User;
use OxidEsales\Eshop\Core\Language;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\UtilsView;
abstract class AdminSendController extends AdminController
{
use IsMockable;
/**
* @var Order|User
*/
protected $item;
/** @var OrderRecipients|UserRecipients */
protected $itemRecipients;
public function __construct()
{
$this->item->load($this->getEditObjectId());
$this->addTplParam('recipient', $this->getRecipientFromCurrentItem());
parent::__construct();
}
/**
* @return Recipient|false
*/
public function getRecipientFromCurrentItem()
{
try {
return $this->itemRecipients->getSmsRecipient();
} catch (noRecipientFoundException $e) {
/** @var string $message */
$message = $this->d3GetMockableRegistryObject(Language::class)->translateString($e->getMessage());
$this->d3GetMockableRegistryObject(UtilsView::class)->addErrorToDisplay($message);
}
return false;
}
/**
* @return void
*/
public function send(): void
{
$utilsView = $this->d3GetMockableRegistryObject(UtilsView::class);
try {
$utilsView->addErrorToDisplay($this->sendMessage());
} catch (noRecipientFoundException|InvalidArgumentException $e) {
$utilsView->addErrorToDisplay($e);
}
}
/**
* @return string
* @throws InvalidArgumentException
*/
protected function getMessageBody(): string
{
$messageBody = $this->d3GetMockableRegistryObject(Request::class)
->getRequestEscapedParameter('messagebody');
if (false === is_string($messageBody) || strlen(trim($messageBody)) <= 1) {
throw $this->d3GetMockableOxNewObject(
InvalidArgumentException::class,
Registry::getLang()->translateString('D3LM_EXC_MESSAGE_NO_LENGTH')
);
}
return $messageBody;
}
/**
* @return string
* @throws noRecipientFoundException
*/
abstract protected function sendMessage(): string;
/**
* @param Sms $sms
* @return successfullySentException
*/
protected function getSuccessSentMessage(Sms $sms): successfullySentException
{
$smsCount = $sms->getResponse() ? $sms->getResponse()->getSmsCount() : 0;
return $this->d3GetMockableOxNewObject(successfullySentException::class, $smsCount);
}
/**
* @param Sms $sms
* @return string
*/
protected function getUnsuccessfullySentMessage(Sms $sms): string
{
$errorMsg = $sms->getResponse() instanceof ResponseInterface ? $sms->getResponse()->getErrorMessage() : 'no response';
/** @var string $format */
$format = Registry::getLang()->translateString('D3LM_EXC_MESSAGE_UNEXPECTED_ERR_SEND');
return sprintf($format, $errorMsg);
}
}

View File

@ -18,14 +18,10 @@ namespace D3\Linkmobility4OXID\Application\Controller\Admin;
use D3\Linkmobility4OXID\Application\Model\Exceptions\noRecipientFoundException;
use D3\Linkmobility4OXID\Application\Model\MessageTypes\Sms;
use D3\Linkmobility4OXID\Application\Model\UserRecipients;
use D3\LinkmobilityClient\Response\ResponseInterface;
use D3\LinkmobilityClient\ValueObject\Recipient;
use Exception;
use OxidEsales\Eshop\Application\Controller\Admin\AdminController;
use OxidEsales\Eshop\Application\Model\Order;
use OxidEsales\Eshop\Application\Model\User;
use OxidEsales\Eshop\Core\Registry;
class AdminUser extends AdminController
class AdminUser extends AdminSendController
{
protected $_sThisTemplate = 'd3adminuser.tpl';
@ -34,66 +30,29 @@ class AdminUser extends AdminController
*/
protected $sms;
/**
* @var User
*/
protected $user;
/** @var User */
protected $item;
/** @var UserRecipients */
protected $itemRecipients;
public function __construct()
{
$this->user = $user = oxNew(User::class);
$user->load($this->getEditObjectId());
$this->addTplParam('recipient', $this->getRecipientFromCurrentUser());
$this->item = $this->d3GetMockableOxNewObject(User::class);
$this->itemRecipients = $this->d3GetMockableOxNewObject(UserRecipients::class, $this->item);
parent::__construct();
}
/**
* @return Recipient|false
* @return string
* @throws noRecipientFoundException
*/
public function getRecipientFromCurrentUser()
protected function sendMessage(): string
{
try {
return oxNew(UserRecipients::class, $this->user)->getSmsRecipient();
} catch (noRecipientFoundException $e) {
/** @var string $message */
$message = Registry::getLang()->translateString($e->getMessage());
Registry::getUtilsView()->addErrorToDisplay($message);
}
return false;
}
/**
* @return void
* @throws Exception
*/
public function send(): void
{
/** @var string $messageBody */
$messageBody = Registry::getRequest()->getRequestEscapedParameter('messagebody');
if (strlen($messageBody) <= 1) {
/** @var string $message */
$message = Registry::getLang()->translateString('D3LM_EXC_MESSAGE_NO_LENGTH');
Registry::getUtilsView()->addErrorToDisplay($message);
return;
}
$user = oxNew(User::class);
$user->load($this->getEditObjectId());
$sms = oxNew(Sms::class, $messageBody);
if ($sms->sendUserAccountMessage($user)) {
/** @var string $format */
$format = Registry::getLang()->translateString('D3LM_EXC_SMS_SUCC_SENT');
$smsCount = $sms->getResponse() ? $sms->getResponse()->getSmsCount() : 0;
Registry::getUtilsView()->addErrorToDisplay(sprintf($format, $smsCount));
} else {
$errorMsg = $sms->getResponse() instanceof ResponseInterface ? $sms->getResponse()->getErrorMessage() : 'no response';
/** @var string $format */
$format = Registry::getLang()->translateString('D3LM_EXC_MESSAGE_UNEXPECTED_ERR_SEND');
Registry::getUtilsView()->addErrorToDisplay(sprintf($format, $errorMsg));
}
/** @var Sms $sms */
$sms = $this->d3GetMockableOxNewObject(Sms::class, $this->getMessageBody());
return $sms->sendUserAccountMessage($this->item) ?
(string) $this->getSuccessSentMessage($sms) :
$this->getUnsuccessfullySentMessage($sms);
}
}

View File

@ -16,340 +16,39 @@ declare(strict_types=1);
namespace D3\Linkmobility4OXID\tests\unit\Application\Controller\Admin;
use D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder;
use D3\Linkmobility4OXID\Application\Model\Exceptions\noRecipientFoundException;
use D3\Linkmobility4OXID\Application\Model\Exceptions\successfullySentException;
use D3\Linkmobility4OXID\Application\Model\MessageTypes\Sms;
use D3\Linkmobility4OXID\Application\Model\OrderRecipients;
use D3\LinkmobilityClient\SMS\Response;
use D3\LinkmobilityClient\ValueObject\Recipient;
use D3\TestingTools\Development\CanAccessRestricted;
use InvalidArgumentException;
use OxidEsales\Eshop\Application\Model\Order;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\UtilsView;
use OxidEsales\TestingLibrary\UnitTestCase;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class AdminOrderTest extends UnitTestCase
class AdminOrderTest extends AdminSend
{
use CanAccessRestricted;
/**
* @test
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::__construct
*/
public function canConstruct()
{
/** @var Order|MockObject $orderMock */
$orderMock = $this->getMockBuilder(Order::class)
->onlyMethods(['load'])
->getMock();
$orderMock->method('load')->willReturn(true);
/** @var Recipient|MockObject $recipientMock */
$recipientMock = $this->getMockBuilder(Recipient::class)
->disableOriginalConstructor()
->getMock();
/** @var AdminOrder|MockObject $sut */
$sut = $this->getMockBuilder(AdminOrder::class)
->disableOriginalConstructor()
->onlyMethods(['d3GetMockableOxNewObject', 'getEditObjectId', 'getRecipientFromCurrentOrder'])
->getMock();
$sut->method('d3GetMockableOxNewObject')->willReturnCallback(
function () use ($orderMock) {
$args = func_get_args();
switch ($args[0]) {
case Order::class:
return $orderMock;
default:
return call_user_func_array("oxNew", $args);
}
}
);
$sut->method('getEditObjectId')->willReturn('editObjId');
$sut->method('getRecipientFromCurrentOrder')->willReturn($recipientMock);
$this->callMethod(
$sut,
'__construct'
);
$this->assertSame(
$orderMock,
$this->getValue(
$sut,
'order'
)
);
$this->assertSame(
$recipientMock,
$this->callMethod(
$sut,
'getViewDataElement',
['recipient']
)
);
}
protected $subjectUnderTestClass = AdminOrder::class;
protected $itemClass = Order::class;
protected $itemRecipientClass = OrderRecipients::class;
/**
* @test
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getRecipientFromCurrentOrder
*/
public function canGetRecipientFromCurrentOrderPassed()
{
/** @var Recipient|MockObject $recipientMock */
$recipientMock = $this->getMockBuilder(Recipient::class)
->disableOriginalConstructor()
->getMock();
/** @var OrderRecipients|MockObject $orderRecipientsMock */
$orderRecipientsMock = $this->getMockBuilder(OrderRecipients::class)
->disableOriginalConstructor()
->onlyMethods(['getSmsRecipient'])
->getMock();
$orderRecipientsMock->method('getSmsRecipient')->willReturn($recipientMock);
/** @var AdminOrder|MockObject $sut */
$sut = $this->getMockBuilder(AdminOrder::class)
->onlyMethods(['d3GetMockableOxNewObject'])
->disableOriginalConstructor()
->getMock();
$sut->method('d3GetMockableOxNewObject')->willReturnCallback(
function () use ($orderRecipientsMock) {
$args = func_get_args();
switch ($args[0]) {
case OrderRecipients::class:
return $orderRecipientsMock;
default:
return call_user_func_array("oxNew", $args);
}
}
);
$this->setValue(
$sut,
'order',
oxNew(Order::class)
);
$this->assertSame(
$recipientMock,
$this->callMethod(
$sut,
'getRecipientFromCurrentOrder'
)
);
}
/**
* @test
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getRecipientFromCurrentOrder
*/
public function canGetRecipientFromCurrentOrderThrowsException()
{
/** @var UtilsView|MockObject $utilsViewMock */
$utilsViewMock = $this->getMockBuilder(UtilsView::class)
->onlyMethods(['addErrorToDisplay'])
->getMock();
$utilsViewMock->expects($this->once())->method('addErrorToDisplay');
/** @var OrderRecipients|MockObject $orderRecipientsMock */
$orderRecipientsMock = $this->getMockBuilder(OrderRecipients::class)
->disableOriginalConstructor()
->onlyMethods(['getSmsRecipient'])
->getMock();
$orderRecipientsMock->method('getSmsRecipient')->willThrowException(
oxNew(noRecipientFoundException::class)
);
/** @var AdminOrder|MockObject $sut */
$sut = $this->getMockBuilder(AdminOrder::class)
->onlyMethods(['d3GetMockableOxNewObject', 'd3GetMockableRegistryObject'])
->disableOriginalConstructor()
->getMock();
$sut->method('d3GetMockableOxNewObject')->willReturnCallback(
function () use ($orderRecipientsMock) {
$args = func_get_args();
switch ($args[0]) {
case OrderRecipients::class:
return $orderRecipientsMock;
default:
return call_user_func_array("oxNew", $args);
}
}
);
$sut->method('d3GetMockableRegistryObject')->willReturnCallback(
function () use ($utilsViewMock) {
$args = func_get_args();
switch ($args[0]) {
case UtilsView::class:
return $utilsViewMock;
default:
return Registry::get($args[0]);
}
}
);
$this->setValue(
$sut,
'order',
oxNew(Order::class)
);
$this->assertFalse(
$this->callMethod(
$sut,
'getRecipientFromCurrentOrder'
)
);
}
/**
* @test
* @param $throwsException
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::send
* @dataProvider canSendDataProvider
*/
public function canSend($throwsException)
{
/** @var UtilsView|MockObject $utilsViewMock */
$utilsViewMock = $this->getMockBuilder(UtilsView::class)
->onlyMethods(['addErrorToDisplay'])
->getMock();
$utilsViewMock->expects($this->once())->method('addErrorToDisplay');
/** @var AdminOrder|MockObject $sut */
$sut = $this->getMockBuilder(AdminOrder::class)
->onlyMethods(['d3GetMockableRegistryObject', 'sendMessage'])
->disableOriginalConstructor()
->getMock();
$sut->method('d3GetMockableRegistryObject')->willReturnCallback(
function () use ($utilsViewMock) {
$args = func_get_args();
switch ($args[0]) {
case UtilsView::class:
return $utilsViewMock;
default:
return Registry::get($args[0]);
}
}
);
$sut->method('sendMessage')->will(
$throwsException ?
$this->throwException(oxNew(noRecipientFoundException::class)) :
$this->returnValue('successfully sent message')
);
$this->callMethod(
$sut,
'send'
);
}
/**
* @return array
*/
public function canSendDataProvider(): array
{
return [
'can send message' => [false],
'can not send message' => [true],
];
}
/**
* @param $message
* @param $expectException
* @param $expected
* @test
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getMessageBody
* @dataProvider canGetMessageBodyDataProvider
*/
public function canGetMessageBody($message, $expectException, $expected)
{
/** @var Request|MockObject $requestMock */
$requestMock = $this->getMockBuilder(Request::class)
->onlyMethods(['getRequestEscapedParameter'])
->getMock();
$requestMock->method('getRequestEscapedParameter')->willReturn($message);
/** @var Request|MockObject $sut */
$sut = $this->getMockBuilder(AdminOrder::class)
->onlyMethods(['d3GetMockableRegistryObject'])
->disableOriginalConstructor()
->getMock();
$sut->method('d3GetMockableRegistryObject')->willReturnCallback(
function () use ($requestMock) {
$args = func_get_args();
switch ($args[0]) {
case Request::class:
return $requestMock;
default:
return Registry::get($args[0]);
}
}
);
if ($expectException) {
$this->expectException(InvalidArgumentException::class);
}
$this->assertSame(
$expected,
$this->callMethod(
$sut,
'getMessageBody'
)
);
}
/**
* @return array[]
*/
public function canGetMessageBodyDataProvider(): array
{
return [
'message not string' => [[], true, ''],
'message empty string' => ['', true, ''],
'message whitespace string' => [' ', true, ''],
'message right string' => ['messagefixture', false, 'messagefixture'],
];
}
/**
* @test
* @param $canSendOrderMessage
* @param $canSendItemMessage
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::sendMessage
* @dataProvider canSendMessageDataProvider
*/
public function canSendMessage($canSendOrderMessage)
public function canSendMessage($canSendItemMessage)
{
/** @var Order|MockObject $orderMock */
$orderMock = $this->getMockBuilder(Order::class)
->onlyMethods(['load'])
->getMock();
$orderMock->method('load')->willReturn(true);
/** @var Sms|MockObject $smsMock */
$smsMock = $this->getMockBuilder(Sms::class)
->disableOriginalConstructor()
->onlyMethods(['sendOrderMessage'])
->getMock();
$smsMock->expects($this->once())->method('sendOrderMessage')->willReturn($canSendOrderMessage);
$smsMock->expects($this->once())->method('sendOrderMessage')->willReturn($canSendItemMessage);
/** @var AdminOrder|MockObject $sut */
$sut = $this->getMockBuilder(AdminOrder::class)
@ -357,11 +56,9 @@ class AdminOrderTest extends UnitTestCase
->onlyMethods(['d3GetMockableOxNewObject', 'getMessageBody', 'getSuccessSentMessage', 'getUnsuccessfullySentMessage'])
->getMock();
$sut->method('d3GetMockableOxNewObject')->willReturnCallback(
function () use ($orderMock, $smsMock) {
function () use ($smsMock) {
$args = func_get_args();
switch ($args[0]) {
case Order::class:
return $orderMock;
case Sms::class:
return $smsMock;
default:
@ -370,11 +67,17 @@ class AdminOrderTest extends UnitTestCase
}
);
$sut->method('getMessageBody')->willReturn('messageBodyFixture');
$sut->expects($this->exactly((int) $canSendOrderMessage))->method('getSuccessSentMessage')
$sut->expects($this->exactly((int) $canSendItemMessage))->method('getSuccessSentMessage')
->willReturn(oxNew(successfullySentException::class, 'expectedReturn'));
$sut->expects($this->exactly((int) !$canSendOrderMessage))->method('getUnsuccessfullySentMessage')
$sut->expects($this->exactly((int) !$canSendItemMessage))->method('getUnsuccessfullySentMessage')
->willReturn('expectedReturn');
$this->setValue(
$sut,
'item',
oxNew($this->itemClass)
);
$this->assertIsString(
$this->callMethod(
$sut,
@ -382,122 +85,4 @@ class AdminOrderTest extends UnitTestCase
)
);
}
/**
* @return array
*/
public function canSendMessageDataProvider(): array
{
return [
'send order message' => [true],
'dont send order message' => [false]
];
}
/**
* @test
* @param $hasResponse
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getSuccessSentMessage
* @dataProvider canGetSuccessSentMessageDataProvider
*/
public function canGetSuccessSentMessage($hasResponse)
{
/** @var successfullySentException|MockObject $successfullySendExceptionMock */
$successfullySendExceptionMock = $this->getMockBuilder(successfullySentException::class)
->disableOriginalConstructor()
->getMock();
/** @var Response|MockObject $resonseMock */
$resonseMock = $this->getMockBuilder(Response::class)
->onlyMethods(['getSmsCount'])
->disableOriginalConstructor()
->getMock();
$resonseMock->expects($hasResponse ? $this->once() : $this->never())->method('getSmsCount')
->willReturn(20);
/** @var Sms|MockObject $smsMock */
$smsMock = $this->getMockBuilder(Sms::class)
->disableOriginalConstructor()
->onlyMethods(['getResponse'])
->getMock();
$smsMock->method('getResponse')->willReturn($hasResponse ? $resonseMock : null);
/** @var AdminOrder|MockObject $sut */
$sut = $this->getMockBuilder(AdminOrder::class)
->disableOriginalConstructor()
->onlyMethods(['d3GetMockableOxNewObject'])
->getMock();
$sut->method('d3GetMockableOxNewObject')->willReturnCallback(
function () use ($successfullySendExceptionMock) {
$args = func_get_args();
switch ($args[0]) {
case successfullySentException::class:
return $successfullySendExceptionMock;
default:
return call_user_func_array("oxNew", $args);
}
}
);
$this->assertSame(
$successfullySendExceptionMock,
$this->callMethod(
$sut,
'getSuccessSentMessage',
[$smsMock]
)
);
}
/**
* @return array
*/
public function canGetSuccessSentMessageDataProvider(): array
{
return [
'has response' => [true],
'has no response' => [false],
];
}
/**
* @test
* @param $hasResponse
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getUnsuccessfullySentMessage
* @dataProvider canGetSuccessSentMessageDataProvider
*/
public function canGetUnsuccessfullySentMessage($hasResponse)
{
/** @var Response|MockObject $resonseMock */
$resonseMock = $this->getMockBuilder(Response::class)
->onlyMethods(['getErrorMessage'])
->disableOriginalConstructor()
->getMock();
$resonseMock->expects($hasResponse ? $this->once() : $this->never())->method('getErrorMessage')
->willReturn('errorMessage');
/** @var Sms|MockObject $smsMock */
$smsMock = $this->getMockBuilder(Sms::class)
->disableOriginalConstructor()
->onlyMethods(['getResponse'])
->getMock();
$smsMock->method('getResponse')->willReturn($hasResponse ? $resonseMock : null);
/** @var AdminOrder|MockObject $sut */
$sut = $this->getMockBuilder(AdminOrder::class)
->disableOriginalConstructor()
->getMock();
$this->assertIsString(
$this->callMethod(
$sut,
'getUnsuccessfullySentMessage',
[$smsMock]
)
);
}
}

View File

@ -0,0 +1,471 @@
<?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 <support@shopmodule.com>
* @link https://www.oxidmodule.com
*/
declare(strict_types=1);
namespace D3\Linkmobility4OXID\tests\unit\Application\Controller\Admin;
use D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder;
use D3\Linkmobility4OXID\Application\Controller\Admin\AdminUser;
use D3\Linkmobility4OXID\Application\Model\Exceptions\noRecipientFoundException;
use D3\Linkmobility4OXID\Application\Model\Exceptions\successfullySentException;
use D3\Linkmobility4OXID\Application\Model\MessageTypes\Sms;
use D3\Linkmobility4OXID\Application\Model\OrderRecipients;
use D3\Linkmobility4OXID\Application\Model\UserRecipients;
use D3\LinkmobilityClient\SMS\Response;
use D3\LinkmobilityClient\ValueObject\Recipient;
use D3\TestingTools\Development\CanAccessRestricted;
use InvalidArgumentException;
use OxidEsales\Eshop\Application\Model\Order;
use OxidEsales\Eshop\Application\Model\User;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\UtilsView;
use OxidEsales\TestingLibrary\UnitTestCase;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class AdminSend extends UnitTestCase
{
use CanAccessRestricted;
protected $subjectUnderTestClass;
protected $itemClass;
protected $itemRecipientClass;
/**
* @test
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::__construct
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminUser::__construct
*/
public function canConstruct()
{
/** @var Order|MockObject $itemMock */
$itemMock = $this->getMockBuilder($this->itemClass)
->onlyMethods(['load'])
->getMock();
$itemMock->method('load')->willReturn(true);
/** @var Recipient|MockObject $recipientMock */
$recipientMock = $this->getMockBuilder(Recipient::class)
->disableOriginalConstructor()
->getMock();
/** @var AdminOrder|MockObject $sut */
$sut = $this->getMockBuilder($this->subjectUnderTestClass)
->disableOriginalConstructor()
->onlyMethods(['d3GetMockableOxNewObject', 'getEditObjectId', 'getRecipientFromCurrentItem'])
->getMock();
$sut->method('d3GetMockableOxNewObject')->willReturnCallback(
function () use ($itemMock) {
$args = func_get_args();
switch ($args[0]) {
case Order::class:
return $itemMock;
default:
return call_user_func_array("oxNew", $args);
}
}
);
$sut->method('getEditObjectId')->willReturn('editObjId');
$sut->method('getRecipientFromCurrentItem')->willReturn($recipientMock);
$this->callMethod(
$sut,
'__construct'
);
$this->assertSame(
$itemMock,
$this->getValue(
$sut,
'item'
)
);
$this->assertInstanceOf(
$this->itemRecipientClass,
$this->getValue(
$sut,
'itemRecipients'
)
);
$this->assertSame(
$recipientMock,
$this->callMethod(
$sut,
'getViewDataElement',
['recipient']
)
);
}
/**
* @test
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getRecipientFromCurrentItem
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminUser::getRecipientFromCurrentItem
*/
public function canGetRecipientFromCurrentItemPassed()
{
/** @var Recipient|MockObject $recipientMock */
$recipientMock = $this->getMockBuilder(Recipient::class)
->disableOriginalConstructor()
->getMock();
/** @var OrderRecipients|UserRecipients|MockObject $itemsRecipientsMock */
$itemsRecipientsMock = $this->getMockBuilder($this->itemRecipientClass)
->disableOriginalConstructor()
->onlyMethods(['getSmsRecipient'])
->getMock();
$itemsRecipientsMock->method('getSmsRecipient')->willReturn($recipientMock);
/** @var AdminOrder|AdminUser|MockObject $sut */
$sut = $this->getMockBuilder($this->subjectUnderTestClass)
->onlyMethods(['send'])
->disableOriginalConstructor()
->getMock();
$this->setValue(
$sut,
'item',
oxNew($this->itemClass)
);
$this->setValue(
$sut,
'itemRecipients',
$itemsRecipientsMock
);
$this->assertSame(
$recipientMock,
$this->callMethod(
$sut,
'getRecipientFromCurrentItem'
)
);
}
/**
* @test
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getRecipientFromCurrentItem
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminUser::getRecipientFromCurrentItem
*/
public function canGetRecipientFromCurrentItemThrowsException()
{
/** @var UtilsView|MockObject $utilsViewMock */
$utilsViewMock = $this->getMockBuilder(UtilsView::class)
->onlyMethods(['addErrorToDisplay'])
->getMock();
$utilsViewMock->expects($this->once())->method('addErrorToDisplay');
/** @var OrderRecipients|MockObject $itemRecipientsMock */
$itemRecipientsMock = $this->getMockBuilder($this->itemRecipientClass)
->disableOriginalConstructor()
->onlyMethods(['getSmsRecipient'])
->getMock();
$itemRecipientsMock->method('getSmsRecipient')->willThrowException(
oxNew(noRecipientFoundException::class)
);
/** @var AdminOrder|AdminUser|MockObject $sut */
$sut = $this->getMockBuilder($this->subjectUnderTestClass)
->onlyMethods(['d3GetMockableOxNewObject', 'd3GetMockableRegistryObject'])
->disableOriginalConstructor()
->getMock();
$sut->method('d3GetMockableOxNewObject')->willReturnCallback(
function () use ($itemRecipientsMock) {
$args = func_get_args();
switch ($args[0]) {
case OrderRecipients::class:
case UserRecipients::class:
return $itemRecipientsMock;
default:
return call_user_func_array("oxNew", $args);
}
}
);
$sut->method('d3GetMockableRegistryObject')->willReturnCallback(
function () use ($utilsViewMock) {
$args = func_get_args();
switch ($args[0]) {
case UtilsView::class:
return $utilsViewMock;
default:
return Registry::get($args[0]);
}
}
);
$this->setValue(
$sut,
'item',
oxNew($this->itemClass)
);
$this->setValue(
$sut,
'itemRecipients',
oxNew($this->itemRecipientClass, oxNew($this->itemClass))
);
$this->assertFalse(
$this->callMethod(
$sut,
'getRecipientFromCurrentItem'
)
);
}
/**
* @test
* @param $throwsException
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::send
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminUser::send
* @dataProvider canSendDataProvider
*/
public function canSend($throwsException)
{
/** @var UtilsView|MockObject $utilsViewMock */
$utilsViewMock = $this->getMockBuilder(UtilsView::class)
->onlyMethods(['addErrorToDisplay'])
->getMock();
$utilsViewMock->expects($this->once())->method('addErrorToDisplay');
/** @var AdminOrder|AdminUser|MockObject $sut */
$sut = $this->getMockBuilder($this->subjectUnderTestClass)
->onlyMethods(['d3GetMockableRegistryObject', 'sendMessage'])
->disableOriginalConstructor()
->getMock();
$sut->method('d3GetMockableRegistryObject')->willReturnCallback(
function () use ($utilsViewMock) {
$args = func_get_args();
switch ($args[0]) {
case UtilsView::class:
return $utilsViewMock;
default:
return Registry::get($args[0]);
}
}
);
$sut->method('sendMessage')->will(
$throwsException ?
$this->throwException(oxNew(noRecipientFoundException::class)) :
$this->returnValue('successfully sent message')
);
$this->callMethod(
$sut,
'send'
);
}
/**
* @return array
*/
public function canSendDataProvider(): array
{
return [
'can send message' => [false],
'can not send message' => [true],
];
}
/**
* @param $message
* @param $expectException
* @param $expected
* @test
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getMessageBody
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminUser::getMessageBody
* @dataProvider canGetMessageBodyDataProvider
*/
public function canGetMessageBody($message, $expectException, $expected)
{
/** @var Request|MockObject $requestMock */
$requestMock = $this->getMockBuilder(Request::class)
->onlyMethods(['getRequestEscapedParameter'])
->getMock();
$requestMock->method('getRequestEscapedParameter')->willReturn($message);
/** @var AdminOrder|AdminUser|MockObject $sut */
$sut = $this->getMockBuilder($this->subjectUnderTestClass)
->onlyMethods(['d3GetMockableRegistryObject'])
->disableOriginalConstructor()
->getMock();
$sut->method('d3GetMockableRegistryObject')->willReturnCallback(
function () use ($requestMock) {
$args = func_get_args();
switch ($args[0]) {
case Request::class:
return $requestMock;
default:
return Registry::get($args[0]);
}
}
);
if ($expectException) {
$this->expectException(InvalidArgumentException::class);
}
$this->assertSame(
$expected,
$this->callMethod(
$sut,
'getMessageBody'
)
);
}
/**
* @return array[]
*/
public function canGetMessageBodyDataProvider(): array
{
return [
'message not string' => [[], true, ''],
'message empty string' => ['', true, ''],
'message whitespace string' => [' ', true, ''],
'message right string' => ['messagefixture', false, 'messagefixture'],
];
}
/**
* @return array
*/
public function canSendMessageDataProvider(): array
{
return [
'send item message' => [true],
'dont send item message' => [false]
];
}
/**
* @test
* @param $hasResponse
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getSuccessSentMessage
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminUser::getSuccessSentMessage
* @dataProvider canGetSuccessSentMessageDataProvider
*/
public function canGetSuccessSentMessage($hasResponse)
{
/** @var successfullySentException|MockObject $successfullySendExceptionMock */
$successfullySendExceptionMock = $this->getMockBuilder(successfullySentException::class)
->disableOriginalConstructor()
->getMock();
/** @var Response|MockObject $resonseMock */
$resonseMock = $this->getMockBuilder(Response::class)
->onlyMethods(['getSmsCount'])
->disableOriginalConstructor()
->getMock();
$resonseMock->expects($hasResponse ? $this->once() : $this->never())->method('getSmsCount')
->willReturn(20);
/** @var Sms|MockObject $smsMock */
$smsMock = $this->getMockBuilder(Sms::class)
->disableOriginalConstructor()
->onlyMethods(['getResponse'])
->getMock();
$smsMock->method('getResponse')->willReturn($hasResponse ? $resonseMock : null);
/** @var AdminOrder|AdminUser|MockObject $sut */
$sut = $this->getMockBuilder($this->subjectUnderTestClass)
->disableOriginalConstructor()
->onlyMethods(['d3GetMockableOxNewObject'])
->getMock();
$sut->method('d3GetMockableOxNewObject')->willReturnCallback(
function () use ($successfullySendExceptionMock) {
$args = func_get_args();
switch ($args[0]) {
case successfullySentException::class:
return $successfullySendExceptionMock;
default:
return call_user_func_array("oxNew", $args);
}
}
);
$this->assertSame(
$successfullySendExceptionMock,
$this->callMethod(
$sut,
'getSuccessSentMessage',
[$smsMock]
)
);
}
/**
* @return array
*/
public function canGetSuccessSentMessageDataProvider(): array
{
return [
'has response' => [true],
'has no response' => [false],
];
}
/**
* @test
* @param $hasResponse
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::getUnsuccessfullySentMessage
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminUser::getUnsuccessfullySentMessage
* @dataProvider canGetSuccessSentMessageDataProvider
*/
public function canGetUnsuccessfullySentMessage($hasResponse)
{
/** @var Response|MockObject $resonseMock */
$resonseMock = $this->getMockBuilder(Response::class)
->onlyMethods(['getErrorMessage'])
->disableOriginalConstructor()
->getMock();
$resonseMock->expects($hasResponse ? $this->once() : $this->never())->method('getErrorMessage')
->willReturn('errorMessage');
/** @var Sms|MockObject $smsMock */
$smsMock = $this->getMockBuilder(Sms::class)
->disableOriginalConstructor()
->onlyMethods(['getResponse'])
->getMock();
$smsMock->method('getResponse')->willReturn($hasResponse ? $resonseMock : null);
/** @var AdminOrder|AdminUser|MockObject $sut */
$sut = $this->getMockBuilder($this->subjectUnderTestClass)
->disableOriginalConstructor()
->getMock();
$this->assertIsString(
$this->callMethod(
$sut,
'getUnsuccessfullySentMessage',
[$smsMock]
)
);
}
}

View File

@ -0,0 +1,87 @@
<?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 <support@shopmodule.com>
* @link https://www.oxidmodule.com
*/
declare(strict_types=1);
namespace D3\Linkmobility4OXID\tests\unit\Application\Controller\Admin;
use D3\Linkmobility4OXID\Application\Controller\Admin\AdminUser;
use D3\Linkmobility4OXID\Application\Model\Exceptions\successfullySentException;
use D3\Linkmobility4OXID\Application\Model\MessageTypes\Sms;
use D3\Linkmobility4OXID\Application\Model\UserRecipients;
use D3\TestingTools\Development\CanAccessRestricted;
use OxidEsales\Eshop\Application\Model\User;
use PHPUnit\Framework\MockObject\MockObject;
use ReflectionException;
class AdminUserTest extends AdminSend
{
use CanAccessRestricted;
protected $subjectUnderTestClass = AdminUser::class;
protected $itemClass = User::class;
protected $itemRecipientClass = UserRecipients::class;
/**
* @test
* @param $canSendItemMessage
* @return void
* @throws ReflectionException
* @covers \D3\Linkmobility4OXID\Application\Controller\Admin\AdminOrder::sendMessage
* @dataProvider canSendMessageDataProvider
*/
public function canSendMessage($canSendItemMessage)
{
/** @var Sms|MockObject $smsMock */
$smsMock = $this->getMockBuilder(Sms::class)
->disableOriginalConstructor()
->onlyMethods(['sendUserAccountMessage'])
->getMock();
$smsMock->expects($this->once())->method('sendUserAccountMessage')->willReturn($canSendItemMessage);
/** @var AdminUser|MockObject $sut */
$sut = $this->getMockBuilder(AdminUser::class)
->disableOriginalConstructor()
->onlyMethods(['d3GetMockableOxNewObject', 'getMessageBody', 'getSuccessSentMessage', 'getUnsuccessfullySentMessage'])
->getMock();
$sut->method('d3GetMockableOxNewObject')->willReturnCallback(
function () use ($smsMock) {
$args = func_get_args();
switch ($args[0]) {
case Sms::class:
return $smsMock;
default:
return call_user_func_array("oxNew", $args);
}
}
);
$sut->method('getMessageBody')->willReturn('messageBodyFixture');
$sut->expects($this->exactly((int) $canSendItemMessage))->method('getSuccessSentMessage')
->willReturn(oxNew(successfullySentException::class, 'expectedReturn'));
$sut->expects($this->exactly((int) !$canSendItemMessage))->method('getUnsuccessfullySentMessage')
->willReturn('expectedReturn');
$this->setValue(
$sut,
'item',
oxNew($this->itemClass)
);
$this->assertIsString(
$this->callMethod(
$sut,
'sendMessage'
)
);
}
}