- строгая типизация - переработан класс `TestEnvParams`: - вынесен на уровень выше из под `AtolOnline\Constants` - вместо констант - две функции для получения актуальных параметров подключения по ФФД1.05 и ФФД1.2 - актуализированы `PaymentObjects` согласно #5 - исходники вынесены не уровень выше в `src` - константы теперь enum через `myclabs/php-enum` - новые константы `DocumentTypes` - классы констант финализированы - все исключения переименованы, а многие так или иначе отрефакторены (не полностью) - новые исключения `InvalidSnoException`, `InvalidPaymentAddressException` - `helpers.php` стал полноценным классом `Helpers` - удалены трейты `HasEmail`, `HasInn`, `RublesKopeksConverter` (конвертация перенесена в `Helpers`) - удалён хелпер `valid_strlen()`, вместо него теперь везде `mb_strlen()` - сущности `Client` и `Company` получили свои имплементации для `email` и `inn` - доработки в `BasicTestCase` - полное покрытие тестами: `Client`, `Company`, `Helpers` - поправлен `phpunit.xml` - везде обновлены копирайты - актуализированы и исправлены phpdoc, return types - начато введение `strict_types=1` - минимальный php теперь 8.0 - обновлены все зависимости - подключен пакет коллекций laravel для будущего использования - теперь можно `composer test` и `composer test-cov`
This commit is contained in:
@@ -1,12 +1,16 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
/*
|
||||
* 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\Tests;
|
||||
|
||||
use AtolOnline\Entities\Entity;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
@@ -16,7 +20,7 @@ use PHPUnit\Framework\TestCase;
|
||||
class BasicTestCase extends TestCase
|
||||
{
|
||||
/**
|
||||
*
|
||||
* @todo требуется рефакторинг
|
||||
*/
|
||||
public function setUp(): void
|
||||
{
|
||||
@@ -26,38 +30,56 @@ class BasicTestCase extends TestCase
|
||||
defined('ATOL_KKT_PASS') ?: define('ATOL_KKT_PASS', 'iGFFuihss');
|
||||
defined('ATOL_CALLBACK_URL') ?: define('ATOL_CALLBACK_URL', 'http://example.com/callback');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Тестирует является ли объект приводимым к json-строке согласно схеме АТОЛ Онлайн
|
||||
*
|
||||
* @param Entity $entity
|
||||
* @return $this
|
||||
* @param array $json_structure
|
||||
* @covers \AtolOnline\Entities\Entity::jsonSerialize
|
||||
* @covers \AtolOnline\Entities\Entity::__toString
|
||||
*/
|
||||
public function checkAtolEntity(Entity $entity)
|
||||
public function assertAtolable(Entity $entity, array $json_structure = []): void
|
||||
{
|
||||
$this->assertIsObject($entity);
|
||||
$this->assertIsObject($entity->jsonSerialize());
|
||||
$this->assertIsString((string)$entity);
|
||||
$this->assertJson((string)$entity);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function tearDown(): void
|
||||
{
|
||||
//parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает случайную строку указанной длины
|
||||
*
|
||||
* @param int $length
|
||||
* @return string
|
||||
*/
|
||||
protected static function randomString($length = 8)
|
||||
{
|
||||
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
$string = '';
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$string .= $characters[mt_rand(0, strlen($characters) - 1)];
|
||||
if ($json_structure) {
|
||||
$this->assertEquals(json_encode($json_structure), (string)$entity);
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Провайдер валидных телефонов
|
||||
*
|
||||
* @return array<array<string, string>>
|
||||
*/
|
||||
public function providerValidPhones(): array
|
||||
{
|
||||
return [
|
||||
['+79991234567', '+79991234567'],
|
||||
['79991234567', '+79991234567'],
|
||||
['89991234567', '+89991234567'],
|
||||
['+7 999 123 45 67', '+79991234567'],
|
||||
['+7 (999) 123-45-67', '+79991234567'],
|
||||
["+7 %(?9:9\"9')abc\r123\n45\t67\0", '+79991234567'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Провайдер валидных email-ов
|
||||
*
|
||||
* @return array<array<string>>
|
||||
*/
|
||||
public function providerValidEmails(): array
|
||||
{
|
||||
return [
|
||||
['abc@mail.com'],
|
||||
['abc-d@mail.com'],
|
||||
['abc.def@mail.com'],
|
||||
['abc.def@mail.org'],
|
||||
['abc.def@mail-archive.com'],
|
||||
];
|
||||
}
|
||||
}
|
||||
317
tests/ClientTest.php
Normal file
317
tests/ClientTest.php
Normal file
@@ -0,0 +1,317 @@
|
||||
<?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;
|
||||
|
||||
use AtolOnline\{
|
||||
Entities\Client,
|
||||
Exceptions\InvalidEmailException,
|
||||
Exceptions\InvalidInnLengthException,
|
||||
Exceptions\TooLongEmailException,
|
||||
Exceptions\TooLongNameException,
|
||||
Exceptions\TooLongPhoneException,
|
||||
Helpers};
|
||||
|
||||
/**
|
||||
* Набор тестов для проверки работы класс покупателя
|
||||
*/
|
||||
class ClientTest extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Провайдер строк, которые приводятся к null
|
||||
*
|
||||
* @return array<array<string|null>>
|
||||
*/
|
||||
public function providerNullableStrings(): array
|
||||
{
|
||||
return [
|
||||
[''],
|
||||
[' '],
|
||||
[null],
|
||||
["\n\r\t"],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Провайдер телефонов, которые приводятся к null
|
||||
*
|
||||
* @return array<array<string>>
|
||||
*/
|
||||
public function providerNullablePhones(): array
|
||||
{
|
||||
return array_merge(
|
||||
$this->providerNullableStrings(),
|
||||
[
|
||||
[Helpers::randomStr(10, false)],
|
||||
["asdfgvs \n\rtt\t*/(*&%^*$%"],
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Провайдер невалидных email-ов
|
||||
*
|
||||
* @return array<array<string>>
|
||||
*/
|
||||
public function providerInvalidEmails(): array
|
||||
{
|
||||
return [
|
||||
['@example'],
|
||||
[Helpers::randomStr(15)],
|
||||
['@example.com'],
|
||||
['abc.def@mail'],
|
||||
['.abc@mail.com'],
|
||||
['example@example'],
|
||||
['abc..def@mail.com'],
|
||||
['abc.def@mail..com'],
|
||||
['abc.def@mail#archive.com'],
|
||||
];
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Тестирует приведение покупателя к json
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::jsonSerialize
|
||||
*/
|
||||
public function testAtolable(): void
|
||||
{
|
||||
$this->assertAtolable(new Client());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует конструктор покупателя без передачи значений
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::jsonSerialize
|
||||
*/
|
||||
public function testConstructorWithoutArgs(): void
|
||||
{
|
||||
$this->assertEquals('{}', (string)(new Client()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует конструктор с передачей значений (внутри работают сеттеры)
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::jsonSerialize
|
||||
* @covers \AtolOnline\Entities\Client::setName
|
||||
* @covers \AtolOnline\Entities\Client::setPhone
|
||||
* @covers \AtolOnline\Entities\Client::setEmail
|
||||
* @covers \AtolOnline\Entities\Client::setInn
|
||||
*/
|
||||
public function testConstructorWithArgs(): void
|
||||
{
|
||||
$customer = new Client(
|
||||
'John Doe',
|
||||
'john@example.com',
|
||||
'+1/22/99*73s dsdas654 5s6', // +122997365456
|
||||
'+fasd3\qe3fs_=nac99013928czc' // 3399013928
|
||||
);
|
||||
$this->assertAtolable($customer, [
|
||||
'name' => 'John Doe',
|
||||
'email' => 'john@example.com',
|
||||
'phone' => '+122997365456',
|
||||
'inn' => '3399013928',
|
||||
]);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Тестирует установку имён покупателя, которые приводятся к null
|
||||
*
|
||||
* @param mixed $name
|
||||
* @dataProvider providerNullableStrings
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setName
|
||||
* @covers \AtolOnline\Entities\Client::getName
|
||||
* @throws TooLongNameException
|
||||
*/
|
||||
public function testNullableNames(mixed $name): void
|
||||
{
|
||||
$customer = (new Client())->setName($name);
|
||||
$this->assertNull($customer->getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует установку валидного имени покупателя
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setName
|
||||
* @covers \AtolOnline\Entities\Client::getName
|
||||
* @throws TooLongNameException
|
||||
*/
|
||||
public function testValidName(): void
|
||||
{
|
||||
$name = Helpers::randomStr();
|
||||
$customer = (new Client())->setName($name);
|
||||
$this->assertEquals($name, $customer->getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует установку невалидного имени покупателя
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setName
|
||||
* @covers \AtolOnline\Exceptions\TooLongNameException
|
||||
* @throws TooLongNameException
|
||||
*/
|
||||
public function testInvalidName(): void
|
||||
{
|
||||
$this->expectException(TooLongNameException::class);
|
||||
(new Client())->setName(Helpers::randomStr(400));
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Тестирует установку телефонов покупателя, которые приводятся к null
|
||||
*
|
||||
* @param mixed $phone
|
||||
* @dataProvider providerNullablePhones
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setPhone
|
||||
* @covers \AtolOnline\Entities\Client::getPhone
|
||||
* @throws TooLongPhoneException
|
||||
*/
|
||||
public function testNullablePhones(mixed $phone): void
|
||||
{
|
||||
$customer = (new Client())->setPhone($phone);
|
||||
$this->assertNull($customer->getPhone());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует установку валидного телефона покупателя
|
||||
*
|
||||
* @dataProvider providerValidPhones
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setPhone
|
||||
* @covers \AtolOnline\Entities\Client::getPhone
|
||||
* @throws TooLongPhoneException
|
||||
*/
|
||||
public function testValidPhone(string $input, string $output): void
|
||||
{
|
||||
$customer = (new Client())->setPhone($input);
|
||||
$this->assertEquals($output, $customer->getPhone());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует установку невалидного телефона покупателя
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setPhone
|
||||
* @covers \AtolOnline\Exceptions\TooLongPhoneException
|
||||
* @throws TooLongPhoneException
|
||||
*/
|
||||
public function testInvalidPhone(): void
|
||||
{
|
||||
$this->expectException(TooLongPhoneException::class);
|
||||
(new Client())->setPhone('99999999999999999999999999999999999999999999999999999999999999999999999999');
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Тестирует установку валидных email-ов покупателя
|
||||
*
|
||||
* @param mixed $email
|
||||
* @dataProvider providerValidEmails
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setEmail
|
||||
* @covers \AtolOnline\Entities\Client::getEmail
|
||||
* @throws TooLongEmailException
|
||||
* @throws InvalidEmailException
|
||||
*/
|
||||
public function testValidEmails(mixed $email): void
|
||||
{
|
||||
$customer = (new Client())->setEmail($email);
|
||||
$this->assertEquals($email, $customer->getEmail());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует установку слишком длинного email покупателя
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setEmail
|
||||
* @covers \AtolOnline\Exceptions\TooLongEmailException
|
||||
* @throws TooLongEmailException
|
||||
* @throws InvalidEmailException
|
||||
*/
|
||||
public function testTooLongEmail(): void
|
||||
{
|
||||
$this->expectException(TooLongEmailException::class);
|
||||
(new Client())->setEmail(Helpers::randomStr(65));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует установку невалидного email покупателя
|
||||
*
|
||||
* @param mixed $email
|
||||
* @dataProvider providerInvalidEmails
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setEmail
|
||||
* @covers \AtolOnline\Exceptions\InvalidEmailException
|
||||
* @throws TooLongEmailException
|
||||
* @throws InvalidEmailException
|
||||
*/
|
||||
public function testInvalidEmail(mixed $email): void
|
||||
{
|
||||
$this->expectException(InvalidEmailException::class);
|
||||
(new Client())->setEmail($email);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Тестирует исключение о корректной длине ИНН
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setInn
|
||||
* @covers \AtolOnline\Entities\Client::getInn
|
||||
* @throws InvalidInnLengthException
|
||||
*/
|
||||
public function testValidInn(): void
|
||||
{
|
||||
$customer = (new Client())->setInn('1234567890');
|
||||
$this->assertEquals('1234567890', $customer->getInn());
|
||||
$customer = $customer->setInn('123456789012');
|
||||
$this->assertEquals('123456789012', $customer->getInn());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о некорректной длине ИНН (10 цифр)
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setInn
|
||||
* @covers \AtolOnline\Exceptions\InvalidInnLengthException
|
||||
* @throws InvalidInnLengthException
|
||||
*/
|
||||
public function testInvalidInn10(): void
|
||||
{
|
||||
$this->expectException(InvalidInnLengthException::class);
|
||||
(new Client())->setInn('12345678901');
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о некорректной длине ИНН (12 цифр)
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Client
|
||||
* @covers \AtolOnline\Entities\Client::setInn
|
||||
* @covers \AtolOnline\Exceptions\InvalidInnLengthException
|
||||
* @throws InvalidInnLengthException
|
||||
*/
|
||||
public function testInvalidInn12(): void
|
||||
{
|
||||
$this->expectException(InvalidInnLengthException::class);
|
||||
(new Client())->setInn('1234567890123');
|
||||
}
|
||||
}
|
||||
134
tests/CompanyTest.php
Normal file
134
tests/CompanyTest.php
Normal file
@@ -0,0 +1,134 @@
|
||||
<?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;
|
||||
|
||||
use AtolOnline\{
|
||||
Constants\SnoTypes,
|
||||
Entities\Company,
|
||||
Exceptions\InvalidEmailException,
|
||||
Exceptions\InvalidInnLengthException,
|
||||
Exceptions\InvalidPaymentAddressException,
|
||||
Exceptions\InvalidSnoException,
|
||||
Exceptions\TooLongEmailException,
|
||||
Exceptions\TooLongPaymentAddressException,
|
||||
Helpers};
|
||||
|
||||
/**
|
||||
* Набор тестов для проверки работы класс продавца
|
||||
*/
|
||||
class CompanyTest extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Тестирует конструктор с сеттерами и приведение к json с геттерами
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Company
|
||||
* @covers \AtolOnline\Entities\Company::jsonSerialize
|
||||
* @covers \AtolOnline\Entities\Company::setEmail
|
||||
* @covers \AtolOnline\Entities\Company::setSno
|
||||
* @covers \AtolOnline\Entities\Company::setInn
|
||||
* @covers \AtolOnline\Entities\Company::setPaymentAddress
|
||||
* @covers \AtolOnline\Entities\Company::getEmail
|
||||
* @covers \AtolOnline\Entities\Company::getSno
|
||||
* @covers \AtolOnline\Entities\Company::getInn
|
||||
* @covers \AtolOnline\Entities\Company::getPaymentAddress
|
||||
*/
|
||||
public function testConstructor()
|
||||
{
|
||||
$this->assertAtolable(new Company(
|
||||
$email = 'company@example.com',
|
||||
$sno = SnoTypes::OSN,
|
||||
$inn = '1234567890',
|
||||
$payment_address = 'https://example.com',
|
||||
), [
|
||||
'email' => $email,
|
||||
'sno' => $sno,
|
||||
'inn' => $inn,
|
||||
'payment_address' => $payment_address,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном email
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Company
|
||||
* @covers \AtolOnline\Entities\Company::setEmail
|
||||
* @covers \AtolOnline\Exceptions\TooLongEmailException
|
||||
*/
|
||||
public function testEmailTooLongException()
|
||||
{
|
||||
$this->expectException(TooLongEmailException::class);
|
||||
new Company(Helpers::randomStr(65), SnoTypes::OSN, '1234567890', 'https://example.com');
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о невалидном email
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Company
|
||||
* @covers \AtolOnline\Entities\Company::setEmail
|
||||
* @covers \AtolOnline\Exceptions\InvalidEmailException
|
||||
*/
|
||||
public function testInvalidEmailException()
|
||||
{
|
||||
$this->expectException(InvalidEmailException::class);
|
||||
new Company('company@examas%^*.com', SnoTypes::OSN, '1234567890', 'https://example.com');
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном платёжном адресе
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Company
|
||||
* @covers \AtolOnline\Entities\Company::setSno
|
||||
* @covers \AtolOnline\Exceptions\InvalidSnoException
|
||||
*/
|
||||
public function testInvalidSnoException()
|
||||
{
|
||||
$this->expectException(InvalidSnoException::class);
|
||||
new Company('company@example.com', 'test', '1234567890', 'https://example.com');
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном платёжном адресе
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Company
|
||||
* @covers \AtolOnline\Entities\Company::setInn
|
||||
* @covers \AtolOnline\Exceptions\InvalidInnLengthException
|
||||
*/
|
||||
public function testInvalidInnLengthException()
|
||||
{
|
||||
$this->expectException(InvalidInnLengthException::class);
|
||||
new Company('company@example.com', SnoTypes::OSN, Helpers::randomStr(13), 'https://example.com');
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном платёжном адресе
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Company
|
||||
* @covers \AtolOnline\Entities\Company::setPaymentAddress
|
||||
* @covers \AtolOnline\Exceptions\TooLongPaymentAddressException
|
||||
*/
|
||||
public function testTooLongPaymentAddressException()
|
||||
{
|
||||
$this->expectException(TooLongPaymentAddressException::class);
|
||||
new Company('company@example.com', SnoTypes::OSN, '1234567890', Helpers::randomStr(257));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о невалидном платёжном адресе
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Company
|
||||
* @covers \AtolOnline\Entities\Company::setPaymentAddress
|
||||
* @covers \AtolOnline\Exceptions\InvalidPaymentAddressException
|
||||
*/
|
||||
public function testInvalidPaymentAddressException()
|
||||
{
|
||||
$this->expectException(InvalidPaymentAddressException::class);
|
||||
new Company('company@example.com', SnoTypes::OSN, '1234567890', '');
|
||||
}
|
||||
}
|
||||
123
tests/HelpersTest.php
Normal file
123
tests/HelpersTest.php
Normal file
@@ -0,0 +1,123 @@
|
||||
<?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;
|
||||
|
||||
use AtolOnline\Helpers;
|
||||
|
||||
/**
|
||||
* Набор тестов для проверки работы функций-хелперов
|
||||
*/
|
||||
class HelpersTest extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Провайдер копеек для перевода в рубли
|
||||
*
|
||||
* @return array<array<int|null, float>>
|
||||
*/
|
||||
public function providerKopeksToRubles(): array
|
||||
{
|
||||
return [
|
||||
[null, 0],
|
||||
[0, 0],
|
||||
[1, 0.01],
|
||||
[12, 0.12],
|
||||
[123, 1.23],
|
||||
[1234, 12.34],
|
||||
[12345, 123.45],
|
||||
[-1, 0.01],
|
||||
[-12, 0.12],
|
||||
[-123, 1.23],
|
||||
[-1234, 12.34],
|
||||
[-12345, 123.45],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Провайдер рублей для перевода в копейки
|
||||
*
|
||||
* @return array<array<float|null, int>>
|
||||
*/
|
||||
public function providerRublesToKopeks(): array
|
||||
{
|
||||
return [
|
||||
[null, 0],
|
||||
[0, 0],
|
||||
[0.01, 1],
|
||||
[0.12, 12],
|
||||
[1.23, 123],
|
||||
[12.34, 1234],
|
||||
[123.45, 12345],
|
||||
[-0.01, 1],
|
||||
[-0.12, 12],
|
||||
[-1.23, 123],
|
||||
[-12.34, 1234],
|
||||
[-123.45, 12345],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Провайдер для тестирования генерации рандомной строки
|
||||
*
|
||||
* @return array<array<int, int>>
|
||||
*/
|
||||
public function providerRandomStr(): array
|
||||
{
|
||||
return [
|
||||
[0, 0],
|
||||
[1, 1],
|
||||
[5, 5],
|
||||
[-1, 1],
|
||||
[-5, 5],
|
||||
];
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Тестирует перевод копеек в рубли
|
||||
*
|
||||
* @dataProvider providerKopeksToRubles
|
||||
* @covers \AtolOnline\Helpers::KopToRub
|
||||
*/
|
||||
public function testKopeksToRubles(?int $kopeks, float $rubles): void
|
||||
{
|
||||
$result = Helpers::KopToRub($kopeks);
|
||||
$this->assertIsFloat($result);
|
||||
$this->assertEquals($result, $rubles);
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует перевод копеек в рубли
|
||||
*
|
||||
* @dataProvider providerRublesToKopeks
|
||||
* @covers \AtolOnline\Helpers::RubToKop
|
||||
*/
|
||||
public function testRublesToKopeks(?float $rubles, int $kopeks): void
|
||||
{
|
||||
$result = Helpers::RubToKop($rubles);
|
||||
$this->assertIsInt($result);
|
||||
$this->assertEquals($result, $kopeks);
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует длину рандомной строки
|
||||
*
|
||||
* @param int $input
|
||||
* @param int $output
|
||||
* @dataProvider providerRandomStr
|
||||
*/
|
||||
public function testRandomString(int $input, int $output): void
|
||||
{
|
||||
$result = Helpers::randomStr($input);
|
||||
$this->assertIsString($result);
|
||||
$this->assertEquals($output, strlen($result));
|
||||
// тестировать на наличие цифр быссмысленно
|
||||
}
|
||||
}
|
||||
@@ -1,34 +1,37 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
/*
|
||||
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
use AtolOnline\{Constants\PaymentMethods,
|
||||
namespace AtolOnline\Tests;
|
||||
|
||||
use AtolOnline\{
|
||||
Constants\PaymentMethods,
|
||||
Constants\PaymentObjects,
|
||||
Constants\VatTypes,
|
||||
Entities\Item,
|
||||
Exceptions\AtolNameTooLongException,
|
||||
Exceptions\AtolPriceTooHighException,
|
||||
Exceptions\AtolTooManyException,
|
||||
Exceptions\AtolUnitTooLongException,
|
||||
Exceptions\AtolUserdataTooLongException};
|
||||
Exceptions\BasicTooManyException,
|
||||
Exceptions\TooHighPriceException,
|
||||
Exceptions\TooLongNameException,
|
||||
Exceptions\TooLongUnitException,
|
||||
Exceptions\TooLongUserdataException,};
|
||||
|
||||
/**
|
||||
* Class ItemTest
|
||||
*/
|
||||
class ItemTest extends BasicTestCase
|
||||
class ItemTestTodo extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Тестирует установку параметров через конструктор
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolTooManyException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws AtolOnline\Exceptions\TooLongNameException
|
||||
* @throws AtolOnline\Exceptions\TooHighPriceException
|
||||
* @throws AtolOnline\Exceptions\BasicTooManyException
|
||||
* @throws AtolOnline\Exceptions\TooLongUnitException
|
||||
*/
|
||||
public function testConstructor()
|
||||
{
|
||||
@@ -41,7 +44,7 @@ class ItemTest extends BasicTestCase
|
||||
PaymentObjects::COMMODITY,
|
||||
PaymentMethods::FULL_PAYMENT
|
||||
);
|
||||
$this->checkAtolEntity($item);
|
||||
$this->assertAtolable($item);
|
||||
$this->assertEquals('Банан', $item->getName());
|
||||
$this->assertEquals(65.99, $item->getPrice());
|
||||
$this->assertEquals(2.74, $item->getQuantity());
|
||||
@@ -50,15 +53,15 @@ class ItemTest extends BasicTestCase
|
||||
$this->assertEquals(PaymentObjects::COMMODITY, $item->getPaymentObject());
|
||||
$this->assertEquals(PaymentMethods::FULL_PAYMENT, $item->getPaymentMethod());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Тестирует установку параметров через сеттеры
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolTooManyException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolUserdataTooLongException
|
||||
* @throws AtolOnline\Exceptions\TooLongNameException
|
||||
* @throws AtolOnline\Exceptions\TooHighPriceException
|
||||
* @throws AtolOnline\Exceptions\BasicTooManyException
|
||||
* @throws AtolOnline\Exceptions\TooLongUnitException
|
||||
* @throws AtolOnline\Exceptions\TooLongUserdataException
|
||||
*/
|
||||
public function testSetters()
|
||||
{
|
||||
@@ -71,7 +74,7 @@ class ItemTest extends BasicTestCase
|
||||
$item->setPaymentObject(PaymentObjects::COMMODITY);
|
||||
$item->setPaymentMethod(PaymentMethods::FULL_PAYMENT);
|
||||
$item->setUserData('Some user data');
|
||||
$this->checkAtolEntity($item);
|
||||
$this->assertAtolable($item);
|
||||
$this->assertEquals('Банан', $item->getName());
|
||||
$this->assertEquals(65.99, $item->getPrice());
|
||||
$this->assertEquals(2.74, $item->getQuantity());
|
||||
@@ -81,11 +84,11 @@ class ItemTest extends BasicTestCase
|
||||
$this->assertEquals(PaymentMethods::FULL_PAYMENT, $item->getPaymentMethod());
|
||||
$this->assertEquals('Some user data', $item->getUserData());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Тестирует установку ставки НДС разными путями
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws TooHighPriceException
|
||||
*/
|
||||
public function testSetVat()
|
||||
{
|
||||
@@ -95,66 +98,66 @@ class ItemTest extends BasicTestCase
|
||||
$item->setVatType(VatTypes::VAT20);
|
||||
$this->assertEquals(VatTypes::VAT20, $item->getVat()->getType());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном наименовании
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws TooLongNameException
|
||||
*/
|
||||
public function testAtolNameTooLongException()
|
||||
{
|
||||
$item = new Item();
|
||||
$this->expectException(AtolNameTooLongException::class);
|
||||
$item->setName(self::randomString(130));
|
||||
$this->expectException(TooLongNameException::class);
|
||||
$item->setName(Helpers::randomStr(130));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком высоком количестве
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyException
|
||||
* @throws \AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws TooHighPriceException
|
||||
* @throws BasicTooManyException
|
||||
* @throws TooLongUnitException
|
||||
*/
|
||||
public function testAtolQuantityTooHighException()
|
||||
{
|
||||
$item = new Item();
|
||||
$this->expectException(AtolTooManyException::class);
|
||||
$this->expectException(BasicTooManyException::class);
|
||||
$item->setQuantity(100000.1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком высокой цене
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws TooHighPriceException
|
||||
*/
|
||||
public function testAtolPriceTooHighException()
|
||||
{
|
||||
$item = new Item();
|
||||
$this->expectException(AtolPriceTooHighException::class);
|
||||
$this->expectException(TooHighPriceException::class);
|
||||
$item->setPrice(42949673.1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинных польз. данных
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolUserdataTooLongException
|
||||
* @throws TooLongUserdataException
|
||||
*/
|
||||
public function testAtolUserdataTooLongException()
|
||||
{
|
||||
$item = new Item();
|
||||
$this->expectException(AtolUserdataTooLongException::class);
|
||||
$this->expectException(TooLongUserdataException::class);
|
||||
$item->setUserData('User data User data User data User data User data User data User data');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинной единице измерения
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws TooLongUnitException
|
||||
*/
|
||||
public function testAtolUnitTooLongException()
|
||||
{
|
||||
$item = new Item();
|
||||
$this->expectException(AtolUnitTooLongException::class);
|
||||
$this->expectException(TooLongUnitException::class);
|
||||
$item->setMeasurementUnit('кг кг кг кг кг кг кг кг кг ');
|
||||
}
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
use AtolOnline\{Entities\Client,
|
||||
Exceptions\AtolEmailTooLongException,
|
||||
Exceptions\AtolEmailValidateException,
|
||||
Exceptions\AtolInnWrongLengthException,
|
||||
Exceptions\AtolNameTooLongException,
|
||||
Exceptions\AtolPhoneTooLongException
|
||||
};
|
||||
|
||||
/**
|
||||
* Class ClientTest
|
||||
*/
|
||||
class ClientTest extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Тестирует установку параметров
|
||||
*/
|
||||
public function testConstructor()
|
||||
{
|
||||
$customer = new Client(
|
||||
'John Doe',
|
||||
'+1/22/99*73s dsdas654 5s6', // +122997365456
|
||||
'john@example.com',
|
||||
'+fasd3\qe3fs_=nac99013928czc' // 3399013928
|
||||
);
|
||||
$this->checkAtolEntity($customer);
|
||||
$this->assertEquals('John Doe', $customer->getName());
|
||||
$this->assertEquals('+122997365456', $customer->getPhone());
|
||||
$this->assertEquals('john@example.com', $customer->getEmail());
|
||||
$this->assertEquals('3399013928', $customer->getInn());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном имени
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
*/
|
||||
public function testAtolNameTooLongException()
|
||||
{
|
||||
$customer = new Client();
|
||||
$this->expectException(AtolNameTooLongException::class);
|
||||
$customer->setName(self::randomString(257));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном телефоне
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException
|
||||
*/
|
||||
public function testAtolPhoneTooLongException()
|
||||
{
|
||||
$customer = new Client();
|
||||
$this->expectException(AtolPhoneTooLongException::class);
|
||||
$customer->setPhone('99999999999999999999999999999999999999999999999999999999999999999999999999');
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинной почте
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
*/
|
||||
public function testAtolEmailTooLongException()
|
||||
{
|
||||
$customer = new Client();
|
||||
$this->expectException(AtolEmailTooLongException::class);
|
||||
$customer->setEmail(self::randomString(65));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о некорректной почте
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
*/
|
||||
public function testAtolEmailValidateException()
|
||||
{
|
||||
$customer = new Client();
|
||||
$this->expectException(AtolEmailValidateException::class);
|
||||
$customer->setEmail(self::randomString(15));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о некорректной длине ИНН
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
*/
|
||||
public function testAtolInnWrongLengthException()
|
||||
{
|
||||
$company = new Client();
|
||||
$this->expectException(AtolInnWrongLengthException::class);
|
||||
$company->setInn('123456789');
|
||||
$company->setInn('1234567890123');
|
||||
}
|
||||
}
|
||||
@@ -1,91 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
use AtolOnline\{Constants\SnoTypes,
|
||||
Entities\Company,
|
||||
Exceptions\AtolEmailTooLongException,
|
||||
Exceptions\AtolEmailValidateException,
|
||||
Exceptions\AtolInnWrongLengthException,
|
||||
Exceptions\AtolPaymentAddressTooLongException
|
||||
};
|
||||
|
||||
/**
|
||||
* Class CompanyTest
|
||||
*/
|
||||
class CompanyTest extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Тестирует установку параметров через конструктор
|
||||
*/
|
||||
public function testConstructor()
|
||||
{
|
||||
$company = new Company(
|
||||
SnoTypes::OSN,
|
||||
'5544332219',
|
||||
'https://v4.online.atol.ru',
|
||||
'company@example.com'
|
||||
);
|
||||
$this->checkAtolEntity($company);
|
||||
$this->assertEquals(SnoTypes::OSN, $company->getSno());
|
||||
$this->assertEquals('5544332219', $company->getInn());
|
||||
$this->assertEquals('https://v4.online.atol.ru', $company->getPaymentAddress());
|
||||
$this->assertEquals('company@example.com', $company->getEmail());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о некорректной длине ИНН
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
*/
|
||||
public function testAtolInnWrongLengthException()
|
||||
{
|
||||
$company = new Company();
|
||||
$this->expectException(AtolInnWrongLengthException::class);
|
||||
$company->setInn('321');
|
||||
$company->setInn('1234567890123');
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном платёжном адресе
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException
|
||||
*/
|
||||
public function testAtolPaymentAddressTooLongException()
|
||||
{
|
||||
$company = new Company();
|
||||
$this->expectException(AtolPaymentAddressTooLongException::class);
|
||||
$company->setPaymentAddress(self::randomString(257));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинной почте
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
*/
|
||||
public function testAtolEmailTooLongException()
|
||||
{
|
||||
$company = new Company();
|
||||
$this->expectException(AtolEmailTooLongException::class);
|
||||
$company->setEmail(self::randomString(65));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о некорректной почте
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
*/
|
||||
public function testAtolEmailValidateException()
|
||||
{
|
||||
$company = new Company();
|
||||
$this->expectException(AtolEmailValidateException::class);
|
||||
$company->setEmail(self::randomString(15));
|
||||
}
|
||||
}
|
||||
@@ -1,39 +1,43 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
/*
|
||||
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
use AtolOnline\{Constants\VatTypes, Entities\Vat};
|
||||
namespace AtolOnline\Tests;
|
||||
|
||||
use AtolOnline\{
|
||||
Constants\VatTypes,
|
||||
Entities\Vat};
|
||||
|
||||
/**
|
||||
* Class VatTest
|
||||
*/
|
||||
class VatTest extends BasicTestCase
|
||||
class VatTestTodo extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Тестирует каждый тип ставки НДС
|
||||
*
|
||||
* @dataProvider vatProvider
|
||||
* @param string $vat_type Тип НДС
|
||||
* @param float $sum Исходная сумма
|
||||
* @param float $expected_set Ожидаемый результат после установки суммы
|
||||
* @param float $expected_add Ожидаемый результат после прибавления 20р
|
||||
* @param string $vat_type Тип НДС
|
||||
* @param float $sum Исходная сумма
|
||||
* @param float $expected_set Ожидаемый результат после установки суммы
|
||||
* @param float $expected_add Ожидаемый результат после прибавления 20р
|
||||
*/
|
||||
public function testVat(string $vat_type, float $sum, float $expected_set, float $expected_add)
|
||||
{
|
||||
$vat = new Vat($vat_type);
|
||||
$this->assertEquals(0, $vat->getFinalSum(), 'Test '.$vat_type.' | 1 step');
|
||||
$this->assertEquals(0, $vat->getFinalSum(), 'Test ' . $vat_type . ' | 1 step');
|
||||
$vat->setSum($sum);
|
||||
$this->assertEquals($expected_set, $vat->getFinalSum(), 'Test '.$vat_type.' | 2 step');
|
||||
$this->assertEquals($expected_set, $vat->getFinalSum(), 'Test ' . $vat_type . ' | 2 step');
|
||||
$vat->addSum(20);
|
||||
$this->assertEquals($expected_add, $vat->getFinalSum(), 'Test '.$vat_type.' | 3 step');
|
||||
$this->assertEquals($expected_add, $vat->getFinalSum(), 'Test ' . $vat_type . ' | 3 step');
|
||||
$vat->addSum(-20);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Провайдер данных для тестирования разных типов ставок НДС
|
||||
*
|
||||
Reference in New Issue
Block a user