API updates.

This commit is contained in:
James Cole
2019-06-09 08:26:23 +02:00
parent 85f9c256a1
commit 3c2dfc52bc
35 changed files with 722 additions and 573 deletions

View File

@@ -75,7 +75,7 @@ class CategoryController extends Controller
throw new FireflyException('Start and end are mandatory parameters.'); throw new FireflyException('Start and end are mandatory parameters.');
} }
/** @var Carbon $start */ /** @var Carbon $start */
$start = Carbon::createFromFormat('Y-m-d', $start); $start = Carbon::createFromFormat('Y-m-d', $start);
/** @var Carbon $end */ /** @var Carbon $end */
$end = Carbon::createFromFormat('Y-m-d', $end); $end = Carbon::createFromFormat('Y-m-d', $end);
$tempData = []; $tempData = [];

View File

@@ -76,11 +76,27 @@ class ConfigurationController extends Controller
return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json'); return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json');
} }
/**
* Update the configuration.
*
* @param ConfigurationRequest $request
* @param string $name
*
* @return JsonResponse
*/
public function update(ConfigurationRequest $request, string $name): JsonResponse
{
$data = $request->getAll();
app('fireflyconfig')->set($name, $data['value']);
$configData = $this->getConfigData();
return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json');
}
/** /**
* Get all config values. * Get all config values.
* *
* @return array * @return array
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/ */
private function getConfigData(): array private function getConfigData(): array
{ {
@@ -101,22 +117,4 @@ class ConfigurationController extends Controller
return $data; return $data;
} }
/**
* Update the configuration.
*
* @param ConfigurationRequest $request
* @param string $name
*
* @return JsonResponse
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function update(ConfigurationRequest $request, string $name): JsonResponse
{
$data = $request->getAll();
app('fireflyconfig')->set($name, $data['value']);
$configData = $this->getConfigData();
return response()->json(['data' => $configData])->header('Content-Type', 'application/vnd.api+json');
}
} }

View File

@@ -56,11 +56,35 @@ class Controller extends BaseController
$this->parameters = $this->getParameters(); $this->parameters = $this->getParameters();
} }
/**
* Method to help build URI's.
*
* @return string
*
*/
protected function buildParams(): string
{
$return = '?';
$params = [];
foreach ($this->parameters as $key => $value) {
if ('page' === $key) {
continue;
}
if ($value instanceof Carbon) {
$params[$key] = $value->format('Y-m-d');
continue;
}
$params[$key] = $value;
}
$return .= http_build_query($params);
return $return;
}
/** /**
* Method to grab all parameters from the URI. * Method to grab all parameters from the URI.
* *
* @return ParameterBag * @return ParameterBag
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/ */
private function getParameters(): ParameterBag private function getParameters(): ParameterBag
{ {
@@ -99,30 +123,4 @@ class Controller extends BaseController
return $bag; return $bag;
} }
/**
* Method to help build URI's.
*
* @return string
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected function buildParams(): string
{
$return = '?';
$params = [];
foreach ($this->parameters as $key => $value) {
if ('page' === $key) {
continue;
}
if ($value instanceof Carbon) {
$params[$key] = $value->format('Y-m-d');
continue;
}
$params[$key] = $value;
}
$return .= http_build_query($params);
return $return;
}
} }

View File

@@ -29,7 +29,6 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Models\BudgetLimit;
use FireflyIII\Models\Recurrence; use FireflyIII\Models\Recurrence;
use FireflyIII\Models\RecurrenceTransaction; use FireflyIII\Models\RecurrenceTransaction;
use FireflyIII\Models\Rule; use FireflyIII\Models\Rule;
@@ -267,11 +266,11 @@ class CurrencyController extends Controller
public function budgetLimits(Request $request, TransactionCurrency $currency): JsonResponse public function budgetLimits(Request $request, TransactionCurrency $currency): JsonResponse
{ {
/** @var BudgetRepositoryInterface $repository */ /** @var BudgetRepositoryInterface $repository */
$repository = app(BudgetRepositoryInterface::class); $repository = app(BudgetRepositoryInterface::class);
$manager = new Manager; $manager = new Manager;
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$collection = $repository->getAllBudgetLimitsByCurrency($currency, $this->parameters->get('start'), $this->parameters->get('end')); $collection = $repository->getAllBudgetLimitsByCurrency($currency, $this->parameters->get('start'), $this->parameters->get('end'));
$count = $collection->count(); $count = $collection->count();
$budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); $paginator = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page'));

View File

@@ -123,7 +123,6 @@ class PreferenceController extends Controller
* @param Preference $preference * @param Preference $preference
* *
* @return JsonResponse * @return JsonResponse
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function show(Request $request, Preference $preference): JsonResponse public function show(Request $request, Preference $preference): JsonResponse
@@ -150,7 +149,6 @@ class PreferenceController extends Controller
* @param Preference $preference * @param Preference $preference
* *
* @return JsonResponse * @return JsonResponse
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/ */
public function update(PreferenceRequest $request, Preference $preference): JsonResponse public function update(PreferenceRequest $request, Preference $preference): JsonResponse
{ {

View File

@@ -23,12 +23,11 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers; namespace FireflyIII\Api\V1\Controllers;
use Carbon\Carbon;
use Exception;
use FireflyIII\Api\V1\Requests\RuleRequest; use FireflyIII\Api\V1\Requests\RuleRequest;
use FireflyIII\Api\V1\Requests\RuleTestRequest;
use FireflyIII\Api\V1\Requests\RuleTriggerRequest;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Jobs\ExecuteRuleOnExistingTransactions; use FireflyIII\Jobs\ExecuteRuleOnExistingTransactions;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Rule; use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
@@ -39,7 +38,6 @@ use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use League\Fractal\Manager; use League\Fractal\Manager;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Collection as FractalCollection;
@@ -49,6 +47,7 @@ use Log;
/** /**
* Class RuleController * Class RuleController
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/ */
class RuleController extends Controller class RuleController extends Controller
{ {
@@ -184,57 +183,32 @@ class RuleController extends Controller
} }
/** /**
* @param Request $request * @param RuleTestRequest $request
* @param Rule $rule * @param Rule $rule
* *
* @return JsonResponse * @return JsonResponse
* @throws FireflyException * @throws FireflyException
*/ */
public function testRule(Request $request, Rule $rule): JsonResponse public function testRule(RuleTestRequest $request, Rule $rule): JsonResponse
{ {
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$page = 0 === (int)$request->query('page') ? 1 : (int)$request->query('page'); $parameters = $request->getTestParameters();
/** @var Carbon $startDate */
$startDate = null === $request->query('start_date') ? null : Carbon::createFromFormat('Y-m-d', $request->query('start_date'));
/** @var Carbon $endDate */
$endDate = null === $request->query('end_date') ? null : Carbon::createFromFormat('Y-m-d', $request->query('end_date'));
$searchLimit = 0 === (int)$request->query('search_limit') ? (int)config('firefly.test-triggers.limit') : (int)$request->query('search_limit');
$triggerLimit = 0 === (int)$request->query('triggered_limit') ? (int)config('firefly.test-triggers.range') : (int)$request->query('triggered_limit');
$accountList = '' === (string)$request->query('accounts') ? [] : explode(',', $request->query('accounts'));
$accounts = new Collection;
foreach ($accountList as $accountId) {
Log::debug(sprintf('Searching for asset account with id "%s"', $accountId));
$account = $this->accountRepository->findNull((int)$accountId);
if (null !== $account && AccountType::ASSET === $account->accountType->type) {
Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name));
$accounts->push($account);
}
if (null === $account) {
Log::debug(sprintf('No asset account with id "%s"', $accountId));
}
}
/** @var Rule $rule */ /** @var Rule $rule */
Log::debug(sprintf('Now testing rule #%d, "%s"', $rule->id, $rule->title)); Log::debug(sprintf('Now testing rule #%d, "%s"', $rule->id, $rule->title));
/** @var TransactionMatcher $matcher */ /** @var TransactionMatcher $matcher */
$matcher = app(TransactionMatcher::class); $matcher = app(TransactionMatcher::class);
// set all parameters: // set all parameters:
$matcher->setRule($rule); $matcher->setRule($rule);
$matcher->setStartDate($startDate); $matcher->setStartDate($parameters['start_date']);
$matcher->setEndDate($endDate); $matcher->setEndDate($parameters['end_date']);
$matcher->setSearchLimit($searchLimit); $matcher->setSearchLimit($parameters['search_limit']);
$matcher->setTriggeredLimit($triggerLimit); $matcher->setTriggeredLimit($parameters['trigger_limit']);
$matcher->setAccounts($accounts); $matcher->setAccounts($parameters['accounts']);
$matchingTransactions = $matcher->findTransactionsByRule(); $matchingTransactions = $matcher->findTransactionsByRule();
$count = count($matchingTransactions);
// make paginator out of results. $transactions = array_slice($matchingTransactions, ($parameters['page'] - 1) * $pageSize, $pageSize);
$count = count($matchingTransactions); $paginator = new LengthAwarePaginator($transactions, $count, $pageSize, $this->parameters->get('page'));
$transactions = array_slice($matchingTransactions, ($page - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($transactions, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.rules.test', [$rule->id]) . $this->buildParams()); $paginator->setPath(route('api.v1.rules.test', [$rule->id]) . $this->buildParams());
// resulting list is presented as JSON thing. // resulting list is presented as JSON thing.
@@ -255,42 +229,26 @@ class RuleController extends Controller
/** /**
* Execute the given rule group on a set of existing transactions. * Execute the given rule group on a set of existing transactions.
* *
* @param Request $request * @param RuleTriggerRequest $request
* @param Rule $rule * @param Rule $rule
* *
* @return JsonResponse * @return JsonResponse
* @throws Exception
*/ */
public function triggerRule(Request $request, Rule $rule): JsonResponse public function triggerRule(RuleTriggerRequest $request, Rule $rule): JsonResponse
{ {
// Get parameters specified by the user // Get parameters specified by the user
/** @var User $user */ $parameters = $request->getTriggerParameters();
$user = auth()->user();
$startDate = new Carbon($request->get('start_date'));
$endDate = new Carbon($request->get('end_date'));
$accountList = '' === (string)$request->query('accounts') ? [] : explode(',', $request->query('accounts'));
$accounts = new Collection;
foreach ($accountList as $accountId) {
Log::debug(sprintf('Searching for asset account with id "%s"', $accountId));
$account = $this->accountRepository->findNull((int)$accountId);
if (null !== $account && $this->accountRepository->isAsset($account)) {
Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name));
$accounts->push($account);
}
if (null === $account) {
Log::debug(sprintf('No asset account with id "%s"', $accountId));
}
}
// Create a job to do the work asynchronously // Create a job to do the work asynchronously
$job = new ExecuteRuleOnExistingTransactions($rule); $job = new ExecuteRuleOnExistingTransactions($rule);
// Apply parameters to the job // Apply parameters to the job
/** @var User $user */
$user = auth()->user();
$job->setUser($user); $job->setUser($user);
$job->setAccounts($accounts); $job->setAccounts($parameters['accounts']);
$job->setStartDate($startDate); $job->setStartDate($parameters['start_date']);
$job->setEndDate($endDate); $job->setEndDate($parameters['end_date']);
// Dispatch a new job to execute it in a queue // Dispatch a new job to execute it in a queue
$this->dispatch($job); $this->dispatch($job);
@@ -328,10 +286,10 @@ class RuleController extends Controller
* @param Rule $rule * @param Rule $rule
* @return JsonResponse * @return JsonResponse
*/ */
public function down(Request $request, Rule $rule): JsonResponse public function moveDown(Request $request, Rule $rule): JsonResponse
{ {
$this->ruleRepository->moveDown($rule); $this->ruleRepository->moveDown($rule);
$rule = $this->ruleRepository->find($rule->id); $rule = $this->ruleRepository->find($rule->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));
@@ -351,10 +309,10 @@ class RuleController extends Controller
* @param Rule $rule * @param Rule $rule
* @return JsonResponse * @return JsonResponse
*/ */
public function up(Request $request, Rule $rule): JsonResponse public function moveUp(Request $request, Rule $rule): JsonResponse
{ {
$this->ruleRepository->moveUp($rule); $this->ruleRepository->moveUp($rule);
$rule = $this->ruleRepository->find($rule->id); $rule = $this->ruleRepository->find($rule->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));

View File

@@ -36,7 +36,6 @@ use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\TransactionRules\TransactionMatcher; use FireflyIII\TransactionRules\TransactionMatcher;
use FireflyIII\Transformers\RuleGroupTransformer; use FireflyIII\Transformers\RuleGroupTransformer;
use FireflyIII\Transformers\RuleTransformer; use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionTransformer;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -233,6 +232,7 @@ class RuleGroupController extends Controller
*/ */
public function testGroup(Request $request, RuleGroup $group): JsonResponse public function testGroup(Request $request, RuleGroup $group): JsonResponse
{ {
die('I will never work');
Log::debug('Now in testGroup()'); Log::debug('Now in testGroup()');
/** @var Collection $rules */ /** @var Collection $rules */
$rules = $this->ruleGroupRepository->getActiveRules($group); $rules = $this->ruleGroupRepository->getActiveRules($group);
@@ -274,11 +274,10 @@ class RuleGroupController extends Controller
$baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
$manager->setSerializer(new JsonApiSerializer($baseUrl)); $manager->setSerializer(new JsonApiSerializer($baseUrl));
/** @var TransactionTransformer $transformer */ //$transformer = app(TransactionTransformer::class);
$transformer = app(TransactionTransformer::class); //$transformer->setParameters($this->parameters);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($matchingTransactions, $transformer, 'transactions'); //$resource = new FractalCollection($matchingTransactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
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');

View File

@@ -102,7 +102,7 @@ class SummaryController extends Controller
/** @var Carbon $start */ /** @var Carbon $start */
$start = Carbon::createFromFormat('Y-m-d', $start); $start = Carbon::createFromFormat('Y-m-d', $start);
/** @var Carbon $end */ /** @var Carbon $end */
$end = Carbon::createFromFormat('Y-m-d', $end); $end = Carbon::createFromFormat('Y-m-d', $end);
// balance information: // balance information:
$balanceData = $this->getBalanceInformation($start, $end); $balanceData = $this->getBalanceInformation($start, $end);
$billData = $this->getBillInformation($start, $end); $billData = $this->getBillInformation($start, $end);
@@ -116,6 +116,30 @@ class SummaryController extends Controller
} }
/**
* Check if date is outside session range.
*
* @param Carbon $date
*
* @param Carbon $start
* @param Carbon $end
*
* @return bool
*/
protected function notInDateRange(Carbon $date, Carbon $start, Carbon $end): bool // Validate a preference
{
$result = false;
if ($start->greaterThanOrEqualTo($date) && $end->greaterThanOrEqualTo($date)) {
$result = true;
}
// start and end in the past? use $end
if ($start->lessThanOrEqualTo($date) && $end->lessThanOrEqualTo($date)) {
$result = true;
}
return $result;
}
/** /**
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
@@ -405,29 +429,4 @@ class SummaryController extends Controller
return $return; return $return;
} }
/**
* Check if date is outside session range.
*
* @param Carbon $date
*
* @param Carbon $start
* @param Carbon $end
*
* @return bool
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected function notInDateRange(Carbon $date, Carbon $start, Carbon $end): bool // Validate a preference
{
$result = false;
if ($start->greaterThanOrEqualTo($date) && $end->greaterThanOrEqualTo($date)) {
$result = true;
}
// start and end in the past? use $end
if ($start->lessThanOrEqualTo($date) && $end->lessThanOrEqualTo($date)) {
$result = true;
}
return $result;
}
} }

View File

@@ -90,7 +90,7 @@ class TagController extends Controller
/** @var Carbon $start */ /** @var Carbon $start */
$start = Carbon::createFromFormat('Y-m-d', $start); $start = Carbon::createFromFormat('Y-m-d', $start);
/** @var Carbon $end */ /** @var Carbon $end */
$end = Carbon::createFromFormat('Y-m-d', $end); $end = Carbon::createFromFormat('Y-m-d', $end);
// get all tags: // get all tags:
$tags = $this->repository->get(); $tags = $this->repository->get();

View File

@@ -31,6 +31,7 @@ use FireflyIII\Rules\IsValidAttachmentModel;
/** /**
* Class AttachmentRequest * Class AttachmentRequest
* @codeCoverageIgnore * @codeCoverageIgnore
* TODO AFTER 4.8.0: split this into two request classes.
*/ */
class AttachmentRequest extends Request class AttachmentRequest extends Request
{ {
@@ -69,11 +70,12 @@ class AttachmentRequest extends Request
public function rules(): array public function rules(): array
{ {
$models = implode( $models = implode(
',', [ ',',
str_replace('FireflyIII\\Models\\', '', Bill::class), [
str_replace('FireflyIII\\Models\\', '', ImportJob::class), str_replace('FireflyIII\\Models\\', '', Bill::class),
str_replace('FireflyIII\\Models\\', '', TransactionJournal::class), str_replace('FireflyIII\\Models\\', '', ImportJob::class),
] str_replace('FireflyIII\\Models\\', '', TransactionJournal::class),
]
); );
$model = $this->string('model'); $model = $this->string('model');
$rules = [ $rules = [

View File

@@ -30,6 +30,8 @@ use Illuminate\Validation\Validator;
/** /**
* Class BillRequest * Class BillRequest
* *
* TODO AFTER 4.8.0: split this into two request classes.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class BillRequest extends Request class BillRequest extends Request
@@ -78,6 +80,7 @@ class BillRequest extends Request
* The rules that the incoming request must be matched against. * The rules that the incoming request must be matched against.
* *
* @return array * @return array
*
*/ */
public function rules(): array public function rules(): array
{ {

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V1\Requests;
* Class BudgetLimitRequest * Class BudgetLimitRequest
* *
* @codeCoverageIgnore * @codeCoverageIgnore
* TODO AFTER 4.8.0: split this into two request classes.
*/ */
class BudgetLimitRequest extends Request class BudgetLimitRequest extends Request
{ {

View File

@@ -29,6 +29,7 @@ use FireflyIII\Rules\IsBoolean;
/** /**
* Class BudgetRequest * Class BudgetRequest
* @codeCoverageIgnore * @codeCoverageIgnore
* TODO AFTER 4.8.0: split this into two request classes.
*/ */
class BudgetRequest extends Request class BudgetRequest extends Request
{ {

View File

@@ -28,6 +28,7 @@ use FireflyIII\Models\Category;
/** /**
* Class CategoryRequest * Class CategoryRequest
* @codeCoverageIgnore * @codeCoverageIgnore
* TODO AFTER 4.8.0: split this into two request classes.
*/ */
class CategoryRequest extends Request class CategoryRequest extends Request
{ {

View File

@@ -29,6 +29,7 @@ use FireflyIII\Rules\IsBoolean;
/** /**
* Class CurrencyRequest * Class CurrencyRequest
* @codeCoverageIgnore * @codeCoverageIgnore
* TODO AFTER 4.8.0: split this into two request classes.
*/ */
class CurrencyRequest extends Request class CurrencyRequest extends Request
{ {

View File

@@ -30,6 +30,7 @@ use Illuminate\Validation\Rule;
* *
* Class LinkTypeRequest * Class LinkTypeRequest
* @codeCoverageIgnore * @codeCoverageIgnore
* TODO AFTER 4.8.0: split this into two request classes.
*/ */
class LinkTypeRequest extends Request class LinkTypeRequest extends Request
{ {

View File

@@ -30,6 +30,7 @@ use FireflyIII\Rules\IsAssetAccountId;
* *
* Class PiggyBankRequest * Class PiggyBankRequest
* @codeCoverageIgnore * @codeCoverageIgnore
* TODO AFTER 4.8.0: split this into two request classes.
*/ */
class PiggyBankRequest extends Request class PiggyBankRequest extends Request
{ {

View File

@@ -23,9 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests; namespace FireflyIII\Api\V1\Requests;
use Carbon\Carbon;
use FireflyIII\Rules\BelongsUser;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Validation\RecurrenceValidation; use FireflyIII\Validation\RecurrenceValidation;
use FireflyIII\Validation\TransactionValidation; use FireflyIII\Validation\TransactionValidation;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;
@@ -69,7 +66,7 @@ class RecurrenceStoreRequest extends Request
{ {
$validator->after( $validator->after(
function (Validator $validator) { function (Validator $validator) {
$this->validateOneTransaction($validator); $this->validateOneRecurrenceTransaction($validator);
$this->validateOneRepetition($validator); $this->validateOneRepetition($validator);
$this->validateRecurrenceRepetition($validator); $this->validateRecurrenceRepetition($validator);
$this->validateRepetitionMoment($validator); $this->validateRepetitionMoment($validator);

View File

@@ -23,9 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests; namespace FireflyIII\Api\V1\Requests;
use Carbon\Carbon;
use FireflyIII\Rules\BelongsUser;
use FireflyIII\Rules\IsBoolean;
use FireflyIII\Validation\RecurrenceValidation; use FireflyIII\Validation\RecurrenceValidation;
use FireflyIII\Validation\TransactionValidation; use FireflyIII\Validation\TransactionValidation;
use Illuminate\Validation\Validator; use Illuminate\Validation\Validator;

View File

@@ -34,7 +34,6 @@ use FireflyIII\Rules\IsBoolean;
* *
* Technically speaking this class does not have to be extended like this but who knows what the future brings. * Technically speaking this class does not have to be extended like this but who knows what the future brings.
* *
* @codeCoverageIgnore
*/ */
class Request extends FireflyIIIRequest class Request extends FireflyIIIRequest
{ {

View File

@@ -30,6 +30,7 @@ use FireflyIII\Rules\IsBoolean;
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
* Class RuleGroupRequest * Class RuleGroupRequest
* TODO AFTER 4.8.0: split this into two request classes.
*/ */
class RuleGroupRequest extends Request class RuleGroupRequest extends Request
{ {

View File

@@ -30,6 +30,7 @@ use function is_array;
/** /**
* Class RuleRequest * Class RuleRequest
*
*/ */
class RuleRequest extends Request class RuleRequest extends Request
{ {
@@ -80,48 +81,6 @@ class RuleRequest extends Request
return $data; return $data;
} }
/**
* @return array
*/
private function getRuleTriggers(): array
{
$triggers = $this->get('triggers');
$return = [];
if (is_array($triggers)) {
foreach ($triggers as $trigger) {
$return[] = [
'type' => $trigger['type'],
'value' => $trigger['value'],
'active' => $this->convertBoolean((string)($trigger['active'] ?? 'false')),
'stop_processing' => $this->convertBoolean((string)($trigger['stop_processing'] ?? 'false')),
];
}
}
return $return;
}
/**
* @return array
*/
private function getRuleActions(): array
{
$actions = $this->get('actions');
$return = [];
if (is_array($actions)) {
foreach ($actions as $action) {
$return[] = [
'type' => $action['type'],
'value' => $action['value'],
'active' => $this->convertBoolean((string)($action['active'] ?? 'false')),
'stop_processing' => $this->convertBoolean((string)($action['stop_processing'] ?? 'false')),
];
}
}
return $return;
}
/** /**
* The rules that the incoming request must be matched against. * The rules that the incoming request must be matched against.
* *
@@ -203,4 +162,46 @@ class RuleRequest extends Request
$validator->errors()->add('title', (string)trans('validation.at_least_one_action')); $validator->errors()->add('title', (string)trans('validation.at_least_one_action'));
} }
} }
/**
* @return array
*/
private function getRuleTriggers(): array
{
$triggers = $this->get('triggers');
$return = [];
if (is_array($triggers)) {
foreach ($triggers as $trigger) {
$return[] = [
'type' => $trigger['type'],
'value' => $trigger['value'],
'active' => $this->convertBoolean((string)($trigger['active'] ?? 'false')),
'stop_processing' => $this->convertBoolean((string)($trigger['stop_processing'] ?? 'false')),
];
}
}
return $return;
}
/**
* @return array
*/
private function getRuleActions(): array
{
$actions = $this->get('actions');
$return = [];
if (is_array($actions)) {
foreach ($actions as $action) {
$return[] = [
'type' => $action['type'],
'value' => $action['value'],
'active' => $this->convertBoolean((string)($action['active'] ?? 'false')),
'stop_processing' => $this->convertBoolean((string)($action['stop_processing'] ?? 'false')),
];
}
}
return $return;
}
} }

View File

@@ -0,0 +1,143 @@
<?php
/**
* RuleTestRequest.php
* Copyright (c) 2019 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/>.
*/
namespace FireflyIII\Api\V1\Requests;
use Carbon\Carbon;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use Illuminate\Support\Collection;
use Log;
/**
* Class RuleTestRequest
*/
class RuleTestRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* @return array
*/
public function getTestParameters(): array
{
$return = [
'page' => $this->getPage(),
'start_date' => $this->getDate('start_date'),
'end_date' => $this->getDate('end_date'),
'search_limit' => $this->getSearchLimit(),
'trigger_limit' => $this->getTriggerLimit(),
'accounts' => $this->getAccounts(),
];
return $return;
}
/**
* @return array
*/
public function rules(): array
{
return [];
}
/**
* @param string $field
* @return Carbon|null
*/
private function getDate(string $field): ?Carbon
{
/** @var Carbon $result */
$result = null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', $this->query($field));
return $result;
}
/**
* @return int
*/
private function getPage(): int
{
return 0 === (int)$this->query('page') ? 1 : (int)$this->query('page');
}
/**
* @return int
*/
private function getSearchLimit(): int
{
return 0 === (int)$this->query('search_limit') ? (int)config('firefly.test-triggers.limit') : (int)$this->query('search_limit');
}
/**
* @return int
*/
private function getTriggerLimit(): int
{
return 0 === (int)$this->query('triggered_limit') ? (int)config('firefly.test-triggers.range') : (int)$this->query('triggered_limit');
}
/**
* @return Collection
*/
private function getAccounts(): Collection
{
$accountList = '' === (string)$this->query('accounts') ? [] : explode(',', $this->query('accounts'));
$accounts = new Collection;
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
foreach ($accountList as $accountId) {
Log::debug(sprintf('Searching for asset account with id "%s"', $accountId));
$account = $accountRepository->findNull((int)$accountId);
if ($this->validAccount($account)) {
Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name));
$accounts->push($account);
}
}
return $accounts;
}
/**
* @param Account|null $account
* @return bool
*/
private function validAccount(?Account $account): bool
{
return null !== $account && AccountType::ASSET === $account->accountType->type;
}
}

View File

@@ -0,0 +1,115 @@
<?php
/**
* RuleTriggerRequest.php
* Copyright (c) 2019 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/>.
*/
namespace FireflyIII\Api\V1\Requests;
use Carbon\Carbon;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use Illuminate\Support\Collection;
use Log;
/**
* Class RuleTriggerRequest
*/
class RuleTriggerRequest extends Request
{
/**
* Authorize logged in users.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow authenticated users
return auth()->check();
}
/**
* @return array
*/
public function getTriggerParameters(): array
{
$return = [
'start_date' => $this->getDate('start_date'),
'end_date' => $this->getDate('end_date'),
'accounts' => $this->getAccounts(),
];
return $return;
}
/**
* @return array
*/
public function rules(): array
{
return [];
}
/**
* @param string $field
* @return Carbon|null
*/
private function getDate(string $field): ?Carbon
{
/** @var Carbon $result */
$result = null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', $this->query($field));
return $result;
}
/**
* @return Collection
*/
private function getAccounts(): Collection
{
$accountList = '' === (string)$this->query('accounts') ? [] : explode(',', $this->query('accounts'));
$accounts = new Collection;
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
foreach ($accountList as $accountId) {
Log::debug(sprintf('Searching for asset account with id "%s"', $accountId));
$account = $accountRepository->findNull((int)$accountId);
if ($this->validAccount($account)) {
Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name));
$accounts->push($account);
}
}
return $accounts;
}
/**
* @param Account|null $account
* @return bool
*/
private function validAccount(?Account $account): bool
{
return null !== $account && AccountType::ASSET === $account->accountType->type;
}
}

View File

@@ -31,7 +31,7 @@ use FireflyIII\Models\Tag;
* *
* @codeCoverageIgnore * @codeCoverageIgnore
* *
* TODO split in store / update * TODO AFTER 4.8.0: split this into two request classes.
*/ */
class TagRequest extends Request class TagRequest extends Request
{ {

View File

@@ -53,8 +53,6 @@ class TransactionStoreRequest extends Request
/** /**
* Get all data. Is pretty complex because of all the ??-statements. * Get all data. Is pretty complex because of all the ??-statements.
* *
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @return array * @return array
*/ */
public function getAll(): array public function getAll(): array
@@ -67,106 +65,10 @@ class TransactionStoreRequest extends Request
return $data; return $data;
} }
/**
* Get transaction data.
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @return array
*/
private function getTransactionData(): array
{
$return = [];
/**
* @var int $index
* @var array $transaction
*/
foreach ($this->get('transactions') as $index => $transaction) {
$object = new NullArrayObject($transaction);
$return[] = [
'type' => $this->stringFromValue($object['type']),
'date' => $this->dateFromValue($object['date']),
'order' => $this->integerFromValue((string)$object['order']),
'currency_id' => $this->integerFromValue($object['currency_id']),
'currency_code' => $this->stringFromValue($object['currency_code']),
// foreign currency info:
'foreign_currency_id' => $this->integerFromValue((string)$object['foreign_currency_id']),
'foreign_currency_code' => $this->stringFromValue($object['foreign_currency_code']),
// amount and foreign amount. Cannot be 0.
'amount' => $this->stringFromValue((string)$object['amount']),
'foreign_amount' => $this->stringFromValue((string)$object['foreign_amount']),
// description.
'description' => $this->stringFromValue($object['description']),
// source of transaction. If everything is null, assume cash account.
'source_id' => $this->integerFromValue((string)$object['source_id']),
'source_name' => $this->stringFromValue($object['source_name']),
// destination of transaction. If everything is null, assume cash account.
'destination_id' => $this->integerFromValue((string)$object['destination_id']),
'destination_name' => $this->stringFromValue($object['destination_name']),
// budget info
'budget_id' => $this->integerFromValue((string)$object['budget_id']),
'budget_name' => $this->stringFromValue($object['budget_name']),
// category info
'category_id' => $this->integerFromValue((string)$object['category_id']),
'category_name' => $this->stringFromValue($object['category_name']),
// journal bill reference. Optional. Will only work for withdrawals
'bill_id' => $this->integerFromValue((string)$object['bill_id']),
'bill_name' => $this->stringFromValue($object['bill_name']),
// piggy bank reference. Optional. Will only work for transfers
'piggy_bank_id' => $this->integerFromValue((string)$object['piggy_bank_id']),
'piggy_bank_name' => $this->stringFromValue($object['piggy_bank_name']),
// some other interesting properties
'reconciled' => $this->convertBoolean((string)$object['reconciled']),
'notes' => $this->stringFromValue($object['notes']),
'tags' => $this->arrayFromValue($object['tags']),
// all custom fields:
'internal_reference' => $this->stringFromValue($object['internal_reference']),
'external_id' => $this->stringFromValue($object['external_id']),
'original_source' => sprintf('ff3-v%s|api-v%s', config('firefly.version'), config('firefly.api_version')),
'recurrence_id' => $this->integerFromValue($object['recurrence_id']),
'bunq_payment_id' => $this->stringFromValue($object['bunq_payment_id']),
'sepa_cc' => $this->stringFromValue($object['sepa_cc']),
'sepa_ct_op' => $this->stringFromValue($object['sepa_ct_op']),
'sepa_ct_id' => $this->stringFromValue($object['sepa_ct_id']),
'sepa_db' => $this->stringFromValue($object['sepa_db']),
'sepa_country' => $this->stringFromValue($object['sepa_country']),
'sepa_ep' => $this->stringFromValue($object['sepa_ep']),
'sepa_ci' => $this->stringFromValue($object['sepa_ci']),
'sepa_batch_id' => $this->stringFromValue($object['sepa_batch_id']),
// custom date fields. Must be Carbon objects. Presence is optional.
'interest_date' => $this->dateFromValue($object['interest_date']),
'book_date' => $this->dateFromValue($object['book_date']),
'process_date' => $this->dateFromValue($object['process_date']),
'due_date' => $this->dateFromValue($object['due_date']),
'payment_date' => $this->dateFromValue($object['payment_date']),
'invoice_date' => $this->dateFromValue($object['invoice_date']),
];
}
return $return;
}
/** /**
* The rules that the incoming request must be matched against. * The rules that the incoming request must be matched against.
* *
* @return array * @return array
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/ */
public function rules(): array public function rules(): array
{ {
@@ -280,4 +182,97 @@ class TransactionStoreRequest extends Request
} }
); );
} }
/**
* Get transaction data.
*
* @return array
*/
private function getTransactionData(): array
{
$return = [];
/**
* @var int $index
* @var array $transaction
*/
foreach ($this->get('transactions') as $index => $transaction) {
$object = new NullArrayObject($transaction);
$return[] = [
'type' => $this->stringFromValue($object['type']),
'date' => $this->dateFromValue($object['date']),
'order' => $this->integerFromValue((string)$object['order']),
'currency_id' => $this->integerFromValue($object['currency_id']),
'currency_code' => $this->stringFromValue($object['currency_code']),
// foreign currency info:
'foreign_currency_id' => $this->integerFromValue((string)$object['foreign_currency_id']),
'foreign_currency_code' => $this->stringFromValue($object['foreign_currency_code']),
// amount and foreign amount. Cannot be 0.
'amount' => $this->stringFromValue((string)$object['amount']),
'foreign_amount' => $this->stringFromValue((string)$object['foreign_amount']),
// description.
'description' => $this->stringFromValue($object['description']),
// source of transaction. If everything is null, assume cash account.
'source_id' => $this->integerFromValue((string)$object['source_id']),
'source_name' => $this->stringFromValue($object['source_name']),
// destination of transaction. If everything is null, assume cash account.
'destination_id' => $this->integerFromValue((string)$object['destination_id']),
'destination_name' => $this->stringFromValue($object['destination_name']),
// budget info
'budget_id' => $this->integerFromValue((string)$object['budget_id']),
'budget_name' => $this->stringFromValue($object['budget_name']),
// category info
'category_id' => $this->integerFromValue((string)$object['category_id']),
'category_name' => $this->stringFromValue($object['category_name']),
// journal bill reference. Optional. Will only work for withdrawals
'bill_id' => $this->integerFromValue((string)$object['bill_id']),
'bill_name' => $this->stringFromValue($object['bill_name']),
// piggy bank reference. Optional. Will only work for transfers
'piggy_bank_id' => $this->integerFromValue((string)$object['piggy_bank_id']),
'piggy_bank_name' => $this->stringFromValue($object['piggy_bank_name']),
// some other interesting properties
'reconciled' => $this->convertBoolean((string)$object['reconciled']),
'notes' => $this->stringFromValue($object['notes']),
'tags' => $this->arrayFromValue($object['tags']),
// all custom fields:
'internal_reference' => $this->stringFromValue($object['internal_reference']),
'external_id' => $this->stringFromValue($object['external_id']),
'original_source' => sprintf('ff3-v%s|api-v%s', config('firefly.version'), config('firefly.api_version')),
'recurrence_id' => $this->integerFromValue($object['recurrence_id']),
'bunq_payment_id' => $this->stringFromValue($object['bunq_payment_id']),
'sepa_cc' => $this->stringFromValue($object['sepa_cc']),
'sepa_ct_op' => $this->stringFromValue($object['sepa_ct_op']),
'sepa_ct_id' => $this->stringFromValue($object['sepa_ct_id']),
'sepa_db' => $this->stringFromValue($object['sepa_db']),
'sepa_country' => $this->stringFromValue($object['sepa_country']),
'sepa_ep' => $this->stringFromValue($object['sepa_ep']),
'sepa_ci' => $this->stringFromValue($object['sepa_ci']),
'sepa_batch_id' => $this->stringFromValue($object['sepa_batch_id']),
// custom date fields. Must be Carbon objects. Presence is optional.
'interest_date' => $this->dateFromValue($object['interest_date']),
'book_date' => $this->dateFromValue($object['book_date']),
'process_date' => $this->dateFromValue($object['process_date']),
'due_date' => $this->dateFromValue($object['due_date']),
'payment_date' => $this->dateFromValue($object['payment_date']),
'invoice_date' => $this->dateFromValue($object['invoice_date']),
];
}
return $return;
}
} }

View File

@@ -64,8 +64,6 @@ class TransactionUpdateRequest extends Request
/** /**
* Get all data. Is pretty complex because of all the ??-statements. * Get all data. Is pretty complex because of all the ??-statements.
* *
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @return array * @return array
*/ */
public function getAll(): array public function getAll(): array
@@ -141,7 +139,6 @@ class TransactionUpdateRequest extends Request
* The rules that the incoming request must be matched against. * The rules that the incoming request must be matched against.
* *
* @return array * @return array
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/ */
public function rules(): array public function rules(): array
{ {
@@ -274,8 +271,6 @@ class TransactionUpdateRequest extends Request
/** /**
* Get transaction data. * Get transaction data.
* *
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @return array * @return array
*/ */
private function getTransactionData(): array private function getTransactionData(): array

View File

@@ -32,6 +32,7 @@ use FireflyIII\User;
/** /**
* Class UserRequest * Class UserRequest
* @codeCoverageIgnore * @codeCoverageIgnore
* TODO AFTER 4.8.0: split this into two request classes.
*/ */
class UserRequest extends Request class UserRequest extends Request
{ {

View File

@@ -159,6 +159,21 @@ trait TransactionValidation
} }
} }
/**
* Adds an error to the validator when there are no transactions in the array of data.
*
* @param Validator $validator
*/
public function validateOneRecurrenceTransaction(Validator $validator): void
{
$data = $validator->getData();
$transactions = $data['transactions'] ?? [];
// need at least one transaction
if (0 === count($transactions)) {
$validator->errors()->add('description', (string)trans('validation.at_least_one_transaction'));
}
}
/** /**
* All types of splits must be equal. * All types of splits must be equal.
* *

View File

@@ -311,8 +311,8 @@ Route::group(
Route::delete('{rule}', ['uses' => 'RuleController@delete', 'as' => 'delete']); Route::delete('{rule}', ['uses' => 'RuleController@delete', 'as' => 'delete']);
Route::get('{rule}/test', ['uses' => 'RuleController@testRule', 'as' => 'test']); Route::get('{rule}/test', ['uses' => 'RuleController@testRule', 'as' => 'test']);
Route::post('{rule}/trigger', ['uses' => 'RuleController@triggerRule', 'as' => 'trigger']); Route::post('{rule}/trigger', ['uses' => 'RuleController@triggerRule', 'as' => 'trigger']);
Route::post('{rule}/up', ['uses' => 'RuleController@up', 'as' => 'up']); Route::post('{rule}/up', ['uses' => 'RuleController@moveUp', 'as' => 'up']);
Route::post('{rule}/down', ['uses' => 'RuleController@down', 'as' => 'down']); Route::post('{rule}/down', ['uses' => 'RuleController@moveDown', 'as' => 'down']);
} }
); );

View File

@@ -50,6 +50,8 @@ class AccountControllerTest extends TestCase
* Opening balance without date. * Opening balance without date.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
* @throws Exception * @throws Exception
*/ */
public function testStoreInvalidBalance(): void public function testStoreInvalidBalance(): void
@@ -95,10 +97,10 @@ class AccountControllerTest extends TestCase
$transformer->shouldReceive('setParameters')->atLeast()->once(); $transformer->shouldReceive('setParameters')->atLeast()->once();
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn( $transformer->shouldReceive('transform')->atLeast()->once()->andReturn(
[ [
'id' => 1, 'id' => 1,
'attributes' => [ 'attributes' => [
'name' => 'Account' 'name' => 'Account',
] ],
]); ]);
$transformer->shouldReceive('setCurrentScope')->atLeast()->once(); $transformer->shouldReceive('setCurrentScope')->atLeast()->once();
$transformer->shouldReceive('getDefaultIncludes')->atLeast()->once()->andReturn([]); $transformer->shouldReceive('getDefaultIncludes')->atLeast()->once()->andReturn([]);
@@ -116,6 +118,8 @@ class AccountControllerTest extends TestCase
* Send correct data. Should call account repository store method. * Send correct data. Should call account repository store method.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
* @throws Exception * @throws Exception
*/ */
public function testStoreLiability(): void public function testStoreLiability(): void
@@ -162,13 +166,15 @@ class AccountControllerTest extends TestCase
* CC type present when account is a credit card. * CC type present when account is a credit card.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
* @throws Exception * @throws Exception
*/ */
public function testStoreNoCreditCardData(): void public function testStoreNoCreditCardData(): void
{ {
// mock repositories // mock repositories
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(AccountTransformer::class); $this->mock(AccountTransformer::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
@@ -201,6 +207,8 @@ class AccountControllerTest extends TestCase
* No currency information (is allowed). * No currency information (is allowed).
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
* @throws Exception * @throws Exception
*/ */
public function testStoreNoCurrencyInfo(): void public function testStoreNoCurrencyInfo(): void
@@ -238,6 +246,8 @@ class AccountControllerTest extends TestCase
* Name already in use. * Name already in use.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreNotUnique(): void public function testStoreNotUnique(): void
{ {
@@ -277,6 +287,8 @@ class AccountControllerTest extends TestCase
* Send correct data. Should call account repository store method. * Send correct data. Should call account repository store method.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
* @throws Exception * @throws Exception
*/ */
public function testStoreValid(): void public function testStoreValid(): void
@@ -315,6 +327,8 @@ class AccountControllerTest extends TestCase
* Send correct data. Should call account repository store method. * Send correct data. Should call account repository store method.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
* @throws Exception * @throws Exception
*/ */
public function testStoreWithCurrencyCode(): void public function testStoreWithCurrencyCode(): void
@@ -355,6 +369,8 @@ class AccountControllerTest extends TestCase
* 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.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountUpdateRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testUpdate(): void public function testUpdate(): void
{ {
@@ -396,6 +412,8 @@ class AccountControllerTest extends TestCase
* 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.
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountUpdateRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testUpdateCurrencyCode(): void public function testUpdateCurrencyCode(): void
{ {
@@ -437,6 +455,8 @@ class AccountControllerTest extends TestCase
* Update a liability * Update a liability
* *
* @covers \FireflyIII\Api\V1\Controllers\AccountController * @covers \FireflyIII\Api\V1\Controllers\AccountController
* @covers \FireflyIII\Api\V1\Requests\AccountUpdateRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testUpdateLiability(): void public function testUpdateLiability(): void
{ {

View File

@@ -60,6 +60,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreAssetId(): void public function testStoreAssetId(): void
{ {
@@ -125,6 +126,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreAssetName(): void public function testStoreAssetName(): void
{ {
@@ -191,6 +193,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreDeposit(): void public function testStoreDeposit(): void
{ {
@@ -259,6 +262,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreDestinationId(): void public function testStoreDestinationId(): void
{ {
@@ -328,6 +332,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreDestinationName(): void public function testStoreDestinationName(): void
{ {
@@ -397,6 +402,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailBothRepetitions(): void public function testStoreFailBothRepetitions(): void
{ {
@@ -469,6 +475,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailForeignCurrency(): void public function testStoreFailForeignCurrency(): void
{ {
@@ -534,6 +541,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailInvalidDaily(): void public function testStoreFailInvalidDaily(): void
{ {
@@ -599,18 +607,13 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailInvalidDestinationId(): void public function testStoreFailInvalidDestinationId(): void
{ {
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
$assetAccount = $this->getRandomAsset(); $assetAccount = $this->getRandomAsset();
// mock calls to validator: // mock calls to validator:
@@ -621,26 +624,6 @@ class RecurrenceControllerTest extends TestCase
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
//$factory->shouldReceive('setUser')->atLeast()->once();
//$budgetRepos->shouldReceive('setUser')->atLeast()->once();
//$accountRepos->shouldReceive('setUser')->atLeast()->once();
// used by the validator to find the source_id:
// $accountRepos->shouldReceive('getAccountsById')->withArgs([[1]])->once()
// ->andReturn(new Collection([$assetAccount]));
// $accountRepos->shouldReceive('getAccountsById')->withArgs([[$assetAccount->id]])->once()
// ->andReturn(new Collection([$assetAccount]));
//
//
// // entries used by the transformer
// $repository->shouldReceive('getNoteText')->andReturn('Note text')->atLeast()->once();
// $repository->shouldReceive('repetitionDescription')->andReturn('Some description.')->atLeast()->once();
// $repository->shouldReceive('getXOccurrences')->andReturn([])->atLeast()->once();
//
// // entries used by the transformer (the fake entry has a category + a budget):
// $factory->shouldReceive('findOrCreate')->andReturn(null)->atLeast()->once();
// $budgetRepos->shouldReceive('findNull')->andReturn(null)->atLeast()->once();
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -695,32 +678,21 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailInvalidMonthly(): void public function testStoreFailInvalidMonthly(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$factory->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// used by the validator to find the source_id: // mock calls to validator:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[1]])->once() $validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['withdrawal']);
->andReturn(new Collection([$assetAccount])); $validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([1, null])->andReturn(true);
$validator->shouldReceive('validateDestination')->atLeast()->once()->withArgs([null, null])->andReturn(true);
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -771,32 +743,21 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailInvalidNdom(): void public function testStoreFailInvalidNdom(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); // mock calls to validator:
$validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['withdrawal']);
$validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([1, null])->andReturn(true);
$validator->shouldReceive('validateDestination')->atLeast()->once()->withArgs([null, null])->andReturn(true);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$factory->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// used by the validator to find the source_id:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[1]])->once()
->andReturn(new Collection([$assetAccount]));
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -847,32 +808,21 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailInvalidNdomCount(): void public function testStoreFailInvalidNdomCount(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); // mock calls to validator:
$validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['withdrawal']);
$validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([1, null])->andReturn(true);
$validator->shouldReceive('validateDestination')->atLeast()->once()->withArgs([null, null])->andReturn(true);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$factory->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// used by the validator to find the source_id:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[1]])->once()
->andReturn(new Collection([$assetAccount]));
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -923,33 +873,22 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailInvalidNdomHigh(): void public function testStoreFailInvalidNdomHigh(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$factory->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// used by the validator to find the source_id: // mock calls to validator:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[1]])->once() $validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['withdrawal']);
->andReturn(new Collection([$assetAccount])); $validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([1, null])->andReturn(true);
$validator->shouldReceive('validateDestination')->atLeast()->once()->withArgs([null, null])->andReturn(true);
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -1000,33 +939,22 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailInvalidWeekly(): void public function testStoreFailInvalidWeekly(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); // mock calls to validator:
$validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['withdrawal']);
$validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([1, null])->andReturn(true);
$validator->shouldReceive('validateDestination')->atLeast()->once()->withArgs([null, null])->andReturn(true);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$factory->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// used by the validator to find the source_id:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[1]])->once()
->andReturn(new Collection([$assetAccount]));
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -1077,24 +1005,21 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailNoAsset(): void public function testStoreFailNoAsset(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
// mock calls to validator:
$validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['withdrawal']);
$validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([0, null])->andReturn(false);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -1131,8 +1056,11 @@ class RecurrenceControllerTest extends TestCase
'message' => 'The given data was invalid.', 'message' => 'The given data was invalid.',
'errors' => [ 'errors' => [
'transactions.0.source_id' => [ 'transactions.0.source_id' => [
null,
'This value is invalid for this field.', 'This value is invalid for this field.',
'The transactions.0.source_id field is required.', ],
'transactions.0.source_name' => [
null,
], ],
], ],
] ]
@@ -1147,32 +1075,23 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailNotAsset(): void public function testStoreFailNotAsset(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// expense account: // expense account:
$expenseAccount = $this->user()->accounts()->where('account_type_id', 4)->first(); $expenseAccount = $this->getRandomExpense();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// used to find the source_id: // mock calls to validator:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[$expenseAccount->id]])->once() $validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['withdrawal']);
->andReturn(new Collection([$expenseAccount])); $validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([$expenseAccount->id, null])->andReturn(false);
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -1209,7 +1128,10 @@ class RecurrenceControllerTest extends TestCase
'message' => 'The given data was invalid.', 'message' => 'The given data was invalid.',
'errors' => [ 'errors' => [
'transactions.0.source_id' => [ 'transactions.0.source_id' => [
'This value is invalid for this field.', null
],
'transactions.0.source_name' => [
null
], ],
], ],
] ]
@@ -1224,35 +1146,20 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailNotAssetName(): void public function testStoreFailNotAssetName(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// expense account:
$expenseAccount = $this->user()->accounts()->where('account_type_id', 4)->first();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// used to find the source_id: // mock calls to validator:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[0]])->once() $validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['withdrawal']);
->andReturn(new Collection); $validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([0, 'Fake name'])->andReturn(false);
// used to search by name.
$accountRepos->shouldReceive('findByName')->withArgs(['Fake name', [AccountType::ASSET]])->once()
->andReturn(null);
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -1289,11 +1196,12 @@ class RecurrenceControllerTest extends TestCase
[ [
'message' => 'The given data was invalid.', 'message' => 'The given data was invalid.',
'errors' => [ 'errors' => [
'transactions.0.source_id' => [ 'transactions.0.source_id' => [
null,
'This value is invalid for this field.', 'This value is invalid for this field.',
], ],
'transactions.0.source_name' => [ 'transactions.0.source_name' => [
'This value is invalid for this field.', null
], ],
], ],
] ]
@@ -1308,32 +1216,21 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailRepetitions(): void public function testStoreFailRepetitions(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$factory->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// used by the validator to find the source_id: // mock calls to validator:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[1]])->once() $validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['withdrawal']);
->andReturn(new Collection([$assetAccount])); $validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([1, null])->andReturn(true);
$validator->shouldReceive('validateDestination')->atLeast()->once()->withArgs([null, null])->andReturn(true);
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -1376,28 +1273,15 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreFailTransactions(): void public function testStoreFailTransactions(): void
{ {
/** @var Recurrence $recurrence */
$recurrence = $this->user()->recurrences()->first();
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class); $this->mock(AccountValidator::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$factory->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
@@ -1442,6 +1326,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceStoreRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testStoreTransfer(): void public function testStoreTransfer(): void
{ {
@@ -1450,13 +1335,12 @@ class RecurrenceControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class); $transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
$assetAccount = $this->getRandomAsset();
$otherAssetAccount = $this->getRandomAsset($assetAccount->id);
// mock calls to transformer: // mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once(); $transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf(); $transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
@@ -1464,32 +1348,15 @@ class RecurrenceControllerTest extends TestCase
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]); $transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]); $transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first(); // mock calls to validator:
$otherAssetAccount = $this->user()->accounts()->where('account_type_id', 3)->where('id', '!=', $assetAccount->id)->first(); $validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['transfer']);
$validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([$assetAccount->id, null])->andReturn(true);
$validator->shouldReceive('validateDestination')->atLeast()->once()->withArgs([$otherAssetAccount->id, null])->andReturn(true);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$factory->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('store')->once()->andReturn($recurrence); $repository->shouldReceive('store')->once()->andReturn($recurrence);
// used by the validator to find the source_id:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[$assetAccount->id]])->once()->andReturn(new Collection([$assetAccount]));
$accountRepos->shouldReceive('getAccountsById')->withArgs([[$otherAssetAccount->id]])->once()->andReturn(new Collection([$otherAssetAccount]));
// entries used by the transformer
$repository->shouldReceive('getNoteText')->andReturn('Note text')->atLeast()->once();
$repository->shouldReceive('repetitionDescription')->andReturn('Some description.')->atLeast()->once();
$repository->shouldReceive('getXOccurrences')->andReturn([])->atLeast()->once();
// entries used by the transformer (the fake entry has a category + a budget):
$factory->shouldReceive('findOrCreate')->andReturn(null)->atLeast()->once();
$budgetRepos->shouldReceive('findNull')->andReturn(null)->atLeast()->once();
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
$firstDate->addDays(2); $firstDate->addDays(2);
@@ -1531,6 +1398,7 @@ class RecurrenceControllerTest extends TestCase
* *
* @covers \FireflyIII\Api\V1\Controllers\RecurrenceController * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController
* @covers \FireflyIII\Api\V1\Requests\RecurrenceUpdateRequest * @covers \FireflyIII\Api\V1\Requests\RecurrenceUpdateRequest
* @covers \FireflyIII\Api\V1\Requests\Request
*/ */
public function testUpdate(): void public function testUpdate(): void
{ {
@@ -1539,10 +1407,6 @@ class RecurrenceControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(RecurringRepositoryInterface::class); $repository = $this->mock(RecurringRepositoryInterface::class);
$factory = $this->mock(CategoryFactory::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$piggyRepos = $this->mock(PiggyBankRepositoryInterface::class);
$transformer = $this->mock(RecurrenceTransformer::class); $transformer = $this->mock(RecurrenceTransformer::class);
$validator = $this->mock(AccountValidator::class); $validator = $this->mock(AccountValidator::class);
@@ -1553,30 +1417,17 @@ class RecurrenceControllerTest extends TestCase
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]); $transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]); $transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$assetAccount = $this->user()->accounts()->where('account_type_id', 3)->first();
// mock calls to validator:
$validator->shouldReceive('setTransactionType')->atLeast()->once()->withArgs(['deposit']);
$validator->shouldReceive('validateSource')->atLeast()->once()->withArgs([null, 'Some expense account'])->andReturn(true);
$validator->shouldReceive('validateDestination')->atLeast()->once()->withArgs([1, null])->andReturn(true);
// mock calls: // mock calls:
$repository->shouldReceive('setUser')->atLeast()->once(); $repository->shouldReceive('setUser')->atLeast()->once();
$factory->shouldReceive('setUser')->atLeast()->once();
$budgetRepos->shouldReceive('setUser')->atLeast()->once();
$accountRepos->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('update')->once()->andReturn($recurrence); $repository->shouldReceive('update')->once()->andReturn($recurrence);
// used by the validator to find the source_id:
$accountRepos->shouldReceive('getAccountsById')->withArgs([[1]])->once()->andReturn(new Collection([$assetAccount]));
// entries used by the transformer
$repository->shouldReceive('getNoteText')->andReturn('Note text')->atLeast()->once();
$repository->shouldReceive('repetitionDescription')->andReturn('Some description.')->atLeast()->once();
$repository->shouldReceive('getXOccurrences')->andReturn([])->atLeast()->once();
// entries used by the transformer (the fake entry has a category + a budget):
$factory->shouldReceive('findOrCreate')->andReturn(null)->atLeast()->once();
$budgetRepos->shouldReceive('findNull')->andReturn(null)->atLeast()->once();
// data to submit // data to submit
$firstDate = new Carbon; $firstDate = new Carbon;
$firstDate->addDays(2); $firstDate->addDays(2);

View File

@@ -32,6 +32,7 @@ use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\TransactionRules\TransactionMatcher; use FireflyIII\TransactionRules\TransactionMatcher;
use FireflyIII\Transformers\RuleTransformer; use FireflyIII\Transformers\RuleTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\Transformers\TransactionTransformer; use FireflyIII\Transformers\TransactionTransformer;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
@@ -42,6 +43,8 @@ use Tests\TestCase;
/** /**
* *
* Class RuleControllerTest * Class RuleControllerTest
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/ */
class RuleControllerTest extends TestCase class RuleControllerTest extends TestCase
{ {
@@ -102,7 +105,7 @@ class RuleControllerTest extends TestCase
$ruleRepos->shouldReceive('store')->once()->andReturn($rule); $ruleRepos->shouldReceive('store')->once()->andReturn($rule);
// test API // test API
$response = $this->post('/api/v1/rules', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.rules.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(200); $response->assertStatus(200);
} }
@@ -115,11 +118,10 @@ class RuleControllerTest extends TestCase
{ {
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class); $this->mock(RuleTransformer::class);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
$rule = $this->user()->rules()->first();
$data = [ $data = [
'title' => 'Store new rule', 'title' => 'Store new rule',
'rule_group_id' => 1, 'rule_group_id' => 1,
@@ -139,7 +141,7 @@ class RuleControllerTest extends TestCase
]; ];
// test API // test API
$response = $this->post('/api/v1/rules', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.rules.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(422); $response->assertStatus(422);
} }
@@ -151,11 +153,10 @@ class RuleControllerTest extends TestCase
{ {
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class); $this->mock(RuleTransformer::class);
$accountRepos->shouldReceive('setUser')->once(); $accountRepos->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
$rule = $this->user()->rules()->first();
$data = [ $data = [
'title' => 'Store new rule', 'title' => 'Store new rule',
'rule_group_id' => 1, 'rule_group_id' => 1,
@@ -175,7 +176,7 @@ class RuleControllerTest extends TestCase
]; ];
// test API // test API
$response = $this->post('/api/v1/rules', $data, ['Accept' => 'application/json']); $response = $this->post(route('api.v1.rules.store'), $data, ['Accept' => 'application/json']);
$response->assertStatus(422); $response->assertStatus(422);
$response->assertSee(''); $response->assertSee('');
@@ -186,27 +187,23 @@ class RuleControllerTest extends TestCase
*/ */
public function testTestRule(): void public function testTestRule(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
$rule = $this->user()->rules()->first(); $rule = $this->user()->rules()->first();
// mock used classes.
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$matcher = $this->mock(TransactionMatcher::class); $matcher = $this->mock(TransactionMatcher::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class);
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$transformer = $this->mock(TransactionTransformer::class); $transformer = $this->mock(TransactionGroupTransformer::class);
$transformer->shouldReceive('setParameters')->atLeast()->once();
$asset = $this->getRandomAsset(); $asset = $this->getRandomAsset();
$expense= $this->getRandomExpense();
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$ruleRepos->shouldReceive('setUser')->once(); $ruleRepos->shouldReceive('setUser')->once();
$repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset); $repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset);
$repository->shouldReceive('findNull')->withArgs([2])->andReturn($asset); $repository->shouldReceive('findNull')->withArgs([2])->andReturn($expense);
$repository->shouldReceive('findNull')->withArgs([3])->andReturn(null); $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('setRule')->once();
$matcher->shouldReceive('setEndDate')->once(); $matcher->shouldReceive('setEndDate')->once();
@@ -214,7 +211,16 @@ class RuleControllerTest extends TestCase
$matcher->shouldReceive('setSearchLimit')->once(); $matcher->shouldReceive('setSearchLimit')->once();
$matcher->shouldReceive('setTriggeredLimit')->once(); $matcher->shouldReceive('setTriggeredLimit')->once();
$matcher->shouldReceive('setAccounts')->once(); $matcher->shouldReceive('setAccounts')->once();
$matcher->shouldReceive('findTransactionsByRule')->once()->andReturn(new Collection); $matcher->shouldReceive('findTransactionsByRule')->once()->andReturn([[1]]);
// mock calls to transformer:
$transformer->shouldReceive('setParameters')->withAnyArgs()->atLeast()->once();
$transformer->shouldReceive('setCurrentScope')->withAnyArgs()->atLeast()->once()->andReturnSelf();
$transformer->shouldReceive('getDefaultIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('getAvailableIncludes')->withAnyArgs()->atLeast()->once()->andReturn([]);
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(['id' => 5]);
$response = $this->get(route('api.v1.rules.test', [$rule->id]) . '?accounts=1,2,3'); $response = $this->get(route('api.v1.rules.test', [$rule->id]) . '?accounts=1,2,3');
@@ -226,7 +232,9 @@ class RuleControllerTest extends TestCase
*/ */
public function testTriggerRule(): void public function testTriggerRule(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
$rule = $this->user()->rules()->first(); $rule = $this->user()->rules()->first();
$repository = $this->mock(AccountRepositoryInterface::class); $repository = $this->mock(AccountRepositoryInterface::class);
$matcher = $this->mock(TransactionMatcher::class); $matcher = $this->mock(TransactionMatcher::class);
@@ -261,6 +269,9 @@ class RuleControllerTest extends TestCase
*/ */
public function testUpdate(): void public function testUpdate(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
$ruleRepos = $this->mock(RuleRepositoryInterface::class); $ruleRepos = $this->mock(RuleRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$transformer = $this->mock(RuleTransformer::class); $transformer = $this->mock(RuleTransformer::class);

View File

@@ -60,6 +60,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailDescription(): void public function testStoreFailDescription(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
@@ -110,6 +113,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailDestination(): void public function testStoreFailDestination(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
@@ -163,6 +169,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailForeignCurrencyAmount(): void public function testStoreFailForeignCurrencyAmount(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
@@ -214,6 +223,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailForeignCurrencyInfo(): void public function testStoreFailForeignCurrencyInfo(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
@@ -265,6 +277,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailSource(): void public function testStoreFailSource(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
@@ -317,6 +332,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailStoreGroupTitle(): void public function testStoreFailStoreGroupTitle(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
@@ -374,6 +392,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailStoreNoTransactions(): void public function testStoreFailStoreNoTransactions(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock repository // mock repository
$repository = $this->mock(TransactionGroupRepositoryInterface::class); $repository = $this->mock(TransactionGroupRepositoryInterface::class);
$journalRepos = $this->mock(JournalRepositoryInterface::class); $journalRepos = $this->mock(JournalRepositoryInterface::class);
@@ -410,6 +431,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailTypes(): void public function testStoreFailTypes(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
@@ -470,6 +494,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailTypesDeposit(): void public function testStoreFailTypesDeposit(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
@@ -531,6 +558,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreFailTypesTransfer(): void public function testStoreFailTypesTransfer(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
$dest = $this->getRandomAsset($source->id); $dest = $this->getRandomAsset($source->id);
@@ -596,6 +626,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testStoreOK(): void public function testStoreOK(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$source = $this->getRandomAsset(); $source = $this->getRandomAsset();
$group = $this->getRandomWithdrawalGroup(); $group = $this->getRandomWithdrawalGroup();
@@ -677,6 +710,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testUpdateFailBadJournal(): void public function testUpdateFailBadJournal(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$group = $this->getRandomWithdrawalGroup(); $group = $this->getRandomWithdrawalGroup();
@@ -734,6 +770,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testUpdateFailDepositDestination(): void public function testUpdateFailDepositDestination(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$group = $this->getRandomWithdrawalGroup(); $group = $this->getRandomWithdrawalGroup();
@@ -794,6 +833,9 @@ class TransactionControllerTest extends TestCase
*/ */
public function testUpdateFailTransferDestination(): void public function testUpdateFailTransferDestination(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$group = $this->getRandomWithdrawalGroup(); $group = $this->getRandomWithdrawalGroup();
@@ -855,6 +897,8 @@ class TransactionControllerTest extends TestCase
*/ */
public function testUpdateFailTypes(): void public function testUpdateFailTypes(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$group = $this->getRandomWithdrawalGroup(); $group = $this->getRandomWithdrawalGroup();
@@ -913,6 +957,8 @@ class TransactionControllerTest extends TestCase
*/ */
public function testUpdateFailWithdrawalSource(): void public function testUpdateFailWithdrawalSource(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$group = $this->getRandomWithdrawalGroup(); $group = $this->getRandomWithdrawalGroup();
@@ -973,6 +1019,8 @@ class TransactionControllerTest extends TestCase
*/ */
public function testUpdateOK(): void public function testUpdateOK(): void
{ {
$this->markTestIncomplete('Needs to be rewritten for v4.8.0');
return;
// mock data: // mock data:
$group = $this->getRandomWithdrawalGroup(); $group = $this->getRandomWithdrawalGroup();

View File

@@ -228,7 +228,7 @@ abstract class TestCase extends BaseTestCase
TransactionCollectorInterface::class, TransactionCollectorInterface::class,
]; ];
if (in_array($class, $deprecated, true)) { if (in_array($class, $deprecated, true)) {
throw new RuntimeException('Should not be mocking the transaction collector.'); throw new RuntimeException(strtoupper('Must not be mocking the transaction collector or transformer.'));
} }
Log::debug(sprintf('Will now mock %s', $class)); Log::debug(sprintf('Will now mock %s', $class));
$object = Mockery::mock($class); $object = Mockery::mock($class);