mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
Improve test coverage.
This commit is contained in:
parent
5313652d7a
commit
159fffef2e
@ -134,6 +134,8 @@ class AccountController extends Controller
|
|||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List all of them.
|
* List all of them.
|
||||||
*
|
*
|
||||||
|
@ -244,13 +244,10 @@ class BudgetController extends Controller
|
|||||||
$collector->setAllAssetAccounts();
|
$collector->setAllAssetAccounts();
|
||||||
$collector->setBudget($budget);
|
$collector->setBudget($budget);
|
||||||
|
|
||||||
if (\in_array(TransactionType::TRANSFER, $types, true)) {
|
|
||||||
$collector->removeFilter(InternalTransferFilter::class);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
|
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
|
||||||
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
|
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$collector->setLimit($pageSize)->setPage($this->parameters->get('page'));
|
$collector->setLimit($pageSize)->setPage($this->parameters->get('page'));
|
||||||
$collector->setTypes($types);
|
$collector->setTypes($types);
|
||||||
$paginator = $collector->getPaginatedTransactions();
|
$paginator = $collector->getPaginatedTransactions();
|
||||||
|
@ -198,11 +198,6 @@ class BudgetLimitController extends Controller
|
|||||||
$collector->setAllAssetAccounts();
|
$collector->setAllAssetAccounts();
|
||||||
$collector->setBudget($budgetLimit->budget);
|
$collector->setBudget($budgetLimit->budget);
|
||||||
$collector->setRange($budgetLimit->start_date, $budgetLimit->end_date);
|
$collector->setRange($budgetLimit->start_date, $budgetLimit->end_date);
|
||||||
|
|
||||||
if (\in_array(TransactionType::TRANSFER, $types, true)) {
|
|
||||||
$collector->removeFilter(InternalTransferFilter::class);
|
|
||||||
}
|
|
||||||
|
|
||||||
$collector->setLimit($pageSize)->setPage($this->parameters->get('page'));
|
$collector->setLimit($pageSize)->setPage($this->parameters->get('page'));
|
||||||
$collector->setTypes($types);
|
$collector->setTypes($types);
|
||||||
$paginator = $collector->getPaginatedTransactions();
|
$paginator = $collector->getPaginatedTransactions();
|
||||||
|
@ -42,7 +42,6 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
|||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
|
||||||
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
||||||
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
@ -153,54 +152,6 @@ class CurrencyController extends Controller
|
|||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Show all transactions.
|
|
||||||
*
|
|
||||||
* @param Request $request
|
|
||||||
*
|
|
||||||
* @param TransactionCurrency $currency
|
|
||||||
*
|
|
||||||
* @return JsonResponse
|
|
||||||
*/
|
|
||||||
public function transactions(Request $request, TransactionCurrency $currency): JsonResponse
|
|
||||||
{
|
|
||||||
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
|
|
||||||
$type = $request->get('type') ?? 'default';
|
|
||||||
$this->parameters->set('type', $type);
|
|
||||||
|
|
||||||
$types = $this->mapTransactionTypes($this->parameters->get('type'));
|
|
||||||
$manager = new Manager();
|
|
||||||
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
|
||||||
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
|
||||||
|
|
||||||
/** @var User $admin */
|
|
||||||
$admin = auth()->user();
|
|
||||||
/** @var TransactionCollectorInterface $collector */
|
|
||||||
$collector = app(TransactionCollectorInterface::class);
|
|
||||||
$collector->setUser($admin);
|
|
||||||
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
|
|
||||||
$collector->setAllAssetAccounts();
|
|
||||||
$collector->setCurrency($currency);
|
|
||||||
|
|
||||||
if (\in_array(TransactionType::TRANSFER, $types, true)) {
|
|
||||||
$collector->removeFilter(InternalTransferFilter::class);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
|
|
||||||
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
|
|
||||||
}
|
|
||||||
$collector->setLimit($pageSize)->setPage($this->parameters->get('page'));
|
|
||||||
$collector->setTypes($types);
|
|
||||||
$paginator = $collector->getPaginatedTransactions();
|
|
||||||
$paginator->setPath(route('api.v1.currencies.transactions', [$currency->code]) . $this->buildParams());
|
|
||||||
$transactions = $paginator->getCollection();
|
|
||||||
|
|
||||||
$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');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display a listing of the resource.
|
* Display a listing of the resource.
|
||||||
*
|
*
|
||||||
@ -212,6 +163,9 @@ class CurrencyController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function availableBudgets(Request $request, TransactionCurrency $currency): JsonResponse
|
public function availableBudgets(Request $request, TransactionCurrency $currency): JsonResponse
|
||||||
{
|
{
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
|
||||||
// create some objects:
|
// create some objects:
|
||||||
$manager = new Manager;
|
$manager = new Manager;
|
||||||
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
@ -222,6 +176,7 @@ class CurrencyController extends Controller
|
|||||||
// get list of available budgets. Count it and split it.
|
// get list of available budgets. Count it and split it.
|
||||||
/** @var BudgetRepositoryInterface $repository */
|
/** @var BudgetRepositoryInterface $repository */
|
||||||
$repository = app(BudgetRepositoryInterface::class);
|
$repository = app(BudgetRepositoryInterface::class);
|
||||||
|
$repository->setUser($admin);
|
||||||
$unfiltered = $repository->getAvailableBudgets();
|
$unfiltered = $repository->getAvailableBudgets();
|
||||||
|
|
||||||
// filter list.
|
// filter list.
|
||||||
@ -302,18 +257,8 @@ class CurrencyController extends Controller
|
|||||||
$repository = app(BudgetRepositoryInterface::class);
|
$repository = app(BudgetRepositoryInterface::class);
|
||||||
$manager = new Manager;
|
$manager = new Manager;
|
||||||
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
$budgetId = (int)($request->get('budget_id') ?? 0);
|
|
||||||
$budget = $repository->findNull($budgetId);
|
|
||||||
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
|
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
|
||||||
$this->parameters->set('budget_id', $budgetId);
|
|
||||||
|
|
||||||
$unfiltered = new Collection;
|
|
||||||
if (null === $budget) {
|
|
||||||
$unfiltered = $repository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end'));
|
$unfiltered = $repository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end'));
|
||||||
}
|
|
||||||
if (null !== $budget) {
|
|
||||||
$unfiltered = $repository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// filter budget limits on currency ID
|
// filter budget limits on currency ID
|
||||||
$collection = $unfiltered->filter(
|
$collection = $unfiltered->filter(
|
||||||
@ -404,7 +349,6 @@ class CurrencyController extends Controller
|
|||||||
return response()->json([], 409);
|
return response()->json([], 409);
|
||||||
}
|
}
|
||||||
$this->repository->disable($currency);
|
$this->repository->disable($currency);
|
||||||
$currency = $this->repository->find($currency->id);
|
|
||||||
$manager = new Manager();
|
$manager = new Manager();
|
||||||
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
@ -429,7 +373,6 @@ class CurrencyController extends Controller
|
|||||||
public function enable(Request $request, TransactionCurrency $currency): JsonResponse
|
public function enable(Request $request, TransactionCurrency $currency): JsonResponse
|
||||||
{
|
{
|
||||||
$this->repository->enable($currency);
|
$this->repository->enable($currency);
|
||||||
$currency = $this->repository->find($currency->id);
|
|
||||||
$manager = new Manager();
|
$manager = new Manager();
|
||||||
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
@ -488,7 +431,6 @@ class CurrencyController extends Controller
|
|||||||
app('preferences')->set('currencyPreference', $currency->code);
|
app('preferences')->set('currencyPreference', $currency->code);
|
||||||
app('preferences')->mark();
|
app('preferences')->mark();
|
||||||
|
|
||||||
$currency = $this->repository->find($currency->id);
|
|
||||||
$manager = new Manager();
|
$manager = new Manager();
|
||||||
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
@ -653,6 +595,54 @@ class CurrencyController extends Controller
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show all transactions.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
*
|
||||||
|
* @param TransactionCurrency $currency
|
||||||
|
*
|
||||||
|
* @return JsonResponse
|
||||||
|
*/
|
||||||
|
public function transactions(Request $request, TransactionCurrency $currency): JsonResponse
|
||||||
|
{
|
||||||
|
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
|
||||||
|
$type = $request->get('type') ?? 'default';
|
||||||
|
$this->parameters->set('type', $type);
|
||||||
|
|
||||||
|
$types = $this->mapTransactionTypes($this->parameters->get('type'));
|
||||||
|
$manager = new Manager();
|
||||||
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
|
/** @var User $admin */
|
||||||
|
$admin = auth()->user();
|
||||||
|
/** @var TransactionCollectorInterface $collector */
|
||||||
|
$collector = app(TransactionCollectorInterface::class);
|
||||||
|
$collector->setUser($admin);
|
||||||
|
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
|
||||||
|
$collector->setAllAssetAccounts();
|
||||||
|
$collector->setCurrency($currency);
|
||||||
|
|
||||||
|
if (\in_array(TransactionType::TRANSFER, $types, true)) {
|
||||||
|
$collector->removeFilter(InternalTransferFilter::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
|
||||||
|
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
|
||||||
|
}
|
||||||
|
$collector->setLimit($pageSize)->setPage($this->parameters->get('page'));
|
||||||
|
$collector->setTypes($types);
|
||||||
|
$paginator = $collector->getPaginatedTransactions();
|
||||||
|
$paginator->setPath(route('api.v1.currencies.transactions', [$currency->code]) . $this->buildParams());
|
||||||
|
$transactions = $paginator->getCollection();
|
||||||
|
|
||||||
|
$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');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a currency.
|
* Update a currency.
|
||||||
*
|
*
|
||||||
|
@ -134,7 +134,7 @@ class PiggyBankController extends Controller
|
|||||||
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
||||||
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
||||||
|
|
||||||
$collection = $piggyBank->piggyBankEvents()->get();
|
$collection = $this->repository->getEvents($piggyBank);
|
||||||
$count = $collection->count();
|
$count = $collection->count();
|
||||||
$events = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
$events = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
|
||||||
|
|
||||||
|
@ -78,28 +78,6 @@ class PreferenceController extends Controller
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* List single resource.
|
|
||||||
*
|
|
||||||
* @param Request $request
|
|
||||||
* @param Preference $preference
|
|
||||||
*
|
|
||||||
* @return JsonResponse
|
|
||||||
*/
|
|
||||||
public function show(Request $request, Preference $preference): JsonResponse
|
|
||||||
{
|
|
||||||
// create some objects:
|
|
||||||
$manager = new Manager;
|
|
||||||
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
|
|
||||||
|
|
||||||
// present to user.
|
|
||||||
$manager->setSerializer(new JsonApiSerializer($baseUrl));
|
|
||||||
$resource = new Item($preference, new PreferenceTransformer($this->parameters), 'preferences');
|
|
||||||
|
|
||||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a preference.
|
* Update a preference.
|
||||||
*
|
*
|
||||||
|
@ -29,7 +29,6 @@ use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
|
|||||||
use FireflyIII\Helpers\Filter\InternalTransferFilter;
|
use FireflyIII\Helpers\Filter\InternalTransferFilter;
|
||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
use FireflyIII\Models\TransactionType;
|
use FireflyIII\Models\TransactionType;
|
||||||
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
|
||||||
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
||||||
use FireflyIII\Support\Cronjobs\RecurringCronjob;
|
use FireflyIII\Support\Cronjobs\RecurringCronjob;
|
||||||
use FireflyIII\Support\Http\Api\TransactionFilter;
|
use FireflyIII\Support\Http\Api\TransactionFilter;
|
||||||
@ -217,7 +216,8 @@ class RecurrenceController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function trigger(): JsonResponse
|
public function trigger(): JsonResponse
|
||||||
{
|
{
|
||||||
$recurring = new RecurringCronjob;
|
/** @var RecurringCronjob $recurring */
|
||||||
|
$recurring = app(RecurringCronjob::class);
|
||||||
try {
|
try {
|
||||||
$result = $recurring->fire();
|
$result = $recurring->fire();
|
||||||
} catch (FireflyException $e) {
|
} catch (FireflyException $e) {
|
||||||
@ -230,7 +230,7 @@ class RecurrenceController extends Controller
|
|||||||
if (true === $result) {
|
if (true === $result) {
|
||||||
return response()->json([], 200);
|
return response()->json([], 200);
|
||||||
}
|
}
|
||||||
throw new FireflyException('Could not fire recurring cron job.');
|
return response()->json([], 418); // @codeCoverageIgnore
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -249,7 +249,7 @@ class RuleController extends Controller
|
|||||||
foreach ($accountList as $accountId) {
|
foreach ($accountList as $accountId) {
|
||||||
Log::debug(sprintf('Searching for asset account with id "%s"', $accountId));
|
Log::debug(sprintf('Searching for asset account with id "%s"', $accountId));
|
||||||
$account = $this->accountRepository->findNull((int)$accountId);
|
$account = $this->accountRepository->findNull((int)$accountId);
|
||||||
if (null !== $account && AccountType::ASSET === $account->accountType->type) {
|
if (null !== $account && $this->accountRepository->isAsset($account)) {
|
||||||
Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name));
|
Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name));
|
||||||
$accounts->push($account);
|
$accounts->push($account);
|
||||||
}
|
}
|
||||||
|
816
composer.lock
generated
816
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -22,30 +22,6 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Model Factories
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Here you may define all of your model factories. Model factories give
|
|
||||||
| you a convenient way to create models for testing and seeding your
|
|
||||||
| database. Just tell the factory how a default model should look.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
$factory->define(
|
|
||||||
FireflyIII\User::class,
|
|
||||||
function (Faker\Generator $faker) {
|
|
||||||
static $password;
|
|
||||||
|
|
||||||
return [
|
|
||||||
'email' => $faker->safeEmail,
|
|
||||||
'password' => $password ?: $password = bcrypt('secret'),
|
|
||||||
'remember_token' => str_random(10),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$factory->define(
|
$factory->define(
|
||||||
FireflyIII\Models\Attachment::class,
|
FireflyIII\Models\Attachment::class,
|
||||||
|
43
database/factories/UserFactory.php
Normal file
43
database/factories/UserFactory.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* UserFactory.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Faker\Generator as Faker;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Model Factories
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This directory should contain each of the model factory definitions for
|
||||||
|
| your application. Factories provide a convenient way to generate new
|
||||||
|
| model instances for testing / seeding your application's database.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$factory->define(
|
||||||
|
FireflyIII\User::class, function (Faker $faker) {
|
||||||
|
return [
|
||||||
|
'email' => $faker->unique()->safeEmail,
|
||||||
|
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
|
||||||
|
'remember_token' => str_random(10),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
);
|
@ -49,14 +49,20 @@ class AboutControllerTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testAbout(): void
|
public function testAbout(): void
|
||||||
{
|
{
|
||||||
// test API
|
|
||||||
$response = $this->get('/api/v1/about');
|
$search = ['~', '#'];
|
||||||
|
$replace = ['\~', '# '];
|
||||||
|
$phpVersion = str_replace($search, $replace, PHP_VERSION);
|
||||||
|
$phpOs = str_replace($search, $replace, PHP_OS);
|
||||||
|
$response = $this->get(route('api.v1.about.index'));
|
||||||
$response->assertStatus(200);
|
$response->assertStatus(200);
|
||||||
$response->assertJson(
|
$response->assertJson(
|
||||||
['data' => [
|
['data' => [
|
||||||
'version' => true,
|
'version' => config('firefly.version'),
|
||||||
'api_version' => true,
|
'api_version' => config('firefly.api_version'),
|
||||||
'php_version' => true,
|
'php_version' => $phpVersion,
|
||||||
|
'os' => $phpOs,
|
||||||
|
'driver' => 'sqlite',
|
||||||
]]
|
]]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -68,11 +74,16 @@ class AboutControllerTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testUser(): void
|
public function testUser(): void
|
||||||
{
|
{
|
||||||
// test API
|
$response = $this->get(route('api.v1.about.user'));
|
||||||
$response = $this->get('/api/v1/about/user');
|
|
||||||
$response->assertStatus(200);
|
$response->assertStatus(200);
|
||||||
$response->assertJson(['data' => ['attributes' => true, 'links' => true]]);
|
$response->assertJson(
|
||||||
$this->assertEquals($this->user()->id, $response->json()['data']['id']);
|
[
|
||||||
|
'data' => [
|
||||||
|
'attributes' => true,
|
||||||
|
'links' => true,
|
||||||
|
],
|
||||||
|
]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,10 +23,15 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Tests\Api\V1\Controllers;
|
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\Account;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
use Mockery;
|
use Mockery;
|
||||||
@ -233,6 +238,47 @@ class AccountControllerTest extends TestCase
|
|||||||
$response->assertHeader('Content-Type', 'application/json');
|
$response->assertHeader('Content-Type', 'application/json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the list of piggy banks.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController
|
||||||
|
*/
|
||||||
|
public function testPiggyBanks(): void
|
||||||
|
{
|
||||||
|
// mock stuff:
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
|
||||||
|
|
||||||
|
// get piggies for this user.
|
||||||
|
$piggies = $this->user()->piggyBanks()->get();
|
||||||
|
$asset = $this->getRandomAsset();
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$currencyRepos->shouldReceive('setUser');
|
||||||
|
$piggyRepos->shouldReceive('setUser');
|
||||||
|
|
||||||
|
$repository->shouldReceive('getPiggyBanks')->andReturn($piggies)->once();
|
||||||
|
$piggyRepos->shouldReceive('getCurrentAmount')->andReturn('12.45');
|
||||||
|
$piggyRepos->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12.45');
|
||||||
|
$repository->shouldReceive('getMetaValue')->atLeast()->once()->andReturn('');
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->get(route('api.v1.accounts.piggy_banks', [$asset->id]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(['data' => [],]);
|
||||||
|
$response->assertJson(
|
||||||
|
['meta' => ['pagination' => ['total' => $piggies->count(), 'count' => $piggies->count(), 'per_page' => true, 'current_page' => 1,
|
||||||
|
'total_pages' => 1]],]
|
||||||
|
);
|
||||||
|
$response->assertJson(
|
||||||
|
['links' => ['self' => true, 'first' => true, 'last' => true,],]
|
||||||
|
);
|
||||||
|
$response->assertSee('page=1'); // default returns this.
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show an account.
|
* Show an account.
|
||||||
*
|
*
|
||||||
@ -459,6 +505,202 @@ class AccountControllerTest extends TestCase
|
|||||||
$response->assertSee($account->name);
|
$response->assertSee($account->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController
|
||||||
|
*/
|
||||||
|
public function testTransactionsBasic(): void
|
||||||
|
{
|
||||||
|
$accountRepos = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$accountRepos->shouldReceive('setUser');
|
||||||
|
$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:
|
||||||
|
$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');
|
||||||
|
|
||||||
|
$accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue();
|
||||||
|
|
||||||
|
$collector->shouldReceive('setUser')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('withOpposingAccount')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('withCategoryInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$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', [$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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController
|
||||||
|
*/
|
||||||
|
public function testTransactionsOpposing(): void
|
||||||
|
{
|
||||||
|
$accountRepos = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$accountRepos->shouldReceive('setUser');
|
||||||
|
$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:
|
||||||
|
$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');
|
||||||
|
|
||||||
|
$accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnFalse();
|
||||||
|
|
||||||
|
$collector->shouldReceive('setUser')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('withOpposingAccount')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('withCategoryInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setOpposingAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\AccountController
|
||||||
|
*/
|
||||||
|
public function testTransactionsRange(): void
|
||||||
|
{
|
||||||
|
$accountRepos = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$accountRepos->shouldReceive('setUser');
|
||||||
|
$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:
|
||||||
|
$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');
|
||||||
|
|
||||||
|
$accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue();
|
||||||
|
|
||||||
|
$collector->shouldReceive('setUser')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('withOpposingAccount')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('withCategoryInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$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.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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update first asset account we find. Name can be the same as it was.
|
* Update first asset account we find. Name can be the same as it was.
|
||||||
*
|
*
|
||||||
|
@ -24,8 +24,16 @@ declare(strict_types=1);
|
|||||||
namespace Tests\Api\V1\Controllers;
|
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;
|
use FireflyIII\Models\Bill;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
@ -48,6 +56,37 @@ class BillControllerTest extends TestCase
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List all attachments.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\BillController
|
||||||
|
*/
|
||||||
|
public function testAttachments(): void
|
||||||
|
{
|
||||||
|
// create stuff
|
||||||
|
$attachments = factory(Attachment::class, 10)->create();
|
||||||
|
$bill = $this->user()->bills()->first();
|
||||||
|
// mock stuff:
|
||||||
|
$repository = $this->mock(AttachmentRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$billRepos = $this->mock(BillRepositoryInterface::class);
|
||||||
|
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$billRepos->shouldReceive('setUser');
|
||||||
|
$billRepos->shouldReceive('getAttachments')->once()->andReturn($attachments);
|
||||||
|
$repository->shouldReceive('getNoteText')->andReturn('Hi There');
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->get(route('api.v1.bills.attachments', [$bill->id]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(['data' => [],]);
|
||||||
|
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]);
|
||||||
|
$response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send delete
|
* Send delete
|
||||||
*
|
*
|
||||||
@ -100,6 +139,24 @@ class BillControllerTest extends TestCase
|
|||||||
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\BillController
|
||||||
|
*/
|
||||||
|
public function testRules(): void
|
||||||
|
{
|
||||||
|
$rules = $this->user()->rules()->get();
|
||||||
|
$bill = $this->user()->bills()->first();
|
||||||
|
$billRepos = $this->mock(BillRepositoryInterface::class);
|
||||||
|
$billRepos->shouldReceive('setUser')->once();
|
||||||
|
$billRepos->shouldReceive('getRulesForBill')->once()->andReturn($rules);
|
||||||
|
|
||||||
|
// call API
|
||||||
|
$response = $this->get(route('api.v1.bills.rules', [$bill->id]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee($rules->first()->title);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show one bill
|
* Show one bill
|
||||||
*
|
*
|
||||||
@ -213,6 +270,131 @@ class BillControllerTest extends TestCase
|
|||||||
$response->assertSee($bill->name);
|
$response->assertSee($bill->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\BillController
|
||||||
|
*/
|
||||||
|
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:
|
||||||
|
$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);
|
||||||
|
$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();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setBills')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setPage')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setTypes')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
|
||||||
|
|
||||||
|
|
||||||
|
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
|
||||||
|
|
||||||
|
|
||||||
|
// mock some calls:
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\BillController
|
||||||
|
*/
|
||||||
|
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:
|
||||||
|
$repository = $this->mock(JournalRepositoryInterface::class);
|
||||||
|
$collector = $this->mock(TransactionCollectorInterface::class);
|
||||||
|
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$billRepos = $this->mock(BillRepositoryInterface::class);
|
||||||
|
$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();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setBills')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$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.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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a valid bill.
|
* Update a valid bill.
|
||||||
*
|
*
|
||||||
|
@ -24,8 +24,16 @@ declare(strict_types=1);
|
|||||||
namespace Tests\Api\V1\Controllers;
|
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\Budget;
|
||||||
|
use FireflyIII\Models\BudgetLimit;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
@ -46,6 +54,27 @@ class BudgetControllerTest extends TestCase
|
|||||||
Log::info(sprintf('Now in %s.', \get_class($this)));
|
Log::info(sprintf('Now in %s.', \get_class($this)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show all budgets
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\BudgetController
|
||||||
|
*/
|
||||||
|
public function testBudgetLimits(): void
|
||||||
|
{
|
||||||
|
$budget = $this->user()->budgets()->first();
|
||||||
|
$budgetLimits = BudgetLimit::get();
|
||||||
|
$repository = $this->mock(BudgetRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('getBudgetLimits')->once()->andReturn($budgetLimits);
|
||||||
|
|
||||||
|
// call API
|
||||||
|
$response = $this->get(route('api.v1.budgets.budget_limits', [$budget->id]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee('budget_limits');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a budget.
|
* Delete a budget.
|
||||||
*
|
*
|
||||||
@ -141,6 +170,173 @@ class BudgetControllerTest extends TestCase
|
|||||||
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store new budget limit.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\BudgetController
|
||||||
|
* @covers \FireflyIII\Api\V1\Requests\BudgetLimitRequest
|
||||||
|
*/
|
||||||
|
public function testStoreBudgetLimit(): 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' => 1,
|
||||||
|
];
|
||||||
|
// mock stuff:
|
||||||
|
$repository = $this->mock(BudgetRepositoryInterface::class);
|
||||||
|
$repository->shouldReceive('storeBudgetLimit')->andReturn($budgetLimit)->once();
|
||||||
|
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('storeBudgetLimit')->andReturn($budgetLimit);
|
||||||
|
|
||||||
|
// call API
|
||||||
|
$response = $this->post(route('api.v1.budgets.store_budget_limit', [$budget->id]), $data, ['Accept' => 'application/json']);
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee('budget_limits');
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\BudgetController
|
||||||
|
*/
|
||||||
|
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:
|
||||||
|
$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);
|
||||||
|
$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();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setBudget')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setPage')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setTypes')->andReturnSelf();
|
||||||
|
$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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\BudgetController
|
||||||
|
*/
|
||||||
|
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:
|
||||||
|
$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);
|
||||||
|
$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();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setBudget')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a budget.
|
* Update a budget.
|
||||||
*
|
*
|
||||||
@ -173,5 +369,4 @@ class BudgetControllerTest extends TestCase
|
|||||||
$response->assertSee($budget->name);
|
$response->assertSee($budget->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -24,9 +24,16 @@ declare(strict_types=1);
|
|||||||
namespace Tests\Api\V1\Controllers;
|
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\Budget;
|
||||||
use FireflyIII\Models\BudgetLimit;
|
use FireflyIII\Models\BudgetLimit;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
@ -255,6 +262,70 @@ class BudgetLimitControllerTest extends TestCase
|
|||||||
$response->assertSee('Unknown budget.');
|
$response->assertSee('Unknown budget.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\BudgetLimitController
|
||||||
|
*/
|
||||||
|
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:
|
||||||
|
$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);
|
||||||
|
$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();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setBudget')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setRange')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setPage')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setTypes')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
|
||||||
|
|
||||||
|
|
||||||
|
// mock some calls:
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test update of budget limit.
|
* Test update of budget limit.
|
||||||
*
|
*
|
||||||
|
@ -24,8 +24,15 @@ declare(strict_types=1);
|
|||||||
namespace Tests\Api\V1\Controllers;
|
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\Models\Category;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
@ -143,6 +150,132 @@ class CategoryControllerTest extends TestCase
|
|||||||
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CategoryController
|
||||||
|
*/
|
||||||
|
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:
|
||||||
|
$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);
|
||||||
|
$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();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setCategory')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setPage')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setTypes')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
|
||||||
|
|
||||||
|
|
||||||
|
// mock some calls:
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show index.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CategoryController
|
||||||
|
*/
|
||||||
|
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:
|
||||||
|
$repository = $this->mock(JournalRepositoryInterface::class);
|
||||||
|
$collector = $this->mock(TransactionCollectorInterface::class);
|
||||||
|
$currencyRepository = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$billRepos = $this->mock(BillRepositoryInterface::class);
|
||||||
|
$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();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setCategory')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a category.
|
* Update a category.
|
||||||
*
|
*
|
||||||
@ -175,5 +308,4 @@ class CategoryControllerTest extends TestCase
|
|||||||
$response->assertSee($category->name);
|
$response->assertSee($category->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,25 @@ declare(strict_types=1);
|
|||||||
namespace Tests\Api\V1\Controllers;
|
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;
|
||||||
|
use FireflyIII\Models\BudgetLimit;
|
||||||
use FireflyIII\Models\Preference;
|
use FireflyIII\Models\Preference;
|
||||||
use FireflyIII\Models\TransactionCurrency;
|
use FireflyIII\Models\TransactionCurrency;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
||||||
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
use Mockery;
|
use Mockery;
|
||||||
@ -50,6 +65,134 @@ class CurrencyControllerTest extends TestCase
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the list of accounts.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testAccounts(): void
|
||||||
|
{
|
||||||
|
// create stuff
|
||||||
|
$accounts = factory(Account::class, 10)->create();
|
||||||
|
|
||||||
|
// mock stuff:
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$userRepos = $this->mock(UserRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$repository->shouldReceive('getAccountsByType')->withAnyArgs()->andReturn($accounts)->once();
|
||||||
|
$currencyRepos->shouldReceive('setUser');
|
||||||
|
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset');
|
||||||
|
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1');
|
||||||
|
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1');
|
||||||
|
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC');
|
||||||
|
$repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello');
|
||||||
|
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once();
|
||||||
|
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once();
|
||||||
|
$repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->once();
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$response = $this->get(route('api.v1.currencies.accounts', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(['data' => [],]);
|
||||||
|
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]);
|
||||||
|
$response->assertJson(
|
||||||
|
['links' => ['self' => true, 'first' => true, 'last' => true,],]
|
||||||
|
);
|
||||||
|
$response->assertSee('type=all'); // default returns this.
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show all available budgets.
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testAvailableBudgets(): void
|
||||||
|
{
|
||||||
|
$availableBudgets = $this->user()->availableBudgets()->get();
|
||||||
|
// mock stuff:
|
||||||
|
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
|
||||||
|
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$budgetRepos->shouldReceive('setUser')->once();
|
||||||
|
$budgetRepos->shouldReceive('getAvailableBudgets')->once()->andReturn($availableBudgets);
|
||||||
|
|
||||||
|
// call API
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$response = $this->get(route('api.v1.currencies.available_budgets', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee($availableBudgets->first()->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show all bills
|
||||||
|
*
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testBills(): void
|
||||||
|
{
|
||||||
|
// create stuff
|
||||||
|
$bills = factory(Bill::class, 10)->create();
|
||||||
|
$paginator = new LengthAwarePaginator($bills, 10, 50, 1);
|
||||||
|
// mock stuff:
|
||||||
|
$repository = $this->mock(BillRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$repository->shouldReceive('getPaginator')->withAnyArgs()->andReturn($paginator)->once();
|
||||||
|
$repository->shouldReceive('getRulesForBill')->withAnyArgs()->andReturn(new Collection());
|
||||||
|
$repository->shouldReceive('getNoteText')->andReturn('Hi there');
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$response = $this->get(route('api.v1.currencies.bills', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(['data' => [],]);
|
||||||
|
$response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]);
|
||||||
|
$response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testBudgetLimits(): void
|
||||||
|
{
|
||||||
|
$repository = $this->mock(BudgetRepositoryInterface::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);
|
||||||
|
|
||||||
|
|
||||||
|
$response = $this->get(route('api.v1.currencies.budget_limits', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testCer(): void
|
||||||
|
{
|
||||||
|
$repository = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('getExchangeRates')->once()->andReturn(new Collection);
|
||||||
|
|
||||||
|
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$response = $this->get(route('api.v1.currencies.cer', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send delete
|
* Send delete
|
||||||
*
|
*
|
||||||
@ -77,6 +220,80 @@ class CurrencyControllerTest extends TestCase
|
|||||||
$response->assertStatus(204);
|
$response->assertStatus(204);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testDisable(): void
|
||||||
|
{
|
||||||
|
// create stuff
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$repository = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$userRepos = $this->mock(UserRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('disable')->once();
|
||||||
|
$repository->shouldReceive('currencyInUse')->once()->andReturnFalse();
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post(route('api.v1.currencies.disable', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(
|
||||||
|
['data' => [
|
||||||
|
'type' => 'currencies',
|
||||||
|
'id' => $currency->id,
|
||||||
|
],]
|
||||||
|
);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testDisableInUse(): void
|
||||||
|
{
|
||||||
|
// create stuff
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$repository = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$userRepos = $this->mock(UserRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('currencyInUse')->once()->andReturnTrue();
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post(route('api.v1.currencies.disable', [$currency->code]));
|
||||||
|
$response->assertStatus(409);
|
||||||
|
$response->assertJson([]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testEnable(): void
|
||||||
|
{
|
||||||
|
// create stuff
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$repository = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$userRepos = $this->mock(UserRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('enable')->once();
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post(route('api.v1.currencies.enable', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(
|
||||||
|
['data' => [
|
||||||
|
'type' => 'currencies',
|
||||||
|
'id' => $currency->id,
|
||||||
|
],]
|
||||||
|
);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show index.
|
* Show index.
|
||||||
*
|
*
|
||||||
@ -116,6 +333,78 @@ class CurrencyControllerTest extends TestCase
|
|||||||
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testMakeDefault(): void
|
||||||
|
{
|
||||||
|
// create stuff
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$repository = $this->mock(CurrencyRepositoryInterface::class);
|
||||||
|
$userRepos = $this->mock(UserRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('enable')->once();
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->post(route('api.v1.currencies.default', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertJson(
|
||||||
|
['data' => [
|
||||||
|
'type' => 'currencies',
|
||||||
|
'id' => $currency->id,
|
||||||
|
],]
|
||||||
|
);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testRecurrences(): void
|
||||||
|
{
|
||||||
|
$recurrences = $this->user()->recurrences()->get();
|
||||||
|
|
||||||
|
// mock stuff:
|
||||||
|
$repository = $this->mock(RecurringRepositoryInterface::class);
|
||||||
|
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
|
||||||
|
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
|
||||||
|
|
||||||
|
// mock calls:
|
||||||
|
$repository->shouldReceive('setUser');
|
||||||
|
$repository->shouldReceive('getAll')->once()->andReturn($recurrences);
|
||||||
|
$repository->shouldReceive('getNoteText')->andReturn('Notes.');
|
||||||
|
$repository->shouldReceive('repetitionDescription')->andReturn('Some description.');
|
||||||
|
$repository->shouldReceive('getXOccurrences')->andReturn([]);
|
||||||
|
|
||||||
|
|
||||||
|
// call API
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$response = $this->get(route('api.v1.currencies.recurrences', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testRules(): void
|
||||||
|
{
|
||||||
|
$rules = $this->user()->rules()->get();
|
||||||
|
|
||||||
|
$ruleRepos = $this->mock(RuleRepositoryInterface::class);
|
||||||
|
$ruleRepos->shouldReceive('getAll')->once()->andReturn($rules);
|
||||||
|
|
||||||
|
|
||||||
|
// call API
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$response = $this->get(route('api.v1.currencies.rules', [$currency->code]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test show of a currency.
|
* Test show of a currency.
|
||||||
*
|
*
|
||||||
@ -218,6 +507,123 @@ class CurrencyControllerTest extends TestCase
|
|||||||
$response->assertSee($currency->name);
|
$response->assertSee($currency->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testTransactionsBasic(): void
|
||||||
|
{
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$accountRepos = $this->mock(AccountRepositoryInterface::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:
|
||||||
|
$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();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setCurrency')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setPage')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setTypes')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
|
||||||
|
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\CurrencyController
|
||||||
|
*/
|
||||||
|
public function testTransactionsRange(): void
|
||||||
|
{
|
||||||
|
$currency = TransactionCurrency::first();
|
||||||
|
$accountRepos = $this->mock(AccountRepositoryInterface::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:
|
||||||
|
$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();
|
||||||
|
$collector->shouldReceive('withBudgetInformation')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setCurrency')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('removeFilter')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setAllAssetAccounts')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setPage')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setRange')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setTypes')->andReturnSelf();
|
||||||
|
$collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator);
|
||||||
|
|
||||||
|
|
||||||
|
// test API
|
||||||
|
$response = $this->get(
|
||||||
|
route('api.v1.currencies.transactions', [$currency->code]) . '?' . 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(['links' => ['self' => true, 'first' => true, 'last' => true,],]);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update currency.
|
* Update currency.
|
||||||
*
|
*
|
||||||
|
115
tests/Api/V1/Controllers/ImportControllerTest.php
Normal file
115
tests/Api/V1/Controllers/ImportControllerTest.php
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* ImportControllerTest.php
|
||||||
|
* Copyright (c) 2018 thegrumpydictator@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of Firefly III.
|
||||||
|
*
|
||||||
|
* Firefly III is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Firefly III is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests\Api\V1\Controllers;
|
||||||
|
|
||||||
|
use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
|
||||||
|
use FireflyIII\Models\ImportJob;
|
||||||
|
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Laravel\Passport\Passport;
|
||||||
|
use Log;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ImportControllerTest
|
||||||
|
*/
|
||||||
|
class ImportControllerTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
Passport::actingAs($this->user());
|
||||||
|
Log::info(sprintf('Now in %s.', \get_class($this)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\ImportController
|
||||||
|
*/
|
||||||
|
public function testListAll(): void
|
||||||
|
{
|
||||||
|
$repository = $this->mock(ImportJobRepositoryInterface::class);
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('get')->once()->andReturn(new Collection);
|
||||||
|
|
||||||
|
|
||||||
|
$response = $this->get(route('api.v1.import.list'));
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\ImportController
|
||||||
|
*/
|
||||||
|
public function testShow(): void
|
||||||
|
{
|
||||||
|
/** @var ImportJob $job */
|
||||||
|
$job = $this->user()->importJobs()->first();
|
||||||
|
$repository = $this->mock(ImportJobRepositoryInterface::class);
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
|
||||||
|
$response = $this->get(route('api.v1.import.show', [$job->key]), ['accept' => 'application/json']);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\ImportController
|
||||||
|
*/
|
||||||
|
public function testTransactions(): void
|
||||||
|
{
|
||||||
|
/** @var ImportJob $job */
|
||||||
|
$job = $this->user()->importJobs()->first();
|
||||||
|
$tag = $this->user()->tags()->first();
|
||||||
|
$job->tag_id = $tag->id;
|
||||||
|
$job->save();
|
||||||
|
$repository = $this->mock(ImportJobRepositoryInterface::class);
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
|
||||||
|
// paginator:
|
||||||
|
$paginator = new LengthAwarePaginator(new Collection, 0, 50);
|
||||||
|
|
||||||
|
$collector = $this->mock(TransactionCollectorInterface::class);
|
||||||
|
$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('setLimit')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setPage')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setTypes')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setRange')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('getPaginatedTransactions')->once()->andReturn($paginator);
|
||||||
|
$collector->shouldReceive('removeFilter')->once()->andReturnSelf();
|
||||||
|
|
||||||
|
$response = $this->get(
|
||||||
|
route('api.v1.import.transactions', [$job->key]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31']),
|
||||||
|
['accept' => 'application/json']
|
||||||
|
);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -23,9 +23,12 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Tests\Api\V1\Controllers;
|
namespace Tests\Api\V1\Controllers;
|
||||||
|
|
||||||
|
use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
|
||||||
use FireflyIII\Models\LinkType;
|
use FireflyIII\Models\LinkType;
|
||||||
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
|
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
|
||||||
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
@ -77,7 +80,6 @@ class LinkTypeControllerTest extends TestCase
|
|||||||
$response->assertStatus(204);
|
$response->assertStatus(204);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @covers \FireflyIII\Api\V1\Controllers\LinkTypeController
|
* @covers \FireflyIII\Api\V1\Controllers\LinkTypeController
|
||||||
*/
|
*/
|
||||||
@ -216,6 +218,39 @@ class LinkTypeControllerTest extends TestCase
|
|||||||
$response->assertSee('You need the \"owner\"-role to do this.');
|
$response->assertSee('You need the \"owner\"-role to do this.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\LinkTypeController
|
||||||
|
*/
|
||||||
|
public function testTransactions(): void
|
||||||
|
{
|
||||||
|
$linkType = LinkType::first();
|
||||||
|
$paginator = new LengthAwarePaginator(new Collection, 0, 50);
|
||||||
|
// mock repositories:
|
||||||
|
$linkTypeRepos = $this->mock(LinkTypeRepositoryInterface::class);
|
||||||
|
$userRepos = $this->mock(UserRepositoryInterface::class);
|
||||||
|
$collector = $this->mock(TransactionCollectorInterface::class);
|
||||||
|
$journalIds = $linkTypeRepos->shouldReceive('getJournalIds')->once()->andReturn([1, 2, 3]);
|
||||||
|
$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('setJournalIds')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setRange')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setPage')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setTypes')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('getPaginatedTransactions')->once()->andReturn($paginator);
|
||||||
|
|
||||||
|
$collector->shouldReceive('removeFilter')->once()->andReturnSelf();
|
||||||
|
$linkTypeRepos->shouldReceive('setUser')->once();
|
||||||
|
|
||||||
|
$response = $this->get(
|
||||||
|
route('api.v1.link_types.transactions', [$linkType->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])
|
||||||
|
);
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @covers \FireflyIII\Api\V1\Controllers\LinkTypeController
|
* @covers \FireflyIII\Api\V1\Controllers\LinkTypeController
|
||||||
* @covers \FireflyIII\Api\V1\Requests\LinkTypeRequest
|
* @covers \FireflyIII\Api\V1\Requests\LinkTypeRequest
|
||||||
|
@ -28,6 +28,7 @@ use FireflyIII\Models\TransactionCurrency;
|
|||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
|
||||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
use Mockery;
|
use Mockery;
|
||||||
@ -103,6 +104,21 @@ class PiggyBankControllerTest extends TestCase
|
|||||||
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\PiggyBankController
|
||||||
|
*/
|
||||||
|
public function testPiggyBankEvents(): void
|
||||||
|
{
|
||||||
|
$piggyBank = $this->user()->piggyBanks()->first();
|
||||||
|
$repository = $this->mock(PiggyBankRepositoryInterface::class);
|
||||||
|
$repository->shouldReceive('setUser')->once();
|
||||||
|
$repository->shouldReceive('getEvents')->once()->andReturn(new Collection);
|
||||||
|
|
||||||
|
$response = $this->get(route('api.v1.piggy_banks.events', [$piggyBank->id]));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @covers \FireflyIII\Api\V1\Controllers\PiggyBankController
|
* @covers \FireflyIII\Api\V1\Controllers\PiggyBankController
|
||||||
*/
|
*/
|
||||||
|
@ -24,13 +24,18 @@ declare(strict_types=1);
|
|||||||
namespace Tests\Api\V1\Controllers;
|
namespace Tests\Api\V1\Controllers;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
use FireflyIII\Factory\CategoryFactory;
|
use FireflyIII\Factory\CategoryFactory;
|
||||||
|
use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
|
||||||
use FireflyIII\Models\AccountType;
|
use FireflyIII\Models\AccountType;
|
||||||
use FireflyIII\Models\Recurrence;
|
use FireflyIII\Models\Recurrence;
|
||||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
|
||||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Cronjobs\RecurringCronjob;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
@ -1672,6 +1677,79 @@ class RecurrenceControllerTest extends TestCase
|
|||||||
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
$response->assertHeader('Content-Type', 'application/vnd.api+json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
|
||||||
|
*/
|
||||||
|
public function testTransactions(): void
|
||||||
|
{
|
||||||
|
$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]);
|
||||||
|
$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('setJournalIds')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setRange')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setLimit')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setPage')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('setTypes')->once()->andReturnSelf();
|
||||||
|
$collector->shouldReceive('getPaginatedTransactions')->once()->andReturn($paginator);
|
||||||
|
|
||||||
|
$collector->shouldReceive('removeFilter')->once()->andReturnSelf();
|
||||||
|
$recurringRepos->shouldReceive('setUser')->once();
|
||||||
|
|
||||||
|
$response = $this->get(
|
||||||
|
route('api.v1.recurrences.transactions', [$recurrence->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])
|
||||||
|
);
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
|
||||||
|
*/
|
||||||
|
public function testTriggerError(): void
|
||||||
|
{
|
||||||
|
$cronjob = $this->mock(RecurringCronjob::class);
|
||||||
|
$cronjob->shouldReceive('fire')->andThrow(FireflyException::class);
|
||||||
|
|
||||||
|
|
||||||
|
$response = $this->post(route('api.v1.recurrences.trigger'));
|
||||||
|
$response->assertStatus(500);
|
||||||
|
$response->assertSee('Could not fire recurring cron job.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
|
||||||
|
*/
|
||||||
|
public function testTriggerFalse(): void
|
||||||
|
{
|
||||||
|
$cronjob = $this->mock(RecurringCronjob::class);
|
||||||
|
$cronjob->shouldReceive('fire')->once()->andReturnFalse();
|
||||||
|
|
||||||
|
|
||||||
|
$response = $this->post(route('api.v1.recurrences.trigger'));
|
||||||
|
$response->assertStatus(204);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
|
||||||
|
*/
|
||||||
|
public function testTriggerTrue(): void
|
||||||
|
{
|
||||||
|
$cronjob = $this->mock(RecurringCronjob::class);
|
||||||
|
$cronjob->shouldReceive('fire')->once()->andReturnTrue();
|
||||||
|
|
||||||
|
|
||||||
|
$response = $this->post(route('api.v1.recurrences.trigger'));
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Just a basic test because the store() tests cover everything.
|
* Just a basic test because the store() tests cover everything.
|
||||||
*
|
*
|
||||||
|
@ -24,10 +24,17 @@ declare(strict_types=1);
|
|||||||
namespace Tests\Api\V1\Controllers;
|
namespace Tests\Api\V1\Controllers;
|
||||||
|
|
||||||
|
|
||||||
|
use FireflyIII\Jobs\ExecuteRuleOnExistingTransactions;
|
||||||
|
use FireflyIII\Jobs\Job;
|
||||||
use FireflyIII\Models\Rule;
|
use FireflyIII\Models\Rule;
|
||||||
|
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||||
|
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
||||||
|
use FireflyIII\TransactionRules\TransactionMatcher;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
use Laravel\Passport\Passport;
|
use Laravel\Passport\Passport;
|
||||||
use Log;
|
use Log;
|
||||||
|
use Queue;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -208,6 +215,67 @@ class RuleControllerTest extends TestCase
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function testTestRule(): void
|
||||||
|
{
|
||||||
|
$rule = $this->user()->rules()->first();
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$matcher = $this->mock(TransactionMatcher::class);
|
||||||
|
$journalRepos = $this->mock(JournalRepositoryInterface::class);
|
||||||
|
$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);
|
||||||
|
|
||||||
|
|
||||||
|
$response = $this->get(route('api.v1.rules.test', [$rule->id]) . '?accounts=1,2,3');
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \FireflyIII\Api\V1\Controllers\RuleController
|
||||||
|
*/
|
||||||
|
public function testTriggerRule(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
$rule = $this->user()->rules()->first();
|
||||||
|
$repository = $this->mock(AccountRepositoryInterface::class);
|
||||||
|
$matcher = $this->mock(TransactionMatcher::class);
|
||||||
|
$journalRepos = $this->mock(JournalRepositoryInterface::class);
|
||||||
|
$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')->andReturn(true, false);
|
||||||
|
|
||||||
|
Queue::fake();
|
||||||
|
|
||||||
|
|
||||||
|
$response = $this->post(route('api.v1.rules.trigger', [$rule->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\RuleController
|
* @covers \FireflyIII\Api\V1\Controllers\RuleController
|
||||||
* @covers \FireflyIII\Api\V1\Requests\RuleRequest
|
* @covers \FireflyIII\Api\V1\Requests\RuleRequest
|
||||||
|
Loading…
Reference in New Issue
Block a user