Add validation for other member fields

This commit is contained in:
philipp lang 2024-02-18 18:48:31 +01:00
parent a830f366ad
commit b194e77966
3 changed files with 93 additions and 7 deletions

View File

@ -6,6 +6,7 @@ use App\Form\Models\Form;
use App\Form\Models\Participant;
use App\Member\Member;
use Faker\Generator;
use Generator as LazyGenerator;
class NamiField extends Field
{
@ -38,7 +39,21 @@ class NamiField extends Field
*/
public function getRegistrationRules(): array
{
return [$this->key => []];
$rules = [];
$fields = request()->route('form')->getFields();
$c = collect($fields)->filter(fn ($field) => $field['nami_type'] === null)->filter(fn ($field) => $field['type'] !== class_basename(static::class))->map(fn ($field) => Field::fromConfig($field)->getRegistrationRules());
foreach ($c as $field) {
foreach ($field as $ruleKey => $rule) {
$rules[$this->key . '.*.' . $ruleKey] = $rule;
}
}
return [
$this->key . '.*.id' => ['required', 'numeric', 'exists:members,mitgliedsnr'],
...$rules,
];
}
/**
@ -46,7 +61,34 @@ class NamiField extends Field
*/
public function getRegistrationAttributes(): array
{
return [$this->key => $this->name];
$rules = [];
$fields = request()->route('form')->getFields();
$inputMembers = request($this->key);
$c = collect($fields)->filter(fn ($field) => $field['type'] !== class_basename(static::class))->map(fn ($field) => Field::fromConfig($field));
foreach ($c as $field) {
foreach ($field->getRegistrationRules() as $ruleKey => $rule) {
foreach ($inputMembers as $memberIndex => $inputMember) {
if (str($ruleKey)->contains('*')) {
foreach (request($this->key . '.' . $memberIndex . '.' . $field->key) as $i => $k) {
$rules[$this->key . '.' . $memberIndex . '.' . str($ruleKey)->replace('*', $i)] = $field->name . ' für Mitglied Nr ' . $inputMember['id'];
}
} else {
$rules[$this->key . '.' . $memberIndex . '.' . $ruleKey] = $field->name . ' für Mitglied Nr ' . $inputMember['id'];
}
}
}
}
foreach ($inputMembers as $memberIndex => $inputMember) {
$rules[$this->key . '.' . $memberIndex . '.id'] = 'Mitglied Nr ' . $inputMember['id'];
}
return [
$this->key => $this->name,
...$rules,
];
}
/**

View File

@ -2,7 +2,6 @@
namespace Tests\Feature\Form;
use App\Form\Enums\NamiField as EnumsNamiField;
use App\Form\Enums\NamiType;
use App\Form\Fields\CheckboxesField;
use App\Form\Fields\CheckboxField;
@ -313,18 +312,62 @@ class FormRegisterActionTest extends TestCase
{
$this->login()->loginNami();
Member::factory()->defaults()->create(['mitgliedsnr' => '5505']);
Member::factory()->defaults()->create(['mitgliedsnr' => '5506']);
$form = Form::factory()
->sections([FormtemplateSectionRequest::new()->fields([
FormtemplateFieldRequest::type(NamiField::class)->key('members'),
FormtemplateFieldRequest::type(TextField::class)->key('other')->namiType(null),
FormtemplateFieldRequest::type(TextField::class)->key('other')->namiType(null)->required(false),
])])
->create();
$this->postJson(route('form.register', ['form' => $form]), ['other' => 'ooo', 'members' => [['id' => '5505', 'other' => 'O1'], ['id' => '5506', 'other' => 'O2']]])
$this->postJson(route('form.register', ['form' => $form]), ['other' => 'ooo', 'members' => [['id' => '5505', 'other' => 'O1']]])
->assertOk();
$this->assertEquals('ooo', $form->participants->get(0)->data['other']);
$this->assertEquals('O1', $form->participants->get(1)->data['other']);
$this->assertEquals('O2', $form->participants->get(2)->data['other']);
}
public function testItValidatesMembersFields(): void
{
$this->login()->loginNami();
Member::factory()->defaults()->create(['mitgliedsnr' => '5505', 'firstname' => 'Paula', 'lastname' => 'Schirm']);
Member::factory()->defaults()->create(['mitgliedsnr' => '5506', 'firstname' => 'Paula', 'lastname' => 'Schirm']);
$form = Form::factory()
->sections([FormtemplateSectionRequest::new()->fields([
FormtemplateFieldRequest::type(NamiField::class)->key('members'),
FormtemplateFieldRequest::type(TextField::class)->name('Andere')->key('other')->namiType(null)->required(true),
])])
->create();
$this->postJson(route('form.register', ['form' => $form]), ['other' => 'ooo', 'members' => [['id' => '5505', 'other' => ''], ['id' => '5506', 'other' => '']]])
->assertJsonValidationErrors(['members.0.other' => 'Andere für Mitglied Nr 5505 ist erforderlich.'])
->assertJsonValidationErrors(['members.1.other' => 'Andere für Mitglied Nr 5506 ist erforderlich.']);
}
public function testItValidatesIfMemberExists(): void
{
$this->login()->loginNami();
$form = Form::factory()
->sections([FormtemplateSectionRequest::new()->fields([
FormtemplateFieldRequest::type(NamiField::class)->key('members'),
FormtemplateFieldRequest::type(TextField::class)->name('Andere')->key('other')->namiType(null)->required(true),
])])
->create();
$this->postJson(route('form.register', ['form' => $form]), ['other' => 'ooo', 'members' => [['id' => '9999', 'other' => 'other']]])
->assertJsonValidationErrors(['members.0.id' => 'Mitglied Nr 9999 ist nicht vorhanden.']);
}
public function testItValidatesMembersCheckboxesOptions(): void
{
$this->login()->loginNami();
Member::factory()->defaults()->create(['mitgliedsnr' => '5505', 'firstname' => 'Paula', 'lastname' => 'Schirm']);
$form = Form::factory()
->sections([FormtemplateSectionRequest::new()->fields([
FormtemplateFieldRequest::type(NamiField::class)->key('members'),
FormtemplateFieldRequest::type(CheckboxesField::class)->name('Andere')->key('other')->namiType(null)->options(['A', 'B']),
])])
->create();
$this->postJson(route('form.register', ['form' => $form]), ['other' => [], 'members' => [['id' => '5505', 'other' => ['A', 'missing']]]])
->assertJsonValidationErrors(['members.0.other.1' => 'Der gewählte Wert für Andere für Mitglied Nr 5505 ist ungültig.']);
}
}

View File

@ -31,6 +31,7 @@ class FormtemplateFieldRequest extends RequestFactory
'key' => str($this->faker->words(5, true))->snake()->toString(),
'columns' => ['mobile' => 2, 'tablet' => 4, 'desktop' => 6],
'default' => '',
'nami_type' => null,
];
}