Improve test coverage for API.

This commit is contained in:
James Cole 2018-12-16 13:55:19 +01:00
parent 746bd2ce92
commit 89942ee49c
32 changed files with 1534 additions and 823 deletions

View File

@ -96,7 +96,7 @@ class RecurrenceRequest extends Request
$today = Carbon::now()->addDay(); $today = Carbon::now()->addDay();
return [ return [
'type' => 'required|in:Withdrawal,Transfer,Deposit', 'type' => 'required|in:withdrawal,transfer,deposit',
'title' => 'required|between:1,255|uniqueObjectForUser:recurrences,title', 'title' => 'required|between:1,255|uniqueObjectForUser:recurrences,title',
'description' => 'between:1,65000', 'description' => 'between:1,65000',
'first_date' => sprintf('required|date|after:%s', $today->format('Y-m-d')), 'first_date' => sprintf('required|date|after:%s', $today->format('Y-m-d')),

View File

@ -92,28 +92,23 @@ class RuleRequest extends Request
// some triggers and actions require text: // some triggers and actions require text:
$contextTriggers = implode(',', config('firefly.context-rule-triggers')); $contextTriggers = implode(',', config('firefly.context-rule-triggers'));
$contextActions = implode(',', config('firefly.context-rule-actions')); $contextActions = implode(',', config('firefly.context-rule-actions'));
$rules = [
'title' => 'required|between:1,100|uniqueObjectForUser:rules,title',
$rules = [ 'description' => 'between:1,5000|nullable',
'title' => 'required|between:1,100|uniqueObjectForUser:rules,title', 'rule_group_id' => 'required|belongsToUser:rule_groups|required_without:rule_group_title',
'description' => 'between:1,5000|nullable', 'rule_group_title' => 'nullable|between:1,255|required_without:rule_group_id|belongsToUser:rule_groups,title',
'rule_group_id' => 'required|belongsToUser:rule_groups|required_without:rule_group_title', 'trigger' => 'required|in:store-journal,update-journal',
'rule_group_title' => 'nullable|between:1,255|required_without:rule_group_id|belongsToUser:rule_groups,title',
'trigger' => 'required|in:store-journal,update-journal',
'triggers.*.type' => 'required|in:' . implode(',', $validTriggers), 'triggers.*.type' => 'required|in:' . implode(',', $validTriggers),
'triggers.*.value' => 'required_if:actions.*.type,' . $contextTriggers . '|min:1|ruleTriggerValue', 'triggers.*.value' => 'required_if:actions.*.type,' . $contextTriggers . '|min:1|ruleTriggerValue',
'triggers.*.stop_processing' => [new IsBoolean], 'triggers.*.stop_processing' => [new IsBoolean],
'triggers.*.active' => [new IsBoolean], 'triggers.*.active' => [new IsBoolean],
'actions.*.type' => 'required|in:' . implode(',', $validActions),
'actions.*.type' => 'required|in:' . implode(',', $validActions), 'actions.*.value' => 'required_if:actions.*.type,' . $contextActions . '|ruleActionValue',
'actions.*.value' => 'required_if:actions.*.type,' . $contextActions . '|ruleActionValue', 'actions.*.stop_processing' => [new IsBoolean],
'actions.*.stop_processing' => [new IsBoolean], 'actions.*.active' => [new IsBoolean],
'actions.*.active' => [new IsBoolean], 'strict' => [new IsBoolean],
'stop_processing' => [new IsBoolean],
'strict' => [new IsBoolean], 'active' => [new IsBoolean],
'stop_processing' => [new IsBoolean],
'active' => [new IsBoolean],
]; ];
return $rules; return $rules;

View File

@ -38,7 +38,7 @@ class BillDestroyService
*/ */
public function __construct() public function __construct()
{ {
if ('testing' === env('APP_ENV')) { if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
} }
} }

View File

@ -33,11 +33,8 @@ use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class AttachmentTransformer * Class AttachmentTransformer
*/ */
class AttachmentTransformer extends TransformerAbstract class AttachmentTransformer extends AbstractTransformer
{ {
/** @var ParameterBag */
protected $parameters;
/** @var AttachmentRepositoryInterface */ /** @var AttachmentRepositoryInterface */
private $repository; private $repository;
@ -45,12 +42,9 @@ class AttachmentTransformer extends TransformerAbstract
* BillTransformer constructor. * BillTransformer constructor.
* *
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param ParameterBag $parameters
*/ */
public function __construct(ParameterBag $parameters) public function __construct()
{ {
$this->parameters = $parameters;
$this->repository = app(AttachmentRepositoryInterface::class); $this->repository = app(AttachmentRepositoryInterface::class);
if ('testing' === config('app.env')) { if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));

View File

@ -32,21 +32,15 @@ use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class AvailableBudgetTransformer * Class AvailableBudgetTransformer
*/ */
class AvailableBudgetTransformer extends TransformerAbstract class AvailableBudgetTransformer extends AbstractTransformer
{ {
/** @var ParameterBag */
protected $parameters;
/** /**
* CurrencyTransformer constructor. * CurrencyTransformer constructor.
* *
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param ParameterBag $parameters
*/ */
public function __construct(ParameterBag $parameters) public function __construct()
{ {
$this->parameters = $parameters;
if ('testing' === config('app.env')) { if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
} }

View File

@ -37,11 +37,8 @@ use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class BillTransformer * Class BillTransformer
*/ */
class BillTransformer extends TransformerAbstract class BillTransformer extends AbstractTransformer
{ {
/** @var ParameterBag */
protected $parameters;
/** @var BillRepositoryInterface */ /** @var BillRepositoryInterface */
private $repository; private $repository;
@ -49,12 +46,9 @@ class BillTransformer extends TransformerAbstract
* BillTransformer constructor. * BillTransformer constructor.
* *
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param ParameterBag $parameters
*/ */
public function __construct(ParameterBag $parameters) public function __construct()
{ {
$this->parameters = $parameters;
$this->repository = app(BillRepositoryInterface::class); $this->repository = app(BillRepositoryInterface::class);
if ('testing' === config('app.env')) { if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));

View File

@ -31,21 +31,15 @@ use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class BudgetLimitTransformer * Class BudgetLimitTransformer
*/ */
class BudgetLimitTransformer extends TransformerAbstract class BudgetLimitTransformer extends AbstractTransformer
{ {
/** @var ParameterBag */
protected $parameters;
/** /**
* CurrencyTransformer constructor. * CurrencyTransformer constructor.
* *
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param ParameterBag $parameters
*/ */
public function __construct(ParameterBag $parameters) public function __construct()
{ {
$this->parameters = $parameters;
if ('testing' === config('app.env')) { if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
} }

View File

@ -27,28 +27,20 @@ namespace FireflyIII\Transformers;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use League\Fractal\TransformerAbstract;
use Log; use Log;
use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class BudgetTransformer * Class BudgetTransformer
*/ */
class BudgetTransformer extends TransformerAbstract class BudgetTransformer extends AbstractTransformer
{ {
/** @var ParameterBag */
protected $parameters;
/** /**
* BudgetTransformer constructor. * BudgetTransformer constructor.
* *
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param ParameterBag $parameters
*/ */
public function __construct(ParameterBag $parameters) public function __construct()
{ {
$this->parameters = $parameters;
if ('testing' === config('app.env')) { if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
} }

View File

@ -257,7 +257,7 @@ class FireflyValidator extends Validator
$index = (int)($parts[1] ?? '0'); $index = (int)($parts[1] ?? '0');
// get the name of the trigger from the data array: // get the name of the trigger from the data array:
$actionType = $this->data['actions'][$index]['name'] ?? 'invalid'; $actionType = $this->data['actions'][$index]['type'] ?? 'invalid';
// if it's "invalid" return false. // if it's "invalid" return false.
if ('invalid' === $actionType) { if ('invalid' === $actionType) {
@ -320,7 +320,7 @@ class FireflyValidator extends Validator
$index = (int)($parts[1] ?? '0'); $index = (int)($parts[1] ?? '0');
// get the name of the trigger from the data array: // get the name of the trigger from the data array:
$triggerType = $this->data['triggers'][$index]['name'] ?? 'invalid'; $triggerType = $this->data['triggers'][$index]['type'] ?? 'invalid';
// invalid always returns false: // invalid always returns false:
if ('invalid' === $triggerType) { if ('invalid' === $triggerType) {

View File

@ -23,12 +23,13 @@ declare(strict_types=1);
namespace Tests\Api\V1\Controllers; namespace Tests\Api\V1\Controllers;
use FireflyIII\Transformers\UserTransformer;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
use Tests\TestCase; use Tests\TestCase;
/** /**
* Class AboutControllerTest * Class AboutControllerTest.
*/ */
class AboutControllerTest extends TestCase class AboutControllerTest extends TestCase
{ {
@ -74,16 +75,17 @@ class AboutControllerTest extends TestCase
*/ */
public function testUser(): void public function testUser(): void
{ {
$transformer = $this->mock(UserTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$response = $this->get(route('api.v1.about.user')); $response = $this->get(route('api.v1.about.user'));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(
[
'data' => [
'attributes' => true,
'links' => true,
],
]
);
} }

View File

@ -25,16 +25,19 @@ namespace Tests\Api\V1\Controllers;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\TransactionCurrency; 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 FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Transformers\AccountTransformer;
use FireflyIII\Transformers\PiggyBankTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
use Mockery;
use Tests\TestCase; use Tests\TestCase;
/** /**
@ -63,15 +66,15 @@ class AccountControllerTest extends TestCase
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('destroy')->once()->andReturn(true); $repository->shouldReceive('destroy')->atLeast()->once()->andReturn(true);
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->once();
// get account: // get account:
$account = $this->user()->accounts()->first(); $account = $this->getRandomAsset();
// call API // call API
$response = $this->delete('/api/v1/accounts/' . $account->id); $response = $this->delete(route('api.v1.accounts.delete', [$account->id]));
$response->assertStatus(204); $response->assertStatus(204);
} }
@ -89,19 +92,19 @@ class AccountControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getAccountsByType')->withAnyArgs()->andReturn($accounts)->once(); $repository->shouldReceive('getAccountsByType')->withAnyArgs()->andReturn($accounts)->once();
$currencyRepos->shouldReceive('setUser');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC');
$repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->once();
// test API // test API
$response = $this->get('/api/v1/accounts'); $response = $this->get('/api/v1/accounts');
@ -115,35 +118,106 @@ class AccountControllerTest extends TestCase
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
/**
* Test the list of piggy banks.
*
* @covers \FireflyIII\Api\V1\Controllers\AccountController
*/
public function testPiggyBanks(): void
{
// mock stuff:
$repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(PiggyBankTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// get piggies for this user.
$piggies = factory(PiggyBank::class, 10)->create();
$asset = $this->getRandomAsset();
// mock calls:
$repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getPiggyBanks')->andReturn($piggies)->atLeast()->once();
// test API
$response = $this->get(route('api.v1.accounts.piggy_banks', [$asset->id]));
$response->assertStatus(200);
$response->assertJson(['data' => [],]);
$response->assertJson(
['meta' => ['pagination' => ['total' => $piggies->count(), 'count' => $piggies->count(), 'per_page' => true, 'current_page' => 1,
'total_pages' => 1]],]
);
$response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
$response->assertSee('page=1'); // default returns this.
$response->assertHeader('Content-Type', 'application/vnd.api+json');
}
/**
* Show an account.
*
* @covers \FireflyIII\Api\V1\Controllers\AccountController
*/
public function testShow(): void
{
// mock stuff:
$account = $this->getRandomAsset();
$repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls:
$repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->atLeast()->once();
// test API
$response = $this->get(route('api.v1.accounts.show', [$account->id]));
$response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json');
}
/** /**
* Opening balance without date. * Opening balance without date.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountRequest * @covers \FireflyIII\Api\V1\Requests\AccountRequest
*/ */
public function testInvalidBalance(): void public function testStoreInvalidBalance(): void
{ {
// mock repositories // mock repositories
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
// data to submit // data to submit
$data = [ $data = [
'name' => 'Some new asset account #' . random_int(1, 10000), 'name' => 'Some new asset account #' . random_int(1, 10000),
'currency_id' => 1, 'type' => 'asset',
'type' => 'asset', 'account_role' => 'defaultAsset',
'active' => 1, 'opening_balance' => '123.45',
'include_net_worth' => 1,
'account_role' => 'defaultAsset',
'opening_balance' => '123.45',
]; ];
// test API // test API
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.accounts.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(422); $response->assertStatus(422);
$response->assertExactJson( $response->assertExactJson(
[ [
@ -156,34 +230,80 @@ class AccountControllerTest extends TestCase
$response->assertHeader('Content-Type', 'application/json'); $response->assertHeader('Content-Type', 'application/json');
} }
/**
* Send correct data. Should call account repository store method.
*
* @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountRequest
*/
public function testStoreLiability(): void
{
// mock repositories
$repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class);
$account = $this->getRandomAsset();
// mock calls:
$repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('store')->atLeast()->once()->andReturn($account);
$currencyRepos->shouldReceive('findByCodeNull')->andReturn(null);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// data to submit
$data = [
'name' => 'Some new liability account #' . random_int(1, 10000),
'type' => 'liability',
'liability_amount' => '10000',
'liability_start_date' => '2016-01-01',
'liability_type' => 'mortgage',
'active' => true,
'interest' => '1',
'interest_period' => 'daily',
];
// test API
$response = $this->post(route('api.v1.accounts.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json');
}
/** /**
* CC type present when account is a credit card. * CC type present when account is a credit card.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountRequest * @covers \FireflyIII\Api\V1\Requests\AccountRequest
*/ */
public function testNoCreditCardData(): void public function testStoreNoCreditCardData(): void
{ {
// mock repositories // mock repositories
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
// data to submit // data to submit
$data = [ $data = [
'name' => 'Some new asset account #' . random_int(1, 10000), 'name' => 'Some new asset account #' . random_int(1, 10000),
'type' => 'asset', 'type' => 'asset',
'active' => 1, 'account_role' => 'ccAsset',
'include_net_worth' => 1,
'account_role' => 'ccAsset',
'currency_id' => 1,
]; ];
// test API // test API
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.accounts.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(422); $response->assertStatus(422);
$response->assertExactJson( $response->assertExactJson(
[ [
@ -199,175 +319,45 @@ class AccountControllerTest extends TestCase
} }
/** /**
* No currency information * No currency information (is allowed).
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountRequest * @covers \FireflyIII\Api\V1\Requests\AccountRequest
*/ */
public function testNoCurrencyInfo(): void public function testStoreNoCurrencyInfo(): void
{ {
// mock repositories // mock repositories
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('findByCodeNull')->atLeast()->once()->andReturnNull();
$repository->shouldReceive('store')->once()->andReturn(new Account);
// data to submit // data to submit
$data = [ $data = [
'name' => 'Some new asset account #' . random_int(1, 10000), 'name' => 'Some new asset account #' . random_int(1, 10000),
'type' => 'asset', 'type' => 'asset',
'active' => 1,
'include_net_worth' => 1,
'account_role' => 'defaultAsset', 'account_role' => 'defaultAsset',
'include_net_worth' => false,
]; ];
// test API // test API
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.accounts.store'), $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');
}
/**
* Test the list of piggy banks.
*
* @covers \FireflyIII\Api\V1\Controllers\AccountController
*/
public function testPiggyBanks(): void
{
// mock stuff:
$repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
// get piggies for this user.
$piggies = $this->user()->piggyBanks()->get();
$asset = $this->getRandomAsset();
// mock calls:
$repository->shouldReceive('setUser');
$currencyRepos->shouldReceive('setUser');
$piggyRepos->shouldReceive('setUser');
$repository->shouldReceive('getPiggyBanks')->andReturn($piggies)->once();
$piggyRepos->shouldReceive('getCurrentAmount')->andReturn('12.45');
$piggyRepos->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12.45');
$repository->shouldReceive('getMetaValue')->atLeast()->once()->andReturn('');
// test API
$response = $this->get(route('api.v1.accounts.piggy_banks', [$asset->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => [],]);
$response->assertJson(
['meta' => ['pagination' => ['total' => $piggies->count(), 'count' => $piggies->count(), 'per_page' => true, 'current_page' => 1,
'total_pages' => 1]],]
);
$response->assertJson(
['links' => ['self' => true, 'first' => true, 'last' => true,],]
);
$response->assertSee('page=1'); // default returns this.
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
/**
* Show an account.
*
* @covers \FireflyIII\Api\V1\Controllers\AccountController
*/
public function testShow(): void
{
// 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();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC');
$repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->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');
}
/**
* Send correct data. Should call account repository store method.
*
* @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountRequest
*/
public function testStoreLiability(): void
{
// 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();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC');
$repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->once();
// data to submit
$data = [
'name' => 'Some new liability account #' . random_int(1, 10000),
'currency_id' => 1,
'type' => 'liability',
'active' => 1,
'include_net_worth' => 1,
'liability_amount' => '10000',
'liability_start_date' => '2016-01-01',
'liability_type' => 'mortgage',
'interest' => '1',
'interest_period' => 'daily',
];
// test API
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']);
$response->assertSee($account->name);
$response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json');
}
/** /**
* Name already in use. * Name already in use.
* *
@ -379,12 +369,13 @@ class AccountControllerTest extends TestCase
// mock repositories // mock repositories
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
$account = $this->user()->accounts()->where('account_type_id', 3)->first(); $account = $this->getRandomAsset();
// data to submit // data to submit
$data = [ $data = [
'name' => $account->name, 'name' => $account->name,
@ -396,7 +387,7 @@ class AccountControllerTest extends TestCase
]; ];
// test API // test API
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.accounts.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(422); $response->assertStatus(422);
$response->assertExactJson( $response->assertExactJson(
[ [
@ -420,39 +411,34 @@ class AccountControllerTest extends TestCase
// mock repositories // mock repositories
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$account = $this->user()->accounts()->first(); $transformer = $this->mock(AccountTransformer::class);
// mock calls: $account = $this->getRandomAsset();
$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();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset'); // mock calls:
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1'); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1'); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC'); $currencyRepos->shouldReceive('findByCodeNull')->atLeast()->once()->andReturnNull();
$repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello'); $repository->shouldReceive('store')->atLeast()->once()->andReturn($account);
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once(); // mock calls to transformer:
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->once(); $transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// data to submit // data to submit
$data = [ $data = [
'name' => 'Some new asset account #' . random_int(1, 10000), 'name' => 'Some new asset account #' . random_int(1, 10000),
'currency_id' => 1, 'type' => 'asset',
'type' => 'asset', 'account_role' => 'defaultAsset',
'active' => 1,
'include_net_worth' => 1,
'account_role' => 'defaultAsset',
]; ];
// test API // test API
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.accounts.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]); $response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($account->name);
} }
/** /**
@ -466,43 +452,35 @@ class AccountControllerTest extends TestCase
// mock repositories // mock repositories
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$account = $this->user()->accounts()->first(); $transformer = $this->mock(AccountTransformer::class);
$account = $this->getRandomAsset();
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('store')->once()->andReturn($account); $repository->shouldReceive('store')->atLeast()->once()->andReturn($account);
$repository->shouldReceive('getOpeningBalanceAmount')->andReturn('10'); $currencyRepos->shouldReceive('findByCodeNull')->atLeast()->once()->andReturn(new TransactionCurrency());
$repository->shouldReceive('getOpeningBalanceDate')->andReturn('2018-01-01');
$currencyRepos->shouldReceive('findByCodeNull')->andReturn(TransactionCurrency::find(1));
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset'); // mock calls to transformer:
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1'); $transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1'); $transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC'); $transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello'); $transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once(); $transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->once();
// functions to expect:
// data to submit // data to submit
$data = [ $data = [
'name' => 'Some new asset account #' . random_int(1, 10000), 'name' => 'Some new asset account #' . random_int(1, 10000),
'currency_code' => 'EUR', 'currency_code' => 'EUR',
'type' => 'asset', 'type' => 'asset',
'active' => 1, 'account_role' => 'defaultAsset',
'include_net_worth' => 1,
'account_role' => 'defaultAsset',
]; ];
// test API // test API
$response = $this->post('/api/v1/accounts', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.accounts.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]); $response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($account->name);
} }
/** /**
@ -512,22 +490,19 @@ class AccountControllerTest extends TestCase
*/ */
public function testTransactionsBasic(): void public function testTransactionsBasic(): void
{ {
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$accountRepos->shouldReceive('setUser'); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$accountRepos->shouldReceive('getAccountsByType')
->andReturn($this->user()->accounts()->where('account_type_id', 3)->get());
$asset = $this->getRandomAsset();
// get some transactions using the collector:
$repository = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $transformer = $this->mock(TransactionTransformer::class);
$repository->shouldReceive('setUser');
$currencyRepository->shouldReceive('setUser');
// default mocks
$accountRepos->shouldReceive('setUser')->atLeast()->once();
$currencyRepository->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue(); $accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue();
// mock collector:
$paginator = new LengthAwarePaginator(new Collection, 0, 50);
$collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('setUser')->andReturnSelf();
$collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf();
$collector->shouldReceive('withCategoryInformation')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf();
@ -537,12 +512,11 @@ class AccountControllerTest extends TestCase
$collector->shouldReceive('setLimit')->andReturnSelf(); $collector->shouldReceive('setLimit')->andReturnSelf();
$collector->shouldReceive('setPage')->andReturnSelf(); $collector->shouldReceive('setPage')->andReturnSelf();
$collector->shouldReceive('setTypes')->andReturnSelf(); $collector->shouldReceive('setTypes')->andReturnSelf();
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
// mock calls to transformer:
// mock some calls: $transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$asset = $this->getRandomAsset();
// test API // test API
$response = $this->get(route('api.v1.accounts.transactions', [$asset->id])); $response = $this->get(route('api.v1.accounts.transactions', [$asset->id]));
@ -560,31 +534,36 @@ class AccountControllerTest extends TestCase
*/ */
public function testTransactionsOpposing(): void public function testTransactionsOpposing(): void
{ {
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$accountRepos->shouldReceive('setUser'); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$accountRepos->shouldReceive('getAccountsByType')
->andReturn($this->user()->accounts()->where('account_type_id', 3)->get());
$revenue = $this->getRandomRevenue();
$repository = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $transformer = $this->mock(TransactionTransformer::class);
$repository->shouldReceive('setUser'); // default mocks
$currencyRepository->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser')->atLeast()->once();
$currencyRepository->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnFalse(); $accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnFalse();
// mock collector:
$paginator = new LengthAwarePaginator(new Collection, 0, 50);
$collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('setUser')->andReturnSelf();
$collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf();
$collector->shouldReceive('withCategoryInformation')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf();
$collector->shouldReceive('withBudgetInformation')->andReturnSelf(); $collector->shouldReceive('withBudgetInformation')->andReturnSelf();
$collector->shouldReceive('setOpposingAccounts')->andReturnSelf(); $collector->shouldReceive('setAccounts')->andReturnSelf();
$collector->shouldReceive('removeFilter')->andReturnSelf(); $collector->shouldReceive('removeFilter')->andReturnSelf();
$collector->shouldReceive('setOpposingAccounts')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('setLimit')->andReturnSelf(); $collector->shouldReceive('setLimit')->andReturnSelf();
$collector->shouldReceive('setPage')->andReturnSelf(); $collector->shouldReceive('setPage')->andReturnSelf();
$collector->shouldReceive('setTypes')->andReturnSelf(); $collector->shouldReceive('setTypes')->andReturnSelf();
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$revenue = $this->getRandomAsset();
// test API // test API
$response = $this->get(route('api.v1.accounts.transactions', [$revenue->id])); $response = $this->get(route('api.v1.accounts.transactions', [$revenue->id]));
$response->assertStatus(200); $response->assertStatus(200);
@ -601,19 +580,19 @@ class AccountControllerTest extends TestCase
*/ */
public function testTransactionsRange(): void public function testTransactionsRange(): void
{ {
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$accountRepos->shouldReceive('setUser'); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$accountRepos->shouldReceive('getAccountsByType')
->andReturn($this->user()->accounts()->where('account_type_id', 3)->get());
$asset = $this->getRandomAsset();
$repository = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $transformer = $this->mock(TransactionTransformer::class);
$repository->shouldReceive('setUser');
$currencyRepository->shouldReceive('setUser'); // default mocks
$accountRepos->shouldReceive('setUser')->atLeast()->once();
$currencyRepository->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue(); $accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue();
// mock collector:
$paginator = new LengthAwarePaginator(new Collection, 0, 50);
$collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('setUser')->andReturnSelf();
$collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf();
$collector->shouldReceive('withCategoryInformation')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf();
@ -624,12 +603,11 @@ class AccountControllerTest extends TestCase
$collector->shouldReceive('setPage')->andReturnSelf(); $collector->shouldReceive('setPage')->andReturnSelf();
$collector->shouldReceive('setTypes')->andReturnSelf(); $collector->shouldReceive('setTypes')->andReturnSelf();
$collector->shouldReceive('setRange')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf();
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
// mock calls to transformer:
// mock some calls: $transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$asset = $this->getRandomAsset();
// test API // test API
$response = $this->get(route('api.v1.accounts.transactions', [$asset->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])); $response = $this->get(route('api.v1.accounts.transactions', [$asset->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31']));
@ -651,40 +629,35 @@ class AccountControllerTest extends TestCase
// mock repositories // mock repositories
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('update')->once(); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->once(); $repository->shouldReceive('update')->atLeast()->once();
$repository->shouldReceive('getOpeningBalanceAmount')->andReturn('10'); $currencyRepos->shouldReceive('findByCodeNull')->andReturn(null);
$repository->shouldReceive('getOpeningBalanceDate')->andReturn('2018-01-01');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset'); // mock calls to transformer:
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1'); $transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1'); $transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC'); $transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello'); $transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once(); $transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->once();
$account = $this->user()->accounts()->first();
$account = $this->getRandomAsset();
// data to submit // data to submit
$data = [ $data = [
'name' => $account->name, 'name' => $account->name,
'currency_id' => 1, 'type' => 'asset',
'type' => 'asset', 'account_role' => 'defaultAsset',
'active' => 1,
'include_net_worth' => 1,
'account_role' => 'defaultAsset',
]; ];
// test API // test API
$response = $this->put('/api/v1/accounts/' . $account->id, $data, ['Accept' => 'application/json']); $response = $this->put(route('api.v1.accounts.update', [$account->id]), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]); $response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($account->name);
} }
/** /**
@ -698,41 +671,36 @@ class AccountControllerTest extends TestCase
// mock repositories // mock repositories
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('update')->once(); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->once(); $repository->shouldReceive('update')->atLeast()->once();
$repository->shouldReceive('getOpeningBalanceAmount')->andReturn('10');
$repository->shouldReceive('getOpeningBalanceDate')->andReturn('2018-01-01');
$currencyRepos->shouldReceive('findByCodeNull')->andReturn(TransactionCurrency::find(1)); $currencyRepos->shouldReceive('findByCodeNull')->andReturn(TransactionCurrency::find(1));
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset'); // mock calls to transformer:
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1'); $transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1'); $transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC'); $transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello'); $transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once(); $transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->once();
$account = $this->user()->accounts()->first();
$account = $this->getRandomAsset();
// data to submit // data to submit
$data = [ $data = [
'name' => $account->name, 'name' => $account->name,
'currency_code' => 'EUR', 'type' => 'asset',
'type' => 'asset', 'currency_code' => 'EUR',
'active' => 1, 'account_role' => 'defaultAsset',
'include_net_worth' => 1,
'account_role' => 'defaultAsset',
]; ];
// test API // test API
$response = $this->put('/api/v1/accounts/' . $account->id, $data, ['Accept' => 'application/json']); $response = $this->put(route('api.v1.accounts.update', [$account->id]), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]); $response->assertJson(['data' => ['type' => 'accounts', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($account->name);
} }

View File

@ -29,6 +29,7 @@ use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Transformers\AttachmentTransformer;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
use Tests\TestCase; use Tests\TestCase;
@ -59,15 +60,16 @@ class AttachmentControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('destroy')->once()->andReturn(true); $repository->shouldReceive('destroy')->once()->andReturn(true);
// get attachment: // get attachment:
$attachment = $this->user()->attachments()->first(); $attachment = $this->user()->attachments()->first();
// call API // call API
$response = $this->delete('/api/v1/attachments/' . $attachment->id); $response = $this->delete(route('api.v1.attachments.delete', [$attachment->id]));
$response->assertStatus(204); $response->assertStatus(204);
} }
@ -81,10 +83,11 @@ class AttachmentControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
$content = 'Attachment content ' . random_int(100, 1000); $content = 'Attachment content ' . random_int(100, 1000);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('exists')->andReturn(true)->once(); $repository->shouldReceive('exists')->andReturn(true)->once();
$repository->shouldReceive('getContent')->andReturn($content)->once(); $repository->shouldReceive('getContent')->andReturn($content)->once();
@ -92,7 +95,7 @@ class AttachmentControllerTest extends TestCase
$attachment = $this->user()->attachments()->first(); $attachment = $this->user()->attachments()->first();
// call API // call API
$response = $this->get('/api/v1/attachments/' . $attachment->id . '/download'); $response = $this->get(route('api.v1.attachments.download', [$attachment->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($content); $response->assertSee($content);
@ -109,17 +112,18 @@ class AttachmentControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
$content = 'Attachment content ' . random_int(100, 1000); $content = 'Attachment content ' . random_int(100, 1000);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('exists')->andReturn(false)->once(); $repository->shouldReceive('exists')->andReturn(false)->once();
// get attachment: // get attachment:
$attachment = $this->user()->attachments()->first(); $attachment = $this->user()->attachments()->first();
// call API // call API
$response = $this->get('/api/v1/attachments/' . $attachment->id . '/download'); $response = $this->get(route('api.v1.attachments.download', [$attachment->id]));
$response->assertStatus(500); $response->assertStatus(500);
$response->assertSee('Could not find the indicated attachment. The file is no longer there.'); $response->assertSee('Could not find the indicated attachment. The file is no longer there.');
@ -135,9 +139,10 @@ class AttachmentControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
// create attachment // create attachment
$attachment = Attachment::create( $attachment = Attachment::create(
@ -155,7 +160,7 @@ class AttachmentControllerTest extends TestCase
); );
// call API // call API
$response = $this->get('/api/v1/attachments/' . $attachment->id . '/download'); $response = $this->get(route('api.v1.attachments.download', [$attachment->id]));
$response->assertStatus(500); $response->assertStatus(500);
$response->assertSee('No file has been uploaded for this attachment (yet).'); $response->assertSee('No file has been uploaded for this attachment (yet).');
@ -174,15 +179,21 @@ class AttachmentControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('get')->once()->andReturn($attachments); $repository->shouldReceive('get')->once()->andReturn($attachments);
$repository->shouldReceive('getNoteText')->andReturn('Hi There');
// test API // test API
$response = $this->get('/api/v1/attachments'); $response = $this->get(route('api.v1.attachments.index'));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => [],]); $response->assertJson(['data' => [],]);
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]);
@ -203,17 +214,23 @@ class AttachmentControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getNoteText')->andReturn('Hi There');
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// test API // test API
$response = $this->get('/api/v1/attachments/' . $attachment->id); $response = $this->get(route('api.v1.attachments.show', [$attachment->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'attachments', 'links' => true],]); $response->assertJson(['data' => ['type' => 'attachments', 'links' => true],]);
$response->assertSee($attachment->filename); // attachment file name
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -233,7 +250,14 @@ class AttachmentControllerTest extends TestCase
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
@ -252,10 +276,9 @@ class AttachmentControllerTest extends TestCase
// test API // test API
$response = $this->post('/api/v1/attachments', $data); $response = $this->post(route('api.v1.attachments.store'), $data);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'attachments', 'links' => true],]); $response->assertJson(['data' => ['type' => 'attachments', 'links' => true],]);
$response->assertSee($attachment->filename); // the file name.
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -270,6 +293,14 @@ class AttachmentControllerTest extends TestCase
// mock repositories // mock repositories
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
/** @var Attachment $attachment */ /** @var Attachment $attachment */
@ -288,11 +319,10 @@ class AttachmentControllerTest extends TestCase
]; ];
// test API // test API
$response = $this->put('/api/v1/attachments/' . $attachment->id, $data, ['Accept' => 'application/json']); $response = $this->put(route('api.v1.attachments.update', [$attachment->id]), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'attachments', 'links' => true],]); $response->assertJson(['data' => ['type' => 'attachments', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($attachment->description);
} }
@ -306,6 +336,7 @@ class AttachmentControllerTest extends TestCase
{ {
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -316,7 +347,7 @@ class AttachmentControllerTest extends TestCase
$helper = $this->mock(AttachmentHelperInterface::class); $helper = $this->mock(AttachmentHelperInterface::class);
$helper->shouldReceive('saveAttachmentFromApi')->once(); $helper->shouldReceive('saveAttachmentFromApi')->once();
$response = $this->call('POST', '/api/v1/attachments/' . $attachment->id . '/upload', [], [], [], [], $content); $response = $this->call('POST', route('api.v1.attachments.upload', [$attachment->id]), [], [], [], [], $content);
//$response = $this->post('/api/v1/attachments/' . $attachment->id . '/upload',$content, ['Accept' => 'application/json']); //$response = $this->post('/api/v1/attachments/' . $attachment->id . '/upload',$content, ['Accept' => 'application/json']);
$response->assertStatus(204); $response->assertStatus(204);
} }

View File

@ -28,6 +28,7 @@ use FireflyIII\Models\AvailableBudget;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Transformers\AvailableBudgetTransformer;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
use Tests\TestCase; use Tests\TestCase;
@ -58,16 +59,17 @@ class AvailableBudgetControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AvailableBudgetTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('destroyAvailableBudget')->once()->andReturn(true); $repository->shouldReceive('destroyAvailableBudget')->once()->andReturn(true);
// get available budget: // get available budget:
$availableBudget = $this->user()->availableBudgets()->first(); $availableBudget = $this->user()->availableBudgets()->first();
// call API // call API
$response = $this->delete('/api/v1/available_budgets/' . $availableBudget->id); $response = $this->delete(route('api.v1.available_budgets.delete', [$availableBudget->id]));
$response->assertStatus(204); $response->assertStatus(204);
} }
@ -82,13 +84,21 @@ class AvailableBudgetControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AvailableBudgetTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getAvailableBudgets')->once()->andReturn($availableBudgets); $repository->shouldReceive('getAvailableBudgets')->once()->andReturn($availableBudgets);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// call API // call API
$response = $this->get('/api/v1/available_budgets'); $response = $this->get(route('api.v1.available_budgets.index'));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($availableBudgets->first()->id); $response->assertSee($availableBudgets->first()->id);
} }
@ -104,12 +114,20 @@ class AvailableBudgetControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AvailableBudgetTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// call API // call API
$response = $this->get('/api/v1/available_budgets/' . $availableBudget->id); $response = $this->get(route('api.v1.available_budgets.show', [$availableBudget->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($availableBudget->id); $response->assertSee($availableBudget->id);
} }
@ -122,15 +140,20 @@ class AvailableBudgetControllerTest extends TestCase
*/ */
public function testStore(): void public function testStore(): void
{ {
/** @var AvailableBudget $availableBudget */
$availableBudget = $this->user()->availableBudgets()->first();
// mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AvailableBudgetTransformer::class);
$availableBudget = new AvailableBudget;
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('setAvailableBudget')->once()->andReturn($availableBudget); $repository->shouldReceive('setAvailableBudget')->once()->andReturn($availableBudget);
$currencyRepository->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::find(1)); $currencyRepository->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::find(1));
@ -138,16 +161,15 @@ class AvailableBudgetControllerTest extends TestCase
$data = [ $data = [
'currency_id' => '1', 'currency_id' => '1',
'amount' => '100', 'amount' => '100',
'start_date' => '2018-01-01', 'start' => '2018-01-01',
'end_date' => '2018-01-31', 'end' => '2018-01-31',
]; ];
// test API // test API
$response = $this->post('/api/v1/available_budgets', $data); $response = $this->post(route('api.v1.available_budgets.store'), $data);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'available_budgets', 'links' => true],]); $response->assertJson(['data' => ['type' => 'available_budgets', 'links' => true],]);
$response->assertSee($availableBudget->amount); // the amount
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -162,27 +184,36 @@ class AvailableBudgetControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AvailableBudgetTransformer::class);
$availableBudget = new AvailableBudget;
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$currencyRepository->shouldReceive('findNull')->withArgs([1])->andReturn(null)->once(); $currencyRepository->shouldReceive('findNull')->withArgs([1])->andReturn(null)->once();
$currencyRepository->shouldReceive('findByCodeNull')->withArgs(['EUR'])->andReturn(null)->once(); $currencyRepository->shouldReceive('findByCodeNull')->withArgs(['EUR'])->andReturn(null)->once();
$repository->shouldReceive('setAvailableBudget')->once()->andReturn($availableBudget);
// data to submit // data to submit
$data = [ $data = [
'currency_id' => '1', 'currency_id' => '1',
'currency_code' => 'EUR', 'currency_code' => 'EUR',
'amount' => '100', 'amount' => '100',
'start_date' => '2018-01-01', 'start' => '2018-01-01',
'end_date' => '2018-01-31', 'end' => '2018-01-31',
]; ];
// test API // test API
$response = $this->post('/api/v1/available_budgets', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.available_budgets.store'), $data);
$response->assertStatus(500); $response->assertStatus(200);
$response->assertSee('Could not find the indicated currency.'); // the amount $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertHeader('Content-Type', 'application/json');
} }
/** /**
@ -199,6 +230,14 @@ class AvailableBudgetControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AvailableBudgetTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -211,16 +250,15 @@ class AvailableBudgetControllerTest extends TestCase
'currency_id' => '1', 'currency_id' => '1',
'currency_code' => 'EUR', 'currency_code' => 'EUR',
'amount' => '100', 'amount' => '100',
'start_date' => '2018-01-01', 'start' => '2018-01-01',
'end_date' => '2018-01-31', 'end' => '2018-01-31',
]; ];
// test API // test API
$response = $this->post('/api/v1/available_budgets', $data); $response = $this->post(route('api.v1.available_budgets.store'), $data);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'available_budgets', 'links' => true],]); $response->assertJson(['data' => ['type' => 'available_budgets', 'links' => true],]);
$response->assertSee($availableBudget->amount); // the amount
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -236,6 +274,14 @@ class AvailableBudgetControllerTest extends TestCase
// mock repositories // mock repositories
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(AvailableBudgetTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
/** @var AvailableBudget $availableBudget */ /** @var AvailableBudget $availableBudget */
$availableBudget = $this->user()->availableBudgets()->first(); $availableBudget = $this->user()->availableBudgets()->first();
@ -249,16 +295,15 @@ class AvailableBudgetControllerTest extends TestCase
$data = [ $data = [
'currency_id' => '1', 'currency_id' => '1',
'amount' => '100', 'amount' => '100',
'start_date' => '2018-01-01', 'start' => '2018-01-01',
'end_date' => '2018-01-31', 'end' => '2018-01-31',
]; ];
// test API // test API
$response = $this->put('/api/v1/available_budgets/' . $availableBudget->id, $data, ['Accept' => 'application/json']); $response = $this->put(route('api.v1.available_budgets.update', $availableBudget->id), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'available_budgets', 'links' => true],]); $response->assertJson(['data' => ['type' => 'available_budgets', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($availableBudget->amount);
} }

View File

@ -25,13 +25,15 @@ namespace Tests\Api\V1\Controllers;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Models\Attachment;
use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\BillTransformer;
use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -62,25 +64,26 @@ class BillControllerTest extends TestCase
public function testAttachments(): void public function testAttachments(): void
{ {
// create stuff // create stuff
$attachments = factory(Attachment::class, 10)->create(); $bill = $this->user()->bills()->first();
$bill = $this->user()->bills()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(AttachmentRepositoryInterface::class); $repository = $this->mock(AttachmentRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$billRepos = $this->mock(BillRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $billRepos->shouldReceive('setUser')->atLeast()->once();
$billRepos->shouldReceive('setUser'); $billRepos->shouldReceive('getAttachments')->once()->andReturn(new Collection);
$billRepos->shouldReceive('getAttachments')->once()->andReturn($attachments);
$repository->shouldReceive('getNoteText')->andReturn('Hi There');
// test API // test API
$response = $this->get(route('api.v1.bills.attachments', [$bill->id])); $response = $this->get(route('api.v1.bills.attachments', [$bill->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => [],]); $response->assertJson(['data' => [],]);
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]);
$response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -93,7 +96,8 @@ class BillControllerTest extends TestCase
public function testDelete(): void public function testDelete(): void
{ {
// mock stuff: // mock stuff:
$repository = $this->mock(BillRepositoryInterface::class); $repository = $this->mock(BillRepositoryInterface::class);
$transformer = $this->mock(BillTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -103,7 +107,7 @@ class BillControllerTest extends TestCase
$bill = $this->user()->bills()->first(); $bill = $this->user()->bills()->first();
// call API // call API
$response = $this->delete('/api/v1/bills/' . $bill->id); $response = $this->delete(route('api.v1.bills.delete', [$bill->id]));
$response->assertStatus(204); $response->assertStatus(204);
} }
@ -115,22 +119,22 @@ class BillControllerTest extends TestCase
public function testIndex(): void public function testIndex(): void
{ {
// create stuff // create stuff
$bills = factory(Bill::class, 10)->create(); $paginator = new LengthAwarePaginator(new Collection, 0, 50, 1);
$paginator = new LengthAwarePaginator($bills, 10, 50, 1); $repository = $this->mock(BillRepositoryInterface::class);
// mock stuff: $transformer = $this->mock(BillTransformer::class);
$repository = $this->mock(BillRepositoryInterface::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getPaginator')->withAnyArgs()->andReturn($paginator)->once(); $repository->shouldReceive('getPaginator')->withAnyArgs()->andReturn($paginator)->once();
$repository->shouldReceive('getRulesForBill')->withAnyArgs()->andReturn(new Collection());
$repository->shouldReceive('getNoteText')->andReturn('Hi there'); // mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// test API // test API
$response = $this->get('/api/v1/bills'); $response = $this->get(route('api.v1.bills.index'));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => [],]); $response->assertJson(['data' => [],]);
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]);
$response->assertJson( $response->assertJson(
['links' => ['self' => true, 'first' => true, 'last' => true,],] ['links' => ['self' => true, 'first' => true, 'last' => true,],]
); );
@ -142,16 +146,18 @@ class BillControllerTest extends TestCase
*/ */
public function testRules(): void public function testRules(): void
{ {
$rules = $this->user()->rules()->get(); $bill = $this->user()->bills()->first();
$bill = $this->user()->bills()->first(); $billRepos = $this->mock(BillRepositoryInterface::class);
$billRepos = $this->mock(BillRepositoryInterface::class); $transformer = $this->mock(RuleTransformer::class);
$billRepos->shouldReceive('setUser')->once();
$billRepos->shouldReceive('getRulesForBill')->once()->andReturn($rules); // mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$billRepos->shouldReceive('setUser')->atLeast()->once();
$billRepos->shouldReceive('getRulesForBill')->atLeast()->once()->andReturn(new Collection);
// call API // call API
$response = $this->get(route('api.v1.bills.rules', [$bill->id])); $response = $this->get(route('api.v1.bills.rules', [$bill->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($rules->first()->title);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -163,20 +169,25 @@ class BillControllerTest extends TestCase
public function testShow(): void public function testShow(): void
{ {
// create stuff // create stuff
$bill = $this->user()->bills()->first(); $bill = $this->user()->bills()->first();
$repository = $this->mock(BillRepositoryInterface::class); $repository = $this->mock(BillRepositoryInterface::class);
$transformer = $this->mock(BillTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$repository->shouldReceive('getRulesForBill')->withAnyArgs()->andReturn(new Collection());
$repository->shouldReceive('getNoteText')->andReturn('Hi there');
// test API // test API
$response = $this->get('/api/v1/bills/' . $bill->id); $response = $this->get(route('api.v1.bills.show', [$bill->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson( $response->assertJson(
['data' => [ ['data' => [
'type' => 'bills', 'type' => 'bills',
'id' => $bill->id,
],] ],]
); );
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -191,13 +202,13 @@ class BillControllerTest extends TestCase
public function testStoreMinOverMax(): void public function testStoreMinOverMax(): void
{ {
// create stuff // create stuff
$bill = $this->user()->bills()->first(); $bill = $this->user()->bills()->first();
$repository = $this->mock(BillRepositoryInterface::class); $repository = $this->mock(BillRepositoryInterface::class);
$transformer = $this->mock(BillTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('store')->andReturn($bill); $repository->shouldReceive('store')->andReturn($bill);
$repository->shouldReceive('getNoteText')->andReturn('Hi there');
// data to submit: // data to submit:
$data = [ $data = [
@ -215,7 +226,7 @@ class BillControllerTest extends TestCase
]; ];
// test API // test API
$response = $this->post('/api/v1/bills', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.bills.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(422); $response->assertStatus(422);
$response->assertExactJson( $response->assertExactJson(
[ [
@ -237,14 +248,21 @@ class BillControllerTest extends TestCase
public function testStoreValid(): void public function testStoreValid(): void
{ {
// create stuff // create stuff
$bill = $this->user()->bills()->first(); $bill = $this->user()->bills()->first();
$repository = $this->mock(BillRepositoryInterface::class); $repository = $this->mock(BillRepositoryInterface::class);
$transformer = $this->mock(BillTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->times(2); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('store')->andReturn($bill); $repository->shouldReceive('store')->andReturn($bill);
$repository->shouldReceive('getNoteText')->andReturn('Hi there');
$repository->shouldReceive('getRulesForBill')->withAnyArgs()->andReturn(new Collection());
// data to submit: // data to submit:
$data = [ $data = [
'name' => 'New bill #' . random_int(1, 10000), 'name' => 'New bill #' . random_int(1, 10000),
@ -261,11 +279,10 @@ class BillControllerTest extends TestCase
]; ];
// test API // test API
$response = $this->post('/api/v1/bills', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.bills.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'bills', 'links' => true],]); $response->assertJson(['data' => ['type' => 'bills', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($bill->name);
} }
/** /**
@ -281,6 +298,7 @@ class BillControllerTest extends TestCase
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$billRepos = $this->mock(BillRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $paginator = new LengthAwarePaginator(new Collection, 0, 50);
$billRepos->shouldReceive('setUser'); $billRepos->shouldReceive('setUser');
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -297,6 +315,9 @@ class BillControllerTest extends TestCase
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock some calls: // mock some calls:
@ -321,6 +342,7 @@ class BillControllerTest extends TestCase
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$billRepos = $this->mock(BillRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $paginator = new LengthAwarePaginator(new Collection, 0, 50);
$billRepos->shouldReceive('setUser'); $billRepos->shouldReceive('setUser');
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -338,6 +360,9 @@ class BillControllerTest extends TestCase
$collector->shouldReceive('setTypes')->andReturnSelf(); $collector->shouldReceive('setTypes')->andReturnSelf();
$collector->shouldReceive('setRange')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
@ -362,14 +387,13 @@ class BillControllerTest extends TestCase
public function testUpdateValid(): void public function testUpdateValid(): void
{ {
// create stuff // create stuff
$bill = $this->user()->bills()->first(); $bill = $this->user()->bills()->first();
$repository = $this->mock(BillRepositoryInterface::class); $repository = $this->mock(BillRepositoryInterface::class);
$transformer = $this->mock(BillTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atleast()->times(2); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getNoteText')->andReturn('Hi there');
$repository->shouldReceive('update')->andReturn($bill); $repository->shouldReceive('update')->andReturn($bill);
$repository->shouldReceive('getRulesForBill')->withAnyArgs()->andReturn(new Collection());
// data to submit: // data to submit:
$data = [ $data = [
'name' => 'New bill #' . random_int(1, 10000), 'name' => 'New bill #' . random_int(1, 10000),
@ -384,12 +408,18 @@ class BillControllerTest extends TestCase
'currency_id' => 1, 'currency_id' => 1,
]; ];
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// test API // test API
$response = $this->put('/api/v1/bills/' . $bill->id, $data, ['Accept' => 'application/json']); $response = $this->put(route('api.v1.bills.update', [$bill->id]), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'bills', 'links' => true],]); $response->assertJson(['data' => ['type' => 'bills', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($bill->name);
} }
} }

View File

@ -32,6 +32,9 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Transformers\BudgetLimitTransformer;
use FireflyIII\Transformers\BudgetTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -61,18 +64,18 @@ class BudgetControllerTest extends TestCase
*/ */
public function testBudgetLimits(): void public function testBudgetLimits(): void
{ {
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
$budgetLimits = BudgetLimit::get(); $repository = $this->mock(BudgetRepositoryInterface::class);
$repository = $this->mock(BudgetRepositoryInterface::class); $transformer = $this->mock(BudgetLimitTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once()->atLeast()->once();
$repository->shouldReceive('getBudgetLimits')->once()->andReturn($budgetLimits); $repository->shouldReceive('getBudgetLimits')->once()->andReturn(new Collection());
$transformer->shouldReceive('setParameters')->atLeast()->once();
// call API // call API
$response = $this->get(route('api.v1.budgets.budget_limits', [$budget->id])); $response = $this->get(route('api.v1.budgets.budget_limits', [$budget->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee('budget_limits');
} }
/** /**
@ -86,14 +89,14 @@ class BudgetControllerTest extends TestCase
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('destroy')->once()->andReturn(true); $repository->shouldReceive('destroy')->once()->andReturn(true);
// get budget: // get budget:
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
// call API // call API
$response = $this->delete('/api/v1/budgets/' . $budget->id); $response = $this->delete(route('api.v1.budgets.delete', [$budget->id]));
$response->assertStatus(204); $response->assertStatus(204);
} }
@ -104,18 +107,17 @@ class BudgetControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
$budgets = $this->user()->budgets()->get(); $repository = $this->mock(BudgetRepositoryInterface::class);
// mock stuff: $transformer = $this->mock(BudgetTransformer::class);
$repository = $this->mock(BudgetRepositoryInterface::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getBudgets')->once()->andReturn($budgets); $repository->shouldReceive('getBudgets')->once()->andReturn(new Collection);
$transformer->shouldReceive('setParameters')->atLeast()->once();
// call API // call API
$response = $this->get('/api/v1/budgets'); $response = $this->get(route('api.v1.budgets.index'));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($budgets->first()->name);
} }
/** /**
@ -125,17 +127,23 @@ class BudgetControllerTest extends TestCase
*/ */
public function testShow(): void public function testShow(): void
{ {
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
// mock stuff: $repository = $this->mock(BudgetRepositoryInterface::class);
$repository = $this->mock(BudgetRepositoryInterface::class); $transformer = $this->mock(BudgetTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// call API // call API
$response = $this->get('/api/v1/budgets/' . $budget->id); $response = $this->get(route('api.v1.budgets.show', [$budget->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($budget->name);
} }
/** /**
@ -147,26 +155,32 @@ class BudgetControllerTest extends TestCase
public function testStore(): void public function testStore(): void
{ {
/** @var Budget $budget */ /** @var Budget $budget */
$budget = $this->user()->budgets()->first(); $budget = new Budget;
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(BudgetTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('store')->once()->andReturn($budget); $repository->shouldReceive('store')->once()->andReturn($budget);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// data to submit // data to submit
$data = [ $data = [
'name' => 'Some budget', 'name' => 'Some budget',
'active' => '1',
]; ];
// test API // test API
$response = $this->post('/api/v1/budgets', $data); $response = $this->post(route('api.v1.budgets.store'), $data);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'budgets', 'links' => true],]); $response->assertJson(['data' => ['type' => 'budgets', 'links' => true],]);
$response->assertSee($budget->name); // the amount
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -179,14 +193,7 @@ class BudgetControllerTest extends TestCase
public function testStoreBudgetLimit(): void public function testStoreBudgetLimit(): void
{ {
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
$budgetLimit = BudgetLimit::create( $budgetLimit = new BudgetLimit;
[
'budget_id' => $budget->id,
'start_date' => '2018-01-01',
'end_date' => '2018-01-31',
'amount' => 1,
]
);
$data $data
= [ = [
'budget_id' => $budget->id, 'budget_id' => $budget->id,
@ -196,8 +203,16 @@ class BudgetControllerTest extends TestCase
]; ];
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(BudgetLimitTransformer::class);
$repository->shouldReceive('storeBudgetLimit')->andReturn($budgetLimit)->once(); $repository->shouldReceive('storeBudgetLimit')->andReturn($budgetLimit)->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -224,6 +239,11 @@ class BudgetControllerTest extends TestCase
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$billRepos = $this->mock(BillRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $paginator = new LengthAwarePaginator(new Collection, 0, 50);
$billRepos->shouldReceive('setUser'); $billRepos->shouldReceive('setUser');
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -265,6 +285,11 @@ class BudgetControllerTest extends TestCase
$billRepos = $this->mock(BillRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $paginator = new LengthAwarePaginator(new Collection, 0, 50);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$billRepos->shouldReceive('setUser'); $billRepos->shouldReceive('setUser');
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$currencyRepository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser');
@ -302,13 +327,20 @@ class BudgetControllerTest extends TestCase
{ {
// mock repositories // mock repositories
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(BudgetTransformer::class);
/** @var Budget $budget */ /** @var Budget $budget */
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$repository->shouldReceive('update')->once()->andReturn($budget); $repository->shouldReceive('update')->once()->andReturn(new Budget);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// data to submit // data to submit
$data = [ $data = [
@ -317,11 +349,10 @@ class BudgetControllerTest extends TestCase
]; ];
// test API // test API
$response = $this->put('/api/v1/budgets/' . $budget->id, $data, ['Accept' => 'application/json']); $response = $this->put(route('api.v1.budgets.update', $budget->id), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'budgets', 'links' => true],]); $response->assertJson(['data' => ['type' => 'budgets', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($budget->name);
} }
} }

View File

@ -32,6 +32,8 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Transformers\BudgetLimitTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -60,7 +62,9 @@ class BudgetLimitControllerTest extends TestCase
public function testDelete(): void public function testDelete(): void
{ {
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(BudgetLimitTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -79,7 +83,7 @@ class BudgetLimitControllerTest extends TestCase
); );
// call API // call API
$response = $this->delete('/api/v1/budgets/limits/' . $budgetLimit->id); $response = $this->delete(route('api.v1.budget_limits.delete', $budgetLimit->id));
$response->assertStatus(204); $response->assertStatus(204);
} }
@ -93,18 +97,20 @@ class BudgetLimitControllerTest extends TestCase
/** @var Budget $budget */ /** @var Budget $budget */
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(BudgetLimitTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('findNull')->andReturn($budget); $repository->shouldReceive('findNull')->andReturn($budget);
$repository->shouldReceive('getBudgetLimits')->once()->andReturn($budget->budgetlimits()->get()); $repository->shouldReceive('getBudgetLimits')->once()->andReturn(new Collection);
// call API // call API
$params = [ $params = ['budget_id' => $budget->id,];
'budget_id' => $budget->id, $response = $this->get(route('api.v1.budget_limits.index') . '?' . http_build_query($params));
];
$response = $this->get('/api/v1/budgets/limits?' . http_build_query($params));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -119,19 +125,23 @@ class BudgetLimitControllerTest extends TestCase
/** @var Budget $budget */ /** @var Budget $budget */
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(BudgetLimitTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('findNull')->andReturn(null); $repository->shouldReceive('findNull')->andReturn(null);
$repository->shouldReceive('getAllBudgetLimits')->once()->andReturn($budget->budgetlimits()->get()); $repository->shouldReceive('getAllBudgetLimits')->once()->andReturn(new Collection);
// call API // call API
$params = [ $params = [
'start' => '2018-01-01', 'start' => '2018-01-01',
'end' => '2018-01-31', 'end' => '2018-01-31',
]; ];
$uri = '/api/v1/budgets/limits?' . http_build_query($params); $uri = route('api.v1.budget_limits.index') . '?' . http_build_query($params);
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -147,12 +157,16 @@ class BudgetLimitControllerTest extends TestCase
/** @var Budget $budget */ /** @var Budget $budget */
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(BudgetLimitTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('findNull')->andReturn($budget); $repository->shouldReceive('findNull')->andReturn($budget);
$repository->shouldReceive('getBudgetLimits')->once()->andReturn($budget->budgetlimits()->get()); $repository->shouldReceive('getBudgetLimits')->once()->andReturn(new Collection);
// call API // call API
$params = [ $params = [
@ -160,7 +174,7 @@ class BudgetLimitControllerTest extends TestCase
'start' => '2018-01-01', 'start' => '2018-01-01',
'end' => '2018-01-31', 'end' => '2018-01-31',
]; ];
$response = $this->get('/api/v1/budgets/limits?' . http_build_query($params)); $response = $this->get(route('api.v1.budget_limits.index') . '?' . http_build_query($params));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -171,7 +185,15 @@ class BudgetLimitControllerTest extends TestCase
public function testShow(): void public function testShow(): void
{ {
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(BudgetLimitTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -189,7 +211,7 @@ class BudgetLimitControllerTest extends TestCase
); );
$response = $this->get('/api/v1/budgets/limits/' . $budgetLimit->id); $response = $this->get(route('api.v1.budget_limits.show', $budgetLimit->id));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -203,6 +225,14 @@ class BudgetLimitControllerTest extends TestCase
public function testStore(): void public function testStore(): void
{ {
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
$transformer = $this->mock(BudgetLimitTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$budgetLimit = BudgetLimit::create( $budgetLimit = BudgetLimit::create(
[ [
'budget_id' => $budget->id, 'budget_id' => $budget->id,
@ -228,7 +258,7 @@ class BudgetLimitControllerTest extends TestCase
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
// call API // call API
$response = $this->post('/api/v1/budgets/limits', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.budget_limits.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -251,13 +281,13 @@ class BudgetLimitControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$repository->shouldReceive('findNull')->andReturn(null)->once(); $repository->shouldReceive('findNull')->andReturn(null)->once();
$transformer = $this->mock(BudgetLimitTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
// call API // call API
$response = $this->post('/api/v1/budgets/limits', $data); $response = $this->post(route('api.v1.budget_limits.store'), $data);
$response->assertStatus(500); $response->assertStatus(500);
$response->assertSee('Unknown budget.'); $response->assertSee('Unknown budget.');
} }
@ -276,6 +306,7 @@ class BudgetLimitControllerTest extends TestCase
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$billRepos = $this->mock(BillRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $paginator = new LengthAwarePaginator(new Collection, 0, 50);
$billRepos->shouldReceive('setUser'); $billRepos->shouldReceive('setUser');
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -294,7 +325,8 @@ class BudgetLimitControllerTest extends TestCase
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock some calls: // mock some calls:
// test API // test API
@ -314,6 +346,7 @@ class BudgetLimitControllerTest extends TestCase
*/ */
public function testUpdate(): void public function testUpdate(): void
{ {
$transformer= $this->mock(BudgetLimitTransformer::class);
$budget = $this->user()->budgets()->first(); $budget = $this->user()->budgets()->first();
$budgetLimit = BudgetLimit::create( $budgetLimit = BudgetLimit::create(
[ [
@ -333,7 +366,12 @@ class BudgetLimitControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$repository->shouldReceive('updateBudgetLimit')->andReturn($budgetLimit)->once(); $repository->shouldReceive('updateBudgetLimit')->andReturn($budgetLimit)->once();
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();

View File

@ -31,6 +31,8 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Transformers\CategoryTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -71,7 +73,7 @@ class CategoryControllerTest extends TestCase
$category = $this->user()->categories()->first(); $category = $this->user()->categories()->first();
// call API // call API
$response = $this->delete('/api/v1/categories/' . $category->id); $response = $this->delete(route('api.v1.categories.delete', $category->id));
$response->assertStatus(204); $response->assertStatus(204);
} }
@ -82,18 +84,19 @@ class CategoryControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
$categories = $this->user()->categories()->get(); $repository = $this->mock(CategoryRepositoryInterface::class);
// mock stuff: $transformer = $this->mock(CategoryTransformer::class);
$repository = $this->mock(CategoryRepositoryInterface::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getCategories')->once()->andReturn($categories); $repository->shouldReceive('getCategories')->once()->andReturn(new Collection);
// call API // call API
$response = $this->get('/api/v1/categories'); $response = $this->get(route('api.v1.categories.index'));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($categories->first()->name);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -106,15 +109,21 @@ class CategoryControllerTest extends TestCase
{ {
$category = $this->user()->categories()->first(); $category = $this->user()->categories()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(CategoryRepositoryInterface::class); $repository = $this->mock(CategoryRepositoryInterface::class);
$transformer = $this->mock(CategoryTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// call API // call API
$response = $this->get('/api/v1/categories/' . $category->id); $response = $this->get(route('api.v1.categories.show', [$category->id]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($category->name);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -130,7 +139,15 @@ class CategoryControllerTest extends TestCase
$category = $this->user()->categories()->first(); $category = $this->user()->categories()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(CategoryRepositoryInterface::class); $repository = $this->mock(CategoryRepositoryInterface::class);
$transformer = $this->mock(CategoryTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -143,10 +160,9 @@ class CategoryControllerTest extends TestCase
]; ];
// test API // test API
$response = $this->post('/api/v1/categories', $data); $response = $this->post(route('api.v1.categories.store'), $data);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'categories', 'links' => true],]); $response->assertJson(['data' => ['type' => 'categories', 'links' => true],]);
$response->assertSee($category->name); // the amount
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -158,6 +174,7 @@ class CategoryControllerTest extends TestCase
public function testTransactionsBasic(): void public function testTransactionsBasic(): void
{ {
$category = $this->user()->categories()->first(); $category = $this->user()->categories()->first();
$transformer = $this->mock(TransactionTransformer::class);
$repository = $this->mock(JournalRepositoryInterface::class); $repository = $this->mock(JournalRepositoryInterface::class);
$categoryRepos = $this->mock(CategoryRepositoryInterface::class); $categoryRepos = $this->mock(CategoryRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
@ -183,7 +200,8 @@ class CategoryControllerTest extends TestCase
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
// mock some calls: // mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// test API // test API
$response = $this->get(route('api.v1.categories.transactions', [$category->id])); $response = $this->get(route('api.v1.categories.transactions', [$category->id]));
@ -208,6 +226,7 @@ class CategoryControllerTest extends TestCase
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
$billRepos = $this->mock(BillRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class);
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $paginator = new LengthAwarePaginator(new Collection, 0, 50);
$transformer = $this->mock(TransactionTransformer::class);
$categoryRepos->shouldReceive('setUser')->atLeast()->once(); $categoryRepos->shouldReceive('setUser')->atLeast()->once();
$billRepos->shouldReceive('setUser'); $billRepos->shouldReceive('setUser');
@ -226,6 +245,9 @@ class CategoryControllerTest extends TestCase
$collector->shouldReceive('setRange')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf();
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$response = $this->get( $response = $this->get(
route('api.v1.categories.transactions', [$category->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31']) route('api.v1.categories.transactions', [$category->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])
); );
@ -245,11 +267,18 @@ class CategoryControllerTest extends TestCase
public function testUpdate(): void public function testUpdate(): void
{ {
// mock repositories // mock repositories
$repository = $this->mock(CategoryRepositoryInterface::class); $repository = $this->mock(CategoryRepositoryInterface::class);
$transformer = $this->mock(CategoryTransformer::class);
/** @var Category $category */ /** @var Category $category */
$category = $this->user()->categories()->first(); $category = $this->user()->categories()->first();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$repository->shouldReceive('update')->once()->andReturn($category); $repository->shouldReceive('update')->once()->andReturn($category);
@ -261,11 +290,10 @@ class CategoryControllerTest extends TestCase
]; ];
// test API // test API
$response = $this->put('/api/v1/categories/' . $category->id, $data, ['Accept' => 'application/json']); $response = $this->put(route('api.v1.categories.update', $category->id), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'categories', 'links' => true],]); $response->assertJson(['data' => ['type' => 'categories', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($category->name);
} }
} }

View File

@ -87,7 +87,7 @@ class ConfigurationControllerTest extends TestCase
], ],
]; ];
$response = $this->get('/api/v1/configuration'); $response = $this->get(route('api.v1.configuration.index'));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertExactJson($expected); $response->assertExactJson($expected);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -105,7 +105,7 @@ class ConfigurationControllerTest extends TestCase
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(false); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(false);
Passport::actingAs($this->emptyUser()); Passport::actingAs($this->emptyUser());
$response = $this->get('/api/v1/configuration'); $response = $this->get(route('api.v1.configuration.index'));
$response->assertStatus(500); $response->assertStatus(500);
$response->assertSee('No access to method.'); $response->assertSee('No access to method.');
} }
@ -156,8 +156,7 @@ class ConfigurationControllerTest extends TestCase
'single_user_mode' => true, 'single_user_mode' => true,
], ],
]; ];
$response = $this->post(route('api.v1.configuration.update', ['permission_update_check']), $data);
$response = $this->post('/api/v1/configuration/permission_update_check', $data);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertExactJson($expected); $response->assertExactJson($expected);
} }
@ -210,7 +209,7 @@ class ConfigurationControllerTest extends TestCase
], ],
]; ];
$response = $this->post('/api/v1/configuration/single_user_mode', $data); $response = $this->post(route('api.v1.configuration.update', ['single_user_mode']), $data);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertExactJson($expected); $response->assertExactJson($expected);
} }
@ -243,7 +242,7 @@ class ConfigurationControllerTest extends TestCase
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(false); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(false);
Passport::actingAs($this->emptyUser()); Passport::actingAs($this->emptyUser());
$response = $this->post('/api/v1/configuration/single_user_mode'); $response = $this->post(route('api.v1.configuration.update', ['single_user_mode']));
$response->assertStatus(500); $response->assertStatus(500);
$response->assertSee('No access to method.'); $response->assertSee('No access to method.');
} }

View File

@ -25,10 +25,12 @@ namespace Tests\Api\V1\Controllers;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Models\Account; use FireflyIII\Models\AvailableBudget;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\BudgetLimit;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\Models\Recurrence;
use FireflyIII\Models\Rule;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
@ -39,6 +41,15 @@ use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Transformers\AccountTransformer;
use FireflyIII\Transformers\AvailableBudgetTransformer;
use FireflyIII\Transformers\BillTransformer;
use FireflyIII\Transformers\BudgetLimitTransformer;
use FireflyIII\Transformers\CurrencyExchangeRateTransformer;
use FireflyIII\Transformers\CurrencyTransformer;
use FireflyIII\Transformers\RecurrenceTransformer;
use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -70,33 +81,33 @@ class CurrencyControllerTest extends TestCase
*/ */
public function testAccounts(): void public function testAccounts(): void
{ {
// create stuff
$accounts = factory(Account::class, 10)->create();
// mock stuff: // mock stuff:
$currency = TransactionCurrency::first();
$account = $this->getRandomAsset();
$collection = new Collection([$account]);
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('getAccountsByType')->withAnyArgs()->andReturn($accounts)->once(); $repository->shouldReceive('getAccountsByType')->withAnyArgs()->andReturn($collection)->atLeast()->once();
$currencyRepos->shouldReceive('setUser'); $repository->shouldReceive('getMetaValue')->atLeast()->once()->andReturn('1');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC');
$repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello');
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once();
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->once();
// test API // test API
$currency = TransactionCurrency::first();
$response = $this->get(route('api.v1.currencies.accounts', [$currency->code])); $response = $this->get(route('api.v1.currencies.accounts', [$currency->code]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => [],]); $response->assertJson(['data' => [],]);
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['meta' => ['pagination' => ['total' => 1, 'count' => 1, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]);
$response->assertJson( $response->assertJson(
['links' => ['self' => true, 'first' => true, 'last' => true,],] ['links' => ['self' => true, 'first' => true, 'last' => true,],]
); );
@ -111,22 +122,25 @@ class CurrencyControllerTest extends TestCase
*/ */
public function testAvailableBudgets(): void public function testAvailableBudgets(): void
{ {
$availableBudgets = $this->user()->availableBudgets()->get();
// mock stuff: // mock stuff:
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(AvailableBudgetTransformer::class);
$collection = new Collection([AvailableBudget::first()]);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->once(); $budgetRepos->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('getAvailableBudgets')->once()->andReturn($availableBudgets); $budgetRepos->shouldReceive('getAvailableBudgets')->once()->andReturn($collection);
// call API // call API
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$response = $this->get(route('api.v1.currencies.available_budgets', [$currency->code])); $response = $this->get(route('api.v1.currencies.available_budgets', [$currency->code]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($availableBudgets->first()->id);
} }
/** /**
@ -137,26 +151,26 @@ class CurrencyControllerTest extends TestCase
public function testBills(): void public function testBills(): void
{ {
// create stuff // create stuff
$bills = factory(Bill::class, 10)->create(); $paginator = new LengthAwarePaginator(new Collection([Bill::first()]), 0, 50, 1);
$paginator = new LengthAwarePaginator($bills, 10, 50, 1);
// mock stuff: // mock stuff:
$repository = $this->mock(BillRepositoryInterface::class); $repository = $this->mock(BillRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(BillTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $currencyRepos->shouldReceive('setUser')->atLeast()->once();
$currencyRepos->shouldReceive('setUser')->once();
$repository->shouldReceive('getPaginator')->withAnyArgs()->andReturn($paginator)->once(); $repository->shouldReceive('getPaginator')->withAnyArgs()->andReturn($paginator)->once();
$repository->shouldReceive('getRulesForBill')->withAnyArgs()->andReturn(new Collection());
$repository->shouldReceive('getNoteText')->andReturn('Hi there');
// test API // test API
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$response = $this->get(route('api.v1.currencies.bills', [$currency->code])); $response = $this->get(route('api.v1.currencies.bills', [$currency->code]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => [],]); $response->assertJson(['data' => [],]);
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]);
$response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -169,11 +183,19 @@ class CurrencyControllerTest extends TestCase
$repository = $this->mock(BudgetRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(BudgetLimitTransformer::class);
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$budgetLimit = BudgetLimit::first(); $budgetLimit = BudgetLimit::first();
$budgetLimit->transaction_currency_id = $currency->id; $budgetLimit->transaction_currency_id = $currency->id;
$collection = new Collection([$budgetLimit]); $collection = new Collection([$budgetLimit]);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('getAllBudgetLimits')->once()->andReturn($collection); $repository->shouldReceive('getAllBudgetLimits')->once()->andReturn($collection);
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->once();
@ -188,9 +210,15 @@ class CurrencyControllerTest extends TestCase
*/ */
public function testCer(): void public function testCer(): void
{ {
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$repository->shouldReceive('setUser')->once(); $transformer = $this->mock(CurrencyExchangeRateTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls
$repository->shouldReceive('setUser')->once()->atLeast()->once();
$repository->shouldReceive('getExchangeRates')->once()->andReturn(new Collection); $repository->shouldReceive('getExchangeRates')->once()->andReturn(new Collection);
@ -233,9 +261,17 @@ class CurrencyControllerTest extends TestCase
public function testDisable(): void public function testDisable(): void
{ {
// create stuff // create stuff
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -248,7 +284,6 @@ class CurrencyControllerTest extends TestCase
$response->assertJson( $response->assertJson(
['data' => [ ['data' => [
'type' => 'currencies', 'type' => 'currencies',
'id' => $currency->id,
],] ],]
); );
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -260,9 +295,10 @@ class CurrencyControllerTest extends TestCase
public function testDisableInUse(): void public function testDisableInUse(): void
{ {
// create stuff // create stuff
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -281,9 +317,17 @@ class CurrencyControllerTest extends TestCase
public function testEnable(): void public function testEnable(): void
{ {
// create stuff // create stuff
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -295,7 +339,6 @@ class CurrencyControllerTest extends TestCase
$response->assertJson( $response->assertJson(
['data' => [ ['data' => [
'type' => 'currencies', 'type' => 'currencies',
'id' => $currency->id,
],] ],]
); );
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -308,14 +351,17 @@ class CurrencyControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
$collection = TransactionCurrency::get();
// mock stuff: // mock stuff:
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('getAll')->withNoArgs()->andReturn($collection)->once(); $repository->shouldReceive('getAll')->withNoArgs()->andReturn(new Collection)->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// test API // test API
$response = $this->get('/api/v1/currencies'); $response = $this->get('/api/v1/currencies');
@ -325,8 +371,8 @@ class CurrencyControllerTest extends TestCase
[ [
'meta' => [ 'meta' => [
'pagination' => [ 'pagination' => [
'total' => $collection->count(), 'total' => 0,
'count' => $collection->count(), 'count' => 0,
'per_page' => true, // depends on user preference. 'per_page' => true, // depends on user preference.
'current_page' => 1, 'current_page' => 1,
'total_pages' => 1, 'total_pages' => 1,
@ -346,21 +392,28 @@ class CurrencyControllerTest extends TestCase
public function testMakeDefault(): void public function testMakeDefault(): void
{ {
// create stuff // create stuff
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('enable')->once(); $repository->shouldReceive('enable')->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// test API // test API
$response = $this->post(route('api.v1.currencies.default', [$currency->code])); $response = $this->post(route('api.v1.currencies.default', [$currency->code]));
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson( $response->assertJson(
['data' => [ ['data' => [
'type' => 'currencies', 'type' => 'currencies',
'id' => $currency->id,
],] ],]
); );
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -371,23 +424,22 @@ class CurrencyControllerTest extends TestCase
*/ */
public function testRecurrences(): void public function testRecurrences(): void
{ {
$recurrences = $this->user()->recurrences()->get();
// mock stuff: // mock stuff:
$recurrence = Recurrence::first();
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls: // mock calls:
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->once();
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$repository->shouldReceive('getAll')->once()->andReturn($recurrences); $repository->shouldReceive('getAll')->once()->andReturn(new Collection([$recurrence]));
$repository->shouldReceive('getNoteText')->andReturn('Notes.');
$repository->shouldReceive('repetitionDescription')->andReturn('Some description.');
$repository->shouldReceive('getXOccurrences')->andReturn([]);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// call API // call API
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
@ -401,12 +453,15 @@ class CurrencyControllerTest extends TestCase
*/ */
public function testRules(): void public function testRules(): void
{ {
$rules = $this->user()->rules()->get();
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$ruleRepos->shouldReceive('getAll')->once()->andReturn($rules); $transformer = $this->mock(RuleTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$ruleRepos->shouldReceive('getAll')->once()->andReturn(new Collection([Rule::first()]));
$currencyRepos->shouldReceive('setUser')->once(); $currencyRepos->shouldReceive('setUser')->once();
// call API // call API
@ -425,20 +480,27 @@ class CurrencyControllerTest extends TestCase
public function testShow(): void public function testShow(): void
{ {
// create stuff // create stuff
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// test API // test API
$response = $this->get('/api/v1/currencies/' . $currency->code); $response = $this->get('/api/v1/currencies/' . $currency->code);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson( $response->assertJson(
['data' => [ ['data' => [
'type' => 'currencies', 'type' => 'currencies',
'id' => $currency->id,
],] ],]
); );
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -453,9 +515,17 @@ class CurrencyControllerTest extends TestCase
public function testStore(): void public function testStore(): void
{ {
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -476,7 +546,6 @@ class CurrencyControllerTest extends TestCase
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'currencies', 'links' => true],]); $response->assertJson(['data' => ['type' => 'currencies', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($currency->name);
} }
/** /**
@ -487,9 +556,17 @@ class CurrencyControllerTest extends TestCase
*/ */
public function testStoreWithDefault(): void public function testStoreWithDefault(): void
{ {
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$preference = new Preference; $preference = new Preference;
$preference->data = 'EUR'; $preference->data = 'EUR';
@ -516,7 +593,6 @@ class CurrencyControllerTest extends TestCase
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'currencies', 'links' => true],]); $response->assertJson(['data' => ['type' => 'currencies', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($currency->name);
} }
/** /**
@ -527,8 +603,11 @@ class CurrencyControllerTest extends TestCase
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $paginator = new LengthAwarePaginator(new Collection, 0, 50);
$repository = $this->mock(JournalRepositoryInterface::class); $repository = $this->mock(JournalRepositoryInterface::class);
@ -566,8 +645,12 @@ class CurrencyControllerTest extends TestCase
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $paginator = new LengthAwarePaginator(new Collection, 0, 50);
$repository = $this->mock(JournalRepositoryInterface::class); $repository = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
@ -607,9 +690,17 @@ class CurrencyControllerTest extends TestCase
*/ */
public function testUpdate(): void public function testUpdate(): void
{ {
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -630,7 +721,6 @@ class CurrencyControllerTest extends TestCase
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'currencies', 'links' => true],]); $response->assertJson(['data' => ['type' => 'currencies', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($currency->name);
} }
/** /**
@ -644,9 +734,17 @@ class CurrencyControllerTest extends TestCase
$currency = TransactionCurrency::first(); $currency = TransactionCurrency::first();
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(CurrencyTransformer::class);
$preference = new Preference; $preference = new Preference;
$preference->data = 'EUR'; $preference->data = 'EUR';
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('update')->andReturn($currency); $repository->shouldReceive('update')->andReturn($currency);
@ -670,6 +768,5 @@ class CurrencyControllerTest extends TestCase
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => ['type' => 'currencies', 'links' => true],]); $response->assertJson(['data' => ['type' => 'currencies', 'links' => true],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($currency->name);
} }
} }

View File

@ -29,6 +29,7 @@ use FireflyIII\Models\CurrencyExchangeRate;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Services\Currency\ExchangeRateInterface; use FireflyIII\Services\Currency\ExchangeRateInterface;
use FireflyIII\Transformers\CurrencyExchangeRateTransformer;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
use Tests\TestCase; use Tests\TestCase;
@ -56,8 +57,9 @@ class CurrencyExchangeRateControllerTest extends TestCase
public function testIndex(): void public function testIndex(): void
{ {
// mock repository // mock repository
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$service = $this->mock(ExchangeRateInterface::class); $service = $this->mock(ExchangeRateInterface::class);
$transformer = $this->mock(CurrencyExchangeRateTransformer::class);
$rate = new CurrencyExchangeRate(); $rate = new CurrencyExchangeRate();
$rate->date = new Carbon(); $rate->date = new Carbon();
@ -67,6 +69,13 @@ class CurrencyExchangeRateControllerTest extends TestCase
$rate->to_currency_id = 1; $rate->to_currency_id = 1;
$rate->from_currency_id = 2; $rate->from_currency_id = 2;
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('findByCodeNull')->withArgs(['EUR'])->andReturn(TransactionCurrency::whereCode('EUR')->first())->once(); $repository->shouldReceive('findByCodeNull')->withArgs(['EUR'])->andReturn(TransactionCurrency::whereCode('EUR')->first())->once();
@ -86,17 +95,6 @@ class CurrencyExchangeRateControllerTest extends TestCase
$response->assertJson( $response->assertJson(
['data' => [ ['data' => [
'type' => 'currency_exchange_rates', 'type' => 'currency_exchange_rates',
'id' => '0',
'attributes' => [
'rate' => 0.5,
],
'links' => [
[
'rel' => 'self',
'uri' => '/currency_exchange_rates/',
],
],
], ],
] ]
); );
@ -109,8 +107,9 @@ class CurrencyExchangeRateControllerTest extends TestCase
public function testIndexBadDestination(): void public function testIndexBadDestination(): void
{ {
// mock repository // mock repository
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$service = $this->mock(ExchangeRateInterface::class); $service = $this->mock(ExchangeRateInterface::class);
$transformer = $this->mock(CurrencyExchangeRateTransformer::class);
$rate = new CurrencyExchangeRate(); $rate = new CurrencyExchangeRate();
$rate->date = new Carbon(); $rate->date = new Carbon();
@ -143,8 +142,9 @@ class CurrencyExchangeRateControllerTest extends TestCase
public function testIndexBadSource(): void public function testIndexBadSource(): void
{ {
// mock repository // mock repository
$repository = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class);
$service = $this->mock(ExchangeRateInterface::class); $service = $this->mock(ExchangeRateInterface::class);
$transformer = $this->mock(CurrencyExchangeRateTransformer::class);
$rate = new CurrencyExchangeRate(); $rate = new CurrencyExchangeRate();
$rate->date = new Carbon(); $rate->date = new Carbon();

View File

@ -26,6 +26,8 @@ namespace Tests\Api\V1\Controllers;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Models\ImportJob; use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Transformers\ImportJobTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -52,12 +54,16 @@ class ImportControllerTest extends TestCase
*/ */
public function testListAll(): void public function testListAll(): void
{ {
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
$transformer = $this->mock(ImportJobTransformer::class);
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('get')->once()->andReturn(new Collection); $repository->shouldReceive('get')->once()->andReturn(new Collection);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$response = $this->get(route('api.v1.import.list'));
$response = $this->get(route('api.v1.import.list'), ['Accept' => 'application/json']);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -67,10 +73,19 @@ class ImportControllerTest extends TestCase
public function testShow(): void public function testShow(): void
{ {
/** @var ImportJob $job */ /** @var ImportJob $job */
$job = $this->user()->importJobs()->first(); $job = $this->user()->importJobs()->first();
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
$transformer = $this->mock(ImportJobTransformer::class);
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$response = $this->get(route('api.v1.import.show', [$job->key]), ['accept' => 'application/json']); $response = $this->get(route('api.v1.import.show', [$job->key]), ['accept' => 'application/json']);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -85,9 +100,14 @@ class ImportControllerTest extends TestCase
$tag = $this->user()->tags()->first(); $tag = $this->user()->tags()->first();
$job->tag_id = $tag->id; $job->tag_id = $tag->id;
$job->save(); $job->save();
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// paginator: // paginator:
$paginator = new LengthAwarePaginator(new Collection, 0, 50); $paginator = new LengthAwarePaginator(new Collection, 0, 50);

View File

@ -27,6 +27,8 @@ use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Models\LinkType; use FireflyIII\Models\LinkType;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Transformers\LinkTypeTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -114,20 +116,19 @@ class LinkTypeControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
$linkTypes = LinkType::get();
// mock stuff:
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(LinkTypeTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('get')->once()->andReturn($linkTypes); $repository->shouldReceive('get')->once()->andReturn(new Collection);
// call API // call API
$response = $this->get('/api/v1/link_types'); $response = $this->get('/api/v1/link_types');
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($linkTypes->first()->created_at->toAtomString());
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -141,6 +142,14 @@ class LinkTypeControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(LinkTypeTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -148,7 +157,6 @@ class LinkTypeControllerTest extends TestCase
// call API // call API
$response = $this->get('/api/v1/link_types/' . $linkType->id); $response = $this->get('/api/v1/link_types/' . $linkType->id);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($linkType->first()->created_at->toAtomString());
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -163,6 +171,14 @@ class LinkTypeControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(LinkTypeTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -182,7 +198,6 @@ class LinkTypeControllerTest extends TestCase
// test API // test API
$response = $this->post('/api/v1/link_types', $data); $response = $this->post('/api/v1/link_types', $data);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($linkType->created_at->toAtomString());
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -197,6 +212,7 @@ class LinkTypeControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(LinkTypeTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -229,7 +245,12 @@ class LinkTypeControllerTest extends TestCase
$linkTypeRepos = $this->mock(LinkTypeRepositoryInterface::class); $linkTypeRepos = $this->mock(LinkTypeRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$journalIds = $linkTypeRepos->shouldReceive('getJournalIds')->once()->andReturn([1, 2, 3]); $transformer = $this->mock(TransactionTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalIds = $linkTypeRepos->shouldReceive('getJournalIds')->once()->andReturn([1, 2, 3]);
$collector->shouldReceive('setUser')->once()->andReturnSelf(); $collector->shouldReceive('setUser')->once()->andReturnSelf();
$collector->shouldReceive('withOpposingAccount')->once()->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->once()->andReturnSelf();
$collector->shouldReceive('withCategoryInformation')->once()->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->once()->andReturnSelf();
@ -260,6 +281,15 @@ class LinkTypeControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(LinkTypeTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$userRepository->shouldReceive('hasRole')->once()->andReturn(true); $userRepository->shouldReceive('hasRole')->once()->andReturn(true);
// create editable link type: // create editable link type:
@ -290,7 +320,6 @@ class LinkTypeControllerTest extends TestCase
$response = $this->put('/api/v1/link_types/' . $linkType->id, $data, ['Accept' => 'application/json']); $response = $this->put('/api/v1/link_types/' . $linkType->id, $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertSee($linkType->created_at->toAtomString());
} }
/** /**
@ -302,6 +331,7 @@ class LinkTypeControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(LinkTypeTransformer::class);
// create editable link type: // create editable link type:
$linkType = LinkType::create( $linkType = LinkType::create(
@ -341,6 +371,8 @@ class LinkTypeControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(LinkTypeTransformer::class);
$userRepository->shouldReceive('hasRole')->once()->andReturn(false); $userRepository->shouldReceive('hasRole')->once()->andReturn(false);
// create editable link type: // create editable link type:

View File

@ -23,11 +23,12 @@ declare(strict_types=1);
namespace Tests\Api\V1\Controllers; namespace Tests\Api\V1\Controllers;
use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\TransactionCurrency; 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 FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Transformers\PiggyBankEventTransformer;
use FireflyIII\Transformers\PiggyBankTransformer;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
@ -76,28 +77,29 @@ class PiggyBankControllerTest extends TestCase
public function testIndex(): void public function testIndex(): void
{ {
// create stuff // create stuff
$piggies = factory(PiggyBank::class, 10)->create();
$repository = $this->mock(PiggyBankRepositoryInterface::class); $repository = $this->mock(PiggyBankRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(PiggyBankTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$repository->shouldReceive('getPiggyBanks')->withAnyArgs()->andReturn($piggies)->once(); $repository->shouldReceive('getPiggyBanks')->withAnyArgs()->andReturn(new Collection())->once();
$repository->shouldReceive('getCurrentAmount')->andReturn('12');
$repository->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12');
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1'); //$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1');
$currencyRepos->shouldReceive('setUser'); $currencyRepos->shouldReceive('setUser');
$currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::first()); //$currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::first());
// test API // test API
$response = $this->get('/api/v1/piggy_banks'); $response = $this->get('/api/v1/piggy_banks');
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => [],]); $response->assertJson(['data' => [],]);
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]);
$response->assertJson( $response->assertJson(
['links' => ['self' => true, 'first' => true, 'last' => true,],] ['links' => ['self' => true, 'first' => true, 'last' => true,],]
); );
@ -109,8 +111,14 @@ class PiggyBankControllerTest extends TestCase
*/ */
public function testPiggyBankEvents(): void public function testPiggyBankEvents(): void
{ {
$piggyBank = $this->user()->piggyBanks()->first(); $piggyBank = $this->user()->piggyBanks()->first();
$repository = $this->mock(PiggyBankRepositoryInterface::class); $repository = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(PiggyBankEventTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('getEvents')->once()->andReturn(new Collection); $repository->shouldReceive('getEvents')->once()->andReturn(new Collection);
@ -131,17 +139,25 @@ class PiggyBankControllerTest extends TestCase
$repository = $this->mock(PiggyBankRepositoryInterface::class); $repository = $this->mock(PiggyBankRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(PiggyBankTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$currencyRepos->shouldReceive('setUser')->once(); //$currencyRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser')->once(); //$accountRepos->shouldReceive('setUser')->once();
$repository->shouldReceive('getCurrentAmount')->andReturn('12'); $repository->shouldReceive('getCurrentAmount')->andReturn('12');
$repository->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12'); $repository->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12');
$accountRepos->shouldReceive('setUser'); //$accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1'); //$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1');
$currencyRepos->shouldReceive('setUser'); $currencyRepos->shouldReceive('setUser');
$currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::first()); $currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::first());
@ -166,19 +182,27 @@ class PiggyBankControllerTest extends TestCase
$repository = $this->mock(PiggyBankRepositoryInterface::class); $repository = $this->mock(PiggyBankRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(PiggyBankTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$accountRepos->shouldReceive('setUser')->once(); //$accountRepos->shouldReceive('setUser')->once();
$repository->shouldReceive('store')->once()->andReturn($piggy); $repository->shouldReceive('store')->once()->andReturn($piggy);
$repository->shouldReceive('getCurrentAmount')->andReturn('12')->once(); //$repository->shouldReceive('getCurrentAmount')->andReturn('12')->once();
$repository->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12')->once(); //$repository->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12')->once();
$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1')->once(); //$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1')->once();
$currencyRepos->shouldReceive('setUser')->once(); //$currencyRepos->shouldReceive('setUser')->once();
$currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::first())->once(); //$currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::first())->once();
$data = [ $data = [
'name' => 'New piggy #' . random_int(1, 100000), 'name' => 'New piggy #' . random_int(1, 100000),
@ -204,6 +228,7 @@ class PiggyBankControllerTest extends TestCase
$repository = $this->mock(PiggyBankRepositoryInterface::class); $repository = $this->mock(PiggyBankRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(PiggyBankTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -237,18 +262,27 @@ class PiggyBankControllerTest extends TestCase
$repository = $this->mock(PiggyBankRepositoryInterface::class); $repository = $this->mock(PiggyBankRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
$transformer = $this->mock(PiggyBankTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$currencyRepos->shouldReceive('setUser')->once(); //$currencyRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser')->once(); //$accountRepos->shouldReceive('setUser')->once();
$repository->shouldReceive('update')->once()->andReturn($piggy); $repository->shouldReceive('update')->once()->andReturn($piggy);
$repository->shouldReceive('getCurrentAmount')->andReturn('12'); $repository->shouldReceive('getCurrentAmount')->andReturn('12');
$repository->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12'); $repository->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12');
$accountRepos->shouldReceive('setUser'); //$accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1'); $accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1');
$currencyRepos->shouldReceive('setUser'); $currencyRepos->shouldReceive('setUser');

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace Tests\Api\V1\Controllers; namespace Tests\Api\V1\Controllers;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\Transformers\PreferenceTransformer;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
use Mockery; use Mockery;
@ -52,14 +53,18 @@ class PreferencesControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
$transformer = $this->mock(PreferenceTransformer::class);
$available = ['language', 'customFiscalYear', 'fiscalYearStart', 'currencyPreference', 'transaction_journal_optional_fields', 'frontPageAccounts', $available = ['language', 'customFiscalYear', 'fiscalYearStart', 'currencyPreference', 'transaction_journal_optional_fields', 'frontPageAccounts',
'viewRange', 'listPageSize, twoFactorAuthEnabled',]; 'viewRange', 'listPageSize, twoFactorAuthEnabled',];
foreach ($available as $pref) { foreach ($available as $pref) {
Preferences::shouldReceive('getForUser')->withArgs([Mockery::any(), $pref])->once(); Preferences::shouldReceive('getForUser')->withArgs([Mockery::any(), $pref])->once();
} }
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// call API // call API
$response = $this->get('/api/v1/preferences'); $response = $this->get('/api/v1/preferences');
@ -72,11 +77,19 @@ class PreferencesControllerTest extends TestCase
*/ */
public function testUpdateArray(): void public function testUpdateArray(): void
{ {
$transformer = $this->mock(PreferenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
/** @var Preference $preference */ /** @var Preference $preference */
$preference = Preferences::setForUser($this->user(), 'frontPageAccounts', [1, 2, 3]); $preference = Preferences::setForUser($this->user(), 'frontPageAccounts', [1, 2, 3]);
$data = ['data' => '4,5,6']; $data = ['data' => '4,5,6'];
$response = $this->put('/api/v1/preferences/' . $preference->name, $data, ['Accept' => 'application/json']); $response = $this->put('/api/v1/preferences/' . $preference->name, $data, ['Accept' => 'application/json']);
$response->assertSee($preference->name);
$response->assertStatus(200); $response->assertStatus(200);
} }
@ -87,11 +100,19 @@ class PreferencesControllerTest extends TestCase
*/ */
public function testUpdateBoolean(): void public function testUpdateBoolean(): void
{ {
$transformer = $this->mock(PreferenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
/** @var Preference $preference */ /** @var Preference $preference */
$preference = Preferences::setForUser($this->user(), 'twoFactorAuthEnabled', false); $preference = Preferences::setForUser($this->user(), 'twoFactorAuthEnabled', false);
$data = ['data' => '1']; $data = ['data' => '1'];
$response = $this->put('/api/v1/preferences/' . $preference->name, $data, ['Accept' => 'application/json']); $response = $this->put('/api/v1/preferences/' . $preference->name, $data, ['Accept' => 'application/json']);
$response->assertSee($preference->name);
$response->assertStatus(200); $response->assertStatus(200);
} }
@ -102,11 +123,19 @@ class PreferencesControllerTest extends TestCase
*/ */
public function testUpdateDefault(): void public function testUpdateDefault(): void
{ {
$transformer = $this->mock(PreferenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
/** @var Preference $preference */ /** @var Preference $preference */
$preference = Preferences::setForUser($this->user(), 'currencyPreference', false); $preference = Preferences::setForUser($this->user(), 'currencyPreference', false);
$data = ['data' => 'EUR']; $data = ['data' => 'EUR'];
$response = $this->put('/api/v1/preferences/' . $preference->name, $data, ['Accept' => 'application/json']); $response = $this->put('/api/v1/preferences/' . $preference->name, $data, ['Accept' => 'application/json']);
$response->assertSee($preference->name);
$response->assertStatus(200); $response->assertStatus(200);
} }
@ -117,11 +146,19 @@ class PreferencesControllerTest extends TestCase
*/ */
public function testUpdateInteger(): void public function testUpdateInteger(): void
{ {
$transformer = $this->mock(PreferenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
/** @var Preference $preference */ /** @var Preference $preference */
$preference = Preferences::setForUser($this->user(), 'listPageSize', 13); $preference = Preferences::setForUser($this->user(), 'listPageSize', 13);
$data = ['data' => '434']; $data = ['data' => '434'];
$response = $this->put('/api/v1/preferences/' . $preference->name, $data, ['Accept' => 'application/json']); $response = $this->put('/api/v1/preferences/' . $preference->name, $data, ['Accept' => 'application/json']);
$response->assertSee($preference->name);
$response->assertStatus(200); $response->assertStatus(200);
} }

View File

@ -35,6 +35,8 @@ use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Cronjobs\RecurringCronjob; use FireflyIII\Support\Cronjobs\RecurringCronjob;
use FireflyIII\Transformers\RecurrenceTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -86,35 +88,24 @@ class RecurrenceControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
/** @var Recurrence $recurrences */
$recurrences = $this->user()->recurrences()->get();
// mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$categoryFactory = $this->mock(CategoryFactory::class); $categoryFactory = $this->mock(CategoryFactory::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$budgetRepos->shouldReceive('findNull')->atLeast()->once()->withAnyArgs()
->andReturn($this->user()->budgets()->first());
$piggyRepos->shouldReceive('findNull')->atLeast()->once()->withAnyArgs() // mock calls to transformer:
->andReturn($this->user()->piggyBanks()->first()); $transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$categoryFactory->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$categoryFactory->shouldReceive('findOrCreate')->atLeast()->once()->andReturn(null); $repository->shouldReceive('getAll')->once()->andReturn(new Collection);
$repository->shouldReceive('setUser');
$repository->shouldReceive('getAll')->once()->andReturn($recurrences);
$repository->shouldReceive('getNoteText')->andReturn('Notes.');
$repository->shouldReceive('repetitionDescription')->andReturn('Some description.');
$repository->shouldReceive('getXOccurrences')->andReturn([]);
// call API // call API
$response = $this->get('/api/v1/recurrences'); $response = $this->get('/api/v1/recurrences');
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($recurrences->first()->title);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -131,23 +122,22 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$categoryFactory = $this->mock(CategoryFactory::class); $categoryFactory = $this->mock(CategoryFactory::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$budgetRepos->shouldReceive('findNull')->atLeast()->once()->withAnyArgs()
->andReturn($this->user()->budgets()->first());
// mock calls: // mock calls:
$categoryFactory->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$categoryFactory->shouldReceive('findOrCreate')->atLeast()->once()->andReturn(null);
$repository->shouldReceive('setUser');
$repository->shouldReceive('getNoteText')->andReturn('Notes.');
$repository->shouldReceive('repetitionDescription')->andReturn('Some description.');
$repository->shouldReceive('getXOccurrences')->andReturn([]);
// call API // call API
$response = $this->get('/api/v1/recurrences/' . $recurrence->id); $response = $this->get('/api/v1/recurrences/' . $recurrence->id);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($recurrence->title);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -168,9 +158,16 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$factory->shouldReceive('setUser'); $factory->shouldReceive('setUser');
@ -223,10 +220,8 @@ class RecurrenceControllerTest extends TestCase
// test API // test API
$response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']); $response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']);
$response->assertSee($recurrence->title);
$response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
$response->assertStatus(200);
} }
/** /**
@ -246,6 +241,14 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -301,7 +304,6 @@ class RecurrenceControllerTest extends TestCase
// test API // test API
$response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']); $response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']);
$response->assertSee($recurrence->title);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -325,6 +327,14 @@ class RecurrenceControllerTest extends TestCase
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -380,7 +390,6 @@ class RecurrenceControllerTest extends TestCase
// test API // test API
$response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']); $response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']);
$response->assertSee($recurrence->title);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -403,6 +412,14 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -463,7 +480,6 @@ class RecurrenceControllerTest extends TestCase
// test API // test API
$response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']); $response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']);
$response->assertSee($recurrence->title);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -486,6 +502,14 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
$expenseAccount = $this->user()->accounts()->where('account_type_id', 4)->first(); $expenseAccount = $this->user()->accounts()->where('account_type_id', 4)->first();
@ -543,7 +567,7 @@ class RecurrenceControllerTest extends TestCase
// test API // test API
$response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']); $response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']);
$response->assertSee($recurrence->title);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -566,6 +590,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -658,6 +683,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -734,6 +760,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -809,6 +836,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -897,6 +925,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -971,6 +1000,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -1045,6 +1075,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -1120,6 +1151,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -1194,6 +1226,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -1268,6 +1301,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -1339,6 +1373,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -1413,6 +1448,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -1491,6 +1527,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -1557,6 +1594,7 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -1621,6 +1659,14 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
$otherAssetAccount = $this->user()->accounts()->where('account_type_id', 3)->where('id', '!=', $assetAccount->id)->first(); $otherAssetAccount = $this->user()->accounts()->where('account_type_id', 3)->where('id', '!=', $assetAccount->id)->first();
@ -1679,7 +1725,6 @@ class RecurrenceControllerTest extends TestCase
// test API // test API
$response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']); $response = $this->post('/api/v1/recurrences', $data, ['Accept' => 'application/json']);
$response->assertSee($recurrence->title);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
@ -1697,7 +1742,11 @@ class RecurrenceControllerTest extends TestCase
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$categoryFactory = $this->mock(CategoryFactory::class); $categoryFactory = $this->mock(CategoryFactory::class);
$journalIds = $recurringRepos->shouldReceive('getJournalIds')->once()->andReturn([1, 2, 3]); $transformer = $this->mock(TransactionTransformer::class);
$transformer->shouldReceive('setParameters')->atLeast()->once();
$journalIds = $recurringRepos->shouldReceive('getJournalIds')->once()->andReturn([1, 2, 3]);
$collector->shouldReceive('setUser')->once()->andReturnSelf(); $collector->shouldReceive('setUser')->once()->andReturnSelf();
$collector->shouldReceive('withOpposingAccount')->once()->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->once()->andReturnSelf();
$collector->shouldReceive('withCategoryInformation')->once()->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->once()->andReturnSelf();
@ -1727,6 +1776,7 @@ class RecurrenceControllerTest extends TestCase
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$cronjob = $this->mock(RecurringCronjob::class); $cronjob = $this->mock(RecurringCronjob::class);
$categoryFactory = $this->mock(CategoryFactory::class); $categoryFactory = $this->mock(CategoryFactory::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$cronjob->shouldReceive('fire')->andThrow(FireflyException::class); $cronjob->shouldReceive('fire')->andThrow(FireflyException::class);
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
@ -1744,6 +1794,7 @@ class RecurrenceControllerTest extends TestCase
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$cronjob = $this->mock(RecurringCronjob::class); $cronjob = $this->mock(RecurringCronjob::class);
$categoryFactory = $this->mock(CategoryFactory::class); $categoryFactory = $this->mock(CategoryFactory::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$cronjob->shouldReceive('fire')->once()->andReturnFalse(); $cronjob->shouldReceive('fire')->once()->andReturnFalse();
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
@ -1759,6 +1810,7 @@ class RecurrenceControllerTest extends TestCase
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$cronjob = $this->mock(RecurringCronjob::class); $cronjob = $this->mock(RecurringCronjob::class);
$categoryFactory = $this->mock(CategoryFactory::class); $categoryFactory = $this->mock(CategoryFactory::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$cronjob->shouldReceive('fire')->once()->andReturnTrue(); $cronjob->shouldReceive('fire')->once()->andReturnTrue();
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
@ -1783,6 +1835,14 @@ class RecurrenceControllerTest extends TestCase
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); $assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
@ -1839,9 +1899,7 @@ class RecurrenceControllerTest extends TestCase
// test API // test API
$response = $this->put('/api/v1/recurrences/' . $recurrence->id, $data, ['Accept' => 'application/json']); $response = $this->put('/api/v1/recurrences/' . $recurrence->id, $data, ['Accept' => 'application/json']);
$response->assertSee($recurrence->title);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }

View File

@ -31,6 +31,8 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\TransactionRules\TransactionMatcher; use FireflyIII\TransactionRules\TransactionMatcher;
use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
@ -79,20 +81,21 @@ class RuleControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
$rules = $this->user()->rules()->get();
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('getAll')->once()->andReturn($rules); $ruleRepos->shouldReceive('getAll')->once()->andReturn(new Collection);
// call API // call API
$response = $this->get('/api/v1/rules'); $response = $this->get('/api/v1/rules');
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($rules->first()->title);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -104,6 +107,14 @@ class RuleControllerTest extends TestCase
$rule = $this->user()->rules()->first(); $rule = $this->user()->rules()->first();
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
@ -112,7 +123,6 @@ class RuleControllerTest extends TestCase
// call API // call API
$response = $this->get('/api/v1/rules/' . $rule->id); $response = $this->get('/api/v1/rules/' . $rule->id);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($rule->title);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -124,6 +134,14 @@ class RuleControllerTest extends TestCase
{ {
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
$rule = $this->user()->rules()->first(); $rule = $this->user()->rules()->first();
@ -136,14 +154,14 @@ class RuleControllerTest extends TestCase
'active' => 1, 'active' => 1,
'triggers' => [ 'triggers' => [
[ [
'name' => 'description_is', 'type' => 'description_is',
'value' => 'Hello', 'value' => 'Hello',
'stop_processing' => 1, 'stop_processing' => 1,
], ],
], ],
'actions' => [ 'actions' => [
[ [
'name' => 'add_tag', 'type' => 'add_tag',
'value' => 'A', 'value' => 'A',
'stop_processing' => 1, 'stop_processing' => 1,
], ],
@ -167,6 +185,7 @@ class RuleControllerTest extends TestCase
{ {
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
@ -202,6 +221,7 @@ class RuleControllerTest extends TestCase
{ {
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
@ -241,6 +261,9 @@ class RuleControllerTest extends TestCase
$matcher = $this->mock(TransactionMatcher::class); $matcher = $this->mock(TransactionMatcher::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$transformer->shouldReceive('setParameters')->atLeast()->once();
$asset = $this->getRandomAsset(); $asset = $this->getRandomAsset();
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
@ -276,8 +299,9 @@ class RuleControllerTest extends TestCase
$matcher = $this->mock(TransactionMatcher::class); $matcher = $this->mock(TransactionMatcher::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class);
$asset = $this->getRandomAsset(); $asset = $this->getRandomAsset();
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
$repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset); $repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset);
@ -306,6 +330,14 @@ class RuleControllerTest extends TestCase
{ {
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
@ -320,14 +352,14 @@ class RuleControllerTest extends TestCase
'active' => 1, 'active' => 1,
'triggers' => [ 'triggers' => [
[ [
'name' => 'description_is', 'type' => 'description_is',
'value' => 'Hello', 'value' => 'Hello',
'stop_processing' => 1, 'stop_processing' => 1,
], ],
], ],
'actions' => [ 'actions' => [
[ [
'name' => 'add_tag', 'type' => 'add_tag',
'value' => 'A', 'value' => 'A',
'stop_processing' => 1, 'stop_processing' => 1,
], ],

View File

@ -31,6 +31,9 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\TransactionRules\TransactionMatcher; use FireflyIII\TransactionRules\TransactionMatcher;
use FireflyIII\Transformers\RuleGroupTransformer;
use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
@ -64,6 +67,7 @@ class RuleGroupControllerTest extends TestCase
// mock stuff: // mock stuff:
$ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleGroupTransformer::class);
// mock calls: // mock calls:
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
@ -79,19 +83,20 @@ class RuleGroupControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
$ruleGroups = $this->user()->ruleGroups()->get();
$ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleGroupTransformer::class);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once();
$ruleGroupRepos->shouldReceive('get')->once()->andReturn($ruleGroups); $ruleGroupRepos->shouldReceive('get')->once()->andReturn(new Collection);
$transformer->shouldReceive('setParameters')->atLeast()->once();
// call API // call API
$response = $this->get('/api/v1/rule_groups'); $response = $this->get('/api/v1/rule_groups');
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($ruleGroups->first()->title);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -102,6 +107,11 @@ class RuleGroupControllerTest extends TestCase
{ {
$ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once();
@ -122,15 +132,22 @@ class RuleGroupControllerTest extends TestCase
$ruleGroup = $this->user()->ruleGroups()->first(); $ruleGroup = $this->user()->ruleGroups()->first();
$ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleGroupTransformer::class);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once();
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// call API // call API
$response = $this->get('/api/v1/rule_groups/' . $ruleGroup->id); $response = $this->get('/api/v1/rule_groups/' . $ruleGroup->id);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($ruleGroup->title);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -142,6 +159,14 @@ class RuleGroupControllerTest extends TestCase
{ {
$ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleGroupTransformer::class);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once();
@ -172,6 +197,11 @@ class RuleGroupControllerTest extends TestCase
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$matcher = $this->mock(TransactionMatcher::class); $matcher = $this->mock(TransactionMatcher::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once();
$ruleGroupRepos->shouldReceive('getActiveRules')->once()->andReturn(new Collection([$rule])); $ruleGroupRepos->shouldReceive('getActiveRules')->once()->andReturn(new Collection([$rule]));
@ -205,6 +235,7 @@ class RuleGroupControllerTest extends TestCase
$ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleGroupTransformer::class);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once();
@ -260,6 +291,14 @@ class RuleGroupControllerTest extends TestCase
{ {
$ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleGroupTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once();

View File

@ -26,6 +26,8 @@ namespace Tests\Api\V1\Controllers;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use FireflyIII\Transformers\TagTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -98,7 +100,11 @@ class TagControllerTest extends TestCase
public function testIndex(): void public function testIndex(): void
{ {
// mock stuff: // mock stuff:
$tagRepos = $this->mock(TagRepositoryInterface::class); $tagRepos = $this->mock(TagRepositoryInterface::class);
$transformer = $this->mock(TagTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$tagRepos->shouldReceive('setUser')->times(1); $tagRepos->shouldReceive('setUser')->times(1);
@ -117,8 +123,16 @@ class TagControllerTest extends TestCase
public function testShow(): void public function testShow(): void
{ {
// mock stuff: // mock stuff:
$tagRepos = $this->mock(TagRepositoryInterface::class); $tagRepos = $this->mock(TagRepositoryInterface::class);
$tag = $this->user()->tags()->inRandomOrder()->first(); $tag = $this->user()->tags()->inRandomOrder()->first();
$transformer = $this->mock(TagTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$tagRepos->shouldReceive('setUser')->times(2); $tagRepos->shouldReceive('setUser')->times(2);
@ -139,8 +153,17 @@ class TagControllerTest extends TestCase
public function testShowByTag(): void public function testShowByTag(): void
{ {
// mock stuff: // mock stuff:
$tagRepos = $this->mock(TagRepositoryInterface::class); $tagRepos = $this->mock(TagRepositoryInterface::class);
$tag = $this->user()->tags()->inRandomOrder()->first(); $tag = $this->user()->tags()->inRandomOrder()->first();
$transformer = $this->mock(TagTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$tagRepos->shouldReceive('setUser')->times(2); $tagRepos->shouldReceive('setUser')->times(2);
$tagRepos->shouldReceive('findByTag')->once()->withArgs([(string)$tag->tag])->andReturn($tag); $tagRepos->shouldReceive('findByTag')->once()->withArgs([(string)$tag->tag])->andReturn($tag);
@ -158,9 +181,18 @@ class TagControllerTest extends TestCase
*/ */
public function testStore(): void public function testStore(): void
{ {
$tagRepos = $this->mock(TagRepositoryInterface::class); $tagRepos = $this->mock(TagRepositoryInterface::class);
$tag = $this->user()->tags()->inRandomOrder()->first(); $tag = $this->user()->tags()->inRandomOrder()->first();
$data = ['tag' => 'Some tag' . random_int(1, 10000),]; $data = ['tag' => 'Some tag' . random_int(1, 10000),];
$transformer = $this->mock(TagTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$tagRepos->shouldReceive('setUser')->times(1); $tagRepos->shouldReceive('setUser')->times(1);
$tagRepos->shouldReceive('store')->times(1)->andReturn($tag); $tagRepos->shouldReceive('store')->times(1)->andReturn($tag);
@ -182,6 +214,10 @@ class TagControllerTest extends TestCase
$tag = $this->user()->tags()->inRandomOrder()->first(); $tag = $this->user()->tags()->inRandomOrder()->first();
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$paginator = new LengthAwarePaginator([], 0, 50); $paginator = new LengthAwarePaginator([], 0, 50);
@ -217,9 +253,18 @@ class TagControllerTest extends TestCase
*/ */
public function testUpdate(): void public function testUpdate(): void
{ {
$tagRepos = $this->mock(TagRepositoryInterface::class); $tagRepos = $this->mock(TagRepositoryInterface::class);
$tag = $this->user()->tags()->inRandomOrder()->first(); $tag = $this->user()->tags()->inRandomOrder()->first();
$data = ['tag' => 'Some tag' . random_int(1, 10000),]; $data = ['tag' => 'Some tag' . random_int(1, 10000),];
$transformer = $this->mock(TagTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$tagRepos->shouldReceive('setUser')->times(2); $tagRepos->shouldReceive('setUser')->times(2);
$tagRepos->shouldReceive('update')->times(1)->andReturn($tag); $tagRepos->shouldReceive('update')->times(1)->andReturn($tag);

View File

@ -32,6 +32,9 @@ use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\PiggyBankEventTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@ -62,6 +65,11 @@ class TransactionControllerTest extends TestCase
$repository = $this->mock(JournalRepositoryInterface::class); $repository = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$attachmentRepos = $this->mock(AttachmentRepositoryInterface::class); $attachmentRepos = $this->mock(AttachmentRepositoryInterface::class);
$transformer = $this->mock(AttachmentTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('getAttachmentsByTr')->once()->andReturn(new Collection); $repository->shouldReceive('getAttachmentsByTr')->once()->andReturn(new Collection);
@ -1253,6 +1261,7 @@ class TransactionControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
$transformer = $this->mock(TransactionTransformer::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getAccountsByType') $accountRepos->shouldReceive('getAccountsByType')
@ -1271,6 +1280,8 @@ class TransactionControllerTest extends TestCase
$collector->shouldReceive('setPage')->andReturnSelf(); $collector->shouldReceive('setPage')->andReturnSelf();
$collector->shouldReceive('setTypes')->andReturnSelf(); $collector->shouldReceive('setTypes')->andReturnSelf();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
@ -1293,6 +1304,7 @@ class TransactionControllerTest extends TestCase
*/ */
public function testIndexWithRange(): void public function testIndexWithRange(): void
{ {
$transformer = $this->mock(TransactionTransformer::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getAccountsByType') $accountRepos->shouldReceive('getAccountsByType')
@ -1315,6 +1327,8 @@ class TransactionControllerTest extends TestCase
$collector->shouldReceive('setRange')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf();
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock some calls: // mock some calls:
@ -1347,13 +1361,18 @@ class TransactionControllerTest extends TestCase
public function testPiggyBankEvents(): void public function testPiggyBankEvents(): void
{ {
// mock stuff: // mock stuff:
$repository = $this->mock(JournalRepositoryInterface::class); $repository = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(PiggyBankEventTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('getPiggyBankEventsbyTr')->once()->andReturn(new Collection); $repository->shouldReceive('getPiggyBankEventsbyTr')->once()->andReturn(new Collection);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// get account: // get account:
$transaction = $this->user()->transactions()->first(); $transaction = $this->user()->transactions()->first();
@ -1368,9 +1387,10 @@ class TransactionControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\TransactionController * @covers \FireflyIII\Api\V1\Controllers\TransactionController
*/ */
public function testShowWithdrawal(): void public function testShowDeposit(): void
{ {
$withdrawal = $this->getRandomWithdrawal(); $transformer = $this->mock(TransactionTransformer::class);
$deposit = $this->getRandomDeposit();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getAccountsByType') $accountRepos->shouldReceive('getAccountsByType')
@ -1387,8 +1407,11 @@ class TransactionControllerTest extends TestCase
$collector->shouldReceive('addFilter')->andReturnSelf()->once(); $collector->shouldReceive('addFilter')->andReturnSelf()->once();
$collector->shouldReceive('getTransactions')->andReturn(new Collection); $collector->shouldReceive('getTransactions')->andReturn(new Collection);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// test API // test API
$response = $this->get('/api/v1/transactions/' . $withdrawal->id); $response = $this->get('/api/v1/transactions/' . $deposit->id);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson( $response->assertJson(
[ [
@ -1407,9 +1430,10 @@ class TransactionControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\TransactionController * @covers \FireflyIII\Api\V1\Controllers\TransactionController
*/ */
public function testShowDeposit(): void public function testShowWithdrawal(): void
{ {
$deposit =$this->getRandomDeposit(); $transformer = $this->mock(TransactionTransformer::class);
$withdrawal = $this->getRandomWithdrawal();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getAccountsByType') $accountRepos->shouldReceive('getAccountsByType')
@ -1426,8 +1450,11 @@ class TransactionControllerTest extends TestCase
$collector->shouldReceive('addFilter')->andReturnSelf()->once(); $collector->shouldReceive('addFilter')->andReturnSelf()->once();
$collector->shouldReceive('getTransactions')->andReturn(new Collection); $collector->shouldReceive('getTransactions')->andReturn(new Collection);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// test API // test API
$response = $this->get('/api/v1/transactions/' . $deposit->id); $response = $this->get('/api/v1/transactions/' . $withdrawal->id);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson( $response->assertJson(
[ [
@ -1455,6 +1482,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// collector stuff: // collector stuff:
$collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf();
@ -1513,6 +1544,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
@ -1569,6 +1604,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -1626,6 +1665,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -1681,6 +1724,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -1736,6 +1783,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -1793,6 +1844,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -1848,6 +1903,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -1904,6 +1963,11 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -1961,6 +2025,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2017,6 +2085,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2074,6 +2146,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
try { try {
$this->expectsEvents(StoredTransactionJournal::class); $this->expectsEvents(StoredTransactionJournal::class);
@ -2130,12 +2206,16 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account]));
$journalRepos->shouldReceive('store')->andReturn($journal)->once(); $journalRepos->shouldReceive('store')->andReturn($journal)->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// collector stuff: // collector stuff:
$collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf();
@ -2193,12 +2273,16 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account]));
$journalRepos->shouldReceive('store')->andReturn($journal)->once(); $journalRepos->shouldReceive('store')->andReturn($journal)->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// collector stuff: // collector stuff:
$collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf();
@ -2250,6 +2334,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2307,6 +2395,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2363,6 +2455,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2419,6 +2515,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2475,12 +2575,16 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account]));
$journalRepos->shouldReceive('store')->andReturn($journal)->once(); $journalRepos->shouldReceive('store')->andReturn($journal)->once();
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// collector stuff: // collector stuff:
$collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf();
@ -2532,6 +2636,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2588,6 +2696,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2642,6 +2754,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2697,6 +2813,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2766,6 +2886,10 @@ class TransactionControllerTest extends TestCase
$journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial();
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
@ -2821,6 +2945,11 @@ class TransactionControllerTest extends TestCase
$repository = $this->mock(JournalRepositoryInterface::class); $repository = $this->mock(JournalRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getAccountsById')->withArgs([[$account->id]])->andReturn(new Collection([$account])); $accountRepos->shouldReceive('getAccountsById')->withArgs([[$account->id]])->andReturn(new Collection([$account]));
@ -2874,6 +3003,10 @@ class TransactionControllerTest extends TestCase
$repository = $this->mock(JournalRepositoryInterface::class); $repository = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('setUser');
$accountRepos->shouldReceive('getAccountsById')->withArgs([[$account->id]])->andReturn(new Collection([$account])); $accountRepos->shouldReceive('getAccountsById')->withArgs([[$account->id]])->andReturn(new Collection([$account]));

View File

@ -30,6 +30,7 @@ use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournalLink; use FireflyIII\Models\TransactionJournalLink;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use FireflyIII\Transformers\TransactionLinkTransformer;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
@ -80,7 +81,6 @@ class TransactionLinkControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
$journalLinks = TransactionJournalLink::get();
$transaction = Transaction::first(); $transaction = Transaction::first();
$transaction->date = new Carbon; $transaction->date = new Carbon;
$transaction->transaction_type_type = 'Withdrawal'; $transaction->transaction_type_type = 'Withdrawal';
@ -88,25 +88,21 @@ class TransactionLinkControllerTest extends TestCase
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionLinkTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('findByName')->once()->andReturn(null); $repository->shouldReceive('findByName')->once()->andReturn(null);
$repository->shouldReceive('getJournalLinks')->once()->andReturn($journalLinks); $repository->shouldReceive('getJournalLinks')->once()->andReturn(new Collection);
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$collector->shouldReceive('setUser')->withAnyArgs();
$collector->shouldReceive('withOpposingAccount')->andReturnSelf();
$collector->shouldReceive('withCategoryInformation')->andReturnSelf();
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
$collector->shouldReceive('setJournals')->andReturnSelf();
$collector->shouldReceive('getTransactions')->andReturn(new Collection([$transaction]));
// call API // call API
$response = $this->get('/api/v1/transaction_links'); $response = $this->get('/api/v1/transaction_links');
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($journalLinks->first()->id);
} }
/** /**
@ -119,20 +115,24 @@ class TransactionLinkControllerTest extends TestCase
$transaction->date = new Carbon; $transaction->date = new Carbon;
$transaction->transaction_type_type = 'Withdrawal'; $transaction->transaction_type_type = 'Withdrawal';
// mock stuff: // mock stuff:
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionLinkTransformer::class);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$journalRepos->shouldReceive('setUser')->once(); $journalRepos->shouldReceive('setUser')->once();
$collector->shouldReceive('setUser')->withAnyArgs();
$collector->shouldReceive('withOpposingAccount')->andReturnSelf();
$collector->shouldReceive('withCategoryInformation')->andReturnSelf();
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
$collector->shouldReceive('setJournals')->andReturnSelf();
$collector->shouldReceive('getTransactions')->andReturn(new Collection([$transaction]));
// call API // call API
$response = $this->get('/api/v1/transaction_links/' . $journalLink->id); $response = $this->get('/api/v1/transaction_links/' . $journalLink->id);
@ -156,18 +156,19 @@ class TransactionLinkControllerTest extends TestCase
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionLinkTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
$journalRepos->shouldReceive('setUser'); $journalRepos->shouldReceive('setUser');
$collector->shouldReceive('setUser')->withAnyArgs(); $collector->shouldReceive('setUser')->withAnyArgs();
$collector->shouldReceive('setUser')->withAnyArgs(); // mock transformer
$collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$collector->shouldReceive('withCategoryInformation')->andReturnSelf(); $transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withBudgetInformation')->andReturnSelf(); $transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$collector->shouldReceive('setJournals')->andReturnSelf(); $transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$collector->shouldReceive('getTransactions')->andReturn(new Collection([$transaction])); $transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$journalRepos->shouldReceive('findNull')->andReturn($journal); $journalRepos->shouldReceive('findNull')->andReturn($journal);
$repository->shouldReceive('storeLink')->once()->andReturn($journalLink); $repository->shouldReceive('storeLink')->once()->andReturn($journalLink);
@ -185,7 +186,6 @@ class TransactionLinkControllerTest extends TestCase
// test API // test API
$response = $this->post('/api/v1/transaction_links', $data); $response = $this->post('/api/v1/transaction_links', $data);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($journalLink->created_at->toAtomString()); // the creation moment.
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -448,6 +448,7 @@ class TransactionLinkControllerTest extends TestCase
$repository = $this->mock(LinkTypeRepositoryInterface::class); $repository = $this->mock(LinkTypeRepositoryInterface::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
$collector = $this->mock(TransactionCollectorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class);
$transformer = $this->mock(TransactionLinkTransformer::class);
$journalLink = TransactionJournalLink::first(); $journalLink = TransactionJournalLink::first();
$journal = $this->user()->transactionJournals()->find(1); $journal = $this->user()->transactionJournals()->find(1);
@ -455,6 +456,13 @@ class TransactionLinkControllerTest extends TestCase
$transaction->date = new Carbon; $transaction->date = new Carbon;
$transaction->transaction_type_type = 'Withdrawal'; $transaction->transaction_type_type = 'Withdrawal';
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// mock calls: // mock calls:
$repository->shouldReceive('setUser'); $repository->shouldReceive('setUser');
@ -483,7 +491,6 @@ class TransactionLinkControllerTest extends TestCase
// test API // test API
$response = $this->put('/api/v1/transaction_links/' . $journalLink->id, $data, ['Accept' => 'application/json']); $response = $this->put('/api/v1/transaction_links/' . $journalLink->id, $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($journalLink->created_at->toAtomString()); // the creation moment.
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }

View File

@ -25,7 +25,9 @@ namespace Tests\Api\V1\Controllers;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Transformers\UserTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
use Mockery; use Mockery;
@ -95,6 +97,7 @@ class UserControllerTest extends TestCase
{ {
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true); $userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true);
// create a user first: // create a user first:
// call API // call API
$response = $this->delete('/api/v1/users/' . $this->user()->id, [], ['Accept' => 'application/json']); $response = $this->delete('/api/v1/users/' . $this->user()->id, [], ['Accept' => 'application/json']);
@ -109,20 +112,20 @@ class UserControllerTest extends TestCase
*/ */
public function testIndex(): void public function testIndex(): void
{ {
// create stuff
$users = factory(User::class, 10)->create();
// mock stuff: // mock stuff:
$repository = $this->mock(UserRepositoryInterface::class); $repository = $this->mock(UserRepositoryInterface::class);
$repository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->once()->andReturn(true); $transformer = $this->mock(UserTransformer::class);
// mock calls:
$repository->shouldReceive('all')->withAnyArgs()->andReturn($users)->once(); $repository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->once()->andReturn(true);
$repository->shouldReceive('all')->withAnyArgs()->andReturn(new Collection)->once();
$transformer->shouldReceive('setParameters')->atLeast()->once();
// test API // test API
$response = $this->get('/api/v1/users', ['Accept' => 'application/json']); $response = $this->get('/api/v1/users', ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJson(['data' => [],]); $response->assertJson(['data' => [],]);
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'current_page' => 1, 'total_pages' => 1]],]);
$response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
$response->assertHeader('Content-Type', 'application/vnd.api+json'); $response->assertHeader('Content-Type', 'application/vnd.api+json');
} }
@ -136,12 +139,19 @@ class UserControllerTest extends TestCase
{ {
$user = User::first(); $user = User::first();
$repository = $this->mock(UserRepositoryInterface::class); $repository = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(UserTransformer::class);
$repository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->once()->andReturn(true); $repository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->once()->andReturn(true);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// test API // test API
$response = $this->get('/api/v1/users/' . $user->id, ['Accept' => 'application/json']); $response = $this->get('/api/v1/users/' . $user->id, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($user->email);
} }
/** /**
@ -158,13 +168,20 @@ class UserControllerTest extends TestCase
// mock // mock
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(UserTransformer::class);
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
$userRepos->shouldReceive('store')->once()->andReturn($this->user()); $userRepos->shouldReceive('store')->once()->andReturn($this->user());
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// test API // test API
$response = $this->post('/api/v1/users', $data, ['Content-Type' => 'application/x-www-form-urlencoded']); $response = $this->post('/api/v1/users', $data, ['Content-Type' => 'application/x-www-form-urlencoded']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($this->user()->email);
} }
/** /**
@ -183,13 +200,20 @@ class UserControllerTest extends TestCase
// mock // mock
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer= $this->mock(UserTransformer::class);
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
$userRepos->shouldReceive('store')->once()->andReturn($this->user()); $userRepos->shouldReceive('store')->once()->andReturn($this->user());
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// test API // test API
$response = $this->postJson('/api/v1/users', $data, ['Accept' => 'application/json']); $response = $this->postJson('/api/v1/users', $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($this->user()->email);
} }
/** /**
@ -273,9 +297,17 @@ class UserControllerTest extends TestCase
// mock // mock
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(UserTransformer::class);
$userRepos->shouldReceive('update')->once()->andReturn($user); $userRepos->shouldReceive('update')->once()->andReturn($user);
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// call API // call API
$response = $this->put('/api/v1/users/' . $user->id, $data, ['Accept' => 'application/json']); $response = $this->put('/api/v1/users/' . $user->id, $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
@ -300,9 +332,17 @@ class UserControllerTest extends TestCase
// mock // mock
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$transformer = $this->mock(UserTransformer::class);
$userRepos->shouldReceive('update')->once()->andReturn($user); $userRepos->shouldReceive('update')->once()->andReturn($user);
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
// mock transformer
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
// call API // call API
$response = $this->putJson('/api/v1/users/' . $user->id, $data, ['Accept' => 'application/json']); $response = $this->putJson('/api/v1/users/' . $user->id, $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);

View File

@ -79,6 +79,7 @@ class PiggyBankControllerTest extends TestCase
$piggyRepos->shouldReceive('getCurrentAmount')->andReturn('0'); $piggyRepos->shouldReceive('getCurrentAmount')->andReturn('0');
$piggyRepos->shouldReceive('leftOnAccount')->andReturn('0'); $piggyRepos->shouldReceive('leftOnAccount')->andReturn('0');
$this->be($this->user()); $this->be($this->user());
$response = $this->get(route('piggy-banks.add', [1])); $response = $this->get(route('piggy-banks.add', [1]));
$response->assertStatus(200); $response->assertStatus(200);
@ -253,7 +254,8 @@ class PiggyBankControllerTest extends TestCase
$accountRepos->shouldReceive('getNoteText')->withAnyArgs()->andReturn('Hello')->atLeast()->once(); $accountRepos->shouldReceive('getNoteText')->withAnyArgs()->andReturn('Hello')->atLeast()->once();
$currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::find(1))->atLeast()->once(); $currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::find(1))->atLeast()->once();
$accountRepos->shouldReceive('getAccountType')->andReturn('Asset account')->atLeast()->once();
$accountRepos->shouldReceive('getAccountCurrency')->andReturn(TransactionCurrency::find(1))->atLeast()->once();
$first = $this->user()->transactionJournals()->inRandomOrder()->first(); $first = $this->user()->transactionJournals()->inRandomOrder()->first();
$piggies = $this->user()->piggyBanks()->take(2)->get(); $piggies = $this->user()->piggyBanks()->take(2)->get();