Increased coverage and fixed a nasty bug.

This commit is contained in:
James Cole 2015-06-05 07:10:51 +02:00
parent d579992c98
commit fea9bc4e7e
10 changed files with 161 additions and 120 deletions

View File

@ -109,7 +109,6 @@ class AuthController extends Controller
if (User::count() == 1) { if (User::count() == 1) {
$admin = Role::where('name', 'owner')->first(); $admin = Role::where('name', 'owner')->first();
$this->auth->user()->attachRole($admin); $this->auth->user()->attachRole($admin);
// $this->auth->user()->roles()->save($admin);
} }

View File

@ -23,7 +23,7 @@ class NewUserController extends Controller
/** /**
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
* *
* @return \Illuminate\View\View * @@return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
*/ */
public function index(AccountRepositoryInterface $repository) public function index(AccountRepositoryInterface $repository)
{ {
@ -45,6 +45,8 @@ class NewUserController extends Controller
/** /**
* @param NewUserFormRequest $request * @param NewUserFormRequest $request
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
*
* @return \Illuminate\Http\RedirectResponse
*/ */
public function submit(NewUserFormRequest $request, AccountRepositoryInterface $repository) public function submit(NewUserFormRequest $request, AccountRepositoryInterface $repository)
{ {
@ -97,20 +99,8 @@ class NewUserController extends Controller
$creditCard = $repository->store($creditAccount); $creditCard = $repository->store($creditAccount);
// store meta for CC: // store meta for CC:
AccountMeta::create( AccountMeta::create(['name' => 'ccType', 'data' => 'monthlyFull', 'account_id' => $creditCard->id,]);
[ AccountMeta::create(['name' => 'ccMonthlyPaymentDate', 'data' => Carbon::now()->year . '-01-01', 'account_id' => $creditCard->id,]);
'name' => 'ccType',
'data' => 'monthlyFull',
'account_id' => $creditCard->id,
]
);
AccountMeta::create(
[
'name' => 'ccMonthlyPaymentDate',
'data' => Carbon::now()->year . '-01-01',
'account_id' => $creditCard->id,
]
);
} }
Session::flash('success', 'New account(s) created!'); Session::flash('success', 'New account(s) created!');

View File

@ -46,7 +46,7 @@ use Watson\Validating\ValidatingTrait;
* @property mixed lastActivityDate * @property mixed lastActivityDate
* @property mixed piggyBalance * @property mixed piggyBalance
* @property mixed difference * @property mixed difference
* @propery mixed percentage * @property mixed percentage
*/ */
class Account extends Model class Account extends Model
{ {

View File

@ -69,6 +69,8 @@ use Watson\Validating\ValidatingTrait;
* @property mixed name * @property mixed name
* @property mixed symbol * @property mixed symbol
* @property-read mixed $correct_amount * @property-read mixed $correct_amount
* @method static \FireflyIII\Models\TransactionJournal orderBy
* @method static \FireflyIII\Models\TransactionJournal|null first
*/ */
class TransactionJournal extends Model class TransactionJournal extends Model
{ {

View File

@ -373,8 +373,9 @@ class AccountRepository implements AccountRepositoryInterface
*/ */
public function openingBalanceTransaction(Account $account) public function openingBalanceTransaction(Account $account)
{ {
return TransactionJournal::accountIs($account) return TransactionJournal
->orderBy('transaction_journals.date', 'ASC') ::orderBy('transaction_journals.date', 'ASC')
->accountIs($account)
->orderBy('created_at', 'ASC') ->orderBy('created_at', 'ASC')
->first(['transaction_journals.*']); ->first(['transaction_journals.*']);
} }

View File

@ -75,14 +75,14 @@ class CategoryRepository implements CategoryRepositoryInterface
->where('categories.user_id', Auth::user()->id) ->where('categories.user_id', Auth::user()->id)
->after($start) ->after($start)
->transactionTypes(['Withdrawal']) ->transactionTypes(['Withdrawal'])
->groupBy('categories.id')
->get(['categories.id as category_id', 'categories.encrypted as category_encrypted', 'categories.name', 'transaction_journals.*']); ->get(['categories.id as category_id', 'categories.encrypted as category_encrypted', 'categories.name', 'transaction_journals.*']);
$result = []; $result = [];
foreach ($set as $entry) { foreach ($set as $entry) {
$categoryId = intval($entry->category_id); $categoryId = intval($entry->category_id);
if (isset($result[$categoryId])) { if (isset($result[$categoryId])) {
$result[$categoryId]['sum'] += floatval($entry->amount); bcscale(2);
$result[$categoryId]['sum'] = bcadd($result[$categoryId]['sum'], $entry->amount);
} else { } else {
$isEncrypted = intval($entry->category_encrypted) == 1 ? true : false; $isEncrypted = intval($entry->category_encrypted) == 1 ? true : false;
$name = strlen($entry->name) == 0 ? trans('firefly.no_category') : $entry->name; $name = strlen($entry->name) == 0 ? trans('firefly.no_category') : $entry->name;

View File

@ -9,6 +9,9 @@ if (!class_exists('RandomString')) {
*/ */
class RandomString class RandomString
{ {
public static $count = 0;
public static $set = [];
/** /**
* @param int $length * @param int $length
* *
@ -18,11 +21,22 @@ if (!class_exists('RandomString')) {
{ {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters); $charactersLength = strlen($characters);
$randomString = ''; $randomString = '';
for ($i = 0; $i < $length; $i++) { for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)]; $randomString .= $characters[rand(0, $charactersLength - 1)];
} }
while (in_array($randomString, self::$set)) {
// create another if its in the current $set:
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
}
self::$set[] = $randomString;
return $randomString; return $randomString;
} }
@ -201,7 +215,7 @@ FactoryMuffin::define(
return RandomString::generateRandomString(3); return RandomString::generateRandomString(3);
}, },
'symbol' => function () { 'symbol' => function () {
return RandomString::generateRandomString(2); return RandomString::generateRandomString(8);
}, },
'name' => 'word' 'name' => 'word'
] ]

View File

@ -3,7 +3,6 @@ use Carbon\Carbon;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\AccountMeta; use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\Models\Transaction;
use FireflyIII\Repositories\Account\AccountRepository; use FireflyIII\Repositories\Account\AccountRepository;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use League\FactoryMuffin\Facade as FactoryMuffin; use League\FactoryMuffin\Facade as FactoryMuffin;
@ -414,63 +413,80 @@ class AccountRepositoryTest extends TestCase
public function testGetTransfersInRange() public function testGetTransfersInRange()
{ {
FactoryMuffin::create('FireflyIII\Models\Account'); FactoryMuffin::create('FireflyIII\Models\Account');
FactoryMuffin::create('FireflyIII\Models\TransactionType'); // withdrawal
FactoryMuffin::create('FireflyIII\Models\TransactionType'); // deposit
// three transfers, two out of range: FactoryMuffin::create('FireflyIII\Models\AccountType'); // expense
FactoryMuffin::create('FireflyIII\Models\TransactionType'); FactoryMuffin::create('FireflyIII\Models\AccountType'); // revenue
FactoryMuffin::create('FireflyIII\Models\TransactionType'); $asset = FactoryMuffin::create('FireflyIII\Models\AccountType'); // asset
$journal1 = FactoryMuffin::create('FireflyIII\Models\TransactionJournal'); $transfer = FactoryMuffin::create('FireflyIII\Models\TransactionType'); // transfer
$journal2 = FactoryMuffin::create('FireflyIII\Models\TransactionJournal'); $user = FactoryMuffin::create('FireflyIII\User'); // user!
$journal3 = FactoryMuffin::create('FireflyIII\Models\TransactionJournal'); $accounts = [];
$account = FactoryMuffin::create('FireflyIII\Models\Account'); $opposings = []; // opposing accounts.
$journal2->transaction_type_id = $journal1->transaction_type_id; $journals = [];
$journal3->transaction_type_id = $journal1->transaction_type_id; // dates
// transactions are already present, update them!
$journal1->transactions[0]->account_id = $account->id;
$journal1->transactions[0]->amount = 100;
$journal1->transactions[1]->account_id = $account->id;
$journal1->transactions[1]->amount = 100;
$journal2->transactions[0]->account_id = $account->id;
$journal2->transactions[0]->amount = 100;
$journal2->transactions[1]->account_id = $account->id;
$journal2->transactions[1]->amount = 100;
$journal3->transactions[0]->account_id = $account->id;
$journal3->transactions[0]->amount = 100;
$journal3->transactions[1]->account_id = $account->id;
$journal3->transactions[1]->amount = 100;
$journal1->transactions[0]->save();
$journal1->transactions[1]->save();
$journal2->transactions[0]->save();
$journal2->transactions[1]->save();
$journal3->transactions[0]->save();
$journal3->transactions[1]->save();
// check date:
$start = new Carbon('2014-01-01'); $start = new Carbon('2014-01-01');
$end = new Carbon('2014-01-31'); $end = new Carbon('2014-01-31');
$inRange = new Carbon('2014-01-15'); $inRange = new Carbon('2014-01-15');
$before = new Carbon('2013-01-15'); $before = new Carbon('2013-01-15');
$after = new Carbon('2015-01-15');
// journal 1 will match: // create two accounts:
$journal1->date = $inRange; for ($i = 0; $i < 2; $i++) {
$journal1->user_id = $account->user_id; $account = FactoryMuffin::create('FireflyIII\Models\Account');
$journal2->date = $before; $account->account_type_id = $asset->id;
$journal2->user_id = $account->user_id; $account->user_id = $user->id;
$journal3->date = $after; $account->save();
$journal3->user_id = $account->user_id; $accounts[] = $account;
$journal1->save();
$journal2->save();
$journal3->save();
$this->be($account->user);
$set = $this->object->getTransfersInRange($account, $start, $end); $opposing = FactoryMuffin::create('FireflyIII\Models\Account');
$opposing->account_type_id = $asset->id;
$opposing->user_id = $user->id;
$opposing->save();
$opposings[] = $opposing;
}
// for each account, create ten journals
foreach ($accounts as $index => $account) {
for ($i = 0; $i < 10; $i++) {
$journal = FactoryMuffin::create('FireflyIII\Models\TransactionJournal');
$journal->user_id = $user->id;
$journal->transaction_type_id = $transfer->id;
$journal->save();
// if $i < 6, transfer is in range:
if ($i < 6) {
$journal->date = $inRange;
} else {
$journal->date = $before;
}
/*
* Transfers can go either way (see the amount)
*/
if($i < 4) {
$amount = 100;
} else {
$amount = -100;
}
$this->assertEquals(1, $set->count()); $journal->transactions[0]->account_id = $account->id;
$journal->transactions[0]->amount = $amount;
$journal->transactions[1]->account_id = $opposings[$index]->id;
$journal->transactions[1]->amount = $amount * -1;
$journal->transactions[0]->save();
$journal->transactions[1]->save();
// save journal:
$journal->save();
$journals[] = $journal;
}
}
$this->be($user);
$set = $this->object->getTransfersInRange($accounts[0], $start, $end);
$this->assertEquals(4, $set->count());
$this->assertEquals(100, $set->first()->amount); $this->assertEquals(100, $set->first()->amount);
$this->assertEquals($journal1->description, $set->first()->description); $this->assertEquals($journals[0]->description, $set->first()->description);
} }

View File

@ -85,52 +85,42 @@ class CategoryRepositoryTest extends TestCase
public function testGetCategoriesAndExpensesCorrected() public function testGetCategoriesAndExpensesCorrected()
{ {
$user = FactoryMuffin::create('FireflyIII\User'); $user = FactoryMuffin::create('FireflyIII\User');
$type = FactoryMuffin::create('FireflyIII\Models\TransactionType'); $type = FactoryMuffin::create('FireflyIII\Models\TransactionType'); // withdrawal
// some journals and categories: $currency = FactoryMuffin::create('FireflyIII\Models\TransactionCurrency'); // something
for ($i = 0; $i < 5; $i++) {
// some dates:
$start = new Carbon('2014-01-01');
$end = new Carbon('2014-01-31');
$inRange = new Carbon('2014-01-12');
// generate three categories
// with ten journals each:
for ($i = 0; $i < 3; $i++) {
// category:
/** @var Category $category */
$category = FactoryMuffin::create('FireflyIII\Models\Category');
$category->user_id = $user->id;
$category->save();
for ($j = 0; $j < 10; $j++) {
$journal = FactoryMuffin::create('FireflyIII\Models\TransactionJournal'); $journal = FactoryMuffin::create('FireflyIII\Models\TransactionJournal');
/** @var Category $category */
$category = FactoryMuffin::create('FireflyIII\Models\Category');
$journal->user_id = $user->id; $journal->user_id = $user->id;
$journal->date = new Carbon('2015-02-11'); $journal->transaction_currency_id = $currency->id;
$journal->transaction_type_id = $type->id; $journal->transaction_type_id = $type->id; // make it a withdrawal
$category->user_id = $user->id; $journal->date = $inRange;
$category->transactionjournals()->save($journal);
$journal->save(); $journal->save();
$category->save(); // connect to category:
$category->transactionjournals()->save($journal);
} }
for ($i = 0; $i < 5; $i++) {
$journal1 = FactoryMuffin::create('FireflyIII\Models\TransactionJournal');
$journal2 = FactoryMuffin::create('FireflyIII\Models\TransactionJournal');
/** @var Category $category */
$category = FactoryMuffin::create('FireflyIII\Models\Category');
$journal1->user_id = $user->id;
$journal1->date = new Carbon('2015-02-11');
$journal1->transaction_type_id = $type->id;
$journal2->user_id = $user->id;
$journal2->date = new Carbon('2015-02-11');
$journal2->transaction_type_id = $type->id;
$category->user_id = $user->id;
$category->transactionjournals()->save($journal1);
$category->transactionjournals()->save($journal2);
$journal1->save();
$journal2->save();
$category->save();
} }
$this->be($user); $this->be($user);
$set = $this->object->getCategoriesAndExpensesCorrected(new Carbon('2015-02-01'), new Carbon('2015-02-28')); $set = $this->object->getCategoriesAndExpensesCorrected($start, $end);
$this->assertCount(10, $set); $this->assertCount(3, $set);
reset($set); reset($set);
// every journal has amount 100. // 10 journals of 100 each = 1000.
$this->assertEquals(100, current($set)['sum']); $this->assertEquals('1000', current($set)['sum']);
} }
/** /**

View File

@ -1,4 +1,5 @@
<?php <?php
use Carbon\Carbon;
use FireflyIII\Models\Reminder; use FireflyIII\Models\Reminder;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
@ -92,12 +93,40 @@ class JournalRepositoryTest extends TestCase
*/ */
public function testGetAmountBefore() public function testGetAmountBefore()
{ {
// create some accounts:
$expense = FactoryMuffin::create('FireflyIII\Models\Account'); // expense
FactoryMuffin::create('FireflyIII\Models\Account'); // revenue
$asset = FactoryMuffin::create('FireflyIII\Models\Account'); // asset
// transaction type
$withdrawal = FactoryMuffin::create('FireflyIII\Models\TransactionType'); // withdrawal
// create five journals with incrementing dates:
$today = new Carbon('2015-01-01');
for($i=0;$i<5;$i++) {
// create journal:
$journal = FactoryMuffin::create('FireflyIII\Models\TransactionJournal');
$journal->transaction_type_id = $withdrawal;
$journal->date = $today;
$journal->save();
// update transactions:
$journal->transactions[0]->amount = -100;
$journal->transactions[0]->account_id = $asset->id;
$journal->transactions[0]->save();
$journal->transactions[1]->amount = 100;
$journal->transactions[1]->account_id = $expense->id;
$journal->transactions[1]->save();
// connect to expense
$today->addDay();
}
$transaction = FactoryMuffin::create('FireflyIII\Models\Transaction'); $before = $this->object->getAmountBefore($journal, $journal->transactions[1]);
$before = $this->object->getAmountBefore($transaction->transactionjournal, $transaction); // five transactions, we check the last one, so amount should be 400.
$this->assertEquals(400, $before);
$this->assertEquals(0, $before);
} }
/** /**