diff --git a/app/Handlers/Events/UpdatedJournalEventHandler.php b/app/Handlers/Events/UpdatedJournalEventHandler.php
index 20e446ea5e..a99a078374 100644
--- a/app/Handlers/Events/UpdatedJournalEventHandler.php
+++ b/app/Handlers/Events/UpdatedJournalEventHandler.php
@@ -51,6 +51,7 @@ class UpdatedJournalEventHandler
/**
* This method will check all the rules when a journal is updated.
+ * TODO move to factory.
*
* @param UpdatedTransactionJournal $updatedJournalEvent
*
@@ -81,6 +82,7 @@ class UpdatedJournalEventHandler
/**
* This method calls a special bill scanner that will check if the updated journal is part of a bill.
+ * TODO move to factory.
*
* @param UpdatedTransactionJournal $updatedJournalEvent
*
diff --git a/app/Helpers/Chart/MetaPieChart.php b/app/Helpers/Chart/MetaPieChart.php
index 91e28f0ee0..931b996360 100644
--- a/app/Helpers/Chart/MetaPieChart.php
+++ b/app/Helpers/Chart/MetaPieChart.php
@@ -276,11 +276,13 @@ class MetaPieChart implements MetaPieChartInterface
$collector->setBudgets($this->budgets);
$collector->setCategories($this->categories);
+ // @codeCoverageIgnoreStart
if ($this->tags->count() > 0) {
$collector->setTags($this->tags);
$collector->withCategoryInformation();
$collector->withBudgetInformation();
}
+ // @codeCoverageIgnoreEnd
return $collector->getJournals();
}
@@ -297,7 +299,7 @@ class MetaPieChart implements MetaPieChartInterface
{
if (0 === count($fields) && $this->tags->count() > 0) {
// do a special group on tags:
- return $this->groupByTag($set);
+ return $this->groupByTag($set); // @codeCoverageIgnore
}
$grouped = [];
@@ -341,6 +343,8 @@ class MetaPieChart implements MetaPieChartInterface
}
/**
+ * @codeCoverageIgnore
+ *
* @param Collection $set
*
* @return array
diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php
index 57a57ae19d..98f3c8f978 100644
--- a/app/Http/Controllers/AccountController.php
+++ b/app/Http/Controllers/AccountController.php
@@ -297,7 +297,7 @@ class AccountController extends Controller
$end = app('navigation')->endOfPeriod($start, $range);
}
if ($end < $start) {
- throw new FireflyException('End is after start!');
+ throw new FireflyException('End is after start!'); // @codeCoverageIgnore
}
$subTitleIcon = config('firefly.subIconsByIdentifier.' . $account->accountType->type);
@@ -417,7 +417,7 @@ class AccountController extends Controller
$start = $this->repository->oldestJournalDate($account);
$end = $date ?? new Carbon;
if ($end < $start) {
- list($start, $end) = [$end, $start];
+ list($start, $end) = [$end, $start]; // @codeCoverageIgnore
}
// properties for cache
diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php
index f098c9c820..24210ebf34 100644
--- a/app/Http/Controllers/BillController.php
+++ b/app/Http/Controllers/BillController.php
@@ -328,28 +328,4 @@ class BillController extends Controller
return redirect($this->getPreviousUri('bills.edit.uri'));
}
-
- /**
- * Returns the latest date in the set, or start when set is empty.
- *
- * @param Collection $dates
- * @param Carbon $default
- *
- * @return Carbon
- */
- private function lastPaidDate(Collection $dates, Carbon $default): Carbon
- {
- if (0 === $dates->count()) {
- return $default; // @codeCoverageIgnore
- }
- $latest = $dates->first();
- /** @var Carbon $date */
- foreach ($dates as $date) {
- if ($date->gte($latest)) {
- $latest = $date;
- }
- }
-
- return $latest;
- }
}
diff --git a/app/Http/Controllers/Chart/AccountController.php b/app/Http/Controllers/Chart/AccountController.php
index b96bef9e43..baf19747d6 100644
--- a/app/Http/Controllers/Chart/AccountController.php
+++ b/app/Http/Controllers/Chart/AccountController.php
@@ -316,7 +316,7 @@ class AccountController extends Controller
$step = '1D';
$months = $start->diffInMonths($end);
if ($months > 3) {
- $step = '1W';
+ $step = '1W'; // @codeCoverageIgnore
}
if ($months > 24) {
$step = '1M'; // @codeCoverageIgnore
@@ -340,9 +340,10 @@ class AccountController extends Controller
$current->addDay();
}
break;
+ // @codeCoverageIgnoreStart
case '1W':
- case '1M': // @codeCoverageIgnore
- case '1Y': // @codeCoverageIgnore
+ case '1M':
+ case '1Y':
while ($end >= $current) {
$balance = floatval(app('steam')->balance($account, $current));
$label = app('navigation')->periodShow($current, $step);
@@ -350,6 +351,7 @@ class AccountController extends Controller
$current = app('navigation')->addPeriod($current, $step, 1);
}
break;
+ // @codeCoverageIgnoreEnd
}
$data = $this->generator->singleSet($account->name, $chartData);
$cache->store($data);
diff --git a/app/Http/Controllers/Transaction/SplitController.php b/app/Http/Controllers/Transaction/SplitController.php
index b263917b08..b82633bef4 100644
--- a/app/Http/Controllers/Transaction/SplitController.php
+++ b/app/Http/Controllers/Transaction/SplitController.php
@@ -95,7 +95,7 @@ class SplitController extends Controller
public function edit(Request $request, TransactionJournal $journal)
{
if ($this->isOpeningBalance($journal)) {
- return $this->redirectToAccount($journal);
+ return $this->redirectToAccount($journal); // @codeCoverageIgnore
}
$uploadSize = min(Steam::phpBytes(ini_get('upload_max_filesize')), Steam::phpBytes(ini_get('post_max_size')));
@@ -140,7 +140,7 @@ class SplitController extends Controller
public function update(SplitJournalFormRequest $request, TransactionJournal $journal)
{
if ($this->isOpeningBalance($journal)) {
- return $this->redirectToAccount($journal);
+ return $this->redirectToAccount($journal); // @codeCoverageIgnore
}
$data = $request->getAll();
$journal = $this->repository->update($journal, $data);
diff --git a/tests/Api/V1/Controllers/UserControllerTest.php b/tests/Api/V1/Controllers/UserControllerTest.php
index 1c73ec0582..88d3beed2a 100644
--- a/tests/Api/V1/Controllers/UserControllerTest.php
+++ b/tests/Api/V1/Controllers/UserControllerTest.php
@@ -103,7 +103,7 @@ class UserControllerTest extends TestCase
$response = $this->get('/api/v1/users');
$response->assertStatus(200);
$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' => 10, 'count' => 10, 'current_page' => 1, 'total_pages' => 1]],]);
$response->assertJson(
['links' => ['self' => true, 'first' => true, 'last' => true,],]
);
diff --git a/tests/Feature/Controllers/Account/ReconcileControllerTest.php b/tests/Feature/Controllers/Account/ReconcileControllerTest.php
index 27dd4d6eca..4c183134b4 100644
--- a/tests/Feature/Controllers/Account/ReconcileControllerTest.php
+++ b/tests/Feature/Controllers/Account/ReconcileControllerTest.php
@@ -91,9 +91,10 @@ class ReconcileControllerTest extends TestCase
*/
public function testOverview()
{
+ $transactions = $this->user()->transactions()->inRandomOrder()->take(3)->get();
$repository = $this->mock(JournalRepositoryInterface::class);
$repository->shouldReceive('first')->andReturn(new TransactionJournal);
- $repository->shouldReceive('getTransactionsById')->andReturn(new Collection())->twice();
+ $repository->shouldReceive('getTransactionsById')->andReturn($transactions)->twice();
$parameters = [
'startBalance' => '0',
diff --git a/tests/Feature/Controllers/AccountControllerTest.php b/tests/Feature/Controllers/AccountControllerTest.php
index ba83d35bb3..7ea250cfea 100644
--- a/tests/Feature/Controllers/AccountControllerTest.php
+++ b/tests/Feature/Controllers/AccountControllerTest.php
@@ -214,6 +214,23 @@ class AccountControllerTest extends TestCase
$response->assertSee('
');
}
+ /**
+ * @covers \FireflyIII\Http\Controllers\AccountController::show
+ * @expectedExceptionMessage End is after start!
+ */
+ public function testShowBrokenBadDates()
+ {
+ // mock
+ $journalRepos = $this->mock(JournalRepositoryInterface::class);
+ $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
+ $this->session(['start' => '2018-01-01', 'end' => '2017-12-01']);
+
+ $this->be($this->user());
+ $account = $this->user()->accounts()->where('account_type_id', 3)->orderBy('id', 'ASC')->whereNull('deleted_at')->first();
+ $response = $this->get(route('accounts.show', [$account->id, '2018-01-01', '2017-12-01']));
+ $response->assertStatus(500);
+ }
+
/**
* @covers \FireflyIII\Http\Controllers\AccountController::show
* @covers \FireflyIII\Http\Controllers\AccountController::redirectToOriginalAccount
@@ -234,7 +251,6 @@ class AccountControllerTest extends TestCase
$response->assertStatus(500);
}
-
/**
* @covers \FireflyIII\Http\Controllers\AccountController::show
* @dataProvider dateRangeProvider
diff --git a/tests/Feature/Controllers/Admin/LinkControllerTest.php b/tests/Feature/Controllers/Admin/LinkControllerTest.php
index 95c0571b36..64cb540d02 100644
--- a/tests/Feature/Controllers/Admin/LinkControllerTest.php
+++ b/tests/Feature/Controllers/Admin/LinkControllerTest.php
@@ -139,8 +139,10 @@ class LinkControllerTest extends TestCase
*/
public function testIndex()
{
+ $linkTypes = LinkType::inRandomOrder()->take(3)->get();
$repository = $this->mock(LinkTypeRepositoryInterface::class);
- $repository->shouldReceive('get')->andReturn(new Collection);
+ $repository->shouldReceive('get')->andReturn($linkTypes);
+ $repository->shouldReceive('countJournals')->andReturn(3);
$this->be($this->user());
$response = $this->get(route('admin.links.index'));
$response->assertStatus(200);
diff --git a/tests/Feature/Controllers/BillControllerTest.php b/tests/Feature/Controllers/BillControllerTest.php
index d7ad2e1da0..b999823c9d 100644
--- a/tests/Feature/Controllers/BillControllerTest.php
+++ b/tests/Feature/Controllers/BillControllerTest.php
@@ -116,7 +116,6 @@ class BillControllerTest extends TestCase
/**
* @covers \FireflyIII\Http\Controllers\BillController::index
* @covers \FireflyIII\Http\Controllers\BillController::__construct
- * @covers \FireflyIII\Http\Controllers\BillController::lastPaidDate
*/
public function testIndex()
{
diff --git a/tests/Feature/Controllers/Report/OperationsControllerTest.php b/tests/Feature/Controllers/Report/OperationsControllerTest.php
index 16b4e8f144..e6753546fe 100644
--- a/tests/Feature/Controllers/Report/OperationsControllerTest.php
+++ b/tests/Feature/Controllers/Report/OperationsControllerTest.php
@@ -39,8 +39,17 @@ class OperationsControllerTest extends TestCase
*/
public function testExpenses()
{
+ $return = [
+ 1 => [
+ 'id' => 1,
+ 'name' => 'Some name',
+ 'sum' => '5',
+ 'average' => '5',
+ 'count' => 1,
+ ]
+ ];
$tasker = $this->mock(AccountTaskerInterface::class);
- $tasker->shouldReceive('getExpenseReport')->andReturn([]);
+ $tasker->shouldReceive('getExpenseReport')->andReturn($return);
$this->be($this->user());
$response = $this->get(route('report-data.operations.expenses', ['1', '20160101', '20160131']));
@@ -65,9 +74,19 @@ class OperationsControllerTest extends TestCase
*/
public function testOperations()
{
+ $return = [
+ 1 => [
+ 'id' => 1,
+ 'name' => 'Some name',
+ 'sum' => '5',
+ 'average' => '5',
+ 'count' => 1,
+ ]
+ ];
+
$tasker = $this->mock(AccountTaskerInterface::class);
- $tasker->shouldReceive('getExpenseReport')->andReturn([]);
- $tasker->shouldReceive('getIncomeReport')->andReturn([]);
+ $tasker->shouldReceive('getExpenseReport')->andReturn($return);
+ $tasker->shouldReceive('getIncomeReport')->andReturn($return);
$this->be($this->user());
$response = $this->get(route('report-data.operations.operations', ['1', '20160101', '20160131']));
diff --git a/tests/Feature/Controllers/Transaction/MassControllerTest.php b/tests/Feature/Controllers/Transaction/MassControllerTest.php
index 8492eab6d8..8348c89c0e 100644
--- a/tests/Feature/Controllers/Transaction/MassControllerTest.php
+++ b/tests/Feature/Controllers/Transaction/MassControllerTest.php
@@ -93,11 +93,12 @@ class MassControllerTest extends TestCase
$transfers = TransactionJournal::where('transaction_type_id', 3)->where('user_id', $this->user()->id)->take(2)->get();
$transfersArray = $transfers->pluck('id')->toArray();
+ $source = $this->user()->accounts()->first();
$journalRepos->shouldReceive('first')->once()->andReturn(new TransactionJournal);
// mock data for edit page:
- $journalRepos->shouldReceive('getJournalSourceAccounts')->andReturn(new Collection);
- $journalRepos->shouldReceive('getJournalDestinationAccounts')->andReturn(new Collection);
+ $journalRepos->shouldReceive('getJournalSourceAccounts')->andReturn(new Collection([$source]));
+ $journalRepos->shouldReceive('getJournalDestinationAccounts')->andReturn(new Collection([$source]));
$journalRepos->shouldReceive('getTransactionType')->andReturn('Transfer');
$journalRepos->shouldReceive('isJournalReconciled')->andReturn(false);
$journalRepos->shouldReceive('getFirstPosTransaction')->andReturn($transfers->first()->transactions()->first());
diff --git a/tests/Feature/Controllers/Transaction/SingleControllerTest.php b/tests/Feature/Controllers/Transaction/SingleControllerTest.php
index 7f91228b17..e3b36ca6bc 100644
--- a/tests/Feature/Controllers/Transaction/SingleControllerTest.php
+++ b/tests/Feature/Controllers/Transaction/SingleControllerTest.php
@@ -114,6 +114,62 @@ class SingleControllerTest extends TestCase
$response->assertSee('');
}
+ /**
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::create
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::__construct
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::groupedActiveAccountList
+ */
+ public function testCreateDepositWithSource()
+ {
+ $accountRepos = $this->mock(AccountRepositoryInterface::class);
+ $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
+ $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
+ $attRepos = $this->mock(AttachmentHelperInterface::class);
+ $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
+ $journalRepos = $this->mock(JournalRepositoryInterface::class);
+ $journalRepos->shouldReceive('first')->once()->andReturn(new TransactionJournal);
+
+ $accounts = $this->user()->accounts()->where('account_type_id', 3)->get();
+ Steam::shouldReceive('phpBytes')->andReturn(2048);
+ $accountRepos->shouldReceive('getActiveAccountsByType')->once()->withArgs([[AccountType::DEFAULT, AccountType::ASSET]])->andReturn($accounts);
+ $budgetRepos->shouldReceive('getActiveBudgets')->andReturn(new Collection)->once();
+ $piggyRepos->shouldReceive('getPiggyBanksWithAmount')->andReturn(new Collection)->once();
+
+ $this->be($this->user());
+ $response = $this->get(route('transactions.create', ['deposit']) . '?source=1');
+ $response->assertStatus(200);
+ // has bread crumb
+ $response->assertSee('');
+ }
+
+ /**
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::create
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::__construct
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::groupedActiveAccountList
+ */
+ public function testCreateWithSource()
+ {
+ $accountRepos = $this->mock(AccountRepositoryInterface::class);
+ $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
+ $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
+ $attRepos = $this->mock(AttachmentHelperInterface::class);
+ $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
+ $journalRepos = $this->mock(JournalRepositoryInterface::class);
+ $journalRepos->shouldReceive('first')->once()->andReturn(new TransactionJournal);
+
+ $accounts = $this->user()->accounts()->where('account_type_id', 3)->get();
+ Steam::shouldReceive('phpBytes')->andReturn(2048);
+ $accountRepos->shouldReceive('getActiveAccountsByType')->once()->withArgs([[AccountType::DEFAULT, AccountType::ASSET]])->andReturn($accounts);
+ $budgetRepos->shouldReceive('getActiveBudgets')->andReturn(new Collection)->once();
+ $piggyRepos->shouldReceive('getPiggyBanksWithAmount')->andReturn(new Collection)->once();
+
+ $this->be($this->user());
+ $response = $this->get(route('transactions.create', ['withdrawal']) . '?source=1');
+ $response->assertStatus(200);
+ // has bread crumb
+ $response->assertSee('');
+ }
+
/**
* @covers \FireflyIII\Http\Controllers\Transaction\SingleController::delete
*/
@@ -174,7 +230,7 @@ class SingleControllerTest extends TestCase
$journalRepos->shouldReceive('first')->once()->andReturn(new TransactionJournal);
$account = $this->user()->accounts()->first();
- $accountRepos->shouldReceive('getAccountsByType')->once()->withArgs([[AccountType::DEFAULT, AccountType::ASSET]])->andReturn(new Collection);
+ $accountRepos->shouldReceive('getAccountsByType')->once()->withArgs([[AccountType::DEFAULT, AccountType::ASSET]])->andReturn(new Collection([$account]));
$budgetRepos->shouldReceive('getBudgets')->andReturn(new Collection)->once();
@@ -351,6 +407,26 @@ class SingleControllerTest extends TestCase
$response->assertStatus(302);
}
+ /**
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::edit
+ */
+ public function testEditRedirectOpening()
+ {
+ $accountRepos = $this->mock(AccountRepositoryInterface::class);
+ $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
+ $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
+ $attRepos = $this->mock(AttachmentHelperInterface::class);
+ $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
+ $journalRepos = $this->mock(JournalRepositoryInterface::class);
+ $journalRepos->shouldReceive('first')->andReturn(new TransactionJournal);
+
+ $this->be($this->user());
+ $journalRepos->shouldReceive('getTransactionType')->andReturn('Opening balance');
+ $journalRepos->shouldReceive('countTransactions')->andReturn(3);
+ $response = $this->get(route('transactions.edit', [1]));
+ $response->assertStatus(302);
+ }
+
/**
* @covers \FireflyIII\Http\Controllers\Transaction\SingleController::edit
* @covers \FireflyIII\Http\Controllers\Transaction\SingleController::groupedAccountList
@@ -400,6 +476,51 @@ class SingleControllerTest extends TestCase
$response->assertSee('');
}
+ /**
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::edit
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::groupedAccountList
+ * @covers \FireflyIII\Http\Controllers\Transaction\SingleController::isSplitJournal
+ */
+ public function testEditWithForeign()
+ {
+ $accountRepos = $this->mock(AccountRepositoryInterface::class);
+ $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
+ $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
+ $attRepos = $this->mock(AttachmentHelperInterface::class);
+ $currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
+ $journalRepos = $this->mock(JournalRepositoryInterface::class);
+ $journalRepos->shouldReceive('first')->once()->andReturn(new TransactionJournal);
+
+ $account = $this->user()->accounts()->first();
+ $accountRepos->shouldReceive('getAccountsByType')->once()->withArgs([[AccountType::DEFAULT, AccountType::ASSET]])->andReturn(new Collection);
+
+ $budgetRepos->shouldReceive('getBudgets')->andReturn(new Collection)->once();
+
+ $transaction = new Transaction;
+ $transaction->foreign_amount = '1';
+ $transaction->foreign_currency_id = 2;
+
+ $journalRepos->shouldReceive('first')->andReturn(new TransactionJournal);
+ $journalRepos->shouldReceive('countTransactions')->andReturn(2)->once();
+ $journalRepos->shouldReceive('getTransactionType')->andReturn('Withdrawal')->once();
+ $journalRepos->shouldReceive('getJournalSourceAccounts')->andReturn(new Collection([$account]))->once();
+ $journalRepos->shouldReceive('getJournalDestinationAccounts')->andReturn(new Collection([$account]))->once();
+ $journalRepos->shouldReceive('getNoteText')->andReturn('Some Note')->once();
+ $journalRepos->shouldReceive('getFirstPosTransaction')->andReturn($transaction)->once();
+ $journalRepos->shouldReceive('getJournalDate')->withAnyArgs()->andReturn('2017-09-01');
+ $journalRepos->shouldReceive('getMetaField')->withAnyArgs()->andReturn('')->once();
+ $journalRepos->shouldReceive('getJournalCategoryName')->once()->andReturn('');
+ $journalRepos->shouldReceive('getJournalBudgetId')->once()->andReturn(0);
+ $journalRepos->shouldReceive('getTags')->once()->andReturn([]);
+
+ $this->be($this->user());
+ $withdrawal = TransactionJournal::where('transaction_type_id', 1)->whereNull('deleted_at')->where('user_id', $this->user()->id)->first();
+ $response = $this->get(route('transactions.edit', [$withdrawal->id]));
+ $response->assertStatus(200);
+ // has bread crumb
+ $response->assertSee('');
+ }
+
/**
* @covers \FireflyIII\Http\Controllers\Transaction\SingleController::edit
* @covers \FireflyIII\Http\Controllers\Transaction\SingleController::groupedAccountList
diff --git a/tests/Feature/Controllers/Transaction/SplitControllerTest.php b/tests/Feature/Controllers/Transaction/SplitControllerTest.php
index 70839af683..8f0e6970fc 100644
--- a/tests/Feature/Controllers/Transaction/SplitControllerTest.php
+++ b/tests/Feature/Controllers/Transaction/SplitControllerTest.php
@@ -67,6 +67,8 @@ class SplitControllerTest extends TestCase
$destination = $deposit->transactions()->where('amount', '>', 0)->first();
$account = $destination->account;
$transactions = factory(Transaction::class, 3)->make();
+ $array = $transactions->toArray();
+ $array[0]['category'] = '';
$journalRepos->shouldReceive('first')->once()->andReturn($deposit);
$journalRepos->shouldReceive('getJournalSourceAccounts')->andReturn(new Collection([$account]));
@@ -78,13 +80,14 @@ class SplitControllerTest extends TestCase
$journalRepos->shouldReceive('getJournalBudgetId')->andReturn(0);
$journalRepos->shouldReceive('getCategoryName')->andReturn('');
$journalRepos->shouldReceive('getJournalTotal')->andReturn('0');
+ $journalRepos->shouldReceive('getJournalCategoryName')->andReturn('Some');
$currencyRepository->shouldReceive('get')->once()->andReturn(new Collection);
$accountRepository->shouldReceive('getAccountsByType')->withArgs([[AccountType::DEFAULT, AccountType::ASSET]])
->andReturn(new Collection([$account]))->once();
$budgetRepository->shouldReceive('getActiveBudgets')->andReturn(new Collection);
- $tasker->shouldReceive('getTransactionsOverview')->andReturn($transactions->toArray());
+ $tasker->shouldReceive('getTransactionsOverview')->andReturn($array);
$this->be($this->user());
$response = $this->get(route('transactions.split.edit', [$deposit->id]));
diff --git a/tests/Unit/Helpers/MetaPieChartTest.php b/tests/Unit/Helpers/MetaPieChartTest.php
index bbfe0be74f..1b87ede22c 100644
--- a/tests/Unit/Helpers/MetaPieChartTest.php
+++ b/tests/Unit/Helpers/MetaPieChartTest.php
@@ -27,6 +27,7 @@ use FireflyIII\Helpers\Chart\MetaPieChart;
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
use FireflyIII\Helpers\Filter\NegativeAmountFilter;
use FireflyIII\Helpers\Filter\OpposingAccountFilter;
+use FireflyIII\Helpers\Filter\PositiveAmountFilter;
use FireflyIII\Helpers\Filter\TransferFilter;
use FireflyIII\Models\Account;
use FireflyIII\Models\Transaction;
@@ -45,11 +46,119 @@ use Tests\TestCase;
class MetaPieChartTest extends TestCase
{
/**
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::__construct
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::generate
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::getTransactions
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::groupByFields
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::organizeByType
+ * @covers \FireflyIII\Helpers\Chart\MetaPieChart
+ */
+ public function testGenerateExpenseAccount()
+ {
+ $som = (new Carbon())->startOfMonth();
+ $eom = (new Carbon())->endOfMonth();
+ $collection = $this->fakeTransactions();
+ $accounts = [
+ 1 => factory(Account::class)->make(),
+ 2 => factory(Account::class)->make(),
+ ];
+
+ // mock collector so the correct set of journals is returned:
+ // then verify the results.
+ $collector = $this->mock(JournalCollectorInterface::class);
+
+ $collector->shouldReceive('addFilter')->withArgs([PositiveAmountFilter::class])->andReturnSelf()->once();
+ $collector->shouldReceive('removeFilter')->withArgs([NegativeAmountFilter::class])->andReturnSelf()->once();
+ $collector->shouldReceive('addFilter')->withArgs([NegativeAmountFilter::class])->andReturnSelf()->once();
+ $collector->shouldReceive('addFilter')->withArgs([OpposingAccountFilter::class])->andReturnSelf()->once();
+ $collector->shouldReceive('setUser')->andReturnSelf()->once();
+ $collector->shouldReceive('setAccounts')->andReturnSelf()->once();
+ $collector->shouldReceive('setRange')->andReturnSelf()->once();
+ $collector->shouldReceive('setBudgets')->andReturnSelf()->once();
+ $collector->shouldReceive('setCategories')->andReturnSelf()->once();
+ $collector->shouldReceive('setTypes')->withArgs([[TransactionType::WITHDRAWAL, TransactionType::TRANSFER]])->andReturnSelf()->once();
+ $collector->shouldReceive('withOpposingAccount')->andReturnSelf()->once();
+ $collector->shouldReceive('getJournals')->andReturn($collection);
+
+ // mock all repositories:
+ $accountRepos = $this->mock(AccountRepositoryInterface::class);
+
+ $accountRepos->shouldReceive('setUser');
+ $accountRepos->shouldReceive('find')->withArgs([1])->andReturn($accounts[1]);
+ $accountRepos->shouldReceive('find')->withArgs([2])->andReturn($accounts[2]);
+
+ $helper = new MetaPieChart();
+ $helper->setUser($this->user());
+ $helper->setStart($som);
+ $helper->setEnd($eom);
+ $chart = $helper->generate('expense', 'account');
+
+ // since the set is pretty basic the result is easy to validate:
+ $keys = array_keys($chart);
+ $this->assertEquals($keys[0], $accounts[1]->name);
+ $this->assertEquals($keys[1], $accounts[2]->name);
+ $this->assertTrue(0 === bccomp('1000', $chart[$accounts[1]->name]));
+ $this->assertTrue(0 === bccomp('1000', $chart[$accounts[2]->name]));
+
+ $this->assertTrue(true);
+ }
+
+ /**
+ * @covers \FireflyIII\Helpers\Chart\MetaPieChart
+ */
+ public function testGenerateExpenseAccountWithOthers()
+ {
+ $som = (new Carbon())->startOfMonth();
+ $eom = (new Carbon())->endOfMonth();
+ $collection = $this->fakeTransactions();
+ $others = $this->fakeOthers();
+ $accounts = [
+ 1 => factory(Account::class)->make(),
+ 2 => factory(Account::class)->make(),
+ ];
+
+ // mock collector so the correct set of journals is returned:
+ // then verify the results.
+ $collector = $this->mock(JournalCollectorInterface::class);
+ $collector->shouldReceive('addFilter')->withArgs([NegativeAmountFilter::class])->andReturnSelf()->once();
+ $collector->shouldReceive('addFilter')->withArgs([PositiveAmountFilter::class])->andReturnSelf()->once();
+ $collector->shouldReceive('addFilter')->withArgs([OpposingAccountFilter::class])->andReturnSelf()->once();
+ $collector->shouldReceive('removeFilter')->withArgs([NegativeAmountFilter::class])->andReturnSelf()->once();
+ $collector->shouldReceive('setUser')->andReturnSelf()->twice();
+ $collector->shouldReceive('setAccounts')->andReturnSelf()->twice();
+ $collector->shouldReceive('setRange')->andReturnSelf()->twice();
+ $collector->shouldReceive('setBudgets')->andReturnSelf()->once();
+ $collector->shouldReceive('setCategories')->andReturnSelf()->once();
+ $collector->shouldReceive('setTypes')->withArgs([[TransactionType::WITHDRAWAL, TransactionType::TRANSFER]])->andReturnSelf()->once();
+ $collector->shouldReceive('withOpposingAccount')->andReturnSelf()->once();
+ $collector->shouldReceive('getJournals')->andReturn($collection)->once();
+
+ $collector->shouldReceive('setTypes')->withArgs([[TransactionType::WITHDRAWAL]])->andReturnSelf()->once();
+ $collector->shouldReceive('getJournals')->andReturn($others)->once();
+
+ // mock all repositories:
+ $accountRepos = $this->mock(AccountRepositoryInterface::class);
+
+ $accountRepos->shouldReceive('setUser');
+ $accountRepos->shouldReceive('find')->withArgs([1])->andReturn($accounts[1]);
+ $accountRepos->shouldReceive('find')->withArgs([2])->andReturn($accounts[2]);
+
+ $helper = new MetaPieChart();
+ $helper->setCollectOtherObjects(true);
+ $helper->setUser($this->user());
+ $helper->setStart($som);
+ $helper->setEnd($eom);
+ $chart = $helper->generate('expense', 'account');
+
+ // since the set is pretty basic the result is easy to validate:
+ $keys = array_keys($chart);
+ $this->assertEquals($keys[0], $accounts[1]->name);
+ $this->assertEquals($keys[1], $accounts[2]->name);
+ $this->assertTrue(0 === bccomp('1000', $chart[$accounts[1]->name]));
+ $this->assertTrue(0 === bccomp('1000', $chart[$accounts[2]->name]));
+ $this->assertTrue(0 === bccomp('-5000', $chart['Everything else']));
+
+ $this->assertTrue(true);
+ }
+
+
+ /**
+ * @covers \FireflyIII\Helpers\Chart\MetaPieChart
*/
public function testGenerateIncomeAccount()
{
@@ -101,11 +210,7 @@ class MetaPieChartTest extends TestCase
}
/**
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::__construct
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::generate
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::getTransactions
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::groupByFields
- * @covers \FireflyIII\Helpers\Chart\MetaPieChart::organizeByType
+ * @covers \FireflyIII\Helpers\Chart\MetaPieChart
*/
public function testGenerateIncomeAccountWithOthers()
{
diff --git a/tests/Unit/TransactionRules/Triggers/FromAccountIsTest.php b/tests/Unit/TransactionRules/Triggers/FromAccountIsTest.php
index 29d735ed10..34d74c0b8f 100644
--- a/tests/Unit/TransactionRules/Triggers/FromAccountIsTest.php
+++ b/tests/Unit/TransactionRules/Triggers/FromAccountIsTest.php
@@ -36,8 +36,12 @@ class FromAccountIsTest extends TestCase
*/
public function testTriggered()
{
- $journal = TransactionJournal::inRandomOrder()->whereNull('deleted_at')->first();
- $transaction = $journal->transactions()->where('amount', '<', 0)->first();
+ $count = 0;
+ while ($count === 0) {
+ $journal = TransactionJournal::inRandomOrder()->whereNull('deleted_at')->first();
+ $count = $journal->transactions()->where('amount', '<', 0)->count();
+ $transaction = $journal->transactions()->where('amount', '<', 0)->first();
+ }
$account = $transaction->account;
$trigger = FromAccountIs::makeFromStrings($account->name, false);