Files
yookassa-sdk-php/tests/Request/Payments/PaymentsRequestTest.php
T
Антон Н. Николаев cbcdbc8ae1 Обновленная версия SDK. Поддержка PHP 8+
Отказ от поддержки PHP < 8
Изменена структура файлов
Переработана логика работы с моделями
Добавлено использование валидатора данных в моделях
Массивы объектов заменены на объекты-коллекции
2023-06-07 17:23:48 +03:00

423 lines
11 KiB
PHP

<?php
namespace Tests\YooKassa\Request\Payments;
use DateTime;
use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
use stdClass;
use YooKassa\Helpers\Random;
use YooKassa\Helpers\StringObject;
use YooKassa\Model\Payment\PaymentMethodType;
use YooKassa\Model\Payment\PaymentStatus;
use YooKassa\Request\Payments\PaymentsRequest;
use YooKassa\Request\Payments\PaymentsRequestBuilder;
use YooKassa\Validator\Exceptions\InvalidPropertyValueException;
use YooKassa\Validator\Exceptions\InvalidPropertyValueTypeException;
/**
* @internal
*/
class PaymentsRequestTest extends TestCase
{
/**
* @dataProvider validNetPageDataProvider
*
* @param mixed $value
*/
public function testCursor($value): void
{
$this->getterAndSetterTest($value, 'cursor', null === $value ? '' : (string) $value);
}
/**
* @dataProvider validPaymentMethodDataProvider
*
* @param mixed $value
*/
public function testPaymentMethod($value): void
{
$this->getterAndSetterTest($value, 'paymentMethod', $value);
}
/**
* @dataProvider invalidPaymentMethodDataProvider
*
* @param mixed $value
*/
public function testSetInvalidPaymentMethod($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setPaymentMethod($value);
}
/**
* @dataProvider validDateDataProvider
*
* @param mixed $value
*/
public function testDateMethods($value): void
{
$properties = [
'createdAtGte',
'createdAtGt',
'createdAtLte',
'createdAtLt',
'capturedAtGte',
'capturedAtGt',
'capturedAtLte',
'capturedAtLt',
];
$expected = null;
if ($value instanceof DateTime) {
$expected = $value->format(YOOKASSA_DATE);
} elseif (is_numeric($value)) {
$expected = date(YOOKASSA_DATE, $value);
} else {
$expected = $value;
}
foreach ($properties as $property) {
$this->getterAndSetterTest($value, $property, empty($expected) ? null : new DateTime($expected));
}
}
/**
* @dataProvider invalidDateDataProvider
*
* @param mixed $value
*/
public function testSetInvalidCreatedAtGte($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setCreatedAtGte($value);
}
/**
* @dataProvider invalidDateDataProvider
*
* @param mixed $value
*/
public function testSetInvalidCreatedAtGt($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setCreatedAtGt($value);
}
/**
* @dataProvider invalidDateDataProvider
*
* @param mixed $value
*/
public function testSetInvalidCreatedAtLte($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setCreatedAtLte($value);
}
/**
* @dataProvider invalidDateDataProvider
*
* @param mixed $value
*/
public function testSetInvalidCreatedAtLt($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setCreatedAtLt($value);
}
/**
* @dataProvider invalidDateDataProvider
*
* @param mixed $value
*/
public function testSetInvalidCapturedAtGte($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setCapturedAtGte($value);
}
/**
* @dataProvider invalidDateDataProvider
*
* @param mixed $value
*/
public function testSetInvalidCapturedAtGt($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setCapturedAtGt($value);
}
/**
* @dataProvider invalidDateDataProvider
*
* @param mixed $value
*/
public function testSetInvalidCapturedAtLte($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setCapturedAtLte($value);
}
/**
* @dataProvider invalidDateDataProvider
*
* @param mixed $value
*/
public function testSetInvalidCapturedAtLt($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setCapturedAtLt($value);
}
/**
* @dataProvider validLimitDataProvider
*
* @param mixed $value
*/
public function testLimit($value): void
{
$this->getterAndSetterTest($value, 'limit', $value);
}
/**
* @dataProvider invalidLimitDataProvider
*
* @param mixed $value
*/
public function testSetInvalidLimit($value, $exception): void
{
$this->expectException($exception);
$this->getTestInstance()->setLimit($value);
}
/**
* @dataProvider validStatusDataProvider
*
* @param mixed $value
*/
public function testStatus($value): void
{
$this->getterAndSetterTest($value, 'status', null === $value ? '' : (string) $value);
}
/**
* @dataProvider invalidStatusDataProvider
*
* @param mixed $value
*/
public function testSetInvalidStatus($value): void
{
$this->expectException(InvalidArgumentException::class);
$this->getTestInstance()->setStatus($value);
}
public function testValidate(): void
{
$instance = new PaymentsRequest();
self::assertTrue($instance->validate());
}
public function testBuilder(): void
{
$builder = PaymentsRequest::builder();
self::assertInstanceOf(PaymentsRequestBuilder::class, $builder);
}
public static function validNetPageDataProvider()
{
return [
[''],
[null],
[Random::str(1)],
[Random::str(2, 64)],
[new StringObject(Random::str(1))],
[new StringObject(Random::str(2, 64))],
];
}
public static function validPaymentMethodDataProvider()
{
$result = [
[null],
[''],
];
foreach (PaymentMethodType::getValidValues() as $value) {
$result[] = [$value];
$result[] = [new StringObject($value)];
}
return $result;
}
public function validIdDataProvider()
{
return [
[null],
[''],
['123'],
[Random::str(1, 64)],
[new StringObject(Random::str(1, 64))],
];
}
public static function validDateDataProvider()
{
return [
[null],
[''],
[date(YOOKASSA_DATE, Random::int(0, time()))],
[new DateTime()],
];
}
public static function validStatusDataProvider()
{
$result = [
[null],
[''],
];
foreach (PaymentStatus::getValidValues() as $value) {
$result[] = [$value];
$result[] = [new StringObject($value)];
}
return $result;
}
public static function validLimitDataProvider()
{
return [
[null],
[Random::int(1, PaymentsRequest::MAX_LIMIT_VALUE)],
];
}
public function invalidIdDataProvider()
{
return [
[[]],
[new stdClass()],
[true],
[false],
];
}
public static function invalidLimitDataProvider()
{
return [
[new stdClass(), InvalidPropertyValueTypeException::class],
[Random::str(10), InvalidPropertyValueTypeException::class],
[Random::bytes(10), InvalidPropertyValueTypeException::class],
[-1, InvalidPropertyValueException::class],
[PaymentsRequest::MAX_LIMIT_VALUE + 1, InvalidPropertyValueException::class],
];
}
public static function invalidStatusDataProvider()
{
return [
[Random::str(10)],
];
}
public static function invalidPaymentMethodDataProvider()
{
return [
[true],
[Random::str(35)],
[Random::str(37)],
[new StringObject(Random::str(10))],
];
}
public static function invalidDateDataProvider()
{
return [
[true],
[false],
[new stdClass()],
[Random::str(35)],
[Random::str(37)],
[new StringObject(Random::str(10))],
[-123],
];
}
public static function invalidPageDataProvider()
{
return [
[[]],
[new stdClass()],
[true],
[false],
];
}
protected function getTestInstance(): PaymentsRequest
{
return new PaymentsRequest();
}
private function getterAndSetterTest($value, $property, $expected, $testHas = true): void
{
$getter = 'get' . ucfirst($property);
$setter = 'set' . ucfirst($property);
$has = 'has' . ucfirst($property);
$instance = $this->getTestInstance();
if ($testHas) {
self::assertFalse($instance->{$has}());
}
self::assertNull($instance->{$getter}());
self::assertNull($instance->{$property});
$instance->{$setter}($value);
if (null === $value || '' === $value) {
if ($testHas) {
self::assertFalse($instance->{$has}());
}
self::assertNull($instance->{$getter}());
self::assertNull($instance->{$property});
} else {
if ($testHas) {
self::assertTrue($instance->{$has}());
}
if ($expected instanceof DateTime) {
self::assertEquals($expected->getTimestamp(), $instance->{$getter}()->getTimestamp());
self::assertEquals($expected->getTimestamp(), $instance->{$property}->getTimestamp());
} else {
self::assertEquals($expected, $instance->{$getter}());
self::assertEquals($expected, $instance->{$property});
}
}
$instance->{$setter}(null);
if ($testHas) {
self::assertFalse($instance->{$has}());
}
self::assertNull($instance->{$getter}());
self::assertNull($instance->{$property});
$instance->{$property} = $value;
if (null === $value || '' === $value) {
if ($testHas) {
self::assertFalse($instance->{$has}());
}
self::assertNull($instance->{$getter}());
self::assertNull($instance->{$property});
} else {
if ($testHas) {
self::assertTrue($instance->{$has}());
}
if ($expected instanceof DateTime) {
self::assertEquals($expected->getTimestamp(), $instance->{$getter}()->getTimestamp());
self::assertEquals($expected->getTimestamp(), $instance->{$property}->getTimestamp());
} else {
self::assertEquals($expected, $instance->{$getter}());
self::assertEquals($expected, $instance->{$property});
}
}
}
}