Expand test coverage.

This commit is contained in:
James Cole 2017-11-26 09:54:09 +01:00
parent 0cf359b75f
commit 7852f4df1f
No known key found for this signature in database
GPG Key ID: C16961E655E74B5E
8 changed files with 321 additions and 49 deletions

View File

@ -107,7 +107,9 @@ class AttachmentHelper implements AttachmentHelperInterface
*/
public function saveAttachmentsForModel(Model $model, ?array $files): bool
{
Log::debug(sprintf('Now in saveAttachmentsForModel for model %s', get_class($model)));
if (is_array($files)) {
Log::debug('$files is an array.');
/** @var UploadedFile $entry */
foreach ($files as $entry) {
if (null !== $entry) {
@ -155,6 +157,7 @@ class AttachmentHelper implements AttachmentHelperInterface
*/
protected function processFile(UploadedFile $file, Model $model): Attachment
{
Log::debug('Now in processFile()');
$validation = $this->validateUpload($file, $model);
if (false === $validation) {
return new Attachment;
@ -199,8 +202,11 @@ class AttachmentHelper implements AttachmentHelperInterface
*/
protected function validMime(UploadedFile $file): bool
{
Log::debug('Now in validMime()');
$mime = e($file->getMimeType());
$name = e($file->getClientOriginalName());
Log::debug(sprintf('Name is %, and mime is %s', $name, $mime));
Log::debug('Valid mimes are', $this->allowedMimes);
if (!in_array($mime, $this->allowedMimes)) {
$msg = (string)trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]);
@ -243,6 +249,7 @@ class AttachmentHelper implements AttachmentHelperInterface
*/
protected function validateUpload(UploadedFile $file, Model $model): bool
{
Log::debug('Now in validateUpload()');
if (!$this->validMime($file)) {
return false;
}

View File

@ -284,7 +284,7 @@ class AccountController extends Controller
$currencyId = intval($account->getMeta('currency_id'));
$currency = $currencyRepos->find($currencyId);
if (0 === $currencyId) {
$currency = app('amount')->getDefaultCurrency();
$currency = app('amount')->getDefaultCurrency(); // @codeCoverageIgnore
}
// prep for "all" view.
@ -348,8 +348,10 @@ class AccountController extends Controller
// update preferences if necessary:
$frontPage = Preferences::get('frontPageAccounts', [])->data;
if (count($frontPage) > 0 && AccountType::ASSET === $account->accountType->type) {
// @codeCoverageIgnoreStart
$frontPage[] = $account->id;
Preferences::set('frontPageAccounts', $frontPage);
// @codeCoverageIgnoreEnd
}
if (1 === intval($request->get('create_another'))) {

View File

@ -137,7 +137,7 @@ class LinkController extends Controller
// put previous url in session if not redirect from store (not "return_to_edit").
if (true !== session('link_types.edit.fromUpdate')) {
$this->rememberPreviousUri('link_types.edit.uri');
$this->rememberPreviousUri('link_types.edit.uri'); // @codeCoverageIgnore
}
$request->session()->forget('link_types.edit.fromUpdate');
@ -197,7 +197,7 @@ class LinkController extends Controller
// set value so create routine will not overwrite URL:
$request->session()->put('link_types.create.fromStore', true);
return redirect(route('link_types.create', [$request->input('what')]))->withInput();
return redirect(route('admin.links.create'))->withInput();
}
// redirect to previous URL.

View File

@ -109,49 +109,7 @@ class ImportJournal
Log::debug(sprintf('credit amount is %s', var_export($this->amountCredit, true)));
if (null === $this->convertedAmount) {
// first check if the amount is set:
Log::debug('convertedAmount is NULL');
$info = [];
$converterClass = '';
if (!is_null($this->amount)) {
Log::debug('Amount value is not NULL, assume this is the correct value.');
$converterClass = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $this->amount['role'])));
$info = $this->amount;
}
if (!is_null($this->amountDebet)) {
Log::debug('Amount DEBET value is not NULL, assume this is the correct value (overrules Amount).');
$converterClass = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $this->amountDebet['role'])));
$info = $this->amountDebet;
}
if (!is_null($this->amountCredit)) {
Log::debug('Amount CREDIT value is not NULL, assume this is the correct value (overrules Amount and AmountDebet).');
$converterClass = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $this->amountCredit['role'])));
$info = $this->amountCredit;
}
if (0 === count($info)) {
throw new FireflyException('No amount information for this row.');
}
Log::debug(sprintf('Converter class is %s', $converterClass));
/** @var ConverterInterface $amountConverter */
$amountConverter = app($converterClass);
$this->convertedAmount = $amountConverter->convert($info['value']);
Log::debug(sprintf('First attempt to convert gives "%s"', $this->convertedAmount));
// modify
foreach ($this->modifiers as $modifier) {
$class = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $modifier['role'])));
/** @var ConverterInterface $converter */
$converter = app($class);
Log::debug(sprintf('Now launching converter %s', $class));
if ($converter->convert($modifier['value']) === -1) {
$this->convertedAmount = Steam::negative($this->convertedAmount);
}
Log::debug(sprintf('convertedAmount after conversion is %s', $this->convertedAmount));
}
Log::debug(sprintf('After modifiers the result is: "%s"', $this->convertedAmount));
$this->calculateAmount();
}
Log::debug(sprintf('convertedAmount is: "%s"', $this->convertedAmount));
if (0 === bccomp($this->convertedAmount, '0')) {
@ -324,6 +282,71 @@ class ImportJournal
}
}
/**
* If convertedAmount is NULL, this method will try to calculate the correct amount.
* It starts with amount, but can be overruled by debet and credit amounts.
*
* @throws FireflyException
*/
private function calculateAmount()
{
// first check if the amount is set:
Log::debug('convertedAmount is NULL');
$info = $this->selectAmountInput();
if (0 === count($info)) {
throw new FireflyException('No amount information for this row.');
}
Log::debug(sprintf('Converter class is %s', $info['class']));
/** @var ConverterInterface $amountConverter */
$amountConverter = app($info['class']);
$this->convertedAmount = $amountConverter->convert($info['value']);
Log::debug(sprintf('First attempt to convert gives "%s"', $this->convertedAmount));
// modify
foreach ($this->modifiers as $modifier) {
$class = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $modifier['role'])));
/** @var ConverterInterface $converter */
$converter = app($class);
Log::debug(sprintf('Now launching converter %s', $class));
if ($converter->convert($modifier['value']) === -1) {
$this->convertedAmount = Steam::negative($this->convertedAmount);
}
Log::debug(sprintf('convertedAmount after conversion is %s', $this->convertedAmount));
}
Log::debug(sprintf('After modifiers the result is: "%s"', $this->convertedAmount));
}
/**
* This methods decides which input to use for the amount calculation.
*
* @return array
*/
private function selectAmountInput()
{
$converterClass = '';
if (!is_null($this->amount)) {
Log::debug('Amount value is not NULL, assume this is the correct value.');
$converterClass = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $this->amount['role'])));
$info = $this->amount;
}
if (!is_null($this->amountDebet)) {
Log::debug('Amount DEBET value is not NULL, assume this is the correct value (overrules Amount).');
$converterClass = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $this->amountDebet['role'])));
$info = $this->amountDebet;
}
if (!is_null($this->amountCredit)) {
Log::debug('Amount CREDIT value is not NULL, assume this is the correct value (overrules Amount and AmountDebet).');
$converterClass = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $this->amountCredit['role'])));
$info = $this->amountCredit;
}
$info['class'] = $converterClass;
return $info;
}
/**
* @param array $array
*/

BIN
resources/stubs/binary.bin Normal file

Binary file not shown.

View File

@ -26,6 +26,7 @@ use Carbon\Carbon;
use FireflyIII\Helpers\Collector\JournalCollectorInterface;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\Preference;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionJournal;
@ -35,6 +36,7 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use Preferences;
use Steam;
use Tests\TestCase;
@ -347,6 +349,9 @@ class AccountControllerTest extends TestCase
$repository->shouldReceive('store')->once()->andReturn(factory(Account::class)->make());
$journalRepos->shouldReceive('first')->once()->andReturn(new TransactionJournal);
// change the preference:
Preferences::setForUser($this->user(), 'frontPageAccounts', [1]);
$this->session(['accounts.create.uri' => 'http://localhost']);
$this->be($this->user());
$data = [

View File

@ -0,0 +1,235 @@
<?php
/**
* LinkControllerTest.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 Tests\Feature\Controllers;
use FireflyIII\Models\LinkType;
use Tests\TestCase;
/**
* Class LinkControllerTest
*
* @SuppressWarnings(PHPMD.TooManyPublicMethods)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class LinkControllerTest extends TestCase
{
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::__construct
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::create
*/
public function testCreate()
{
$this->be($this->user());
$response = $this->get(route('admin.links.create'));
$response->assertStatus(200);
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::delete
*/
public function testDeleteEditable()
{
// create editable link type just in case:
LinkType::create(['editable' => 1, 'inward' => 'hello', 'outward' => 'bye', 'name' => 'Test type']);
$linkType = LinkType::where('editable', 1)->first();
$this->be($this->user());
$response = $this->get(route('admin.links.delete', [$linkType->id]));
$response->assertStatus(200);
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::delete
*/
public function testDeleteNonEditable()
{
$linkType = LinkType::where('editable', 0)->first();
$this->be($this->user());
$response = $this->get(route('admin.links.delete', [$linkType->id]));
$response->assertStatus(302);
$response->assertSessionHas('error');
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::destroy
*/
public function testDestroy()
{
// create editable link type just in case:
LinkType::create(['editable' => 1, 'inward' => 'hellox', 'outward' => 'byex', 'name' => 'Test typeX']);
$linkType = LinkType::where('editable', 1)->first();
$this->be($this->user());
$this->session(['link_types.delete.uri' => 'http://localhost']);
$response = $this->post(route('admin.links.destroy', [$linkType->id]));
$response->assertStatus(302);
$response->assertSessionHas('success');
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::edit
*/
public function testEditEditable()
{
// create editable link type just in case:
LinkType::create(['editable' => 1, 'inward' => 'hello Y', 'outward' => 'bye Y', 'name' => 'Test type Y']);
$linkType = LinkType::where('editable', 1)->first();
$this->be($this->user());
$response = $this->get(route('admin.links.edit', [$linkType->id]));
$response->assertStatus(200);
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::edit
*/
public function testEditNonEditable()
{
$linkType = LinkType::where('editable', 0)->first();
$this->be($this->user());
$response = $this->get(route('admin.links.edit', [$linkType->id]));
$response->assertStatus(302);
$response->assertSessionHas('error');
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::index
*/
public function testIndex()
{
$this->be($this->user());
$response = $this->get(route('admin.links.index'));
$response->assertStatus(200);
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::show
*/
public function testShow()
{
$linkType = LinkType::first();
$this->be($this->user());
$response = $this->get(route('admin.links.show', [$linkType->id]));
$response->assertStatus(200);
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::store
*/
public function testStore()
{
$data = [
'name' => 'test ' . rand(1, 1000),
'inward' => 'test inward' . rand(1, 1000),
'outward' => 'test outward' . rand(1, 1000),
];
$this->session(['link_types.create.uri' => 'http://localhost']);
$this->be($this->user());
$response = $this->post(route('admin.links.store'), $data);
$response->assertStatus(302);
$response->assertSessionHas('success');
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::store
*/
public function testStoreRedirect()
{
$data = [
'name' => 'test ' . rand(1, 1000),
'inward' => 'test inward' . rand(1, 1000),
'outward' => 'test outward' . rand(1, 1000),
'create_another' => '1',
];
$this->session(['link_types.create.uri' => 'http://localhost']);
$this->be($this->user());
$response = $this->post(route('admin.links.store'), $data);
$response->assertStatus(302);
$response->assertSessionHas('success');
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::update
*/
public function testUpdate()
{
// create editable link type just in case:
$linKType = LinkType::create(['editable' => 1, 'inward' => 'helloxz', 'outward' => 'bzyex', 'name' => 'Test tyzpeX']);
$data = [
'name' => 'test ' . rand(1, 1000),
'inward' => 'test inward' . rand(1, 1000),
'outward' => 'test outward' . rand(1, 1000),
];
$this->session(['link_types.edit.uri' => 'http://localhost']);
$this->be($this->user());
$response = $this->post(route('admin.links.update', [$linKType->id]), $data);
$response->assertStatus(302);
$response->assertSessionHas('success');
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::update
*/
public function testUpdateNonEditable()
{
// create editable link type just in case:
$linkType = LinkType::where('editable', 0)->first();
$data = [
'name' => 'test ' . rand(1, 1000),
'inward' => 'test inward' . rand(1, 1000),
'outward' => 'test outward' . rand(1, 1000),
'return_to_edit' => '1',
];
$this->session(['link_types.edit.uri' => 'http://localhost']);
$this->be($this->user());
$response = $this->post(route('admin.links.update', [$linkType->id]), $data);
$response->assertStatus(302);
$response->assertSessionHas('error');
}
/**
* @covers \FireflyIII\Http\Controllers\Admin\LinkController::update
*/
public function testUpdateRedirect()
{
// create editable link type just in case:
$linkType = LinkType::create(['editable' => 1, 'inward' => 'healox', 'outward' => 'byaex', 'name' => 'Test tyapeX']);
$data = [
'name' => 'test ' . rand(1, 1000),
'inward' => 'test inward' . rand(1, 1000),
'outward' => 'test outward' . rand(1, 1000),
'return_to_edit' => '1',
];
$this->session(['link_types.edit.uri' => 'http://localhost']);
$this->be($this->user());
$response = $this->post(route('admin.links.update', [$linkType->id]), $data);
$response->assertStatus(302);
$response->assertSessionHas('success');
}
}

View File

@ -65,8 +65,8 @@ class AttachmentHelperTest extends TestCase
{
$journal = TransactionJournal::first();
$helper = new AttachmentHelper;
$path = resource_path('stubs/csv.csv');
$file = new UploadedFile($path, 'csv.csv', 'text/plain', filesize($path), null, true);
$path = resource_path('stubs/binary.bin');
$file = new UploadedFile($path, 'binary.bin', 'application/octet-stream', filesize($path), null, true);
$helper->saveAttachmentsForModel($journal, [$file]);
$errors = $helper->getErrors();
@ -74,7 +74,7 @@ class AttachmentHelperTest extends TestCase
$this->assertCount(1, $errors);
$this->assertCount(0, $messages);
$this->assertEquals('File "csv.csv" is of type "text/plain" which is not accepted as a new upload.', $errors->first());
$this->assertEquals('File "binary.bin" is of type "application/octet-stream" which is not accepted as a new upload.', $errors->first());
}
/**