Реализован и покрыт тестами `AgentInfo` (переименован из `Agent`)

pull/10/head
Anthony Axenov 2021-11-27 17:59:50 +08:00
parent 16c8d8a676
commit e0d792d3a4
3 changed files with 289 additions and 3 deletions

View File

@ -0,0 +1,168 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
declare(strict_types = 1);
namespace AtolOnline\Entities;
use AtolOnline\Enums\AgentTypes;
use AtolOnline\Exceptions\InvalidEnumValueException;
/**
* Класс, описывающий данные агента
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 26-28
*/
class AgentInfo extends Entity
{
/**
* @var string|null Признак агента (1057)
*/
protected ?string $type = null;
/**
* @var PayingAgent|null Платёжный агент
*/
protected ?PayingAgent $paying_agent = null;
/**
* @var ReceivePaymentsOperator|null Оператор по приёму платежей
*/
protected ?ReceivePaymentsOperator $receive_payments_operator = null;
/**
* @var MoneyTransferOperator|null Оператор перевода
*/
protected ?MoneyTransferOperator $money_transfer_operator = null;
/**
* Конструктор
*
* @param string|null $type Признак агента (1057)
* @param PayingAgent|null $paying_agent Платёжный агент
* @param ReceivePaymentsOperator|null $receive_payments_operator Оператор по приёму платежей
* @param MoneyTransferOperator|null $money_transfer_operator Оператор перевода
* @throws InvalidEnumValueException
*/
public function __construct(
?string $type = null,
?PayingAgent $paying_agent = null,
?ReceivePaymentsOperator $receive_payments_operator = null,
?MoneyTransferOperator $money_transfer_operator = null,
) {
!is_null($type) && AgentTypes::isValid($type) && $this->setType($type);
!is_null($paying_agent) && $this->setPayingAgent($paying_agent);
!is_null($receive_payments_operator) && $this->setReceivePaymentsOperator($receive_payments_operator);
!is_null($money_transfer_operator) && $this->setMoneyTransferOperator($money_transfer_operator);
}
/**
* Возвращает установленный признак оператора
*
* @return string|null
*/
public function getType(): ?string
{
return $this->type;
}
/**
* Устанавливает признак оператора
*
* @param string|null $type
* @return AgentInfo
*/
public function setType(?string $type): AgentInfo
{
$this->type = $type;
return $this;
}
/**
* Взвращает установленного платёжного агента
*
* @return PayingAgent|null
*/
public function getPayingAgent(): ?PayingAgent
{
return $this->paying_agent;
}
/**
* Устанавливает платёжного агента
*
* @param PayingAgent|null $paying_agent
* @return AgentInfo
*/
public function setPayingAgent(?PayingAgent $paying_agent): AgentInfo
{
$this->paying_agent = $paying_agent;
return $this;
}
/**
* Возвращает установленного оператора по приёму платежей
*
* @return ReceivePaymentsOperator|null
*/
public function getReceivePaymentsOperator(): ?ReceivePaymentsOperator
{
return $this->receive_payments_operator;
}
/**
* Устанавливает оператора по приёму платежей
*
* @param ReceivePaymentsOperator|null $receive_payments_operator
* @return AgentInfo
*/
public function setReceivePaymentsOperator(?ReceivePaymentsOperator $receive_payments_operator): AgentInfo
{
$this->receive_payments_operator = $receive_payments_operator;
return $this;
}
/**
* Возвращает установленного оператора перевода
*
* @return MoneyTransferOperator|null
*/
public function getMoneyTransferOperator(): ?MoneyTransferOperator
{
return $this->money_transfer_operator;
}
/**
* Устанавливает оператора перевода
*
* @param MoneyTransferOperator|null $money_transfer_operator
* @return AgentInfo
*/
public function setMoneyTransferOperator(?MoneyTransferOperator $money_transfer_operator): AgentInfo
{
$this->money_transfer_operator = $money_transfer_operator;
return $this;
}
/**
* @inheritDoc
*/
public function jsonSerialize(): array
{
$json = [];
$this->getType() && $json['type'] = $this->getType();
$this->getPayingAgent()?->jsonSerialize() && $json['paying_agent'] = $this
->getPayingAgent()->jsonSerialize();
$this->getReceivePaymentsOperator()?->jsonSerialize() && $json['receive_payments_operator'] = $this
->getReceivePaymentsOperator()->jsonSerialize();
$this->getMoneyTransferOperator()?->jsonSerialize() && $json['money_transfer_operator'] = $this
->getMoneyTransferOperator()->jsonSerialize();
return $json;
}
}

View File

@ -67,16 +67,16 @@ class BasicTestCase extends TestCase
* Тестирует является ли объект приводимым к json-строке согласно схеме АТОЛ Онлайн
*
* @param Entity $entity
* @param array $json_structure
* @param array|null $json_structure
* @covers \AtolOnline\Entities\Entity::jsonSerialize
* @covers \AtolOnline\Entities\Entity::__toString
*/
public function assertAtolable(Entity $entity, array $json_structure = []): void
public function assertAtolable(Entity $entity, ?array $json_structure = null): void
{
$this->assertIsArray($entity->jsonSerialize());
$this->assertIsString((string)$entity);
$this->assertJson((string)$entity);
if ($json_structure) {
if (!is_null($json_structure)) {
$this->assertEquals(json_encode($json_structure), (string)$entity);
}
}

View File

@ -0,0 +1,118 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
namespace AtolOnline\Tests\Entities;
use AtolOnline\{
Entities\AgentInfo,
Entities\MoneyTransferOperator,
Entities\PayingAgent,
Entities\ReceivePaymentsOperator,
Enums\AgentTypes,
Exceptions\InvalidEnumValueException,
Exceptions\InvalidInnLengthException,
Exceptions\InvalidPhoneException,
Exceptions\TooLongPayingAgentOperationException,
Tests\BasicTestCase
};
/**
* Набор тестов для проверки работы класса агента
*/
class AgentInfoTest extends BasicTestCase
{
/**
* Тестирует конструктор без передачи значений и корректное приведение к json
*
* @covers \AtolOnline\Entities\AgentInfo
* @covers \AtolOnline\Entities\AgentInfo::jsonSerialize
*/
public function testConstructorWithoutArgs(): void
{
$this->assertAtolable(new AgentInfo(), []);
}
/**
* Тестирует конструктор с передачей значений и корректное приведение к json
*
* @covers \AtolOnline\Entities\AgentInfo
* @covers \AtolOnline\Entities\AgentInfo::jsonSerialize
* @covers \AtolOnline\Entities\AgentInfo::setType
* @covers \AtolOnline\Entities\AgentInfo::getType
* @covers \AtolOnline\Entities\AgentInfo::setPayingAgent
* @covers \AtolOnline\Entities\AgentInfo::getPayingAgent
* @covers \AtolOnline\Entities\PayingAgent::jsonSerialize
* @covers \AtolOnline\Entities\AgentInfo::setMoneyTransferOperator
* @covers \AtolOnline\Entities\AgentInfo::getMoneyTransferOperator
* @covers \AtolOnline\Entities\MoneyTransferOperator::jsonSerialize
* @covers \AtolOnline\Entities\AgentInfo::setReceivePaymentsOperator
* @covers \AtolOnline\Entities\AgentInfo::getReceivePaymentsOperator
* @covers \AtolOnline\Entities\ReceivePaymentsOperator::jsonSerialize
* @throws InvalidPhoneException
* @throws TooLongPayingAgentOperationException
* @throws InvalidInnLengthException
* @throws InvalidEnumValueException
*/
public function testConstructorWithArgs(): void
{
$this->assertAtolable(new AgentInfo(null), []);
$this->assertAtolable(new AgentInfo(AgentTypes::ANOTHER), ['type' => AgentTypes::ANOTHER]);
$this->assertAtolable(new AgentInfo(paying_agent: new PayingAgent()), []);
$this->assertAtolable(new AgentInfo(money_transfer_operator: new MoneyTransferOperator()), []);
$this->assertAtolable(new AgentInfo(receive_payments_operator: new ReceivePaymentsOperator()), []);
$this->assertAtolable(new AgentInfo(
AgentTypes::ANOTHER,
new PayingAgent(),
new ReceivePaymentsOperator(),
new MoneyTransferOperator(),
), ['type' => AgentTypes::ANOTHER]);
$this->assertAtolable(new AgentInfo(
AgentTypes::ANOTHER,
new PayingAgent('test', ['+79518888888']),
new ReceivePaymentsOperator(['+79519999999']),
new MoneyTransferOperator('MTO Name', '9876543210', 'London', ['+79517777777']),
), [
'type' => AgentTypes::ANOTHER,
'paying_agent' => [
'operation' => 'test',
'phones' => [
'+79518888888',
],
],
'receive_payments_operator' => [
'phones' => [
'+79519999999',
],
],
'money_transfer_operator' => [
'name' => 'MTO Name',
'inn' => '9876543210',
'address' => 'London',
'phones' => [
"+79517777777",
],
],
]);
}
/**
* Тестирует исключение при некорректном типе
*
* @covers \AtolOnline\Entities\AgentInfo
* @covers \AtolOnline\Enums\AgentTypes::isValid
* @covers \AtolOnline\Exceptions\InvalidEnumValueException
*/
public function testInvalidEnumValueException(): void
{
$this->expectException(InvalidEnumValueException::class);
new AgentInfo('qwerty');
}
}