Skip to content

Commit 0e21d25

Browse files
authored
Allow request validator to accept null (#38)
1 parent 5887a09 commit 0e21d25

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

src/Traits/HasCustomFields.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function customFields(): MorphMany
1616
return $this->morphMany(config('custom-fields.models.custom-field'), 'model')->orderBy('order');
1717
}
1818

19-
public function validateCustomFields(Request|array $fields): Validator
19+
public function validateCustomFields(Request|array|null $fields): Validator
2020
{
2121
if ($fields instanceof Request) {
2222
return $this->validateCustomFieldsRequest($fields);
@@ -66,7 +66,7 @@ public function order($fields)
6666
});
6767
}
6868

69-
protected function validationData(array $fields, Collection $customFields): array
69+
protected function validationData(array|null $fields, Collection $customFields): array
7070
{
7171
return collect($fields)
7272
->mapWithKeys(function (mixed $field, int $key) use ($customFields) {

tests/Feature/CustomFieldControllerTest.php

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Illuminate\Foundation\Testing\RefreshDatabase;
1010
use Illuminate\Http\Request;
1111
use Illuminate\Support\Facades\Route;
12+
use Illuminate\Validation\ValidationException;
1213

1314
class CustomFieldControllerTest extends TestCase
1415
{
@@ -28,7 +29,7 @@ public function valid_data_passes_controller_validation()
2829
$field = $survey->customFields()->first();
2930

3031
Route::post("/surveys/{$survey->id}/responses", function (Request $request) use ($survey) {
31-
$survey->validateCustomFields($request);
32+
$survey->validateCustomFields($request)->validate();
3233

3334
return response('All good', 200);
3435
});
@@ -317,4 +318,56 @@ public function fields_can_be_saved_from_request_with_convenience_method()
317318

318319
$this->assertCount(1, $surveyResponse->customFieldResponses);
319320
}
321+
322+
/** @test */
323+
public function can_validate_request_with_no_custom_fields()
324+
{
325+
$survey = Survey::create();
326+
$survey->customfields()->save(
327+
CustomField::factory()->make([
328+
'title' => 'favorite_album',
329+
'type' => 'select',
330+
'answers' => ['Tha Carter', 'Tha Carter II', 'Tha Carter III'],
331+
])
332+
);
333+
334+
Route::post("/surveys/{$survey->id}/responses", function (Request $request) use ($survey) {
335+
$survey->validateCustomFields($request)->validate();
336+
337+
return response('All good', 200);
338+
});
339+
340+
$this->post("/surveys/{$survey->id}/responses")
341+
->assertOk();
342+
}
343+
344+
/** @test */
345+
public function fails_validation_on_request_with_no_custom_fields_but_is_required()
346+
{
347+
$survey = Survey::create();
348+
$survey->customfields()->save(
349+
CustomField::factory()->make([
350+
'title' => 'favorite_album',
351+
'type' => 'select',
352+
'answers' => ['Tha Carter', 'Tha Carter II', 'Tha Carter III'],
353+
'required' => true,
354+
])
355+
);
356+
357+
Route::post("/surveys/{$survey->id}/responses", function (Request $request) use ($survey) {
358+
$validator = $survey->validateCustomFields($request)->validate();
359+
360+
return response('All good', 200);
361+
});
362+
363+
$fieldId = $survey->customFields()->value('id');
364+
365+
try {
366+
$response = $this->post("/surveys/{$survey->id}/responses");
367+
368+
$this->fail('ValidationException was not thrown');
369+
} catch (ValidationException $e) {
370+
$this->assertArrayHasKey('field_'. $fieldId, $e->errors());
371+
}
372+
}
320373
}

0 commit comments

Comments
 (0)