Evaluate custom validation rules first (#655)

This commit is contained in:
Chirag Chhatrala 2024-12-30 15:30:10 +05:30 committed by GitHub
parent 1bddafbb3e
commit 3d9bc60ca1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 55 additions and 6 deletions

View File

@ -63,8 +63,14 @@ class AnswerFormRequest extends FormRequest
$property['logic'] = false;
}*/
// For get values instead of Id for select/multi select options
$data = $this->toArray();
// User custom validation
if (!(Str::of($property['type'])->startsWith('nf-')) && isset($property['validation'])) {
$rules[] = (new CustomFieldValidationRule($property['validation'], $data));
}
// For get values instead of Id for select/multi select options
foreach ($selectionFields as $field) {
if (isset($data[$field['id']]) && is_array($data[$field['id']])) {
$data[$field['id']] = array_map(function ($val) use ($field) {
@ -109,11 +115,6 @@ class AnswerFormRequest extends FormRequest
$rules = array_merge($rules, $this->getPropertyRules($property));
}
// User custom validation
if (!(Str::of($property['type'])->startsWith('nf-')) && isset($property['validation'])) {
$rules[] = (new CustomFieldValidationRule($property['validation'], $data));
}
$this->requestRules[$propertyId] = $rules;
}

View File

@ -303,3 +303,51 @@ it('can validate form answer with precognition', function () {
$this->assertEquals(sizeof($errors), 1);
$response->assertStatus(422);
});
it('executes custom validation before required field validation', function () {
$user = $this->actingAsUser();
$workspace = $this->createUserWorkspace($user);
$form = $this->createForm($user, $workspace);
$emailField = collect($form->properties)->where('name', 'Email')->first();
$condition = [
'actions' => [],
'conditions' => [
'operatorIdentifier' => 'and',
'children' => [
[
'identifier' => $emailField['id'],
'value' => [
'operator' => 'contains',
'property_meta' => [
'id' => $emailField['id'],
'type' => 'email',
],
'value' => '@company.com',
],
],
],
],
];
$submissionData = [];
$validationMessage = 'Must use company email';
$form->properties = collect($form->properties)->map(function ($property) use (&$submissionData, &$condition, &$validationMessage, $emailField) {
if (in_array($property['name'], ['Name'])) {
$property['required'] = true;
$property['validation'] = ['error_conditions' => $condition, 'error_message' => $validationMessage];
$submissionData[$emailField['id']] = 'test@other.com';
}
return $property;
})->toArray();
$form->update();
$formData = FormSubmissionDataFactory::generateSubmissionData($form, $submissionData);
$this->postJson(route('forms.answer', $form->slug), $formData)
->assertStatus(422)
->assertJson([
'message' => $validationMessage,
]);
});