diff --git a/app/Api/V1/Controllers/BudgetLimitController.php b/app/Api/V1/Controllers/BudgetLimitController.php index e06d4b6e4e..520bca9c15 100644 --- a/app/Api/V1/Controllers/BudgetLimitController.php +++ b/app/Api/V1/Controllers/BudgetLimitController.php @@ -27,11 +27,8 @@ namespace FireflyIII\Api\V1\Controllers; use FireflyIII\Api\V1\Requests\BudgetLimitRequest; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; -use FireflyIII\Helpers\Filter\InternalTransferFilter; use FireflyIII\Models\BudgetLimit; -use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; -use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Transformers\BudgetLimitTransformer; use FireflyIII\Transformers\TransactionTransformer; @@ -203,7 +200,7 @@ class BudgetLimitController extends Controller $paginator = $collector->getPaginatedTransactions(); $paginator->setPath(route('api.v1.budget_limits.transactions', [$budgetLimit->id]) . $this->buildParams()); $transactions = $paginator->getCollection(); - $resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions'); + $resource = new FractalCollection($transactions, new TransactionTransformer($this->parameters), 'transactions'); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); @@ -219,12 +216,8 @@ class BudgetLimitController extends Controller */ public function update(BudgetLimitRequest $request, BudgetLimit $budgetLimit): JsonResponse { - $data = $request->getAll(); - $budget = $this->repository->findNull($data['budget_id']); - if (null === $budget) { - $budget = $budgetLimit->budget; - } - $data['budget'] = $budget; + $data = $request->getAll(); + $data['budget'] = $budgetLimit->budget; $budgetLimit = $this->repository->updateBudgetLimit($budgetLimit, $data); $manager = new Manager; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; diff --git a/app/Api/V1/Controllers/TagController.php b/app/Api/V1/Controllers/TagController.php index 268a4316ab..353d978fa5 100644 --- a/app/Api/V1/Controllers/TagController.php +++ b/app/Api/V1/Controllers/TagController.php @@ -28,7 +28,6 @@ use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Filter\InternalTransferFilter; use FireflyIII\Models\Tag; use FireflyIII\Models\TransactionType; -use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Transformers\TagTransformer; @@ -39,10 +38,10 @@ use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use League\Fractal\Manager; use League\Fractal\Pagination\IlluminatePaginatorAdapter; +use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Item; use League\Fractal\Serializer\JsonApiSerializer; -use League\Fractal\Resource\Collection as FractalCollection; /** * Class TagController */ @@ -124,11 +123,11 @@ class TagController extends Controller * List single resource. * * @param Request $request - * @param Tag $tag + * @param Tag $tag * * @return JsonResponse */ - public function show(Request $request, Tag $tag): JsonResponse + public function show(Request $request, Tag $tag): JsonResponse { $manager = new Manager(); $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; @@ -140,6 +139,24 @@ class TagController extends Controller } + /** + * Store new object. + * + * @param TagRequest $request + * + * @return JsonResponse + */ + public function store(TagRequest $request): JsonResponse + { + $rule = $this->repository->store($request->getAll()); + $manager = new Manager(); + $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; + $manager->setSerializer(new JsonApiSerializer($baseUrl)); + + $resource = new Item($rule, new TagTransformer($this->parameters), 'tags'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); + } /** * Show all transactions. @@ -188,31 +205,11 @@ class TagController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } - - /** - * Store new object. - * - * @param TagRequest $request - * - * @return JsonResponse - */ - public function store(TagRequest $request): JsonResponse - { - $rule = $this->repository->store($request->getAll()); - $manager = new Manager(); - $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; - $manager->setSerializer(new JsonApiSerializer($baseUrl)); - - $resource = new Item($rule, new TagTransformer($this->parameters), 'tags'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); - } - /** * Update a rule. * * @param TagRequest $request - * @param Tag $tag + * @param Tag $tag * * @return JsonResponse */ diff --git a/app/Api/V1/Controllers/TransactionController.php b/app/Api/V1/Controllers/TransactionController.php index 4fca237302..3de1237088 100644 --- a/app/Api/V1/Controllers/TransactionController.php +++ b/app/Api/V1/Controllers/TransactionController.php @@ -91,32 +91,13 @@ class TransactionController extends Controller $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $manager->setSerializer(new JsonApiSerializer($baseUrl)); - $attachments = $transaction->transactionJournal->attachments()->get(); + $attachments = $this->repository->getAttachmentsByTr($transaction); $resource = new FractalCollection($attachments, new AttachmentTransformer($this->parameters), 'attachments'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } - /** - * @param Request $request - * @param Transaction $transaction - * - * @return JsonResponse - */ - public function piggyBankEvents(Request $request, Transaction $transaction): JsonResponse - { - $manager = new Manager(); - $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; - $manager->setSerializer(new JsonApiSerializer($baseUrl)); - - $events= $transaction->transactionJournal->piggyBankEvents()->get(); - $resource = new FractalCollection($events, new PiggyBankEventTransformer($this->parameters), 'piggy_bank_events'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); - - } - /** * Remove the specified resource from storage. * @@ -177,6 +158,25 @@ class TransactionController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } + /** + * @param Request $request + * @param Transaction $transaction + * + * @return JsonResponse + */ + public function piggyBankEvents(Request $request, Transaction $transaction): JsonResponse + { + $manager = new Manager(); + $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; + $manager->setSerializer(new JsonApiSerializer($baseUrl)); + + $events = $this->repository->getPiggyBankEventsByTr($transaction); + $resource = new FractalCollection($events, new PiggyBankEventTransformer($this->parameters), 'piggy_bank_events'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); + + } + /** * Show a single transaction. * diff --git a/app/Api/V1/Requests/ConfigurationRequest.php b/app/Api/V1/Requests/ConfigurationRequest.php index b22491dfa6..09fb846894 100644 --- a/app/Api/V1/Requests/ConfigurationRequest.php +++ b/app/Api/V1/Requests/ConfigurationRequest.php @@ -59,7 +59,7 @@ class ConfigurationRequest extends Request return ['value' => $this->integer('value')]; } - return ['value' => $this->string('value')]; + return ['value' => $this->string('value')]; // @codeCoverageIgnore } /** @@ -78,6 +78,6 @@ class ConfigurationRequest extends Request return ['value' => 'required|numeric|between:-1,1']; } - return ['value' => 'required']; + return ['value' => 'required']; // @codeCoverageIgnore } } diff --git a/app/Api/V1/Requests/TagRequest.php b/app/Api/V1/Requests/TagRequest.php index 7ed83be968..3ae2b9eff6 100644 --- a/app/Api/V1/Requests/TagRequest.php +++ b/app/Api/V1/Requests/TagRequest.php @@ -25,7 +25,6 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; use FireflyIII\Models\Tag; -use Illuminate\Validation\Validator; /** * Class TagRequest @@ -57,7 +56,7 @@ class TagRequest extends Request 'description' => $this->string('description'), 'latitude' => '' === $this->string('latitude') ? null : $this->string('latitude'), 'longitude' => '' === $this->string('longitude') ? null : $this->string('longitude'), - 'zoom_level' => $this->integer('zoom_level'), + 'zoom_level' => $this->integer('zoom_level'), ]; return $data; @@ -76,7 +75,7 @@ class TagRequest extends Request 'date' => 'date|nullable', 'latitude' => 'numeric|min:-90|max:90|nullable|required_with:longitude', 'longitude' => 'numeric|min:-90|max:90|nullable|required_with:latitude', - 'zoomLevel' => 'numeric|min:0|max:80|nullable', + 'zoom_level' => 'numeric|min:0|max:80|nullable', ]; switch ($this->method()) { default: @@ -91,25 +90,4 @@ class TagRequest extends Request return $rules; } - - /** - * Configure the validator instance. - * - * @param Validator $validator - * - * @return void - */ - public function withValidator(Validator $validator): void - { - $validator->after( - function (Validator $validator) { - $data = $validator->getData(); - $min = (float)($data['amount_min'] ?? 0); - $max = (float)($data['amount_max'] ?? 0); - if ($min > $max) { - $validator->errors()->add('amount_min', (string)trans('validation.amount_min_over_max')); - } - } - ); - } } diff --git a/app/Console/Commands/ApplyRules.php b/app/Console/Commands/ApplyRules.php index 72fde55db6..c0e3a9408c 100644 --- a/app/Console/Commands/ApplyRules.php +++ b/app/Console/Commands/ApplyRules.php @@ -19,6 +19,7 @@ use Illuminate\Support\Collection; /** * * Class ApplyRules + * @codeCoverageIgnore */ class ApplyRules extends Command { diff --git a/app/Factory/TransactionFactory.php b/app/Factory/TransactionFactory.php index 6d067731bd..f6ad6563af 100644 --- a/app/Factory/TransactionFactory.php +++ b/app/Factory/TransactionFactory.php @@ -72,7 +72,7 @@ class TransactionFactory throw new FireflyException('Amount is an empty string, which Firefly III cannot handle. Apologies.'); } if (null === $currencyId) { - throw new FireflyException('Cannot store transaction without currency information.'); + throw new FireflyException('Cannot store transaction without currency information.'); // @codeCoverageIgnore } $data['foreign_amount'] = '' === (string)$data['foreign_amount'] ? null : $data['foreign_amount']; Log::debug(sprintf('Create transaction for account #%d ("%s") with amount %s', $data['account']->id, $data['account']->name, $data['amount'])); diff --git a/app/Handlers/Events/AutomationHandler.php b/app/Handlers/Events/AutomationHandler.php index 75d04fbc2d..9aa5765589 100644 --- a/app/Handlers/Events/AutomationHandler.php +++ b/app/Handlers/Events/AutomationHandler.php @@ -48,7 +48,7 @@ class AutomationHandler $sendReport = envNonEmpty('SEND_REPORT_JOURNALS', true); if (false === $sendReport) { - return true; + return true; // @codeCoverageIgnore } Log::debug('In reportJournals.'); diff --git a/app/Helpers/Filter/DoubleTransactionFilter.php b/app/Helpers/Filter/DoubleTransactionFilter.php index ce35b22c60..65e84f2f2c 100644 --- a/app/Helpers/Filter/DoubleTransactionFilter.php +++ b/app/Helpers/Filter/DoubleTransactionFilter.php @@ -31,6 +31,8 @@ use Illuminate\Support\Collection; * * Used when the final collection contains double transactions, which can happen when viewing the tag report. * Class DoubleTransactionFilter + * + * @codeCoverageIgnore */ class DoubleTransactionFilter implements FilterInterface { diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 755e2f4df1..370cc1c240 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -86,9 +86,11 @@ class ProfileController extends Controller { $loginProvider = config('firefly.login_provider'); if ('eloquent' !== $loginProvider) { + // @codeCoverageIgnoreStart $request->session()->flash('error', trans('firefly.login_provider_local_only', ['login_provider' => $loginProvider])); return redirect(route('profile.index')); + // @codeCoverageIgnoreEnd } $title = auth()->user()->email; @@ -108,9 +110,11 @@ class ProfileController extends Controller { $loginProvider = config('firefly.login_provider'); if ('eloquent' !== $loginProvider) { + // @codeCoverageIgnoreStart $request->session()->flash('error', trans('firefly.login_provider_local_only', ['login_provider' => $loginProvider])); return redirect(route('profile.index')); + // @codeCoverageIgnoreEnd } $title = auth()->user()->email; @@ -150,7 +154,9 @@ class ProfileController extends Controller { $loginProvider = config('firefly.login_provider'); if ('eloquent' !== $loginProvider) { + // @codeCoverageIgnoreStart throw new FireflyException('Cannot confirm email change when authentication provider is not local.'); + // @codeCoverageIgnoreEnd } // find preference with this token value. /** @var Collection $set */ @@ -187,7 +193,9 @@ class ProfileController extends Controller { $loginProvider = config('firefly.login_provider'); if ('eloquent' !== $loginProvider) { + // @codeCoverageIgnoreStart $request->session()->flash('warning', trans('firefly.delete_local_info_only', ['login_provider' => $loginProvider])); + // @codeCoverageIgnoreEnd } $title = auth()->user()->email; $subTitle = (string)trans('firefly.delete_account'); @@ -281,9 +289,11 @@ class ProfileController extends Controller { $loginProvider = config('firefly.login_provider'); if ('eloquent' !== $loginProvider) { + // @codeCoverageIgnoreStart $request->session()->flash('error', trans('firefly.login_provider_local_only', ['login_provider' => $loginProvider])); return redirect(route('profile.index')); + // @codeCoverageIgnoreEnd } /** @var User $user */ @@ -333,9 +343,11 @@ class ProfileController extends Controller { $loginProvider = config('firefly.login_provider'); if ('eloquent' !== $loginProvider) { + // @codeCoverageIgnoreStart $request->session()->flash('error', trans('firefly.login_provider_local_only', ['login_provider' => $loginProvider])); return redirect(route('profile.index')); + // @codeCoverageIgnoreEnd } // the request has already validated both new passwords must be equal. @@ -437,7 +449,9 @@ class ProfileController extends Controller { $loginProvider = config('firefly.login_provider'); if ('eloquent' !== $loginProvider) { + // @codeCoverageIgnoreStart throw new FireflyException('Cannot confirm email change when authentication provider is not local.'); + // @codeCoverageIgnoreEnd } // find preference with this token value. diff --git a/app/Models/Category.php b/app/Models/Category.php index 67459e3a24..3af40d24e1 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -40,6 +40,9 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @property float $spent // used in category reports * @property Carbon|null lastActivity * @property bool encrypted + * @property User $user + * @property Carbon $created_at + * @property Carbon $updated_at */ class Category extends Model { diff --git a/app/Models/Rule.php b/app/Models/Rule.php index 58fe37ac10..c41cb2531a 100644 --- a/app/Models/Rule.php +++ b/app/Models/Rule.php @@ -44,7 +44,6 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @property Carbon $created_at * @property Carbon $updated_at * @property string $title - * @property string $text * @property int $order * @property RuleGroup $ruleGroup * @property int $rule_group_id diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 3307762585..2d49847090 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -709,6 +709,54 @@ class BudgetRepository implements BudgetRepositoryInterface return (string)$set->sum('transaction_amount'); } + /** + * @param Collection $budgets + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + public function spentInPeriodMc(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array + { + /** @var TransactionCollectorInterface $collector */ + $collector = app(TransactionCollectorInterface::class); + $collector->setUser($this->user); + $collector->setRange($start, $end)->setBudgets($budgets)->withBudgetInformation(); + + if ($accounts->count() > 0) { + $collector->setAccounts($accounts); + } + if (0 === $accounts->count()) { + $collector->setAllAssetAccounts(); + } + + $set = $collector->getTransactions(); + $return = []; + $total = []; + $currencies = []; + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $code = $transaction->transaction_currency_code; + if (!isset($currencies[$code])) { + $currencies[$code] = $transaction->transactionCurrency; + } + $total[$code] = isset($total[$code]) ? bcadd($total[$code], $transaction->transaction_amount) : $transaction->transaction_amount; + } + foreach ($total as $code => $spent) { + /** @var TransactionCurrency $currency */ + $currency = $currencies[$code]; + $return[] = [ + 'currency_code' => $code, + 'currency_symbol' => $currency->symbol, + 'currency_dp' => $currency->decimal_places, + 'amount' => round($spent, $currency->decimal_places), + ]; + } + + return $return; + } + /** * @param Collection $accounts * @param Carbon $start diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index 54433c9ace..9cb9fbc4e3 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -35,7 +35,6 @@ use Illuminate\Support\Collection; */ interface BudgetRepositoryInterface { - /** * A method that returns the amount of money budgeted per day for this budget, * on average. @@ -166,13 +165,13 @@ interface BudgetRepositoryInterface */ public function getBudgetPeriodReport(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array; - /** @noinspection MoreThanThreeArgumentsInspection */ - /** * @return Collection */ public function getBudgets(): Collection; + /** @noinspection MoreThanThreeArgumentsInspection */ + /** * Get all budgets with these ID's. * @@ -206,20 +205,19 @@ interface BudgetRepositoryInterface */ public function setAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end, string $amount): AvailableBudget; - /** @noinspection MoreThanThreeArgumentsInspection */ - /** * @param Budget $budget * @param int $order */ public function setBudgetOrder(Budget $budget, int $order): void; + /** @noinspection MoreThanThreeArgumentsInspection */ + /** * @param User $user */ public function setUser(User $user); - /** @noinspection MoreThanThreeArgumentsInspection */ /** * @param Collection $budgets * @param Collection $accounts @@ -230,6 +228,20 @@ interface BudgetRepositoryInterface */ public function spentInPeriod(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): string; + /** @noinspection MoreThanThreeArgumentsInspection */ + + /** + * Return multi-currency spent information. + * + * @param Collection $budgets + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + public function spentInPeriodMc(Collection $budgets, Collection $accounts, Carbon $start, Carbon $end): array; + /** * @param Collection $accounts * @param Carbon $start diff --git a/app/Repositories/Journal/JournalRepository.php b/app/Repositories/Journal/JournalRepository.php index 0cb89a007d..938c6ea2f2 100644 --- a/app/Repositories/Journal/JournalRepository.php +++ b/app/Repositories/Journal/JournalRepository.php @@ -274,6 +274,16 @@ class JournalRepository implements JournalRepositoryInterface return $journal->attachments; } + /** + * @param Transaction $transaction + * + * @return Collection + */ + public function getAttachmentsByTr(Transaction $transaction): Collection + { + return $transaction->transactionJournal->attachments()->get(); + } + /** * Returns the first positive transaction for the journal. Useful when editing journals. * @@ -574,6 +584,16 @@ class JournalRepository implements JournalRepositoryInterface return $events; } + /** + * @param Transaction $transaction + * + * @return Collection + */ + public function getPiggyBankEventsbyTr(Transaction $transaction): Collection + { + return $transaction->transactionJournal->piggyBankEvents()->get(); + } + /** * Return all tags as strings in an array. * diff --git a/app/Repositories/Journal/JournalRepositoryInterface.php b/app/Repositories/Journal/JournalRepositoryInterface.php index 69d2958b71..c2e8bffc2a 100644 --- a/app/Repositories/Journal/JournalRepositoryInterface.php +++ b/app/Repositories/Journal/JournalRepositoryInterface.php @@ -122,6 +122,13 @@ interface JournalRepositoryInterface */ public function getAttachments(TransactionJournal $journal): Collection; + /** + * @param Transaction $transaction + * + * @return Collection + */ + public function getAttachmentsByTr(Transaction $transaction): Collection; + /** * Returns the first positive transaction for the journal. Useful when editing journals. * @@ -233,6 +240,13 @@ interface JournalRepositoryInterface */ public function getPiggyBankEvents(TransactionJournal $journal): Collection; + /** + * @param Transaction $transaction + * + * @return Collection + */ + public function getPiggyBankEventsbyTr(Transaction $transaction): Collection; + /** * Return all tags as strings in an array. * diff --git a/app/Transformers/AccountTransformer.php b/app/Transformers/AccountTransformer.php index e9a411cac9..7a22253f4d 100644 --- a/app/Transformers/AccountTransformer.php +++ b/app/Transformers/AccountTransformer.php @@ -118,8 +118,8 @@ class AccountTransformer extends TransformerAbstract $data = [ 'id' => (int)$account->id, - 'updated_at' => $account->updated_at->toAtomString(), 'created_at' => $account->created_at->toAtomString(), + 'updated_at' => $account->updated_at->toAtomString(), 'active' => 1 === (int)$account->active, 'name' => $account->name, 'type' => $type, diff --git a/app/Transformers/AttachmentTransformer.php b/app/Transformers/AttachmentTransformer.php index d5e497e55a..0682d7fd0c 100644 --- a/app/Transformers/AttachmentTransformer.php +++ b/app/Transformers/AttachmentTransformer.php @@ -66,8 +66,8 @@ class AttachmentTransformer extends TransformerAbstract return [ 'id' => (int)$attachment->id, - 'updated_at' => $attachment->updated_at->toAtomString(), 'created_at' => $attachment->created_at->toAtomString(), + 'updated_at' => $attachment->updated_at->toAtomString(), 'attachable_id' => $attachment->attachable_id, 'attachable_type' => str_replace('FireflyIII\\Models\\','',$attachment->attachable_type), 'md5' => $attachment->md5, diff --git a/app/Transformers/AvailableBudgetTransformer.php b/app/Transformers/AvailableBudgetTransformer.php index a3d225c7d6..010e630d18 100644 --- a/app/Transformers/AvailableBudgetTransformer.php +++ b/app/Transformers/AvailableBudgetTransformer.php @@ -25,7 +25,6 @@ namespace FireflyIII\Transformers; use FireflyIII\Models\AvailableBudget; -use League\Fractal\Resource\Item; use League\Fractal\TransformerAbstract; use Symfony\Component\HttpFoundation\ParameterBag; @@ -58,14 +57,19 @@ class AvailableBudgetTransformer extends TransformerAbstract */ public function transform(AvailableBudget $availableBudget): array { - $data = [ - 'id' => (int)$availableBudget->id, - 'updated_at' => $availableBudget->updated_at->toAtomString(), - 'created_at' => $availableBudget->created_at->toAtomString(), - 'start_date' => $availableBudget->start_date->format('Y-m-d'), - 'end_date' => $availableBudget->end_date->format('Y-m-d'), - 'amount' => round($availableBudget->amount, $availableBudget->transactionCurrency->decimal_places), - 'links' => [ + $currency = $availableBudget->transactionCurrency; + $data = [ + 'id' => (int)$availableBudget->id, + 'created_at' => $availableBudget->created_at->toAtomString(), + 'updated_at' => $availableBudget->updated_at->toAtomString(), + 'currency_id' => $currency->id, + 'currency_code' => $currency->code, + 'currency_symbol' => $currency->symbol, + 'currency_dp' => $currency->decimal_places, + 'start' => $availableBudget->start_date->format('Y-m-d'), + 'end' => $availableBudget->end_date->format('Y-m-d'), + 'amount' => round($availableBudget->amount, $currency->decimal_places), + 'links' => [ [ 'rel' => 'self', 'uri' => '/available_budgets/' . $availableBudget->id, diff --git a/app/Transformers/BillTransformer.php b/app/Transformers/BillTransformer.php index 2c3fa8786c..b19d4cb638 100644 --- a/app/Transformers/BillTransformer.php +++ b/app/Transformers/BillTransformer.php @@ -72,24 +72,24 @@ class BillTransformer extends TransformerAbstract $this->repository->setUser($bill->user); $data = [ 'id' => (int)$bill->id, - 'updated_at' => $bill->updated_at->toAtomString(), 'created_at' => $bill->created_at->toAtomString(), - 'name' => $bill->name, + 'updated_at' => $bill->updated_at->toAtomString(), 'currency_id' => $bill->transaction_currency_id, 'currency_code' => $bill->transactionCurrency->code, 'currency_symbol' => $bill->transactionCurrency->symbol, + 'currency_dp' => $bill->transactionCurrency->decimal_places, + 'name' => $bill->name, 'amount_min' => round((float)$bill->amount_min, 2), 'amount_max' => round((float)$bill->amount_max, 2), 'date' => $bill->date->format('Y-m-d'), 'repeat_freq' => $bill->repeat_freq, 'skip' => (int)$bill->skip, - 'automatch' => $bill->automatch, 'active' => $bill->active, - 'attachments_count' => $bill->attachments()->count(), - 'pay_dates' => $payDates, 'notes' => $this->repository->getNoteText($bill), - 'paid_dates' => $paidData['paid_dates'], 'next_expected_match' => $paidData['next_expected_match'], + 'pay_dates' => $payDates, + 'paid_dates' => $paidData['paid_dates'], + 'links' => [ [ 'rel' => 'self', diff --git a/app/Transformers/BudgetLimitTransformer.php b/app/Transformers/BudgetLimitTransformer.php index 98072ca2e0..95e1ad68f0 100644 --- a/app/Transformers/BudgetLimitTransformer.php +++ b/app/Transformers/BudgetLimitTransformer.php @@ -71,8 +71,8 @@ class BudgetLimitTransformer extends TransformerAbstract } $data = [ 'id' => (int)$budgetLimit->id, - 'updated_at' => $budgetLimit->updated_at->toAtomString(), 'created_at' => $budgetLimit->created_at->toAtomString(), + 'updated_at' => $budgetLimit->updated_at->toAtomString(), 'start_date' => $budgetLimit->start_date->format('Y-m-d'), 'end_date' => $budgetLimit->end_date->format('Y-m-d'), 'budget_id' => $budgetLimit->budget_id, diff --git a/app/Transformers/BudgetTransformer.php b/app/Transformers/BudgetTransformer.php index 5c5205444f..5c2ba8e0fd 100644 --- a/app/Transformers/BudgetTransformer.php +++ b/app/Transformers/BudgetTransformer.php @@ -24,11 +24,9 @@ declare(strict_types=1); namespace FireflyIII\Transformers; -use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Models\Budget; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use Illuminate\Support\Collection; -use League\Fractal\Resource\Collection as FractalCollection; -use League\Fractal\Resource\Item; use League\Fractal\TransformerAbstract; use Symfony\Component\HttpFoundation\ParameterBag; @@ -61,12 +59,24 @@ class BudgetTransformer extends TransformerAbstract */ public function transform(Budget $budget): array { + $start = $this->parameters->get('start'); + $end = $this->parameters->get('end'); + $spent = []; + if (null !== $start && null !== $end) { + /** @var BudgetRepositoryInterface $repository */ + $repository = app(BudgetRepositoryInterface::class); + $repository->setUser($budget->user); + $spent = $repository->spentInPeriodMc(new Collection([$budget]), new Collection, $start, $end); + } + + $data = [ 'id' => (int)$budget->id, - 'updated_at' => $budget->updated_at->toAtomString(), 'created_at' => $budget->created_at->toAtomString(), + 'updated_at' => $budget->updated_at->toAtomString(), 'active' => 1 === (int)$budget->active, 'name' => $budget->name, + 'spent' => $spent, 'links' => [ [ 'rel' => 'self', diff --git a/app/Transformers/CategoryTransformer.php b/app/Transformers/CategoryTransformer.php index a7d64400d1..4ac409d1ec 100644 --- a/app/Transformers/CategoryTransformer.php +++ b/app/Transformers/CategoryTransformer.php @@ -24,11 +24,12 @@ declare(strict_types=1); namespace FireflyIII\Transformers; -use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use Carbon\Carbon; use FireflyIII\Models\Category; +use FireflyIII\Models\Transaction; +use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use Illuminate\Support\Collection; -use League\Fractal\Resource\Collection as FractalCollection; -use League\Fractal\Resource\Item; use League\Fractal\TransformerAbstract; use Symfony\Component\HttpFoundation\ParameterBag; @@ -61,11 +62,21 @@ class CategoryTransformer extends TransformerAbstract */ public function transform(Category $category): array { + $spent = []; + $earned = []; + $start = $this->parameters->get('start'); + $end = $this->parameters->get('end'); + if (null !== $start && null !== $end) { + $spent = $this->getSpentInformation($category, $start, $end); + $earned = $this->getEarnedInformation($category, $start, $end); + } $data = [ 'id' => (int)$category->id, - 'updated_at' => $category->updated_at->toAtomString(), 'created_at' => $category->created_at->toAtomString(), + 'updated_at' => $category->updated_at->toAtomString(), 'name' => $category->name, + 'spent' => $spent, + 'earned' => $earned, 'links' => [ [ 'rel' => 'self', @@ -77,4 +88,80 @@ class CategoryTransformer extends TransformerAbstract return $data; } + /** + * @param Category $category + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + private function getEarnedInformation(Category $category, Carbon $start, Carbon $end): array + { + /** @var CategoryRepositoryInterface $repository */ + $repository = app(CategoryRepositoryInterface::class); + $repository->setUser($category->user); + $collection = $repository->earnedInPeriodCollection(new Collection([$category]), new Collection, $start, $end); + $return = []; + $total = []; + $currencies = []; + /** @var Transaction $transaction */ + foreach ($collection as $transaction) { + $code = $transaction->transaction_currency_code; + if (!isset($currencies[$code])) { + $currencies[$code] = $transaction->transactionCurrency; + } + $total[$code] = isset($total[$code]) ? bcadd($total[$code], $transaction->transaction_amount) : $transaction->transaction_amount; + } + foreach ($total as $code => $earned) { + /** @var TransactionCurrency $currency */ + $currency = $currencies[$code]; + $return[] = [ + 'currency_code' => $code, + 'currency_symbol' => $currency->symbol, + 'currency_dp' => $currency->decimal_places, + 'amount' => round($earned, $currency->decimal_places), + ]; + } + + return $return; + } + + /** + * @param Category $category + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + private function getSpentInformation(Category $category, Carbon $start, Carbon $end): array + { + /** @var CategoryRepositoryInterface $repository */ + $repository = app(CategoryRepositoryInterface::class); + $repository->setUser($category->user); + $collection = $repository->spentInPeriodCollection(new Collection([$category]), new Collection, $start, $end); + $return = []; + $total = []; + $currencies = []; + /** @var Transaction $transaction */ + foreach ($collection as $transaction) { + $code = $transaction->transaction_currency_code; + if (!isset($currencies[$code])) { + $currencies[$code] = $transaction->transactionCurrency; + } + $total[$code] = isset($total[$code]) ? bcadd($total[$code], $transaction->transaction_amount) : $transaction->transaction_amount; + } + foreach ($total as $code => $spent) { + /** @var TransactionCurrency $currency */ + $currency = $currencies[$code]; + $return[] = [ + 'currency_code' => $code, + 'currency_symbol' => $currency->symbol, + 'currency_dp' => $currency->decimal_places, + 'amount' => round($spent, $currency->decimal_places), + ]; + } + + return $return; + } + } diff --git a/app/Transformers/CurrencyExchangeRateTransformer.php b/app/Transformers/CurrencyExchangeRateTransformer.php index 9678905f7b..edd3575e7e 100644 --- a/app/Transformers/CurrencyExchangeRateTransformer.php +++ b/app/Transformers/CurrencyExchangeRateTransformer.php @@ -59,8 +59,8 @@ class CurrencyExchangeRateTransformer extends TransformerAbstract $result = 0.0 === $result ? null : $result; $data = [ 'id' => (int)$rate->id, - 'updated_at' => $rate->updated_at->toAtomString(), 'created_at' => $rate->created_at->toAtomString(), + 'updated_at' => $rate->updated_at->toAtomString(), 'from_currency_id' => $rate->fromCurrency->id, 'from_currency_name' => $rate->fromCurrency->name, 'from_currency_code' => $rate->fromCurrency->code, diff --git a/app/Transformers/CurrencyTransformer.php b/app/Transformers/CurrencyTransformer.php index a12e2ed238..4ec2288a49 100644 --- a/app/Transformers/CurrencyTransformer.php +++ b/app/Transformers/CurrencyTransformer.php @@ -63,14 +63,14 @@ class CurrencyTransformer extends TransformerAbstract } $data = [ 'id' => (int)$currency->id, - 'updated_at' => $currency->updated_at->toAtomString(), 'created_at' => $currency->created_at->toAtomString(), + 'updated_at' => $currency->updated_at->toAtomString(), + 'default' => $isDefault, + 'enabled' => $currency->enabled, 'name' => $currency->name, 'code' => $currency->code, 'symbol' => $currency->symbol, 'decimal_places' => (int)$currency->decimal_places, - 'default' => $isDefault, - 'enabled' => $currency->enabled, 'links' => [ [ 'rel' => 'self', diff --git a/app/Transformers/ImportJobTransformer.php b/app/Transformers/ImportJobTransformer.php index eea2f82d4a..521a90668e 100644 --- a/app/Transformers/ImportJobTransformer.php +++ b/app/Transformers/ImportJobTransformer.php @@ -67,8 +67,10 @@ class ImportJobTransformer extends TransformerAbstract } $data = [ 'id' => (int)$importJob->id, - 'updated_at' => $importJob->updated_at->toAtomString(), 'created_at' => $importJob->created_at->toAtomString(), + 'updated_at' => $importJob->updated_at->toAtomString(), + 'tag_id' => $tagId, + 'tag_tag' => $tagTag, 'key' => $importJob->key, 'file_type' => $importJob->file_type, 'provider' => $importJob->provider, @@ -78,8 +80,7 @@ class ImportJobTransformer extends TransformerAbstract 'extended_status' => $importJob->extended_status, 'transactions' => $importJob->transactions, 'errors' => $importJob->errors, - 'tag_id' => $tagId, - 'tag_tag' => $tagTag, + 'links' => [ [ 'rel' => 'self', diff --git a/app/Transformers/JournalLinkTransformer.php b/app/Transformers/JournalLinkTransformer.php index b7cd15dc79..e82d3a396f 100644 --- a/app/Transformers/JournalLinkTransformer.php +++ b/app/Transformers/JournalLinkTransformer.php @@ -66,8 +66,8 @@ class JournalLinkTransformer extends TransformerAbstract $data = [ 'id' => (int)$link->id, - 'updated_at' => $link->updated_at->toAtomString(), 'created_at' => $link->created_at->toAtomString(), + 'updated_at' => $link->updated_at->toAtomString(), 'inward_id' => $link->source_id, 'outward_id' => $link->destination_id, 'notes' => $notes, diff --git a/app/Transformers/JournalMetaTransformer.php b/app/Transformers/JournalMetaTransformer.php index 903bc349d1..33067e02ba 100644 --- a/app/Transformers/JournalMetaTransformer.php +++ b/app/Transformers/JournalMetaTransformer.php @@ -62,8 +62,8 @@ class JournalMetaTransformer extends TransformerAbstract { $data = [ 'id' => (int)$meta->id, - 'updated_at' => $meta->updated_at->toAtomString(), 'created_at' => $meta->created_at->toAtomString(), + 'updated_at' => $meta->updated_at->toAtomString(), 'name' => $meta->name, 'data' => $meta->data, 'hash' => $meta->hash, diff --git a/app/Transformers/LinkTypeTransformer.php b/app/Transformers/LinkTypeTransformer.php index 19b4600b4d..0868c45bc3 100644 --- a/app/Transformers/LinkTypeTransformer.php +++ b/app/Transformers/LinkTypeTransformer.php @@ -74,8 +74,8 @@ class LinkTypeTransformer extends TransformerAbstract { $data = [ 'id' => (int)$linkType->id, - 'updated_at' => $linkType->updated_at->toAtomString(), 'created_at' => $linkType->created_at->toAtomString(), + 'updated_at' => $linkType->updated_at->toAtomString(), 'name' => $linkType->name, 'inward' => $linkType->inward, 'outward' => $linkType->outward, diff --git a/app/Transformers/NoteTransformer.php b/app/Transformers/NoteTransformer.php index 2bd8458240..4bb7dbce51 100644 --- a/app/Transformers/NoteTransformer.php +++ b/app/Transformers/NoteTransformer.php @@ -74,8 +74,8 @@ class NoteTransformer extends TransformerAbstract $converter = new CommonMarkConverter; $data = [ 'id' => (int)$note->id, - 'updated_at' => $note->updated_at->toAtomString(), 'created_at' => $note->created_at->toAtomString(), + 'updated_at' => $note->updated_at->toAtomString(), 'title' => $note->title, 'text' => $note->text, 'markdown' => $converter->convertToHtml($note->text), diff --git a/app/Transformers/PiggyBankEventTransformer.php b/app/Transformers/PiggyBankEventTransformer.php index a95c0565c2..673dabba17 100644 --- a/app/Transformers/PiggyBankEventTransformer.php +++ b/app/Transformers/PiggyBankEventTransformer.php @@ -85,8 +85,8 @@ class PiggyBankEventTransformer extends TransformerAbstract $data = [ 'id' => (int)$event->id, - 'updated_at' => $event->updated_at->toAtomString(), 'created_at' => $event->created_at->toAtomString(), + 'updated_at' => $event->updated_at->toAtomString(), 'amount' => round($event->amount, $decimalPlaces), 'currency_id' => $currency->id, 'currency_code' => $currency->code, diff --git a/app/Transformers/PiggyBankTransformer.php b/app/Transformers/PiggyBankTransformer.php index c5883fa4ce..9ae7195a00 100644 --- a/app/Transformers/PiggyBankTransformer.php +++ b/app/Transformers/PiggyBankTransformer.php @@ -102,8 +102,8 @@ class PiggyBankTransformer extends TransformerAbstract $percentage = (int)(0 !== bccomp('0', $currentAmountStr) ? $currentAmount / $targetAmount * 100 : 0); $data = [ 'id' => (int)$piggyBank->id, - 'updated_at' => $piggyBank->updated_at->toAtomString(), 'created_at' => $piggyBank->created_at->toAtomString(), + 'updated_at' => $piggyBank->updated_at->toAtomString(), 'name' => $piggyBank->name, 'currency_id' => $currency->id, 'currency_code' => $currency->code, diff --git a/app/Transformers/PreferenceTransformer.php b/app/Transformers/PreferenceTransformer.php index bbafaf4122..8061f88523 100644 --- a/app/Transformers/PreferenceTransformer.php +++ b/app/Transformers/PreferenceTransformer.php @@ -57,8 +57,8 @@ class PreferenceTransformer extends TransformerAbstract { return [ 'id' => (int)$preference->id, - 'updated_at' => $preference->updated_at->toAtomString(), 'created_at' => $preference->created_at->toAtomString(), + 'updated_at' => $preference->updated_at->toAtomString(), 'name' => $preference->name, 'data' => $preference->data, ]; diff --git a/app/Transformers/RecurrenceTransformer.php b/app/Transformers/RecurrenceTransformer.php index 1d9bb1cb4f..9e5df6a545 100644 --- a/app/Transformers/RecurrenceTransformer.php +++ b/app/Transformers/RecurrenceTransformer.php @@ -36,7 +36,6 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; -use League\Fractal\Resource\Item; use League\Fractal\TransformerAbstract; use Symfony\Component\HttpFoundation\ParameterBag; @@ -78,8 +77,8 @@ class RecurrenceTransformer extends TransformerAbstract // basic data. $return = [ 'id' => (int)$recurrence->id, - 'updated_at' => $recurrence->updated_at->toAtomString(), 'created_at' => $recurrence->created_at->toAtomString(), + 'updated_at' => $recurrence->updated_at->toAtomString(), 'transaction_type_id' => $recurrence->transaction_type_id, 'transaction_type' => $recurrence->transactionType->type, 'title' => $recurrence->title, @@ -172,15 +171,15 @@ class RecurrenceTransformer extends TransformerAbstract /** @var RecurrenceRepetition $repetition */ foreach ($recurrence->recurrenceRepetitions as $repetition) { $repetitionArray = [ - 'id' => $repetition->id, - 'updated_at' => $repetition->updated_at->toAtomString(), - 'created_at' => $repetition->created_at->toAtomString(), - 'repetition_type' => $repetition->repetition_type, - 'repetition_moment' => $repetition->repetition_moment, - 'repetition_skip' => (int)$repetition->repetition_skip, - 'weekend' => (int)$repetition->weekend, - 'description' => $this->repository->repetitionDescription($repetition), - 'occurrences' => [], + 'id' => $repetition->id, + 'created_at' => $repetition->created_at->toAtomString(), + 'updated_at' => $repetition->updated_at->toAtomString(), + 'type' => $repetition->repetition_type, + 'moment' => $repetition->repetition_moment, + 'skip' => (int)$repetition->repetition_skip, + 'weekend' => (int)$repetition->weekend, + 'description' => $this->repository->repetitionDescription($repetition), + 'occurrences' => [], ]; // get the (future) occurrences for this specific type of repetition: @@ -255,22 +254,38 @@ class RecurrenceTransformer extends TransformerAbstract /** @var RecurrenceTransaction $transaction */ foreach ($recurrence->recurrenceTransactions as $transaction) { - $sourceAccount = $transaction->sourceAccount; - $destinationAccount = $transaction->destinationAccount; - $transactionArray = [ - 'currency_id' => $transaction->transaction_currency_id, - 'currency_code' => $transaction->transactionCurrency->code, - 'currency_symbol' => $transaction->transactionCurrency->symbol, - 'currency_dp' => $transaction->transactionCurrency->decimal_places, - 'foreign_currency_id' => $transaction->foreign_currency_id, - 'source_id' => $transaction->source_id, - 'source_name' => null === $sourceAccount ? '' : $sourceAccount->name, - 'destination_id' => $transaction->destination_id, - 'destination_name' => null === $destinationAccount ? '' : $destinationAccount->name, - 'amount' => $transaction->amount, - 'foreign_amount' => $transaction->foreign_amount, - 'description' => $transaction->description, - 'meta' => $this->getTransactionMeta($transaction), + $sourceAccount = $transaction->sourceAccount; + $destinationAccount = $transaction->destinationAccount; + $foreignCurrencyCode = null; + $foreignCurrencySymbol = null; + $foreignCurrencyDp = null; + if (null !== $transaction->foreign_currency_id) { + $foreignCurrencyCode = $transaction->foreignCurrency->code; + $foreignCurrencySymbol = $transaction->foreignCurrency->symbol; + $foreignCurrencyDp = $transaction->foreignCurrency->decimal_places; + } + $amount = round($transaction->amount, $transaction->transactionCurrency->decimal_places); + $foreignAmount = null; + if (null !== $transaction->foreign_currency_id && null !== $transaction->foreign_amount) { + $foreignAmount = round($transaction->foreign_amount, $foreignCurrencyDp); + } + $transactionArray = [ + 'currency_id' => $transaction->transaction_currency_id, + 'currency_code' => $transaction->transactionCurrency->code, + 'currency_symbol' => $transaction->transactionCurrency->symbol, + 'currency_dp' => $transaction->transactionCurrency->decimal_places, + 'foreign_currency_id' => $transaction->foreign_currency_id, + 'foreign_currency_code' => $foreignCurrencyCode, + 'foreign_currency_symbol' => $foreignCurrencySymbol, + 'foreign_currency_dp' => $foreignCurrencyDp, + 'source_id' => $transaction->source_id, + 'source_name' => null === $sourceAccount ? '' : $sourceAccount->name, + 'destination_id' => $transaction->destination_id, + 'destination_name' => null === $destinationAccount ? '' : $destinationAccount->name, + 'amount' => $amount, + 'foreign_amount' => $foreignAmount, + 'description' => $transaction->description, + 'meta' => $this->getTransactionMeta($transaction), ]; if (null !== $transaction->foreign_currency_id) { $transactionArray['foreign_currency_code'] = $transaction->foreignCurrency->code; diff --git a/app/Transformers/RuleActionTransformer.php b/app/Transformers/RuleActionTransformer.php index 29aadd9a86..89a7160208 100644 --- a/app/Transformers/RuleActionTransformer.php +++ b/app/Transformers/RuleActionTransformer.php @@ -60,10 +60,10 @@ class RuleActionTransformer extends TransformerAbstract { $data = [ 'id' => (int)$ruleAction->id, - 'updated_at' => $ruleAction->updated_at->toAtomString(), 'created_at' => $ruleAction->created_at->toAtomString(), - 'action_type' => $ruleAction->action_type, - 'action_value' => $ruleAction->action_value, + 'updated_at' => $ruleAction->updated_at->toAtomString(), + 'type' => $ruleAction->action_type, + 'value' => $ruleAction->action_value, 'order' => $ruleAction->order, 'active' => $ruleAction->active, 'stop_processing' => $ruleAction->stop_processing, diff --git a/app/Transformers/RuleGroupTransformer.php b/app/Transformers/RuleGroupTransformer.php index b1480e19fc..a3b1d2a7f1 100644 --- a/app/Transformers/RuleGroupTransformer.php +++ b/app/Transformers/RuleGroupTransformer.php @@ -58,8 +58,8 @@ class RuleGroupTransformer extends TransformerAbstract { $data = [ 'id' => (int)$ruleGroup->id, - 'updated_at' => $ruleGroup->updated_at->toAtomString(), 'created_at' => $ruleGroup->created_at->toAtomString(), + 'updated_at' => $ruleGroup->updated_at->toAtomString(), 'title' => $ruleGroup->title, 'description' => $ruleGroup->description, 'order' => $ruleGroup->order, diff --git a/app/Transformers/RuleTransformer.php b/app/Transformers/RuleTransformer.php index db0454c3f7..a5b8944682 100644 --- a/app/Transformers/RuleTransformer.php +++ b/app/Transformers/RuleTransformer.php @@ -61,14 +61,15 @@ class RuleTransformer extends TransformerAbstract { $data = [ 'id' => (int)$rule->id, - 'updated_at' => $rule->updated_at->toAtomString(), 'created_at' => $rule->created_at->toAtomString(), + 'updated_at' => $rule->updated_at->toAtomString(), + 'rule_group_id' => (int)$rule->rule_group_id, 'title' => $rule->title, - 'description' => $rule->text, + 'description' => $rule->description, 'order' => (int)$rule->order, 'active' => $rule->active, - 'stop_processing' => $rule->stop_processing, 'strict' => $rule->strict, + 'stop_processing' => $rule->stop_processing, 'triggers' => $this->triggers($rule), 'actions' => $this->actions($rule), 'links' => [ @@ -95,8 +96,8 @@ class RuleTransformer extends TransformerAbstract foreach ($actions as $ruleAction) { $result[] = [ 'id' => (int)$ruleAction->id, - 'updated_at' => $ruleAction->updated_at->toAtomString(), 'created_at' => $ruleAction->created_at->toAtomString(), + 'updated_at' => $ruleAction->updated_at->toAtomString(), 'type' => $ruleAction->action_type, 'value' => $ruleAction->action_value, 'order' => $ruleAction->order, @@ -121,8 +122,8 @@ class RuleTransformer extends TransformerAbstract foreach ($triggers as $ruleTrigger) { $result[] = [ 'id' => (int)$ruleTrigger->id, - 'updated_at' => $ruleTrigger->updated_at->toAtomString(), 'created_at' => $ruleTrigger->created_at->toAtomString(), + 'updated_at' => $ruleTrigger->updated_at->toAtomString(), 'type' => $ruleTrigger->trigger_type, 'value' => $ruleTrigger->trigger_value, 'order' => $ruleTrigger->order, diff --git a/app/Transformers/RuleTriggerTransformer.php b/app/Transformers/RuleTriggerTransformer.php index 076c569746..1fbd638c24 100644 --- a/app/Transformers/RuleTriggerTransformer.php +++ b/app/Transformers/RuleTriggerTransformer.php @@ -59,10 +59,10 @@ class RuleTriggerTransformer extends TransformerAbstract { $data = [ 'id' => (int)$ruleTrigger->id, - 'updated_at' => $ruleTrigger->updated_at->toAtomString(), 'created_at' => $ruleTrigger->created_at->toAtomString(), - 'trigger_type' => $ruleTrigger->trigger_type, - 'trigger_value' => $ruleTrigger->trigger_value, + 'updated_at' => $ruleTrigger->updated_at->toAtomString(), + 'type' => $ruleTrigger->trigger_type, + 'value' => $ruleTrigger->trigger_value, 'order' => $ruleTrigger->order, 'active' => $ruleTrigger->active, 'stop_processing' => $ruleTrigger->stop_processing, diff --git a/app/Transformers/TagTransformer.php b/app/Transformers/TagTransformer.php index 430bf1b299..a3a862f330 100644 --- a/app/Transformers/TagTransformer.php +++ b/app/Transformers/TagTransformer.php @@ -66,8 +66,8 @@ class TagTransformer extends TransformerAbstract $date = null === $tag->date ? null : $tag->date->format('Y-m-d'); $data = [ 'id' => (int)$tag->id, - 'updated_at' => $tag->updated_at->toAtomString(), 'created_at' => $tag->created_at->toAtomString(), + 'updated_at' => $tag->updated_at->toAtomString(), 'tag' => $tag->tag, 'date' => $date, 'description' => '' === $tag->description ? null : $tag->description, diff --git a/app/Transformers/TransactionTransformer.php b/app/Transformers/TransactionTransformer.php index ff28be211e..58ded272f2 100644 --- a/app/Transformers/TransactionTransformer.php +++ b/app/Transformers/TransactionTransformer.php @@ -85,8 +85,8 @@ class TransactionTransformer extends TransformerAbstract $data = [ 'id' => (int)$transaction->id, - 'updated_at' => $transaction->updated_at->toAtomString(), 'created_at' => $transaction->created_at->toAtomString(), + 'updated_at' => $transaction->updated_at->toAtomString(), 'description' => $transaction->description, 'transaction_description' => $transaction->transaction_description, 'date' => $transaction->date->format('Y-m-d'), diff --git a/app/Transformers/UserTransformer.php b/app/Transformers/UserTransformer.php index 929cd3e7d6..ace2097a48 100644 --- a/app/Transformers/UserTransformer.php +++ b/app/Transformers/UserTransformer.php @@ -66,8 +66,8 @@ class UserTransformer extends TransformerAbstract return [ 'id' => (int)$user->id, - 'updated_at' => $user->updated_at->toAtomString(), 'created_at' => $user->created_at->toAtomString(), + 'updated_at' => $user->updated_at->toAtomString(), 'email' => $user->email, 'blocked' => 1 === (int)$user->blocked, 'blocked_code' => '' === $user->blocked_code ? null : $user->blocked_code, diff --git a/routes/api.php b/routes/api.php index 6ff91d91d4..ef64f28647 100644 --- a/routes/api.php +++ b/routes/api.php @@ -301,7 +301,7 @@ Route::group( Route::get('{tagOrId}', ['uses' => 'TagController@show', 'as' => 'show']); Route::put('{tagOrId}', ['uses' => 'TagController@update', 'as' => 'update']); Route::delete('{tagOrId}', ['uses' => 'TagController@delete', 'as' => 'delete']); - Route::get('{tagOrId}/transactions', ['uses' => 'TagController@transactions', 'as' => 'delete']); + Route::get('{tagOrId}/transactions', ['uses' => 'TagController@transactions', 'as' => 'transactions']); } ); diff --git a/tests/Api/V1/Controllers/AccountControllerTest.php b/tests/Api/V1/Controllers/AccountControllerTest.php index 019a2a1a4e..ec8dfa5a7b 100644 --- a/tests/Api/V1/Controllers/AccountControllerTest.php +++ b/tests/Api/V1/Controllers/AccountControllerTest.php @@ -23,8 +23,6 @@ declare(strict_types=1); namespace Tests\Api\V1\Controllers; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Helpers\Collector\TransactionCollector; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionCurrency; @@ -32,6 +30,8 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; +use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Support\Collection; use Laravel\Passport\Passport; use Log; use Mockery; @@ -520,31 +520,14 @@ class AccountControllerTest extends TestCase $asset = $this->getRandomAsset(); // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue(); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -565,7 +548,7 @@ class AccountControllerTest extends TestCase $response = $this->get(route('api.v1.accounts.transactions', [$asset->id])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } @@ -582,34 +565,15 @@ class AccountControllerTest extends TestCase $accountRepos->shouldReceive('getAccountsByType') ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); - $revenue = $this->getRandomRevenue(); - - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $revenue = $this->getRandomRevenue(); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); + $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnFalse(); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -619,18 +583,13 @@ class AccountControllerTest extends TestCase $collector->shouldReceive('setLimit')->andReturnSelf(); $collector->shouldReceive('setPage')->andReturnSelf(); $collector->shouldReceive('setTypes')->andReturnSelf(); - - $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); - - // mock some calls: - // test API $response = $this->get(route('api.v1.accounts.transactions', [$revenue->id])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } @@ -647,34 +606,14 @@ class AccountControllerTest extends TestCase $accountRepos->shouldReceive('getAccountsByType') ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); - $asset = $this->getRandomAsset(); - - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $asset = $this->getRandomAsset(); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue(); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -696,7 +635,7 @@ class AccountControllerTest extends TestCase $response = $this->get(route('api.v1.accounts.transactions', [$asset->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } diff --git a/tests/Api/V1/Controllers/AvailableBudgetControllerTest.php b/tests/Api/V1/Controllers/AvailableBudgetControllerTest.php index cbac78120a..69b8b2a8ac 100644 --- a/tests/Api/V1/Controllers/AvailableBudgetControllerTest.php +++ b/tests/Api/V1/Controllers/AvailableBudgetControllerTest.php @@ -56,7 +56,8 @@ class AvailableBudgetControllerTest extends TestCase public function testDelete(): void { // mock stuff: - $repository = $this->mock(BudgetRepositoryInterface::class); + $repository = $this->mock(BudgetRepositoryInterface::class); + $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); // mock calls: $repository->shouldReceive('setUser')->once(); @@ -79,7 +80,8 @@ class AvailableBudgetControllerTest extends TestCase { $availableBudgets = $this->user()->availableBudgets()->get(); // mock stuff: - $repository = $this->mock(BudgetRepositoryInterface::class); + $repository = $this->mock(BudgetRepositoryInterface::class); + $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); // mock calls: $repository->shouldReceive('setUser')->once(); @@ -100,7 +102,8 @@ class AvailableBudgetControllerTest extends TestCase { $availableBudget = $this->user()->availableBudgets()->first(); // mock stuff: - $repository = $this->mock(BudgetRepositoryInterface::class); + $repository = $this->mock(BudgetRepositoryInterface::class); + $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); // mock calls: $repository->shouldReceive('setUser')->once(); diff --git a/tests/Api/V1/Controllers/BillControllerTest.php b/tests/Api/V1/Controllers/BillControllerTest.php index 10a799f56e..6003470e6f 100644 --- a/tests/Api/V1/Controllers/BillControllerTest.php +++ b/tests/Api/V1/Controllers/BillControllerTest.php @@ -24,8 +24,6 @@ declare(strict_types=1); namespace Tests\Api\V1\Controllers; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Helpers\Collector\TransactionCollector; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Models\Attachment; use FireflyIII\Models\Bill; @@ -277,36 +275,16 @@ class BillControllerTest extends TestCase */ public function testTransactionsBasic(): void { - $bill = $this->user()->bills()->first(); - - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $bill = $this->user()->bills()->first(); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $billRepos->shouldReceive('setUser'); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); - - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -317,8 +295,6 @@ class BillControllerTest extends TestCase $collector->shouldReceive('setPage')->andReturnSelf(); $collector->shouldReceive('setTypes')->andReturnSelf(); $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); - - $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); @@ -328,7 +304,7 @@ class BillControllerTest extends TestCase $response = $this->get(route('api.v1.bills.transactions', [$bill->id])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } @@ -340,34 +316,16 @@ class BillControllerTest extends TestCase */ public function testTransactionsRange(): void { - $bill = $this->user()->bills()->first(); - - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $bill = $this->user()->bills()->first(); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $billRepos->shouldReceive('setUser'); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -390,7 +348,7 @@ class BillControllerTest extends TestCase $response = $this->get(route('api.v1.bills.transactions', [$bill->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } diff --git a/tests/Api/V1/Controllers/BudgetControllerTest.php b/tests/Api/V1/Controllers/BudgetControllerTest.php index 618803975b..91ddca843b 100644 --- a/tests/Api/V1/Controllers/BudgetControllerTest.php +++ b/tests/Api/V1/Controllers/BudgetControllerTest.php @@ -24,8 +24,6 @@ declare(strict_types=1); namespace Tests\Api\V1\Controllers; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Helpers\Collector\TransactionCollector; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; @@ -34,6 +32,8 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; +use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Support\Collection; use Laravel\Passport\Passport; use Log; use Tests\TestCase; @@ -217,38 +217,19 @@ class BudgetControllerTest extends TestCase */ public function testTransactionsBasic(): void { - $budget = $this->user()->budgets()->first(); - - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $budget = $this->user()->budgets()->first(); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $billRepos->shouldReceive('setUser'); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); $budgetRepos->shouldReceive('setUser'); - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -261,14 +242,11 @@ class BudgetControllerTest extends TestCase $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); - - // mock some calls: - // test API $response = $this->get(route('api.v1.budgets.transactions', [$budget->id])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } @@ -280,36 +258,17 @@ class BudgetControllerTest extends TestCase */ public function testTransactionsRange(): void { - $budget = $this->user()->budgets()->first(); - - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $budget = $this->user()->budgets()->first(); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $billRepos->shouldReceive('setUser'); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); $budgetRepos->shouldReceive('setUser'); - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -321,18 +280,14 @@ class BudgetControllerTest extends TestCase $collector->shouldReceive('setPage')->andReturnSelf(); $collector->shouldReceive('setTypes')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf(); - - $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); - // mock some calls: - // test API $response = $this->get(route('api.v1.budgets.transactions', [$budget->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } diff --git a/tests/Api/V1/Controllers/BudgetLimitControllerTest.php b/tests/Api/V1/Controllers/BudgetLimitControllerTest.php index 417d23ab89..22a6cdfb29 100644 --- a/tests/Api/V1/Controllers/BudgetLimitControllerTest.php +++ b/tests/Api/V1/Controllers/BudgetLimitControllerTest.php @@ -24,8 +24,6 @@ declare(strict_types=1); namespace Tests\Api\V1\Controllers; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Helpers\Collector\TransactionCollector; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; @@ -34,6 +32,8 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; +use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Support\Collection; use Laravel\Passport\Passport; use Log; use Tests\TestCase; @@ -269,38 +269,18 @@ class BudgetLimitControllerTest extends TestCase */ public function testTransactionsBasic(): void { - $budgetLimit = BudgetLimit::first(); - - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $budgetLimit = BudgetLimit::first(); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $billRepos->shouldReceive('setUser'); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); $budgetRepos->shouldReceive('setUser'); - - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -321,7 +301,7 @@ class BudgetLimitControllerTest extends TestCase $response = $this->get(route('api.v1.budget_limits.transactions', [$budgetLimit->id])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } @@ -352,7 +332,6 @@ class BudgetLimitControllerTest extends TestCase ]; // mock stuff: $repository = $this->mock(BudgetRepositoryInterface::class); - $repository->shouldReceive('findNull')->andReturn($budget)->once(); $repository->shouldReceive('updateBudgetLimit')->andReturn($budgetLimit)->once(); @@ -365,43 +344,4 @@ class BudgetLimitControllerTest extends TestCase $response->assertHeader('Content-Type', 'application/vnd.api+json'); } - - /** - * Test update of budget limit but submit bad budget. - * - * @covers \FireflyIII\Api\V1\Controllers\BudgetLimitController - * @covers \FireflyIII\Api\V1\Requests\BudgetLimitRequest - */ - public function testUpdateBadBudget(): void - { - $budget = $this->user()->budgets()->first(); - $budgetLimit = BudgetLimit::create( - [ - 'budget_id' => $budget->id, - 'start_date' => '2018-01-01', - 'end_date' => '2018-01-31', - 'amount' => 1, - ] - ); - $data - = [ - 'budget_id' => $budget->id, - 'start' => '2018-01-01', - 'end' => '2018-01-31', - 'amount' => 2, - ]; - // mock stuff: - $repository = $this->mock(BudgetRepositoryInterface::class); - $repository->shouldReceive('findNull')->andReturn(null)->once(); - - - // mock calls: - $repository->shouldReceive('setUser')->once(); - - // call API - $response = $this->put('/api/v1/budgets/limits/' . $budgetLimit->id, $data); - $response->assertStatus(500); - $response->assertSee('Unknown budget.'); - } - } diff --git a/tests/Api/V1/Controllers/CategoryControllerTest.php b/tests/Api/V1/Controllers/CategoryControllerTest.php index 2757375abb..9c3652d42c 100644 --- a/tests/Api/V1/Controllers/CategoryControllerTest.php +++ b/tests/Api/V1/Controllers/CategoryControllerTest.php @@ -24,8 +24,6 @@ declare(strict_types=1); namespace Tests\Api\V1\Controllers; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Helpers\Collector\TransactionCollector; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Models\Category; use FireflyIII\Repositories\Account\AccountRepositoryInterface; @@ -33,6 +31,8 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; +use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Support\Collection; use Laravel\Passport\Passport; use Log; use Tests\TestCase; @@ -157,36 +157,19 @@ class CategoryControllerTest extends TestCase */ public function testTransactionsBasic(): void { - $category = $this->user()->categories()->first(); - - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $category = $this->user()->categories()->first(); $repository = $this->mock(JournalRepositoryInterface::class); + $categoryRepos = $this->mock(CategoryRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); + + $categoryRepos->shouldReceive('setUser')->atLeast()->once(); $billRepos->shouldReceive('setUser'); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); - - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -206,7 +189,7 @@ class CategoryControllerTest extends TestCase $response = $this->get(route('api.v1.categories.transactions', [$category->id])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } @@ -218,34 +201,18 @@ class CategoryControllerTest extends TestCase */ public function testTransactionsRange(): void { - $category = $this->user()->categories()->first(); - - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $category = $this->user()->categories()->first(); + $categoryRepos = $this->mock(CategoryRepositoryInterface::class); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $billRepos = $this->mock(BillRepositoryInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); + + $categoryRepos->shouldReceive('setUser')->atLeast()->once(); $billRepos->shouldReceive('setUser'); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -257,21 +224,14 @@ class CategoryControllerTest extends TestCase $collector->shouldReceive('setPage')->andReturnSelf(); $collector->shouldReceive('setTypes')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf(); - - $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); - - // mock some calls: - - // test API - $response = $this->get( route('api.v1.categories.transactions', [$category->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31']) ); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } diff --git a/tests/Api/V1/Controllers/ConfigurationControllerTest.php b/tests/Api/V1/Controllers/ConfigurationControllerTest.php index e69126950d..f706e62566 100644 --- a/tests/Api/V1/Controllers/ConfigurationControllerTest.php +++ b/tests/Api/V1/Controllers/ConfigurationControllerTest.php @@ -114,6 +114,7 @@ class ConfigurationControllerTest extends TestCase * Set configuration variables. * * @covers \FireflyIII\Api\V1\Controllers\ConfigurationController + * @covers \FireflyIII\Api\V1\Requests\ConfigurationRequest */ public function testUpdate(): void { @@ -165,6 +166,7 @@ class ConfigurationControllerTest extends TestCase * Set configuration variables. * * @covers \FireflyIII\Api\V1\Controllers\ConfigurationController + * @covers \FireflyIII\Api\V1\Requests\ConfigurationRequest */ public function testUpdateBoolean(): void { @@ -217,6 +219,7 @@ class ConfigurationControllerTest extends TestCase * Set configuration variable that you're not allowed to change * * @covers \FireflyIII\Api\V1\Controllers\ConfigurationController + * @covers \FireflyIII\Api\V1\Requests\ConfigurationRequest */ public function testUpdateInvalid(): void { @@ -232,6 +235,7 @@ class ConfigurationControllerTest extends TestCase * Set configuration variables but you're not the owner. * * @covers \FireflyIII\Api\V1\Controllers\ConfigurationController + * @covers \FireflyIII\Api\V1\Requests\ConfigurationRequest */ public function testUpdateNotOwner(): void { diff --git a/tests/Api/V1/Controllers/CurrencyControllerTest.php b/tests/Api/V1/Controllers/CurrencyControllerTest.php index 6e5f08eb80..995723233a 100644 --- a/tests/Api/V1/Controllers/CurrencyControllerTest.php +++ b/tests/Api/V1/Controllers/CurrencyControllerTest.php @@ -24,8 +24,6 @@ declare(strict_types=1); namespace Tests\Api\V1\Controllers; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Helpers\Collector\TransactionCollector; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Models\Account; use FireflyIII\Models\Bill; @@ -115,10 +113,12 @@ class CurrencyControllerTest extends TestCase { $availableBudgets = $this->user()->availableBudgets()->get(); // mock stuff: - $budgetRepos = $this->mock(BudgetRepositoryInterface::class); - + $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); // mock calls: + $currencyRepos->shouldReceive('setUser')->once(); $budgetRepos->shouldReceive('setUser')->once(); $budgetRepos->shouldReceive('getAvailableBudgets')->once()->andReturn($availableBudgets); @@ -140,10 +140,13 @@ class CurrencyControllerTest extends TestCase $bills = factory(Bill::class, 10)->create(); $paginator = new LengthAwarePaginator($bills, 10, 50, 1); // mock stuff: - $repository = $this->mock(BillRepositoryInterface::class); + $repository = $this->mock(BillRepositoryInterface::class); + $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); // mock calls: $repository->shouldReceive('setUser'); + $currencyRepos->shouldReceive('setUser')->once(); $repository->shouldReceive('getPaginator')->withAnyArgs()->andReturn($paginator)->once(); $repository->shouldReceive('getRulesForBill')->withAnyArgs()->andReturn(new Collection()); $repository->shouldReceive('getNoteText')->andReturn('Hi there'); @@ -164,13 +167,16 @@ class CurrencyControllerTest extends TestCase public function testBudgetLimits(): void { $repository = $this->mock(BudgetRepositoryInterface::class); + $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); $currency = TransactionCurrency::first(); $budgetLimit = BudgetLimit::first(); $budgetLimit->transaction_currency_id = $currency->id; $collection = new Collection([$budgetLimit]); + // mock calls: $repository->shouldReceive('getAllBudgetLimits')->once()->andReturn($collection); - + $currencyRepos->shouldReceive('setUser')->once(); $response = $this->get(route('api.v1.currencies.budget_limits', [$currency->code])); $response->assertStatus(200); @@ -183,6 +189,7 @@ class CurrencyControllerTest extends TestCase public function testCer(): void { $repository = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); $repository->shouldReceive('setUser')->once(); $repository->shouldReceive('getExchangeRates')->once()->andReturn(new Collection); @@ -367,11 +374,14 @@ class CurrencyControllerTest extends TestCase $recurrences = $this->user()->recurrences()->get(); // mock stuff: - $repository = $this->mock(RecurringRepositoryInterface::class); - $budgetRepos = $this->mock(BudgetRepositoryInterface::class); - $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); + $repository = $this->mock(RecurringRepositoryInterface::class); + $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); + $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); // mock calls: + $currencyRepos->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser'); $repository->shouldReceive('getAll')->once()->andReturn($recurrences); $repository->shouldReceive('getNoteText')->andReturn('Notes.'); @@ -393,9 +403,11 @@ class CurrencyControllerTest extends TestCase { $rules = $this->user()->rules()->get(); - $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); $ruleRepos->shouldReceive('getAll')->once()->andReturn($rules); - + $currencyRepos->shouldReceive('setUser')->once(); // call API $currency = TransactionCurrency::first(); @@ -514,34 +526,16 @@ class CurrencyControllerTest extends TestCase { $currency = TransactionCurrency::first(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); $accountRepos->shouldReceive('setUser'); - $accountRepos->shouldReceive('getAccountsByType')->atLeast()->once() - ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - // mock stuff: + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -559,7 +553,7 @@ class CurrencyControllerTest extends TestCase $response = $this->get(route('api.v1.currencies.transactions', [$currency->code])); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } @@ -571,34 +565,15 @@ class CurrencyControllerTest extends TestCase { $currency = TransactionCurrency::first(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); $accountRepos->shouldReceive('setUser'); - $accountRepos->shouldReceive('getAccountsByType')->atLeast()->once() - ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); - // get some transactions using the collector: - Log::info('This transaction collector is OK, because it is used in a test:'); - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); $repository->shouldReceive('setUser'); $currencyRepository->shouldReceive('setUser'); - - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -619,7 +594,7 @@ class CurrencyControllerTest extends TestCase ); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } diff --git a/tests/Api/V1/Controllers/ImportControllerTest.php b/tests/Api/V1/Controllers/ImportControllerTest.php index 99141e2628..48eedd065d 100644 --- a/tests/Api/V1/Controllers/ImportControllerTest.php +++ b/tests/Api/V1/Controllers/ImportControllerTest.php @@ -21,7 +21,7 @@ declare(strict_types=1); -namespace tests\Api\V1\Controllers; +namespace Tests\Api\V1\Controllers; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Models\ImportJob; diff --git a/tests/Api/V1/Controllers/RecurrenceControllerTest.php b/tests/Api/V1/Controllers/RecurrenceControllerTest.php index 427aa2508b..3a25b53e3d 100644 --- a/tests/Api/V1/Controllers/RecurrenceControllerTest.php +++ b/tests/Api/V1/Controllers/RecurrenceControllerTest.php @@ -64,9 +64,10 @@ class RecurrenceControllerTest extends TestCase public function testDelete(): void { // mock stuff: - $repository = $this->mock(RecurringRepositoryInterface::class); - $budgetRepos = $this->mock(BudgetRepositoryInterface::class); - $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); + $repository = $this->mock(RecurringRepositoryInterface::class); + $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); + $categoryFactory = $this->mock(CategoryFactory::class); // mock calls: $repository->shouldReceive('setUser')->once(); @@ -89,9 +90,10 @@ class RecurrenceControllerTest extends TestCase $recurrences = $this->user()->recurrences()->get(); // mock stuff: - $repository = $this->mock(RecurringRepositoryInterface::class); - $budgetRepos = $this->mock(BudgetRepositoryInterface::class); - $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); + $repository = $this->mock(RecurringRepositoryInterface::class); + $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); + $categoryFactory = $this->mock(CategoryFactory::class); $budgetRepos->shouldReceive('findNull')->atLeast()->once()->withAnyArgs() ->andReturn($this->user()->budgets()->first()); @@ -100,6 +102,8 @@ class RecurrenceControllerTest extends TestCase ->andReturn($this->user()->piggyBanks()->first()); // mock calls: + $categoryFactory->shouldReceive('setUser')->atLeast()->once(); + $categoryFactory->shouldReceive('findOrCreate')->atLeast()->once()->andReturn(null); $repository->shouldReceive('setUser'); $repository->shouldReceive('getAll')->once()->andReturn($recurrences); $repository->shouldReceive('getNoteText')->andReturn('Notes.'); @@ -123,14 +127,18 @@ class RecurrenceControllerTest extends TestCase $recurrence = $this->user()->recurrences()->first(); // mock stuff: - $repository = $this->mock(RecurringRepositoryInterface::class); - $budgetRepos = $this->mock(BudgetRepositoryInterface::class); - $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); + $repository = $this->mock(RecurringRepositoryInterface::class); + $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $piggyRepos = $this->mock(PiggyBankRepositoryInterface::class); + $categoryFactory = $this->mock(CategoryFactory::class); + $budgetRepos->shouldReceive('findNull')->atLeast()->once()->withAnyArgs() ->andReturn($this->user()->budgets()->first()); // mock calls: + $categoryFactory->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.'); @@ -1685,10 +1693,11 @@ class RecurrenceControllerTest extends TestCase $recurrence = $this->user()->recurrences()->first(); $paginator = new LengthAwarePaginator(new Collection, 0, 50); // mock repositories: - $recurringRepos = $this->mock(RecurringRepositoryInterface::class); - $userRepos = $this->mock(UserRepositoryInterface::class); - $collector = $this->mock(TransactionCollectorInterface::class); - $journalIds = $recurringRepos->shouldReceive('getJournalIds')->once()->andReturn([1, 2, 3]); + $recurringRepos = $this->mock(RecurringRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + $categoryFactory = $this->mock(CategoryFactory::class); + $journalIds = $recurringRepos->shouldReceive('getJournalIds')->once()->andReturn([1, 2, 3]); $collector->shouldReceive('setUser')->once()->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->once()->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->once()->andReturnSelf(); @@ -1715,8 +1724,11 @@ class RecurrenceControllerTest extends TestCase */ public function testTriggerError(): void { - $cronjob = $this->mock(RecurringCronjob::class); + $repository = $this->mock(RecurringRepositoryInterface::class); + $cronjob = $this->mock(RecurringCronjob::class); + $categoryFactory = $this->mock(CategoryFactory::class); $cronjob->shouldReceive('fire')->andThrow(FireflyException::class); + $repository->shouldReceive('setUser')->atLeast()->once(); $response = $this->post(route('api.v1.recurrences.trigger')); @@ -1729,9 +1741,11 @@ class RecurrenceControllerTest extends TestCase */ public function testTriggerFalse(): void { - $cronjob = $this->mock(RecurringCronjob::class); + $repository = $this->mock(RecurringRepositoryInterface::class); + $cronjob = $this->mock(RecurringCronjob::class); + $categoryFactory = $this->mock(CategoryFactory::class); $cronjob->shouldReceive('fire')->once()->andReturnFalse(); - + $repository->shouldReceive('setUser')->atLeast()->once(); $response = $this->post(route('api.v1.recurrences.trigger')); $response->assertStatus(204); @@ -1742,9 +1756,11 @@ class RecurrenceControllerTest extends TestCase */ public function testTriggerTrue(): void { - $cronjob = $this->mock(RecurringCronjob::class); + $repository = $this->mock(RecurringRepositoryInterface::class); + $cronjob = $this->mock(RecurringCronjob::class); + $categoryFactory = $this->mock(CategoryFactory::class); $cronjob->shouldReceive('fire')->once()->andReturnTrue(); - + $repository->shouldReceive('setUser')->atLeast()->once(); $response = $this->post(route('api.v1.recurrences.trigger')); $response->assertStatus(200); diff --git a/tests/Api/V1/Controllers/RuleControllerTest.php b/tests/Api/V1/Controllers/RuleControllerTest.php index 2b899abc0d..f6699adb06 100644 --- a/tests/Api/V1/Controllers/RuleControllerTest.php +++ b/tests/Api/V1/Controllers/RuleControllerTest.php @@ -62,9 +62,11 @@ class RuleControllerTest extends TestCase $rule = $this->user()->rules()->first(); // mock stuff: - $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); // mock calls: + $accountRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('destroy')->once()->andReturn(true); @@ -79,7 +81,10 @@ class RuleControllerTest extends TestCase { $rules = $this->user()->rules()->get(); - $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('getAll')->once()->andReturn($rules); @@ -96,9 +101,11 @@ class RuleControllerTest extends TestCase */ public function testShow(): void { - $rule = $this->user()->rules()->first(); + $rule = $this->user()->rules()->first(); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); - $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $accountRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once(); @@ -115,7 +122,9 @@ class RuleControllerTest extends TestCase */ public function testStore(): void { - $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + $ruleRepos->shouldReceive('setUser')->once(); $rule = $this->user()->rules()->first(); $data = [ @@ -141,6 +150,7 @@ class RuleControllerTest extends TestCase ], ]; + $accountRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('store')->once()->andReturn($rule); // test API @@ -155,7 +165,10 @@ class RuleControllerTest extends TestCase */ public function testStoreNoActions(): void { - $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once(); $rule = $this->user()->rules()->first(); $data = [ @@ -187,7 +200,10 @@ class RuleControllerTest extends TestCase */ public function testStoreNoTriggers(): void { - $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once(); $rule = $this->user()->rules()->first(); $data = [ @@ -224,8 +240,11 @@ class RuleControllerTest extends TestCase $repository = $this->mock(AccountRepositoryInterface::class); $matcher = $this->mock(TransactionMatcher::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); - $asset = $this->getRandomAsset(); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + + $asset = $this->getRandomAsset(); $repository->shouldReceive('setUser')->once(); + $ruleRepos->shouldReceive('setUser')->once(); $repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset); $repository->shouldReceive('findNull')->withArgs([2])->andReturn($asset); @@ -256,8 +275,11 @@ class RuleControllerTest extends TestCase $repository = $this->mock(AccountRepositoryInterface::class); $matcher = $this->mock(TransactionMatcher::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $asset = $this->getRandomAsset(); $repository->shouldReceive('setUser')->once(); + $ruleRepos->shouldReceive('setUser')->once(); $repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset); $repository->shouldReceive('findNull')->withArgs([2])->andReturn($asset); $repository->shouldReceive('findNull')->withArgs([3])->andReturn(null); @@ -282,7 +304,10 @@ class RuleControllerTest extends TestCase */ public function testUpdate(): void { - $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $ruleRepos = $this->mock(RuleRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once(); /** @var Rule $rule */ $rule = $this->user()->rules()->first(); diff --git a/tests/Api/V1/Controllers/RuleGroupControllerTest.php b/tests/Api/V1/Controllers/RuleGroupControllerTest.php index 51aefc9165..222e797e58 100644 --- a/tests/Api/V1/Controllers/RuleGroupControllerTest.php +++ b/tests/Api/V1/Controllers/RuleGroupControllerTest.php @@ -24,10 +24,17 @@ declare(strict_types=1); namespace Tests\Api\V1\Controllers; +use FireflyIII\Jobs\ExecuteRuleOnExistingTransactions; +use FireflyIII\Jobs\Job; use FireflyIII\Models\RuleGroup; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; +use FireflyIII\TransactionRules\TransactionMatcher; +use Illuminate\Support\Collection; use Laravel\Passport\Passport; use Log; +use Queue; use Tests\TestCase; /** @@ -56,8 +63,10 @@ class RuleGroupControllerTest extends TestCase // mock stuff: $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); // mock calls: + $accountRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('destroy')->once()->andReturn(true); @@ -70,9 +79,11 @@ class RuleGroupControllerTest extends TestCase */ public function testIndex(): void { - $ruleGroups = $this->user()->ruleGroups()->get(); - + $ruleGroups = $this->user()->ruleGroups()->get(); $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('get')->once()->andReturn($ruleGroups); @@ -84,6 +95,24 @@ class RuleGroupControllerTest extends TestCase $response->assertHeader('Content-Type', 'application/vnd.api+json'); } + /** + * @covers \FireflyIII\Api\V1\Controllers\RuleGroupController + */ + public function testRules(): void + { + $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); + $ruleGroupRepos->shouldReceive('setUser')->once(); + $ruleGroupRepos->shouldReceive('getRules')->once()->andReturn(new Collection); + + // call API + $group = $this->user()->ruleGroups()->first(); + $response = $this->get(route('api.v1.rule_groups.rules', [$group->id])); + $response->assertStatus(200); + } + /** * @covers \FireflyIII\Api\V1\Controllers\RuleGroupController */ @@ -92,6 +121,9 @@ class RuleGroupControllerTest extends TestCase /** @var RuleGroup $ruleGroup */ $ruleGroup = $this->user()->ruleGroups()->first(); $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once(); @@ -109,6 +141,9 @@ class RuleGroupControllerTest extends TestCase public function testStore(): void { $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroup = $this->user()->ruleGroups()->first(); $data = [ @@ -125,6 +160,98 @@ class RuleGroupControllerTest extends TestCase } + /** + * @covers \FireflyIII\Api\V1\Controllers\RuleGroupController + */ + public function testTestGroupBasic(): void + { + $group = $this->user()->ruleGroups()->first(); + $rule = $this->user()->rules()->first(); + + $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); + $repository = $this->mock(AccountRepositoryInterface::class); + $matcher = $this->mock(TransactionMatcher::class); + $journalRepos = $this->mock(JournalRepositoryInterface::class); + $ruleGroupRepos->shouldReceive('setUser')->once(); + $ruleGroupRepos->shouldReceive('getActiveRules')->once()->andReturn(new Collection([$rule])); + + $asset = $this->getRandomAsset(); + $repository->shouldReceive('setUser')->once(); + + $repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset); + $repository->shouldReceive('findNull')->withArgs([2])->andReturn($asset); + $repository->shouldReceive('findNull')->withArgs([3])->andReturn(null); + $repository->shouldReceive('isAsset')->withArgs([1])->andReturn(true); + $repository->shouldReceive('isAsset')->withArgs([2])->andReturn(false); + + $matcher->shouldReceive('setRule')->once(); + $matcher->shouldReceive('setEndDate')->once(); + $matcher->shouldReceive('setStartDate')->once(); + $matcher->shouldReceive('setSearchLimit')->once(); + $matcher->shouldReceive('setTriggeredLimit')->once(); + $matcher->shouldReceive('setAccounts')->once(); + $matcher->shouldReceive('findTransactionsByRule')->once()->andReturn(new Collection); + + // call API + $response = $this->get(route('api.v1.rule_groups.test', [$group->id]) . '?accounts=1,2,3'); + $response->assertStatus(200); + } + + /** + * @covers \FireflyIII\Api\V1\Controllers\RuleGroupController + */ + public function testTestGroupEmpty(): void + { + + $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); + $ruleGroupRepos->shouldReceive('setUser')->once(); + $ruleGroupRepos->shouldReceive('getActiveRules')->once()->andReturn(new Collection); + + // call API + $group = $this->user()->ruleGroups()->first(); + $response = $this->get(route('api.v1.rule_groups.test', [$group->id])); + $response->assertStatus(500); + } + + /** + * @covers \FireflyIII\Api\V1\Controllers\RuleGroupController + */ + public function testTrigger(): void + { + $group = $this->user()->ruleGroups()->first(); + $rule = $this->user()->rules()->first(); + $asset = $this->getRandomAsset(); + + + $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); + $repository = $this->mock(AccountRepositoryInterface::class); + $matcher = $this->mock(TransactionMatcher::class); + $journalRepos = $this->mock(JournalRepositoryInterface::class); + $ruleGroupRepos->shouldReceive('setUser')->once(); + $repository->shouldReceive('setUser')->once(); + $ruleGroupRepos->shouldReceive('getActiveRules')->once()->andReturn(new Collection([$rule])); + + $repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset); + $repository->shouldReceive('findNull')->withArgs([2])->andReturn($asset); + $repository->shouldReceive('findNull')->withArgs([3])->andReturn(null); + $repository->shouldReceive('isAsset')->withArgs([1])->andReturn(true); + $repository->shouldReceive('isAsset')->withArgs([2])->andReturn(false); + + Queue::fake(); + $response = $this->post(route('api.v1.rule_groups.trigger', [$group->id]) . '?accounts=1,2,3'); + $response->assertStatus(204); + + + Queue::assertPushed( + ExecuteRuleOnExistingTransactions::class, function (Job $job) use ($rule) { + return $job->getRule()->id === $rule->id; + } + ); + } + /** * @covers \FireflyIII\Api\V1\Controllers\RuleGroupController * @covers \FireflyIII\Api\V1\Requests\RuleGroupRequest @@ -132,6 +259,9 @@ class RuleGroupControllerTest extends TestCase public function testUpdate(): void { $ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); + + $accountRepos->shouldReceive('setUser')->once(); $ruleGroupRepos->shouldReceive('setUser')->once(); $ruleGroup = $this->user()->ruleGroups()->first(); $data = [ diff --git a/tests/Api/V1/Controllers/TagControllerTest.php b/tests/Api/V1/Controllers/TagControllerTest.php new file mode 100644 index 0000000000..7921b8422a --- /dev/null +++ b/tests/Api/V1/Controllers/TagControllerTest.php @@ -0,0 +1,234 @@ +. + */ + +declare(strict_types=1); + +namespace Tests\Api\V1\Controllers; + +use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use FireflyIII\Repositories\Journal\JournalRepositoryInterface; +use FireflyIII\Repositories\Tag\TagRepositoryInterface; +use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Support\Collection; +use Laravel\Passport\Passport; +use Log; +use Tests\TestCase; + +/** + * Class TagControllerTest + */ +class TagControllerTest extends TestCase +{ + /** + * + */ + public function setUp(): void + { + parent::setUp(); + Passport::actingAs($this->user()); + Log::info(sprintf('Now in %s.', \get_class($this))); + } + + /** + * Destroy Tag over API. + * + * @covers \FireflyIII\Api\V1\Controllers\TagController + */ + public function testDelete(): void + { + // mock stuff: + $tagRepos = $this->mock(TagRepositoryInterface::class); + $tag = $this->user()->tags()->inRandomOrder()->first(); + + // mock calls: + $tagRepos->shouldReceive('setUser')->times(2); + $tagRepos->shouldReceive('destroy')->once()->andReturn(true); + $tagRepos->shouldReceive('findByTag')->once()->withArgs([(string)$tag->id])->andReturnNull(); + $tagRepos->shouldReceive('findNull')->once()->withArgs([$tag->id])->andReturn($tag); + + + // call API + $response = $this->delete(route('api.v1.tags.delete', [$tag->id])); + $response->assertStatus(204); + } + + /** + * Destroy Tag over API. + * + * @covers \FireflyIII\Api\V1\Controllers\TagController + */ + public function testDeleteByTag(): void + { + // mock stuff: + $tagRepos = $this->mock(TagRepositoryInterface::class); + $tag = $this->user()->tags()->inRandomOrder()->first(); + // mock calls: + $tagRepos->shouldReceive('setUser')->times(2); + $tagRepos->shouldReceive('destroy')->once()->andReturn(true); + $tagRepos->shouldReceive('findByTag')->once()->withArgs([(string)$tag->tag])->andReturn($tag); + + // call API + $response = $this->delete(route('api.v1.tags.delete', [$tag->tag])); + $response->assertStatus(204); + } + + /** + * Tag index + * + * @covers \FireflyIII\Api\V1\Controllers\TagController + */ + public function testIndex(): void + { + // mock stuff: + $tagRepos = $this->mock(TagRepositoryInterface::class); + + // mock calls: + $tagRepos->shouldReceive('setUser')->times(1); + $tagRepos->shouldReceive('get')->once()->andReturn(new Collection()); + + // call API + $response = $this->get(route('api.v1.tags.index')); + $response->assertStatus(200); + } + + /** + * Destroy Tag over API. + * + * @covers \FireflyIII\Api\V1\Controllers\TagController + */ + public function testShow(): void + { + // mock stuff: + $tagRepos = $this->mock(TagRepositoryInterface::class); + $tag = $this->user()->tags()->inRandomOrder()->first(); + + // mock calls: + $tagRepos->shouldReceive('setUser')->times(2); + $tagRepos->shouldReceive('findByTag')->once()->withArgs([(string)$tag->id])->andReturnNull(); + $tagRepos->shouldReceive('findNull')->once()->withArgs([$tag->id])->andReturn($tag); + + + // call API + $response = $this->get(route('api.v1.tags.show', [$tag->id])); + $response->assertStatus(200); + } + + /** + * Show Tag over API. + * + * @covers \FireflyIII\Api\V1\Controllers\TagController + */ + public function testShowByTag(): void + { + // mock stuff: + $tagRepos = $this->mock(TagRepositoryInterface::class); + $tag = $this->user()->tags()->inRandomOrder()->first(); + // mock calls: + $tagRepos->shouldReceive('setUser')->times(2); + $tagRepos->shouldReceive('findByTag')->once()->withArgs([(string)$tag->tag])->andReturn($tag); + + // call API + $response = $this->get(route('api.v1.tags.show', [$tag->tag])); + $response->assertStatus(200); + } + + /** + * Create Tag over API. + * + * @covers \FireflyIII\Api\V1\Controllers\TagController + * @covers \FireflyIII\Api\V1\Requests\TagRequest + */ + public function testStore(): void + { + $tagRepos = $this->mock(TagRepositoryInterface::class); + $tag = $this->user()->tags()->inRandomOrder()->first(); + $data = ['tag' => 'Some tag' . random_int(1, 10000),]; + + $tagRepos->shouldReceive('setUser')->times(1); + $tagRepos->shouldReceive('store')->times(1)->andReturn($tag); + + // call API + $response = $this->post(route('api.v1.tags.store'), $data); + $response->assertStatus(200); + } + + /** + * Show transactions. + * + * @covers \FireflyIII\Api\V1\Controllers\TagController + */ + public function testTransactions(): void + { + // mock stuff: + $tagRepos = $this->mock(TagRepositoryInterface::class); + $tag = $this->user()->tags()->inRandomOrder()->first(); + $collector = $this->mock(TransactionCollectorInterface::class); + $journalRepos = $this->mock(JournalRepositoryInterface::class); + + $paginator = new LengthAwarePaginator([], 0, 50); + + // mock calls: + $tagRepos->shouldReceive('setUser')->times(2); + $tagRepos->shouldReceive('findByTag')->once()->withArgs([(string)$tag->id])->andReturnNull(); + $tagRepos->shouldReceive('findNull')->once()->withArgs([$tag->id])->andReturn($tag); + + $collector->shouldReceive('setUser')->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->once()->andReturnSelf(); + $collector->shouldReceive('setAllAssetAccounts')->once()->andReturnSelf(); + $collector->shouldReceive('setTag')->once()->andReturnSelf(); + $collector->shouldReceive('removeFilter')->once()->andReturnSelf(); + $collector->shouldReceive('setRange')->once()->andReturnSelf(); + $collector->shouldReceive('setPage')->once()->andReturnSelf(); + $collector->shouldReceive('setTypes')->once()->andReturnSelf(); + $collector->shouldReceive('setLimit')->once()->andReturnSelf(); + $collector->shouldReceive('getPaginatedTransactions')->once()->andReturn($paginator); + + + // call API + $response = $this->get(route('api.v1.tags.transactions', [$tag->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])); + $response->assertStatus(200); + } + + /** + * Update Tag over API. + * + * @covers \FireflyIII\Api\V1\Controllers\TagController + * @covers \FireflyIII\Api\V1\Requests\TagRequest + */ + public function testUpdate(): void + { + $tagRepos = $this->mock(TagRepositoryInterface::class); + $tag = $this->user()->tags()->inRandomOrder()->first(); + $data = ['tag' => 'Some tag' . random_int(1, 10000),]; + + $tagRepos->shouldReceive('setUser')->times(2); + $tagRepos->shouldReceive('update')->times(1)->andReturn($tag); + $tagRepos->shouldReceive('findByTag')->times(1)->andReturnNull(); + $tagRepos->shouldReceive('findNull')->times(1)->andReturn($tag); + + // call API + $response = $this->put(route('api.v1.tags.update', [$tag->id]), $data); + $response->assertStatus(200); + } + +} \ No newline at end of file diff --git a/tests/Api/V1/Controllers/TransactionControllerTest.php b/tests/Api/V1/Controllers/TransactionControllerTest.php index d36f3a637b..d09ff42157 100644 --- a/tests/Api/V1/Controllers/TransactionControllerTest.php +++ b/tests/Api/V1/Controllers/TransactionControllerTest.php @@ -27,13 +27,12 @@ namespace Tests\Api\V1\Controllers; use Exception; use FireflyIII\Events\StoredTransactionJournal; use FireflyIII\Events\UpdatedTransactionJournal; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Helpers\Collector\TransactionCollector; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; -use FireflyIII\Helpers\Filter\NegativeAmountFilter; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; +use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; use Laravel\Passport\Passport; use Log; @@ -54,6 +53,28 @@ class TransactionControllerTest extends TestCase Log::info(sprintf('Now in %s.', \get_class($this))); } + /** + * @covers \FireflyIII\Api\V1\Controllers\TransactionController + */ + public function testAttachments(): void + { + // mock stuff: + $repository = $this->mock(JournalRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + $attachmentRepos = $this->mock(AttachmentRepositoryInterface::class); + // mock calls: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('getAttachmentsByTr')->once()->andReturn(new Collection); + + // get account: + $transaction = $this->user()->transactions()->first(); + + // call API + $response = $this->get(route('api.v1.transactions.attachments', [$transaction->id])); + $response->assertStatus(200); + + } + /** * Destroy journal over API. * @@ -63,6 +84,7 @@ class TransactionControllerTest extends TestCase { // mock stuff: $repository = $this->mock(JournalRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); // mock calls: $repository->shouldReceive('setUser')->once(); @@ -88,6 +110,7 @@ class TransactionControllerTest extends TestCase // mock stuff: $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $account = $this->user()->accounts()->where('account_type_id', 3)->first(); // mock calls: @@ -135,6 +158,7 @@ class TransactionControllerTest extends TestCase // mock stuff: $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $account = $this->user()->accounts()->where('account_type_id', 3)->first(); // mock calls: @@ -181,6 +205,7 @@ class TransactionControllerTest extends TestCase // mock stuff: $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $account = $this->user()->accounts()->where('account_type_id', 3)->first(); // mock calls: @@ -233,6 +258,7 @@ class TransactionControllerTest extends TestCase // mock stuff: $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $account = $this->user()->accounts()->where('account_type_id', 3)->first(); // mock calls: @@ -291,6 +317,7 @@ class TransactionControllerTest extends TestCase // mock stuff: $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $account = $this->user()->accounts()->where('account_type_id', 4)->first(); // mock calls: @@ -339,6 +366,7 @@ class TransactionControllerTest extends TestCase // mock stuff: $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -386,6 +414,7 @@ class TransactionControllerTest extends TestCase // mock stuff: $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -430,6 +459,7 @@ class TransactionControllerTest extends TestCase // mock stuff: $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -468,6 +498,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -518,6 +549,7 @@ class TransactionControllerTest extends TestCase // mock stuff: $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -568,6 +600,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -627,6 +660,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -685,6 +719,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -743,6 +778,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -801,6 +837,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -869,6 +906,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -935,6 +973,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -991,6 +1030,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 4)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -1039,6 +1079,7 @@ class TransactionControllerTest extends TestCase $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -1096,6 +1137,7 @@ class TransactionControllerTest extends TestCase $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -1160,6 +1202,7 @@ class TransactionControllerTest extends TestCase $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); @@ -1214,27 +1257,10 @@ class TransactionControllerTest extends TestCase $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsByType') ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); - - // get some transactions using the collector: - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $repository->shouldReceive('setUser'); - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); @@ -1255,7 +1281,7 @@ class TransactionControllerTest extends TestCase $response = $this->get('/api/v1/transactions'); $response->assertStatus(200); $response->assertJson(['data' => [],]); - $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); + $response->assertJson(['meta' => ['pagination' => ['total' => 0, 'count' => 0, 'per_page' => 50, 'current_page' => 1, 'total_pages' => 1]],]); $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); $response->assertHeader('Content-Type', 'application/vnd.api+json'); } @@ -1272,25 +1298,10 @@ class TransactionControllerTest extends TestCase $accountRepos->shouldReceive('getAccountsByType') ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); - // get some transactions using the collector: - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setLimit(5)->setPage(1); - try { - $paginator = $collector->getPaginatedTransactions(); - } catch (FireflyException $e) { - $this->assertTrue(false, $e->getMessage()); - } - - // mock stuff: + $paginator = new LengthAwarePaginator(new Collection, 0, 50); $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $repository->shouldReceive('setUser'); - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); @@ -1315,11 +1326,11 @@ class TransactionControllerTest extends TestCase ['meta' => ['pagination' => [ - 'total' => true, - 'count' => true, - 'per_page' => 5, + 'total' => 0, + 'count' => 0, + 'per_page' => 50, 'current_page' => 1, - 'total_pages' => true, + 'total_pages' => 1, ], ], ] @@ -1331,56 +1342,58 @@ class TransactionControllerTest extends TestCase } /** - * Show a deposit. + * @covers \FireflyIII\Api\V1\Controllers\TransactionController + */ + public function testPiggyBankEvents(): void + { + // mock stuff: + $repository = $this->mock(JournalRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + + // mock calls: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('getPiggyBankEventsbyTr')->once()->andReturn(new Collection); + + // get account: + $transaction = $this->user()->transactions()->first(); + + // call API + $response = $this->get(route('api.v1.transactions.piggy_bank_events', [$transaction->id])); + $response->assertStatus(200); + + } + + /** + * Show a withdrawal. * * @covers \FireflyIII\Api\V1\Controllers\TransactionController */ - public function testShowDeposit(): void + public function testShowWithdrawal(): void { - $deposit = $this->getRandomDeposit(); - $transaction = $deposit->transactions()->first(); + $withdrawal = $this->getRandomWithdrawal(); $accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsByType') ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); - - // get some transactions using the collector: - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setJournals(new Collection([$deposit])); - $collector->setLimit(5)->setPage(1); - $transactions = $collector->getTransactions(); - - // mock stuff: $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $repository->shouldReceive('setUser'); - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf()->once(); $collector->shouldReceive('withBudgetInformation')->andReturnSelf()->once(); $collector->shouldReceive('setJournals')->andReturnSelf()->once(); - $collector->shouldReceive('addFilter')->withArgs([NegativeAmountFilter::class])->andReturnSelf()->once(); - $collector->shouldReceive('getTransactions')->andReturn($transactions); + $collector->shouldReceive('addFilter')->andReturnSelf()->once(); + $collector->shouldReceive('getTransactions')->andReturn(new Collection); // test API - $response = $this->get('/api/v1/transactions/' . $transaction->id); + $response = $this->get('/api/v1/transactions/' . $withdrawal->id); $response->assertStatus(200); $response->assertJson( [ - 'data' => [[ - 'attributes' => [ - 'description' => $deposit->description, - 'type' => 'Deposit', - ], - ]], + 'data' => [ + ], ] ); @@ -1394,59 +1407,31 @@ class TransactionControllerTest extends TestCase * * @covers \FireflyIII\Api\V1\Controllers\TransactionController */ - public function testShowWithdrawal(): void + public function testShowDeposit(): void { - $journal = $this->getRandomWithdrawal(); - $transaction = $journal->transactions()->first(); - $transaction->description = null; - $transaction->save(); - + $deposit =$this->getRandomDeposit(); $accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsByType') ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); - - // get some transactions using the collector: - $collector = new TransactionCollector; - $collector->setUser($this->user()); - $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); - $collector->setAllAssetAccounts(); - $collector->setJournals(new Collection([$journal])); - $collector->setLimit(5)->setPage(1); - $transactions = $collector->getTransactions(); - - // mock stuff: $repository = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $repository->shouldReceive('setUser'); - $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); - $collector->shouldReceive('setUser')->andReturnSelf(); $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); $collector->shouldReceive('withCategoryInformation')->andReturnSelf()->once(); $collector->shouldReceive('withBudgetInformation')->andReturnSelf()->once(); $collector->shouldReceive('setJournals')->andReturnSelf()->once(); $collector->shouldReceive('addFilter')->andReturnSelf()->once(); - $collector->shouldReceive('getTransactions')->andReturn($transactions); + $collector->shouldReceive('getTransactions')->andReturn(new Collection); // test API - $response = $this->get('/api/v1/transactions/' . $transaction->id); + $response = $this->get('/api/v1/transactions/' . $deposit->id); $response->assertStatus(200); $response->assertJson( [ 'data' => [ - [ - 'attributes' => [ - 'description' => $journal->description, - ], - 'links' => [ - 0 => [], - 'self' => true, - ], - ], ], ] @@ -1469,14 +1454,22 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); + $journalRepos->shouldReceive('setUser')->once(); - $accountRepos->shouldReceive('setUser'); - $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); + $accountRepos->shouldReceive('setUser')->once(); + $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account]))->once(); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1519,14 +1512,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); - $accountRepos->shouldReceive('setUser'); + $accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1568,14 +1568,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1618,14 +1625,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1666,14 +1680,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1714,15 +1735,22 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection); $accountRepos->shouldReceive('findByName')->andReturn($account); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1764,14 +1792,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1812,14 +1847,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1861,14 +1903,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1911,14 +1960,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -1960,14 +2016,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2010,6 +2073,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2021,9 +2085,15 @@ class TransactionControllerTest extends TestCase $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); $data = [ 'description' => 'Some transaction #' . random_int(1, 10000), @@ -2059,14 +2129,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { @@ -2115,14 +2192,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2165,14 +2249,21 @@ class TransactionControllerTest extends TestCase $opposing = $this->user()->accounts()->where('account_type_id', 4)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account]), new Collection([$opposing])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2215,14 +2306,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2264,14 +2362,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account]), new Collection([$opposing])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2313,14 +2418,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account]), new Collection([$opposing])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2362,14 +2474,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2412,14 +2531,21 @@ class TransactionControllerTest extends TestCase $journal = $this->user()->transactionJournals()->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$source]), new Collection([$dest])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2461,14 +2587,21 @@ class TransactionControllerTest extends TestCase $journal = $this->user()->transactionJournals()->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$source]), new Collection([$dest])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2508,14 +2641,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2556,14 +2696,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2618,14 +2765,21 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $journalRepos = $this->mock(JournalRepositoryInterface::class)->makePartial(); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->andReturn(new Collection([$account])); $journalRepos->shouldReceive('store')->andReturn($journal)->once(); - $journalRepos->shouldReceive('getNoteText')->andReturn('Note'); - $journalRepos->shouldReceive('getMetaField')->andReturn(null); - $journalRepos->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); try { $this->expectsEvents(StoredTransactionJournal::class); @@ -2666,6 +2820,7 @@ class TransactionControllerTest extends TestCase $account = $this->user()->accounts()->where('account_type_id', 3)->first(); $repository = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->withArgs([[$account->id]])->andReturn(new Collection([$account])); @@ -2691,9 +2846,15 @@ class TransactionControllerTest extends TestCase $transaction = $deposit->transactions()->first(); $repository->shouldReceive('setUser'); $repository->shouldReceive('update')->andReturn($deposit)->once(); - $repository->shouldReceive('getNoteText')->andReturn('Note'); - $repository->shouldReceive('getMetaField')->andReturn(null); - $repository->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); // call API $response = $this->put('/api/v1/transactions/' . $transaction->id, $data); @@ -2709,10 +2870,11 @@ class TransactionControllerTest extends TestCase */ public function testUpdateBasicWithdrawal(): void { - $account = $this->user()->accounts()->where('account_type_id', 3)->first(); - $repository = $this->mock(JournalRepositoryInterface::class); - + $account = $this->user()->accounts()->where('account_type_id', 3)->first(); + $repository = $this->mock(JournalRepositoryInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsById')->withArgs([[$account->id]])->andReturn(new Collection([$account])); @@ -2738,9 +2900,15 @@ class TransactionControllerTest extends TestCase $transaction = $withdrawal->transactions()->first(); $repository->shouldReceive('setUser'); $repository->shouldReceive('update')->andReturn($withdrawal)->once(); - $repository->shouldReceive('getNoteText')->andReturn('Note'); - $repository->shouldReceive('getMetaField')->andReturn(null); - $repository->shouldReceive('getMetaDateString')->andReturn('2018-01-01'); + + // collector stuff: + $collector->shouldReceive('setUser')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withOpposingAccount')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('setJournals')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('addFilter')->atLeast()->once()->andReturnSelf(); + $collector->shouldReceive('getTransactions')->atLeast()->once()->andReturn(new Collection); // call API $response = $this->put('/api/v1/transactions/' . $transaction->id, $data); diff --git a/tests/Feature/Controllers/Account/ReconcileControllerTest.php b/tests/Feature/Controllers/Account/ReconcileControllerTest.php index 97a6c1814b..4f936b0186 100644 --- a/tests/Feature/Controllers/Account/ReconcileControllerTest.php +++ b/tests/Feature/Controllers/Account/ReconcileControllerTest.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace Tests\Feature\Controllers\Account; +use Carbon\Carbon; +use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Account; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; @@ -61,6 +64,8 @@ class ReconcileControllerTest extends TestCase $userRepos = $this->mock(UserRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); // mock hasRole for user repository: $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true)->atLeast()->once(); @@ -90,6 +95,8 @@ class ReconcileControllerTest extends TestCase { $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journal = $this->user()->transactionJournals()->where('transaction_type_id', '!=', 5)->first(); $this->be($this->user()); @@ -109,6 +116,11 @@ class ReconcileControllerTest extends TestCase $userRepos = $this->mock(UserRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $accountRepos->shouldReceive('getMetaValue') ->withArgs([Mockery::any(), 'currency_id'])->andReturn('1')->atLeast()->once(); @@ -135,6 +147,11 @@ class ReconcileControllerTest extends TestCase $userRepos = $this->mock(UserRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $transaction = Transaction::leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') ->where('accounts.user_id', $this->user()->id)->where('accounts.account_type_id', 6)->first(['account_id']); @@ -153,6 +170,9 @@ class ReconcileControllerTest extends TestCase $userRepos = $this->mock(UserRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + $accountRepos->shouldReceive('getMetaValue') ->withArgs([Mockery::any(), 'currency_id'])->andReturn('1')->atLeast()->once(); @@ -180,6 +200,11 @@ class ReconcileControllerTest extends TestCase $userRepos = $this->mock(UserRepositoryInterface::class); $repository = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $accountRepos->shouldReceive('getMetaValue') ->withArgs([Mockery::any(), 'currency_id'])->andReturn('1')->atLeast()->once(); @@ -206,6 +231,11 @@ class ReconcileControllerTest extends TestCase { $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $account = $this->user()->accounts()->where('account_type_id', '!=', 6)->where('account_type_id', '!=', 3)->first(); $this->be($this->user()); @@ -224,6 +254,8 @@ class ReconcileControllerTest extends TestCase $repository = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $accountRepos->shouldReceive('getMetaValue') ->withArgs([Mockery::any(), 'currency_id'])->andReturn('1')->atLeast()->once(); @@ -256,6 +288,8 @@ class ReconcileControllerTest extends TestCase $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $repository = $this->mock(JournalRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journal = $this->user()->transactionJournals()->where('transaction_type_id', 5)->first(); @@ -280,6 +314,8 @@ class ReconcileControllerTest extends TestCase { $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journal = $this->user()->transactionJournals()->where('transaction_type_id', '!=', 5)->first(); $this->be($this->user()); @@ -299,6 +335,11 @@ class ReconcileControllerTest extends TestCase $repository = $this->mock(AccountRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $journalRepos->shouldReceive('firstNull')->andReturn(new TransactionJournal); $journalRepos->shouldReceive('reconcileById')->andReturn(true); @@ -330,6 +371,8 @@ class ReconcileControllerTest extends TestCase $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos->shouldReceive('firstNull')->andReturn(new TransactionJournal); $journalRepos->shouldReceive('getJournalSourceAccounts')->andReturn(new Collection([new Account])); @@ -355,6 +398,8 @@ class ReconcileControllerTest extends TestCase { $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journal = $this->user()->transactionJournals()->where('transaction_type_id', '!=', 5)->first(); $data = ['amount' => '5',]; @@ -373,6 +418,8 @@ class ReconcileControllerTest extends TestCase { $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); $journal = $this->user()->transactionJournals()->where('transaction_type_id', 5)->first(); $data = ['amount' => '0',]; diff --git a/tests/Feature/Controllers/Account/ShowControllerTest.php b/tests/Feature/Controllers/Account/ShowControllerTest.php index caef8a9ed6..e15c4a6d84 100644 --- a/tests/Feature/Controllers/Account/ShowControllerTest.php +++ b/tests/Feature/Controllers/Account/ShowControllerTest.php @@ -25,6 +25,7 @@ namespace Tests\Feature\Controllers\Account; use Carbon\Carbon; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; @@ -63,6 +64,7 @@ class ShowControllerTest extends TestCase */ public function testShow(string $range): void { + Log::info(sprintf('testShow(%s)', $range)); $date = new Carbon; $this->session(['start' => $date, 'end' => clone $date]); @@ -116,6 +118,7 @@ class ShowControllerTest extends TestCase */ public function testShowAll(string $range): void { + Log::info(sprintf('testShowAll(%s)', $range)); $date = new Carbon; $this->session(['start' => $date, 'end' => clone $date]); @@ -165,10 +168,15 @@ class ShowControllerTest extends TestCase */ public function testShowBrokenBadDates(): void { + Log::info(sprintf('testShowBrokenBadDates(%s)', '')); // mock $journalRepos = $this->mock(JournalRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $accountRepos->shouldReceive('isLiability')->atLeast()->once()->andReturn(false); @@ -187,6 +195,7 @@ class ShowControllerTest extends TestCase */ public function testShowBrokenInitial(): void { + Log::info(sprintf('testShowBrokenInitial(%s)', '')); // mock $journalRepos = $this->mock(JournalRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); @@ -212,12 +221,17 @@ class ShowControllerTest extends TestCase */ public function testShowByDateEmpty(string $range): void { + Log::info(sprintf('testShowByDateEmpty(%s)', $range)); // mock stuff $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); // mock hasRole for user repository: $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true)->atLeast()->once(); @@ -253,6 +267,7 @@ class ShowControllerTest extends TestCase */ public function testShowInitial(): void { + Log::info(sprintf('testShowInitial(%s)', '')); // mock stuff $journalRepos = $this->mock(JournalRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); @@ -276,6 +291,7 @@ class ShowControllerTest extends TestCase */ public function testShowLiability(string $range): void { + Log::info(sprintf('testShowLiability(%s)', $range)); $date = new Carbon; $this->session(['start' => $date, 'end' => clone $date]); $account = $this->user()->accounts()->where('account_type_id', 12)->whereNull('deleted_at')->first(); diff --git a/tests/Feature/Controllers/Budget/AmountControllerTest.php b/tests/Feature/Controllers/Budget/AmountControllerTest.php index 733423d6f9..6d92cf15f1 100644 --- a/tests/Feature/Controllers/Budget/AmountControllerTest.php +++ b/tests/Feature/Controllers/Budget/AmountControllerTest.php @@ -26,6 +26,7 @@ namespace Tests\Feature\Controllers\Budget; use Carbon\Carbon; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; @@ -56,7 +57,7 @@ class AmountControllerTest extends TestCase */ public function testAmount(): void { - Log::debug('Now in testAmount()'); + Log::info('Now in testAmount()'); // mock stuff $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); @@ -79,7 +80,7 @@ class AmountControllerTest extends TestCase */ public function testAmountLargeDiff(): void { - Log::debug('Now in testAmount()'); + Log::info('Now in testAmountLargeDiff()'); // mock stuff $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); @@ -102,7 +103,7 @@ class AmountControllerTest extends TestCase */ public function testAmountOutOfRange(): void { - Log::debug('Now in testAmountOutOfRange()'); + Log::info('Now in testAmountOutOfRange()'); // mock stuff $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); @@ -126,7 +127,7 @@ class AmountControllerTest extends TestCase */ public function testAmountZero(): void { - Log::debug('Now in testAmountZero()'); + Log::info('Now in testAmountZero()'); // mock stuff $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); @@ -147,11 +148,15 @@ class AmountControllerTest extends TestCase */ public function testInfoIncome(): void { - Log::debug('Now in testInfoIncome()'); + Log::info('Now in testInfoIncome()'); // mock stuff $accountRepos = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf()->times(2); $collector->shouldReceive('setRange')->andReturnSelf()->times(2); @@ -187,11 +192,16 @@ class AmountControllerTest extends TestCase */ public function testInfoIncomeExpanded(string $range): void { - Log::debug(sprintf('Now in testInfoIncomeExpanded(%s)', $range)); + Log::info(sprintf('Now in testInfoIncomeExpanded(%s)', $range)); // mock stuff $accountRepos = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $repository->shouldReceive('getAvailableBudget')->andReturn('100.123'); $accountRepos->shouldReceive('setUser'); $accountRepos->shouldReceive('getAccountsByType')->andReturn(new Collection); @@ -223,12 +233,15 @@ class AmountControllerTest extends TestCase */ public function testInfoIncomeInversed(): void { - Log::debug('Now in testInfoIncome()'); + Log::info('Now in testInfoIncomeInversed()'); // mock stuff $accountRepos = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(BudgetRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf()->times(2); $collector->shouldReceive('setRange')->andReturnSelf()->times(2); $collector->shouldReceive('setTypes')->andReturnSelf()->times(2); @@ -260,11 +273,15 @@ class AmountControllerTest extends TestCase */ public function testPostUpdateIncome(): void { - Log::debug('Now in testPostUpdateIncome()'); + Log::info('Now in testPostUpdateIncome()'); // mock stuff $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + //$fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + //$fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $journalRepos->shouldReceive('firstNull')->once()->andReturn(new TransactionJournal); $repository->shouldReceive('setAvailableBudget'); $repository->shouldReceive('cleanupBudgets'); @@ -281,7 +298,7 @@ class AmountControllerTest extends TestCase */ public function testUpdateIncome(): void { - Log::debug('Now in testUpdateIncome()'); + Log::info('Now in testUpdateIncome()'); // must be in list $this->be($this->user()); @@ -289,6 +306,10 @@ class AmountControllerTest extends TestCase $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $journalRepos->shouldReceive('firstNull')->once()->andReturn(new TransactionJournal); $repository->shouldReceive('getAvailableBudget')->andReturn('1'); $repository->shouldReceive('cleanupBudgets'); diff --git a/tests/Feature/Controllers/Budget/IndexControllerTest.php b/tests/Feature/Controllers/Budget/IndexControllerTest.php index 8c7fc6db9f..24396a67d0 100644 --- a/tests/Feature/Controllers/Budget/IndexControllerTest.php +++ b/tests/Feature/Controllers/Budget/IndexControllerTest.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace Tests\Feature\Controllers\Budget; use Carbon\Carbon; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\TransactionJournal; @@ -61,7 +62,7 @@ class IndexControllerTest extends TestCase { - Log::debug(sprintf('Now in testIndex(%s)', $range)); + Log::info(sprintf('Now in testIndex(%s)', $range)); // mock stuff $budget = factory(Budget::class)->make(); $budgetLimit = factory(BudgetLimit::class)->make(); @@ -110,7 +111,7 @@ class IndexControllerTest extends TestCase */ public function testIndexOutOfRange(string $range): void { - Log::debug(sprintf('Now in testIndexOutOfRange(%s)', $range)); + Log::info(sprintf('Now in testIndexOutOfRange(%s)', $range)); // mock stuff $budget = factory(Budget::class)->make(); $budgetLimit = factory(BudgetLimit::class)->make(); @@ -130,6 +131,10 @@ class IndexControllerTest extends TestCase $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true)->atLeast()->once(); $journalRepos->shouldReceive('firstNull')->once()->andReturn(new TransactionJournal); @@ -161,7 +166,7 @@ class IndexControllerTest extends TestCase */ public function testIndexWithDate(string $range): void { - Log::debug(sprintf('Now in testIndexWithDate(%s)', $range)); + Log::info(sprintf('Now in testIndexWithDate(%s)', $range)); // mock stuff $budget = factory(Budget::class)->make(); $budgetLimit = factory(BudgetLimit::class)->make(); @@ -181,6 +186,10 @@ class IndexControllerTest extends TestCase $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true)->atLeast()->once(); $journalRepos->shouldReceive('firstNull')->once()->andReturn(new TransactionJournal); @@ -210,7 +219,7 @@ class IndexControllerTest extends TestCase */ public function testIndexWithInvalidDate(string $range): void { - Log::debug(sprintf('Now in testIndexWithInvalidDate(%s)', $range)); + Log::info(sprintf('Now in testIndexWithInvalidDate(%s)', $range)); // mock stuff $budget = factory(Budget::class)->make(); $budgetLimit = factory(BudgetLimit::class)->make(); @@ -230,6 +239,10 @@ class IndexControllerTest extends TestCase $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $journalRepos->shouldReceive('firstNull')->once()->andReturn(new TransactionJournal); $accountRepos->shouldReceive('getAccountsByType')->andReturn(new Collection); diff --git a/tests/Feature/Controllers/Budget/ShowControllerTest.php b/tests/Feature/Controllers/Budget/ShowControllerTest.php index c02c2154b4..80bbd008b3 100644 --- a/tests/Feature/Controllers/Budget/ShowControllerTest.php +++ b/tests/Feature/Controllers/Budget/ShowControllerTest.php @@ -25,6 +25,7 @@ namespace Tests\Feature\Controllers\Budget; use Carbon\Carbon; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; @@ -62,7 +63,7 @@ class ShowControllerTest extends TestCase */ public function testNoBudget(string $range): void { - Log::debug(sprintf('Now in testNoBudget(%s)', $range)); + Log::info(sprintf('Now in testNoBudget(%s)', $range)); // mock stuff $repository = $this->mock(BudgetRepositoryInterface::class); @@ -101,7 +102,7 @@ class ShowControllerTest extends TestCase */ public function testNoBudgetAll(string $range): void { - Log::debug(sprintf('Now in testNoBudgetAll(%s)', $range)); + Log::info(sprintf('Now in testNoBudgetAll(%s)', $range)); // mock stuff $repository = $this->mock(BudgetRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); @@ -140,12 +141,16 @@ class ShowControllerTest extends TestCase */ public function testNoBudgetDate(string $range): void { - Log::debug(sprintf('Now in testNoBudgetDate(%s)', $range)); + Log::info(sprintf('Now in testNoBudgetDate(%s)', $range)); // mock stuff $repository = $this->mock(BudgetRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true)->atLeast()->once(); $journalRepos->shouldReceive('firstNull')->andReturn(null); @@ -180,7 +185,7 @@ class ShowControllerTest extends TestCase */ public function testShow(string $range): void { - Log::debug(sprintf('Now in testShow(%s)', $range)); + Log::info(sprintf('Now in testShow(%s)', $range)); // mock stuff $budgetLimit = factory(BudgetLimit::class)->make(); @@ -226,7 +231,7 @@ class ShowControllerTest extends TestCase */ public function testShowByBadBudgetLimit(): void { - Log::debug('Now in testShowByBadBudgetLimit()'); + Log::info('Now in testShowByBadBudgetLimit()'); // mock stuff $repository = $this->mock(BudgetRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); @@ -247,7 +252,7 @@ class ShowControllerTest extends TestCase */ public function testShowByBudgetLimit(string $range): void { - Log::debug(sprintf('Now in testShowByBudgetLimit(%s)', $range)); + Log::info(sprintf('Now in testShowByBudgetLimit(%s)', $range)); // mock stuff $journalRepos = $this->mock(JournalRepositoryInterface::class); $accountRepository = $this->mock(AccountRepositoryInterface::class); diff --git a/tests/Feature/Controllers/Category/NoCategoryControllerTest.php b/tests/Feature/Controllers/Category/NoCategoryControllerTest.php index d50c01eea5..5d27766853 100644 --- a/tests/Feature/Controllers/Category/NoCategoryControllerTest.php +++ b/tests/Feature/Controllers/Category/NoCategoryControllerTest.php @@ -27,6 +27,7 @@ namespace Tests\Feature\Controllers\Category; use Carbon\Carbon; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Filter\InternalTransferFilter; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; @@ -63,6 +64,7 @@ class NoCategoryControllerTest extends TestCase */ public function testNoCategory(string $range): void { + Log::info('Test noCategory()'); // mock stuff $collector = $this->mock(TransactionCollectorInterface::class); $categoryRepos = $this->mock(CategoryRepositoryInterface::class); @@ -105,13 +107,15 @@ class NoCategoryControllerTest extends TestCase */ public function testNoCategoryAll(string $range): void { - Log::debug('Test nocategoryAll()'); + Log::info('Test nocategoryAll()'); // mock stuff $collector = $this->mock(TransactionCollectorInterface::class); $categoryRepos = $this->mock(CategoryRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $journalRepos->shouldReceive('firstNull')->twice()->andReturn(TransactionJournal::first()); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true)->atLeast()->once(); @@ -143,13 +147,17 @@ class NoCategoryControllerTest extends TestCase */ public function testNoCategoryDate(string $range): void { - Log::debug('Test nocategorydate()'); + Log::info('Test nocategorydate()'); // mock stuff $collector = $this->mock(TransactionCollectorInterface::class); $categoryRepos = $this->mock(CategoryRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $journalRepos->shouldReceive('firstNull')->twice()->andReturn(TransactionJournal::first()); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true)->atLeast()->once(); diff --git a/tests/Feature/Controllers/Category/ShowControllerTest.php b/tests/Feature/Controllers/Category/ShowControllerTest.php index 10f28f2c7d..85c0a0a3d0 100644 --- a/tests/Feature/Controllers/Category/ShowControllerTest.php +++ b/tests/Feature/Controllers/Category/ShowControllerTest.php @@ -27,6 +27,7 @@ namespace Tests\Feature\Controllers\Category; use Carbon\Carbon; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Filter\InternalTransferFilter; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; @@ -64,7 +65,7 @@ class ShowControllerTest extends TestCase */ public function testShow(string $range): void { - Log::debug(sprintf('Test show(%s)', $range)); + Log::info(sprintf('Test show(%s)', $range)); $transaction = factory(Transaction::class)->make(); $categoryRepos = $this->mock(CategoryRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); @@ -119,7 +120,7 @@ class ShowControllerTest extends TestCase */ public function testShowAll(string $range): void { - Log::debug(sprintf('Test showAll(%s)', $range)); + Log::info(sprintf('Test showAll(%s)', $range)); // mock stuff $transaction = factory(Transaction::class)->make(); $journalRepos = $this->mock(JournalRepositoryInterface::class); @@ -127,6 +128,7 @@ class ShowControllerTest extends TestCase $collector = $this->mock(TransactionCollectorInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true); @@ -160,7 +162,7 @@ class ShowControllerTest extends TestCase */ public function testShowByDate(string $range): void { - Log::debug(sprintf('Test testShowByDate(%s)', $range)); + Log::info(sprintf('Test testShowByDate(%s)', $range)); // mock stuff $transaction = factory(Transaction::class)->make(); $repository = $this->mock(CategoryRepositoryInterface::class); @@ -168,6 +170,10 @@ class ShowControllerTest extends TestCase $collector = $this->mock(TransactionCollectorInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true); @@ -219,6 +225,7 @@ class ShowControllerTest extends TestCase $journalRepos = $this->mock(JournalRepositoryInterface::class); $repository = $this->mock(CategoryRepositoryInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true); diff --git a/tests/Feature/Controllers/Chart/AccountControllerTest.php b/tests/Feature/Controllers/Chart/AccountControllerTest.php index 32bc967afb..9faa929729 100644 --- a/tests/Feature/Controllers/Chart/AccountControllerTest.php +++ b/tests/Feature/Controllers/Chart/AccountControllerTest.php @@ -25,6 +25,7 @@ namespace Tests\Feature\Controllers\Chart; use Carbon\Carbon; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\Category; @@ -110,7 +111,10 @@ class AccountControllerTest extends TestCase $budgetRepos = $this->mock(BudgetRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $transaction = factory(Transaction::class)->make(); $collector->shouldReceive('setAccounts')->andReturnSelf(); @@ -135,12 +139,12 @@ class AccountControllerTest extends TestCase */ public function testExpenseBudgetAll(string $range): void { - $generator = $this->mock(GeneratorInterface::class); - $collector = $this->mock(TransactionCollectorInterface::class); - $budgetRepos = $this->mock(BudgetRepositoryInterface::class); - $accountRepos = $this->mock(AccountRepositoryInterface::class); + $generator = $this->mock(GeneratorInterface::class); + $collector = $this->mock(TransactionCollectorInterface::class); + $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - $transaction = factory(Transaction::class)->make(); + $transaction = factory(Transaction::class)->make(); $collector->shouldReceive('setAccounts')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf(); @@ -172,7 +176,10 @@ class AccountControllerTest extends TestCase $categoryRepos = $this->mock(CategoryRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $collector->shouldReceive('setAccounts')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf(); @@ -231,7 +238,7 @@ class AccountControllerTest extends TestCase $generator = $this->mock(GeneratorInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); // change the preference: Preferences::setForUser($this->user(), 'frontPageAccounts', []); @@ -262,7 +269,10 @@ class AccountControllerTest extends TestCase $categoryRepos = $this->mock(CategoryRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $collector->shouldReceive('setAccounts')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf(); @@ -317,10 +327,13 @@ class AccountControllerTest extends TestCase */ public function testPeriod(string $range): void { - $generator = $this->mock(GeneratorInterface::class); - $accountRepos = $this->mock(AccountRepositoryInterface::class); + $generator = $this->mock(GeneratorInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $accountRepos->shouldReceive('oldestJournalDate')->andReturn(new Carbon); Steam::shouldReceive('balanceInRange')->andReturn(['2012-01-01' => '0']); $generator->shouldReceive('singleSet')->andReturn([]); @@ -339,9 +352,12 @@ class AccountControllerTest extends TestCase $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - $generator = $this->mock(GeneratorInterface::class); - - $accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(),'currency_id'])->andReturn('1')->atLeast()->once(); + $generator = $this->mock(GeneratorInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1')->atLeast()->once(); $currencyRepos->shouldReceive('findNull')->andReturn(TransactionCurrency::find(1), null); @@ -364,7 +380,7 @@ class AccountControllerTest extends TestCase $generator = $this->mock(GeneratorInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); // grab two expense accounts from the current user. $accounts = $this->user()->accounts()->where('account_type_id', 5)->take(2)->get(); diff --git a/tests/Feature/Controllers/Chart/BudgetControllerTest.php b/tests/Feature/Controllers/Chart/BudgetControllerTest.php index 3511143252..3eeed8463e 100644 --- a/tests/Feature/Controllers/Chart/BudgetControllerTest.php +++ b/tests/Feature/Controllers/Chart/BudgetControllerTest.php @@ -25,6 +25,7 @@ namespace Tests\Feature\Controllers\Chart; use Carbon\Carbon; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Account; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; @@ -312,6 +313,10 @@ class BudgetControllerTest extends TestCase $budget = factory(Budget::class)->make(); $budgetLimit = factory(BudgetLimit::class)->make(); $budgetLimit->budget_id = $budget->id; + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $repository->shouldReceive('getBudgetPeriodReport')->andReturn([])->once(); $repository->shouldReceive('getBudgetLimits')->andReturn(new Collection([$budgetLimit])); @@ -327,8 +332,12 @@ class BudgetControllerTest extends TestCase */ public function testPeriodNoBudget(): void { - $repository = $this->mock(BudgetRepositoryInterface::class); - $generator = $this->mock(GeneratorInterface::class); + $repository = $this->mock(BudgetRepositoryInterface::class); + $generator = $this->mock(GeneratorInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $repository->shouldReceive('getNoBudgetPeriodReport')->andReturn([])->once(); $generator->shouldReceive('singleSet')->once()->andReturn([]); diff --git a/tests/Feature/Controllers/Chart/BudgetReportControllerTest.php b/tests/Feature/Controllers/Chart/BudgetReportControllerTest.php index 450f2fa661..489fd048ee 100644 --- a/tests/Feature/Controllers/Chart/BudgetReportControllerTest.php +++ b/tests/Feature/Controllers/Chart/BudgetReportControllerTest.php @@ -29,6 +29,7 @@ use FireflyIII\Helpers\Collector\TransactionCollectorInterface; use FireflyIII\Helpers\Filter\OpposingAccountFilter; use FireflyIII\Helpers\Filter\PositiveAmountFilter; use FireflyIII\Helpers\Filter\TransferFilter; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; @@ -59,7 +60,10 @@ class BudgetReportControllerTest extends TestCase $budgetRepos = $this->mock(BudgetRepositoryInterface::class); $generator = $this->mock(GeneratorInterface::class); $pieChart = $this->mock(MetaPieChartInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setBudgets')->once()->andReturnSelf(); @@ -82,6 +86,10 @@ class BudgetReportControllerTest extends TestCase $budgetRepos = $this->mock(BudgetRepositoryInterface::class); $generator = $this->mock(GeneratorInterface::class); $pieChart = $this->mock(MetaPieChartInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setBudgets')->once()->andReturnSelf(); @@ -104,6 +112,10 @@ class BudgetReportControllerTest extends TestCase $generator = $this->mock(GeneratorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $one = factory(BudgetLimit::class)->make(); $one->budget_id = 1; diff --git a/tests/Feature/Controllers/Chart/CategoryControllerTest.php b/tests/Feature/Controllers/Chart/CategoryControllerTest.php index 339ebeea69..974c1131de 100644 --- a/tests/Feature/Controllers/Chart/CategoryControllerTest.php +++ b/tests/Feature/Controllers/Chart/CategoryControllerTest.php @@ -24,6 +24,7 @@ namespace Tests\Feature\Controllers\Chart; use Carbon\Carbon; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\TransactionCurrency; @@ -63,6 +64,7 @@ class CategoryControllerTest extends TestCase $firstUse = new Carbon; $firstUse->subDays(3); + $repository->shouldReceive('spentInPeriod')->andReturn('0'); $repository->shouldReceive('earnedInPeriod')->andReturn('0'); $repository->shouldReceive('firstUseDate')->andReturn($firstUse)->once(); @@ -87,7 +89,6 @@ class CategoryControllerTest extends TestCase $accountRepos = $this->mock(AccountRepositoryInterface::class); $generator = $this->mock(GeneratorInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - // spent per currency data: $spentData = [ 1 => '-123.45', @@ -133,7 +134,10 @@ class CategoryControllerTest extends TestCase { $repository = $this->mock(CategoryRepositoryInterface::class); $generator = $this->mock(GeneratorInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $repository->shouldReceive('periodExpenses')->andReturn([])->once(); $repository->shouldReceive('periodIncome')->andReturn([])->once(); $generator->shouldReceive('multiSet')->andReturn([])->once(); @@ -150,7 +154,10 @@ class CategoryControllerTest extends TestCase { $repository = $this->mock(CategoryRepositoryInterface::class); $generator = $this->mock(GeneratorInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $repository->shouldReceive('periodExpensesNoCategory')->andReturn([])->once(); $repository->shouldReceive('periodIncomeNoCategory')->andReturn([])->once(); $generator->shouldReceive('multiSet')->andReturn([])->once(); @@ -172,6 +179,10 @@ class CategoryControllerTest extends TestCase $accountRepos = $this->mock(AccountRepositoryInterface::class); $generator = $this->mock(GeneratorInterface::class); $account = factory(Account::class)->make(); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $accountRepos->shouldReceive('getAccountsByType')->andReturn(new Collection([$account])); $repository->shouldReceive('spentInPeriod')->andReturn('0'); diff --git a/tests/Feature/Controllers/Chart/CategoryReportControllerTest.php b/tests/Feature/Controllers/Chart/CategoryReportControllerTest.php index 5f69146375..32653bb7c9 100644 --- a/tests/Feature/Controllers/Chart/CategoryReportControllerTest.php +++ b/tests/Feature/Controllers/Chart/CategoryReportControllerTest.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace Tests\Feature\Controllers\Chart; +use Carbon\Carbon; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Helpers\Chart\MetaPieChartInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; @@ -29,6 +30,7 @@ use FireflyIII\Helpers\Filter\NegativeAmountFilter; use FireflyIII\Helpers\Filter\OpposingAccountFilter; use FireflyIII\Helpers\Filter\PositiveAmountFilter; use FireflyIII\Helpers\Filter\TransferFilter; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; use Log; @@ -53,9 +55,12 @@ class CategoryReportControllerTest extends TestCase */ public function testAccountExpense(): void { - $generator = $this->mock(GeneratorInterface::class); - $pieChart = $this->mock(MetaPieChartInterface::class); - + $generator = $this->mock(GeneratorInterface::class); + $pieChart = $this->mock(MetaPieChartInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setCategories')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); @@ -74,9 +79,12 @@ class CategoryReportControllerTest extends TestCase */ public function testAccountIncome(): void { - $generator = $this->mock(GeneratorInterface::class); - $pieChart = $this->mock(MetaPieChartInterface::class); - + $generator = $this->mock(GeneratorInterface::class); + $pieChart = $this->mock(MetaPieChartInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setCategories')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); @@ -95,9 +103,12 @@ class CategoryReportControllerTest extends TestCase */ public function testCategoryExpense(): void { - $generator = $this->mock(GeneratorInterface::class); - $pieChart = $this->mock(MetaPieChartInterface::class); - + $generator = $this->mock(GeneratorInterface::class); + $pieChart = $this->mock(MetaPieChartInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setCategories')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); @@ -116,9 +127,12 @@ class CategoryReportControllerTest extends TestCase */ public function testCategoryIncome(): void { - $generator = $this->mock(GeneratorInterface::class); - $pieChart = $this->mock(MetaPieChartInterface::class); - + $generator = $this->mock(GeneratorInterface::class); + $pieChart = $this->mock(MetaPieChartInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setCategories')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); @@ -140,7 +154,10 @@ class CategoryReportControllerTest extends TestCase $generator = $this->mock(GeneratorInterface::class); $collector = $this->mock(TransactionCollectorInterface::class); $transactions = factory(Transaction::class, 10)->make(); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $collector->shouldReceive('setAccounts')->andReturnSelf(); $collector->shouldReceive('setRange')->andReturnSelf(); $collector->shouldReceive('setTypes')->withArgs([[TransactionType::WITHDRAWAL, TransactionType::TRANSFER]])->andReturnSelf(); diff --git a/tests/Feature/Controllers/Chart/ExpenseReportControllerTest.php b/tests/Feature/Controllers/Chart/ExpenseReportControllerTest.php index dd7506f4c8..aa55116003 100644 --- a/tests/Feature/Controllers/Chart/ExpenseReportControllerTest.php +++ b/tests/Feature/Controllers/Chart/ExpenseReportControllerTest.php @@ -22,8 +22,10 @@ declare(strict_types=1); namespace Tests\Feature\Controllers\Chart; +use Carbon\Carbon; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; @@ -57,6 +59,11 @@ class ExpenseReportControllerTest extends TestCase $accountRepository = $this->mock(AccountRepositoryInterface::class); $accountRepository->shouldReceive('findByName')->once()->andReturn($expense); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $set = new Collection; $transaction = new Transaction(); $transaction->opposing_account_name = 'Somebody'; diff --git a/tests/Feature/Controllers/Chart/ReportControllerTest.php b/tests/Feature/Controllers/Chart/ReportControllerTest.php index a43e63b8dc..28373e45fe 100644 --- a/tests/Feature/Controllers/Chart/ReportControllerTest.php +++ b/tests/Feature/Controllers/Chart/ReportControllerTest.php @@ -22,7 +22,10 @@ declare(strict_types=1); namespace Tests\Feature\Controllers\Chart; +use Carbon\Carbon; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; +use FireflyIII\Helpers\FiscalHelperInterface; +use FireflyIII\Helpers\Report\NetWorthInterface; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountTaskerInterface; @@ -51,12 +54,26 @@ class ReportControllerTest extends TestCase */ public function testNetWorth(): void { - $generator = $this->mock(GeneratorInterface::class); - $accountRepos = $this->mock(AccountRepositoryInterface::class); + $generator = $this->mock(GeneratorInterface::class); + $accountRepos = $this->mock(AccountRepositoryInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $netWorth = $this->mock(NetWorthInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + //$currencyRepos->shouldReceive('setUser'); + //$currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::find(1))->atLeast()->once(); - $currencyRepos->shouldReceive('setUser'); - $currencyRepos->shouldReceive('findNull')->withArgs([1])->andReturn(TransactionCurrency::find(1))->atLeast()->once(); + $netWorth->shouldReceive('getNetWorthByCurrency')->andReturn( + [ + [ + 'currency' => TransactionCurrency::first(), + 'balance' => '123', + ], + ] + ); + $netWorth->shouldReceive('setUser')->atLeast()->once(); // mock calls: $accountRepos->shouldReceive('setUser'); @@ -82,12 +99,15 @@ class ReportControllerTest extends TestCase */ public function testOperations(): void { - $generator = $this->mock(GeneratorInterface::class); - $tasker = $this->mock(AccountTaskerInterface::class); + $generator = $this->mock(GeneratorInterface::class); + $tasker = $this->mock(AccountTaskerInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - - $income = [1 => ['sum' => '100']]; - $expense = [2 => ['sum' => '-100']]; + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $income = [1 => ['sum' => '100']]; + $expense = [2 => ['sum' => '-100']]; $tasker->shouldReceive('getIncomeReport')->once()->andReturn($income); $tasker->shouldReceive('getExpenseReport')->once()->andReturn($expense); $generator->shouldReceive('multiSet')->andReturn([]); @@ -102,10 +122,13 @@ class ReportControllerTest extends TestCase */ public function testSum(): void { - $generator = $this->mock(GeneratorInterface::class); - $tasker = $this->mock(AccountTaskerInterface::class); + $generator = $this->mock(GeneratorInterface::class); + $tasker = $this->mock(AccountTaskerInterface::class); $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); - + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); $income = []; $expense = []; diff --git a/tests/Feature/Controllers/Chart/TagReportControllerTest.php b/tests/Feature/Controllers/Chart/TagReportControllerTest.php index 4ec22382b1..9bb473a5f5 100644 --- a/tests/Feature/Controllers/Chart/TagReportControllerTest.php +++ b/tests/Feature/Controllers/Chart/TagReportControllerTest.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace Tests\Feature\Controllers\Chart; +use Carbon\Carbon; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Helpers\Chart\MetaPieChartInterface; use FireflyIII\Helpers\Collector\TransactionCollectorInterface; @@ -29,6 +30,7 @@ use FireflyIII\Helpers\Filter\NegativeAmountFilter; use FireflyIII\Helpers\Filter\OpposingAccountFilter; use FireflyIII\Helpers\Filter\PositiveAmountFilter; use FireflyIII\Helpers\Filter\TransferFilter; +use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Models\Tag; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; @@ -65,6 +67,11 @@ class TagReportControllerTest extends TestCase $tagRepos->shouldReceive('setUser'); $tagRepos->shouldReceive('get')->andReturn(new Collection([$tag])); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setTags')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); @@ -93,6 +100,11 @@ class TagReportControllerTest extends TestCase $tagRepos->shouldReceive('setUser'); $tagRepos->shouldReceive('get')->andReturn(new Collection([$tag])); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setTags')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); @@ -120,6 +132,11 @@ class TagReportControllerTest extends TestCase $tagRepos->shouldReceive('setUser'); $tagRepos->shouldReceive('get')->andReturn(new Collection([$tag])); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setTags')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); @@ -146,6 +163,11 @@ class TagReportControllerTest extends TestCase $tagRepos->shouldReceive('setUser'); $tagRepos->shouldReceive('get')->andReturn(new Collection([$tag])); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setTags')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); @@ -172,6 +194,11 @@ class TagReportControllerTest extends TestCase $tagRepos->shouldReceive('setUser'); $tagRepos->shouldReceive('get')->andReturn(new Collection([$tag])); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $set = new Collection; for ($i = 0; $i < 10; ++$i) { $transaction = factory(Transaction::class)->make(); @@ -211,6 +238,11 @@ class TagReportControllerTest extends TestCase $tagRepos->shouldReceive('setUser'); $tagRepos->shouldReceive('get')->andReturn(new Collection([$tag])); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setTags')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); @@ -237,6 +269,11 @@ class TagReportControllerTest extends TestCase $tagRepos->shouldReceive('setUser'); $tagRepos->shouldReceive('get')->andReturn(new Collection([$tag])); + $fiscalHelper = $this->mock(FiscalHelperInterface::class); + $date = new Carbon; + $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date); + $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date); + $pieChart->shouldReceive('setAccounts')->once()->andReturnSelf(); $pieChart->shouldReceive('setTags')->once()->andReturnSelf(); $pieChart->shouldReceive('setStart')->once()->andReturnSelf(); diff --git a/tests/Feature/Controllers/CurrencyControllerTest.php b/tests/Feature/Controllers/CurrencyControllerTest.php index 2ba172657e..d0981a7733 100644 --- a/tests/Feature/Controllers/CurrencyControllerTest.php +++ b/tests/Feature/Controllers/CurrencyControllerTest.php @@ -193,6 +193,87 @@ class CurrencyControllerTest extends TestCase $response->assertSessionHas('success'); } + /** + * @covers \FireflyIII\Http\Controllers\CurrencyController + */ + public function testDisable(): void + { + $repository = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); + $currency = TransactionCurrency::first(); + + $userRepos->shouldReceive('hasRole')->atLeast()->once()->andReturn(true); + $repository->shouldReceive('currencyInuse')->atLeast()->once()->andReturn(false); + $repository->shouldReceive('disable')->atLeast()->once()->andReturn(false); + $repository->shouldReceive('get')->atLeast()->once()->andReturn(new Collection([$currency])); + + $this->be($this->user()); + $response = $this->get(route('currencies.disable', [$currency->id])); + $response->assertStatus(302); + } + + /** + * @covers \FireflyIII\Http\Controllers\CurrencyController + */ + public function testDisableInUse(): void + { + $repository = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); + $currency = TransactionCurrency::first(); + + $userRepos->shouldReceive('hasRole')->atLeast()->once()->andReturn(true); + $repository->shouldReceive('currencyInuse')->atLeast()->once()->andReturn(true); + $repository->shouldNotReceive('disable'); + + $this->be($this->user()); + $response = $this->get(route('currencies.disable', [$currency->id])); + $response->assertStatus(302); + } + + /** + * @covers \FireflyIII\Http\Controllers\CurrencyController + */ + public function testDisableNothingLeft(): void + { + $repository = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); + $currency = TransactionCurrency::first(); + + $userRepos->shouldReceive('hasRole')->atLeast()->once()->andReturn(true); + $repository->shouldReceive('currencyInuse')->atLeast()->once()->andReturn(false); + $repository->shouldReceive('disable')->atLeast()->once()->andReturn(false); + $repository->shouldReceive('get')->atLeast()->once()->andReturn(new Collection); + $repository->shouldReceive('getAll')->atLeast()->once()->andReturn(new Collection); + + $this->be($this->user()); + $response = $this->get(route('currencies.disable', [$currency->id])); + $response->assertStatus(500); + $response->assertSee('No currencies found.'); + } + + + + /** + * @covers \FireflyIII\Http\Controllers\CurrencyController + */ + public function testDisableEnableFirst(): void + { + $repository = $this->mock(CurrencyRepositoryInterface::class); + $userRepos = $this->mock(UserRepositoryInterface::class); + $currency = TransactionCurrency::first(); + + $userRepos->shouldReceive('hasRole')->atLeast()->once()->andReturn(true); + $repository->shouldReceive('currencyInuse')->atLeast()->once()->andReturn(false); + $repository->shouldReceive('disable')->atLeast()->once()->andReturn(false); + $repository->shouldReceive('get')->atLeast()->once()->andReturn(new Collection); + $repository->shouldReceive('getAll')->atLeast()->once()->andReturn(new Collection([$currency])); + $repository->shouldReceive('enable')->atLeast()->once()->andReturn(true); + + $this->be($this->user()); + $response = $this->get(route('currencies.disable', [$currency->id])); + $response->assertStatus(302); + } + /** * @covers \FireflyIII\Http\Controllers\CurrencyController */ @@ -213,6 +294,22 @@ class CurrencyControllerTest extends TestCase $response->assertSee('