diff --git a/app/Models/AccountMeta.php b/app/Models/AccountMeta.php index cd087f969b..7635b179dc 100644 --- a/app/Models/AccountMeta.php +++ b/app/Models/AccountMeta.php @@ -27,6 +27,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; /** * Class AccountMeta. + * @property string $data */ class AccountMeta extends Model { diff --git a/tests/Api/V1/Controllers/AttachmentControllerTest.php b/tests/Api/V1/Controllers/AttachmentControllerTest.php index 77398f7c6d..8096733f6a 100644 --- a/tests/Api/V1/Controllers/AttachmentControllerTest.php +++ b/tests/Api/V1/Controllers/AttachmentControllerTest.php @@ -121,7 +121,7 @@ class AttachmentControllerTest extends TestCase } /** - * Download attachment + * Download attachment but no file uploaded * * @covers \FireflyIII\Api\V1\Controllers\AttachmentController */ @@ -279,16 +279,22 @@ class AttachmentControllerTest extends TestCase } + /** + * Upload file for attachment. + * + * @covers \FireflyIII\Api\V1\Controllers\AttachmentController + * + */ public function testUpload(): void { /** @var Attachment $attachment */ $attachment = $this->user()->attachments()->first(); - $content = 'Hello there'; + $content = 'Hello there'; // mock helper: - $helper = $this->mock(AttachmentHelperInterface::class); + $helper = $this->mock(AttachmentHelperInterface::class); $helper->shouldReceive('saveAttachmentFromApi')->once(); - $response = $this->call('POST', '/api/v1/attachments/' . $attachment->id . '/upload',[],[],[],[], $content); + $response = $this->call('POST', '/api/v1/attachments/' . $attachment->id . '/upload', [], [], [], [], $content); //$response = $this->post('/api/v1/attachments/' . $attachment->id . '/upload',$content, ['Accept' => 'application/json']); $response->assertStatus(204); } diff --git a/tests/Api/V1/Controllers/AvailableBudgetControllerTest.php b/tests/Api/V1/Controllers/AvailableBudgetControllerTest.php new file mode 100644 index 0000000000..4f44c300a4 --- /dev/null +++ b/tests/Api/V1/Controllers/AvailableBudgetControllerTest.php @@ -0,0 +1,189 @@ +. + */ + +declare(strict_types=1); + +namespace Tests\Api\V1\Controllers; + + +use FireflyIII\Models\AvailableBudget; +use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; +use Laravel\Passport\Passport; +use Log; +use Tests\TestCase; + +/** + * + * Class AvailableBudgetControllerTest + */ +class AvailableBudgetControllerTest extends TestCase +{ + /** + * + */ + public function setUp(): void + { + parent::setUp(); + Passport::actingAs($this->user()); + Log::debug(sprintf('Now in %s.', \get_class($this))); + } + + /** + * Delete an available budget. + * + * @covers \FireflyIII\Api\V1\Controllers\AvailableBudgetController + */ + public function testDelete(): void + { + // mock stuff: + $repository = $this->mock(BudgetRepositoryInterface::class); + + // mock calls: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('destroyAvailableBudget')->once()->andReturn(true); + + // get available budget: + $availableBudget = $this->user()->availableBudgets()->first(); + + // call API + $response = $this->delete('/api/v1/available_budgets/' . $availableBudget->id); + $response->assertStatus(204); + } + + /** + * Show all available budgets. + * + * @covers \FireflyIII\Api\V1\Controllers\AvailableBudgetController + */ + public function testIndex(): void + { + $availableBudgets = $this->user()->availableBudgets()->get(); + // mock stuff: + $repository = $this->mock(BudgetRepositoryInterface::class); + + // mock calls: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('getAvailableBudgets')->once()->andReturn($availableBudgets); + + // call API + $response = $this->get('/api/v1/available_budgets'); + $response->assertStatus(200); + $response->assertSee($availableBudgets->first()->id); + } + + /** + * Show one available budget. + * + * @covers \FireflyIII\Api\V1\Controllers\AvailableBudgetController + */ + public function testShow(): void + { + $availableBudget = $this->user()->availableBudgets()->first(); + // mock stuff: + $repository = $this->mock(BudgetRepositoryInterface::class); + + // mock calls: + $repository->shouldReceive('setUser')->once(); + + // call API + $response = $this->get('/api/v1/available_budgets/' . $availableBudget->id); + $response->assertStatus(200); + $response->assertSee($availableBudget->id); + } + + /** + * Store new available budget. + * + * @covers \FireflyIII\Api\V1\Controllers\AvailableBudgetController + * @covers \FireflyIII\Api\V1\Requests\AvailableBudgetRequest + */ + public function testStore(): void + { + /** @var AvailableBudget $availableBudget */ + $availableBudget = $this->user()->availableBudgets()->first(); + + // mock stuff: + $repository = $this->mock(BudgetRepositoryInterface::class); + $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); + + // mock calls: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('setAvailableBudget')->once()->andReturn($availableBudget); + $currencyRepository->shouldReceive('findNull')->andReturn(TransactionCurrency::find(1)); + + // data to submit + $data = [ + 'transaction_currency_id' => '1', + 'amount' => '100', + 'start_date' => '2018-01-01', + 'end_date' => '2018-01-31', + ]; + + + // test API + $response = $this->post('/api/v1/available_budgets', $data); + $response->assertStatus(200); + $response->assertJson(['data' => ['type' => 'available_budgets', 'links' => true],]); + $response->assertSee($availableBudget->amount); // the amount + $response->assertHeader('Content-Type', 'application/vnd.api+json'); + } + + /** + * Update available budget. + * + * @covers \FireflyIII\Api\V1\Controllers\AvailableBudgetController + * @covers \FireflyIII\Api\V1\Requests\AvailableBudgetRequest + * + */ + public function testUpdate(): void + { + // mock repositories + $repository = $this->mock(BudgetRepositoryInterface::class); + $currencyRepository = $this->mock(CurrencyRepositoryInterface::class); + + /** @var AvailableBudget $availableBudget */ + $availableBudget = $this->user()->availableBudgets()->first(); + + // mock calls: + $repository->shouldReceive('setUser'); + $repository->shouldReceive('updateAvailableBudget')->once()->andReturn($availableBudget); + $currencyRepository->shouldReceive('findNull')->andReturn(TransactionCurrency::find(1)); + + // data to submit + $data = [ + 'transaction_currency_id' => '1', + 'amount' => '100', + 'start_date' => '2018-01-01', + 'end_date' => '2018-01-31', + ]; + + // test API + $response = $this->put('/api/v1/available_budgets/' . $availableBudget->id, $data, ['Accept' => 'application/json']); + $response->assertStatus(200); + $response->assertJson(['data' => ['type' => 'available_budgets', 'links' => true],]); + $response->assertHeader('Content-Type', 'application/vnd.api+json'); + $response->assertSee($availableBudget->amount); + } + + +} \ No newline at end of file