mirror of
https://github.com/anthonyaxenov/atol-online.git
synced 2024-11-22 15:04:33 +00:00
[WIP] Начало работы над тестом KktMonitorTest
This commit is contained in:
parent
03591600dd
commit
949b31a85a
@ -58,7 +58,7 @@
|
|||||||
},
|
},
|
||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"AtolOnline\\Tests\\": "tests/"
|
"AtolOnlineTests\\": "tests/"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -29,7 +29,7 @@ abstract class AtolClient
|
|||||||
/**
|
/**
|
||||||
* @var bool Флаг тестового режима
|
* @var bool Флаг тестового режима
|
||||||
*/
|
*/
|
||||||
protected bool $test_mode = true;
|
protected bool $test_mode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Client HTTP-клиент для работы с API
|
* @var Client HTTP-клиент для работы с API
|
||||||
@ -59,6 +59,7 @@ abstract class AtolClient
|
|||||||
/**
|
/**
|
||||||
* Конструктор
|
* Конструктор
|
||||||
*
|
*
|
||||||
|
* @param bool $test_mode
|
||||||
* @param string|null $login
|
* @param string|null $login
|
||||||
* @param string|null $password
|
* @param string|null $password
|
||||||
* @param array $config
|
* @param array $config
|
||||||
@ -69,6 +70,7 @@ abstract class AtolClient
|
|||||||
* @see https://guzzle.readthedocs.io/en/latest/request-options.html Допустимые параметры для $config
|
* @see https://guzzle.readthedocs.io/en/latest/request-options.html Допустимые параметры для $config
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
|
bool $test_mode = true,
|
||||||
?string $login = null,
|
?string $login = null,
|
||||||
?string $password = null,
|
?string $password = null,
|
||||||
array $config = []
|
array $config = []
|
||||||
@ -76,8 +78,9 @@ abstract class AtolClient
|
|||||||
$this->http = new Client(array_merge($config, [
|
$this->http = new Client(array_merge($config, [
|
||||||
'http_errors' => $config['http_errors'] ?? false,
|
'http_errors' => $config['http_errors'] ?? false,
|
||||||
]));
|
]));
|
||||||
$login && $this->setLogin($login);
|
$this->setTestMode($test_mode);
|
||||||
$password && $this->setPassword($password);
|
!is_null($login) && $this->setLogin($login);
|
||||||
|
!is_null($password) && $this->setPassword($password);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -96,7 +99,7 @@ abstract class AtolClient
|
|||||||
* @param bool $test_mode
|
* @param bool $test_mode
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function setTestMode(bool $test_mode): self
|
public function setTestMode(bool $test_mode = true): self
|
||||||
{
|
{
|
||||||
$this->test_mode = $test_mode;
|
$this->test_mode = $test_mode;
|
||||||
return $this;
|
return $this;
|
||||||
@ -139,7 +142,7 @@ abstract class AtolClient
|
|||||||
*
|
*
|
||||||
* @return string|null
|
* @return string|null
|
||||||
*/
|
*/
|
||||||
protected function getLogin(): ?string
|
public function getLogin(): ?string
|
||||||
{
|
{
|
||||||
return $this->login;
|
return $this->login;
|
||||||
}
|
}
|
||||||
@ -169,7 +172,7 @@ abstract class AtolClient
|
|||||||
*
|
*
|
||||||
* @return string|null
|
* @return string|null
|
||||||
*/
|
*/
|
||||||
protected function getPassword(): ?string
|
public function getPassword(): ?string
|
||||||
{
|
{
|
||||||
return $this->password;
|
return $this->password;
|
||||||
}
|
}
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
<?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 PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
class AtolClientTest extends TestCase
|
|
||||||
{
|
|
||||||
|
|
||||||
public function testAuth()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSetPassword()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSetTestMode()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetToken()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSetLogin()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSetToken()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetResponse()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testIsTestMode()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
@ -9,9 +9,12 @@
|
|||||||
|
|
||||||
declare(strict_types = 1);
|
declare(strict_types = 1);
|
||||||
|
|
||||||
namespace AtolOnline\Tests;
|
namespace AtolOnlineTests;
|
||||||
|
|
||||||
use AtolOnline\Entities\Entity;
|
use AtolOnline\Entities\Entity;
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
use GuzzleHttp\Exception\GuzzleException;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -20,15 +23,41 @@ use PHPUnit\Framework\TestCase;
|
|||||||
class BasicTestCase extends TestCase
|
class BasicTestCase extends TestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @todo требуется рефакторинг
|
* Проверяет наличие подключения к ресурсу по URL
|
||||||
|
*
|
||||||
|
* @param string $url
|
||||||
|
* @param int $code
|
||||||
|
* @return bool
|
||||||
|
* @throws GuzzleException
|
||||||
*/
|
*/
|
||||||
public function setUp(): void
|
protected function ping(string $url, int $code): bool
|
||||||
{
|
{
|
||||||
//parent::setUp();
|
$result = (new Client(['http_errors' => false]))->request('GET', $url);
|
||||||
defined('ATOL_KKT_GROUP') ?: define('ATOL_KKT_GROUP', 'v4-online-atol-ru_4179');
|
//$this->assertEquals(200, $result->getStatusCode());
|
||||||
defined('ATOL_KKT_LOGIN') ?: define('ATOL_KKT_LOGIN', 'v4-online-atol-ru');
|
return $result->getStatusCode() === $code;
|
||||||
defined('ATOL_KKT_PASS') ?: define('ATOL_KKT_PASS', 'iGFFuihss');
|
}
|
||||||
defined('ATOL_CALLBACK_URL') ?: define('ATOL_CALLBACK_URL', 'http://example.com/callback');
|
|
||||||
|
/**
|
||||||
|
* Проверяет доступность API мониторинга
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* @throws GuzzleException
|
||||||
|
*/
|
||||||
|
protected function isMonitoringOnline(): bool
|
||||||
|
{
|
||||||
|
return $this->ping('https://testonline.atol.ru/api/auth/v1/gettoken', 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Пропускает текущий тест если API мониторинга недоступно
|
||||||
|
*
|
||||||
|
* @throws GuzzleException
|
||||||
|
*/
|
||||||
|
protected function skipIfMonitoringIsOffline(): void
|
||||||
|
{
|
||||||
|
if (!$this->isMonitoringOnline()) {
|
||||||
|
$this->markTestSkipped($this->getName() . ': Monitoring API is inaccessible. Skipping test.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -50,6 +79,79 @@ class BasicTestCase extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует идентичность двух классов
|
||||||
|
*
|
||||||
|
* @param object|string $expected
|
||||||
|
* @param object|string $actual
|
||||||
|
*/
|
||||||
|
public function assertIsSameClass(object|string $expected, object|string $actual)
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
is_object($expected) ? $expected::class : $expected,
|
||||||
|
is_object($actual) ? $actual::class : $actual
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует наследование класса (объекта) от указанных классов
|
||||||
|
*
|
||||||
|
* @param string[] $parents
|
||||||
|
* @param object|string $actual
|
||||||
|
*/
|
||||||
|
public function assertExtendsClasses(array $parents, object|string $actual)
|
||||||
|
{
|
||||||
|
$this->checkClassesIntersection($parents, $actual, 'class_parents');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует имплементацию классом (объектом) указанных интерфейсов
|
||||||
|
*
|
||||||
|
* @param string[] $parents
|
||||||
|
* @param object|string $actual
|
||||||
|
*/
|
||||||
|
public function assertImplementsInterfaces(array $parents, object|string $actual)
|
||||||
|
{
|
||||||
|
$this->checkClassesIntersection($parents, $actual, 'class_implements');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует использование классом (объектом) указанных трейтов
|
||||||
|
*
|
||||||
|
* @param string[] $parents
|
||||||
|
* @param object|string $actual
|
||||||
|
*/
|
||||||
|
public function assertUsesTraits(array $parents, object|string $actual)
|
||||||
|
{
|
||||||
|
$this->checkClassesIntersection($parents, $actual, 'class_uses');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверяет пересечение классов указанной функцией SPL
|
||||||
|
*
|
||||||
|
* @param object|string $class Класс для проверки на вхождение, или объект, класс коего нужно проверить
|
||||||
|
* @param array $classes Массив классов, вхождение в который нужно проверить
|
||||||
|
* @param string $function class_parents|class_implements|class_uses
|
||||||
|
*/
|
||||||
|
protected function checkClassesIntersection(array $classes, object|string $class, string $function): void
|
||||||
|
{
|
||||||
|
$actual_classes = is_object($class) ? $function($class) : [$class::class];
|
||||||
|
$this->assertIsArray($actual_classes);
|
||||||
|
$this->assertNotEmpty(array_intersect($classes, $actual_classes));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует, является ли объект коллекцией
|
||||||
|
*
|
||||||
|
* @param mixed $expected
|
||||||
|
*/
|
||||||
|
public function assertIsCollection(mixed $expected): void
|
||||||
|
{
|
||||||
|
$this->assertIsObject($expected);
|
||||||
|
$this->assertIsIterable($expected);
|
||||||
|
$this->assertIsSameClass($expected, Collection::class);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Провайдер валидных телефонов
|
* Провайдер валидных телефонов
|
||||||
*
|
*
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace AtolOnline\Tests;
|
namespace AtolOnlineTests;
|
||||||
|
|
||||||
use AtolOnline\{
|
use AtolOnline\{
|
||||||
Entities\Client,
|
Entities\Client,
|
||||||
@ -16,7 +16,8 @@ use AtolOnline\{
|
|||||||
Exceptions\TooLongEmailException,
|
Exceptions\TooLongEmailException,
|
||||||
Exceptions\TooLongNameException,
|
Exceptions\TooLongNameException,
|
||||||
Exceptions\TooLongPhoneException,
|
Exceptions\TooLongPhoneException,
|
||||||
Helpers};
|
Helpers
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Набор тестов для проверки работы класс покупателя
|
* Набор тестов для проверки работы класс покупателя
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace AtolOnline\Tests;
|
namespace AtolOnlineTests;
|
||||||
|
|
||||||
use AtolOnline\{
|
use AtolOnline\{
|
||||||
Constants\SnoTypes,
|
Constants\SnoTypes,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace AtolOnline\Tests;
|
namespace AtolOnlineTests;
|
||||||
|
|
||||||
use AtolOnline\Helpers;
|
use AtolOnline\Helpers;
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace AtolOnline\Tests;
|
namespace AtolOnlineTests;
|
||||||
|
|
||||||
use AtolOnline\{
|
use AtolOnline\{
|
||||||
Constants\PaymentMethods,
|
Constants\PaymentMethods,
|
||||||
|
@ -1,40 +1,163 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
|
||||||
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
namespace AtolOnlineTests;
|
||||||
*
|
|
||||||
* This code is licensed under MIT.
|
use AtolOnline\Api\AtolClient;
|
||||||
* Этот код распространяется по лицензии MIT.
|
use AtolOnline\Api\KktMonitor;
|
||||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
use AtolOnline\Exceptions\EmptyLoginException;
|
||||||
|
use AtolOnline\Exceptions\EmptyPasswordException;
|
||||||
|
use AtolOnline\Exceptions\TooLongLoginException;
|
||||||
|
use AtolOnline\Exceptions\TooLongPasswordException;
|
||||||
|
use AtolOnline\Helpers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Набор тестов для проверки работы API-клиента на примере монитора ККТ
|
||||||
*/
|
*/
|
||||||
|
class KktMonitorTest extends BasicTestCase
|
||||||
namespace AtolOnline\Tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
class KktMonitorTest extends TestCase
|
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Тестирует успешное создание объекта монитора без аргументов конструктора
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::__construct
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::getLogin
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::getPassword
|
||||||
|
*/
|
||||||
|
public function testConstructorWithoutArgs()
|
||||||
|
{
|
||||||
|
$client = new KktMonitor();
|
||||||
|
$this->assertIsObject($client);
|
||||||
|
$this->assertIsSameClass(KktMonitor::class, $client);
|
||||||
|
$this->assertExtendsClasses([AtolClient::class], $client);
|
||||||
|
$this->assertNull($client->getLogin());
|
||||||
|
$this->assertNull($client->getPassword());
|
||||||
|
}
|
||||||
|
|
||||||
public function testSetToken()
|
/**
|
||||||
|
* Тестирует успешное создание объекта монитора с аргументами конструктора
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::__construct
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::setLogin
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::setPassword
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::getLogin
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::getPassword
|
||||||
|
*/
|
||||||
|
public function testConstructorWithArgs()
|
||||||
|
{
|
||||||
|
$client = new KktMonitor(false, 'login', 'password', []);
|
||||||
|
$this->assertIsObject($client);
|
||||||
|
$this->assertIsSameClass(KktMonitor::class, $client);
|
||||||
|
$this->assertExtendsClasses([AtolClient::class], $client);
|
||||||
|
//$this->assertFalse($client->isTestMode());
|
||||||
|
//$this->assertEquals('login', $client->getLogin());
|
||||||
|
//$this->assertEquals('password', $client->getPassword());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует исключение при попытке передать пустой логин в конструктор
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::__construct
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::setLogin
|
||||||
|
*/
|
||||||
|
public function testConstructorWithShortLogin()
|
||||||
|
{
|
||||||
|
$this->expectException(EmptyLoginException::class);
|
||||||
|
new KktMonitor(login: '');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует исключение при попытке передать слишком длинный логин в конструктор
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::__construct
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::setLogin
|
||||||
|
*/
|
||||||
|
public function testConstructorWithLongLogin()
|
||||||
|
{
|
||||||
|
$this->expectException(TooLongLoginException::class);
|
||||||
|
new KktMonitor(login: Helpers::randomStr(101));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует исключение при попытке передать пустой пароль в конструктор
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::__construct
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::setPassword
|
||||||
|
*/
|
||||||
|
public function testConstructorWithShortPassword()
|
||||||
|
{
|
||||||
|
$this->expectException(EmptyPasswordException::class);
|
||||||
|
new KktMonitor(password: '');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует исключение при попытке передать слишком длинный пароль в конструктор
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::__construct
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::setPassword
|
||||||
|
*/
|
||||||
|
public function testConstructorWithLongPassword()
|
||||||
|
{
|
||||||
|
$this->expectException(TooLongPasswordException::class);
|
||||||
|
new KktMonitor(password: Helpers::randomStr(101));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует установку тестового режима
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::__construct
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::isTestMode
|
||||||
|
* @covers \AtolOnline\Api\KktMonitor::setTestMode
|
||||||
|
*/
|
||||||
|
public function testTestMode()
|
||||||
|
{
|
||||||
|
$client = new KktMonitor();
|
||||||
|
$this->assertTrue($client->isTestMode());
|
||||||
|
|
||||||
|
$client = new KktMonitor(true);
|
||||||
|
$this->assertTrue($client->isTestMode());
|
||||||
|
|
||||||
|
$client = new KktMonitor(false);
|
||||||
|
$this->assertFalse($client->isTestMode());
|
||||||
|
|
||||||
|
$client = (new KktMonitor())->setTestMode();
|
||||||
|
$this->assertTrue($client->isTestMode());
|
||||||
|
|
||||||
|
$client = (new KktMonitor())->setTestMode(true);
|
||||||
|
$this->assertTrue($client->isTestMode());
|
||||||
|
|
||||||
|
$client = (new KktMonitor())->setTestMode(false);
|
||||||
|
$this->assertFalse($client->isTestMode());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function todo_testGetToken()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetResponse()
|
public function todo_testGetResponse()
|
||||||
|
{
|
||||||
|
//$this->skipIfMonitoringIsOffline();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function todo_testSetPassword()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetLogin()
|
public function todo_testAuth()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAuth()
|
public function todo_testGetAll()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetToken()
|
public function todo_testSetToken()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetPassword()
|
public function todo_testGetOne()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function todo_testSetLogin()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,11 +7,12 @@
|
|||||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace AtolOnline\Tests;
|
namespace AtolOnlineTests;
|
||||||
|
|
||||||
use AtolOnline\{
|
use AtolOnline\{
|
||||||
Constants\VatTypes,
|
Constants\VatTypes,
|
||||||
Entities\Vat};
|
Entities\Vat
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class VatTest
|
* Class VatTest
|
||||||
|
Loading…
Reference in New Issue
Block a user