diff --git a/app/tests/controllers/TransactionControllerTest.php b/app/tests/controllers/TransactionControllerTest.php new file mode 100644 index 0000000000..c997e3ce0c --- /dev/null +++ b/app/tests/controllers/TransactionControllerTest.php @@ -0,0 +1,298 @@ +_user = m::mock('User', 'Eloquent'); + $this->_repository = $this->mock('Firefly\Storage\TransactionJournal\TransactionJournalRepositoryInterface'); + $this->_accounts = $this->mock('Firefly\Storage\Account\AccountRepositoryInterface'); + $this->_budgets = $this->mock('Firefly\Storage\Budget\BudgetRepositoryInterface'); + + } + + public function tearDown() + { + m::close(); + } + + public function testCreateDeposit() + { + $this->_accounts->shouldReceive('getActiveDefaultAsSelectList')->andReturn([]); + $this->_budgets->shouldReceive('getAsSelectList')->andReturn([]); + $this->action('GET', 'TransactionController@create', ['what' => 'deposit']); + $this->assertResponseOk(); + } + + public function testCreateTransfer() + { + $this->_accounts->shouldReceive('getActiveDefaultAsSelectList')->andReturn([]); + $this->_budgets->shouldReceive('getAsSelectList')->andReturn([]); + $this->action('GET', 'TransactionController@create', ['what' => 'transfer']); + $this->assertResponseOk(); + } + + public function testCreateWithdrawal() + { + $this->_accounts->shouldReceive('getActiveDefaultAsSelectList')->andReturn([]); + $this->_budgets->shouldReceive('getAsSelectList')->andReturn([]); + $this->action('GET', 'TransactionController@create', ['what' => 'withdrawal']); + $this->assertResponseOk(); + } + + public function testDelete() + { + $journal = f::create('TransactionJournal'); + + // for binding + Auth::shouldReceive('user')->andReturn($this->_user); + Auth::shouldReceive('check')->andReturn(true); + $this->_user->shouldReceive('getAttribute')->with('id')->once()->andReturn($journal->user_id); + $this->_user->shouldReceive('getAttribute')->with('email')->andReturn('some@email'); + + $this->action('GET', 'TransactionController@delete', $journal->id); + $this->assertResponseOk(); + } + + public function testDestroy() + { + $journal = f::create('TransactionJournal'); + + // for binding + Auth::shouldReceive('user')->andReturn($this->_user); + Auth::shouldReceive('check')->andReturn(true); + $this->_user->shouldReceive('getAttribute')->with('id')->once()->andReturn($journal->user_id); + $this->_user->shouldReceive('getAttribute')->with('email')->andReturn('some@email'); + + $this->action('POST', 'TransactionController@destroy', $journal->id); + $this->assertResponseStatus(302); + } + + public function testEdit() + { + $journal = f::create('TransactionJournal'); + $type = f::create('TransactionType'); + $type->type = 'Withdrawal'; + $type->save(); + $journal->transactiontype()->associate($type); + $journal->save(); + + $category = f::create('Category'); + $journal->categories()->save($category); + + $budget = f::create('Budget'); + $journal->budgets()->save($budget); + + $one = f::create('Transaction'); + $two = f::create('Transaction'); + $one->transactionjournal()->associate($journal); + $two->transactionjournal()->associate($journal); + $one->save(); + $two->save(); + + $this->_accounts->shouldReceive('getActiveDefaultAsSelectList')->andReturn([]); + $this->_budgets->shouldReceive('getAsSelectList')->andReturn([]); + + // for binding + Auth::shouldReceive('user')->andReturn($this->_user); + Auth::shouldReceive('check')->andReturn(true); + $this->_user->shouldReceive('getAttribute')->with('id')->once()->andReturn($journal->user_id); + $this->_user->shouldReceive('getAttribute')->with('email')->andReturn('some@email'); + + $this->action('GET', 'TransactionController@edit', $journal->id); + $this->assertResponseOk(); + } + + public function testEditDeposit() + { + $journal = f::create('TransactionJournal'); + $type = f::create('TransactionType'); + $type->type = 'Deposit'; + $type->save(); + $journal->transactiontype()->associate($type); + $journal->save(); + + $category = f::create('Category'); + $journal->categories()->save($category); + + $budget = f::create('Budget'); + $journal->budgets()->save($budget); + + $one = f::create('Transaction'); + $two = f::create('Transaction'); + $one->transactionjournal()->associate($journal); + $two->transactionjournal()->associate($journal); + $one->save(); + $two->save(); + + $this->_accounts->shouldReceive('getActiveDefaultAsSelectList')->andReturn([]); + $this->_budgets->shouldReceive('getAsSelectList')->andReturn([]); + + // for binding + Auth::shouldReceive('user')->andReturn($this->_user); + Auth::shouldReceive('check')->andReturn(true); + $this->_user->shouldReceive('getAttribute')->with('id')->once()->andReturn($journal->user_id); + $this->_user->shouldReceive('getAttribute')->with('email')->andReturn('some@email'); + + $this->action('GET', 'TransactionController@edit', $journal->id); + $this->assertResponseOk(); + } + + public function testEditTransfer() + { + $journal = f::create('TransactionJournal'); + $type = f::create('TransactionType'); + $type->type = 'Transfer'; + $type->save(); + $journal->transactiontype()->associate($type); + $journal->save(); + + $category = f::create('Category'); + $journal->categories()->save($category); + + $budget = f::create('Budget'); + $journal->budgets()->save($budget); + + $one = f::create('Transaction'); + $two = f::create('Transaction'); + $one->transactionjournal()->associate($journal); + $two->transactionjournal()->associate($journal); + $one->save(); + $two->save(); + + $this->_accounts->shouldReceive('getActiveDefaultAsSelectList')->andReturn([]); + $this->_budgets->shouldReceive('getAsSelectList')->andReturn([]); + + // for binding + Auth::shouldReceive('user')->andReturn($this->_user); + Auth::shouldReceive('check')->andReturn(true); + $this->_user->shouldReceive('getAttribute')->with('id')->once()->andReturn($journal->user_id); + $this->_user->shouldReceive('getAttribute')->with('email')->andReturn('some@email'); + + $this->action('GET', 'TransactionController@edit', $journal->id); + $this->assertResponseOk(); + } + + public function testIndex() + { + + $journal = f::create('TransactionJournal'); + $type = f::create('TransactionType'); + $type->type = 'Withdrawal'; + $type->save(); + $journal->transactiontype()->associate($type); + $journal->save(); + + $one = f::create('Transaction'); + $two = f::create('Transaction'); + $one->transactionjournal()->associate($journal); + $two->transactionjournal()->associate($journal); + $one->save(); + $two->save(); + + // make a paginator + $paginator = Paginator::make([$journal], 1, 1); + + + $this->_repository->shouldReceive('paginate')->with(25)->andReturn($paginator); + $this->_repository->shouldReceive('get')->andReturn([]); + $this->action('GET', 'TransactionController@index'); + $this->assertResponseOk(); + } + + public function testShow() + { + $journal = f::create('TransactionJournal'); + + // for binding + Auth::shouldReceive('user')->andReturn($this->_user); + Auth::shouldReceive('check')->andReturn(true); + $this->_user->shouldReceive('getAttribute')->with('id')->once()->andReturn($journal->user_id); + $this->_user->shouldReceive('getAttribute')->with('email')->andReturn('some@email'); + + $this->action('GET', 'TransactionController@show', $journal->id); + $this->assertResponseOk(); + } + + public function testStore() + { + $journal = f::create('TransactionJournal'); + + $this->_repository->shouldReceive('store')->andReturn($journal); + + $this->action('POST', 'TransactionController@store', ['what' => 'deposit']); + $this->assertResponseStatus(302); + } + + public function testStoreFails() + { + $journal = f::create('TransactionJournal'); + unset($journal->id); + + $this->_repository->shouldReceive('store')->andReturn($journal); + + $this->action('POST', 'TransactionController@store', ['what' => 'deposit', 'create' => '1']); + $this->assertResponseStatus(302); + } + + public function testStoreRedirect() + { + $journal = f::create('TransactionJournal'); + + $this->_repository->shouldReceive('store')->andReturn($journal); + + $this->action('POST', 'TransactionController@store', ['what' => 'deposit', 'create' => '1']); + $this->assertResponseStatus(302); + } + + public function testUpdate() + { + $journal = f::create('TransactionJournal'); + + + // for binding + Auth::shouldReceive('user')->andReturn($this->_user); + Auth::shouldReceive('check')->andReturn(true); + $this->_user->shouldReceive('getAttribute')->with('id')->once()->andReturn($journal->user_id); + $this->_user->shouldReceive('getAttribute')->with('email')->andReturn('some@email'); + + $this->_repository->shouldReceive('update')->andReturn($journal); + + $this->action('POST', 'TransactionController@update', $journal->id); + $this->assertResponseStatus(302); + } + + public function testUpdateFailed() + { + $journal = f::create('TransactionJournal'); + + + // for binding + Auth::shouldReceive('user')->andReturn($this->_user); + Auth::shouldReceive('check')->andReturn(true); + $this->_user->shouldReceive('getAttribute')->with('id')->once()->andReturn($journal->user_id); + $this->_user->shouldReceive('getAttribute')->with('email')->andReturn('some@email'); + + $journal->description = null; + + $this->_repository->shouldReceive('update')->andReturn($journal); + + $this->action('POST', 'TransactionController@update', $journal->id); + $this->assertResponseStatus(302); + } +} \ No newline at end of file