<?php
namespace Coinbase\Wallet\Tests;
use Coinbase\Wallet\Client;
use Coinbase\Wallet\HttpClient;
use Coinbase\Wallet\Mapper;
use Coinbase\Wallet\Resource\Account;
use Coinbase\Wallet\Resource\Address;
use Coinbase\Wallet\Resource\Buy;
use Coinbase\Wallet\Resource\CurrentUser;
use Coinbase\Wallet\Resource\Deposit;
use Coinbase\Wallet\Resource\PaymentMethod;
use Coinbase\Wallet\Resource\ResourceCollection;
use Coinbase\Wallet\Resource\Sell;
use Coinbase\Wallet\Resource\Transaction;
use Coinbase\Wallet\Resource\User;
use Coinbase\Wallet\Resource\Withdrawal;
use Psr\Http\Message\ResponseInterface;
class ClientTest extends \PHPUnit_Framework_TestCase
{
/** @var \PHPUnit_Framework_MockObject_MockObject|HttpClient */
private $http;
/** @var \PHPUnit_Framework_MockObject_MockObject|Mapper */
private $mapper;
/** @var Client */
private $client;
public static function setUpBeforeClass() {
date_default_timezone_set('America/New_York');
}
protected function setUp()
{
$this->http = $this->getMockBuilder(HttpClient::class)
->disableOriginalConstructor()
->getMock();
$this->mapper = $this->getMock(Mapper::class);
$this->client = new Client($this->http, $this->mapper);
}
protected function tearDown()
{
$this->http = null;
$this->mapper = null;
$this->client = null;
}
public function testGetUser()
{
$expected = new User();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/users/USER_ID', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toUser')
->with($response)
->willReturn($expected);
$actual = $this->client->getUser('USER_ID', ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testGetCurrentUser()
{
$expected = new User();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/user', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toUser')
->willReturn($expected);
$actual = $this->client->getCurrentUser(['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testGetCurrentAuthorization()
{
$expected = ['key' => 'value'];
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/user/auth', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toData')
->with($response)
->willReturn($expected);
$actual = $this->client->getCurrentAuthorization(['foo' => 'bar']);
$this->assertEquals($expected, $actual);
}
public function testUpdateCurrentUser()
{
$user = new CurrentUser();
$response = $this->getMock(ResponseInterface::class);
$this->mapper->expects($this->any())
->method('fromCurrentUser')
->with($user)
->willReturn(['key' => 'value']);
$this->http->expects($this->once())
->method('put')
->with('/v2/user', ['key' => 'value', 'foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toUser');
$this->client->updateCurrentUser($user, ['foo' => 'bar']);
}
public function testGetAccounts()
{
$response = $this->getMock(ResponseInterface::class);
$expected = new ResourceCollection();
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toAccounts')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccounts(['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testLoadNextAccounts()
{
/** @var \PHPUnit_Framework_MockObject_MockObject|ResourceCollection $accounts */
$accounts = $this->getMock(ResourceCollection::class);
$response = $this->getMock(ResponseInterface::class);
$nextPage = new ResourceCollection();
$accounts->expects($this->any())
->method('getNextUri')
->willReturn('/test/next/uri');
$this->http->expects($this->any())
->method('get')
->with('/test/next/uri', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toAccounts')
->willReturn($nextPage);
$accounts->expects($this->once())
->method('mergeNextPage')
->with($nextPage);
$this->client->loadNextAccounts($accounts, ['foo' => 'bar']);
}
public function testGetAccount()
{
$expected = new Account();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toAccount')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccount('ACCOUNT_ID', ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testCreateAccount()
{
$account = new Account();
$response = $this->getMock(ResponseInterface::class);
$this->mapper->expects($this->any())
->method('fromAccount')
->with($account)
->willReturn(['key' => 'value']);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts', ['key' => 'value', 'foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toAccount')
->with($response, $account);
$this->client->createAccount($account, ['foo' => 'bar']);
}
public function testSetPrimaryAccount()
{
$account = Account::reference('ACCOUNT_ID');
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/primary', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toAccount')
->with($response, $account);
$this->client->setPrimaryAccount($account, ['foo' => 'bar']);
}
public function testUpdateAccount()
{
$account = Account::reference('ACCOUNT_ID');
$response = $this->getMock(ResponseInterface::class);
$this->mapper->expects($this->any())
->method('fromAccount')
->with($account)
->willReturn(['key' => 'value']);
$this->http->expects($this->once())
->method('put')
->with('/v2/accounts/ACCOUNT_ID', ['key' => 'value', 'foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toAccount')
->with($response, $account);
$this->client->updateAccount($account, ['foo' => 'bar']);
}
public function testDeleteAccount()
{
$account = Account::reference('ACCOUNT_ID');
$this->http->expects($this->once())
->method('delete')
->with('/v2/accounts/ACCOUNT_ID', ['foo' => 'bar']);
$this->client->deleteAccount($account, ['foo' => 'bar']);
}
public function testGetAddresses()
{
$account = Account::reference('ACCOUNT_ID');
$response = $this->getMock(ResponseInterface::class);
$expected = new ResourceCollection();
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/addresses', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toAddresses')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountAddresses($account, ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testLoadNextAddresses()
{
/** @var \PHPUnit_Framework_MockObject_MockObject|ResourceCollection $addresses */
$addresses = $this->getMock(ResourceCollection::class);
$response = $this->getMock(ResponseInterface::class);
$nextPage = new ResourceCollection();
$addresses->expects($this->any())
->method('getNextUri')
->willReturn('/test/next/uri');
$this->http->expects($this->any())
->method('get')
->with('/test/next/uri', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toAddresses')
->willReturn($nextPage);
$addresses->expects($this->once())
->method('mergeNextPage')
->with($nextPage);
$this->client->loadNextAddresses($addresses, ['foo' => 'bar']);
}
public function testGetAddress()
{
$account = Account::reference('ACCOUNT_ID');
$response = $this->getMock(ResponseInterface::class);
$expected = new Address();
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/addresses/ADDRESS_ID', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toAddress')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountAddress($account, 'ADDRESS_ID', ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testGetAddressTransactions()
{
$address = Address::reference('ACCOUNT_ID', 'ADDRESS_ID');
$expected = new ResourceCollection();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/addresses/ADDRESS_ID/transactions', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toTransactions')
->with($response)
->willReturn($expected);
$actual = $this->client->getAddressTransactions($address, ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testCreateAddress()
{
$account = Account::reference('ACCOUNT_ID');
$address = new Address();
$response = $this->getMock(ResponseInterface::class);
$this->mapper->expects($this->any())
->method('fromAddress')
->with($address)
->willReturn(['key' => 'value']);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/addresses', ['key' => 'value', 'foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toAddress')
->with($response, $address);
$this->client->createAccountAddress($account, $address, ['foo' => 'bar']);
}
public function testGetTransactions()
{
$account = Account::reference('ACCOUNT_ID');
$response = $this->getMock(ResponseInterface::class);
$expected = new ResourceCollection();
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/transactions', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toTransactions')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountTransactions($account, ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testLoadNextTransactions()
{
/** @var \PHPUnit_Framework_MockObject_MockObject|ResourceCollection $addresses */
$addresses = $this->getMock(ResourceCollection::class);
$response = $this->getMock(ResponseInterface::class);
$nextPage = new ResourceCollection();
$addresses->expects($this->any())
->method('getNextUri')
->willReturn('/test/next/uri');
$this->http->expects($this->any())
->method('get')
->with('/test/next/uri', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toTransactions')
->willReturn($nextPage);
$addresses->expects($this->once())
->method('mergeNextPage')
->with($nextPage);
$this->client->loadNextTransactions($addresses, ['foo' => 'bar']);
}
public function testGetTransaction()
{
$account = Account::reference('ACCOUNT_ID');
$expected = new Transaction();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/transactions/TRANSACTION_ID', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toTransaction')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountTransaction($account, 'TRANSACTION_ID', ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testCreateTransaction()
{
$account = Account::reference('ACCOUNT_ID');
$transaction = new Transaction();
$response = $this->getMock(ResponseInterface::class);
$this->mapper->expects($this->any())
->method('fromTransaction')
->with($transaction)
->willReturn(['key' => 'value']);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/transactions', ['key' => 'value', 'foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toTransaction')
->with($response, $transaction);
$this->client->createAccountTransaction($account, $transaction, ['foo' => 'bar']);
}
public function testCompleteRequestTransaction()
{
$transaction = Transaction::reference('ACCOUNT_ID', 'TRANSACTION_ID');
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/transactions/TRANSACTION_ID/complete', ['foo' => 'bar']);
$this->client->completeTransaction($transaction, ['foo' => 'bar']);
}
public function testResendRequestTransaction()
{
$transaction = Transaction::reference('ACCOUNT_ID', 'TRANSACTION_ID');
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/transactions/TRANSACTION_ID/resend', ['foo' => 'bar']);
$this->client->resendTransaction($transaction, ['foo' => 'bar']);
}
public function testCancelRequestTransaction()
{
$transaction = Transaction::reference('ACCOUNT_ID', 'TRANSACTION_ID');
$this->http->expects($this->once())
->method('delete')
->with('/v2/accounts/ACCOUNT_ID/transactions/TRANSACTION_ID', ['foo' => 'bar']);
$this->client->cancelTransaction($transaction, ['foo' => 'bar']);
}
public function testGetBuys()
{
$account = Account::reference('ACCOUNT_ID');
$expected = new ResourceCollection();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/buys', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toBuys')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountBuys($account, ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testLoadNextBuys()
{
/** @var \PHPUnit_Framework_MockObject_MockObject|ResourceCollection $buys */
$buys = $this->getMock(ResourceCollection::class);
$response = $this->getMock(ResponseInterface::class);
$nextPage = new ResourceCollection();
$buys->expects($this->any())
->method('getNextUri')
->willReturn('/test/next/uri');
$this->http->expects($this->any())
->method('get')
->with('/test/next/uri', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toBuys')
->willReturn($nextPage);
$buys->expects($this->once())
->method('mergeNextPage')
->with($nextPage);
$this->client->loadNextBuys($buys, ['foo' => 'bar']);
}
public function testGetBuy()
{
$account = Account::reference('ACCOUNT_ID');
$expected = new Buy();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/buys/BUY_ID', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toBuy')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountBuy($account, 'BUY_ID', ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testCreateBuy()
{
$account = Account::reference('ACCOUNT_ID');
$buy = new Buy();
$response = $this->getMock(ResponseInterface::class);
$this->mapper->expects($this->any())
->method('fromBuy')
->with($buy)
->willReturn(['key' => 'value']);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/buys', ['key' => 'value', 'foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toBuy')
->with($response, $buy);
$this->client->createAccountBuy($account, $buy, ['foo' => 'bar']);
}
public function testCommitBuy()
{
$buy = Buy::reference('ACCOUNT_ID', 'BUY_ID');
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/buys/BUY_ID/commit', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toBuy')
->with($response, $buy);
$this->client->commitBuy($buy, ['foo' => 'bar']);
}
public function testGetSells()
{
$account = Account::reference('ACCOUNT_ID');
$expected = new ResourceCollection();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/sells', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toSells')
->with($response)
->willReturn($expected);
$actual = $this->client->getSells($account, ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testLoadNextSells()
{
/** @var \PHPUnit_Framework_MockObject_MockObject|ResourceCollection $sells */
$sells = $this->getMock(ResourceCollection::class);
$response = $this->getMock(ResponseInterface::class);
$nextPage = new ResourceCollection();
$sells->expects($this->any())
->method('getNextUri')
->willReturn('/test/next/uri');
$this->http->expects($this->any())
->method('get')
->with('/test/next/uri', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toSells')
->willReturn($nextPage);
$sells->expects($this->once())
->method('mergeNextPage')
->with($nextPage);
$this->client->loadNextSells($sells, ['foo' => 'bar']);
}
public function testGetSell()
{
$account = Account::reference('ACCOUNT_ID');
$expected = new Sell();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/sells/SELL_ID', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toSell')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountSell($account, 'SELL_ID', ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testCreateSell()
{
$account = Account::reference('ACCOUNT_ID');
$sell = new Sell();
$response = $this->getMock(ResponseInterface::class);
$this->mapper->expects($this->any())
->method('fromSell')
->with($sell)
->willReturn(['key' => 'value']);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/sells', ['key' => 'value', 'foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toSell')
->with($response, $sell);
$this->client->createAccountSell($account, $sell, ['foo' => 'bar']);
}
public function testCommitSell()
{
$sell = Sell::reference('ACCOUNT_ID', 'SELL_ID');
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/sells/SELL_ID/commit', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toSell')
->with($response, $sell);
$this->client->commitSell($sell, ['foo' => 'bar']);
}
public function testGetDeposits()
{
$account = Account::reference('ACCOUNT_ID');
$expected = new ResourceCollection();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/deposits', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toDeposits')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountDeposits($account, ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testLoadNextDeposits()
{
/** @var \PHPUnit_Framework_MockObject_MockObject|ResourceCollection $deposits */
$deposits = $this->getMock(ResourceCollection::class);
$response = $this->getMock(ResponseInterface::class);
$nextPage = new ResourceCollection();
$deposits->expects($this->any())
->method('getNextUri')
->willReturn('/test/next/uri');
$this->http->expects($this->any())
->method('get')
->with('/test/next/uri', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toDeposits')
->willReturn($nextPage);
$deposits->expects($this->once())
->method('mergeNextPage')
->with($nextPage);
$this->client->loadNextDeposits($deposits, ['foo' => 'bar']);
}
public function testGetDeposit()
{
$account = Account::reference('ACCOUNT_ID');
$expected = new Deposit();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/deposits/DEPOSIT_ID', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toDeposit')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountDeposit($account, 'DEPOSIT_ID', ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testCreateDeposit()
{
$account = Account::reference('ACCOUNT_ID');
$deposit = new Deposit();
$response = $this->getMock(ResponseInterface::class);
$this->mapper->expects($this->any())
->method('fromDeposit')
->with($deposit)
->willReturn(['key' => 'value']);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/deposits', ['key' => 'value', 'foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toDeposit')
->with($response, $deposit);
$this->client->createAccountDeposit($account, $deposit, ['foo' => 'bar']);
}
public function testCommitDeposit()
{
$deposit = Deposit::reference('ACCOUNT_ID', 'DEPOSIT_ID');
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/deposits/DEPOSIT_ID/commit', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toDeposit')
->with($response, $deposit);
$this->client->commitDeposit($deposit, ['foo' => 'bar']);
}
public function testGetWithdrawals()
{
$account = Account::reference('ACCOUNT_ID');
$expected = new ResourceCollection();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/withdrawals', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toWithdrawals')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountWithdrawals($account, ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testLoadNextWithdrawals()
{
/** @var \PHPUnit_Framework_MockObject_MockObject|ResourceCollection $withdrawals */
$withdrawals = $this->getMock(ResourceCollection::class);
$response = $this->getMock(ResponseInterface::class);
$nextPage = new ResourceCollection();
$withdrawals->expects($this->any())
->method('getNextUri')
->willReturn('/test/next/uri');
$this->http->expects($this->any())
->method('get')
->with('/test/next/uri', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toWithdrawals')
->willReturn($nextPage);
$withdrawals->expects($this->once())
->method('mergeNextPage')
->with($nextPage);
$this->client->loadNextWithdrawals($withdrawals, ['foo' => 'bar']);
}
public function testGetWithdrawal()
{
$account = Account::reference('ACCOUNT_ID');
$expected = new Withdrawal();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/accounts/ACCOUNT_ID/withdrawals/WITHDRAWAL_ID', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toWithdrawal')
->with($response)
->willReturn($expected);
$actual = $this->client->getAccountWithdrawal($account, 'WITHDRAWAL_ID', ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testCreateWithdrawal()
{
$account = Account::reference('ACCOUNT_ID');
$withdrawal = new Withdrawal();
$response = $this->getMock(ResponseInterface::class);
$this->mapper->expects($this->any())
->method('fromWithdrawal')
->with($withdrawal)
->willReturn(['key' => 'value']);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/withdrawals', ['key' => 'value', 'foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toWithdrawal')
->with($response, $withdrawal);
$this->client->createAccountWithdrawal($account, $withdrawal, ['foo' => 'bar']);
}
public function testCommitWithdrawal()
{
$withdrawal = Withdrawal::reference('ACCOUNT_ID', 'WITHDRAWAL_ID');
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->once())
->method('post')
->with('/v2/accounts/ACCOUNT_ID/withdrawals/WITHDRAWAL_ID/commit', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->once())
->method('toWithdrawal')
->with($response, $withdrawal);
$this->client->commitWithdrawal($withdrawal, ['foo' => 'bar']);
}
public function testGetPaymentMethods()
{
$expected = new ResourceCollection();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/payment-methods', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toPaymentMethods')
->willReturn($expected);
$actual = $this->client->getPaymentMethods(['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testLoadNextPaymentMethods()
{
/** @var \PHPUnit_Framework_MockObject_MockObject|ResourceCollection $paymentMethods */
$paymentMethods = $this->getMock(ResourceCollection::class);
$response = $this->getMock(ResponseInterface::class);
$nextPage = new ResourceCollection();
$paymentMethods->expects($this->any())
->method('getNextUri')
->willReturn('/test/next/uri');
$this->http->expects($this->any())
->method('get')
->with('/test/next/uri', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toPaymentMethods')
->willReturn($nextPage);
$paymentMethods->expects($this->once())
->method('mergeNextPage')
->with($nextPage);
$this->client->loadNextPaymentMethods($paymentMethods, ['foo' => 'bar']);
}
public function testGetPaymentMethod()
{
$expected = new PaymentMethod();
$response = $this->getMock(ResponseInterface::class);
$this->http->expects($this->any())
->method('get')
->with('/v2/payment-methods/PAYMENT_METHOD_ID', ['foo' => 'bar'])
->willReturn($response);
$this->mapper->expects($this->any())
->method('toPaymentMethod')
->with($response)
->willReturn($expected);
$actual = $this->client->getPaymentMethod('PAYMENT_METHOD_ID', ['foo' => 'bar']);
$this->assertSame($expected, $actual);
}
public function testParseNotification()
{
$body = '{"id":"e5852770-ca8b-51be-b839-0b3aedc62252","type":"wallet:orders:paid","data":{"id":"146ed8ac-64c1-541e-8692-f9fa3d3d64d5","code":"3RTHN8KO","type":"order","name":"asdfasdf","description":"asdfasdfasdfasdf","amount":{"amount":"1.00","currency":"USD"},"receipt_url":"https://www.coinbase.com/orders/9c704d8a66a2204624ae7c39709db5f8/receipt","resource":"order","resource_path":"/v2/orders/146ed8ac-64c1-541e-8692-f9fa3d3d64d5","status":"paid","bitcoin_amount":{"amount":"0.00221000","currency":"BTC"},"payout_amount":null,"bitcoin_address":"1CHtgEP9YeDkkUQrdkmpGXdAe2LzP1esSg","refund_address":"1fnRUd2e9xk7KYv5uD4tdnnRnpvSZrbBb","bitcoin_uri":"bitcoin:1CHtgEP9YeDkkUQrdkmpGXdAe2LzP1esSg?amount=0.00221\\u0026r=https://www.coinbase.com/r/5690c45f57e9cd1211000079","notifications_url":null,"paid_at":"2016-01-09T08:27:36Z","mispaid_at":null,"expires_at":"2016-01-09T08:42:11Z","metadata":{},"created_at":"2016-01-09T08:27:11Z","updated_at":"2016-01-09T08:27:36Z","customer_info":null,"transaction":{"id":"4fbfcd5f-0252-57ac-be80-6b2037bda1c5","resource":"transaction","resource_path":"/v2/accounts/0d4b7e7f-5da8-506d-b0e1-8f5945d9d7f3/transactions/4fbfcd5f-0252-57ac-be80-6b2037bda1c5"},"mispayments":[],"refunds":[]},"user":{"id":"7eee8527-3439-52d9-98d6-a04c0d0dc6ce","resource":"user","resource_path":"/v2/users/7eee8527-3439-52d9-98d6-a04c0d0dc6ce"},"account":{"id":"0d4b7e7f-5da8-506d-b0e1-8f5945d9d7f3","resource":"account","resource_path":"/v2/accounts/0d4b7e7f-5da8-506d-b0e1-8f5945d9d7f3"},"delivery_attempts":0,"created_at":"2016-01-09T08:27:36Z","resource":"notification","resource_path":"/v2/notifications/e5852770-ca8b-51be-b839-0b3aedc62252"}';
$this->mapper->expects($this->any())
->method('injectNotification')
->with($this->any());
}
public function testVerifyCallback()
{
$body = '{"order":{"id":null,"created_at":null,"status":"completed","event":null,"total_btc":{"cents":100000000,"currency_iso":"BTC"},"total_native":{"cents":1000,"currency_iso":"USD"},"total_payout":{"cents":1000,"currency_iso":"USD"},"custom":"123456789","receive_address":"mzVoQenSY6RTBgBUcpSBTBAvUMNgGWxgJn","button":{"type":"buy_now","name":"Test Item","description":null,"id":null},"transaction":{"id":"53bdfe4d091c0d74a7000003","hash":"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b","confirmations":0}}}';
$signature = '6yQRl17CNj5YSHSpF+tLjb0vVsNVEv021Tyy1bTVEQ69SWlmhwmJYuMc7jiDyeW9TLy4vRqSh4g4YEyN8eoQIM57pMoNw6Lw6Oudubqwp+E3cKtLFxW0l18db3Z/vhxn5BScAutHWwT/XrmkCNaHyCsvOOGMekwrNO7mxX9QIx21FBaEejJeviSYrF8bG6MbmFEs2VGKSybf9YrElR8BxxNe/uNfCXN3P5tO8MgR5wlL3Kr4yq8e6i4WWJgD08IVTnrSnoZR6v8JkPA+fn7I0M6cy0Xzw3BRMJAvdQB97wkobu97gFqJFKsOH2u/JR1S/UNP26vL0mzuAVuKAUwlRn0SUhWEAgcM3X0UCtWLYfCIb5QqrSHwlp7lwOkVnFt329Mrpjy+jAfYYSRqzIsw4ZsRRVauy/v3CvmjPI9sUKiJ5l1FSgkpK2lkjhFgKB3WaYZWy9ZfIAI9bDyG8vSTT7IDurlUhyTweDqVNlYUsO6jaUa4KmSpg1o9eIeHxm0XBQ2c0Lv/T39KNc/VOAi1LBfPiQYMXD1e/8VuPPBTDGgzOMD3i334ppSr36+8YtApAn3D36Hr9jqAfFrugM7uPecjCGuleWsHFyNnJErT0/amIt24Nh1GoiESEq42o7Co4wZieKZ+/yeAlIUErJzK41ACVGmTnGoDUwEBXxADOdA=';
$this->assertTrue($this->client->verifyCallback($body, $signature));
}
public function testVerifyCallbackFailure()
{
$body = '{"order":{"id":null,"created_at":null,"status":"completed","event":null,"total_btc":{"cents":1000000000,"currency_iso":"BTC"},"total_native":{"cents":1000,"currency_iso":"USD"},"total_payout":{"cents":1000,"currency_iso":"USD"},"custom":"123456789","receive_address":"mzVoQenSY6RTBgBUcpSBTBAvUMNgGWxgJn","button":{"type":"buy_now","name":"Test Item","description":null,"id":null},"transaction":{"id":"53bdfe4d091c0d74a7000003","hash":"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b","confirmations":0}}}';
$signature = '6yQRl17CNj5YSHSpF+tLjb0vVsNVEv021Tyy1bTVEQ69SWlmhwmJYuMc7jiDyeW9TLy4vRqSh4g4YEyN8eoQIM57pMoNw6Lw6Oudubqwp+E3cKtLFxW0l18db3Z/vhxn5BScAutHWwT/XrmkCNaHyCsvOOGMekwrNO7mxX9QIx21FBaEejJeviSYrF8bG6MbmFEs2VGKSybf9YrElR8BxxNe/uNfCXN3P5tO8MgR5wlL3Kr4yq8e6i4WWJgD08IVTnrSnoZR6v8JkPA+fn7I0M6cy0Xzw3BRMJAvdQB97wkobu97gFqJFKsOH2u/JR1S/UNP26vL0mzuAVuKAUwlRn0SUhWEAgcM3X0UCtWLYfCIb5QqrSHwlp7lwOkVnFt329Mrpjy+jAfYYSRqzIsw4ZsRRVauy/v3CvmjPI9sUKiJ5l1FSgkpK2lkjhFgKB3WaYZWy9ZfIAI9bDyG8vSTT7IDurlUhyTweDqVNlYUsO6jaUa4KmSpg1o9eIeHxm0XBQ2c0Lv/T39KNc/VOAi1LBfPiQYMXD1e/8VuPPBTDGgzOMD3i334ppSr36+8YtApAn3D36Hr9jqAfFrugM7uPecjCGuleWsHFyNnJErT0/amIt24Nh1GoiESEq42o7Co4wZieKZ+/yeAlIUErJzK41ACVGmTnGoDUwEBXxADOdA=';
$this->assertFalse($this->client->verifyCallback($body, $signature));
}
}