From 8a7297e1316b23bac3d430f0cdd020c9d3f8ad00 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 11 Dec 2016 16:25:46 +0100 Subject: [PATCH] Code for currency controller tests. --- app/Http/Controllers/CurrencyController.php | 60 ++++--------------- app/Providers/CurrencyServiceProvider.php | 60 +++++++++++++++++++ app/Providers/FireflyServiceProvider.php | 2 +- .../Currency/CurrencyRepository.php | 60 +++++++++++++++++++ .../Currency/CurrencyRepositoryInterface.php | 14 +++++ config/app.php | 1 + .../Controllers/CurrencyControllerTest.php | 50 +++++++++++----- 7 files changed, 182 insertions(+), 65 deletions(-) create mode 100644 app/Providers/CurrencyServiceProvider.php diff --git a/app/Http/Controllers/CurrencyController.php b/app/Http/Controllers/CurrencyController.php index f5948f4785..6917d5ca6a 100644 --- a/app/Http/Controllers/CurrencyController.php +++ b/app/Http/Controllers/CurrencyController.php @@ -89,14 +89,16 @@ class CurrencyController extends Controller } + /** - * @param TransactionCurrency $currency + * @param CurrencyRepositoryInterface $repository + * @param TransactionCurrency $currency * - * @return \Illuminate\Http\RedirectResponse|View + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View */ - public function delete(TransactionCurrency $currency) + public function delete(CurrencyRepositoryInterface $repository, TransactionCurrency $currency) { - if (!$this->canDeleteCurrency($currency)) { + if (!$repository->canDeleteCurrency($currency)) { Session::flash('error', trans('firefly.cannot_delete_currency', ['name' => $currency->name])); return redirect(route('currencies.index')); @@ -114,23 +116,21 @@ class CurrencyController extends Controller } /** - * @param TransactionCurrency $currency + * @param CurrencyRepositoryInterface $repository + * @param TransactionCurrency $currency * - * @return \Illuminate\Http\RedirectResponse - * @throws \Exception + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function destroy(TransactionCurrency $currency) + public function destroy(CurrencyRepositoryInterface $repository, TransactionCurrency $currency) { - if (!$this->canDeleteCurrency($currency)) { + if (!$repository->canDeleteCurrency($currency)) { Session::flash('error', trans('firefly.cannot_delete_currency', ['name' => $currency->name])); return redirect(route('currencies.index')); } + $repository->destroy($currency); Session::flash('success', trans('firefly.deleted_currency', ['name' => $currency->name])); - if (auth()->user()->hasRole('owner')) { - $currency->forceDelete(); - } return redirect(session('currencies.delete.url')); } @@ -235,40 +235,4 @@ class CurrencyController extends Controller return redirect(session('currencies.edit.url')); } - - /** - * @param TransactionCurrency $currency - * - * @return bool - */ - private function canDeleteCurrency(TransactionCurrency $currency): bool - { - $repository = app(CurrencyRepositoryInterface::class); - - // has transactions still - if ($repository->countJournals($currency) > 0) { - return false; - } - - // is the only currency left - if ($repository->get()->count() === 1) { - return false; - } - - // is the default currency for the user or the system - $defaultCode = Preferences::get('currencyPreference', config('firefly.default_currency', 'EUR'))->data; - if ($currency->code === $defaultCode) { - return false; - } - - // is the default currency for the system - $defaultSystemCode = config('firefly.default_currency', 'EUR'); - if ($currency->code === $defaultSystemCode) { - return false; - } - - // can be deleted - return true; - } - } diff --git a/app/Providers/CurrencyServiceProvider.php b/app/Providers/CurrencyServiceProvider.php new file mode 100644 index 0000000000..d95532e072 --- /dev/null +++ b/app/Providers/CurrencyServiceProvider.php @@ -0,0 +1,60 @@ +app->bind( + 'FireflyIII\Repositories\Currency\CurrencyRepositoryInterface', + function (Application $app, array $arguments) { + if (!isset($arguments[0]) && $app->auth->check()) { + return app('FireflyIII\Repositories\Currency\CurrencyRepository', [auth()->user()]); + } + if (!isset($arguments[0]) && !$app->auth->check()) { + throw new FireflyException('There is no user present.'); + } + + return app('FireflyIII\Repositories\Currency\CurrencyRepository', $arguments); + } + ); + } + +} diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index 6b832907a6..ae09f2986c 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -96,7 +96,7 @@ class FireflyServiceProvider extends ServiceProvider // chart generator: $this->app->bind('FireflyIII\Generator\Chart\Basic\GeneratorInterface', 'FireflyIII\Generator\Chart\Basic\ChartJsGenerator'); - $this->app->bind('FireflyIII\Repositories\Currency\CurrencyRepositoryInterface', 'FireflyIII\Repositories\Currency\CurrencyRepository'); + // other generators $this->app->bind('FireflyIII\Repositories\User\UserRepositoryInterface', 'FireflyIII\Repositories\User\UserRepository'); $this->app->bind('FireflyIII\Helpers\Attachments\AttachmentHelperInterface', 'FireflyIII\Helpers\Attachments\AttachmentHelper'); $this->app->bind( diff --git a/app/Repositories/Currency/CurrencyRepository.php b/app/Repositories/Currency/CurrencyRepository.php index 1bf6e8728f..40aeea18d7 100644 --- a/app/Repositories/Currency/CurrencyRepository.php +++ b/app/Repositories/Currency/CurrencyRepository.php @@ -16,7 +16,9 @@ namespace FireflyIII\Repositories\Currency; use FireflyIII\Models\Preference; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\User; use Illuminate\Support\Collection; +use Preferences; /** * Class CurrencyRepository @@ -25,6 +27,50 @@ use Illuminate\Support\Collection; */ class CurrencyRepository implements CurrencyRepositoryInterface { + /** @var User */ + private $user; + + /** + * CategoryRepository constructor. + * + * @param User $user + */ + public function __construct(User $user) + { + $this->user = $user; + } + + /** + * @param TransactionCurrency $currency + * + * @return bool + */ + public function canDeleteCurrency(TransactionCurrency $currency): bool + { + if ($this->countJournals($currency) > 0) { + return false; + } + + // is the only currency left + if ($this->get()->count() === 1) { + return false; + } + + // is the default currency for the user or the system + $defaultCode = Preferences::getForUser($this->user, 'currencyPreference', config('firefly.default_currency', 'EUR'))->data; + if ($currency->code === $defaultCode) { + return false; + } + + // is the default currency for the system + $defaultSystemCode = config('firefly.default_currency', 'EUR'); + if ($currency->code === $defaultSystemCode) { + return false; + } + + // can be deleted + return true; + } /** * @param TransactionCurrency $currency @@ -36,6 +82,20 @@ class CurrencyRepository implements CurrencyRepositoryInterface return $currency->transactionJournals()->count(); } + /** + * @param TransactionCurrency $currency + * + * @return bool + */ + public function destroy(TransactionCurrency $currency): bool + { + if ($this->user->hasRole('owner')) { + $currency->forceDelete(); + } + + return true; + } + /** * Find by ID * diff --git a/app/Repositories/Currency/CurrencyRepositoryInterface.php b/app/Repositories/Currency/CurrencyRepositoryInterface.php index 94ae094cbe..4ccebe40b0 100644 --- a/app/Repositories/Currency/CurrencyRepositoryInterface.php +++ b/app/Repositories/Currency/CurrencyRepositoryInterface.php @@ -25,6 +25,13 @@ use Illuminate\Support\Collection; */ interface CurrencyRepositoryInterface { + /** + * @param TransactionCurrency $currency + * + * @return bool + */ + public function canDeleteCurrency(TransactionCurrency $currency): bool; + /** * @param TransactionCurrency $currency * @@ -32,6 +39,13 @@ interface CurrencyRepositoryInterface */ public function countJournals(TransactionCurrency $currency): int; + /** + * @param TransactionCurrency $currency + * + * @return bool + */ + public function destroy(TransactionCurrency $currency): bool; + /** * Find by ID * diff --git a/config/app.php b/config/app.php index 68c0f500a9..4933ad1c8c 100755 --- a/config/app.php +++ b/config/app.php @@ -80,6 +80,7 @@ return [ FireflyIII\Providers\BillServiceProvider::class, FireflyIII\Providers\BudgetServiceProvider::class, FireflyIII\Providers\CategoryServiceProvider::class, + FireflyIII\Providers\CurrencyServiceProvider::class, FireflyIII\Providers\ExportJobServiceProvider::class, FireflyIII\Providers\JournalServiceProvider::class, FireflyIII\Providers\PiggyBankServiceProvider::class, diff --git a/tests/acceptance/Controllers/CurrencyControllerTest.php b/tests/acceptance/Controllers/CurrencyControllerTest.php index 47fd22badd..3ee0593a90 100644 --- a/tests/acceptance/Controllers/CurrencyControllerTest.php +++ b/tests/acceptance/Controllers/CurrencyControllerTest.php @@ -8,6 +8,7 @@ * * See the LICENSE file for details. */ +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; /** @@ -43,10 +44,10 @@ class CurrencyControllerTest extends TestCase */ public function testDefaultCurrency() { - // Remove the following lines when you implement this test. - $this->markTestIncomplete( - 'This test has not been implemented yet.' - ); + $this->be($this->user()); + $this->call('GET', route('currencies.default', [1])); + $this->assertResponseStatus(302); + $this->assertSessionHas('success'); } /** @@ -66,10 +67,15 @@ class CurrencyControllerTest extends TestCase */ public function testDestroy() { - // Remove the following lines when you implement this test. - $this->markTestIncomplete( - 'This test has not been implemented yet.' - ); + $this->session(['currencies.delete.url' => 'http://localhost']); + $repository = $this->mock(CurrencyRepositoryInterface::class); + $repository->shouldReceive('canDeleteCurrency')->andReturn(true); + $repository->shouldReceive('destroy')->andReturn(true); + + $this->be($this->user()); + $this->call('post', route('currencies.destroy', [1])); + $this->assertResponseStatus(302); + $this->assertSessionHas('success'); } /** @@ -101,10 +107,16 @@ class CurrencyControllerTest extends TestCase */ public function testStore() { - // Remove the following lines when you implement this test. - $this->markTestIncomplete( - 'This test has not been implemented yet.' - ); + $this->session(['currencies.create.url' => 'http://localhost']); + $data = [ + 'name' => 'XX', + 'code' => 'XXX', + 'symbol' => 'x', + ]; + $this->be($this->user()); + $this->call('post', route('currencies.store'), $data); + $this->assertResponseStatus(302); + $this->assertSessionHas('success'); } /** @@ -112,9 +124,15 @@ class CurrencyControllerTest extends TestCase */ public function testUpdate() { - // Remove the following lines when you implement this test. - $this->markTestIncomplete( - 'This test has not been implemented yet.' - ); + $this->session(['currencies.edit.url' => 'http://localhost']); + $data = [ + 'name' => 'XA', + 'code' => 'XAX', + 'symbol' => 'a', + ]; + $this->be($this->user()); + $this->call('post', route('currencies.update', [2]), $data); + $this->assertResponseStatus(302); + $this->assertSessionHas('success'); } }