mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-22 20:16:22 +00:00 
			
		
		
		
	Improve test coverage.
This commit is contained in:
		| @@ -49,14 +49,20 @@ class AboutControllerTest extends TestCase | ||||
|      */ | ||||
|     public function testAbout(): void | ||||
|     { | ||||
|         // test API | ||||
|         $response = $this->get('/api/v1/about'); | ||||
|  | ||||
|         $search     = ['~', '#']; | ||||
|         $replace    = ['\~', '# ']; | ||||
|         $phpVersion = str_replace($search, $replace, PHP_VERSION); | ||||
|         $phpOs      = str_replace($search, $replace, PHP_OS); | ||||
|         $response   = $this->get(route('api.v1.about.index')); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson( | ||||
|             ['data' => [ | ||||
|                 'version'     => true, | ||||
|                 'api_version' => true, | ||||
|                 'php_version' => true, | ||||
|                 'version'     => config('firefly.version'), | ||||
|                 'api_version' => config('firefly.api_version'), | ||||
|                 'php_version' => $phpVersion, | ||||
|                 'os'          => $phpOs, | ||||
|                 'driver'      => 'sqlite', | ||||
|             ]] | ||||
|         ); | ||||
|     } | ||||
| @@ -68,11 +74,16 @@ class AboutControllerTest extends TestCase | ||||
|      */ | ||||
|     public function testUser(): void | ||||
|     { | ||||
|         // test API | ||||
|         $response = $this->get('/api/v1/about/user'); | ||||
|         $response = $this->get(route('api.v1.about.user')); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => ['attributes' => true, 'links' => true]]); | ||||
|         $this->assertEquals($this->user()->id, $response->json()['data']['id']); | ||||
|         $response->assertJson( | ||||
|             [ | ||||
|                 'data' => [ | ||||
|                     'attributes' => true, | ||||
|                     'links'      => true, | ||||
|                 ], | ||||
|             ] | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -23,10 +23,15 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace Tests\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollector; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollectorInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| use Mockery; | ||||
| @@ -184,7 +189,7 @@ class AccountControllerTest extends TestCase | ||||
|             [ | ||||
|                 'message' => 'The given data was invalid.', | ||||
|                 'errors'  => [ | ||||
|                     'credit_card_type'                 => ['The credit card type field is required when account role is ccAsset.'], | ||||
|                     'credit_card_type'     => ['The credit card type field is required when account role is ccAsset.'], | ||||
|                     'monthly_payment_date' => ['The monthly payment date field is required when account role is ccAsset.'], | ||||
|  | ||||
|                 ], | ||||
| @@ -233,6 +238,47 @@ class AccountControllerTest extends TestCase | ||||
|         $response->assertHeader('Content-Type', 'application/json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Test the list of piggy banks. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\AccountController | ||||
|      */ | ||||
|     public function testPiggyBanks(): void | ||||
|     { | ||||
|         // mock stuff: | ||||
|         $repository    = $this->mock(AccountRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $piggyRepos    = $this->mock(PiggyBankRepositoryInterface::class); | ||||
|  | ||||
|         // get piggies for this user. | ||||
|         $piggies = $this->user()->piggyBanks()->get(); | ||||
|         $asset   = $this->getRandomAsset(); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepos->shouldReceive('setUser'); | ||||
|         $piggyRepos->shouldReceive('setUser'); | ||||
|  | ||||
|         $repository->shouldReceive('getPiggyBanks')->andReturn($piggies)->once(); | ||||
|         $piggyRepos->shouldReceive('getCurrentAmount')->andReturn('12.45'); | ||||
|         $piggyRepos->shouldReceive('getSuggestedMonthlyAmount')->andReturn('12.45'); | ||||
|         $repository->shouldReceive('getMetaValue')->atLeast()->once()->andReturn(''); | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.accounts.piggy_banks', [$asset->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson( | ||||
|             ['meta' => ['pagination' => ['total'       => $piggies->count(), 'count' => $piggies->count(), 'per_page' => true, 'current_page' => 1, | ||||
|                                          'total_pages' => 1]],] | ||||
|         ); | ||||
|         $response->assertJson( | ||||
|             ['links' => ['self' => true, 'first' => true, 'last' => true,],] | ||||
|         ); | ||||
|         $response->assertSee('page=1'); // default returns this. | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show an account. | ||||
|      * | ||||
| @@ -459,6 +505,202 @@ class AccountControllerTest extends TestCase | ||||
|         $response->assertSee($account->name); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\AccountController | ||||
|      */ | ||||
|     public function testTransactionsBasic(): void | ||||
|     { | ||||
|         $accountRepos = $this->mock(AccountRepositoryInterface::class); | ||||
|         $accountRepos->shouldReceive('setUser'); | ||||
|         $accountRepos->shouldReceive('getAccountsByType') | ||||
|                      ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); | ||||
|  | ||||
|         $asset = $this->getRandomAsset(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue(); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|  | ||||
|  | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.accounts.transactions', [$asset->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\AccountController | ||||
|      */ | ||||
|     public function testTransactionsOpposing(): void | ||||
|     { | ||||
|         $accountRepos = $this->mock(AccountRepositoryInterface::class); | ||||
|         $accountRepos->shouldReceive('setUser'); | ||||
|         $accountRepos->shouldReceive('getAccountsByType') | ||||
|                      ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); | ||||
|  | ||||
|         $revenue = $this->getRandomRevenue(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnFalse(); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setOpposingAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|  | ||||
|  | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.accounts.transactions', [$revenue->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\AccountController | ||||
|      */ | ||||
|     public function testTransactionsRange(): void | ||||
|     { | ||||
|         $accountRepos = $this->mock(AccountRepositoryInterface::class); | ||||
|         $accountRepos->shouldReceive('setUser'); | ||||
|         $accountRepos->shouldReceive('getAccountsByType') | ||||
|                      ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); | ||||
|  | ||||
|         $asset = $this->getRandomAsset(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $accountRepos->shouldReceive('isAsset')->atLeast()->once()->andReturnTrue(); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setRange')->andReturnSelf(); | ||||
|  | ||||
|  | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.accounts.transactions', [$asset->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update first asset account we find. Name can be the same as it was. | ||||
|      * | ||||
|   | ||||
| @@ -57,7 +57,7 @@ class AttachmentControllerTest extends TestCase | ||||
|     public function testDelete(): void | ||||
|     { | ||||
|         // mock stuff: | ||||
|         $repository = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
| @@ -79,10 +79,10 @@ class AttachmentControllerTest extends TestCase | ||||
|     public function testDownload(): void | ||||
|     { | ||||
|         // mock stuff: | ||||
|         $repository = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|  | ||||
|         $content    = 'Attachment content ' . random_int(100, 1000); | ||||
|         $content = 'Attachment content ' . random_int(100, 1000); | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('exists')->andReturn(true)->once(); | ||||
| @@ -107,10 +107,10 @@ class AttachmentControllerTest extends TestCase | ||||
|     public function testDownloadNotExisting(): void | ||||
|     { | ||||
|         // mock stuff: | ||||
|         $repository = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|  | ||||
|         $content    = 'Attachment content ' . random_int(100, 1000); | ||||
|         $content = 'Attachment content ' . random_int(100, 1000); | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('exists')->andReturn(false)->once(); | ||||
| @@ -133,7 +133,7 @@ class AttachmentControllerTest extends TestCase | ||||
|     public function testDownloadNotUploaded(): void | ||||
|     { | ||||
|         // mock stuff: | ||||
|         $repository = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|  | ||||
|         // mock calls: | ||||
| @@ -172,7 +172,7 @@ class AttachmentControllerTest extends TestCase | ||||
|         $attachments = factory(Attachment::class, 10)->create(); | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|  | ||||
|  | ||||
| @@ -201,7 +201,7 @@ class AttachmentControllerTest extends TestCase | ||||
|         $attachment = $this->user()->attachments()->first(); | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|  | ||||
|  | ||||
| @@ -230,8 +230,8 @@ class AttachmentControllerTest extends TestCase | ||||
|         $attachment = $this->user()->attachments()->first(); | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository   = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $journalRepos = $this->mock(JournalRepositoryInterface::class); | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $journalRepos  = $this->mock(JournalRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|  | ||||
|  | ||||
| @@ -268,7 +268,7 @@ class AttachmentControllerTest extends TestCase | ||||
|     public function testUpdate(): void | ||||
|     { | ||||
|         // mock repositories | ||||
|         $repository = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|  | ||||
|  | ||||
| @@ -304,7 +304,7 @@ class AttachmentControllerTest extends TestCase | ||||
|      */ | ||||
|     public function testUpload(): void | ||||
|     { | ||||
|         $repository = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|  | ||||
|   | ||||
| @@ -24,8 +24,16 @@ declare(strict_types=1); | ||||
| namespace Tests\Api\V1\Controllers; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollector; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollectorInterface; | ||||
| use FireflyIII\Models\Attachment; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use Laravel\Passport\Passport; | ||||
| @@ -48,6 +56,37 @@ class BillControllerTest extends TestCase | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * List all attachments. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\BillController | ||||
|      */ | ||||
|     public function testAttachments(): void | ||||
|     { | ||||
|         // create stuff | ||||
|         $attachments = factory(Attachment::class, 10)->create(); | ||||
|         $bill        = $this->user()->bills()->first(); | ||||
|         // mock stuff: | ||||
|         $repository    = $this->mock(AttachmentRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $billRepos     = $this->mock(BillRepositoryInterface::class); | ||||
|  | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $billRepos->shouldReceive('setUser'); | ||||
|         $billRepos->shouldReceive('getAttachments')->once()->andReturn($attachments); | ||||
|         $repository->shouldReceive('getNoteText')->andReturn('Hi There'); | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.bills.attachments', [$bill->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Send delete | ||||
|      * | ||||
| @@ -100,6 +139,24 @@ class BillControllerTest extends TestCase | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\BillController | ||||
|      */ | ||||
|     public function testRules(): void | ||||
|     { | ||||
|         $rules     = $this->user()->rules()->get(); | ||||
|         $bill      = $this->user()->bills()->first(); | ||||
|         $billRepos = $this->mock(BillRepositoryInterface::class); | ||||
|         $billRepos->shouldReceive('setUser')->once(); | ||||
|         $billRepos->shouldReceive('getRulesForBill')->once()->andReturn($rules); | ||||
|  | ||||
|         // call API | ||||
|         $response = $this->get(route('api.v1.bills.rules', [$bill->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertSee($rules->first()->title); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show one bill | ||||
|      * | ||||
| @@ -213,6 +270,131 @@ class BillControllerTest extends TestCase | ||||
|         $response->assertSee($bill->name); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\BillController | ||||
|      */ | ||||
|     public function testTransactionsBasic(): void | ||||
|     { | ||||
|         $bill = $this->user()->bills()->first(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $accountRepos       = $this->mock(AccountRepositoryInterface::class); | ||||
|         $billRepos          = $this->mock(BillRepositoryInterface::class); | ||||
|         $billRepos->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|  | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setBills')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); | ||||
|  | ||||
|  | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.bills.transactions', [$bill->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\BillController | ||||
|      */ | ||||
|     public function testTransactionsRange(): void | ||||
|     { | ||||
|         $bill = $this->user()->bills()->first(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $billRepos          = $this->mock(BillRepositoryInterface::class); | ||||
|         $billRepos->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setBills')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setRange')->andReturnSelf(); | ||||
|  | ||||
|  | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.bills.transactions', [$bill->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update a valid bill. | ||||
|      * | ||||
|   | ||||
| @@ -24,8 +24,16 @@ declare(strict_types=1); | ||||
| namespace Tests\Api\V1\Controllers; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollector; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollectorInterface; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| use Tests\TestCase; | ||||
| @@ -46,6 +54,27 @@ class BudgetControllerTest extends TestCase | ||||
|         Log::info(sprintf('Now in %s.', \get_class($this))); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show all budgets | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\BudgetController | ||||
|      */ | ||||
|     public function testBudgetLimits(): void | ||||
|     { | ||||
|         $budget       = $this->user()->budgets()->first(); | ||||
|         $budgetLimits = BudgetLimit::get(); | ||||
|         $repository   = $this->mock(BudgetRepositoryInterface::class); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('getBudgetLimits')->once()->andReturn($budgetLimits); | ||||
|  | ||||
|         // call API | ||||
|         $response = $this->get(route('api.v1.budgets.budget_limits', [$budget->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertSee('budget_limits'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete a budget. | ||||
|      * | ||||
| @@ -141,6 +170,173 @@ class BudgetControllerTest extends TestCase | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Store new budget limit. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\BudgetController | ||||
|      * @covers \FireflyIII\Api\V1\Requests\BudgetLimitRequest | ||||
|      */ | ||||
|     public function testStoreBudgetLimit(): void | ||||
|     { | ||||
|         $budget      = $this->user()->budgets()->first(); | ||||
|         $budgetLimit = BudgetLimit::create( | ||||
|             [ | ||||
|                 'budget_id'  => $budget->id, | ||||
|                 'start_date' => '2018-01-01', | ||||
|                 'end_date'   => '2018-01-31', | ||||
|                 'amount'     => 1, | ||||
|             ] | ||||
|         ); | ||||
|         $data | ||||
|                      = [ | ||||
|             'budget_id' => $budget->id, | ||||
|             'start'     => '2018-01-01', | ||||
|             'end'       => '2018-01-31', | ||||
|             'amount'    => 1, | ||||
|         ]; | ||||
|         // mock stuff: | ||||
|         $repository = $this->mock(BudgetRepositoryInterface::class); | ||||
|         $repository->shouldReceive('storeBudgetLimit')->andReturn($budgetLimit)->once(); | ||||
|  | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('storeBudgetLimit')->andReturn($budgetLimit); | ||||
|  | ||||
|         // call API | ||||
|         $response = $this->post(route('api.v1.budgets.store_budget_limit', [$budget->id]), $data, ['Accept' => 'application/json']); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertSee('budget_limits'); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\BudgetController | ||||
|      */ | ||||
|     public function testTransactionsBasic(): void | ||||
|     { | ||||
|         $budget = $this->user()->budgets()->first(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $accountRepos       = $this->mock(AccountRepositoryInterface::class); | ||||
|         $billRepos          = $this->mock(BillRepositoryInterface::class); | ||||
|         $budgetRepos        = $this->mock(BudgetRepositoryInterface::class); | ||||
|         $billRepos->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|         $budgetRepos->shouldReceive('setUser'); | ||||
|  | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setBudget')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.budgets.transactions', [$budget->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\BudgetController | ||||
|      */ | ||||
|     public function testTransactionsRange(): void | ||||
|     { | ||||
|         $budget = $this->user()->budgets()->first(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $billRepos          = $this->mock(BillRepositoryInterface::class); | ||||
|         $budgetRepos        = $this->mock(BudgetRepositoryInterface::class); | ||||
|         $billRepos->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|         $budgetRepos->shouldReceive('setUser'); | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setBudget')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setRange')->andReturnSelf(); | ||||
|  | ||||
|  | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.budgets.transactions', [$budget->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31'])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update a budget. | ||||
|      * | ||||
| @@ -173,5 +369,4 @@ class BudgetControllerTest extends TestCase | ||||
|         $response->assertSee($budget->name); | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -24,9 +24,16 @@ declare(strict_types=1); | ||||
| namespace Tests\Api\V1\Controllers; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollector; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollectorInterface; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| use Tests\TestCase; | ||||
| @@ -174,10 +181,10 @@ class BudgetLimitControllerTest extends TestCase | ||||
|         $budget      = $this->user()->budgets()->first(); | ||||
|         $budgetLimit = BudgetLimit::create( | ||||
|             [ | ||||
|                 'budget_id' => $budget->id, | ||||
|                 'start_date'     => '2018-01-01', | ||||
|                 'end_date'       => '2018-01-31', | ||||
|                 'amount'    => 1, | ||||
|                 'budget_id'  => $budget->id, | ||||
|                 'start_date' => '2018-01-01', | ||||
|                 'end_date'   => '2018-01-31', | ||||
|                 'amount'     => 1, | ||||
|             ] | ||||
|         ); | ||||
|  | ||||
| @@ -198,10 +205,10 @@ class BudgetLimitControllerTest extends TestCase | ||||
|         $budget      = $this->user()->budgets()->first(); | ||||
|         $budgetLimit = BudgetLimit::create( | ||||
|             [ | ||||
|                 'budget_id' => $budget->id, | ||||
|                 'start_date'     => '2018-01-01', | ||||
|                 'end_date'       => '2018-01-31', | ||||
|                 'amount'    => 1, | ||||
|                 'budget_id'  => $budget->id, | ||||
|                 'start_date' => '2018-01-01', | ||||
|                 'end_date'   => '2018-01-31', | ||||
|                 'amount'     => 1, | ||||
|             ] | ||||
|         ); | ||||
|         $data | ||||
| @@ -255,6 +262,70 @@ class BudgetLimitControllerTest extends TestCase | ||||
|         $response->assertSee('Unknown budget.'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\BudgetLimitController | ||||
|      */ | ||||
|     public function testTransactionsBasic(): void | ||||
|     { | ||||
|         $budgetLimit = BudgetLimit::first(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $accountRepos       = $this->mock(AccountRepositoryInterface::class); | ||||
|         $billRepos          = $this->mock(BillRepositoryInterface::class); | ||||
|         $budgetRepos        = $this->mock(BudgetRepositoryInterface::class); | ||||
|         $billRepos->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|         $budgetRepos->shouldReceive('setUser'); | ||||
|  | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setBudget')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setRange')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.budget_limits.transactions', [$budgetLimit->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Test update of budget limit. | ||||
|      * | ||||
| @@ -266,10 +337,10 @@ class BudgetLimitControllerTest extends TestCase | ||||
|         $budget      = $this->user()->budgets()->first(); | ||||
|         $budgetLimit = BudgetLimit::create( | ||||
|             [ | ||||
|                 'budget_id' => $budget->id, | ||||
|                 'start_date'     => '2018-01-01', | ||||
|                 'end_date'       => '2018-01-31', | ||||
|                 'amount'    => 1, | ||||
|                 'budget_id'  => $budget->id, | ||||
|                 'start_date' => '2018-01-01', | ||||
|                 'end_date'   => '2018-01-31', | ||||
|                 'amount'     => 1, | ||||
|             ] | ||||
|         ); | ||||
|         $data | ||||
|   | ||||
| @@ -24,8 +24,15 @@ declare(strict_types=1); | ||||
| namespace Tests\Api\V1\Controllers; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollector; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollectorInterface; | ||||
| use FireflyIII\Models\Category; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Repositories\Category\CategoryRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| use Tests\TestCase; | ||||
| @@ -143,6 +150,132 @@ class CategoryControllerTest extends TestCase | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CategoryController | ||||
|      */ | ||||
|     public function testTransactionsBasic(): void | ||||
|     { | ||||
|         $category = $this->user()->categories()->first(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $accountRepos       = $this->mock(AccountRepositoryInterface::class); | ||||
|         $billRepos          = $this->mock(BillRepositoryInterface::class); | ||||
|         $billRepos->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|  | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setCategory')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.categories.transactions', [$category->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CategoryController | ||||
|      */ | ||||
|     public function testTransactionsRange(): void | ||||
|     { | ||||
|         $category = $this->user()->categories()->first(); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $billRepos          = $this->mock(BillRepositoryInterface::class); | ||||
|         $billRepos->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setCategory')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setRange')->andReturnSelf(); | ||||
|  | ||||
|  | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // mock some calls: | ||||
|  | ||||
|         // test API | ||||
|  | ||||
|         $response = $this->get( | ||||
|             route('api.v1.categories.transactions', [$category->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31']) | ||||
|         ); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update a category. | ||||
|      * | ||||
| @@ -175,5 +308,4 @@ class CategoryControllerTest extends TestCase | ||||
|         $response->assertSee($category->name); | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -119,7 +119,7 @@ class ConfigurationControllerTest extends TestCase | ||||
|     { | ||||
|         $userRepos = $this->mock(UserRepositoryInterface::class); | ||||
|         $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true); | ||||
|         $data      = [ | ||||
|         $data = [ | ||||
|             'value' => 1, | ||||
|  | ||||
|         ]; | ||||
| @@ -221,10 +221,10 @@ class ConfigurationControllerTest extends TestCase | ||||
|     public function testUpdateInvalid(): void | ||||
|     { | ||||
|         $userRepos = $this->mock(UserRepositoryInterface::class); | ||||
|         $data     = [ | ||||
|         $data      = [ | ||||
|             'value' => 'true', | ||||
|         ]; | ||||
|         $response = $this->post('/api/v1/configuration/last_update_check', $data); | ||||
|         $response  = $this->post('/api/v1/configuration/last_update_check', $data); | ||||
|         $response->assertStatus(404); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -24,10 +24,25 @@ declare(strict_types=1); | ||||
| namespace Tests\Api\V1\Controllers; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollector; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollectorInterface; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\Bill; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Models\Preference; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Bill\BillRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| use Mockery; | ||||
| @@ -50,6 +65,134 @@ class CurrencyControllerTest extends TestCase | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Test the list of accounts. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testAccounts(): void | ||||
|     { | ||||
|         // create stuff | ||||
|         $accounts = factory(Account::class, 10)->create(); | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository    = $this->mock(AccountRepositoryInterface::class); | ||||
|         $currencyRepos = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $userRepos     = $this->mock(UserRepositoryInterface::class); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('getAccountsByType')->withAnyArgs()->andReturn($accounts)->once(); | ||||
|         $currencyRepos->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountRole'])->andReturn('defaultAsset'); | ||||
|         $repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'currency_id'])->andReturn('1'); | ||||
|         $repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'accountNumber'])->andReturn('1'); | ||||
|         $repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'BIC'])->andReturn('BIC'); | ||||
|         $repository->shouldReceive('getNoteText')->withArgs([Mockery::any()])->andReturn('Hello'); | ||||
|         $repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest'])->andReturn('2')->atLeast()->once(); | ||||
|         $repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'interest_period'])->andReturn('daily')->atLeast()->once(); | ||||
|         $repository->shouldReceive('getMetaValue')->withArgs([Mockery::any(), 'include_net_worth'])->andReturn(true)->atLeast()->once(); | ||||
|  | ||||
|         // test API | ||||
|         $currency = TransactionCurrency::first(); | ||||
|         $response = $this->get(route('api.v1.currencies.accounts', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]); | ||||
|         $response->assertJson( | ||||
|             ['links' => ['self' => true, 'first' => true, 'last' => true,],] | ||||
|         ); | ||||
|         $response->assertSee('type=all'); // default returns this. | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show all available budgets. | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testAvailableBudgets(): void | ||||
|     { | ||||
|         $availableBudgets = $this->user()->availableBudgets()->get(); | ||||
|         // mock stuff: | ||||
|         $budgetRepos = $this->mock(BudgetRepositoryInterface::class); | ||||
|  | ||||
|  | ||||
|         // mock calls: | ||||
|         $budgetRepos->shouldReceive('setUser')->once(); | ||||
|         $budgetRepos->shouldReceive('getAvailableBudgets')->once()->andReturn($availableBudgets); | ||||
|  | ||||
|         // call API | ||||
|         $currency = TransactionCurrency::first(); | ||||
|         $response = $this->get(route('api.v1.currencies.available_budgets', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertSee($availableBudgets->first()->id); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show all bills | ||||
|      * | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testBills(): void | ||||
|     { | ||||
|         // create stuff | ||||
|         $bills     = factory(Bill::class, 10)->create(); | ||||
|         $paginator = new LengthAwarePaginator($bills, 10, 50, 1); | ||||
|         // mock stuff: | ||||
|         $repository = $this->mock(BillRepositoryInterface::class); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('getPaginator')->withAnyArgs()->andReturn($paginator)->once(); | ||||
|         $repository->shouldReceive('getRulesForBill')->withAnyArgs()->andReturn(new Collection()); | ||||
|         $repository->shouldReceive('getNoteText')->andReturn('Hi there'); | ||||
|  | ||||
|         // test API | ||||
|         $currency = TransactionCurrency::first(); | ||||
|         $response = $this->get(route('api.v1.currencies.bills', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => 10, 'count' => 10, 'per_page' => true, 'current_page' => 1, 'total_pages' => 1]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testBudgetLimits(): void | ||||
|     { | ||||
|         $repository                           = $this->mock(BudgetRepositoryInterface::class); | ||||
|         $currency                             = TransactionCurrency::first(); | ||||
|         $budgetLimit                          = BudgetLimit::first(); | ||||
|         $budgetLimit->transaction_currency_id = $currency->id; | ||||
|         $collection                           = new Collection([$budgetLimit]); | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('getAllBudgetLimits')->once()->andReturn($collection); | ||||
|  | ||||
|  | ||||
|         $response = $this->get(route('api.v1.currencies.budget_limits', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testCer(): void | ||||
|     { | ||||
|         $repository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('getExchangeRates')->once()->andReturn(new Collection); | ||||
|  | ||||
|  | ||||
|         $currency = TransactionCurrency::first(); | ||||
|         $response = $this->get(route('api.v1.currencies.cer', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Send delete | ||||
|      * | ||||
| @@ -77,6 +220,80 @@ class CurrencyControllerTest extends TestCase | ||||
|         $response->assertStatus(204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testDisable(): void | ||||
|     { | ||||
|         // create stuff | ||||
|         $currency   = TransactionCurrency::first(); | ||||
|         $repository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $userRepos  = $this->mock(UserRepositoryInterface::class); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('disable')->once(); | ||||
|         $repository->shouldReceive('currencyInUse')->once()->andReturnFalse(); | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->post(route('api.v1.currencies.disable', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson( | ||||
|             ['data' => [ | ||||
|                 'type' => 'currencies', | ||||
|                 'id'   => $currency->id, | ||||
|             ],] | ||||
|         ); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testDisableInUse(): void | ||||
|     { | ||||
|         // create stuff | ||||
|         $currency   = TransactionCurrency::first(); | ||||
|         $repository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $userRepos  = $this->mock(UserRepositoryInterface::class); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('currencyInUse')->once()->andReturnTrue(); | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->post(route('api.v1.currencies.disable', [$currency->code])); | ||||
|         $response->assertStatus(409); | ||||
|         $response->assertJson([]); | ||||
|         $response->assertHeader('Content-Type', 'application/json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testEnable(): void | ||||
|     { | ||||
|         // create stuff | ||||
|         $currency   = TransactionCurrency::first(); | ||||
|         $repository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $userRepos  = $this->mock(UserRepositoryInterface::class); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('enable')->once(); | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->post(route('api.v1.currencies.enable', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson( | ||||
|             ['data' => [ | ||||
|                 'type' => 'currencies', | ||||
|                 'id'   => $currency->id, | ||||
|             ],] | ||||
|         ); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Show index. | ||||
|      * | ||||
| @@ -116,6 +333,78 @@ class CurrencyControllerTest extends TestCase | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testMakeDefault(): void | ||||
|     { | ||||
|         // create stuff | ||||
|         $currency   = TransactionCurrency::first(); | ||||
|         $repository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $userRepos  = $this->mock(UserRepositoryInterface::class); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('enable')->once(); | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->post(route('api.v1.currencies.default', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson( | ||||
|             ['data' => [ | ||||
|                 'type' => 'currencies', | ||||
|                 'id'   => $currency->id, | ||||
|             ],] | ||||
|         ); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testRecurrences(): void | ||||
|     { | ||||
|         $recurrences = $this->user()->recurrences()->get(); | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository  = $this->mock(RecurringRepositoryInterface::class); | ||||
|         $budgetRepos = $this->mock(BudgetRepositoryInterface::class); | ||||
|         $piggyRepos  = $this->mock(PiggyBankRepositoryInterface::class); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $repository->shouldReceive('getAll')->once()->andReturn($recurrences); | ||||
|         $repository->shouldReceive('getNoteText')->andReturn('Notes.'); | ||||
|         $repository->shouldReceive('repetitionDescription')->andReturn('Some description.'); | ||||
|         $repository->shouldReceive('getXOccurrences')->andReturn([]); | ||||
|  | ||||
|  | ||||
|         // call API | ||||
|         $currency = TransactionCurrency::first(); | ||||
|         $response = $this->get(route('api.v1.currencies.recurrences', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testRules(): void | ||||
|     { | ||||
|         $rules = $this->user()->rules()->get(); | ||||
|  | ||||
|         $ruleRepos = $this->mock(RuleRepositoryInterface::class); | ||||
|         $ruleRepos->shouldReceive('getAll')->once()->andReturn($rules); | ||||
|  | ||||
|  | ||||
|         // call API | ||||
|         $currency = TransactionCurrency::first(); | ||||
|         $response = $this->get(route('api.v1.currencies.rules', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Test show of a currency. | ||||
|      * | ||||
| @@ -218,6 +507,123 @@ class CurrencyControllerTest extends TestCase | ||||
|         $response->assertSee($currency->name); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testTransactionsBasic(): void | ||||
|     { | ||||
|         $currency     = TransactionCurrency::first(); | ||||
|         $accountRepos = $this->mock(AccountRepositoryInterface::class); | ||||
|         $accountRepos->shouldReceive('setUser'); | ||||
|         $accountRepos->shouldReceive('getAccountsByType')->atLeast()->once() | ||||
|                      ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setCurrency')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get(route('api.v1.currencies.transactions', [$currency->code])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\CurrencyController | ||||
|      */ | ||||
|     public function testTransactionsRange(): void | ||||
|     { | ||||
|         $currency     = TransactionCurrency::first(); | ||||
|         $accountRepos = $this->mock(AccountRepositoryInterface::class); | ||||
|         $accountRepos->shouldReceive('setUser'); | ||||
|         $accountRepos->shouldReceive('getAccountsByType')->atLeast()->once() | ||||
|                      ->andReturn($this->user()->accounts()->where('account_type_id', 3)->get()); | ||||
|  | ||||
|         // get some transactions using the collector: | ||||
|         Log::info('This transaction collector is OK, because it is used in a test:'); | ||||
|         $collector = new TransactionCollector; | ||||
|         $collector->setUser($this->user()); | ||||
|         $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); | ||||
|         $collector->setAllAssetAccounts(); | ||||
|         $collector->setLimit(5)->setPage(1); | ||||
|         try { | ||||
|             $paginator = $collector->getPaginatedTransactions(); | ||||
|         } catch (FireflyException $e) { | ||||
|             $this->assertTrue(false, $e->getMessage()); | ||||
|         } | ||||
|  | ||||
|         // mock stuff: | ||||
|         $repository         = $this->mock(JournalRepositoryInterface::class); | ||||
|         $collector          = $this->mock(TransactionCollectorInterface::class); | ||||
|         $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser'); | ||||
|         $currencyRepository->shouldReceive('setUser'); | ||||
|  | ||||
|         $repository->shouldReceive('getNoteText')->atLeast()->once()->andReturn('Note'); | ||||
|         $repository->shouldReceive('getMetaField')->atLeast()->once()->andReturn(null); | ||||
|         $repository->shouldReceive('getMetaDateString')->atLeast()->once()->andReturn('2018-01-01'); | ||||
|  | ||||
|         $collector->shouldReceive('setUser')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setCurrency')->andReturnSelf(); | ||||
|         $collector->shouldReceive('removeFilter')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setRange')->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->andReturnSelf(); | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->andReturn($paginator); | ||||
|  | ||||
|  | ||||
|         // test API | ||||
|         $response = $this->get( | ||||
|             route('api.v1.currencies.transactions', [$currency->code]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31']) | ||||
|         ); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertJson(['data' => [],]); | ||||
|         $response->assertJson(['meta' => ['pagination' => ['total' => true, 'count' => true, 'per_page' => 5, 'current_page' => 1, 'total_pages' => true]],]); | ||||
|         $response->assertJson(['links' => ['self' => true, 'first' => true, 'last' => true,],]); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Update currency. | ||||
|      * | ||||
|   | ||||
							
								
								
									
										115
									
								
								tests/Api/V1/Controllers/ImportControllerTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								tests/Api/V1/Controllers/ImportControllerTest.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
| <?php | ||||
| /** | ||||
|  * ImportControllerTest.php | ||||
|  * Copyright (c) 2018 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\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Helpers\Collector\TransactionCollectorInterface; | ||||
| use FireflyIII\Models\ImportJob; | ||||
| use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| use Tests\TestCase; | ||||
|  | ||||
| /** | ||||
|  * Class ImportControllerTest | ||||
|  */ | ||||
| class ImportControllerTest extends TestCase | ||||
| { | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     public function setUp(): void | ||||
|     { | ||||
|         parent::setUp(); | ||||
|         Passport::actingAs($this->user()); | ||||
|         Log::info(sprintf('Now in %s.', \get_class($this))); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\ImportController | ||||
|      */ | ||||
|     public function testListAll(): void | ||||
|     { | ||||
|         $repository = $this->mock(ImportJobRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('get')->once()->andReturn(new Collection); | ||||
|  | ||||
|  | ||||
|         $response = $this->get(route('api.v1.import.list')); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\ImportController | ||||
|      */ | ||||
|     public function testShow(): void | ||||
|     { | ||||
|         /** @var ImportJob $job */ | ||||
|         $job        = $this->user()->importJobs()->first(); | ||||
|         $repository = $this->mock(ImportJobRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|  | ||||
|         $response = $this->get(route('api.v1.import.show', [$job->key]), ['accept' => 'application/json']); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\ImportController | ||||
|      */ | ||||
|     public function testTransactions(): void | ||||
|     { | ||||
|         /** @var ImportJob $job */ | ||||
|         $job         = $this->user()->importJobs()->first(); | ||||
|         $tag         = $this->user()->tags()->first(); | ||||
|         $job->tag_id = $tag->id; | ||||
|         $job->save(); | ||||
|         $repository = $this->mock(ImportJobRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|  | ||||
|         // paginator: | ||||
|         $paginator = new LengthAwarePaginator(new Collection, 0, 50); | ||||
|  | ||||
|         $collector = $this->mock(TransactionCollectorInterface::class); | ||||
|         $collector->shouldReceive('setUser')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTag')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setRange')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->once()->andReturn($paginator); | ||||
|         $collector->shouldReceive('removeFilter')->once()->andReturnSelf(); | ||||
|  | ||||
|         $response = $this->get( | ||||
|             route('api.v1.import.transactions', [$job->key]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31']), | ||||
|             ['accept' => 'application/json'] | ||||
|         ); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -23,9 +23,12 @@ declare(strict_types=1); | ||||
|  | ||||
| namespace Tests\Api\V1\Controllers; | ||||
|  | ||||
| use FireflyIII\Helpers\Collector\TransactionCollectorInterface; | ||||
| use FireflyIII\Models\LinkType; | ||||
| use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| use Tests\TestCase; | ||||
| @@ -77,7 +80,6 @@ class LinkTypeControllerTest extends TestCase | ||||
|         $response->assertStatus(204); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\LinkTypeController | ||||
|      */ | ||||
| @@ -216,6 +218,39 @@ class LinkTypeControllerTest extends TestCase | ||||
|         $response->assertSee('You need the \"owner\"-role to do this.'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\LinkTypeController | ||||
|      */ | ||||
|     public function testTransactions(): void | ||||
|     { | ||||
|         $linkType  = LinkType::first(); | ||||
|         $paginator = new LengthAwarePaginator(new Collection, 0, 50); | ||||
|         // mock repositories: | ||||
|         $linkTypeRepos = $this->mock(LinkTypeRepositoryInterface::class); | ||||
|         $userRepos     = $this->mock(UserRepositoryInterface::class); | ||||
|         $collector     = $this->mock(TransactionCollectorInterface::class); | ||||
|         $journalIds    = $linkTypeRepos->shouldReceive('getJournalIds')->once()->andReturn([1, 2, 3]); | ||||
|         $collector->shouldReceive('setUser')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setJournalIds')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setRange')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->once()->andReturn($paginator); | ||||
|  | ||||
|         $collector->shouldReceive('removeFilter')->once()->andReturnSelf(); | ||||
|         $linkTypeRepos->shouldReceive('setUser')->once(); | ||||
|  | ||||
|         $response = $this->get( | ||||
|             route('api.v1.link_types.transactions', [$linkType->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31']) | ||||
|         ); | ||||
|         $response->assertStatus(200); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\LinkTypeController | ||||
|      * @covers \FireflyIII\Api\V1\Requests\LinkTypeRequest | ||||
|   | ||||
| @@ -28,6 +28,7 @@ use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use Illuminate\Support\Collection; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| use Mockery; | ||||
| @@ -103,6 +104,21 @@ class PiggyBankControllerTest extends TestCase | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\PiggyBankController | ||||
|      */ | ||||
|     public function testPiggyBankEvents(): void | ||||
|     { | ||||
|         $piggyBank  = $this->user()->piggyBanks()->first(); | ||||
|         $repository = $this->mock(PiggyBankRepositoryInterface::class); | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('getEvents')->once()->andReturn(new Collection); | ||||
|  | ||||
|         $response = $this->get(route('api.v1.piggy_banks.events', [$piggyBank->id])); | ||||
|         $response->assertStatus(200); | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\PiggyBankController | ||||
|      */ | ||||
|   | ||||
| @@ -24,13 +24,18 @@ declare(strict_types=1); | ||||
| namespace Tests\Api\V1\Controllers; | ||||
|  | ||||
| use Carbon\Carbon; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Factory\CategoryFactory; | ||||
| use FireflyIII\Helpers\Collector\TransactionCollectorInterface; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use FireflyIII\Models\Recurrence; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; | ||||
| use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; | ||||
| use FireflyIII\Repositories\User\UserRepositoryInterface; | ||||
| use FireflyIII\Support\Cronjobs\RecurringCronjob; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Collection; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| @@ -89,10 +94,10 @@ class RecurrenceControllerTest extends TestCase | ||||
|         $piggyRepos  = $this->mock(PiggyBankRepositoryInterface::class); | ||||
|  | ||||
|         $budgetRepos->shouldReceive('findNull')->atLeast()->once()->withAnyArgs() | ||||
|             ->andReturn($this->user()->budgets()->first()); | ||||
|                     ->andReturn($this->user()->budgets()->first()); | ||||
|  | ||||
|         $piggyRepos->shouldReceive('findNull')->atLeast()->once()->withAnyArgs() | ||||
|                     ->andReturn($this->user()->piggyBanks()->first()); | ||||
|                    ->andReturn($this->user()->piggyBanks()->first()); | ||||
|  | ||||
|         // mock calls: | ||||
|         $repository->shouldReceive('setUser'); | ||||
| @@ -1672,6 +1677,79 @@ class RecurrenceControllerTest extends TestCase | ||||
|         $response->assertHeader('Content-Type', 'application/vnd.api+json'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController | ||||
|      */ | ||||
|     public function testTransactions(): void | ||||
|     { | ||||
|         $recurrence = $this->user()->recurrences()->first(); | ||||
|         $paginator  = new LengthAwarePaginator(new Collection, 0, 50); | ||||
|         // mock repositories: | ||||
|         $recurringRepos = $this->mock(RecurringRepositoryInterface::class); | ||||
|         $userRepos      = $this->mock(UserRepositoryInterface::class); | ||||
|         $collector      = $this->mock(TransactionCollectorInterface::class); | ||||
|         $journalIds     = $recurringRepos->shouldReceive('getJournalIds')->once()->andReturn([1, 2, 3]); | ||||
|         $collector->shouldReceive('setUser')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('withOpposingAccount')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('withCategoryInformation')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('withBudgetInformation')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setAllAssetAccounts')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setJournalIds')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setRange')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setLimit')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setPage')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('setTypes')->once()->andReturnSelf(); | ||||
|         $collector->shouldReceive('getPaginatedTransactions')->once()->andReturn($paginator); | ||||
|  | ||||
|         $collector->shouldReceive('removeFilter')->once()->andReturnSelf(); | ||||
|         $recurringRepos->shouldReceive('setUser')->once(); | ||||
|  | ||||
|         $response = $this->get( | ||||
|             route('api.v1.recurrences.transactions', [$recurrence->id]) . '?' . http_build_query(['start' => '2018-01-01', 'end' => '2018-01-31']) | ||||
|         ); | ||||
|         $response->assertStatus(200); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController | ||||
|      */ | ||||
|     public function testTriggerError(): void | ||||
|     { | ||||
|         $cronjob = $this->mock(RecurringCronjob::class); | ||||
|         $cronjob->shouldReceive('fire')->andThrow(FireflyException::class); | ||||
|  | ||||
|  | ||||
|         $response = $this->post(route('api.v1.recurrences.trigger')); | ||||
|         $response->assertStatus(500); | ||||
|         $response->assertSee('Could not fire recurring cron job.'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController | ||||
|      */ | ||||
|     public function testTriggerFalse(): void | ||||
|     { | ||||
|         $cronjob = $this->mock(RecurringCronjob::class); | ||||
|         $cronjob->shouldReceive('fire')->once()->andReturnFalse(); | ||||
|  | ||||
|  | ||||
|         $response = $this->post(route('api.v1.recurrences.trigger')); | ||||
|         $response->assertStatus(204); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\RecurrenceController | ||||
|      */ | ||||
|     public function testTriggerTrue(): void | ||||
|     { | ||||
|         $cronjob = $this->mock(RecurringCronjob::class); | ||||
|         $cronjob->shouldReceive('fire')->once()->andReturnTrue(); | ||||
|  | ||||
|  | ||||
|         $response = $this->post(route('api.v1.recurrences.trigger')); | ||||
|         $response->assertStatus(200); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Just a basic test because the store() tests cover everything. | ||||
|      * | ||||
|   | ||||
| @@ -24,10 +24,17 @@ declare(strict_types=1); | ||||
| namespace Tests\Api\V1\Controllers; | ||||
|  | ||||
|  | ||||
| use FireflyIII\Jobs\ExecuteRuleOnExistingTransactions; | ||||
| use FireflyIII\Jobs\Job; | ||||
| use FireflyIII\Models\Rule; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Journal\JournalRepositoryInterface; | ||||
| use FireflyIII\Repositories\Rule\RuleRepositoryInterface; | ||||
| use FireflyIII\TransactionRules\TransactionMatcher; | ||||
| use Illuminate\Support\Collection; | ||||
| use Laravel\Passport\Passport; | ||||
| use Log; | ||||
| use Queue; | ||||
| use Tests\TestCase; | ||||
|  | ||||
| /** | ||||
| @@ -208,6 +215,67 @@ class RuleControllerTest extends TestCase | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     public function testTestRule(): void | ||||
|     { | ||||
|         $rule         = $this->user()->rules()->first(); | ||||
|         $repository   = $this->mock(AccountRepositoryInterface::class); | ||||
|         $matcher      = $this->mock(TransactionMatcher::class); | ||||
|         $journalRepos = $this->mock(JournalRepositoryInterface::class); | ||||
|         $asset        = $this->getRandomAsset(); | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|  | ||||
|         $repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset); | ||||
|         $repository->shouldReceive('findNull')->withArgs([2])->andReturn($asset); | ||||
|         $repository->shouldReceive('findNull')->withArgs([3])->andReturn(null); | ||||
|         $repository->shouldReceive('isAsset')->withArgs([1])->andReturn(true); | ||||
|         $repository->shouldReceive('isAsset')->withArgs([2])->andReturn(false); | ||||
|  | ||||
|         $matcher->shouldReceive('setRule')->once(); | ||||
|         $matcher->shouldReceive('setEndDate')->once(); | ||||
|         $matcher->shouldReceive('setStartDate')->once(); | ||||
|         $matcher->shouldReceive('setSearchLimit')->once(); | ||||
|         $matcher->shouldReceive('setTriggeredLimit')->once(); | ||||
|         $matcher->shouldReceive('setAccounts')->once(); | ||||
|         $matcher->shouldReceive('findTransactionsByRule')->once()->andReturn(new Collection); | ||||
|  | ||||
|  | ||||
|         $response = $this->get(route('api.v1.rules.test', [$rule->id]) . '?accounts=1,2,3'); | ||||
|         $response->assertStatus(200); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\RuleController | ||||
|      */ | ||||
|     public function testTriggerRule(): void | ||||
|     { | ||||
|  | ||||
|         $rule         = $this->user()->rules()->first(); | ||||
|         $repository   = $this->mock(AccountRepositoryInterface::class); | ||||
|         $matcher      = $this->mock(TransactionMatcher::class); | ||||
|         $journalRepos = $this->mock(JournalRepositoryInterface::class); | ||||
|         $asset        = $this->getRandomAsset(); | ||||
|         $repository->shouldReceive('setUser')->once(); | ||||
|         $repository->shouldReceive('findNull')->withArgs([1])->andReturn($asset); | ||||
|         $repository->shouldReceive('findNull')->withArgs([2])->andReturn($asset); | ||||
|         $repository->shouldReceive('findNull')->withArgs([3])->andReturn(null); | ||||
|         $repository->shouldReceive('isAsset')->andReturn(true, false); | ||||
|  | ||||
|         Queue::fake(); | ||||
|  | ||||
|  | ||||
|         $response = $this->post(route('api.v1.rules.trigger', [$rule->id]) . '?accounts=1,2,3'); | ||||
|         $response->assertStatus(204); | ||||
|  | ||||
|         Queue::assertPushed( | ||||
|             ExecuteRuleOnExistingTransactions::class, function (Job $job) use ($rule) { | ||||
|             return $job->getRule()->id === $rule->id; | ||||
|         } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @covers \FireflyIII\Api\V1\Controllers\RuleController | ||||
|      * @covers \FireflyIII\Api\V1\Requests\RuleRequest | ||||
|   | ||||
| @@ -2669,7 +2669,7 @@ class TransactionControllerTest extends TestCase | ||||
|         $accountRepos->shouldReceive('setUser'); | ||||
|         $accountRepos->shouldReceive('getAccountsById')->withArgs([[$account->id]])->andReturn(new Collection([$account])); | ||||
|  | ||||
|         $data        = [ | ||||
|         $data = [ | ||||
|             'description'  => 'Some deposit #' . random_int(1, 10000), | ||||
|             'date'         => '2018-01-01', | ||||
|             'transactions' => [ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user