mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-10-17 01:42:19 +00:00
Expand tests for account API.
This commit is contained in:
@@ -154,8 +154,8 @@ class AccountController extends Controller
|
|||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
// if currency ID is 0, find the currency by the code:
|
// if currency ID is 0, find the currency by the code:
|
||||||
if ($data['currency_id'] === 0) {
|
if ($data['currency_id'] === 0) {
|
||||||
$currency = $this->currencyRepository->findByCode($data['currency_code']);
|
$currency = $this->currencyRepository->findByCodeNull($data['currency_code']);
|
||||||
$data['currency_id'] = $currency->id;
|
$data['currency_id'] = is_null($currency) ? 0 : $currency->id;
|
||||||
}
|
}
|
||||||
$account = $this->repository->store($data);
|
$account = $this->repository->store($data);
|
||||||
$manager = new Manager();
|
$manager = new Manager();
|
||||||
@@ -179,8 +179,8 @@ class AccountController extends Controller
|
|||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
// if currency ID is 0, find the currency by the code:
|
// if currency ID is 0, find the currency by the code:
|
||||||
if ($data['currency_id'] === 0) {
|
if ($data['currency_id'] === 0) {
|
||||||
$currency = $this->currencyRepository->findByCode($data['currency_code']);
|
$currency = $this->currencyRepository->findByCodeNull($data['currency_code']);
|
||||||
$data['currency_id'] = $currency->id;
|
$data['currency_id'] = is_null($currency) ? 0 : $currency->id;
|
||||||
}
|
}
|
||||||
// set correct type:
|
// set correct type:
|
||||||
$data['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type);
|
$data['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type);
|
||||||
@@ -256,6 +256,6 @@ class AccountController extends Controller
|
|||||||
return $types[$type];
|
return $types[$type];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $types['all'];
|
return $types['all']; // @codeCoverageIgnore
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -23,7 +23,9 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Tests\Api\V1\Controllers;
|
namespace Tests\Api\V1\Controllers;
|
||||||
|
|
||||||
|
use FireflyIII\Api\V1\Requests\AccountRequest;
|
||||||
use FireflyIII\Models\Account;
|
use FireflyIII\Models\Account;
|
||||||
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
@@ -70,6 +72,7 @@ class AccountControllerTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* @covers \FireflyIII\Api\V1\Controllers\AccountController::__construct
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::__construct
|
||||||
* @covers \FireflyIII\Api\V1\Controllers\AccountController::index
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::index
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::mapTypes
|
||||||
*/
|
*/
|
||||||
public function testIndex()
|
public function testIndex()
|
||||||
{
|
{
|
||||||
@@ -97,5 +100,354 @@ class AccountControllerTest extends TestCase
|
|||||||
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opening balance without date.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::store
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::authorize
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::rules
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::getAll
|
||||||
|
*/
|
||||||
|
public function testInvalidBalance()
|
||||||
|
{
|
||||||
|
// mock repositories
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$currencyRepos->shouldReceive('setUser')->once();
|
||||||
|
|
||||||
|
// data to submit
|
||||||
|
$data = [
|
||||||
|
'name' => 'Some new asset account #' . rand(1, 10000),
|
||||||
|
'currency_id' => 1,
|
||||||
|
'type' => 'asset',
|
||||||
|
'active' => 1,
|
||||||
|
'account_role' => 'defaultAsset',
|
||||||
|
'opening_balance' => '123.45',
|
||||||
|
];
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']);
|
||||||
|
$response->assertStatus(422);
|
||||||
|
$response->assertExactJson(
|
||||||
|
[
|
||||||
|
'message' => 'The given data was invalid.',
|
||||||
|
'errors' => [
|
||||||
|
'opening_balance_date' => ['The opening balance date field is required when opening balance is present.'],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$response->assertHeader('Content-Type', 'application/json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CC type present when account is a credit card.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::store
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::authorize
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::rules
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::getAll
|
||||||
|
*/
|
||||||
|
public function testNoCreditCardData()
|
||||||
|
{
|
||||||
|
// mock repositories
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$currencyRepos->shouldReceive('setUser')->once();
|
||||||
|
|
||||||
|
// data to submit
|
||||||
|
$data = [
|
||||||
|
'name' => 'Some new asset account #' . rand(1, 10000),
|
||||||
|
'type' => 'asset',
|
||||||
|
'active' => 1,
|
||||||
|
'account_role' => 'ccAsset',
|
||||||
|
'currency_id' => 1,
|
||||||
|
];
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']);
|
||||||
|
$response->assertStatus(422);
|
||||||
|
$response->assertExactJson(
|
||||||
|
[
|
||||||
|
'message' => 'The given data was invalid.',
|
||||||
|
'errors' => [
|
||||||
|
'cc_monthly_payment_date' => ['The cc monthly payment date field is required when account role is ccAsset.'],
|
||||||
|
'cc_type' => ['The cc type field is required when account role is ccAsset.'],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$response->assertHeader('Content-Type', 'application/json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No currency information
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::store
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::authorize
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::rules
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::getAll
|
||||||
|
*/
|
||||||
|
public function testNoCurrencyInfo()
|
||||||
|
{
|
||||||
|
// mock repositories
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$currencyRepos->shouldReceive('setUser')->once();
|
||||||
|
|
||||||
|
// data to submit
|
||||||
|
$data = [
|
||||||
|
'name' => 'Some new asset account #' . rand(1, 10000),
|
||||||
|
'type' => 'asset',
|
||||||
|
'active' => 1,
|
||||||
|
'account_role' => 'defaultAsset',
|
||||||
|
];
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']);
|
||||||
|
$response->assertStatus(422);
|
||||||
|
$response->assertExactJson(
|
||||||
|
[
|
||||||
|
'message' => 'The given data was invalid.',
|
||||||
|
'errors' => [
|
||||||
|
'currency_code' => ['The currency code field is required when currency id is not present.'],
|
||||||
|
'currency_id' => ['The currency id field is required when currency code is not present.'],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$response->assertHeader('Content-Type', 'application/json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::show
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function testShow()
|
||||||
|
{
|
||||||
|
// create stuff
|
||||||
|
$account = $this->user()->accounts()->first();
|
||||||
|
|
||||||
|
// mock stuff:
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$currencyRepos->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('getOpeningBalanceAmount')->andReturn('10')->once();
|
||||||
|
$repository->shouldReceive('getOpeningBalanceDate')->andReturn('2018-01-01')->once();
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->get('/api/v1/accounts/' . $account->id);
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
|
||||||
|
$response->assertSee('2018-01-01'); // opening balance date
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name already in use.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::store
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::authorize
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::rules
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::getAll
|
||||||
|
*/
|
||||||
|
public function testStoreNotUnique()
|
||||||
|
{
|
||||||
|
// mock repositories
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$currencyRepos->shouldReceive('setUser')->once();
|
||||||
|
|
||||||
|
$account = $this->user()->accounts()->where('account_type_id', 3)->first();
|
||||||
|
// data to submit
|
||||||
|
$data = [
|
||||||
|
'name' => $account->name,
|
||||||
|
'currency_id' => 1,
|
||||||
|
'type' => 'asset',
|
||||||
|
'active' => 1,
|
||||||
|
'account_role' => 'defaultAsset',
|
||||||
|
];
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']);
|
||||||
|
$response->assertStatus(422);
|
||||||
|
$response->assertExactJson(
|
||||||
|
[
|
||||||
|
'message' => 'The given data was invalid.',
|
||||||
|
'errors' => [
|
||||||
|
'name' => ['This account name is already in use'],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$response->assertHeader('Content-Type', 'application/json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send correct data. Should call account repository store method.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::store
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::authorize
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::rules
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::getAll
|
||||||
|
*/
|
||||||
|
public function testStoreValid()
|
||||||
|
{
|
||||||
|
// mock repositories
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$account = $this->user()->accounts()->first();
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$repository->shouldReceive('store')->once()->andReturn($account);
|
||||||
|
$repository->shouldReceive('getOpeningBalanceAmount')->andReturn('10');
|
||||||
|
$repository->shouldReceive('getOpeningBalanceDate')->andReturn('2018-01-01');
|
||||||
|
$currencyRepos->shouldReceive('setUser')->once();
|
||||||
|
|
||||||
|
// data to submit
|
||||||
|
$data = [
|
||||||
|
'name' => 'Some new asset account #' . rand(1, 10000),
|
||||||
|
'currency_id' => 1,
|
||||||
|
'type' => 'asset',
|
||||||
|
'active' => 1,
|
||||||
|
'account_role' => 'defaultAsset',
|
||||||
|
];
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']);
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
$response->assertSee($account->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send correct data. Should call account repository store method.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::store
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::authorize
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::rules
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::getAll
|
||||||
|
*/
|
||||||
|
public function testStoreWithCurrencyCode()
|
||||||
|
{
|
||||||
|
// mock repositories
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$account = $this->user()->accounts()->first();
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$currencyRepos->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('store')->once()->andReturn($account);
|
||||||
|
$repository->shouldReceive('getOpeningBalanceAmount')->andReturn('10');
|
||||||
|
$repository->shouldReceive('getOpeningBalanceDate')->andReturn('2018-01-01');
|
||||||
|
$currencyRepos->shouldReceive('findByCodeNull')->andReturn(TransactionCurrency::find(1));
|
||||||
|
|
||||||
|
// functions to expect:
|
||||||
|
|
||||||
|
// data to submit
|
||||||
|
$data = [
|
||||||
|
'name' => 'Some new asset account #' . rand(1, 10000),
|
||||||
|
'currency_code' => 'EUR',
|
||||||
|
'type' => 'asset',
|
||||||
|
'active' => 1,
|
||||||
|
'account_role' => 'defaultAsset',
|
||||||
|
];
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']);
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
$response->assertSee($account->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update first asset account we find. Name can be the same as it was.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::update
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::rules
|
||||||
|
*/
|
||||||
|
public function testUpdate()
|
||||||
|
{
|
||||||
|
// mock repositories
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$repository->shouldReceive('update')->once();
|
||||||
|
$currencyRepos->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('getOpeningBalanceAmount')->andReturn('10');
|
||||||
|
$repository->shouldReceive('getOpeningBalanceDate')->andReturn('2018-01-01');
|
||||||
|
|
||||||
|
$account = $this->user()->accounts()->first();
|
||||||
|
// data to submit
|
||||||
|
$data = [
|
||||||
|
'name' => $account->name,
|
||||||
|
'currency_id' => 1,
|
||||||
|
'type' => 'asset',
|
||||||
|
'active' => 1,
|
||||||
|
'account_role' => 'defaultAsset',
|
||||||
|
];
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->put('/api/v1/accounts/' . $account->id, $data, ['Accept' => 'application/json']);
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
$response->assertSee($account->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update first asset account we find. Name can be the same as it was.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController::update
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\AccountRequest::rules
|
||||||
|
*/
|
||||||
|
public function testUpdateCurrencyCode()
|
||||||
|
{
|
||||||
|
// mock repositories
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$repository->shouldReceive('update')->once();
|
||||||
|
$currencyRepos->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('getOpeningBalanceAmount')->andReturn('10');
|
||||||
|
$repository->shouldReceive('getOpeningBalanceDate')->andReturn('2018-01-01');
|
||||||
|
$currencyRepos->shouldReceive('findByCodeNull')->andReturn(TransactionCurrency::find(1));
|
||||||
|
|
||||||
|
$account = $this->user()->accounts()->first();
|
||||||
|
// data to submit
|
||||||
|
$data = [
|
||||||
|
'name' => $account->name,
|
||||||
|
'currency_code' => 'EUR',
|
||||||
|
'type' => 'asset',
|
||||||
|
'active' => 1,
|
||||||
|
'account_role' => 'defaultAsset',
|
||||||
|
];
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->put('/api/v1/accounts/' . $account->id, $data, ['Accept' => 'application/json']);
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
$response->assertSee($account->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user