diff --git a/app/Http/Requests/Task/UploadTaskRequest.php b/app/Http/Requests/Task/UploadTaskRequest.php index 66a0f8008d61..6b7d96ef048b 100644 --- a/app/Http/Requests/Task/UploadTaskRequest.php +++ b/app/Http/Requests/Task/UploadTaskRequest.php @@ -30,11 +30,22 @@ class UploadTaskRequest extends Request public function rules() { - $rules = [ - 'documents' => 'bail|sometimes|file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000', - 'is_public' => 'sometimes|boolean', - ]; + $rules = []; + if ($this->file('documents') && is_array($this->file('documents'))) { + $rules['documents.*'] = $this->file_validation; + } elseif ($this->file('documents')) { + $rules['documents'] = $this->file_validation; + } + + if ($this->file('file') && is_array($this->file('file'))) { + $rules['file.*'] = $this->file_validation; + } elseif ($this->file('file')) { + $rules['file'] = $this->file_validation; + } + + $rules['is_public'] = 'sometimes|boolean'; + return $rules; } diff --git a/tests/Integration/FileUploadValidationTest.php b/tests/Integration/FileUploadValidationTest.php new file mode 100644 index 000000000000..68cd436739ec --- /dev/null +++ b/tests/Integration/FileUploadValidationTest.php @@ -0,0 +1,151 @@ +makeTestData(); + + } + + public function testIteratingThroughAllEntities() + { + + Storage::fake('local'); + + $file = UploadedFile::fake()->image('avatar.jpg'); + + $data = [ + 'documents' => [$file], + 'is_public' => false, + '_method' => 'PUT', + ]; + + $entities = [ + 'invoice' => 'invoices', + 'quote' => 'quotes', + 'payment' => 'payments', + 'credit' => 'credits', + 'expense' => 'expenses', + 'project' => 'projects', + 'task' => 'tasks', + 'vendor' => 'vendors', + 'product' => 'products', + 'client' => 'clients', + 'recurring_invoice' => 'recurring_invoices', + 'recurring_expense' => 'recurring_expenses', + ]; + + foreach($entities as $key => $value) { + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson("/api/v1/{$value}/{$this->{$key}->hashed_id}/upload", $data); + + $acc = $response->json(); + $response->assertStatus(200); + + $this->assertCount(1, $acc['data']['documents']); + $this->assertFalse($acc['data']['documents'][0]['is_public']); + } + + } + + public function testFileUploadIsPublicSetsAppropriately() + { + Storage::fake('local'); + + $file = UploadedFile::fake()->image('avatar.jpg'); + + $data = [ + 'documents' => [$file], + 'is_public' => false, + '_method' => 'PUT', + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson("/api/v1/invoices/{$this->invoice->hashed_id}/upload", $data); + + $response->assertStatus(200); + $acc = $response->json(); + + $this->assertCount(1, $acc['data']['documents']); + $this->assertFalse($acc['data']['documents'][0]['is_public']); + + $data = [ + 'documents' => [$file], + 'is_public' => true, + '_method' => 'PUT', + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson("/api/v1/invoices/{$this->invoice->hashed_id}/upload", $data); + + $response->assertStatus(200); + $acc = $response->json(); + + $this->assertCount(2, $acc['data']['documents']); + $this->assertTrue($acc['data']['documents'][1]['is_public']); + + } + + public function testMultiFileUploadIsPublicSetsAppropriately() + { + Storage::fake('local'); + + $file = UploadedFile::fake()->image('avatar.jpg'); + + $data = [ + 'documents' => [$file, $file], + 'is_public' => false, + '_method' => 'PUT', + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson("/api/v1/invoices/{$this->invoice->hashed_id}/upload", $data); + + $response->assertStatus(200); + $acc = $response->json(); + + $this->assertCount(2, $acc['data']['documents']); + $this->assertFalse($acc['data']['documents'][0]['is_public']); + $this->assertFalse($acc['data']['documents'][1]['is_public']); + + } + +} \ No newline at end of file diff --git a/tests/MockAccountData.php b/tests/MockAccountData.php index 86b039bfcdd3..af4687d7e362 100644 --- a/tests/MockAccountData.php +++ b/tests/MockAccountData.php @@ -186,6 +186,10 @@ trait MockAccountData public $contact; + public $product; + + public $recurring_invoice; + public function makeTestData() { config(['database.default' => config('ninja.db.default')]); @@ -371,6 +375,17 @@ trait MockAccountData 'client_id' => $this->client->id, ]); + $this->product = Product::factory()->create([ + 'user_id' => $user_id, + 'company_id' => $this->company->id, + ]); + + $this->recurring_invoice = RecurringInvoice::factory()->create([ + 'user_id' => $user_id, + 'company_id' => $this->company->id, + 'client_id' => $this->client->id, + ]); + $this->expense = Expense::factory()->create([ 'user_id' => $user_id, 'company_id' => $this->company->id,