Доработки коллекций, чека и тестов

- `EntityCollection` сильно упрощён, добавлен выброс исключений при пустом содержимом
- `Receipt::setItems(), setPayments() и setVats()` получили одинаковые проверки входящих данных
- округление в `Vat::setSum()`
- доработаны тесты коллекций
This commit is contained in:
Anthony Axenov 2021-12-09 20:13:43 +08:00
parent 16d1146826
commit 058ce5ed3d
10 changed files with 97 additions and 370 deletions

View File

@ -12,7 +12,6 @@ declare(strict_types = 1);
namespace AtolOnline\Collections; namespace AtolOnline\Collections;
use AtolOnline\Exceptions\InvalidEntityInCollectionException; use AtolOnline\Exceptions\InvalidEntityInCollectionException;
use Exception;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@ -21,60 +20,12 @@ use Illuminate\Support\Collection;
abstract class EntityCollection extends Collection abstract class EntityCollection extends Collection
{ {
/** /**
* @inheritDoc * @return array
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
*/ */
public function __construct($items = [])
{
$this->checkCount($items);
//TODO следует переделать EntityCollection в обёртку над Collection,
// ибо ломает методы Collection, которые return new static
$this->checkItemsClasses($items);
parent::__construct($items);
}
/**
* @inheritDoc
*/
public function prepend($value, $key = null): self
{
$this->checkCount();
return parent::prepend($value, $key);
}
/**
* @inheritDoc
*/
public function add($item): self
{
$this->checkCount();
return parent::add($item);
}
/**
* @inheritDoc
*/
public function push(...$values): self
{
$this->checkCount();
return parent::push(...$values);
}
/**
* @inheritDoc
*/
public function merge($items): self
{
$this->checkCount();
return parent::merge($items);
}
/**
* @inheritDoc
* @throws Exception
*/
public function jsonSerialize(): array public function jsonSerialize(): array
{ {
$this->checkCount();
$this->checkItemsClasses(); $this->checkItemsClasses();
return parent::jsonSerialize(); return parent::jsonSerialize();
} }
@ -82,20 +33,19 @@ abstract class EntityCollection extends Collection
/** /**
* Проверяет количество элементов коллекции * Проверяет количество элементов коллекции
* *
* @param array $items Массив элементов, если пустой - проверит содержимое коллекции
* @return void * @return void
*/ */
public function checkCount(array $items = []): void public function checkCount(): void
{ {
//TODO проверять пустоту? $this->isEmpty() && throw new (static::EMPTY_EXCEPTION_CLASS)();
if (count($items) > static::MAX_COUNT || $this->count() === static::MAX_COUNT) { $this->count() > static::MAX_COUNT && throw new (static::TOO_MANY_EXCEPTION_CLASS)(static::MAX_COUNT);
throw new (static::EXCEPTION_CLASS)(static::MAX_COUNT);
}
} }
/** /**
* Проверяет корректность класса элемента коллекции * Проверяет корректность класса элемента коллекции
* *
* @param mixed $item
* @return void
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
*/ */
public function checkItemClass(mixed $item): void public function checkItemClass(mixed $item): void
@ -108,10 +58,11 @@ abstract class EntityCollection extends Collection
/** /**
* Проверяет корректность классов элементов коллекции * Проверяет корректность классов элементов коллекции
* *
* @return $this
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
*/ */
public function checkItemsClasses(array $items = []): void public function checkItemsClasses(): self
{ {
(empty($items) ? $this : collect($items))->each(fn ($item) => $this->checkItemClass($item)); return $this->each(fn($item) => $this->checkItemClass($item));
} }
} }

View File

@ -11,6 +11,7 @@ namespace AtolOnline\Collections;
use AtolOnline\Constants\Constraints; use AtolOnline\Constants\Constraints;
use AtolOnline\Entities\Item; use AtolOnline\Entities\Item;
use AtolOnline\Exceptions\EmptyItemsException;
use AtolOnline\Exceptions\TooManyItemsException; use AtolOnline\Exceptions\TooManyItemsException;
/** /**
@ -28,8 +29,13 @@ final class Items extends EntityCollection
*/ */
protected const MAX_COUNT = Constraints::MAX_COUNT_DOC_ITEMS; protected const MAX_COUNT = Constraints::MAX_COUNT_DOC_ITEMS;
/**
* Класс исключения для выброса при пустой коллекции
*/
protected const EMPTY_EXCEPTION_CLASS = EmptyItemsException::class;
/** /**
* Класс-наследник TooManyException для выброса при превышении количества * Класс-наследник TooManyException для выброса при превышении количества
*/ */
protected const EXCEPTION_CLASS = TooManyItemsException::class; protected const TOO_MANY_EXCEPTION_CLASS = TooManyItemsException::class;
} }

View File

@ -11,6 +11,7 @@ namespace AtolOnline\Collections;
use AtolOnline\Constants\Constraints; use AtolOnline\Constants\Constraints;
use AtolOnline\Entities\Payment; use AtolOnline\Entities\Payment;
use AtolOnline\Exceptions\EmptyPaymentsException;
use AtolOnline\Exceptions\TooManyPaymentsException; use AtolOnline\Exceptions\TooManyPaymentsException;
/** /**
@ -28,8 +29,13 @@ final class Payments extends EntityCollection
*/ */
protected const MAX_COUNT = Constraints::MAX_COUNT_DOC_PAYMENTS; protected const MAX_COUNT = Constraints::MAX_COUNT_DOC_PAYMENTS;
/**
* Класс исключения для выброса при пустой коллекции
*/
protected const EMPTY_EXCEPTION_CLASS = EmptyPaymentsException::class;
/** /**
* Класс-наследник TooManyException для выброса при превышении количества * Класс-наследник TooManyException для выброса при превышении количества
*/ */
protected const EXCEPTION_CLASS = TooManyPaymentsException::class; protected const TOO_MANY_EXCEPTION_CLASS = TooManyPaymentsException::class;
} }

View File

@ -11,6 +11,7 @@ namespace AtolOnline\Collections;
use AtolOnline\Constants\Constraints; use AtolOnline\Constants\Constraints;
use AtolOnline\Entities\Vat; use AtolOnline\Entities\Vat;
use AtolOnline\Exceptions\EmptyVatsException;
use AtolOnline\Exceptions\TooManyVatsException; use AtolOnline\Exceptions\TooManyVatsException;
/** /**
@ -28,8 +29,13 @@ final class Vats extends EntityCollection
*/ */
protected const MAX_COUNT = Constraints::MAX_COUNT_DOC_VATS; protected const MAX_COUNT = Constraints::MAX_COUNT_DOC_VATS;
/**
* Класс исключения для выброса при пустой коллекции
*/
protected const EMPTY_EXCEPTION_CLASS = EmptyVatsException::class;
/** /**
* Класс-наследник TooManyException для выброса при превышении количества * Класс-наследник TooManyException для выброса при превышении количества
*/ */
protected const EXCEPTION_CLASS = TooManyVatsException::class; protected const TOO_MANY_EXCEPTION_CLASS = TooManyVatsException::class;
} }

View File

@ -16,8 +16,6 @@ use AtolOnline\Collections\Payments;
use AtolOnline\Collections\Vats; use AtolOnline\Collections\Vats;
use AtolOnline\Constants\Constraints; use AtolOnline\Constants\Constraints;
use AtolOnline\Exceptions\EmptyItemsException; use AtolOnline\Exceptions\EmptyItemsException;
use AtolOnline\Exceptions\EmptyPaymentsException;
use AtolOnline\Exceptions\EmptyVatsException;
use AtolOnline\Exceptions\InvalidEntityInCollectionException; use AtolOnline\Exceptions\InvalidEntityInCollectionException;
use AtolOnline\Exceptions\TooLongAddCheckPropException; use AtolOnline\Exceptions\TooLongAddCheckPropException;
use AtolOnline\Exceptions\TooLongCashierException; use AtolOnline\Exceptions\TooLongCashierException;
@ -93,7 +91,6 @@ class Receipt extends Entity
* @param Items $items * @param Items $items
* @param Payments $payments * @param Payments $payments
* @throws EmptyItemsException * @throws EmptyItemsException
* @throws EmptyPaymentsException
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
*/ */
public function __construct(Client $client, Company $company, Items $items, Payments $payments) public function __construct(Client $client, Company $company, Items $items, Payments $payments)
@ -211,12 +208,10 @@ class Receipt extends Entity
*/ */
public function setItems(Items $items): self public function setItems(Items $items): self
{ {
if ($items->isEmpty()) { $items->checkCount();
throw new EmptyItemsException();
}
$items->checkItemsClasses(); $items->checkItemsClasses();
$this->items = $items; $this->items = $items;
$this->getItems()->each(fn ($item) => $this->total += $item->getSum()); $this->getItems()->each(fn($item) => $this->total += $item->getSum());
$this->total = round($this->total, 2); $this->total = round($this->total, 2);
return $this; return $this;
} }
@ -236,13 +231,12 @@ class Receipt extends Entity
* *
* @param Payments $payments * @param Payments $payments
* @return Receipt * @return Receipt
* @throws EmptyPaymentsException * @throws InvalidEntityInCollectionException
*/ */
public function setPayments(Payments $payments): self public function setPayments(Payments $payments): self
{ {
if ($payments->isEmpty()) { $payments->checkCount();
throw new EmptyPaymentsException(); $payments->checkItemsClasses();
}
$this->payments = $payments; $this->payments = $payments;
return $this; return $this;
} }
@ -262,17 +256,15 @@ class Receipt extends Entity
* *
* @param Vats|null $vats * @param Vats|null $vats
* @return Receipt * @return Receipt
* @throws EmptyVatsException
* @throws Exception * @throws Exception
*/ */
public function setVats(?Vats $vats): self public function setVats(?Vats $vats): self
{ {
if ($vats->isEmpty()) { $vats->checkCount();
throw new EmptyVatsException(); $vats->checkItemsClasses();
}
$this->vats = $vats; $this->vats = $vats;
/** @var Vat $vat */ /** @var Vat $vat */
$this->getVats()->each(fn ($vat) => $vat->setSum($this->getTotal())); $this->getVats()->each(fn($vat) => $vat->setSum($this->getTotal()));
return $this; return $this;
} }
@ -376,13 +368,13 @@ class Receipt extends Entity
$json = [ $json = [
'client' => $this->getClient(), 'client' => $this->getClient(),
'company' => $this->getCompany(), 'company' => $this->getCompany(),
'items' => $this->getItems(), 'items' => $this->getItems()->jsonSerialize(),
'total' => $this->getTotal(), 'total' => $this->getTotal(),
'payments' => $this->getPayments(), 'payments' => $this->getPayments()->jsonSerialize(),
]; ];
$this->getAgentInfo()?->jsonSerialize() && $json['agent_info'] = $this->getAgentInfo(); $this->getAgentInfo()?->jsonSerialize() && $json['agent_info'] = $this->getAgentInfo();
$this->getSupplier()?->jsonSerialize() && $json['supplier_info'] = $this->getSupplier(); $this->getSupplier()?->jsonSerialize() && $json['supplier_info'] = $this->getSupplier();
$this->getVats()?->jsonSerialize() && $json['vats'] = $this->getVats(); $this->getVats()?->isNotEmpty() && $json['vats'] = $this->getVats();
!is_null($this->getAddCheckProps()) && $json['additional_check_props'] = $this->getAddCheckProps(); !is_null($this->getAddCheckProps()) && $json['additional_check_props'] = $this->getAddCheckProps();
!is_null($this->getCashier()) && $json['cashier'] = $this->getCashier(); !is_null($this->getCashier()) && $json['cashier'] = $this->getCashier();
$this->getAddUserProps()?->jsonSerialize() && $json['additional_user_props'] = $this->getAddUserProps(); $this->getAddUserProps()?->jsonSerialize() && $json['additional_user_props'] = $this->getAddUserProps();

View File

@ -91,7 +91,7 @@ final class Vat extends Entity
*/ */
public function setSum(float $rubles): self public function setSum(float $rubles): self
{ {
$this->sum = $rubles; $this->sum = round($rubles, 2);
return $this; return $this;
} }

View File

@ -15,6 +15,7 @@ use AtolOnline\{
Tests\BasicTestCase}; Tests\BasicTestCase};
use AtolOnline\Exceptions\{ use AtolOnline\Exceptions\{
EmptyItemNameException, EmptyItemNameException,
EmptyItemsException,
InvalidEntityInCollectionException, InvalidEntityInCollectionException,
NegativeItemPriceException, NegativeItemPriceException,
NegativeItemQuantityException, NegativeItemQuantityException,
@ -29,10 +30,12 @@ use AtolOnline\Exceptions\{
class ItemsTest extends BasicTestCase class ItemsTest extends BasicTestCase
{ {
/** /**
* Тестирует выброс исключения при установке слишком большого количества оплат через конструктор * Тестирует выброс исключения при установке слишком большого количества предметов расчёта
* *
* @covers \AtolOnline\Collections\EntityCollection * @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::checkCount * @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Collections\EntityCollection::checkItemsClasses
* @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @covers \AtolOnline\Exceptions\TooManyItemsException * @covers \AtolOnline\Exceptions\TooManyItemsException
* @throws EmptyItemNameException * @throws EmptyItemNameException
* @throws NegativeItemPriceException * @throws NegativeItemPriceException
@ -42,96 +45,25 @@ class ItemsTest extends BasicTestCase
* @throws TooManyException * @throws TooManyException
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
*/ */
public function testTooManyItemsExceptionByConstructor() public function testTooManyItemsException()
{ {
$this->expectException(TooManyItemsException::class); $this->expectException(TooManyItemsException::class);
new Items($this->generateItemObjects(Constraints::MAX_COUNT_DOC_ITEMS + 1)); (new Items($this->generateItemObjects(Constraints::MAX_COUNT_DOC_ITEMS + 1)))->jsonSerialize();
} }
/** /**
* Тестирует выброс исключения при добавлении лишней ставки в начало коллекции * Тестирует выброс исключения при установке нулевого количества предметов расчёта
*
* @covers \AtolOnline\Collections\EntityCollection::prepend
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyItemsException
* @throws EmptyItemNameException
* @throws NegativeItemPriceException
* @throws NegativeItemQuantityException
* @throws TooHighItemPriceException
* @throws TooLongItemNameException
* @throws TooManyException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyItemsExceptionByPrepend()
{
$this->expectException(TooManyItemsException::class);
(new Items($this->generateItemObjects(Constraints::MAX_COUNT_DOC_ITEMS)))
->prepend($this->generateItemObjects());
}
/**
* Тестирует выброс исключения при добавлении лишней ставки в конец коллекции
* *
* @covers \AtolOnline\Collections\EntityCollection * @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::add
* @covers \AtolOnline\Collections\EntityCollection::checkCount * @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyItemsException * @covers \AtolOnline\Collections\EntityCollection::checkItemsClasses
* @throws EmptyItemNameException * @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @throws NegativeItemPriceException * @covers \AtolOnline\Exceptions\EmptyItemsException
* @throws NegativeItemQuantityException
* @throws TooHighItemPriceException
* @throws TooLongItemNameException
* @throws TooManyException
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
*/ */
public function testTooManyItemsExceptionByAdd() public function testEmptyItemsException()
{ {
$this->expectException(TooManyItemsException::class); $this->expectException(EmptyItemsException::class);
(new Items($this->generateItemObjects(Constraints::MAX_COUNT_DOC_ITEMS))) (new Items([]))->jsonSerialize();
->add($this->generateItemObjects());
}
/**
* Тестирует выброс исключения при добавлении лишних оплат в конец коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::push
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyItemsException
* @throws EmptyItemNameException
* @throws NegativeItemPriceException
* @throws NegativeItemQuantityException
* @throws TooHighItemPriceException
* @throws TooLongItemNameException
* @throws TooManyException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyItemsExceptionByPush()
{
$this->expectException(TooManyItemsException::class);
(new Items($this->generateItemObjects(Constraints::MAX_COUNT_DOC_ITEMS)))
->push(...$this->generateItemObjects());
}
/**
* Тестирует выброс исключения при добавлении лишней ставки в начало коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::merge
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyItemsException
* @throws EmptyItemNameException
* @throws NegativeItemPriceException
* @throws NegativeItemQuantityException
* @throws TooHighItemPriceException
* @throws TooLongItemNameException
* @throws TooManyException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyItemsExceptionByMerge()
{
$this->expectException(TooManyItemsException::class);
(new Items($this->generateItemObjects(Constraints::MAX_COUNT_DOC_ITEMS)))
->merge($this->generateItemObjects(2));
} }
} }

View File

@ -12,6 +12,7 @@ namespace AtolOnline\Tests\Collections;
use AtolOnline\{ use AtolOnline\{
Collections\Payments, Collections\Payments,
Constants\Constraints, Constants\Constraints,
Exceptions\EmptyPaymentsException,
Exceptions\InvalidEntityInCollectionException, Exceptions\InvalidEntityInCollectionException,
Exceptions\InvalidEnumValueException, Exceptions\InvalidEnumValueException,
Exceptions\NegativePaymentSumException, Exceptions\NegativePaymentSumException,
@ -25,7 +26,7 @@ use AtolOnline\{
class PaymentsTest extends BasicTestCase class PaymentsTest extends BasicTestCase
{ {
/** /**
* Тестирует выброс исключения при установке слишком большого количества оплат через конструктор * Тестирует выброс исключения при установке слишком большого количества оплат
* *
* @covers \AtolOnline\Collections\EntityCollection * @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::checkCount * @covers \AtolOnline\Collections\EntityCollection::checkCount
@ -38,81 +39,21 @@ class PaymentsTest extends BasicTestCase
public function testTooManyPaymentsExceptionByConstructor() public function testTooManyPaymentsExceptionByConstructor()
{ {
$this->expectException(TooManyPaymentsException::class); $this->expectException(TooManyPaymentsException::class);
new Payments($this->generatePaymentObjects(Constraints::MAX_COUNT_DOC_PAYMENTS + 1)); (new Payments($this->generatePaymentObjects(Constraints::MAX_COUNT_DOC_PAYMENTS + 1)))->jsonSerialize();
} }
/** /**
* Тестирует выброс исключения при добавлении лишней ставки в начало коллекции * Тестирует выброс исключения при установке нулевого количества оплат
*
* @covers \AtolOnline\Collections\EntityCollection::prepend
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyPaymentsException
* @throws InvalidEnumValueException
* @throws NegativePaymentSumException
* @throws TooHighPaymentSumException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyPaymentsExceptionByPrepend()
{
$this->expectException(TooManyPaymentsException::class);
(new Payments($this->generatePaymentObjects(Constraints::MAX_COUNT_DOC_PAYMENTS)))
->prepend($this->generatePaymentObjects());
}
/**
* Тестирует выброс исключения при добавлении лишней ставки в конец коллекции
* *
* @covers \AtolOnline\Collections\EntityCollection * @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::add
* @covers \AtolOnline\Collections\EntityCollection::checkCount * @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyPaymentsException * @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @throws InvalidEnumValueException * @covers \AtolOnline\Exceptions\EmptyPaymentsException
* @throws NegativePaymentSumException
* @throws TooHighPaymentSumException
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
*/ */
public function testTooManyPaymentsExceptionByAdd() public function testEmptyPaymentsException()
{ {
$this->expectException(TooManyPaymentsException::class); $this->expectException(EmptyPaymentsException::class);
(new Payments($this->generatePaymentObjects(Constraints::MAX_COUNT_DOC_PAYMENTS))) (new Payments([]))->jsonSerialize();
->add($this->generatePaymentObjects());
}
/**
* Тестирует выброс исключения при добавлении лишних оплат в конец коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::push
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyPaymentsException
* @throws InvalidEnumValueException
* @throws NegativePaymentSumException
* @throws TooHighPaymentSumException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyPaymentsExceptionByPush()
{
$this->expectException(TooManyPaymentsException::class);
(new Payments($this->generatePaymentObjects(Constraints::MAX_COUNT_DOC_PAYMENTS + 1)))
->push(...$this->generatePaymentObjects());
}
/**
* Тестирует выброс исключения при добавлении лишней ставки в начало коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::merge
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyPaymentsException
* @throws InvalidEnumValueException
* @throws NegativePaymentSumException
* @throws TooHighPaymentSumException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyPaymentsExceptionByMerge()
{
$this->expectException(TooManyPaymentsException::class);
(new Payments($this->generatePaymentObjects(Constraints::MAX_COUNT_DOC_PAYMENTS - 1)))
->merge($this->generatePaymentObjects(2));
} }
} }

View File

@ -14,6 +14,7 @@ use AtolOnline\{
Constants\Constraints, Constants\Constraints,
Entities\Payment, Entities\Payment,
Enums\PaymentTypes, Enums\PaymentTypes,
Exceptions\EmptyVatsException,
Exceptions\InvalidEntityInCollectionException, Exceptions\InvalidEntityInCollectionException,
Exceptions\InvalidEnumValueException, Exceptions\InvalidEnumValueException,
Exceptions\NegativePaymentSumException, Exceptions\NegativePaymentSumException,
@ -32,6 +33,8 @@ class VatsTest extends BasicTestCase
* *
* @covers \AtolOnline\Collections\EntityCollection * @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::checkCount * @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Collections\EntityCollection::checkItemsClasses
* @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @throws InvalidEnumValueException * @throws InvalidEnumValueException
* @throws Exception * @throws Exception
*/ */
@ -44,150 +47,36 @@ class VatsTest extends BasicTestCase
} }
/** /**
* Тестирует выброс исключения при установке слишком большого количества ставок через конструктор * Тестирует выброс исключения при установке нулевого количества ставок
* *
* @covers \AtolOnline\Collections\EntityCollection * @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::checkCount * @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Collections\EntityCollection::checkItemsClasses
* @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @covers \AtolOnline\Exceptions\EmptyVatsException
* @throws InvalidEntityInCollectionException
*/
public function testEmptyVatsException()
{
$this->expectException(EmptyVatsException::class);
(new Vats([]))->jsonSerialize();
}
/**
* Тестирует выброс исключения при установке слишком большого количества ставок
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Collections\EntityCollection::checkItemsClasses
* @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @covers \AtolOnline\Exceptions\TooManyVatsException * @covers \AtolOnline\Exceptions\TooManyVatsException
* @throws InvalidEnumValueException * @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
*/ */
public function testTooManyVatsExceptionByConstructor() public function testTooManyVatsException()
{ {
$this->expectException(TooManyVatsException::class); $this->expectException(TooManyVatsException::class);
new Vats($this->generateVatObjects(Constraints::MAX_COUNT_DOC_VATS + 1)); (new Vats($this->generateVatObjects(Constraints::MAX_COUNT_DOC_VATS + 1)))->jsonSerialize();
}
/**
* Тестирует добавление ставки в начало коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::prepend
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException
*/
public function testPrepend()
{
$vats = (new Vats($this->generateVatObjects(3)))
->prepend($this->generateVatObjects());
$this->assertEquals(4, $vats->count());
}
/**
* Тестирует выброс исключения при добавлении лишней ставки в начало коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::prepend
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyVatsException
* @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyVatsExceptionByPrepend()
{
$this->expectException(TooManyVatsException::class);
(new Vats($this->generateVatObjects(Constraints::MAX_COUNT_DOC_VATS)))
->prepend($this->generateVatObjects());
}
/**
* Тестирует добавление ставки в конец коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::add
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException
*/
public function testAdd()
{
$vats = (new Vats($this->generateVatObjects(3)))
->add($this->generateVatObjects());
$this->assertEquals(4, $vats->count());
}
/**
* Тестирует выброс исключения при добавлении лишней ставки в конец коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::add
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyVatsException
* @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyVatsExceptionByAdd()
{
$this->expectException(TooManyVatsException::class);
(new Vats($this->generateVatObjects(Constraints::MAX_COUNT_DOC_VATS)))
->add($this->generateVatObjects());
}
/**
* Тестирует добавление лишних ставок в конец коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::push
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException
*/
public function testPush()
{
$vats = (new Vats($this->generateVatObjects(3)))
->push(...$this->generateVatObjects(3));
$this->assertEquals(6, $vats->count());
}
/**
* Тестирует выброс исключения при добавлении лишних ставок в конец коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::push
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyVatsException
* @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyVatsExceptionByPush()
{
$this->expectException(TooManyVatsException::class);
(new Vats($this->generateVatObjects(Constraints::MAX_COUNT_DOC_VATS)))
->push(...$this->generateVatObjects());
}
/**
* Тестирует добавление ставки в начало коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::merge
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException
*/
public function testMerge()
{
$vats = (new Vats($this->generateVatObjects(3)))
->merge($this->generateVatObjects(3));
$this->assertEquals(6, $vats->count());
}
/**
* Тестирует выброс исключения при добавлении лишней ставки в начало коллекции
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::merge
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Exceptions\TooManyVatsException
* @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyVatsExceptionByMerge()
{
$this->expectException(TooManyVatsException::class);
(new Vats($this->generateVatObjects(Constraints::MAX_COUNT_DOC_VATS - 1)))
->merge($this->generateVatObjects(2));
} }
/** /**
@ -195,6 +84,7 @@ class VatsTest extends BasicTestCase
* *
* @covers \AtolOnline\Collections\EntityCollection * @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::checkItemClass * @covers \AtolOnline\Collections\EntityCollection::checkItemClass
* @covers \AtolOnline\Collections\EntityCollection::checkItemsClasses
* @covers \AtolOnline\Collections\EntityCollection::jsonSerialize * @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @covers \AtolOnline\Exceptions\InvalidEntityInCollectionException * @covers \AtolOnline\Exceptions\InvalidEntityInCollectionException
* @throws InvalidEnumValueException * @throws InvalidEnumValueException
@ -212,6 +102,9 @@ class VatsTest extends BasicTestCase
/** /**
* Тестирует выброс исключения при наличии объектов не тех классов в коллекции * Тестирует выброс исключения при наличии объектов не тех классов в коллекции
* *
* @covers \AtolOnline\Collections\EntityCollection::checkItemClass
* @covers \AtolOnline\Collections\EntityCollection::checkItemsClasses
* @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @throws InvalidEnumValueException * @throws InvalidEnumValueException
* @throws NegativePaymentSumException * @throws NegativePaymentSumException
* @throws TooHighPaymentSumException * @throws TooHighPaymentSumException

View File

@ -268,7 +268,7 @@ class ReceiptTest extends BasicTestCase
{ {
$this->expectException(InvalidEntityInCollectionException::class); $this->expectException(InvalidEntityInCollectionException::class);
$this->expectErrorMessage('Коллекция AtolOnline\Collections\Payments должна содержать объекты AtolOnline\Entities\Payment'); $this->expectErrorMessage('Коллекция AtolOnline\Collections\Payments должна содержать объекты AtolOnline\Entities\Payment');
new Receipt( (string)new Receipt(
new Client('John Doe', 'john@example.com', '+1/22/99*73s dsdas654 5s6', '+fasd3\qe3fs_=nac99013928czc'), new Client('John Doe', 'john@example.com', '+1/22/99*73s dsdas654 5s6', '+fasd3\qe3fs_=nac99013928czc'),
new Company('company@example.com', SnoTypes::OSN, '1234567890', 'https://example.com'), new Company('company@example.com', SnoTypes::OSN, '1234567890', 'https://example.com'),
new Items([new Item('test item', 2, 3)]), new Items([new Item('test item', 2, 3)]),
@ -287,7 +287,6 @@ class ReceiptTest extends BasicTestCase
* @throws EmptyItemNameException * @throws EmptyItemNameException
* @throws EmptyItemsException * @throws EmptyItemsException
* @throws EmptyPaymentsException * @throws EmptyPaymentsException
* @throws EmptyVatsException
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
* @throws InvalidEnumValueException * @throws InvalidEnumValueException
* @throws NegativeItemPriceException * @throws NegativeItemPriceException
@ -297,6 +296,7 @@ class ReceiptTest extends BasicTestCase
* @throws TooHighPaymentSumException * @throws TooHighPaymentSumException
* @throws TooLongItemNameException * @throws TooLongItemNameException
* @throws TooManyException * @throws TooManyException
* @throws Exception
*/ */
public function testEmptyVatsException(): void public function testEmptyVatsException(): void
{ {
@ -316,7 +316,6 @@ class ReceiptTest extends BasicTestCase
* @throws EmptyItemNameException * @throws EmptyItemNameException
* @throws EmptyItemsException * @throws EmptyItemsException
* @throws EmptyPaymentsException * @throws EmptyPaymentsException
* @throws EmptyVatsException
* @throws InvalidEntityInCollectionException * @throws InvalidEntityInCollectionException
* @throws InvalidEnumValueException * @throws InvalidEnumValueException
* @throws NegativeItemPriceException * @throws NegativeItemPriceException
@ -326,12 +325,13 @@ class ReceiptTest extends BasicTestCase
* @throws TooHighPaymentSumException * @throws TooHighPaymentSumException
* @throws TooLongItemNameException * @throws TooLongItemNameException
* @throws TooManyException * @throws TooManyException
* @throws Exception
*/ */
public function testInvalidVatInCollectionException(): void public function testInvalidVatInCollectionException(): void
{ {
$this->expectException(InvalidEntityInCollectionException::class); $this->expectException(InvalidEntityInCollectionException::class);
$this->expectErrorMessage('Коллекция AtolOnline\Collections\Vats должна содержать объекты AtolOnline\Entities\Vat'); $this->expectErrorMessage('Коллекция AtolOnline\Collections\Vats должна содержать объекты AtolOnline\Entities\Vat');
$this->newReceipt()->setVats(new Vats(['qwerty'])); (string)$this->newReceipt()->setVats(new Vats(['qwerty']));
} }
/** /**