diff --git a/app/Http/Controllers/Popup/ReportController.php b/app/Http/Controllers/Popup/ReportController.php index 20917d1c9f..e31b136803 100644 --- a/app/Http/Controllers/Popup/ReportController.php +++ b/app/Http/Controllers/Popup/ReportController.php @@ -9,7 +9,7 @@ * See the LICENSE file for details. */ -declare(strict_types = 1); +declare(strict_types=1); namespace FireflyIII\Http\Controllers\Popup; @@ -18,6 +18,7 @@ use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collection\BalanceLine; use FireflyIII\Helpers\Collector\JournalCollectorInterface; +use FireflyIII\Helpers\Report\PopupReportInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; @@ -39,6 +40,44 @@ use View; class ReportController extends Controller { + /** @var AccountRepositoryInterface */ + private $accountRepository; + /** @var BudgetRepositoryInterface */ + private $budgetRepository; + /** @var CategoryRepositoryInterface */ + private $categoryRepository; + /** @var PopupReportInterface */ + private $popupHelper; + + + /** + * + */ + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + + /** @var AccountRepositoryInterface $repository */ + $this->accountRepository = app(AccountRepositoryInterface::class); + + /** @var BudgetRepositoryInterface $repository */ + $this->budgetRepository = app(BudgetRepositoryInterface::class); + + /** @var CategoryRepositoryInterface categoryRepository */ + $this->categoryRepository = app(CategoryRepositoryInterface::class); + + /** @var PopupReportInterface popupHelper */ + $this->popupHelper = app(PopupReportInterface::class); + + return $next($request); + } + ); + + } + + /** * @param Request $request * @@ -58,7 +97,6 @@ class ReportController extends Controller throw new FireflyException('Firefly cannot handle "' . e($attributes['location']) . '" '); case 'budget-spent-amount': $html = $this->budgetSpentAmount($attributes); - break; case 'expense-entry': $html = $this->expenseEntry($attributes); @@ -87,30 +125,19 @@ class ReportController extends Controller */ private function balanceAmount(array $attributes): string { - $role = intval($attributes['role']); - - /** @var BudgetRepositoryInterface $budgetRepository */ - $budgetRepository = app(BudgetRepositoryInterface::class); - $budget = $budgetRepository->find(intval($attributes['budgetId'])); - - /** @var AccountRepositoryInterface $repository */ - $repository = app(AccountRepositoryInterface::class); - - $account = $repository->find(intval($attributes['accountId'])); + $role = intval($attributes['role']); + $budget = $this->budgetRepository->find(intval($attributes['budgetId'])); + $account = $this->accountRepository->find(intval($attributes['accountId'])); $types = [TransactionType::WITHDRAWAL]; switch (true) { case ($role === BalanceLine::ROLE_DEFAULTROLE && !is_null($budget->id)): - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class); - $collector - ->setAccounts(new Collection([$account])) - ->setRange($attributes['startDate'], $attributes['endDate']) - ->setBudget($budget); - $journals = $collector->getJournals(); - + // normal row with a budget: + $journals = $this->popupHelper->balanceForBudget($budget, $account, $attributes); break; case ($role === BalanceLine::ROLE_DEFAULTROLE && is_null($budget->id)): + // normal row without a budget: + $journals = $this->popupHelper->balanceForNoBudget($account, $attributes); $budget->name = strval(trans('firefly.no_budget')); /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); @@ -122,6 +149,7 @@ class ReportController extends Controller $journals = $collector->getJournals(); break; case ($role === BalanceLine::ROLE_DIFFROLE): + // row that displays difference /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector @@ -144,6 +172,7 @@ class ReportController extends Controller ); break; case ($role === BalanceLine::ROLE_TAGROLE): + // row with tag info. throw new FireflyException('Firefly cannot handle this type of info-button (BalanceLine::TagRole)'); } $view = view('popup.report.balance-amount', compact('journals', 'budget', 'account'))->render(); @@ -161,27 +190,8 @@ class ReportController extends Controller */ private function budgetSpentAmount(array $attributes): string { - // need to find the budget - // then search for expenses in the given period - // list them in some table format. - /** @var BudgetRepositoryInterface $repository */ - $repository = app(BudgetRepositoryInterface::class); - $budget = $repository->find(intval($attributes['budgetId'])); - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class); - - $collector - ->setAccounts($attributes['accounts']) - ->setRange($attributes['startDate'], $attributes['endDate']); - - if (is_null($budget->id)) { - $collector->setTypes([TransactionType::WITHDRAWAL])->withoutBudget(); - } - if (!is_null($budget->id)) { - // get all expenses in budget in period: - $collector->setBudget($budget); - } - $journals = $collector->getJournals(); + $budget = $this->budgetRepository->find(intval($attributes['budgetId'])); + $journals = $this->popupHelper->byBudget($budget, $attributes); $view = view('popup.report.budget-spent-amount', compact('journals', 'budget'))->render(); return $view; @@ -197,18 +207,9 @@ class ReportController extends Controller */ private function categoryEntry(array $attributes): string { - /** @var CategoryRepositoryInterface $repository */ - $repository = app(CategoryRepositoryInterface::class); - $category = $repository->find(intval($attributes['categoryId'])); - $types = [TransactionType::WITHDRAWAL, TransactionType::TRANSFER]; - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class); - $collector->setAccounts($attributes['accounts'])->setTypes($types) - ->setRange($attributes['startDate'], $attributes['endDate']) - ->setCategory($category); - $journals = $collector->getJournals(); // 7193 - - $view = view('popup.report.category-entry', compact('journals', 'category'))->render(); + $category = $this->categoryRepository->find(intval($attributes['categoryId'])); + $journals = $this->popupHelper->byCategory($category, $attributes); + $view = view('popup.report.category-entry', compact('journals', 'category'))->render(); return $view; } @@ -223,29 +224,9 @@ class ReportController extends Controller */ private function expenseEntry(array $attributes): string { - /** @var AccountRepositoryInterface $repository */ - $repository = app(AccountRepositoryInterface::class); - - $account = $repository->find(intval($attributes['accountId'])); - $types = [TransactionType::WITHDRAWAL, TransactionType::TRANSFER]; - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class); - $collector->setAccounts(new Collection([$account]))->setRange($attributes['startDate'], $attributes['endDate'])->setTypes($types); - $journals = $collector->getJournals(); - $report = $attributes['accounts']->pluck('id')->toArray(); // accounts used in this report - - // filter for transfers and withdrawals TO the given $account - $journals = $journals->filter( - function (Transaction $transaction) use ($report) { - // get the destinations: - $sources = $transaction->transactionJournal->sourceAccountList()->pluck('id')->toArray(); - - // do these intersect with the current list? - return !empty(array_intersect($report, $sources)); - } - ); - - $view = view('popup.report.expense-entry', compact('journals', 'account'))->render(); + $account = $this->accountRepository->find(intval($attributes['accountId'])); + $journals = $this->popupHelper->byExpenses($account, $attributes); + $view = view('popup.report.expense-entry', compact('journals', 'account'))->render(); return $view; } @@ -260,28 +241,9 @@ class ReportController extends Controller */ private function incomeEntry(array $attributes): string { - /** @var AccountRepositoryInterface $repository */ - $repository = app(AccountRepositoryInterface::class); - $account = $repository->find(intval($attributes['accountId'])); - $types = [TransactionType::DEPOSIT, TransactionType::TRANSFER]; - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class); - $collector->setAccounts(new Collection([$account]))->setRange($attributes['startDate'], $attributes['endDate'])->setTypes($types); - $journals = $collector->getJournals(); - $report = $attributes['accounts']->pluck('id')->toArray(); // accounts used in this report - - // filter the set so the destinations outside of $attributes['accounts'] are not included. - $journals = $journals->filter( - function (Transaction $transaction) use ($report) { - // get the destinations: - $destinations = $transaction->destinationAccountList($transaction->transactionJournal)->pluck('id')->toArray(); - - // do these intersect with the current list? - return !empty(array_intersect($report, $destinations)); - } - ); - - $view = view('popup.report.income-entry', compact('journals', 'account'))->render(); + $account = $this->accountRepository->find(intval($attributes['accountId'])); + $journals = $this->popupHelper->byIncome($account, $attributes); + $view = view('popup.report.income-entry', compact('journals', 'account'))->render(); return $view; } diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 928877af74..b6adef9c32 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -48,6 +48,7 @@ class ReportController extends Controller { parent::__construct(); + $this->helper = app(ReportHelperInterface::class); $this->middleware( function ($request, $next) { @@ -55,8 +56,6 @@ class ReportController extends Controller View::share('mainTitleIcon', 'fa-line-chart'); View::share('subTitleIcon', 'fa-calendar'); - $this->helper = app(ReportHelperInterface::class); - return $next($request); } ); diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index 40f456b4d0..7a9e9d68d6 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -9,7 +9,7 @@ * See the LICENSE file for details. */ -declare(strict_types = 1); +declare(strict_types=1); namespace FireflyIII\Providers; @@ -29,6 +29,8 @@ use FireflyIII\Helpers\Report\BalanceReportHelper; use FireflyIII\Helpers\Report\BalanceReportHelperInterface; use FireflyIII\Helpers\Report\BudgetReportHelper; use FireflyIII\Helpers\Report\BudgetReportHelperInterface; +use FireflyIII\Helpers\Report\PopupReport; +use FireflyIII\Helpers\Report\PopupReportInterface; use FireflyIII\Helpers\Report\ReportHelper; use FireflyIII\Helpers\Report\ReportHelperInterface; use FireflyIII\Import\ImportProcedure; @@ -127,6 +129,8 @@ class FireflyServiceProvider extends ServiceProvider $this->app->bind(UserRepositoryInterface::class, UserRepository::class); $this->app->bind(AttachmentHelperInterface::class, AttachmentHelper::class); + // more generators: + $this->app->bind(PopupReportInterface::class, PopupReport::class); $this->app->bind(HelpInterface::class, Help::class); $this->app->bind(ReportHelperInterface::class, ReportHelper::class); $this->app->bind(FiscalHelperInterface::class, FiscalHelper::class); diff --git a/config/app.php b/config/app.php index f92541fb61..c84082d457 100644 --- a/config/app.php +++ b/config/app.php @@ -9,7 +9,7 @@ * See the LICENSE file for details. */ -declare(strict_types = 1); +declare(strict_types=1); return [ 'name' => 'Firefly III', @@ -70,7 +70,7 @@ return [ //Barryvdh\Debugbar\ServiceProvider::class, DaveJamesMiller\Breadcrumbs\ServiceProvider::class, TwigBridge\ServiceProvider::class, - 'PragmaRX\Google2FA\Vendor\Laravel\ServiceProvider', + PragmaRX\Google2FA\Vendor\Laravel\ServiceProvider::class, /* * More service providers. @@ -125,7 +125,7 @@ return [ 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, - 'Twig' => 'TwigBridge\Facade\Twig', + 'Twig' => TwigBridge\Facade\Twig::class, 'Form' => Collective\Html\FormFacade::class, 'Html' => Collective\Html\HtmlFacade::class, 'Breadcrumbs' => 'DaveJamesMiller\Breadcrumbs\Facade', @@ -137,7 +137,7 @@ return [ 'ExpandedForm' => 'FireflyIII\Support\Facades\ExpandedForm', 'Entrust' => 'Zizaco\Entrust\EntrustFacade', 'Input' => 'Illuminate\Support\Facades\Input', - 'Google2FA' => 'PragmaRX\Google2FA\Vendor\Laravel\Facade', + 'Google2FA' => PragmaRX\Google2FA\Vendor\Laravel\Facade::class, ], ]; diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index a0d1e7c2b7..24ee6536a2 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -116,8 +116,10 @@ $factory->define( $factory->define( FireflyIII\Models\Tag::class, function (Faker\Generator $faker) { return [ - 'id' => $faker->numberBetween(1, 10), - 'tag' => $faker->words(1, true), + 'id' => $faker->numberBetween(100, 150), + 'user_id' => 1, + 'tagMode' => 'nothing', + 'tag' => $faker->words(1, true), ]; } ); diff --git a/resources/views/reports/partials/bills.twig b/resources/views/reports/partials/bills.twig index 05f7f02839..c532abd610 100644 --- a/resources/views/reports/partials/bills.twig +++ b/resources/views/reports/partials/bills.twig @@ -10,7 +10,7 @@ {{ trans('form.amount_min') }} {{ trans('form.amount_max') }} {{ trans('form.amount') }} - {{ trans('form.under') }} + {{ trans('form.under') }} @@ -34,7 +34,7 @@ {% if not line.isActive %}   {% endif %} - + {% if line.isActive %} {{ (line.getMax + line.getAmount)|formatAmount }} {% endif %} diff --git a/resources/views/reports/partials/budgets.twig b/resources/views/reports/partials/budgets.twig index 97fef8c762..d9f5cb991a 100644 --- a/resources/views/reports/partials/budgets.twig +++ b/resources/views/reports/partials/budgets.twig @@ -3,10 +3,10 @@ {{ 'budget'|_ }} {{ 'date'|_ }} - {{ 'budgeted'|_ }} + {{ 'budgeted'|_ }} {{ 'spent'|_ }} -   - {{ 'left'|_ }} +   + {{ 'left'|_ }} {{ 'overspent'|_ }} @@ -23,6 +23,7 @@ {% set sum_overspent = sum_overspent + line.overspent %} + {# Budget name, always visible #} {% if line.type == 'no-budget' %} {{ 'no_budget'|_ }} @@ -32,6 +33,7 @@ {{ line.name }} {% endif %} + {# date, hidden on mobile #} {% if line.type == 'budget-line' %} @@ -41,25 +43,35 @@ {% else %} - + {% endif %} - + + {# budgeted, hidden on mobile #} + {{ line.budgeted|formatAmount }} + + {# spent, visible on mobile #} {{ line.spent|formatAmount }} - + + {# info button, not visible on mobile #} + {% if line.spent != 0 %} {% endif %} - + + {# left, hidden on mobile #} + {{ line.left|formatAmount }} + + {# overspent, visible. #} {{ line.overspent|formatAmount }} @@ -68,12 +80,22 @@ + {# title, visible #} {{ 'sum'|_ }} + {# date, hidden #}   - {{ sum_budgeted|formatAmount }} + + {# sum of budgeted, hidden #} + {{ sum_budgeted|formatAmount }} + + {# spent, visible #} {{ sum_spent|formatAmount }} -   - {{ sum_left|formatAmount }} + + {# info button, hidden #} +   + + {# left, hidden #} + {{ sum_left|formatAmount }} {{ sum_overspent|formatAmount }} diff --git a/resources/views/reports/partials/categories.twig b/resources/views/reports/partials/categories.twig index eec4ac0843..cc2d2b88de 100644 --- a/resources/views/reports/partials/categories.twig +++ b/resources/views/reports/partials/categories.twig @@ -30,7 +30,7 @@ {% if report|length > listLength %} - + {{ trans('firefly.show_full_list',{number:incomeTopLength}) }} diff --git a/tests/Feature/Controllers/Chart/CategoryReportControllerTest.php b/tests/Feature/Controllers/Chart/CategoryReportControllerTest.php index cae2f3b8cb..faa0aa69b5 100644 --- a/tests/Feature/Controllers/Chart/CategoryReportControllerTest.php +++ b/tests/Feature/Controllers/Chart/CategoryReportControllerTest.php @@ -7,7 +7,7 @@ * See the LICENSE file for details. */ -declare(strict_types = 1); +declare(strict_types=1); namespace Tests\Feature\Controllers\Chart; @@ -15,6 +15,7 @@ namespace Tests\Feature\Controllers\Chart; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Helpers\Chart\MetaPieChartInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface; +use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; use Illuminate\Support\Collection; use Tests\TestCase; @@ -120,8 +121,9 @@ class CategoryReportControllerTest extends TestCase */ public function testMainChart() { - $generator = $this->mock(GeneratorInterface::class); - $collector = $this->mock(JournalCollectorInterface::class); + $generator = $this->mock(GeneratorInterface::class); + $collector = $this->mock(JournalCollectorInterface::class); + $transaction = factory(Transaction::class)->make(); $collector->shouldReceive('setAccounts')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf(); @@ -130,7 +132,7 @@ class CategoryReportControllerTest extends TestCase $collector->shouldReceive('disableFilter')->andReturnSelf(); $collector->shouldReceive('setCategories')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); - $collector->shouldReceive('getJournals')->andReturn(new Collection); + $collector->shouldReceive('getJournals')->andReturn(new Collection([$transaction])); $generator->shouldReceive('multiSet')->andReturn([])->once(); $this->be($this->user()); diff --git a/tests/Feature/Controllers/Chart/TagReportControllerTest.php b/tests/Feature/Controllers/Chart/TagReportControllerTest.php index 0b2ec47f8d..14458cd7ac 100644 --- a/tests/Feature/Controllers/Chart/TagReportControllerTest.php +++ b/tests/Feature/Controllers/Chart/TagReportControllerTest.php @@ -7,7 +7,7 @@ * See the LICENSE file for details. */ -declare(strict_types = 1); +declare(strict_types=1); namespace Tests\Feature\Controllers\Chart; @@ -15,6 +15,8 @@ namespace Tests\Feature\Controllers\Chart; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Helpers\Chart\MetaPieChartInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface; +use FireflyIII\Models\Tag; +use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; use Illuminate\Support\Collection; use Tests\TestCase; @@ -114,11 +116,18 @@ class TagReportControllerTest extends TestCase /** * @covers \FireflyIII\Http\Controllers\Chart\TagReportController::mainChart() + * @covers \FireflyIII\Http\Controllers\Chart\TagReportController::getExpenses + * @covers \FireflyIII\Http\Controllers\Chart\TagReportController::getIncome + * @covers \FireflyIII\Http\Controllers\Chart\TagReportController::groupByTag */ public function testMainChart() { - $generator = $this->mock(GeneratorInterface::class); - $collector = $this->mock(JournalCollectorInterface::class); + $generator = $this->mock(GeneratorInterface::class); + $collector = $this->mock(JournalCollectorInterface::class); + $transaction = factory(Transaction::class)->make(); + $tag = factory(Tag::class)->make(); + $transaction->transactionJournal->tags()->save($tag); + $collector->shouldReceive('setAccounts')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf(); @@ -127,7 +136,7 @@ class TagReportControllerTest extends TestCase $collector->shouldReceive('disableFilter')->andReturnSelf(); $collector->shouldReceive('setTags')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); - $collector->shouldReceive('getJournals')->andReturn(new Collection); + $collector->shouldReceive('getJournals')->andReturn(new Collection([$transaction])); $generator->shouldReceive('multiSet')->andReturn([])->once(); $this->be($this->user()); @@ -157,7 +166,7 @@ class TagReportControllerTest extends TestCase } /** - * @covers \FireflyIII\Http\Controllers\Chart\TagReportController::tagIncome() + * @covers \FireflyIII\Http\Controllers\Chart\TagReportController::tagIncome */ public function testTagIncome() { diff --git a/tests/Feature/Controllers/Popup/ReportControllerTest.php b/tests/Feature/Controllers/Popup/ReportControllerTest.php index 7b024ff8ff..da44a7f38a 100644 --- a/tests/Feature/Controllers/Popup/ReportControllerTest.php +++ b/tests/Feature/Controllers/Popup/ReportControllerTest.php @@ -7,7 +7,7 @@ * See the LICENSE file for details. */ -declare(strict_types = 1); +declare(strict_types=1); namespace Tests\Feature\Controllers\Popup; @@ -17,6 +17,8 @@ use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Account; use FireflyIII\Models\Budget; use FireflyIII\Models\Category; +use FireflyIII\Models\Tag; +use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; @@ -33,12 +35,98 @@ use Tests\TestCase; class ReportControllerTest extends TestCase { + /** + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::general + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::parseAttributes + * @expectedExceptionMessage Could not parse end date + */ + public function testBadEndDate() + { + $this->be($this->user()); + $arguments = [ + 'attributes' => [ + 'location' => 'bla-bla', + 'startDate' => Carbon::now()->endOfMonth()->format('Ymd'), + 'endDate' => 'bla-bla', + 'accounts' => 1, + 'accountId' => 1, + 'categoryId' => 1, + 'budgetId' => 1, + ], + ]; + $uri = route('popup.general') . '?' . http_build_query($arguments); + $response = $this->get($uri); + $response->assertStatus(500); + } + + /** + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::general + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::parseAttributes + * @expectedExceptionMessage Could not parse start date + */ + public function testBadStartDate() + { + $this->be($this->user()); + $arguments = [ + 'attributes' => [ + 'location' => 'bla-bla', + 'startDate' => 'bla-bla', + 'endDate' => Carbon::now()->endOfMonth()->format('Ymd'), + 'accounts' => 1, + 'accountId' => 1, + 'categoryId' => 1, + 'budgetId' => 1, + ], + ]; + $uri = route('popup.general') . '?' . http_build_query($arguments); + $response = $this->get($uri); + $response->assertStatus(500); + } + /** * @covers \FireflyIII\Http\Controllers\Popup\ReportController::general * @covers \FireflyIII\Http\Controllers\Popup\ReportController::parseAttributes * @covers \FireflyIII\Http\Controllers\Popup\ReportController::balanceAmount */ - public function testBalanceAmount() + public function testBalanceAmountDefaultNoBudget() + { + $collector = $this->mock(JournalCollectorInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $account = factory(Account::class)->make(); + + $budgetRepos->shouldReceive('find')->andReturn(new Budget)->once()->withArgs([0]); + $accountRepos->shouldReceive('find')->andReturn($account)->once()->withArgs([1]); + $collector->shouldReceive('setAccounts')->andReturnSelf()->once(); + $collector->shouldReceive('setRange')->once()->andReturnSelf(); + $collector->shouldReceive('setTypes')->once()->andReturnSelf(); + $collector->shouldReceive('withoutBudget')->once()->andReturnSelf(); + $collector->shouldReceive('getJournals')->once()->andReturn(new Collection); + + $this->be($this->user()); + $arguments = [ + 'attributes' => [ + 'location' => 'balance-amount', + 'startDate' => Carbon::now()->startOfMonth()->format('Ymd'), + 'endDate' => Carbon::now()->endOfMonth()->format('Ymd'), + 'accounts' => 1, + 'accountId' => 1, + 'categoryId' => 1, + 'budgetId' => 0, + 'role' => 1, // ROLE_DEFAULTROLE + ], + ]; + $uri = route('popup.general') . '?' . http_build_query($arguments); + $response = $this->get($uri); + $response->assertStatus(200); + } + + /** + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::general + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::parseAttributes + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::balanceAmount + */ + public function testBalanceAmountDefaultRole() { $collector = $this->mock(JournalCollectorInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); @@ -46,13 +134,56 @@ class ReportControllerTest extends TestCase $budget = factory(Budget::class)->make(); $account = factory(Account::class)->make(); + $budgetRepos->shouldReceive('find')->andReturn($budget)->once()->withArgs([1]); + $accountRepos->shouldReceive('find')->andReturn($account)->once()->withArgs([1]); + $collector->shouldReceive('setAccounts')->andReturnSelf()->once(); + $collector->shouldReceive('setRange')->once()->andReturnSelf(); + $collector->shouldReceive('setBudget')->once()->andReturnSelf(); + $collector->shouldReceive('getJournals')->once()->andReturn(new Collection); + + $this->be($this->user()); + $arguments = [ + 'attributes' => [ + 'location' => 'balance-amount', + 'startDate' => Carbon::now()->startOfMonth()->format('Ymd'), + 'endDate' => Carbon::now()->endOfMonth()->format('Ymd'), + 'accounts' => 1, + 'accountId' => 1, + 'categoryId' => 1, + 'budgetId' => 1, + 'role' => 1, // ROLE_DEFAULTROLE + ], + ]; + $uri = route('popup.general') . '?' . http_build_query($arguments); + $response = $this->get($uri); + $response->assertStatus(200); + } + + /** + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::general + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::parseAttributes + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::balanceAmount + */ + public function testBalanceAmountDiffRole() + { + $collector = $this->mock(JournalCollectorInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $budget = factory(Budget::class)->make(); + $account = factory(Account::class)->make(); + $one = factory(Transaction::class)->make(); + $two = factory(Transaction::class)->make(); + $tag = factory(Tag::class)->make(); + $tag->tagMode = 'balancingAct'; + $two->transactionJournal->tags()->save($tag); + $budgetRepos->shouldReceive('find')->andReturn($budget)->once()->withArgs([1]); $accountRepos->shouldReceive('find')->andReturn($account)->once()->withArgs([1]); $collector->shouldReceive('setAccounts')->andReturnSelf()->once(); $collector->shouldReceive('setTypes')->withArgs([[TransactionType::WITHDRAWAL]])->andReturnSelf(); $collector->shouldReceive('setRange')->once()->andReturnSelf(); $collector->shouldReceive('withoutBudget')->once()->andReturnSelf(); - $collector->shouldReceive('getJournals')->once()->andReturn(new Collection); + $collector->shouldReceive('getJournals')->once()->andReturn(new Collection([$one, $two])); $this->be($this->user()); $arguments = [ @@ -209,5 +340,29 @@ class ReportControllerTest extends TestCase $response->assertStatus(200); } + /** + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::general + * @covers \FireflyIII\Http\Controllers\Popup\ReportController::parseAttributes + * @expectedExceptionMessage Firefly cannot handle + */ + public function testWrongLocation() + { + $this->be($this->user()); + $arguments = [ + 'attributes' => [ + 'location' => 'bla-bla', + 'startDate' => Carbon::now()->startOfMonth()->format('Ymd'), + 'endDate' => Carbon::now()->endOfMonth()->format('Ymd'), + 'accounts' => 1, + 'accountId' => 1, + 'categoryId' => 1, + 'budgetId' => 1, + ], + ]; + $uri = route('popup.general') . '?' . http_build_query($arguments); + $response = $this->get($uri); + $response->assertStatus(500); + } + }