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

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

View File

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

View File

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

View File

@@ -14,6 +14,7 @@ use AtolOnline\{
Constants\Constraints,
Entities\Payment,
Enums\PaymentTypes,
Exceptions\EmptyVatsException,
Exceptions\InvalidEntityInCollectionException,
Exceptions\InvalidEnumValueException,
Exceptions\NegativePaymentSumException,
@@ -32,6 +33,8 @@ class VatsTest extends BasicTestCase
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::checkCount
* @covers \AtolOnline\Collections\EntityCollection::checkItemsClasses
* @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @throws InvalidEnumValueException
* @throws Exception
*/
@@ -44,150 +47,36 @@ class VatsTest extends BasicTestCase
}
/**
* Тестирует выброс исключения при установке слишком большого количества ставок через конструктор
* Тестирует выброс исключения при установке нулевого количества ставок
*
* @covers \AtolOnline\Collections\EntityCollection
* @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
* @throws InvalidEnumValueException
* @throws InvalidEntityInCollectionException
*/
public function testTooManyVatsExceptionByConstructor()
public function testTooManyVatsException()
{
$this->expectException(TooManyVatsException::class);
new Vats($this->generateVatObjects(Constraints::MAX_COUNT_DOC_VATS + 1));
}
/**
* Тестирует добавление ставки в начало коллекции
*
* @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));
(new Vats($this->generateVatObjects(Constraints::MAX_COUNT_DOC_VATS + 1)))->jsonSerialize();
}
/**
@@ -195,6 +84,7 @@ class VatsTest extends BasicTestCase
*
* @covers \AtolOnline\Collections\EntityCollection
* @covers \AtolOnline\Collections\EntityCollection::checkItemClass
* @covers \AtolOnline\Collections\EntityCollection::checkItemsClasses
* @covers \AtolOnline\Collections\EntityCollection::jsonSerialize
* @covers \AtolOnline\Exceptions\InvalidEntityInCollectionException
* @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 NegativePaymentSumException
* @throws TooHighPaymentSumException

View File

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