Update for bug fix release.

This commit is contained in:
James Cole 2018-07-13 06:12:39 +02:00
parent 5846431b34
commit bcdb849b46
7 changed files with 74 additions and 35 deletions

View File

@ -117,7 +117,8 @@ class ReconcileController extends Controller
* @param Carbon|null $end * @param Carbon|null $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
* * @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* @throws FireflyException * @throws FireflyException
*/ */
public function reconcile(Account $account, Carbon $start = null, Carbon $end = null) public function reconcile(Account $account, Carbon $start = null, Carbon $end = null)
@ -201,6 +202,9 @@ class ReconcileController extends Controller
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
* @throws FireflyException * @throws FireflyException
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/ */
public function submit(ReconciliationStoreRequest $request, Account $account, Carbon $start, Carbon $end) public function submit(ReconciliationStoreRequest $request, Account $account, Carbon $start, Carbon $end)
{ {
@ -217,16 +221,13 @@ class ReconcileController extends Controller
if ('create' === $data['reconcile']) { if ('create' === $data['reconcile']) {
// get "opposing" account. // get "opposing" account.
$reconciliation = $this->accountRepos->getReconciliation($account); $reconciliation = $this->accountRepos->getReconciliation($account);
$difference = $data['difference'];
$source = $reconciliation;
$difference = $data['difference']; $destination = $account;
$source = $reconciliation;
$destination = $account;
if (1 === bccomp($difference, '0')) { if (1 === bccomp($difference, '0')) {
// amount is positive. Add it to reconciliation? // amount is positive. Add it to reconciliation?
$source = $account; $source = $account;
$destination = $reconciliation; $destination = $reconciliation;
} }
// data for journal // data for journal
@ -271,9 +272,7 @@ class ReconcileController extends Controller
$this->repository->store($journalData); $this->repository->store($journalData);
} }
Log::debug('End of routine.'); Log::debug('End of routine.');
app('preferences')->mark(); app('preferences')->mark();
session()->flash('success', trans('firefly.reconciliation_stored')); session()->flash('success', trans('firefly.reconciliation_stored'));
return redirect(route('accounts.show', [$account->id])); return redirect(route('accounts.show', [$account->id]));

View File

@ -2,6 +2,17 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/). This project adheres to [Semantic Versioning](http://semver.org/).
## [4.7.5.1] - 2018-07-13
### Fixed
- #1531, the database routine incorrectly reports empty categories.
- #1532, broken dropdown for autosuggest things.
- #1533, fix where the import could not import category names.
- #1538, fix a bug where Spectre would not work when ignoring rules.
- #1542, fix a bug where the importer was incapable of generating new currencies.
- #1541, no longer ignore composer.lock in Docker ignore.
- Bills are stored inactive.
## [4.7.5] - 2018-07-02 ## [4.7.5] - 2018-07-02
### Added ### Added
- A new feature called "recurring transactions" that will make Firefly III automatically create transactions for you. - A new feature called "recurring transactions" that will make Firefly III automatically create transactions for you.

View File

@ -88,8 +88,8 @@ return [
'is_demo_site' => false, 'is_demo_site' => false,
], ],
'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true, 'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true,
'version' => '4.7.5', 'version' => '4.7.5.1',
'api_version' => '0.4', 'api_version' => '0.5',
'db_version' => 4, 'db_version' => 4,
'maxUploadSize' => 15242880, 'maxUploadSize' => 15242880,
'allowedMimes' => [ 'allowedMimes' => [

View File

@ -163,7 +163,7 @@ class CurrencyControllerTest extends TestCase
'code' => 'ABC', 'code' => 'ABC',
'symbol' => 'A', 'symbol' => 'A',
'decimal_places' => 2, 'decimal_places' => 2,
'default' => 'false', 'default' => '0',
]; ];
// test API // test API
@ -200,7 +200,7 @@ class CurrencyControllerTest extends TestCase
'code' => 'ABC', 'code' => 'ABC',
'symbol' => 'A', 'symbol' => 'A',
'decimal_places' => 2, 'decimal_places' => 2,
'default' => 'true', 'default' => '1',
]; ];
// test API // test API
@ -232,7 +232,7 @@ class CurrencyControllerTest extends TestCase
'code' => 'ABC', 'code' => 'ABC',
'symbol' => '$E', 'symbol' => '$E',
'decimal_places' => '2', 'decimal_places' => '2',
'default' => 'false', 'default' => '0',
]; ];
// test API // test API
@ -270,7 +270,7 @@ class CurrencyControllerTest extends TestCase
'code' => 'ABC', 'code' => 'ABC',
'symbol' => '$E', 'symbol' => '$E',
'decimal_places' => '2', 'decimal_places' => '2',
'default' => 'true', 'default' => '1',
]; ];
// test API // test API

View File

@ -28,6 +28,7 @@ use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
use Mockery;
use Tests\TestCase; use Tests\TestCase;
/** /**
@ -94,6 +95,7 @@ class UserControllerTest extends TestCase
$users = factory(User::class, 10)->create(); $users = factory(User::class, 10)->create();
// mock stuff: // mock stuff:
$repository = $this->mock(UserRepositoryInterface::class); $repository = $this->mock(UserRepositoryInterface::class);
$repository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->once()->andReturn(true);
// mock calls: // mock calls:
$repository->shouldReceive('all')->withAnyArgs()->andReturn($users)->once(); $repository->shouldReceive('all')->withAnyArgs()->andReturn($users)->once();
@ -116,7 +118,9 @@ class UserControllerTest extends TestCase
*/ */
public function testShow(): void public function testShow(): void
{ {
$user = User::first(); $user = User::first();
$repository = $this->mock(UserRepositoryInterface::class);
$repository->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->once()->andReturn(true);
// test API // test API
$response = $this->get('/api/v1/users/' . $user->id); $response = $this->get('/api/v1/users/' . $user->id);
@ -139,7 +143,7 @@ class UserControllerTest extends TestCase
// mock // mock
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$userRepos->shouldReceive('hasRole')->once()->andReturn(true); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
$userRepos->shouldReceive('store')->once()->andReturn($this->user()); $userRepos->shouldReceive('store')->once()->andReturn($this->user());
// test API // test API
@ -163,7 +167,7 @@ class UserControllerTest extends TestCase
// mock // mock
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$userRepos->shouldReceive('hasRole')->once()->andReturn(true); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
// test API // test API
$response = $this->post('/api/v1/users', $data, ['Accept' => 'application/json']); $response = $this->post('/api/v1/users', $data, ['Accept' => 'application/json']);
$response->assertStatus(422); $response->assertStatus(422);
@ -199,7 +203,7 @@ class UserControllerTest extends TestCase
// mock // mock
$userRepos = $this->mock(UserRepositoryInterface::class); $userRepos = $this->mock(UserRepositoryInterface::class);
$userRepos->shouldReceive('update')->once()->andReturn($user); $userRepos->shouldReceive('update')->once()->andReturn($user);
$userRepos->shouldReceive('hasRole')->once()->andReturn(true); $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->twice()->andReturn(true);
// call API // call API
$response = $this->put('/api/v1/users/' . $user->id, $data); $response = $this->put('/api/v1/users/' . $user->id, $data);

View File

@ -24,6 +24,7 @@ namespace Tests\Unit\TransactionRules\Triggers;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\TransactionRules\Triggers\FromAccountStarts; use FireflyIII\TransactionRules\Triggers\FromAccountStarts;
use Log;
use Tests\TestCase; use Tests\TestCase;
/** /**
@ -31,19 +32,35 @@ use Tests\TestCase;
*/ */
class FromAccountStartsTest extends TestCase class FromAccountStartsTest extends TestCase
{ {
/**
*
*/
public function setUp()
{
parent::setUp();
Log::debug(sprintf('Now in %s.', \get_class($this)));
}
/** /**
* @covers \FireflyIII\TransactionRules\Triggers\FromAccountStarts::triggered * @covers \FireflyIII\TransactionRules\Triggers\FromAccountStarts::triggered
*/ */
public function testTriggered(): void public function testTriggered(): void
{ {
$count = 0; Log::debug('In testTriggered()');
$loops = 0; // FINAL LOOP METHOD.
do { do {
$journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first(); /** @var TransactionJournal $journal */
$transaction = $journal->transactions()->where('amount', '<', 0)->first(); $journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first();
$transactionCount = $journal->transactions()->count(); $transaction = $journal->transactions()->where('amount', '<', 0)->first();
$account = $transaction->account; $account = $transaction->account;
$count++; $count = $journal->transactions()->count();
} while ($account === null && $count < 30 && $transactionCount !== 2);
Log::debug(sprintf('Loop: %d, transaction count: %d, account is null: %d', $loops, $count, (int)null===$account));
$loops++;
// do this until: account is not null, journal has two transactions, loops is below 30
} while (!(null !== $account && 2 === $count && $loops < 30));
$trigger = FromAccountStarts::makeFromStrings(substr($account->name, 0, -3), false); $trigger = FromAccountStarts::makeFromStrings(substr($account->name, 0, -3), false);
$result = $trigger->triggered($journal); $result = $trigger->triggered($journal);
@ -55,14 +72,21 @@ class FromAccountStartsTest extends TestCase
*/ */
public function testTriggeredLonger(): void public function testTriggeredLonger(): void
{ {
$count = 0; Log::debug('In testTriggeredLonger()');
$loops = 0; // FINAL LOOP METHOD.
do { do {
$journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first(); /** @var TransactionJournal $journal */
$transaction = $journal->transactions()->where('amount', '<', 0)->first(); $journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first();
$transactionCount = $journal->transactions()->count(); $transaction = $journal->transactions()->where('amount', '<', 0)->first();
$account = $transaction->account; $account = $transaction->account;
$count++; $count = $journal->transactions()->count();
} while ($account === null && $count < 30 && $transactionCount !== 2);
Log::debug(sprintf('Loop: %d, transaction count: %d, account is null: %d', $loops, $count, (int)null===$account));
$loops++;
// do this until: account is not null, journal has two transactions, loops is below 30
} while (!(null !== $account && 2 === $count && $loops < 30));
$trigger = FromAccountStarts::makeFromStrings('bla-bla-bla' . $account->name, false); $trigger = FromAccountStarts::makeFromStrings('bla-bla-bla' . $account->name, false);
$result = $trigger->triggered($journal); $result = $trigger->triggered($journal);

View File

@ -38,19 +38,20 @@ class ToAccountStartsTest extends TestCase
public function testTriggered(): void public function testTriggered(): void
{ {
Log::debug('Now in testTriggered'); Log::debug('Now in testTriggered');
$loopCount = 0; $loopCount = 0;
$account = null; $account = null;
do { do {
Log::debug(sprintf('Count of loop: %d', $loopCount)); Log::debug(sprintf('Count of loop: %d', $loopCount));
$journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first(); $journal = $this->user()->transactionJournals()->inRandomOrder()->whereNull('deleted_at')->first();
$count = $journal->transactions()->where('amount', '>', 0)->count(); $count = $journal->transactions()->where('amount', '>', 0)->count();
$transaction = $journal->transactions()->where('amount', '>', 0)->first(); $transaction = $journal->transactions()->where('amount', '>', 0)->first();
$account = null === $transaction ? null : $transaction->account; $account = null === $transaction ? null : $transaction->account;
Log::debug(sprintf('Journal with id #%d', $journal->id)); Log::debug(sprintf('Journal with id #%d', $journal->id));
Log::debug(sprintf('Count of transactions is %d', $count)); Log::debug(sprintf('Count of transactions is %d', $count));
Log::debug(sprintf('Account is null: %s', var_export(null === $account, true))); Log::debug(sprintf('Account is null: %s', var_export(null === $account, true)));
} while ($loopCount < 30 && $count !== 1 && null !== $account); } while ($loopCount < 30 && $count < 1 && null !== $account);
$trigger = ToAccountStarts::makeFromStrings(substr($account->name, 0, -3), false); $trigger = ToAccountStarts::makeFromStrings(substr($account->name, 0, -3), false);