Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions src/Api/Collect/CollectApi.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Tpay\OpenApi\Api\Collect;

use Tpay\OpenApi\Api\ApiAction;
use Tpay\OpenApi\Model\Objects\RequestBody\CollectBankAccount;

class CollectApi extends ApiAction
{
public function getBankAccounts($page = 1, $limit = 35)
{
$requestUrl = $this->addQueryFields('/collect/bank-accounts', ['page' => $page, 'limit' => $limit]);

return $this->run(static::GET, $requestUrl);
}

public function addBankAccount($accountNumber, $ownerName, $additionalInformation)
{
$fields = [
'accountNumber' => $accountNumber,
'ownerName' => $ownerName,
'additionalInformation' => $additionalInformation,
];

return $this->run(static::POST, '/collect/bank-accounts', $fields, new CollectBankAccount());
}
}
20 changes: 20 additions & 0 deletions src/Api/TpayApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use RuntimeException;
use Tpay\OpenApi\Api\Accounts\AccountsApi;
use Tpay\OpenApi\Api\Authorization\AuthorizationApi;
use Tpay\OpenApi\Api\Collect\CollectApi;
use Tpay\OpenApi\Api\Refunds\RefundsApi;
use Tpay\OpenApi\Api\Reports\ReportsApi;
use Tpay\OpenApi\Api\Transactions\TransactionsApi;
Expand All @@ -20,6 +21,9 @@ class TpayApi
/** @var null|AuthorizationApi */
private $authorization;

/** @var null|CollectApi */
private $collect;

/** @var null|RefundsApi */
private $refunds;

Expand Down Expand Up @@ -169,6 +173,22 @@ public function transactions()
return $this->transactions;
}

/** @return CollectApi */
public function collect()
{
$this->authorize();
if (null === $this->collect) {
$this->collect = (new CollectApi($this->token, $this->productionMode))
->overrideApiUrl($this->apiUrl);

if ($this->clientName) {
$this->collect->setClientName($this->clientName);
}
}

return $this->collect;
}

private function authorize()
{
$fields = [
Expand Down
14 changes: 14 additions & 0 deletions src/Model/Fields/Collect/AccountNumber.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Tpay\OpenApi\Model\Fields\Collect;

use Tpay\OpenApi\Model\Fields\Field;

class AccountNumber extends Field
{
protected $name = __CLASS__;
protected $type = self::STRING;
protected $minLength = 28;
protected $maxLength = 28;
protected $pattern = '^PL\d{26}$';
}
12 changes: 12 additions & 0 deletions src/Model/Fields/Collect/AdditionalInformation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Tpay\OpenApi\Model\Fields\Collect;

use Tpay\OpenApi\Model\Fields\Field;

class AdditionalInformation extends Field
{
protected $name = __CLASS__;
protected $type = self::STRING;
protected $maxLength = 1000;
}
12 changes: 12 additions & 0 deletions src/Model/Fields/Collect/OwnerName.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Tpay\OpenApi\Model\Fields\Collect;

use Tpay\OpenApi\Model\Fields\Field;

class OwnerName extends Field
{
protected $name = __CLASS__;
protected $type = self::STRING;
protected $maxLength = 1000;
}
32 changes: 32 additions & 0 deletions src/Model/Objects/RequestBody/CollectBankAccount.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Tpay\OpenApi\Model\Objects\RequestBody;

use Tpay\OpenApi\Model\Fields\Collect\AccountNumber;
use Tpay\OpenApi\Model\Fields\Collect\AdditionalInformation;
use Tpay\OpenApi\Model\Fields\Collect\OwnerName;
use Tpay\OpenApi\Model\Objects\Objects;

class CollectBankAccount extends Objects
{
const OBJECT_FIELDS = [
'accountNumber' => AccountNumber::class,
'ownerName' => OwnerName::class,
'additionalInformation' => AdditionalInformation::class,
];

public $accountNumber;

public $ownerName;

public $additionalInformation;

public function getRequiredFields()
{
return [
$this->accountNumber,
$this->ownerName,
$this->additionalInformation,
];
}
}
125 changes: 125 additions & 0 deletions tests/Api/Collect/CollectApiTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
<?php

namespace Tpay\Tests\OpenApi\Api\Collect;

use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
use Tpay\OpenApi\Api\Collect\CollectApi;
use Tpay\OpenApi\Model\Fields\Token\AccessToken;
use Tpay\OpenApi\Model\Objects\Authorization\Token;
use Tpay\Tests\OpenApi\Mock\CurlMock;
use UnexpectedValueException;

/**
* @covers \Tpay\OpenApi\Api\Collect\CollectApi
*/
class CollectApiTest extends TestCase
{
/** @dataProvider validBankAccountData */
public function testAddingValidBankAccount($accountNumber, $ownerName, $additionalInformation)
{
$collectApi = $this->createCollectApiWithCurlMock('ok');

$result = $collectApi->addBankAccount($accountNumber, $ownerName, $additionalInformation);

self::assertSame('ok', $result);
}

/** @dataProvider invalidBankAccountData */
public function testAddingInvalidBankAccount($accountNumber, $ownerName, $additionalInformation, $exception, $exceptionMessage)
{
$collectApi = $this->createCollectApiWithCurlMock('error');

$this->expectException($exception);
$this->expectExceptionMessage($exceptionMessage);

$collectApi->addBankAccount($accountNumber, $ownerName, $additionalInformation);
}

public function validBankAccountData()
{
yield 'Valid bank account' => [
'accountNumber' => 'PL12345678901234567890123456',
'ownerName' => 'Jan Kowalski',
'additionalInformation' => 'Konto firmowe',
];

yield 'Min length owner name' => [
'accountNumber' => 'PL00000000000000000000000000',
'ownerName' => '',
'additionalInformation' => '',
];

yield 'Max length owner name' => [
'accountNumber' => 'PL99999999999999999999999999',
'ownerName' => str_repeat('A', 1000),
'additionalInformation' => str_repeat('B', 1000),
];
}

public function invalidBankAccountData()
{
yield 'Empty account number' => [
'accountNumber' => '',
'ownerName' => 'Jan Kowalski',
'additionalInformation' => 'Konto firmowe',
'exception' => InvalidArgumentException::class,
'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AccountNumber is too short. Min required 28',
];

yield 'Invalid account number format - missing PL prefix' => [
'accountNumber' => '1234567890123456789012345678',
'ownerName' => 'Jan Kowalski',
'additionalInformation' => 'Konto firmowe',
'exception' => InvalidArgumentException::class,
'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AccountNumber is invalid. Should match ^PL\d{26}$ pattern',
];

yield 'Account number too short' => [
'accountNumber' => 'PL1234567890123456789012345',
'ownerName' => 'Jan Kowalski',
'additionalInformation' => 'Konto firmowe',
'exception' => InvalidArgumentException::class,
'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AccountNumber is too short. Min required 28',
];

yield 'Account number too long' => [
'accountNumber' => 'PL123456789012345678901234567',
'ownerName' => 'Jan Kowalski',
'additionalInformation' => 'Konto firmowe',
'exception' => InvalidArgumentException::class,
'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AccountNumber is too long. Max allowed 28',
];

yield 'Owner name too long' => [
'accountNumber' => 'PL12345678901234567890123456',
'ownerName' => str_repeat('A', 1001),
'additionalInformation' => 'Konto firmowe',
'exception' => InvalidArgumentException::class,
'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\OwnerName is too long. Max allowed 1000',
];

yield 'Additional information too long' => [
'accountNumber' => 'PL12345678901234567890123456',
'ownerName' => 'Jan Kowalski',
'additionalInformation' => str_repeat('X', 1001),
'exception' => InvalidArgumentException::class,
'exceptionMessage' => 'Value of field Tpay\OpenApi\Model\Fields\Collect\AdditionalInformation is too long. Max allowed 1000',
];
}

private function createCollectApiWithCurlMock($response)
{
$accessToken = $this->createMock(AccessToken::class);

$token = $this->createMock(Token::class);

$token->access_token = $accessToken;

$collectApi = new CollectApi($token, false);

CurlMock::setConsecutiveReturnedTransfers(json_encode($response));

return $collectApi;
}
}
Loading