Expand test coverage.

This commit is contained in:
James Cole
2019-07-26 17:48:24 +02:00
parent 6ff4a0b45c
commit d94d34ca63
57 changed files with 2243 additions and 1597 deletions

View File

@@ -78,7 +78,7 @@ class ShowController extends Controller
*/ */
public function show(Request $request, Category $category, Carbon $start = null, Carbon $end = null) public function show(Request $request, Category $category, Carbon $start = null, Carbon $end = null)
{ {
Log::debug('Now in show()'); //Log::debug('Now in show()');
/** @var Carbon $start */ /** @var Carbon $start */
$start = $start ?? session('start', Carbon::now()->startOfMonth()); $start = $start ?? session('start', Carbon::now()->startOfMonth());
/** @var Carbon $end */ /** @var Carbon $end */
@@ -104,7 +104,7 @@ class ShowController extends Controller
$groups = $collector->getPaginatedGroups(); $groups = $collector->getPaginatedGroups();
$groups->setPath($path); $groups->setPath($path);
Log::debug('End of show()'); //Log::debug('End of show()');
return view('categories.show', compact('category', 'groups', 'periods', 'subTitle', 'subTitleIcon', 'start', 'end')); return view('categories.show', compact('category', 'groups', 'periods', 'subTitle', 'subTitleIcon', 'start', 'end'));
} }

View File

@@ -77,8 +77,6 @@ class IndexController extends Controller
*/ */
public function create(string $importProvider) public function create(string $importProvider)
{ {
$hasPreReq = (bool)config(sprintf('import.has_prereq.%s', $importProvider)); $hasPreReq = (bool)config(sprintf('import.has_prereq.%s', $importProvider));
$hasConfig = (bool)config(sprintf('import.has_job_config.%s', $importProvider)); $hasConfig = (bool)config(sprintf('import.has_job_config.%s', $importProvider));
$allowedForDemo = (bool)config(sprintf('import.allowed_for_demo.%s', $importProvider)); $allowedForDemo = (bool)config(sprintf('import.allowed_for_demo.%s', $importProvider));
@@ -90,12 +88,13 @@ class IndexController extends Controller
Log::debug(sprintf('Has prerequisites? %s', var_export($hasPreReq, true))); Log::debug(sprintf('Has prerequisites? %s', var_export($hasPreReq, true)));
Log::debug(sprintf('Has config? %s', var_export($hasConfig, true))); Log::debug(sprintf('Has config? %s', var_export($hasConfig, true)));
// @codeCoverageIgnoreStart
if ($isDemoUser && !$allowedForDemo) { if ($isDemoUser && !$allowedForDemo) {
Log::debug('User is demo and this provider doesnt work for demo users.'); Log::debug('User is demo and this provider doesnt work for demo users.');
return redirect(route('import.index')); return redirect(route('import.index'));
} }
// @codeCoverageIgnoreEnd
$importJob = $this->repository->create($importProvider); $importJob = $this->repository->create($importProvider);

View File

@@ -1,341 +0,0 @@
<?php
/**
* JournalFormRequest.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Requests;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionType;
use Illuminate\Validation\Validator;
use Log;
/**
* Class JournalFormRequest.
*/
class JournalFormRequest extends Request
{
/**
* Verify the request.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow logged in users
return auth()->check();
}
/**
* Returns and validates the data required to store a new journal. Can handle both single transaction journals and split journals.
*
* @return array
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function getJournalData(): array
{
$currencyId = $this->integer('amount_currency_id_amount');
$data = [
'type' => $this->get('what'), // type. can be 'deposit', 'withdrawal' or 'transfer'
'date' => $this->date('date'),
'tags' => explode(',', $this->string('tags')),
'user' => auth()->user()->id,
// all custom fields:
'interest_date' => $this->date('interest_date'),
'book_date' => $this->date('book_date'),
'process_date' => $this->date('process_date'),
'due_date' => $this->date('due_date'),
'payment_date' => $this->date('payment_date'),
'invoice_date' => $this->date('invoice_date'),
'internal_reference' => $this->string('internal_reference'),
'notes' => $this->string('notes'),
// journal data:
'description' => $this->string('description'),
'piggy_bank_id' => $this->integer('piggy_bank_id'),
'piggy_bank_name' => null,
'bill_id' => null,
'bill_name' => null,
'original-source' => sprintf('gui-v%s', config('firefly.version')),
// transaction data:
'transactions' => [
[
'currency_id' => null,
'currency_code' => null,
'description' => null,
'amount' => $this->string('amount'),
'budget_id' => $this->integer('budget_id'),
'budget_name' => null,
'category_id' => null,
'category_name' => $this->string('category'),
'source_id' => $this->integer('source_id'),
'source_name' => $this->string('source_name'),
'destination_id' => $this->integer('destination_id'),
'destination_name' => $this->string('destination_name'),
'foreign_currency_id' => null,
'foreign_currency_code' => null,
'foreign_amount' => null,
'reconciled' => false,
'identifier' => 0,
],
],
];
switch (strtolower($data['type'])) {
case 'withdrawal':
$sourceCurrency = $this->integer('source_account_currency');
$data['transactions'][0]['currency_id'] = $sourceCurrency;
$data['transactions'][0]['destination_id'] = null; // clear destination ID (transfer)
if ($sourceCurrency !== $currencyId) {
// user has selected a foreign currency.
$data['transactions'][0]['foreign_currency_id'] = $currencyId;
$data['transactions'][0]['foreign_amount'] = $this->string('amount');
$data['transactions'][0]['amount'] = $this->string('native_amount');
}
break;
case 'deposit':
$destinationCurrency = $this->integer('destination_account_currency');
$data['transactions'][0]['currency_id'] = $destinationCurrency;
$data['transactions'][0]['source_id'] = null; // clear destination ID (transfer)
if ($destinationCurrency !== $currencyId) {
// user has selected a foreign currency.
$data['transactions'][0]['foreign_currency_id'] = $currencyId;
$data['transactions'][0]['foreign_amount'] = $this->string('amount');
$data['transactions'][0]['amount'] = $this->string('native_amount');
}
break;
case 'transfer':
// by default just assume source currency
$sourceCurrency = $this->integer('source_account_currency');
$destinationCurrency = $this->integer('destination_account_currency');
$data['transactions'][0]['currency_id'] = $sourceCurrency;
if ($sourceCurrency !== $destinationCurrency) {
// user has selected a foreign currency.
$data['transactions'][0]['foreign_currency_id'] = $destinationCurrency;
$data['transactions'][0]['foreign_amount'] = $this->string('destination_amount');
$data['transactions'][0]['amount'] = $this->string('source_amount');
}
break;
}
return $data;
}
/**
* Rules for this request.
*
* @return array
* @throws FireflyException
*/
public function rules(): array
{
$what = $this->get('what');
$rules = [
'what' => 'required|in:withdrawal,deposit,transfer',
'date' => 'required|date',
'amount_currency_id_amount' => 'exists:transaction_currencies,id|required',
// then, custom fields:
'interest_date' => 'date|nullable',
'book_date' => 'date|nullable',
'process_date' => 'date|nullable',
'due_date' => 'date|nullable',
'payment_date' => 'date|nullable',
'invoice_date' => 'date|nullable',
'internal_reference' => 'min:1|max:255|nullable',
'notes' => 'min:1|max:50000|nullable',
// and then transaction rules:
'description' => 'required|between:1,255',
'amount' => 'numeric|required|more:0|less:1000000000',
'budget_id' => 'mustExist:budgets,id|belongsToUser:budgets,id|nullable',
'category' => 'between:1,255|nullable',
'source_id' => 'numeric|belongsToUser:accounts,id|nullable',
'source_name' => 'between:1,255|nullable',
'destination_id' => 'numeric|belongsToUser:accounts,id|nullable',
'destination_name' => 'between:1,255|nullable',
'piggy_bank_id' => 'numeric|nullable',
// foreign currency amounts
'native_amount' => 'numeric|more:0|nullable',
'source_amount' => 'numeric|more:0|nullable',
'destination_amount' => 'numeric|more:0|nullable',
];
// some rules get an upgrade depending on the type of data:
$rules = $this->enhanceRules($what, $rules);
return $rules;
}
/**
* Configure the validator instance.
*
* @param Validator $validator
*
* @return void
*/
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator) {
$this->validNativeAmount($validator);
}
);
}
/**
* Inspired by https://www.youtube.com/watch?v=WwnI0RS6J5A.
*
* @param string $what
* @param array $rules
*
* @return array
*
* @throws FireflyException
*/
private function enhanceRules(string $what, array $rules): array
{
switch ($what) {
case strtolower(TransactionType::WITHDRAWAL):
$rules['source_id'] = 'required|exists:accounts,id|belongsToUser:accounts';
$rules['destination_name'] = 'between:1,255|nullable';
break;
case strtolower(TransactionType::DEPOSIT):
$rules['source_name'] = 'between:1,255|nullable';
$rules['destination_id'] = 'required|exists:accounts,id|belongsToUser:accounts';
break;
case strtolower(TransactionType::TRANSFER):
// this may not work:
$rules['source_id'] = 'required|exists:accounts,id|belongsToUser:accounts|different:destination_id';
$rules['destination_id'] = 'required|exists:accounts,id|belongsToUser:accounts|different:source_id';
break;
default:
throw new FireflyException(sprintf('Cannot handle transaction type of type "%s"', $what)); // @codeCoverageIgnore
}
return $rules;
}
/**
* Check if amounts are valid.
*
* @param Validator $validator
*/
private function validNativeAmount(Validator $validator): void
{
$data = $validator->getData();
$type = $data['what'] ?? 'invalid';
Log::debug(sprintf('Type is %s', $type));
if ('withdrawal' === $type) {
$this->validateWithdrawal($validator);
}
// same thing for deposits:
if ('deposit' === $type) {
$this->validateDeposit($validator);
}
// and for transfers
if ('transfer' === $type) {
$this->validateTransfer($validator);
}
}
/**
* Check if deposit amount is valid.
*
* @param Validator $validator
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
private function validateDeposit(Validator $validator): void
{
$data = $validator->getData();
$selectedCurrency = (int)($data['amount_currency_id_amount'] ?? 0);
$accountCurrency = (int)($data['destination_account_currency'] ?? 0);
$nativeAmount = (string)($data['native_amount'] ?? '');
Log::debug('Now in validateDeposit.');
Log::debug(sprintf('SelectedCurrency is "%s", accountCurrency is "%s", native amount is "%s".', $selectedCurrency, $accountCurrency, $nativeAmount));
if ($selectedCurrency !== $accountCurrency && '' === $nativeAmount && 0 !== $selectedCurrency && 0 !== $accountCurrency) {
Log::debug('Adding an error about missing native amount.');
$validator->errors()->add('native_amount', (string)trans('validation.numeric_native'));
return;
}
}
/**
* Check if transfer amount is valid.
*
* @param Validator $validator
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
private function validateTransfer(Validator $validator): void
{
$data = $validator->getData();
$sourceCurrency = (int)($data['source_account_currency'] ?? 0);
$destinationCurrency = (int)($data['destination_account_currency'] ?? 0);
$sourceAmount = (string)($data['source_amount'] ?? '');
$destinationAmount = (string)($data['destination_amount'] ?? '');
Log::debug(sprintf('Source currency is %d, destination currency is %d', $sourceCurrency, $destinationCurrency));
if ($sourceCurrency !== $destinationCurrency && '' === $sourceAmount && 0 !== $sourceCurrency && 0 !== $destinationCurrency) {
$validator->errors()->add('source_amount', (string)trans('validation.numeric_source'));
}
if ($sourceCurrency !== $destinationCurrency && '' === $destinationAmount && 0 !== $sourceCurrency && 0 !== $destinationCurrency) {
$validator->errors()->add('destination_amount', (string)trans('validation.numeric_destination'));
$validator->errors()->add('destination_amount', (string)trans('validation.numeric', ['attribute' => 'destination_amount']));
}
}
/**
* Check if withdrawal amount is valid.
*
* @param Validator $validator
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
private function validateWithdrawal(Validator $validator): void
{
$data = $validator->getData();
$selectedCurrency = (int)($data['amount_currency_id_amount'] ?? 0);
$accountCurrency = (int)($data['source_account_currency'] ?? 0);
Log::debug(sprintf('Selected currency is %d, account currency is %d', $selectedCurrency, $accountCurrency));
$nativeAmount = (string)($data['native_amount'] ?? '');
if ($selectedCurrency !== $accountCurrency && '' === $nativeAmount
&& 0 !== $selectedCurrency
&& 0 !== $accountCurrency
) {
Log::debug('ADD validation error on native_amount');
$validator->errors()->add('native_amount', (string)trans('validation.numeric_native'));
return;
}
}
}

View File

@@ -1,71 +0,0 @@
<?php
/**
* ReconciliationUpdateRequest.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Requests;
/**
* Class ReconciliationUpdateRequest.
*/
class ReconciliationUpdateRequest extends Request
{
/**
* Verify the request.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow logged in users
return auth()->check();
}
/**
* Returns and validates the data required to update a reconciliation.
*
* @return array
*/
public function getJournalData(): array
{
$data = [
'tags' => explode(',', $this->string('tags')),
'amount' => $this->string('amount'),
'category' => $this->string('category'),
];
return $data;
}
/**
* Rules for this request.
*
* @return array
*/
public function rules(): array
{
$rules = [
'amount' => 'numeric|required',
'category' => 'between:1,255|nullable',
];
return $rules;
}
}

View File

@@ -1,180 +0,0 @@
<?php
/**
* SplitJournalFormRequest.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Requests;
use Illuminate\Validation\Validator;
/**
* Class SplitJournalFormRequest.
*/
class SplitJournalFormRequest extends Request
{
/**
* Verify the request.
*
* @return bool
*/
public function authorize(): bool
{
// Only allow logged in users
return auth()->check();
}
/**
* Get all info for the controller.
*
* @return array
*
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function getAll(): array
{
$data = [
'description' => $this->string('journal_description'),
'type' => $this->string('what'),
'date' => $this->date('date'),
'tags' => explode(',', $this->string('tags')),
'bill_id' => null,
'bill_name' => null,
'piggy_bank_id' => null,
'piggy_bank_name' => null,
'notes' => $this->string('notes'),
'transactions' => [],
];
// switch type to get correct source / destination info:
$sourceId = null;
$sourceName = null;
$destinationId = null;
$destinationName = null;
foreach ($this->get('transactions') as $index => $transaction) {
switch ($data['type']) {
case 'withdrawal':
$sourceId = $this->integer('journal_source_id');
$destinationName = $transaction['destination_name'] ?? '';
break;
case 'deposit':
$sourceName = $transaction['source_name'] ?? '';
$destinationId = $this->integer('journal_destination_id');
break;
case 'transfer':
$sourceId = $this->integer('journal_source_id');
$destinationId = $this->integer('journal_destination_id');
break;
}
$foreignAmount = $transaction['foreign_amount'] ?? null;
$foreignCurrencyId = (int)($transaction['foreign_currency_id'] ?? 0.0);
$set = [
'source_id' => $sourceId,
'source_name' => $sourceName,
'destination_id' => $destinationId,
'destination_name' => $destinationName,
'foreign_amount' => $foreignAmount,
'foreign_currency_id' => $foreignCurrencyId,
'foreign_currency_code' => null,
'reconciled' => false,
'identifier' => $index,
'currency_id' => (int)$transaction['currency_id'],
'currency_code' => null,
'description' => $transaction['transaction_description'] ?? '',
'amount' => $transaction['amount'] ?? '',
'budget_id' => (int)($transaction['budget_id'] ?? 0.0),
'budget_name' => null,
'category_id' => null,
'category_name' => $transaction['category_name'] ?? '',
];
$data['transactions'][] = $set;
}
return $data;
}
/**
* Rules for this request.
*
* @return array
*/
public function rules(): array
{
return [
'what' => 'required|in:withdrawal,deposit,transfer',
'journal_description' => 'required|between:1,255',
'id' => 'numeric|belongsToUser:transaction_journals,id',
'journal_source_id' => 'numeric|belongsToUser:accounts,id',
'journal_source_name.*' => 'between:1,255',
'journal_currency_id' => 'required|exists:transaction_currencies,id',
'date' => 'required|date',
'interest_date' => 'date|nullable',
'book_date' => 'date|nullable',
'process_date' => 'date|nullable',
'transactions.*.transaction_description' => 'required|between:1,255',
'transactions.*.destination_id' => 'numeric|belongsToUser:accounts,id',
'transactions.*.destination_name' => 'between:1,255|nullable',
'transactions.*.amount' => 'required|numeric',
'transactions.*.budget_id' => 'belongsToUser:budgets,id',
'transactions.*.category_name' => 'between:1,255|nullable',
'transactions.*.piggy_bank_id' => 'numeric|nullable',
];
}
/**
* Configure the validator instance.
*
* @param Validator $validator
*
* @return void
*/
public function withValidator(Validator $validator): void
{
$validator->after(
function (Validator $validator) {
$this->sameAccounts($validator);
}
);
}
/**
* Verify that source and destination are not the same.
*
* @param Validator $validator
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected function sameAccounts(Validator $validator): void
{
$data = $this->getAll();
$transactions = $data['transactions'] ?? [];
/** @var array $array */
foreach ($transactions as $array) {
if (null !== $array['destination_id'] && null !== $array['source_id'] && $array['destination_id'] === $array['source_id']) {
// @codeCoverageIgnoreStart
$validator->errors()->add('journal_source_id', (string)trans('validation.source_equals_destination'));
$validator->errors()->add('journal_destination_id', (string)trans('validation.source_equals_destination'));
// @codeCoverageIgnoreEnd
}
}
}
}

View File

@@ -39,6 +39,16 @@ class BunqPrerequisites implements PrerequisitesInterface
/** @var User The current user */ /** @var User The current user */
private $user; private $user;
/**
* BunqPrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/** /**
* Returns view name that allows user to fill in prerequisites. * Returns view name that allows user to fill in prerequisites.
* *

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Import\Prerequisites;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\MessageBag; use Illuminate\Support\MessageBag;
use Log;
/** /**
* This class contains all the routines necessary for the fake import provider. * This class contains all the routines necessary for the fake import provider.
@@ -35,6 +36,16 @@ class FakePrerequisites implements PrerequisitesInterface
/** @var User The current user */ /** @var User The current user */
private $user; private $user;
/**
* FakePrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/** /**
* Returns view name that allows user to fill in prerequisites. Currently asks for the API key. * Returns view name that allows user to fill in prerequisites. Currently asks for the API key.
* *

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Import\Prerequisites;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\MessageBag; use Illuminate\Support\MessageBag;
use Log;
/** /**
* *
@@ -33,6 +34,16 @@ use Illuminate\Support\MessageBag;
*/ */
class FilePrerequisites implements PrerequisitesInterface class FilePrerequisites implements PrerequisitesInterface
{ {
/**
* FilePrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/** /**
* Returns view name that allows user to fill in prerequisites. * Returns view name that allows user to fill in prerequisites.
* *

View File

@@ -35,6 +35,16 @@ class SpectrePrerequisites implements PrerequisitesInterface
/** @var User The current user */ /** @var User The current user */
private $user; private $user;
/**
* SpectrePrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/** /**
* Returns view name that allows user to fill in prerequisites. * Returns view name that allows user to fill in prerequisites.
* *

View File

@@ -35,6 +35,16 @@ class YnabPrerequisites implements PrerequisitesInterface
/** @var User The current user */ /** @var User The current user */
private $user; private $user;
/**
* YnabPrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/** /**
* Returns view name that allows user to fill in prerequisites. * Returns view name that allows user to fill in prerequisites.
* *

View File

@@ -67,8 +67,6 @@ class FinTSRoutine implements RoutineInterface
$this->repository->setTransactions($this->importJob, $transactions); $this->repository->setTransactions($this->importJob, $transactions);
$this->repository->setStatus($this->importJob, 'provider_finished'); $this->repository->setStatus($this->importJob, 'provider_finished');
$this->repository->setStage($this->importJob, 'final'); $this->repository->setStage($this->importJob, 'final');
return;
} }
} }
} }

View File

@@ -165,7 +165,7 @@ class AbnAmroDescription implements SpecificInterface
case 'IBAN': case 'IBAN':
$this->row[9] = $value; $this->row[9] = $value;
break; break;
default: default: // @codeCoverageIgnore
// Ignore the rest // Ignore the rest
} }
} }
@@ -224,7 +224,7 @@ class AbnAmroDescription implements SpecificInterface
case 'TRTP': case 'TRTP':
$type = $value; $type = $value;
break; break;
default: default: // @codeCoverageIgnore
// Ignore the rest // Ignore the rest
} }
} }

View File

@@ -111,6 +111,7 @@ class ImportArrayStorage
$count = 0; $count = 0;
foreach ($array as $index => $group) { foreach ($array as $index => $group) {
foreach ($group['transactions'] as $transaction) { foreach ($group['transactions'] as $transaction) {
if (strtolower(TransactionType::TRANSFER) === strtolower($transaction['type'])) { if (strtolower(TransactionType::TRANSFER) === strtolower($transaction['type'])) {
$count++; $count++;
@@ -213,7 +214,7 @@ class ImportArrayStorage
$collection = new Collection; $collection = new Collection;
foreach ($array as $index => $group) { foreach ($array as $index => $group) {
Log::debug(sprintf('Now store #%d', ($index + 1))); Log::debug(sprintf('Now store #%d', $index + 1));
$result = $this->storeGroup($index, $group); $result = $this->storeGroup($index, $group);
if (null !== $result) { if (null !== $result) {
$collection->push($result); $collection->push($result);
@@ -250,6 +251,7 @@ class ImportArrayStorage
// store the group // store the group
try { try {
$newGroup = $this->groupRepos->store($group); $newGroup = $this->groupRepos->store($group);
// @codeCoverageIgnoreStart
} catch (FireflyException $e) { } catch (FireflyException $e) {
Log::error($e->getMessage()); Log::error($e->getMessage());
Log::error($e->getTraceAsString()); Log::error($e->getTraceAsString());
@@ -257,6 +259,7 @@ class ImportArrayStorage
return null; return null;
} }
// @codeCoverageIgnoreEnd
Log::debug(sprintf('Stored as group #%d', $newGroup->id)); Log::debug(sprintf('Stored as group #%d', $newGroup->id));
// add to collection of transfers, if necessary: // add to collection of transfers, if necessary:
@@ -280,6 +283,7 @@ class ImportArrayStorage
*/ */
private function duplicateDetected(int $index, array $group): bool private function duplicateDetected(int $index, array $group): bool
{ {
Log::debug(sprintf('Now in duplicateDetected(%d)', $index));
$transactions = $group['transactions'] ?? []; $transactions = $group['transactions'] ?? [];
foreach ($transactions as $transaction) { foreach ($transactions as $transaction) {
$hash = $this->getHash($transaction); $hash = $this->getHash($transaction);
@@ -387,7 +391,7 @@ class ImportArrayStorage
*/ */
private function transferExists(array $transaction): bool private function transferExists(array $transaction): bool
{ {
Log::debug('Check if transaction is a double transfer.'); Log::debug('transferExists() Check if transaction is a double transfer.');
// how many hits do we need? // how many hits do we need?
Log::debug(sprintf('System has %d existing transfers', count($this->transfers))); Log::debug(sprintf('System has %d existing transfers', count($this->transfers)));
@@ -395,9 +399,11 @@ class ImportArrayStorage
// check if is a transfer // check if is a transfer
if (strtolower(TransactionType::TRANSFER) !== strtolower($transaction['type'])) { if (strtolower(TransactionType::TRANSFER) !== strtolower($transaction['type'])) {
// @codeCoverageIgnoreStart
Log::debug(sprintf('Is a %s, not a transfer so no.', $transaction['type'])); Log::debug(sprintf('Is a %s, not a transfer so no.', $transaction['type']));
return false; return false;
// @codeCoverageIgnoreEnd
} }
@@ -411,7 +417,8 @@ class ImportArrayStorage
} }
// get the description: // get the description:
$description = '' === (string)$transaction['description'] ? $transaction['description'] : $transaction['description']; //$description = '' === (string)$transaction['description'] ? $transaction['description'] : $transaction['description'];
$description = (string)$transaction['description'];
// get the source and destination ID's: // get the source and destination ID's:
$transactionSourceIDs = [(int)$transaction['source_id'], (int)$transaction['destination_id']]; $transactionSourceIDs = [(int)$transaction['source_id'], (int)$transaction['destination_id']];
@@ -467,7 +474,7 @@ class ImportArrayStorage
++$hits; ++$hits;
Log::debug(sprintf('Source IDs are the same! (%d)', $hits)); Log::debug(sprintf('Source IDs are the same! (%d)', $hits));
} }
if ($transactionSourceIDs !== $transactionSourceIDs) { if ($transactionSourceIDs !== $transferSourceIDs) {
Log::debug('Source IDs are not the same.'); Log::debug('Source IDs are not the same.');
} }
unset($transferSourceIDs); unset($transferSourceIDs);
@@ -566,12 +573,14 @@ class ImportArrayStorage
$tagId = $tag->id; $tagId = $tag->id;
foreach ($journalIds as $journalId) { foreach ($journalIds as $journalId) {
Log::debug(sprintf('Linking journal #%d to tag #%d...', $journalId, $tagId)); Log::debug(sprintf('Linking journal #%d to tag #%d...', $journalId, $tagId));
// @codeCoverageIgnoreStart
try { try {
DB::table('tag_transaction_journal')->insert(['transaction_journal_id' => $journalId, 'tag_id' => $tagId]); DB::table('tag_transaction_journal')->insert(['transaction_journal_id' => $journalId, 'tag_id' => $tagId]);
} catch (QueryException $e) { } catch (QueryException $e) {
Log::error(sprintf('Could not link journal #%d to tag #%d because: %s', $journalId, $tagId, $e->getMessage())); Log::error(sprintf('Could not link journal #%d to tag #%d because: %s', $journalId, $tagId, $e->getMessage()));
Log::error($e->getTraceAsString()); Log::error($e->getTraceAsString());
} }
// @codeCoverageIgnoreEnd
} }
Log::info(sprintf('Linked %d journals to tag #%d ("%s")', $collection->count(), $tag->id, $tag->tag)); Log::info(sprintf('Linked %d journals to tag #%d ("%s")', $collection->count(), $tag->id, $tag->tag));
@@ -582,6 +591,8 @@ class ImportArrayStorage
/** /**
* Applies the users rules to the created journals. * Applies the users rules to the created journals.
* *
* TODO this piece of code must be replaced with the rule engine for consistent processing.
* TODO double for-each is terrible.
* @param Collection $collection * @param Collection $collection
* *
*/ */
@@ -589,19 +600,21 @@ class ImportArrayStorage
{ {
$rules = $this->getRules(); $rules = $this->getRules();
if ($rules->count() > 0) { if ($rules->count() > 0) {
foreach ($collection as $journal) { /** @var TransactionGroup $group */
foreach ($collection as $group) {
$rules->each( $rules->each(
function (Rule $rule) use ($journal) { static function (Rule $rule) use ($group) {
Log::debug(sprintf('Going to apply rule #%d to journal %d.', $rule->id, $journal->id)); Log::debug(sprintf('Going to apply rule #%d to group %d.', $rule->id, $group->id));
foreach ($group->transactionJournals as $journal) {
/** @var Processor $processor */ /** @var Processor $processor */
$processor = app(Processor::class); $processor = app(Processor::class);
$processor->make($rule); $processor->make($rule);
$processor->handleTransactionJournal($journal); $processor->handleTransactionJournal($journal);
$journal->refresh(); $journal->refresh();
if ($rule->stop_processing) { if ($rule->stop_processing) {
return false; return false; // @codeCoverageIgnore
}
} }
return true; return true;
} }
); );

View File

@@ -142,6 +142,7 @@ class TransactionJournal extends Model
/** /**
* Checks if tables are joined. * Checks if tables are joined.
* @codeCoverageIgnore
* *
* @param Builder $query * @param Builder $query
* @param string $table * @param string $table
@@ -225,6 +226,7 @@ class TransactionJournal extends Model
} }
/** /**
* @codeCoverageIgnore
* @return bool * @return bool
*/ */
public function isDeposit(): bool public function isDeposit(): bool

View File

@@ -72,10 +72,6 @@ class ImportProvider implements BinderInterface
continue; continue;
} }
// if (false === $isDemoUser && false === $allowedForUser && false === $isDebug) {
// continue;
// }
$providers[$providerName] = [ $providers[$providerName] = [
'has_prereq' => (bool)config('import.has_prereq.' . $providerName), 'has_prereq' => (bool)config('import.has_prereq.' . $providerName),
'allowed_for_demo' => (bool)config(sprintf('import.allowed_for_demo.%s', $providerName)), 'allowed_for_demo' => (bool)config(sprintf('import.allowed_for_demo.%s', $providerName)),
@@ -91,7 +87,7 @@ class ImportProvider implements BinderInterface
} }
$providers[$providerName]['prereq_complete'] = $result; $providers[$providerName]['prereq_complete'] = $result;
} }
Log::debug(sprintf('Enabled providers: %s', json_encode(array_keys($providers)))); //Log::debug(sprintf('Enabled providers: %s', json_encode(array_keys($providers))));
return $providers; return $providers;
} }

View File

@@ -204,32 +204,6 @@ trait GetConfigurationData
return $steps; return $steps;
} }
/**
* Check if forbidden functions are set.
*
* @return bool
*/
protected function hasForbiddenFunctions(): bool // validate system config
{
$list = ['proc_close'];
$forbidden = explode(',', ini_get('disable_functions'));
$trimmed = array_map(
function (string $value) {
return trim($value);
}, $forbidden
);
foreach ($list as $entry) {
if (in_array($entry, $trimmed, true)) {
Log::error('Method "%s" is FORBIDDEN, so the console command cannot be executed.');
return true;
}
}
return false;
}
/** /**
* *
*/ */

View File

@@ -71,130 +71,6 @@ trait ModelInformation
return [$result]; return [$result];
} }
/**
* Get the destination account. Is complex.
*
* @param TransactionJournal $journal
* @param TransactionType $destinationType
* @param array $data
*
* @return Account
*
* @throws FireflyException
*
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected function getDestinationAccount(TransactionJournal $journal, TransactionType $destinationType, array $data
): Account // helper for conversion. Get info from obj.
{
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
/** @var JournalRepositoryInterface $journalRepos */
$journalRepos = app(JournalRepositoryInterface::class);
$sourceAccount = $journalRepos->getJournalSourceAccounts($journal)->first();
$destinationAccount = $journalRepos->getJournalDestinationAccounts($journal)->first();
$sourceType = $journal->transactionType;
$joined = $sourceType->type . '-' . $destinationType->type;
switch ($joined) {
default:
throw new FireflyException('Cannot handle ' . $joined); // @codeCoverageIgnore
case TransactionType::WITHDRAWAL . '-' . TransactionType::DEPOSIT:
// one
$destination = $sourceAccount;
break;
case TransactionType::WITHDRAWAL . '-' . TransactionType::TRANSFER:
// two
$destination = $accountRepository->findNull((int)$data['destination_account_asset']);
break;
case TransactionType::DEPOSIT . '-' . TransactionType::WITHDRAWAL:
case TransactionType::TRANSFER . '-' . TransactionType::WITHDRAWAL:
// three and five
if ('' === $data['destination_account_expense'] || null === $data['destination_account_expense']) {
// destination is a cash account.
return $accountRepository->getCashAccount();
}
$data = [
'name' => $data['destination_account_expense'],
'account_type' => 'expense',
'account_type_id' => null,
'virtual_balance' => 0,
'active' => true,
'iban' => null,
];
$destination = $accountRepository->store($data);
break;
case TransactionType::DEPOSIT . '-' . TransactionType::TRANSFER:
case TransactionType::TRANSFER . '-' . TransactionType::DEPOSIT:
// four and six
$destination = $destinationAccount;
break;
}
return $destination;
}
/**
* Get the source account.
*
* @param TransactionJournal $journal
* @param TransactionType $destinationType
* @param array $data
*
* @return Account
*
* @throws FireflyException
*
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected function getSourceAccount(TransactionJournal $journal, TransactionType $destinationType, array $data
): Account // helper for conversion. Get info from obj.
{
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
/** @var JournalRepositoryInterface $journalRepos */
$journalRepos = app(JournalRepositoryInterface::class);
$sourceAccount = $journalRepos->getJournalSourceAccounts($journal)->first();
$destinationAccount = $journalRepos->getJournalDestinationAccounts($journal)->first();
$sourceType = $journal->transactionType;
$joined = $sourceType->type . '-' . $destinationType->type;
switch ($joined) {
default:
throw new FireflyException('Cannot handle ' . $joined); // @codeCoverageIgnore
case TransactionType::WITHDRAWAL . '-' . TransactionType::DEPOSIT:
case TransactionType::TRANSFER . '-' . TransactionType::DEPOSIT:
if ('' === $data['source_account_revenue'] || null === $data['source_account_revenue']) {
// destination is a cash account.
return $accountRepository->getCashAccount();
}
$data = [
'name' => $data['source_account_revenue'],
'account_type' => 'revenue',
'virtual_balance' => 0,
'active' => true,
'account_type_id' => null,
'iban' => null,
];
$source = $accountRepository->store($data);
break;
case TransactionType::WITHDRAWAL . '-' . TransactionType::TRANSFER:
case TransactionType::TRANSFER . '-' . TransactionType::WITHDRAWAL:
$source = $sourceAccount;
break;
case TransactionType::DEPOSIT . '-' . TransactionType::WITHDRAWAL:
$source = $destinationAccount;
break;
case TransactionType::DEPOSIT . '-' . TransactionType::TRANSFER:
$source = $accountRepository->findNull((int)$data['source_account_asset']);
break;
}
return $source;
}
/** /**
* Create fake triggers to match the bill's properties * Create fake triggers to match the bill's properties
* *
@@ -275,16 +151,4 @@ trait ModelInformation
return $liabilityTypes; return $liabilityTypes;
} }
/**
* Is transaction opening balance?
*
* @param TransactionJournal $journal
*
* @return bool
*/
protected function isOpeningBalance(TransactionJournal $journal): bool
{
return TransactionType::OPENING_BALANCE === $journal->transactionType->type;
}
} }

View File

@@ -489,45 +489,6 @@ trait PeriodOverview
return $entries; return $entries;
} }
/**
* Collect the sum per currency.
*
* @param Collection $collection
*
* @return array
*/
protected function sumPerCurrency(Collection $collection): array // helper for transactions (math, calculations)
{
$return = [];
/** @var Transaction $transaction */
foreach ($collection as $transaction) {
$currencyId = (int)$transaction->transaction_currency_id;
// save currency information:
if (!isset($return[$currencyId])) {
$currencySymbol = $transaction->transaction_currency_symbol;
$decimalPlaces = $transaction->transaction_currency_dp;
$currencyCode = $transaction->transaction_currency_code;
$return[$currencyId] = [
'currency' => [
'id' => $currencyId,
'code' => $currencyCode,
'symbol' => $currencySymbol,
'dp' => $decimalPlaces,
],
'sum' => '0',
'count' => 0,
];
}
// save amount:
$return[$currencyId]['sum'] = bcadd($return[$currencyId]['sum'], $transaction->transaction_amount);
++$return[$currencyId]['count'];
}
asort($return);
return $return;
}
/** /**
* Return only transactions where $account is the source. * Return only transactions where $account is the source.
* @param Account $account * @param Account $account
@@ -552,6 +513,7 @@ trait PeriodOverview
* @param Account $account * @param Account $account
* @param array $journals * @param array $journals
* @return array * @return array
* @codeCoverageIgnore
*/ */
private function filterTransferredIn(Account $account, array $journals): array private function filterTransferredIn(Account $account, array $journals): array
{ {
@@ -591,6 +553,7 @@ trait PeriodOverview
* @param array $journals * @param array $journals
* *
* @return array * @return array
* @codeCoverageIgnore
*/ */
private function groupByCurrency(array $journals): array private function groupByCurrency(array $journals): array
{ {
@@ -635,53 +598,4 @@ trait PeriodOverview
return $return; return $return;
} }
/**
* @param array $journals
* @return array
*/
private function getJournalsSum(array $journals): array
{
$return = [
'count' => 0,
'sums' => [],
];
if (0 === count($journals)) {
return $return;
}
foreach ($journals as $row) {
$return['count']++;
$currencyId = (int)$row['currency_id'];
if (!isset($return['sums'][$currencyId])) {
$return['sums'][$currencyId] = [
'sum' => '0',
'currency_id' => $currencyId,
'currency_code' => $row['currency_code'],
'currency_symbol' => $row['currency_symbol'],
'currency_name' => $row['currency_name'],
'currency_decimal_places' => (int)$row['currency_decimal_places'],
];
}
// add amounts:
$return['sums'][$currencyId]['sum'] = bcadd($return['sums'][$currencyId]['sum'], (string)$row['amount']);
// same but for foreign amounts:
if (null !== $row['foreign_currency_id'] && 0 !== $row['foreign_currency_id']) {
$foreignCurrencyId = (int)$row['foreign_currency_id'];
$return['sums'][$foreignCurrencyId] = [
'sum' => '0',
'currency_id' => $foreignCurrencyId,
'currency_code' => $row['foreign_currency_code'],
'currency_symbol' => $row['foreign_currency_symbol'],
'currency_name' => $row['foreign_currency_name'],
'currency_decimal_places' => (int)$row['foreign_currency_decimal_places'],
];
$return['sums'][$foreignCurrencyId]['sum'] = bcadd($return['sums'][$foreignCurrencyId]['sum'], (string)$row['foreign_amount']);
}
}
return $return;
}
} }

View File

@@ -30,7 +30,6 @@ use FireflyIII\Models\Budget;
use FireflyIII\Models\Rule; use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleAction; use FireflyIII\Models\RuleAction;
use FireflyIII\Models\RuleTrigger; use FireflyIII\Models\RuleTrigger;
use FireflyIII\Models\Tag;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
@@ -64,6 +63,7 @@ trait RenderPartialViews
$set->push($exp); $set->push($exp);
} }
} }
// @codeCoverageIgnoreStart
try { try {
$result = view('reports.options.account', compact('set'))->render(); $result = view('reports.options.account', compact('set'))->render();
} catch (Throwable $e) { } catch (Throwable $e) {
@@ -71,6 +71,8 @@ trait RenderPartialViews
$result = 'Could not render view.'; $result = 'Could not render view.';
} }
// @codeCoverageIgnoreEnd
return $result; return $result;
} }
@@ -94,7 +96,6 @@ trait RenderPartialViews
/** @var PopupReportInterface $popupHelper */ /** @var PopupReportInterface $popupHelper */
$popupHelper = app(PopupReportInterface::class); $popupHelper = app(PopupReportInterface::class);
$budget = $budgetRepository->findNull((int)$attributes['budgetId']); $budget = $budgetRepository->findNull((int)$attributes['budgetId']);
$account = $accountRepository->findNull((int)$attributes['accountId']); $account = $accountRepository->findNull((int)$attributes['accountId']);
@@ -114,12 +115,14 @@ trait RenderPartialViews
// row with tag info. // row with tag info.
return 'Firefly cannot handle this type of info-button (BalanceLine::TagRole)'; return 'Firefly cannot handle this type of info-button (BalanceLine::TagRole)';
} }
// @codeCoverageIgnoreStart
try { try {
$view = view('popup.report.balance-amount', compact('journals', 'budget', 'account'))->render(); $view = view('popup.report.balance-amount', compact('journals', 'budget', 'account'))->render();
} catch (Throwable $e) { } catch (Throwable $e) {
Log::error(sprintf('Could not render: %s', $e->getMessage())); Log::error(sprintf('Could not render: %s', $e->getMessage()));
$view = 'Firefly III could not render the view. Please see the log files.'; $view = 'Firefly III could not render the view. Please see the log files.';
} }
// @codeCoverageIgnoreEnd
return $view; return $view;
} }
@@ -134,6 +137,7 @@ trait RenderPartialViews
/** @var BudgetRepositoryInterface $repository */ /** @var BudgetRepositoryInterface $repository */
$repository = app(BudgetRepositoryInterface::class); $repository = app(BudgetRepositoryInterface::class);
$budgets = $repository->getBudgets(); $budgets = $repository->getBudgets();
// @codeCoverageIgnoreStart
try { try {
$result = view('reports.options.budget', compact('budgets'))->render(); $result = view('reports.options.budget', compact('budgets'))->render();
} catch (Throwable $e) { } catch (Throwable $e) {
@@ -141,6 +145,8 @@ trait RenderPartialViews
$result = 'Could not render view.'; $result = 'Could not render view.';
} }
// @codeCoverageIgnoreEnd
return $result; return $result;
} }
@@ -164,12 +170,14 @@ trait RenderPartialViews
$budget = new Budget; $budget = new Budget;
} }
$journals = $popupHelper->byBudget($budget, $attributes); $journals = $popupHelper->byBudget($budget, $attributes);
// @codeCoverageIgnoreStart
try { try {
$view = view('popup.report.budget-spent-amount', compact('journals', 'budget'))->render(); $view = view('popup.report.budget-spent-amount', compact('journals', 'budget'))->render();
} catch (Throwable $e) { } catch (Throwable $e) {
Log::error(sprintf('Could not render: %s', $e->getMessage())); Log::error(sprintf('Could not render: %s', $e->getMessage()));
$view = 'Firefly III could not render the view. Please see the log files.'; $view = 'Firefly III could not render the view. Please see the log files.';
} }
// @codeCoverageIgnoreEnd
return $view; return $view;
} }
@@ -195,12 +203,14 @@ trait RenderPartialViews
} }
$journals = $popupHelper->byCategory($category, $attributes); $journals = $popupHelper->byCategory($category, $attributes);
// @codeCoverageIgnoreStart
try { try {
$view = view('popup.report.category-entry', compact('journals', 'category'))->render(); $view = view('popup.report.category-entry', compact('journals', 'category'))->render();
} catch (Throwable $e) { } catch (Throwable $e) {
Log::error(sprintf('Could not render: %s', $e->getMessage())); Log::error(sprintf('Could not render: %s', $e->getMessage()));
$view = 'Firefly III could not render the view. Please see the log files.'; $view = 'Firefly III could not render the view. Please see the log files.';
} }
// @codeCoverageIgnoreEnd
return $view; return $view;
} }
@@ -215,6 +225,7 @@ trait RenderPartialViews
/** @var CategoryRepositoryInterface $repository */ /** @var CategoryRepositoryInterface $repository */
$repository = app(CategoryRepositoryInterface::class); $repository = app(CategoryRepositoryInterface::class);
$categories = $repository->getCategories(); $categories = $repository->getCategories();
// @codeCoverageIgnoreStart
try { try {
$result = view('reports.options.category', compact('categories'))->render(); $result = view('reports.options.category', compact('categories'))->render();
} catch (Throwable $e) { } catch (Throwable $e) {
@@ -222,6 +233,8 @@ trait RenderPartialViews
$result = 'Could not render view.'; $result = 'Could not render view.';
} }
// @codeCoverageIgnoreEnd
return $result; return $result;
} }
@@ -247,12 +260,14 @@ trait RenderPartialViews
} }
$journals = $popupHelper->byExpenses($account, $attributes); $journals = $popupHelper->byExpenses($account, $attributes);
// @codeCoverageIgnoreStart
try { try {
$view = view('popup.report.expense-entry', compact('journals', 'account'))->render(); $view = view('popup.report.expense-entry', compact('journals', 'account'))->render();
} catch (Throwable $e) { } catch (Throwable $e) {
Log::error(sprintf('Could not render: %s', $e->getMessage())); Log::error(sprintf('Could not render: %s', $e->getMessage()));
$view = 'Firefly III could not render the view. Please see the log files.'; $view = 'Firefly III could not render the view. Please see the log files.';
} }
// @codeCoverageIgnoreEnd
return $view; return $view;
} }
@@ -357,12 +372,14 @@ trait RenderPartialViews
} }
$journals = $popupHelper->byIncome($account, $attributes); $journals = $popupHelper->byIncome($account, $attributes);
// @codeCoverageIgnoreStart
try { try {
$view = view('popup.report.income-entry', compact('journals', 'account'))->render(); $view = view('popup.report.income-entry', compact('journals', 'account'))->render();
} catch (Throwable $e) { } catch (Throwable $e) {
Log::error(sprintf('Could not render: %s', $e->getMessage())); Log::error(sprintf('Could not render: %s', $e->getMessage()));
$view = 'Firefly III could not render the view. Please see the log files.'; $view = 'Firefly III could not render the view. Please see the log files.';
} }
// @codeCoverageIgnoreEnd
return $view; return $view;
} }
@@ -374,6 +391,7 @@ trait RenderPartialViews
*/ */
protected function noReportOptions(): string // render a view protected function noReportOptions(): string // render a view
{ {
// @codeCoverageIgnoreStart
try { try {
$result = view('reports.options.no-options')->render(); $result = view('reports.options.no-options')->render();
} catch (Throwable $e) { } catch (Throwable $e) {
@@ -381,6 +399,8 @@ trait RenderPartialViews
$result = 'Could not render view.'; $result = 'Could not render view.';
} }
// @codeCoverageIgnoreEnd
return $result; return $result;
} }
@@ -394,6 +414,8 @@ trait RenderPartialViews
/** @var TagRepositoryInterface $repository */ /** @var TagRepositoryInterface $repository */
$repository = app(TagRepositoryInterface::class); $repository = app(TagRepositoryInterface::class);
$tags = $repository->get(); $tags = $repository->get();
// @codeCoverageIgnoreStart
try { try {
$result = view('reports.options.tag', compact('tags'))->render(); $result = view('reports.options.tag', compact('tags'))->render();
} catch (Throwable $e) { } catch (Throwable $e) {
@@ -401,6 +423,8 @@ trait RenderPartialViews
$result = 'Could not render view.'; $result = 'Could not render view.';
} }
// @codeCoverageIgnoreEnd
return $result; return $result;
} }
} }

View File

@@ -117,7 +117,7 @@ trait RequestInformation
return $content; return $content;
} }
return '<p>' . trans('firefly.route_has_no_help') . '</p>'; return '<p>' . trans('firefly.route_has_no_help') . '</p>'; // @codeCoverageIgnore
} }
/** /**
@@ -181,7 +181,7 @@ trait RequestInformation
//Log::debug(sprintf('Check if user has already seen intro with key "%s". Result is %s', $key, var_export($shownDemo, true))); //Log::debug(sprintf('Check if user has already seen intro with key "%s". Result is %s', $key, var_export($shownDemo, true)));
} }
if (!is_bool($shownDemo)) { if (!is_bool($shownDemo)) {
$shownDemo = true; $shownDemo = true; // @codeCoverageIgnore
} }
return $shownDemo; return $shownDemo;
@@ -291,6 +291,7 @@ trait RequestInformation
* @param array $data * @param array $data
* *
* @return ValidatorContract * @return ValidatorContract
* @codeCoverageIgnore
*/ */
protected function validator(array $data): ValidatorContract protected function validator(array $data): ValidatorContract
{ {

View File

@@ -89,7 +89,7 @@ trait RuleManagement
* @param Request $request * @param Request $request
* *
* @return array * @return array
* * @codeCoverageIgnore
*/ */
protected function getPreviousActions(Request $request): array protected function getPreviousActions(Request $request): array
{ {
@@ -123,6 +123,7 @@ trait RuleManagement
* @param Request $request * @param Request $request
* *
* @return array * @return array
* @codeCoverageIgnore
*/ */
protected function getPreviousTriggers(Request $request): array protected function getPreviousTriggers(Request $request): array
{ {

View File

@@ -95,6 +95,7 @@ trait UserNavigation
* @param TransactionJournal $journal * @param TransactionJournal $journal
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
* @codeCoverageIgnore
*/ */
protected function redirectToAccount(TransactionJournal $journal) protected function redirectToAccount(TransactionJournal $journal)
{ {
@@ -118,6 +119,7 @@ trait UserNavigation
* @param Account $account * @param Account $account
* *
* @return RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|\Illuminate\Routing\Redirector
* @codeCoverageIgnore
*/ */
protected function redirectToOriginalAccount(Account $account) protected function redirectToOriginalAccount(Account $account)
{ {

View File

@@ -43,6 +43,8 @@
<directory suffix="Test.php">./tests/Unit/Generator</directory> <directory suffix="Test.php">./tests/Unit/Generator</directory>
<directory suffix="Test.php">./tests/Unit/Handlers</directory> <directory suffix="Test.php">./tests/Unit/Handlers</directory>
<directory suffix="Test.php">./tests/Unit/Helpers</directory> <directory suffix="Test.php">./tests/Unit/Helpers</directory>
<directory suffix="Test.php">./tests/Unit/Middleware</directory>
<directory suffix="Test.php">./tests/Unit/Import</directory>
</testsuite> </testsuite>
<testsuite name="Feature"> <testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory> <directory suffix="Test.php">./tests/Feature</directory>

View File

@@ -43,6 +43,8 @@
<directory suffix="Test.php">./tests/Unit/Generator</directory> <directory suffix="Test.php">./tests/Unit/Generator</directory>
<directory suffix="Test.php">./tests/Unit/Handlers</directory> <directory suffix="Test.php">./tests/Unit/Handlers</directory>
<directory suffix="Test.php">./tests/Unit/Helpers</directory> <directory suffix="Test.php">./tests/Unit/Helpers</directory>
<directory suffix="Test.php">./tests/Unit/Middleware</directory>
<directory suffix="Test.php">./tests/Unit/Import</directory>
</testsuite> </testsuite>
<testsuite name="Feature"> <testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory> <directory suffix="Test.php">./tests/Feature</directory>

View File

@@ -43,6 +43,8 @@
<directory suffix="Test.php">./tests/Unit/Generator</directory> <directory suffix="Test.php">./tests/Unit/Generator</directory>
<directory suffix="Test.php">./tests/Unit/Handlers</directory> <directory suffix="Test.php">./tests/Unit/Handlers</directory>
<directory suffix="Test.php">./tests/Unit/Helpers</directory> <directory suffix="Test.php">./tests/Unit/Helpers</directory>
<directory suffix="Test.php">./tests/Unit/Middleware</directory>
<directory suffix="Test.php">./tests/Unit/Import</directory>
</testsuite> </testsuite>
<testsuite name="Feature"> <testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory> <directory suffix="Test.php">./tests/Feature</directory>

View File

@@ -13,7 +13,7 @@
<p style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:13px;"> <p style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:13px;">
You can find it in your Firefly III installation:<br /> You can find it in your Firefly III installation:<br />
{% for journal in journals %} {% for journal in journals %}
<a href="{{ route('transactions.show', journal.id) }}">{{ journal.description }}</a> ({{ journal|journalTotalAmount }}) <a href="{{ route('transactions.show', journal.id) }}">{{ journal.description }}</a> (AMOUNT TODO)
{% endfor %} {% endfor %}
</p> </p>
{% endif %} {% endif %}
@@ -25,7 +25,7 @@
<ul> <ul>
{% for journal in journals %} {% for journal in journals %}
<li> <li>
<a href="{{ route('transactions.show', journal.id) }}">{{ journal.description }}</a> ({{ journal|journalTotalAmount }}) <a href="{{ route('transactions.show', journal.id) }}">{{ journal.description }}</a> (AMOUNT TODO)
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@@ -10,7 +10,7 @@ Firefly III has created {{ journals.count }} transactions for you.
You can find in in your Firefly III installation: You can find in in your Firefly III installation:
{% for journal in journals %} {% for journal in journals %}
{{ journal.description }}: {{ route('transactions.show', journal.id) }} ({{ journal|journalTotalAmountPlain }}) {{ journal.description }}: {{ route('transactions.show', journal.id) }} (AMOUNT TODO)
{% endfor %} {% endfor %}
{% endif %} {% endif %}
@@ -18,7 +18,7 @@ You can find in in your Firefly III installation:
You can find them in your Firefly III installation: You can find them in your Firefly III installation:
{% for journal in journals %} {% for journal in journals %}
- {{ journal.description }}: {{ route('transactions.show', journal.id) }} ({{ journal|journalTotalAmountPlain }}) - {{ journal.description }}: {{ route('transactions.show', journal.id) }} (AMOUNT TODO)
{% endfor %} {% endfor %}
{% endif %} {% endif %}

View File

@@ -23,7 +23,6 @@ declare(strict_types=1);
use Carbon\Carbon; use Carbon\Carbon;
use DaveJamesMiller\Breadcrumbs\BreadcrumbsGenerator; use DaveJamesMiller\Breadcrumbs\BreadcrumbsGenerator;
use DaveJamesMiller\Breadcrumbs\Exceptions\DuplicateBreadcrumbException; use DaveJamesMiller\Breadcrumbs\Exceptions\DuplicateBreadcrumbException;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\Attachment; use FireflyIII\Models\Attachment;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
@@ -287,7 +286,10 @@ try {
function (BreadcrumbsGenerator $breadcrumbs, Attachment $attachment) { function (BreadcrumbsGenerator $breadcrumbs, Attachment $attachment) {
$object = $attachment->attachable; $object = $attachment->attachable;
if ($object instanceof TransactionJournal) { if ($object instanceof TransactionJournal) {
$breadcrumbs->parent('transactions.show', $object->transactionGroup); $group = $object->transactionGroup;
if (null !== $group) {
$breadcrumbs->parent('transactions.show', [$object->transactionGroup]);
}
$breadcrumbs->push(limitStringLength($attachment->filename), route('attachments.edit', [$attachment])); $breadcrumbs->push(limitStringLength($attachment->filename), route('attachments.edit', [$attachment]));
} }
} }

View File

@@ -173,6 +173,8 @@ class ShowControllerTest extends TestCase
$this->mockDefaultSession(); $this->mockDefaultSession();
// mock calls // mock calls
$pref = new Preference; $pref = new Preference;
$pref->data = 50; $pref->data = 50;

View File

@@ -24,7 +24,6 @@ namespace Tests\Feature\Controllers\Import;
use FireflyIII\Import\Prerequisites\BunqPrerequisites; use FireflyIII\Import\Prerequisites\BunqPrerequisites;
use FireflyIII\Import\Prerequisites\FakePrerequisites; use FireflyIII\Import\Prerequisites\FakePrerequisites;
use FireflyIII\Import\Prerequisites\FilePrerequisites;
use FireflyIII\Import\Prerequisites\SpectrePrerequisites; use FireflyIII\Import\Prerequisites\SpectrePrerequisites;
use FireflyIII\Import\Prerequisites\YnabPrerequisites; use FireflyIII\Import\Prerequisites\YnabPrerequisites;
use FireflyIII\Models\ImportJob; use FireflyIII\Models\ImportJob;
@@ -57,10 +56,11 @@ class IndexControllerTest extends TestCase
*/ */
public function testCreateBadJob(): void public function testCreateBadJob(): void
{ {
$this->mockDefaultSession();
// mock stuff: // mock stuff:
$repository = $this->mock(ImportJobRepositoryInterface::class); $this->mock(ImportJobRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$fakePrerequisites = $this->mock(FakePrerequisites::class);
$bunqPrerequisites = $this->mock(BunqPrerequisites::class); $bunqPrerequisites = $this->mock(BunqPrerequisites::class);
$spectrePrerequisites = $this->mock(SpectrePrerequisites::class); $spectrePrerequisites = $this->mock(SpectrePrerequisites::class);
$ynabPrerequisites = $this->mock(YnabPrerequisites::class); $ynabPrerequisites = $this->mock(YnabPrerequisites::class);
@@ -70,14 +70,13 @@ class IndexControllerTest extends TestCase
$importJob->provider = 'fake'; $importJob->provider = 'fake';
$importJob->key = 'fake_job_1'; $importJob->key = 'fake_job_1';
$this->mockDefaultSession();
// mock calls: // mock calls:
$ynabPrerequisites->shouldReceive('setUser')->once(); $ynabPrerequisites->shouldReceive('setUser')->once();
$fakePrerequisites->shouldReceive('setUser')->once(); //$fakePrerequisites->shouldReceive('setUser')->once();
$bunqPrerequisites->shouldReceive('setUser')->once(); $bunqPrerequisites->shouldReceive('setUser')->once();
$spectrePrerequisites->shouldReceive('setUser')->once(); $spectrePrerequisites->shouldReceive('setUser')->once();
$fakePrerequisites->shouldReceive('isComplete')->once()->andReturn(true); //$fakePrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$bunqPrerequisites->shouldReceive('isComplete')->once()->andReturn(true); $bunqPrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$spectrePrerequisites->shouldReceive('isComplete')->once()->andReturn(true); $spectrePrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$ynabPrerequisites->shouldReceive('isComplete')->once()->andReturn(true); $ynabPrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
@@ -94,13 +93,11 @@ class IndexControllerTest extends TestCase
*/ */
public function testCreateDemoUser(): void public function testCreateDemoUser(): void
{ {
Log::debug(sprintf('Now in test %s', __METHOD__));
// mock stuff: // mock stuff:
$repository = $this->mock(ImportJobRepositoryInterface::class); $this->mock(ImportJobRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$fakePrerequisites = $this->mock(FakePrerequisites::class); $fakePrerequisites = $this->mock(FakePrerequisites::class);
$bunqPrerequisites = $this->mock(BunqPrerequisites::class);
$spectrePrerequisites = $this->mock(SpectrePrerequisites::class);
$ynabPrerequisites = $this->mock(YnabPrerequisites::class);
// fake job: // fake job:
$importJob = new ImportJob; $importJob = new ImportJob;
@@ -110,21 +107,14 @@ class IndexControllerTest extends TestCase
$this->mockDefaultSession(); $this->mockDefaultSession();
// mock calls: // mock calls:
$ynabPrerequisites->shouldReceive('setUser')->times(2); $fakePrerequisites->shouldReceive('setUser')->atLeast()->once();
$fakePrerequisites->shouldReceive('setUser')->times(2); $fakePrerequisites->shouldReceive('isComplete')->atLeast()->once()->andReturn(true);
$bunqPrerequisites->shouldReceive('setUser')->times(2);
$spectrePrerequisites->shouldReceive('setUser')->times(2);
$fakePrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$bunqPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$spectrePrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$ynabPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->andReturn(true)->times(3); $userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->andReturn(true)->atLeast()->once();
$this->be($this->user()); $this->be($this->user());
$response = $this->get(route('import.create', ['spectre'])); $response = $this->get(route('import.create', ['spectre']));
$response->assertStatus(302); $response->assertStatus(404);
$response->assertRedirect(route('import.index'));
} }
/** /**
@@ -136,10 +126,6 @@ class IndexControllerTest extends TestCase
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$fakePrerequisites = $this->mock(FakePrerequisites::class); $fakePrerequisites = $this->mock(FakePrerequisites::class);
$bunqPrerequisites = $this->mock(BunqPrerequisites::class);
$spectrePrerequisites = $this->mock(SpectrePrerequisites::class);
$filePrerequisites = $this->mock(FilePrerequisites::class);
$ynabPrerequisites = $this->mock(YnabPrerequisites::class);
// fake job: // fake job:
$importJob = new ImportJob; $importJob = new ImportJob;
@@ -151,16 +137,6 @@ class IndexControllerTest extends TestCase
// mock calls // mock calls
$userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->andReturn(true)->times(3); $userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->andReturn(true)->times(3);
$bunqPrerequisites->shouldReceive('setUser')->times(2);
$bunqPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(false);
$spectrePrerequisites->shouldReceive('setUser')->times(2);
$spectrePrerequisites->shouldReceive('isComplete')->times(2)->andReturn(false);
$ynabPrerequisites->shouldReceive('setUser')->times(2);
$ynabPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(false);
$repository->shouldReceive('create')->withArgs(['fake'])->andReturn($importJob); $repository->shouldReceive('create')->withArgs(['fake'])->andReturn($importJob);
$fakePrerequisites->shouldReceive('isComplete')->times(3)->andReturn(false); $fakePrerequisites->shouldReceive('isComplete')->times(3)->andReturn(false);
@@ -183,10 +159,6 @@ class IndexControllerTest extends TestCase
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$fakePrerequisites = $this->mock(FakePrerequisites::class); $fakePrerequisites = $this->mock(FakePrerequisites::class);
$bunqPrerequisites = $this->mock(BunqPrerequisites::class);
$spectrePrerequisites = $this->mock(SpectrePrerequisites::class);
$filePrerequisites = $this->mock(FilePrerequisites::class);
$ynabPrerequisites = $this->mock(YnabPrerequisites::class);
// fake job: // fake job:
$importJob = new ImportJob; $importJob = new ImportJob;
@@ -201,14 +173,6 @@ class IndexControllerTest extends TestCase
$fakePrerequisites->shouldReceive('isComplete')->times(3)->andReturn(true); $fakePrerequisites->shouldReceive('isComplete')->times(3)->andReturn(true);
$fakePrerequisites->shouldReceive('setUser')->times(3); $fakePrerequisites->shouldReceive('setUser')->times(3);
$bunqPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$bunqPrerequisites->shouldReceive('setUser')->times(2);
$spectrePrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$spectrePrerequisites->shouldReceive('setUser')->times(2);
$ynabPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$ynabPrerequisites->shouldReceive('setUser')->times(2);
$repository->shouldReceive('create')->withArgs(['fake'])->andReturn($importJob); $repository->shouldReceive('create')->withArgs(['fake'])->andReturn($importJob);
@@ -231,10 +195,8 @@ class IndexControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$fakePrerequisites = $this->mock(FakePrerequisites::class);
$bunqPrerequisites = $this->mock(BunqPrerequisites::class); $bunqPrerequisites = $this->mock(BunqPrerequisites::class);
$spectrePrerequisites = $this->mock(SpectrePrerequisites::class); $spectrePrerequisites = $this->mock(SpectrePrerequisites::class);
$filePrerequisites = $this->mock(FilePrerequisites::class);
$ynabPrerequisites = $this->mock(YnabPrerequisites::class); $ynabPrerequisites = $this->mock(YnabPrerequisites::class);
// fake job: // fake job:
@@ -246,12 +208,12 @@ class IndexControllerTest extends TestCase
$this->mockDefaultSession(); $this->mockDefaultSession();
// mock calls // mock calls
$fakePrerequisites->shouldReceive('setUser')->times(2); //$fakePrerequisites->shouldReceive('setUser')->times(2);
$bunqPrerequisites->shouldReceive('setUser')->times(2); $bunqPrerequisites->shouldReceive('setUser')->times(2);
$spectrePrerequisites->shouldReceive('setUser')->times(2); $spectrePrerequisites->shouldReceive('setUser')->times(2);
$ynabPrerequisites->shouldReceive('setUser')->times(2); $ynabPrerequisites->shouldReceive('setUser')->times(2);
$fakePrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true); //$fakePrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$bunqPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true); $bunqPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$spectrePrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true); $spectrePrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
$ynabPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true); $ynabPrerequisites->shouldReceive('isComplete')->times(2)->andReturn(true);
@@ -276,10 +238,8 @@ class IndexControllerTest extends TestCase
// mock stuff: // mock stuff:
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$fakePrerequisites = $this->mock(FakePrerequisites::class);
$bunqPrerequisites = $this->mock(BunqPrerequisites::class); $bunqPrerequisites = $this->mock(BunqPrerequisites::class);
$spectrePrerequisites = $this->mock(SpectrePrerequisites::class); $spectrePrerequisites = $this->mock(SpectrePrerequisites::class);
$filePrerequisites = $this->mock(FilePrerequisites::class);
$ynabPrerequisites = $this->mock(YnabPrerequisites::class); $ynabPrerequisites = $this->mock(YnabPrerequisites::class);
$this->mockDefaultSession(); $this->mockDefaultSession();
@@ -303,13 +263,13 @@ class IndexControllerTest extends TestCase
$repository->shouldReceive('getConfiguration')->andReturn($fakeConfig)->once(); $repository->shouldReceive('getConfiguration')->andReturn($fakeConfig)->once();
$userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->once()->andReturn(false); $userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->once()->andReturn(false);
$fakePrerequisites->shouldReceive('setUser')->times(1); //$fakePrerequisites->shouldReceive('setUser')->times(1);
$bunqPrerequisites->shouldReceive('setUser')->times(1); $bunqPrerequisites->shouldReceive('setUser')->times(1);
$spectrePrerequisites->shouldReceive('setUser')->times(1); $spectrePrerequisites->shouldReceive('setUser')->times(1);
$ynabPrerequisites->shouldReceive('setUser')->times(1); $ynabPrerequisites->shouldReceive('setUser')->times(1);
//$filePrerequisites->shouldReceive('setUser')->times(1); //$filePrerequisites->shouldReceive('setUser')->times(1);
$fakePrerequisites->shouldReceive('isComplete')->times(1)->andReturn(true); //$fakePrerequisites->shouldReceive('isComplete')->times(1)->andReturn(true);
$bunqPrerequisites->shouldReceive('isComplete')->times(1)->andReturn(true); $bunqPrerequisites->shouldReceive('isComplete')->times(1)->andReturn(true);
$spectrePrerequisites->shouldReceive('isComplete')->times(1)->andReturn(true); $spectrePrerequisites->shouldReceive('isComplete')->times(1)->andReturn(true);
$ynabPrerequisites->shouldReceive('isComplete')->times(1)->andReturn(true); $ynabPrerequisites->shouldReceive('isComplete')->times(1)->andReturn(true);
@@ -330,12 +290,10 @@ class IndexControllerTest extends TestCase
// fake stuff: // fake stuff:
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$fakePrerequisites = $this->mock(FakePrerequisites::class);
$bunqPrerequisites = $this->mock(BunqPrerequisites::class); $bunqPrerequisites = $this->mock(BunqPrerequisites::class);
$spectrePrerequisites = $this->mock(SpectrePrerequisites::class); $spectrePrerequisites = $this->mock(SpectrePrerequisites::class);
$filePrerequisites = $this->mock(FilePrerequisites::class);
$ynabPrerequisites = $this->mock(YnabPrerequisites::class); $ynabPrerequisites = $this->mock(YnabPrerequisites::class);
$repository = $this->mock(ImportJobRepositoryInterface::class); $this->mock(ImportJobRepositoryInterface::class);
$this->mockDefaultSession(); $this->mockDefaultSession();
@@ -343,12 +301,12 @@ class IndexControllerTest extends TestCase
$userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->andReturn(false); $userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->andReturn(false);
$userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(false); $userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(false);
$fakePrerequisites->shouldReceive('setUser')->once(); //$fakePrerequisites->shouldReceive('setUser')->once();
$bunqPrerequisites->shouldReceive('setUser')->once(); $bunqPrerequisites->shouldReceive('setUser')->once();
$spectrePrerequisites->shouldReceive('setUser')->once(); $spectrePrerequisites->shouldReceive('setUser')->once();
$ynabPrerequisites->shouldReceive('setUser')->once(); $ynabPrerequisites->shouldReceive('setUser')->once();
$fakePrerequisites->shouldReceive('isComplete')->once()->andReturn(true); //$fakePrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$bunqPrerequisites->shouldReceive('isComplete')->once()->andReturn(true); $bunqPrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$spectrePrerequisites->shouldReceive('isComplete')->once()->andReturn(true); $spectrePrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$ynabPrerequisites->shouldReceive('isComplete')->once()->andReturn(true); $ynabPrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
@@ -367,26 +325,14 @@ class IndexControllerTest extends TestCase
// fake stuff: // fake stuff:
$fakePrerequisites = $this->mock(FakePrerequisites::class); $fakePrerequisites = $this->mock(FakePrerequisites::class);
$bunqPrerequisites = $this->mock(BunqPrerequisites::class);
$spectrePrerequisites = $this->mock(SpectrePrerequisites::class);
$filePrerequisites = $this->mock(FilePrerequisites::class);
$userRepository = $this->mock(UserRepositoryInterface::class); $userRepository = $this->mock(UserRepositoryInterface::class);
$ynabPrerequisites = $this->mock(YnabPrerequisites::class); $this->mock(ImportJobRepositoryInterface::class);
$repository = $this->mock(ImportJobRepositoryInterface::class);
$this->mockDefaultSession(); $this->mockDefaultSession();
// call methods: // call methods:
$fakePrerequisites->shouldReceive('setUser')->once(); $fakePrerequisites->shouldReceive('setUser')->once();
$bunqPrerequisites->shouldReceive('setUser')->once();
$spectrePrerequisites->shouldReceive('setUser')->once();
$ynabPrerequisites->shouldReceive('setUser')->once();
$fakePrerequisites->shouldReceive('isComplete')->once()->andReturn(true); $fakePrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$bunqPrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$spectrePrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$ynabPrerequisites->shouldReceive('isComplete')->once()->andReturn(true);
$userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->andReturn(true); $userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->andReturn(true);
$userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(false); $userRepository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(false);

View File

@@ -115,7 +115,7 @@ class JobStatusControllerTest extends TestCase
{ {
$importRepos = $this->mock(ImportJobRepositoryInterface::class); $importRepos = $this->mock(ImportJobRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$tag = $this->user()->tags()->first(); $tag = $this->getRandomTag();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'Cfake_job_' . $this->randomInt(); $job->key = 'Cfake_job_' . $this->randomInt();
@@ -127,7 +127,6 @@ class JobStatusControllerTest extends TestCase
$job->save(); $job->save();
$this->mockDefaultSession(); $this->mockDefaultSession();
$importRepos->shouldReceive('countTransactions')->once()->andReturn(0); $importRepos->shouldReceive('countTransactions')->once()->andReturn(0);
// call thing. // call thing.

View File

@@ -22,7 +22,10 @@ declare(strict_types=1);
namespace Tests\Feature\Controllers\Import; namespace Tests\Feature\Controllers\Import;
use FireflyIII\Import\Prerequisites\BunqPrerequisites;
use FireflyIII\Import\Prerequisites\FakePrerequisites; use FireflyIII\Import\Prerequisites\FakePrerequisites;
use FireflyIII\Import\Prerequisites\SpectrePrerequisites;
use FireflyIII\Import\Prerequisites\YnabPrerequisites;
use FireflyIII\Models\ImportJob; use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
@@ -57,9 +60,13 @@ class PrerequisitesControllerTest extends TestCase
{ {
$this->mockDefaultSession(); $this->mockDefaultSession();
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$prereq = $this->mock(FakePrerequisites::class); $prereq = $this->mock(BunqPrerequisites::class);
$this->mock(ImportJobRepositoryInterface::class); $this->mock(ImportJobRepositoryInterface::class);
// mock some prerequisites:
$spectrePrereq = $this->mock(SpectrePrerequisites::class);
$ynabPrereq = $this->mock(YnabPrerequisites::class);
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'A_pre_job_' . $this->randomInt(); $job->key = 'A_pre_job_' . $this->randomInt();
@@ -69,23 +76,25 @@ class PrerequisitesControllerTest extends TestCase
$job->file_type = ''; $job->file_type = '';
$job->save(); $job->save();
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'bunq_api_key', null])->andReturnNull(); $prereq->shouldReceive('setUser')->atLeast()->once();
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'spectre_app_id', null])->andReturnNull(); $spectrePrereq->shouldReceive('setUser')->atLeast()->once();
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'ynab_client_id', null])->andReturnNull(); $ynabPrereq->shouldReceive('setUser')->atLeast()->once();
$prereq->shouldReceive('isComplete')->andReturn(false)->atLeast()->once();
$spectrePrereq->shouldReceive('isComplete')->andReturn(false)->atLeast()->once();
$ynabPrereq->shouldReceive('isComplete')->andReturn(false)->atLeast()->once();
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true);
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false);
$prereq->shouldReceive('setUser')->times(2);
$prereq->shouldReceive('isComplete')->times(2)->andReturn(false);
$prereq->shouldReceive('getView')->once()->andReturn('import.fake.prerequisites'); $prereq->shouldReceive('getView')->once()->andReturn('import.fake.prerequisites');
$prereq->shouldReceive('getViewParameters')->once()->andReturn(['api_key' => '']); $prereq->shouldReceive('getViewParameters')->once()->andReturn(['api_key' => '']);
$this->be($this->user()); $this->be($this->user());
$response = $this->get(route('import.prerequisites.index', ['fake', $job->key])); $response = $this->get(route('import.prerequisites.index', ['bunq', $job->key]));
$response->assertStatus(200); $response->assertStatus(200);
} }
@@ -99,6 +108,10 @@ class PrerequisitesControllerTest extends TestCase
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$this->mock(ImportJobRepositoryInterface::class); $this->mock(ImportJobRepositoryInterface::class);
// mock some prerequisites:
$bunqPrereq = $this->mock(BunqPrerequisites::class);
$spectrePrereq = $this->mock(SpectrePrerequisites::class);
$ynabPrereq = $this->mock(YnabPrerequisites::class);
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
@@ -109,16 +122,20 @@ class PrerequisitesControllerTest extends TestCase
$job->file_type = ''; $job->file_type = '';
$job->save(); $job->save();
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'bunq_api_key', null])->andReturnNull(); // fake calls to prereq classes
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'spectre_app_id', null])->andReturnNull(); $bunqPrereq->shouldReceive('setUser')->atLeast()->once();
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'ynab_client_id', null])->andReturnNull(); $spectrePrereq->shouldReceive('setUser')->atLeast()->once();
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'fake_api_key', null])->andReturnNull(); $ynabPrereq->shouldReceive('setUser')->atLeast()->once();
$bunqPrereq->shouldReceive('isComplete')->andReturn(false)->atLeast()->once();
$spectrePrereq->shouldReceive('isComplete')->andReturn(false)->atLeast()->once();
$ynabPrereq->shouldReceive('isComplete')->andReturn(false)->atLeast()->once();
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false);
$this->be($this->user()); $this->be($this->user());
$response = $this->get(route('import.prerequisites.index', ['fake', $job->key])); $response = $this->get(route('import.prerequisites.index', ['bunq', $job->key]));
$response->assertStatus(302); $response->assertStatus(302);
$response->assertRedirect(route('import.index')); $response->assertRedirect(route('import.index'));
} }
@@ -130,29 +147,39 @@ class PrerequisitesControllerTest extends TestCase
{ {
$this->mockDefaultSession(); $this->mockDefaultSession();
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$prereq = $this->mock(FakePrerequisites::class);
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'bunq_api_key', null])->andReturnNull(); // mock some prerequisites:
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'spectre_app_id', null])->andReturnNull(); $bunqPrereq = $this->mock(BunqPrerequisites::class);
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'ynab_client_id', null])->andReturnNull(); $spectrePrereq = $this->mock(SpectrePrerequisites::class);
$ynabPrereq = $this->mock(YnabPrerequisites::class);
// fake calls to prereq classes
$bunqPrereq->shouldReceive('setUser')->atLeast()->once();
$spectrePrereq->shouldReceive('setUser')->atLeast()->once();
$ynabPrereq->shouldReceive('setUser')->atLeast()->once();
$bunqPrereq->shouldReceive('isComplete')->andReturn(true)->atLeast()->once();
$spectrePrereq->shouldReceive('isComplete')->andReturn(false)->atLeast()->once();
$ynabPrereq->shouldReceive('isComplete')->andReturn(false)->atLeast()->once();
//Preferences::shouldReceive('setForUser')->withArgs([Mockery::any(),'x','x'])->atLeast()->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'C_pre_job_' . $this->randomInt(); $job->key = 'C_pre_job_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->provider = 'fake'; $job->provider = 'bunq';
$job->transactions = []; $job->transactions = [];
$job->file_type = ''; $job->file_type = '';
$job->save(); $job->save();
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false);
$repository->shouldReceive('setStatus')->once()->withArgs([Mockery::any(), 'has_prereq']); $repository->shouldReceive('setStatus')->once()->withArgs([Mockery::any(), 'has_prereq']);
$prereq->shouldReceive('setUser')->times(2);
$prereq->shouldReceive('isComplete')->times(2)->andReturn(true);
$this->be($this->user()); $this->be($this->user());
$response = $this->get(route('import.prerequisites.index', ['fake', $job->key])); $response = $this->get(route('import.prerequisites.index', ['bunq', $job->key]));
$response->assertStatus(302); $response->assertStatus(302);
$response->assertRedirect(route('import.job.configuration.index', [$job->key])); $response->assertRedirect(route('import.job.configuration.index', [$job->key]));
@@ -167,13 +194,23 @@ class PrerequisitesControllerTest extends TestCase
{ {
$this->mockDefaultSession(); $this->mockDefaultSession();
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$prereq = $this->mock(FakePrerequisites::class);
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'bunq_api_key', null])->andReturnNull(); // mock some prerequisites:
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'spectre_app_id', null])->andReturnNull(); $bunqPrereq = $this->mock(BunqPrerequisites::class);
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'ynab_client_id', null])->andReturnNull(); $spectrePrereq = $this->mock(SpectrePrerequisites::class);
//Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(),'fake_api_key',null])->andReturnNull(); $ynabPrereq = $this->mock(YnabPrerequisites::class);
// fake calls to prereq classes
$bunqPrereq->shouldReceive('setUser')->atLeast()->once();
$spectrePrereq->shouldReceive('setUser')->atLeast()->once();
$ynabPrereq->shouldReceive('setUser')->atLeast()->once();
$bunqPrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$spectrePrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$ynabPrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$bunqPrereq->shouldReceive('storePrerequisites')->atLeast()->once()->andReturn(new MessageBag);
$job = new ImportJob; $job = new ImportJob;
@@ -186,13 +223,13 @@ class PrerequisitesControllerTest extends TestCase
$job->save(); $job->save();
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false);
$prereq->shouldReceive('setUser')->times(2); //$prereq->shouldReceive('setUser')->times(2);
$prereq->shouldReceive('storePrerequisites')->once()->andReturn(new MessageBag); //$prereq->shouldReceive('storePrerequisites')->once()->andReturn(new MessageBag);
$repository->shouldReceive('setStatus')->once()->withArgs([Mockery::any(), 'has_prereq']); $repository->shouldReceive('setStatus')->once()->withArgs([Mockery::any(), 'has_prereq']);
$prereq->shouldReceive('isComplete')->times(1)->andReturn(false);
$this->be($this->user()); $this->be($this->user());
$response = $this->post(route('import.prerequisites.post', ['fake', $job->key])); $response = $this->post(route('import.prerequisites.post', ['bunq', $job->key]));
$response->assertStatus(302); $response->assertStatus(302);
$response->assertRedirect(route('import.job.configuration.index', [$job->key])); $response->assertRedirect(route('import.job.configuration.index', [$job->key]));
} }
@@ -209,25 +246,37 @@ class PrerequisitesControllerTest extends TestCase
$prereq = $this->mock(FakePrerequisites::class); $prereq = $this->mock(FakePrerequisites::class);
$this->mock(ImportJobRepositoryInterface::class); $this->mock(ImportJobRepositoryInterface::class);
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'bunq_api_key', null])->andReturnNull(); // mock some prerequisites:
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'spectre_app_id', null])->andReturnNull(); $bunqPrereq = $this->mock(BunqPrerequisites::class);
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'ynab_client_id', null])->andReturnNull(); $spectrePrereq = $this->mock(SpectrePrerequisites::class);
$ynabPrereq = $this->mock(YnabPrerequisites::class);
// fake calls to prereq classes
$bunqPrereq->shouldReceive('setUser')->atLeast()->once();
$spectrePrereq->shouldReceive('setUser')->atLeast()->once();
$ynabPrereq->shouldReceive('setUser')->atLeast()->once();
$bunqPrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$spectrePrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$ynabPrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
//Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'bunq_api_key', null])->andReturnNull();
//Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'spectre_app_id', null])->andReturnNull();
//Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'ynab_client_id', null])->andReturnNull();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'D_pre_job_' . $this->randomInt(); $job->key = 'D_pre_job_' . $this->randomInt();
$job->status = 'badstate'; $job->status = 'badstate';
$job->provider = 'fake'; $job->provider = 'bunq';
$job->transactions = []; $job->transactions = [];
$job->file_type = ''; $job->file_type = '';
$job->save(); $job->save();
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false);
$prereq->shouldReceive('setUser')->times(1);
$prereq->shouldReceive('isComplete')->times(1)->andReturn(false);
$this->be($this->user()); $this->be($this->user());
$response = $this->post(route('import.prerequisites.post', ['fake', $job->key])); $response = $this->post(route('import.prerequisites.post', ['bunq', $job->key]));
$response->assertStatus(302); $response->assertStatus(302);
$response->assertRedirect(route('import.index')); $response->assertRedirect(route('import.index'));
$response->assertSessionHas('error', 'To access this page, your import job cannot have status "badstate".'); $response->assertSessionHas('error', 'To access this page, your import job cannot have status "badstate".');
@@ -242,23 +291,28 @@ class PrerequisitesControllerTest extends TestCase
{ {
$this->mockDefaultSession(); $this->mockDefaultSession();
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$prereq = $this->mock(FakePrerequisites::class);
$this->mock(ImportJobRepositoryInterface::class); $this->mock(ImportJobRepositoryInterface::class);
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'bunq_api_key', null])->andReturnNull(); // mock some prerequisites:
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'spectre_app_id', null])->andReturnNull(); $bunqPrereq = $this->mock(BunqPrerequisites::class);
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'ynab_client_id', null])->andReturnNull(); $spectrePrereq = $this->mock(SpectrePrerequisites::class);
$ynabPrereq = $this->mock(YnabPrerequisites::class);
// fake calls to prereq classes
$bunqPrereq->shouldReceive('setUser')->atLeast()->once();
$spectrePrereq->shouldReceive('setUser')->atLeast()->once();
$ynabPrereq->shouldReceive('setUser')->atLeast()->once();
$bunqPrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$spectrePrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$ynabPrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$bunqPrereq->shouldReceive('storePrerequisites')->atLeast()->once()->andReturn(new MessageBag);
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false);
$prereq->shouldReceive('setUser')->once();
$prereq->shouldReceive('storePrerequisites')->once()->andReturn(new MessageBag);
$prereq->shouldReceive('setUser')->times(1);
$prereq->shouldReceive('isComplete')->times(1)->andReturn(false);
$this->be($this->user()); $this->be($this->user());
$response = $this->post(route('import.prerequisites.post', ['fake'])); $response = $this->post(route('import.prerequisites.post', ['bunq']));
$response->assertStatus(302); $response->assertStatus(302);
$response->assertRedirect(route('import.index')); $response->assertRedirect(route('import.index'));
} }
@@ -275,16 +329,11 @@ class PrerequisitesControllerTest extends TestCase
$prereq = $this->mock(FakePrerequisites::class); $prereq = $this->mock(FakePrerequisites::class);
$this->mock(ImportJobRepositoryInterface::class); $this->mock(ImportJobRepositoryInterface::class);
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'bunq_api_key', null])->andReturnNull();
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'spectre_app_id', null])->andReturnNull();
Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(), 'ynab_client_id', null])->andReturnNull();
//Preferences::shouldReceive('getForUser')->atLeast()->once()->withArgs([Mockery::any(),'fake_api_key',null])->andReturnNull();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'D_pre_job_' . $this->randomInt(); $job->key = 'D_pre_job_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->provider = 'fake'; $job->provider = 'bunq';
$job->transactions = []; $job->transactions = [];
$job->file_type = ''; $job->file_type = '';
$job->save(); $job->save();
@@ -293,16 +342,30 @@ class PrerequisitesControllerTest extends TestCase
$messages->add('some', 'message'); $messages->add('some', 'message');
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'demo'])->atLeast()->once()->andReturn(false);
$prereq->shouldReceive('setUser')->times(1);
$prereq->shouldReceive('isComplete')->times(1)->andReturn(false);
$prereq->shouldReceive('setUser')->once(); // mock some prerequisites:
$prereq->shouldReceive('storePrerequisites')->once()->andReturn($messages); $bunqPrereq = $this->mock(BunqPrerequisites::class);
$spectrePrereq = $this->mock(SpectrePrerequisites::class);
$ynabPrereq = $this->mock(YnabPrerequisites::class);
// fake calls to prereq classes
$bunqPrereq->shouldReceive('setUser')->atLeast()->once();
$spectrePrereq->shouldReceive('setUser')->atLeast()->once();
$ynabPrereq->shouldReceive('setUser')->atLeast()->once();
$bunqPrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$spectrePrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$ynabPrereq->shouldReceive('isComplete')->atLeast()->once()->andReturn(false);
$bunqPrereq->shouldReceive('storePrerequisites')->atLeast()->once()->andReturn($messages);
$this->be($this->user()); $this->be($this->user());
$response = $this->post(route('import.prerequisites.post', ['fake', $job->key])); $response = $this->post(route('import.prerequisites.post', ['bunq', $job->key]));
$response->assertStatus(302); $response->assertStatus(302);
$response->assertRedirect(route('import.prerequisites.index', ['fake', $job->key])); $response->assertRedirect(route('import.prerequisites.index', ['bunq', $job->key]));
$response->assertSessionHas('error', 'message'); $response->assertSessionHas('error', 'message');
} }
} }

View File

@@ -252,6 +252,43 @@ class BoxControllerTest extends TestCase
$response->assertStatus(200); $response->assertStatus(200);
} }
/**
* @covers \FireflyIII\Http\Controllers\Json\BoxController
*/
public function testNetWorthPast(): void
{
$this->mockDefaultSession();
$result = [
[
'currency' => TransactionCurrency::find(1),
'balance' => '3',
],
];
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$currencyRepos = $this->mock(CurrencyRepositoryInterface::class);
Amount::shouldReceive('formatAnything')->andReturn('-100');
$netWorthHelper = $this->mock(NetWorthInterface::class);
$netWorthHelper->shouldReceive('setUser')->once();
$netWorthHelper->shouldReceive('getNetWorthByCurrency')->once()->andReturn($result);
$accountRepos->shouldReceive('getActiveAccountsByType')->andReturn(new Collection([$this->user()->accounts()->first()]));
$currencyRepos->shouldReceive('findNull')->andReturn(TransactionCurrency::find(1));
$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1');
$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('ccAsset');
$accountRepos->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn('1');
$start = new Carbon;
$start->subMonths(6)->startOfMonth();
$end = clone $start;
$end->endOfMonth();
$this->session(['start' => $start, 'end' => $end]);
$this->be($this->user());
$response = $this->get(route('json.box.net-worth'));
$response->assertStatus(200);
}
/** /**
* @covers \FireflyIII\Http\Controllers\Json\BoxController * @covers \FireflyIII\Http\Controllers\Json\BoxController
*/ */

View File

@@ -25,7 +25,6 @@ namespace Tests\Feature\Controllers\Popup;
use Amount; use Amount;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Helpers\Report\PopupReportInterface; use FireflyIII\Helpers\Report\PopupReportInterface;
use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
@@ -76,6 +75,8 @@ class ReportControllerTest extends TestCase
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee('Firefly III cannot handle'); $response->assertSee('Firefly III cannot handle');
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
} }
/** /**
@@ -103,6 +104,7 @@ class ReportControllerTest extends TestCase
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee('Firefly III cannot handle'); $response->assertSee('Firefly III cannot handle');
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
} }
/** /**
@@ -110,18 +112,17 @@ class ReportControllerTest extends TestCase
*/ */
public function testBalanceAmountDefaultNoBudget(): void public function testBalanceAmountDefaultNoBudget(): void
{ {
$this->mockDefaultSession();
$this->mock(CategoryRepositoryInterface::class); $this->mock(CategoryRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$popupHelper = $this->mock(PopupReportInterface::class); $popupHelper = $this->mock(PopupReportInterface::class);
$account = $this->getRandomAsset(); $account = $this->getRandomAsset();
$this->mockDefaultSession();
$popupHelper->shouldReceive('balanceForNoBudget')->andReturn([]); $popupHelper->shouldReceive('balanceForNoBudget')->andReturn([]);
$budgetRepos->shouldReceive('findNull')->andReturn(new Budget)->once()->withArgs([0]); $budgetRepos->shouldReceive('findNull')->andReturn(null)->once()->withArgs([0]);
$accountRepos->shouldReceive('findNull')->andReturn($account)->once()->withArgs([1]); $accountRepos->shouldReceive('findNull')->andReturn($account)->once()->withArgs([1]);
$popupHelper->shouldReceive('balanceForBudget')->once()->andReturn([]); //$popupHelper->shouldReceive('balanceForBudget')->once()->andReturn([]);
Amount::shouldReceive('formatAnything')->andReturn('-100'); Amount::shouldReceive('formatAnything')->andReturn('-100');
@@ -142,6 +143,7 @@ class ReportControllerTest extends TestCase
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertSee($account->name); $response->assertSee($account->name);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
} }
/** /**
@@ -157,6 +159,7 @@ class ReportControllerTest extends TestCase
$budget = $this->getRandomBudget(); $budget = $this->getRandomBudget();
$this->mockDefaultSession(); $this->mockDefaultSession();
Amount::shouldReceive('formatAnything')->andReturn('-100')->atLeast()->once();
$budgetRepos->shouldReceive('findNull')->andReturn($budget)->once()->withArgs([1]); $budgetRepos->shouldReceive('findNull')->andReturn($budget)->once()->withArgs([1]);
$accountRepos->shouldReceive('findNull')->andReturn($account)->once()->withArgs([1]); $accountRepos->shouldReceive('findNull')->andReturn($account)->once()->withArgs([1]);
@@ -178,6 +181,7 @@ class ReportControllerTest extends TestCase
$uri = route('popup.general') . '?' . http_build_query($arguments); $uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
} }
/** /**
@@ -213,6 +217,7 @@ class ReportControllerTest extends TestCase
$uri = route('popup.general') . '?' . http_build_query($arguments); $uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
} }
/** /**
@@ -220,8 +225,8 @@ class ReportControllerTest extends TestCase
*/ */
public function testBudgetSpentAmount(): void public function testBudgetSpentAmount(): void
{ {
$accountRepos = $this->mock(AccountRepositoryInterface::class); $this->mock(AccountRepositoryInterface::class);
$categoryRepos = $this->mock(CategoryRepositoryInterface::class); $this->mock(CategoryRepositoryInterface::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class); $budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$popupHelper = $this->mock(PopupReportInterface::class); $popupHelper = $this->mock(PopupReportInterface::class);
$budget = $this->getRandomBudget(); $budget = $this->getRandomBudget();
@@ -230,6 +235,42 @@ class ReportControllerTest extends TestCase
$budgetRepos->shouldReceive('findNull')->andReturn($budget)->once()->withArgs([1]); $budgetRepos->shouldReceive('findNull')->andReturn($budget)->once()->withArgs([1]);
$popupHelper->shouldReceive('byBudget')->andReturn([]); $popupHelper->shouldReceive('byBudget')->andReturn([]);
Amount::shouldReceive('formatAnything')->andReturn('-100')->atLeast()->once();
$this->be($this->user());
$arguments = [
'attributes' => [
'location' => 'budget-spent-amount',
'startDate' => Carbon::now()->startOfMonth()->format('Ymd'),
'endDate' => Carbon::now()->endOfMonth()->format('Ymd'),
'accounts' => 1,
'accountId' => 1,
'categoryId' => 1,
'budgetId' => 1,
],
];
$uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri);
$response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
}
/**
* @covers \FireflyIII\Http\Controllers\Popup\ReportController
*/
public function testBudgetSpentAmountNoBudget(): void
{
$this->mock(AccountRepositoryInterface::class);
$this->mock(CategoryRepositoryInterface::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$popupHelper = $this->mock(PopupReportInterface::class);
Amount::shouldReceive('formatAnything')->andReturn('-100')->atLeast()->once();
$this->mockDefaultSession();
$budgetRepos->shouldReceive('findNull')->andReturnNull()->once()->withArgs([1]);
$popupHelper->shouldReceive('byBudget')->andReturn([]);
$this->be($this->user()); $this->be($this->user());
$arguments = [ $arguments = [
'attributes' => [ 'attributes' => [
@@ -245,6 +286,7 @@ class ReportControllerTest extends TestCase
$uri = route('popup.general') . '?' . http_build_query($arguments); $uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
} }
/** /**
@@ -261,6 +303,40 @@ class ReportControllerTest extends TestCase
$this->mockDefaultSession(); $this->mockDefaultSession();
$categoryRepos->shouldReceive('findNull')->andReturn($category)->once()->withArgs([1]); $categoryRepos->shouldReceive('findNull')->andReturn($category)->once()->withArgs([1]);
$popupHelper->shouldReceive('byCategory')->andReturn([]); $popupHelper->shouldReceive('byCategory')->andReturn([]);
Amount::shouldReceive('formatAnything')->andReturn('-100')->atLeast()->once();
$this->be($this->user());
$arguments = [
'attributes' => [
'location' => 'category-entry',
'startDate' => Carbon::now()->startOfMonth()->format('Ymd'),
'endDate' => Carbon::now()->endOfMonth()->format('Ymd'),
'accounts' => 1,
'accountId' => 1,
'categoryId' => 1,
'budgetId' => 1,
],
];
$uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri);
$response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
}
/**
* @covers \FireflyIII\Http\Controllers\Popup\ReportController
*/
public function testCategoryEntryUnknown(): void
{
$this->mock(BudgetRepositoryInterface::class);
$this->mock(AccountRepositoryInterface::class);
$categoryRepos = $this->mock(CategoryRepositoryInterface::class);
$popupHelper = $this->mock(PopupReportInterface::class);
$this->mockDefaultSession();
$categoryRepos->shouldReceive('findNull')->andReturn(null)->once()->withArgs([1]);
$popupHelper->shouldReceive('byCategory')->andReturn([]);
$this->be($this->user()); $this->be($this->user());
$arguments = [ $arguments = [
@@ -277,6 +353,8 @@ class ReportControllerTest extends TestCase
$uri = route('popup.general') . '?' . http_build_query($arguments); $uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
$response->assertSee('This is an unknown category. Apologies.');
} }
/** /**
@@ -291,6 +369,8 @@ class ReportControllerTest extends TestCase
$accountRepos = $this->mock(AccountRepositoryInterface::class); $accountRepos = $this->mock(AccountRepositoryInterface::class);
$account = $this->getRandomAsset(); $account = $this->getRandomAsset();
Amount::shouldReceive('formatAnything')->andReturn('-100')->atLeast()->once();
$this->mockDefaultSession(); $this->mockDefaultSession();
$accountRepos->shouldReceive('findNull')->withArgs([1])->andReturn($account)->once(); $accountRepos->shouldReceive('findNull')->withArgs([1])->andReturn($account)->once();
$popupHelper->shouldReceive('byExpenses')->andReturn([]); $popupHelper->shouldReceive('byExpenses')->andReturn([]);
@@ -310,6 +390,42 @@ class ReportControllerTest extends TestCase
$uri = route('popup.general') . '?' . http_build_query($arguments); $uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
}
/**
* @covers \FireflyIII\Http\Controllers\Popup\ReportController
*/
public function testExpenseEntryUnknown(): void
{
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$categoryRepos = $this->mock(CategoryRepositoryInterface::class);
$popupHelper = $this->mock(PopupReportInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$this->mockDefaultSession();
$accountRepos->shouldReceive('findNull')->withArgs([1])->andReturn(null)->once();
$popupHelper->shouldReceive('byExpenses')->andReturn([]);
$this->be($this->user());
$arguments = [
'attributes' => [
'location' => 'expense-entry',
'startDate' => Carbon::now()->startOfMonth()->format('Ymd'),
'endDate' => Carbon::now()->endOfMonth()->format('Ymd'),
'accounts' => 1,
'accountId' => 1,
'categoryId' => 1,
'budgetId' => 1,
],
];
$uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri);
$response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
$response->assertSee('This is an unknown account. Apologies.');
} }
/** /**
@@ -327,6 +443,7 @@ class ReportControllerTest extends TestCase
$this->mockDefaultSession(); $this->mockDefaultSession();
$accountRepos->shouldReceive('findNull')->withArgs([1])->andReturn($account)->once(); $accountRepos->shouldReceive('findNull')->withArgs([1])->andReturn($account)->once();
$popupHelper->shouldReceive('byIncome')->andReturn([]); $popupHelper->shouldReceive('byIncome')->andReturn([]);
Amount::shouldReceive('formatAnything')->andReturn('-100')->atLeast()->once();
$this->be($this->user()); $this->be($this->user());
$arguments = [ $arguments = [
@@ -343,6 +460,41 @@ class ReportControllerTest extends TestCase
$uri = route('popup.general') . '?' . http_build_query($arguments); $uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
}
/**
* @covers \FireflyIII\Http\Controllers\Popup\ReportController
*/
public function testIncomeEntryUnknown(): void
{
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$categoryRepos = $this->mock(CategoryRepositoryInterface::class);
$popupHelper = $this->mock(PopupReportInterface::class);
$accountRepos = $this->mock(AccountRepositoryInterface::class);
$this->mockDefaultSession();
$accountRepos->shouldReceive('findNull')->withArgs([1])->andReturn(null)->once();
$popupHelper->shouldReceive('byIncome')->andReturn([]);
$this->be($this->user());
$arguments = [
'attributes' => [
'location' => 'income-entry',
'startDate' => Carbon::now()->startOfMonth()->format('Ymd'),
'endDate' => Carbon::now()->endOfMonth()->format('Ymd'),
'accounts' => 1,
'accountId' => 1,
'categoryId' => 1,
'budgetId' => 1,
],
];
$uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri);
$response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
} }
/** /**
@@ -369,5 +521,6 @@ class ReportControllerTest extends TestCase
$uri = route('popup.general') . '?' . http_build_query($arguments); $uri = route('popup.general') . '?' . http_build_query($arguments);
$response = $this->get($uri); $response = $this->get($uri);
$response->assertStatus(200); $response->assertStatus(200);
$response->assertDontSee('Firefly III could not render the view. Please see the log files.');
} }
} }

View File

@@ -166,6 +166,127 @@ class CreateControllerTest extends TestCase
$response->assertSessionHas('success'); $response->assertSessionHas('success');
} }
/**
* Stores a withdrawal, but destination is invalid
*
* @covers \FireflyIII\Http\Controllers\Recurring\CreateController
* @covers \FireflyIII\Http\Requests\RecurrenceFormRequest
*/
public function testStoreWithdrawalInvalidDest(): void
{
// mock repositories, even if not used.
$this->mock(BudgetRepositoryInterface::class);
$this->mock(RecurringRepositoryInterface::class);
$validator = $this->mock(AccountValidator::class);
$source = $this->getRandomAsset();
$destination = $this->getRandomExpense();
$tomorrow = Carbon::now()->addDays(2);
$this->mockDefaultSession();
// validator:
$validator->shouldReceive('setTransactionType')->withArgs(['withdrawal'])->atLeast()->once();
$validator->shouldReceive('validateSource')->atLeast()->once()->andReturn(true);
$validator->shouldReceive('validateDestination')->atLeast()->once()->andReturn(false);
$data = [
'title' => sprintf('hello %d', $this->randomInt()),
'first_date' => $tomorrow->format('Y-m-d'),
'repetition_type' => 'daily',
'skip' => 0,
'recurring_description' => sprintf('Some descr %d', $this->randomInt()),
'active' => '1',
'apply_rules' => '1',
'foreign_amount' => '1',
'foreign_currency_id' => '2',
// mandatory for transaction:
'transaction_description' => 'Some descr',
'transaction_type' => 'withdrawal',
'transaction_currency_id' => '1',
'amount' => '30',
// mandatory account info:
'source_id' => $source->id,
'withdrawal_destination_id' => $destination->id,
// optional fields:
'budget_id' => '1',
'category' => 'CategoryA',
'tags' => 'A,B,C',
'create_another' => '1',
'repetition_end' => 'times',
'repetitions' => 3,
];
$this->be($this->user());
$response = $this->post(route('recurring.store'), $data);
$response->assertStatus(302);
$response->assertSessionHas('errors');
}
/**
* Try to store withdrawal, but the source account is invalid.
*
* @covers \FireflyIII\Http\Controllers\Recurring\CreateController
* @covers \FireflyIII\Http\Requests\RecurrenceFormRequest
*/
public function testStoreWithdrawalInvalidSource(): void
{
$this->mockDefaultSession();
// mock repositories, even if not used.
$this->mock(BudgetRepositoryInterface::class);
$this->mock(RecurringRepositoryInterface::class);
$validator = $this->mock(AccountValidator::class);
$source = $this->getRandomAsset();
$destination = $this->getRandomExpense();
$tomorrow = Carbon::now()->addDays(2);
// validator:
$validator->shouldReceive('setTransactionType')->withArgs(['withdrawal'])->atLeast()->once();
// source account is invalid.
$validator->shouldReceive('validateSource')->atLeast()->once()->andReturn(false);
$data = [
'title' => sprintf('hello %d', $this->randomInt()),
'first_date' => $tomorrow->format('Y-m-d'),
'repetition_type' => 'daily',
'skip' => 0,
'recurring_description' => sprintf('Some descr %d', $this->randomInt()),
'active' => '1',
'apply_rules' => '1',
'foreign_amount' => '1',
'foreign_currency_id' => '2',
// mandatory for transaction:
'transaction_description' => 'Some descr',
'transaction_type' => 'withdrawal',
'transaction_currency_id' => '1',
'amount' => '30',
// mandatory account info:
'source_id' => $source->id,
'withdrawal_destination_id' => $destination->id,
// optional fields:
'budget_id' => '1',
'category' => 'CategoryA',
'tags' => 'A,B,C',
'create_another' => '1',
'repetition_end' => 'times',
'repetitions' => 3,
];
$this->be($this->user());
$response = $this->post(route('recurring.store'), $data);
$response->assertStatus(302);
$response->assertSessionHas('errors');
}
/** /**
* Stores a withdrawal. But throw error. * Stores a withdrawal. But throw error.
* *

View File

@@ -103,6 +103,62 @@ class IndexControllerTest extends TestCase
$response->assertSee('<ol class="breadcrumb">'); $response->assertSee('<ol class="breadcrumb">');
} }
/**
* The last time the recurring job fired it was a long time ago.
*
* @covers \FireflyIII\Http\Controllers\Recurring\IndexController
*/
public function testIndexLongAgo(): void
{
$repository = $this->mock(RecurringRepositoryInterface::class);
$budgetRepos = $this->mock(BudgetRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class);
$categoryFactory = $this->mock(CategoryFactory::class);
$transformer = $this->mock(RecurrenceTransformer::class);
// mock calls
$pref = new Preference;
$pref->data = 50;
Preferences::shouldReceive('get')->withArgs(['listPageSize', 50])->atLeast()->once()->andReturn($pref);
$this->mockDefaultSession();
$transformer->shouldReceive('setParameters')->atLeast()->once();
$transformer->shouldReceive('transform')->atLeast()->once()->andReturn(
[
'id' => 5,
'first_date' => '2018-01-01',
'repeat_until' => null,
'latest_date' => null,
]
);
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true);
$config = new Configuration;
$config->data = 1;
$falseConfig = new Configuration;
$falseConfig->data = false;
$collection = $this->user()->recurrences()->take(2)->get();
// mock cron job config:
FireflyConfig::shouldReceive('get')->withArgs(['last_rt_job', 0])->once()->andReturn($config);
$repository->shouldReceive('get')->andReturn($collection)->once();
$this->be($this->user());
$response = $this->get(route('recurring.index'));
$response->assertStatus(200);
$response->assertSee('<ol class="breadcrumb">');
$response->assertSessionHas('warning');
}
/** /**
* @covers \FireflyIII\Http\Controllers\Recurring\IndexController * @covers \FireflyIII\Http\Controllers\Recurring\IndexController
*/ */

View File

@@ -139,8 +139,8 @@ class CreateControllerTest extends TestCase
{ {
// mock stuff // mock stuff
$repository = $this->mock(RuleRepositoryInterface::class); $repository = $this->mock(RuleRepositoryInterface::class);
$ruleGroupRepos = $this->mock(RuleGroupRepositoryInterface::class); $this->mock(RuleGroupRepositoryInterface::class);
$userRepos = $this->mock(UserRepositoryInterface::class); $this->mock(UserRepositoryInterface::class);
$this->mockDefaultSession(); $this->mockDefaultSession();
Preferences::shouldReceive('mark')->atLeast()->once(); Preferences::shouldReceive('mark')->atLeast()->once();
@@ -155,7 +155,7 @@ class CreateControllerTest extends TestCase
'title' => 'A', 'title' => 'A',
'trigger' => 'store-journal', 'trigger' => 'store-journal',
'description' => 'D', 'description' => 'D',
'rule_triggers' => [ 'triggers' => [
[ [
'type' => 'description_is', 'type' => 'description_is',
'value' => 'A', 'value' => 'A',
@@ -163,7 +163,7 @@ class CreateControllerTest extends TestCase
], ],
], ],
'rule_actions' => [ 'actions' => [
[ [
'type' => 'set_category', 'type' => 'set_category',
'value' => 'C', 'value' => 'C',

View File

@@ -78,6 +78,7 @@ class CreateControllerTest extends TestCase
$repository->shouldReceive('find')->andReturn(new RuleGroup); $repository->shouldReceive('find')->andReturn(new RuleGroup);
$data = [ $data = [
'title' => 'A', 'title' => 'A',
'active' => '1',
'description' => 'No description', 'description' => 'No description',
]; ];

View File

@@ -58,7 +58,11 @@ class IndexControllerTest extends TestCase
$collector = $this->mock(GroupCollectorInterface::class); $collector = $this->mock(GroupCollectorInterface::class);
// generic set for the info blocks: // generic set for the info blocks:
$groupArray = [$this->getRandomWithdrawalAsArray()]; $groupArray = [
$this->getRandomWithdrawalAsArray(),
$this->getRandomDepositAsArray(),
$this->getRandomTransferAsArray(),
];
// role? // role?
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true);
@@ -88,6 +92,96 @@ class IndexControllerTest extends TestCase
$response->assertStatus(200); $response->assertStatus(200);
} }
/**
* @covers \FireflyIII\Http\Controllers\Transaction\IndexController
*/
public function testIndexDeposit(): void
{
$this->mockDefaultSession();
$group = $this->getRandomWithdrawalGroup();
$userRepos = $this->mock(UserRepositoryInterface::class);
$collector = $this->mock(GroupCollectorInterface::class);
// generic set for the info blocks:
$groupArray = [
$this->getRandomWithdrawalAsArray(),
$this->getRandomDepositAsArray(),
$this->getRandomTransferAsArray(),
];
// role?
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true);
// make paginator.
$paginator = new LengthAwarePaginator([$group], 1, 40, 1);
Amount::shouldReceive('formatAnything')->atLeast()->once()->andReturn('10');
$collector->shouldReceive('setTypes')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('setRange')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('setLimit')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('setPage')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withAccountInformation')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('getPaginatedGroups')->atLeast()->once()->andReturn($paginator);
$collector->shouldReceive('getExtractedJournals')->atLeast()->once()->andReturn($groupArray);
$pref = new Preference;
$pref->data = 50;
Preferences::shouldReceive('get')->withArgs(['listPageSize', 50])->atLeast()->once()->andReturn($pref);
Preferences::shouldReceive('lastActivity')->atLeast()->once()->andReturn('md512345');
$this->be($this->user());
$response = $this->get(route('transactions.index', ['deposit']));
$response->assertStatus(200);
}
/**
* @covers \FireflyIII\Http\Controllers\Transaction\IndexController
*/
public function testIndexTransfers(): void
{
$this->mockDefaultSession();
$group = $this->getRandomWithdrawalGroup();
$userRepos = $this->mock(UserRepositoryInterface::class);
$collector = $this->mock(GroupCollectorInterface::class);
// generic set for the info blocks:
$groupArray = [
$this->getRandomWithdrawalAsArray(),
$this->getRandomDepositAsArray(),
$this->getRandomTransferAsArray(),
];
// role?
$userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->andReturn(true);
// make paginator.
$paginator = new LengthAwarePaginator([$group], 1, 40, 1);
Amount::shouldReceive('formatAnything')->atLeast()->once()->andReturn('10');
$collector->shouldReceive('setTypes')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('setRange')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('setLimit')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('setPage')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withBudgetInformation')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withCategoryInformation')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('withAccountInformation')->atLeast()->once()->andReturnSelf();
$collector->shouldReceive('getPaginatedGroups')->atLeast()->once()->andReturn($paginator);
$collector->shouldReceive('getExtractedJournals')->atLeast()->once()->andReturn($groupArray);
$pref = new Preference;
$pref->data = 50;
Preferences::shouldReceive('get')->withArgs(['listPageSize', 50])->atLeast()->once()->andReturn($pref);
Preferences::shouldReceive('lastActivity')->atLeast()->once()->andReturn('md512345');
$this->be($this->user());
$response = $this->get(route('transactions.index', ['transfers']));
$response->assertStatus(200);
}
/** /**
* @covers \FireflyIII\Http\Controllers\Transaction\IndexController * @covers \FireflyIII\Http\Controllers\Transaction\IndexController

View File

@@ -286,6 +286,47 @@ abstract class TestCase extends BaseTestCase
]; ];
} }
/**
* @return array
*/
public function getRandomTransferAsArray(): array
{
$transfer = $this->getRandomTransfer();
$euro = $this->getEuro();
$category = $this->getRandomCategory();
$source = $this->getRandomAsset();
$dest = $this->getRandomAsset($source->id);
try {
$date = new Carbon;
} catch (Exception $e) {
$e->getMessage();
}
return [
'transaction_group_id' => $transfer->transaction_group_id,
'transaction_journal_id' => $transfer->id,
'transaction_type_type' => 'Transfer',
'currency_id' => $euro->id,
'foreign_currency_id' => null,
'date' => $date,
'description' => sprintf('I am descr #%d', $this->randomInt()),
'source_account_id' => $source->id,
'source_account_name' => $source->name,
'foreign_amount' => null,
'destination_account_id' => $dest->id,
'destination_account_name' => $dest->name,
'currency_name' => $euro->name,
'currency_code' => $euro->code,
'currency_symbol' => $euro->symbol,
'currency_decimal_places' => $euro->decimal_places,
'amount' => '-30',
'category_id' => $category->id,
'category_name' => $category->name,
];
}
/** /**
* @return array * @return array
* @throws Exception * @throws Exception
@@ -416,9 +457,7 @@ abstract class TestCase extends BaseTestCase
*/ */
public function demoUser(): User public function demoUser(): User
{ {
throw new FireflyException('demoUser()-method is obsolete.'); return User::where('email', 'demo@firefly')->first();
return User::find(4);
} }
/** /**
@@ -558,6 +597,14 @@ abstract class TestCase extends BaseTestCase
return $this->getRandomGroup(TransactionType::WITHDRAWAL); return $this->getRandomGroup(TransactionType::WITHDRAWAL);
} }
/**
* @return TransactionGroup
*/
protected function getRandomTransferGroup(): TransactionGroup
{
return $this->getRandomGroup(TransactionType::TRANSFER);
}
/** /**
* @return TransactionGroup * @return TransactionGroup
*/ */

View File

@@ -88,7 +88,7 @@ class BunqJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once(); $jobRepos->shouldReceive('setUser')->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'bunq_jc_B' . random_int(1, 10000); $job->key = 'bunq_jc_B' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'bunq'; $job->provider = 'bunq';
@@ -122,7 +122,7 @@ class BunqJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once(); $jobRepos->shouldReceive('setUser')->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'bunq_jc_C' . random_int(1, 10000); $job->key = 'bunq_jc_C' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'bunq'; $job->provider = 'bunq';

View File

@@ -57,7 +57,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'A_unit_' . random_int(1, 10000); $job->key = 'A_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -84,7 +84,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'B_unit_' . random_int(1, 10000); $job->key = 'B_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'needs_config'; $job->stage = 'needs_config';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -110,7 +110,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'C_unit_' . random_int(1, 10000); $job->key = 'C_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -138,7 +138,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'D_unit_' . random_int(1, 10000); $job->key = 'D_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'config'; $job->stage = 'config';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -169,7 +169,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'E_unit_' . random_int(1, 10000); $job->key = 'E_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -199,7 +199,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'f_unit_' . random_int(1, 10000); $job->key = 'f_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'config'; $job->stage = 'config';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -230,7 +230,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'g_unit_' . random_int(1, 10000); $job->key = 'g_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -257,7 +257,7 @@ class FakeJobConfigurationTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'h_unit_' . random_int(1, 10000); $job->key = 'h_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -292,7 +292,7 @@ class FakeJobConfigurationTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'i_unit_' . random_int(1, 10000); $job->key = 'i_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -327,7 +327,7 @@ class FakeJobConfigurationTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'j_unit_' . random_int(1, 10000); $job->key = 'j_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -362,7 +362,7 @@ class FakeJobConfigurationTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'k_unit_' . random_int(1, 10000); $job->key = 'k_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -397,7 +397,7 @@ class FakeJobConfigurationTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'l_unit_' . random_int(1, 10000); $job->key = 'l_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -432,7 +432,7 @@ class FakeJobConfigurationTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'm_unit_' . random_int(1, 10000); $job->key = 'm_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -467,7 +467,7 @@ class FakeJobConfigurationTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'n_unit_' . random_int(1, 10000); $job->key = 'n_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -502,7 +502,7 @@ class FakeJobConfigurationTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'o_unit_' . random_int(1, 10000); $job->key = 'o_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -540,7 +540,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'p_unit_' . random_int(1, 10000); $job->key = 'p_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'not_new'; $job->stage = 'not_new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -567,7 +567,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'p_unit_' . random_int(1, 10000); $job->key = 'p_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -594,7 +594,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'p_unit_' . random_int(1, 10000); $job->key = 'p_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -621,7 +621,7 @@ class FakeJobConfigurationTest extends TestCase
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'p_unit_' . random_int(1, 10000); $job->key = 'p_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';

View File

@@ -63,7 +63,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'File_A_unit_' . random_int(1, 10000); $job->key = 'File_A_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -88,7 +88,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'File_B_unit_' . random_int(1, 10000); $job->key = 'File_B_unit_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'ready_to_run'; $job->stage = 'ready_to_run';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -113,7 +113,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'I-Cfile_' . random_int(1, 10000); $job->key = 'I-Cfile_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'map'; $job->stage = 'map';
$job->provider = 'file'; $job->provider = 'file';
@@ -150,7 +150,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'G-Dfile_' . random_int(1, 10000); $job->key = 'G-Dfile_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'configure-upload'; $job->stage = 'configure-upload';
$job->provider = 'file'; $job->provider = 'file';
@@ -185,7 +185,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'H-Efile_' . random_int(1, 10000); $job->key = 'H-Efile_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'map'; $job->stage = 'map';
$job->provider = 'file'; $job->provider = 'file';
@@ -220,7 +220,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'F-fFile_' . random_int(1, 10000); $job->key = 'F-fFile_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'file'; $job->provider = 'file';
@@ -255,7 +255,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'H-fiGle_' . random_int(1, 10000); $job->key = 'H-fiGle_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'roles'; $job->stage = 'roles';
$job->provider = 'file'; $job->provider = 'file';
@@ -290,7 +290,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'DfiHle_' . random_int(1, 10000); $job->key = 'DfiHle_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'configure-upload'; $job->stage = 'configure-upload';
$job->provider = 'file'; $job->provider = 'file';
@@ -320,7 +320,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'FfilIe_' . random_int(1, 10000); $job->key = 'FfilIe_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'map'; $job->stage = 'map';
$job->provider = 'file'; $job->provider = 'file';
@@ -350,7 +350,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'CfJile_' . random_int(1, 10000); $job->key = 'CfJile_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'file'; $job->provider = 'file';
@@ -380,7 +380,7 @@ class FileJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once()->atLeast(); $jobRepos->shouldReceive('setUser')->once()->atLeast();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'EfiKle_' . random_int(1, 10000); $job->key = 'EfiKle_' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'roles'; $job->stage = 'roles';
$job->provider = 'file'; $job->provider = 'file';

View File

@@ -0,0 +1,167 @@
<?php
/**
* FinTSJobConfigurationTest.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 Tests\Unit\Import\JobConfiguration;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Import\JobConfiguration\FinTSJobConfiguration;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\JobConfiguration\FinTS\ChooseAccountHandler;
use FireflyIII\Support\Import\JobConfiguration\FinTS\NewFinTSJobHandler;
use Log;
use Tests\TestCase;
/**
* Class FinTSJobConfigurationTest
*/
class FinTSJobConfigurationTest extends TestCase
{
/**
*
*/
public function setUp(): void
{
parent::setUp();
Log::info(sprintf('Now in %s.', get_class($this)));
}
/**
* @covers \FireflyIII\Import\JobConfiguration\FinTSJobConfiguration
*/
public function testConfigurationComplete(): void
{
$this->mock(ImportJobRepositoryInterface::class);
$this->mock(NewFinTSJobHandler::class);
$job = new ImportJob;
$job->user_id = $this->user()->id;
$job->key = 'fints_jc_A' . $this->randomInt();
$job->status = 'new';
$job->stage = 'go-for-import';
$job->provider = 'fints';
$job->file_type = '';
$job->configuration = [];
$job->save();
$config = new FinTSJobConfiguration;
$config->setImportJob($job);
$this->assertTrue($config->configurationComplete());
}
/**
* @covers \FireflyIII\Import\JobConfiguration\FinTSJobConfiguration
*/
public function testConfigureJob(): void
{
$this->mock(ImportJobRepositoryInterface::class);
$handler = $this->mock(NewFinTSJobHandler::class);
$job = new ImportJob;
$job->user_id = $this->user()->id;
$job->key = 'fints_jc_B' . $this->randomInt();
$job->status = 'new';
$job->stage = 'new';
$job->provider = 'fints';
$job->file_type = '';
$job->configuration = [];
$job->save();
$handler->shouldReceive('setImportJob')->atLeast()->once();
$handler->shouldReceive('configureJob')->atLeast()->once()->withArgs([[123]]);
$config = new FinTSJobConfiguration;
$config->setImportJob($job);
try {
$config->configureJob([123]);
} catch (FireflyException $e) {
$this->assertFalse(true, $e->getMessage());
}
}
/**
* @covers \FireflyIII\Import\JobConfiguration\FinTSJobConfiguration
*/
public function testGetNextData(): void
{
$this->mock(ImportJobRepositoryInterface::class);
$handler = $this->mock(ChooseAccountHandler::class);
$job = new ImportJob;
$job->user_id = $this->user()->id;
$job->key = 'fints_jc_C' . $this->randomInt();
$job->status = 'new';
$job->stage = 'choose_account';
$job->provider = 'fints';
$job->file_type = '';
$job->configuration = [];
$job->save();
$handler->shouldReceive('setImportJob')->atLeast()->once();
$handler->shouldReceive('getNextData')->atLeast()->once()->withNoArgs()->andReturn([456]);
$res = [];
$config = new FinTSJobConfiguration;
$config->setImportJob($job);
try {
$res = $config->getNextData();
} catch (FireflyException $e) {
$this->assertFalse(true, $e->getMessage());
}
$this->assertEquals([456], $res);
}
/**
* @covers \FireflyIII\Import\JobConfiguration\FinTSJobConfiguration
*/
public function testGetNextView(): void
{
$this->mock(ImportJobRepositoryInterface::class);
$this->mock(ChooseAccountHandler::class);
$job = new ImportJob;
$job->user_id = $this->user()->id;
$job->key = 'fints_jc_D' . $this->randomInt();
$job->status = 'new';
$job->stage = 'choose_account';
$job->provider = 'fints';
$job->file_type = '';
$job->configuration = [];
$job->save();
$res = [];
$config = new FinTSJobConfiguration;
$config->setImportJob($job);
try {
$res = $config->getNextView();
} catch (FireflyException $e) {
$this->assertFalse(true, $e->getMessage());
}
$this->assertEquals('import.fints.choose_account', $res);
}
}

View File

@@ -60,7 +60,7 @@ class SpectreJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once(); $jobRepos->shouldReceive('setUser')->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'spectre_jc_A' . random_int(1, 10000); $job->key = 'spectre_jc_A' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'spectre'; $job->provider = 'spectre';
@@ -91,7 +91,7 @@ class SpectreJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once(); $jobRepos->shouldReceive('setUser')->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'spectre_jc_B' . random_int(1, 10000); $job->key = 'spectre_jc_B' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'do-authenticate'; $job->stage = 'do-authenticate';
$job->provider = 'spectre'; $job->provider = 'spectre';
@@ -125,7 +125,7 @@ class SpectreJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once(); $jobRepos->shouldReceive('setUser')->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'spectre_jc_C' . random_int(1, 10000); $job->key = 'spectre_jc_C' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'choose-login'; $job->stage = 'choose-login';
$job->provider = 'spectre'; $job->provider = 'spectre';
@@ -157,7 +157,7 @@ class SpectreJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once(); $jobRepos->shouldReceive('setUser')->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'spectre_jc_D' . random_int(1, 10000); $job->key = 'spectre_jc_D' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'authenticated'; $job->stage = 'authenticated';
$job->provider = 'spectre'; $job->provider = 'spectre';
@@ -188,7 +188,7 @@ class SpectreJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once(); $jobRepos->shouldReceive('setUser')->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'spectre_jc_E' . random_int(1, 10000); $job->key = 'spectre_jc_E' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'choose-accounts'; $job->stage = 'choose-accounts';
$job->provider = 'spectre'; $job->provider = 'spectre';

View File

@@ -89,7 +89,7 @@ class YnabJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once(); $jobRepos->shouldReceive('setUser')->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'ynab_jc_B' . random_int(1, 10000); $job->key = 'ynab_jc_B' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'select_budgets'; $job->stage = 'select_budgets';
$job->provider = 'ynab'; $job->provider = 'ynab';
@@ -123,7 +123,7 @@ class YnabJobConfigurationTest extends TestCase
$jobRepos->shouldReceive('setUser')->once(); $jobRepos->shouldReceive('setUser')->once();
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'ynab_jc_C' . random_int(1, 10000); $job->key = 'ynab_jc_C' . $this->randomInt();
$job->status = 'new'; $job->status = 'new';
$job->stage = 'select_accounts'; $job->stage = 'select_accounts';
$job->provider = 'ynab'; $job->provider = 'ynab';

View File

@@ -56,7 +56,7 @@ class BunqRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'brY_' . random_int(1, 10000); $job->key = 'brY_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'go-for-import'; $job->stage = 'go-for-import';
$job->provider = 'bunq'; $job->provider = 'bunq';
@@ -96,7 +96,7 @@ class BunqRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'brY_' . random_int(1, 10000); $job->key = 'brY_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'go-for-import'; $job->stage = 'go-for-import';
$job->provider = 'bunq'; $job->provider = 'bunq';
@@ -140,7 +140,7 @@ class BunqRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'brX_' . random_int(1, 10000); $job->key = 'brX_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'bunq'; $job->provider = 'bunq';

View File

@@ -55,7 +55,7 @@ class FakeRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'a_route_' . random_int(1, 10000); $job->key = 'a_route_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'ahoy'; $job->stage = 'ahoy';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -91,7 +91,7 @@ class FakeRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'a_route_' . random_int(1, 10000); $job->key = 'a_route_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'final'; $job->stage = 'final';
$job->provider = 'fake'; $job->provider = 'fake';
@@ -128,7 +128,7 @@ class FakeRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'a_route_' . random_int(1, 10000); $job->key = 'a_route_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'fake'; $job->provider = 'fake';

View File

@@ -25,9 +25,11 @@ namespace Tests\Unit\Import\Routine;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Import\Routine\BunqRoutine;
use FireflyIII\Import\Routine\FileRoutine; use FireflyIII\Import\Routine\FileRoutine;
use FireflyIII\Models\ImportJob; use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Routine\Bunq\StageImportDataHandler;
use FireflyIII\Support\Import\Routine\File\CSVProcessor; use FireflyIII\Support\Import\Routine\File\CSVProcessor;
use Log; use Log;
use Mockery; use Mockery;
@@ -55,35 +57,35 @@ class FileRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'a_fr_' . random_int(1, 10000); $job->key = 'brY_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'ready_to_run'; $job->stage = 'go-for-import';
$job->provider = 'file'; $job->provider = 'bunq';
$job->file_type = ''; $job->file_type = '';
$job->configuration = []; $job->configuration = [];
$job->save(); $job->save();
// mock // mock stuff:
$processor = $this->mock(CSVProcessor::class);
$repository = $this->mock(ImportJobRepositoryInterface::class); $repository = $this->mock(ImportJobRepositoryInterface::class);
$handler = $this->mock(StageImportDataHandler::class);
// calls
$repository->shouldReceive('setUser')->once(); $repository->shouldReceive('setUser')->once();
$repository->shouldReceive('setStatus')->withArgs([Mockery::any(), 'running'])->once(); $repository->shouldReceive('setStatus')->withArgs([Mockery::any(), 'running']);
$repository->shouldReceive('setStatus')->withArgs([Mockery::any(), 'provider_finished'])->once(); $repository->shouldReceive('setStatus')->withArgs([Mockery::any(), 'provider_finished']);
$repository->shouldReceive('setStage')->withArgs([Mockery::any(), 'final'])->once(); $repository->shouldReceive('setStage')->withArgs([Mockery::any(), 'final']);
$repository->shouldReceive('setTransactions')->withArgs([Mockery::any(), ['a' => 'b']])->once(); $repository->shouldReceive('appendTransactions')->withArgs([Mockery::any(), ['a' => 'c']])->once();
$repository->shouldReceive('getConfiguration')->withArgs([Mockery::any()])->once()->andReturn([]);
$processor->shouldReceive('setImportJob')->once();
$processor->shouldReceive('run')->once()->andReturn(['a' => 'b']);
$handler->shouldReceive('setImportJob')->once();
$routine = new FileRoutine; $handler->shouldReceive('run')->once();
$handler->shouldReceive('getTransactions')->once()->andReturn(['a' => 'c']);
$handler->shouldReceive('isStillRunning')->andReturn(false);
$routine = new BunqRoutine;
$routine->setImportJob($job); $routine->setImportJob($job);
try { try {
$routine->run(); $routine->run();
} catch (FireflyException $e) { } catch (FireflyException $e) {
$this->assertTrue(false, $e->getMessage()); $this->assertFalse(true, $e->getMessage());
} }
} }
} }

View File

@@ -0,0 +1,87 @@
<?php
/**
* FinTSRoutineTest.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 Tests\Unit\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Import\Routine\FinTSRoutine;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Routine\FinTS\StageImportDataHandler;
use Log;
use Mockery;
use Tests\TestCase;
/**
* Class FinTSRoutineTest
*/
class FinTSRoutineTest extends TestCase
{
/**
*
*/
public function setUp(): void
{
parent::setUp();
Log::info(sprintf('Now in %s.', get_class($this)));
}
/**
* @covers \FireflyIII\Import\Routine\FinTSRoutine
*/
public function testRunDefault(): void
{
$job = new ImportJob;
$job->user_id = $this->user()->id;
$job->key = 'a_fin_' . $this->randomInt();
$job->status = 'ready_to_run';
$job->stage = 'go-for-import';
$job->provider = 'fints';
$job->file_type = '';
$job->configuration = [];
$job->save();
// mock
$handler = $this->mock(StageImportDataHandler::class);
$repository = $this->mock(ImportJobRepositoryInterface::class);
// calls
$repository->shouldReceive('setUser')->atLeast()->once();
$repository->shouldReceive('setStatus')->withArgs([Mockery::any(), 'running'])->once();
$repository->shouldReceive('setStatus')->withArgs([Mockery::any(), 'provider_finished'])->once();
$repository->shouldReceive('setStage')->withArgs([Mockery::any(), 'final'])->once();
$repository->shouldReceive('setTransactions')->withArgs([Mockery::any(), ['a' => 'b']])->once();
$handler->shouldReceive('setImportJob')->atLeast()->once();
$handler->shouldReceive('run')->once()->atLeast()->once();
$handler->shouldReceive('getTransactions')->atLeast()->once()->andReturn(['a' => 'b']);
$routine = new FinTSRoutine;
$routine->setImportJob($job);
try {
$routine->run();
} catch (FireflyException $e) {
$this->assertTrue(false, $e->getMessage());
}
}
}

View File

@@ -57,7 +57,7 @@ class SpectreRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'SR2b' . random_int(1, 10000); $job->key = 'SR2b' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'authenticated'; $job->stage = 'authenticated';
$job->provider = 'spectre'; $job->provider = 'spectre';
@@ -95,7 +95,7 @@ class SpectreRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'SR1A' . random_int(1, 10000); $job->key = 'SR1A' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'do-authenticate'; $job->stage = 'do-authenticate';
$job->provider = 'spectre'; $job->provider = 'spectre';
@@ -126,7 +126,7 @@ class SpectreRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'SR3c' . random_int(1, 10000); $job->key = 'SR3c' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'go-for-import'; $job->stage = 'go-for-import';
$job->provider = 'spectre'; $job->provider = 'spectre';
@@ -165,7 +165,7 @@ class SpectreRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'SR4A' . random_int(1, 10000); $job->key = 'SR4A' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'spectre'; $job->provider = 'spectre';
@@ -205,7 +205,7 @@ class SpectreRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'SR5A' . random_int(1, 10000); $job->key = 'SR5A' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'new'; $job->stage = 'new';
$job->provider = 'spectre'; $job->provider = 'spectre';

View File

@@ -57,7 +57,7 @@ class YnabRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'ynab_r_7_' . random_int(1, 10000); $job->key = 'ynab_r_7_' . $this->randomInt();
$job->status = 'not_ready_to_run'; $job->status = 'not_ready_to_run';
$job->stage = 'bad_state'; $job->stage = 'bad_state';
$job->provider = 'ynab'; $job->provider = 'ynab';
@@ -88,7 +88,7 @@ class YnabRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'ynab_r_6_' . random_int(1, 10000); $job->key = 'ynab_r_6_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'bad_state'; $job->stage = 'bad_state';
$job->provider = 'ynab'; $job->provider = 'ynab';
@@ -119,7 +119,7 @@ class YnabRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'ynab_r_1_' . random_int(1, 10000); $job->key = 'ynab_r_1_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'get_access_token'; $job->stage = 'get_access_token';
$job->provider = 'ynab'; $job->provider = 'ynab';
@@ -158,7 +158,7 @@ class YnabRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'ynab_r_4_' . random_int(1, 10000); $job->key = 'ynab_r_4_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'get_accounts'; $job->stage = 'get_accounts';
$job->provider = 'ynab'; $job->provider = 'ynab';
@@ -198,7 +198,7 @@ class YnabRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'ynab_r_5_' . random_int(1, 10000); $job->key = 'ynab_r_5_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'go-for-import'; $job->stage = 'go-for-import';
$job->provider = 'ynab'; $job->provider = 'ynab';
@@ -239,7 +239,7 @@ class YnabRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'ynab_r_2_' . random_int(1, 10000); $job->key = 'ynab_r_2_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'get_budgets'; $job->stage = 'get_budgets';
$job->provider = 'ynab'; $job->provider = 'ynab';
@@ -281,7 +281,7 @@ class YnabRoutineTest extends TestCase
{ {
$job = new ImportJob; $job = new ImportJob;
$job->user_id = $this->user()->id; $job->user_id = $this->user()->id;
$job->key = 'ynab_r_3_' . random_int(1, 10000); $job->key = 'ynab_r_3_' . $this->randomInt();
$job->status = 'ready_to_run'; $job->status = 'ready_to_run';
$job->stage = 'get_budgets'; $job->stage = 'get_budgets';
$job->provider = 'ynab'; $job->provider = 'ynab';

File diff suppressed because it is too large Load Diff

View File

@@ -43,7 +43,7 @@ class IsDemoUserTest extends TestCase
parent::setUp(); parent::setUp();
Log::info(sprintf('Now in %s.', get_class($this))); Log::info(sprintf('Now in %s.', get_class($this)));
Route::middleware([StartFireflySession::class, IsDemoUser::class])->any( Route::middleware([StartFireflySession::class, IsDemoUser::class])->any(
'/_test/is-demo', function () { '/_test/is-demo', static function () {
return 'OK'; return 'OK';
} }
); );
@@ -68,6 +68,7 @@ class IsDemoUserTest extends TestCase
$response = $this->get('/_test/is-demo'); $response = $this->get('/_test/is-demo');
$this->assertEquals(Response::HTTP_FOUND, $response->getStatusCode()); $this->assertEquals(Response::HTTP_FOUND, $response->getStatusCode());
$response->assertSessionHas('info'); $response->assertSessionHas('info');
} }
/** /**

View File

@@ -42,7 +42,7 @@ class IsSandstormUserTest extends TestCase
parent::setUp(); parent::setUp();
Log::info(sprintf('Now in %s.', get_class($this))); Log::info(sprintf('Now in %s.', get_class($this)));
Route::middleware(IsSandStormUser::class)->any( Route::middleware(IsSandStormUser::class)->any(
'/_test/is-sandstorm', function () { '/_test/is-sandstorm',static function () {
return 'OK'; return 'OK';
} }
); );

View File

@@ -71,4 +71,18 @@ class SandstormTest extends TestCase
putenv('SANDSTORM=0'); putenv('SANDSTORM=0');
} }
/**
* @covers \FireflyIII\Http\Middleware\Sandstorm
*/
public function testMiddlewareNotSandstorm(): void
{
putenv('SANDSTORM=0');
$response = $this->get('/_test/sandstorm');
$this->assertEquals(Response::HTTP_OK, $response->getStatusCode());
$response->assertSee('sandstorm-anon: false');
}
} }

View File

@@ -0,0 +1,113 @@
<?php
/**
* SecureHeadersTest.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/>.
*/
declare(strict_types=1);
namespace Tests\Unit\Middleware;
use Config;
use FireflyIII\Http\Middleware\SecureHeaders;
use Log;
use Route;
use Symfony\Component\HttpFoundation\Response;
use Tests\TestCase;
/**
* Class SecureHeadersTest
*/
class SecureHeadersTest extends TestCase
{
/**
* Set up test
*/
public function setUp(): void
{
parent::setUp();
Log::info(sprintf('Now in %s.', get_class($this)));
Route::middleware(SecureHeaders::class)->any(
'/_test/secureheaders', static function () {
return view('test.test');
}
);
}
/**
* @covers \FireflyIII\Http\Middleware\SecureHeaders
*/
public function testMiddlewareBasic(): void
{
$response = $this->get('/_test/secureheaders');
$this->assertEquals(Response::HTTP_OK, $response->getStatusCode());
// verify headers
$response->assertHeader('Content-Security-Policy', "default-src 'none'; object-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline' ; style-src 'self' 'unsafe-inline'; base-uri 'self'; font-src 'self' data:; connect-src 'self'; img-src 'self' data: https://api.tiles.mapbox.com ; manifest-src 'self'; form-action 'self'");
$response->assertheader('X-XSS-Protection', '1; mode=block');
$response->assertHeader('X-Frame-Options', 'deny');
$response->assertheader('X-Content-Type-Options', 'nosniff');
$response->assertheader('Referrer-Policy', 'no-referrer');
$response->assertheader('Feature-Policy', "geolocation 'none'; midi 'none'; sync-xhr 'self'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'");
}
/**
* @covers \FireflyIII\Http\Middleware\SecureHeaders
*/
public function testMiddlewareGoogleAnalytics(): void
{
// response changes when config value is different.
Config::set('firefly.analytics_id', 'abc');
$response = $this->get('/_test/secureheaders');
$this->assertEquals(Response::HTTP_OK, $response->getStatusCode());
// verify headers
$response->assertHeader('Content-Security-Policy', "default-src 'none'; object-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline' www.googletagmanager.com/gtag/js https://www.google-analytics.com/analytics.js; style-src 'self' 'unsafe-inline'; base-uri 'self'; font-src 'self' data:; connect-src 'self'; img-src 'self' data: https://api.tiles.mapbox.com https://www.google-analytics.com/; manifest-src 'self'; form-action 'self'");
$response->assertheader('X-XSS-Protection', '1; mode=block');
$response->assertheader('X-Content-Type-Options', 'nosniff');
$response->assertheader('Referrer-Policy', 'no-referrer');
$response->assertHeader('X-Frame-Options', 'deny');
$response->assertheader('Feature-Policy', "geolocation 'none'; midi 'none'; sync-xhr 'self'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'");
}
/**
* @covers \FireflyIII\Http\Middleware\SecureHeaders
*/
public function testMiddlewareFrameHeader(): void
{
// response changes when config value is different.
Config::set('firefly.disable_frame_header', true);
$response = $this->get('/_test/secureheaders');
$this->assertEquals(Response::HTTP_OK, $response->getStatusCode());
// verify headers
$response->assertHeader('Content-Security-Policy', "default-src 'none'; object-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline' ; style-src 'self' 'unsafe-inline'; base-uri 'self'; font-src 'self' data:; connect-src 'self'; img-src 'self' data: https://api.tiles.mapbox.com ; manifest-src 'self'; form-action 'self'");
$response->assertheader('X-XSS-Protection', '1; mode=block');
$response->assertheader('X-Content-Type-Options', 'nosniff');
$response->assertheader('Referrer-Policy', 'no-referrer');
$response->assertHeaderMissing('X-Frame-Options');
$response->assertheader('Feature-Policy', "geolocation 'none'; midi 'none'; sync-xhr 'self'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'");
}
}