N°6414 Move existing AbstractSimpleField::Validate impl to custom validators

- LinkedSetField
- SelectObjectField
- MultipleChoicesField (warning this hierarchy contains non multiple value fields like SelectField !)

Also change AbstractValidator::Validate signature : now we are returning an array of error messages, so that we can return multiple ones
This commit is contained in:
Pierre Goiffon
2023-06-28 17:56:04 +02:00
parent d085f15b6d
commit 6cc2d49cd5
20 changed files with 526 additions and 172 deletions

View File

@@ -100,4 +100,28 @@ class FieldTest extends ItopTestCase
$this->assertTrue($bIsSubFormFieldValidAfterFieldUpdate);
$this->assertCount(0, $oSubFormField->GetErrorMessages());
}
public function testRemoveValidatorsOfClass(): void {
$oField = new StringField('test');
$this->assertCount(0, $oField->GetValidators());
$oField->RemoveValidatorsOfClass(CustomRegexpValidator::class);
$this->assertCount(0, $oField->GetValidators());
$oField->AddValidator(new IntegerValidator());
$this->assertCount(1, $oField->GetValidators());
$oField->RemoveValidatorsOfClass(CustomRegexpValidator::class);
$this->assertCount(1, $oField->GetValidators());
$oField->AddValidator(new CustomRegexpValidator('^.*$'));
$this->assertCount(2, $oField->GetValidators());
$oField->RemoveValidatorsOfClass(CustomRegexpValidator::class);
$this->assertCount(1, $oField->GetValidators());
$oField->AddValidator(new CustomRegexpValidator('^.*$'));
$oField->AddValidator(new CustomRegexpValidator('^.*$'));
$this->assertCount(3, $oField->GetValidators());
$oField->RemoveValidatorsOfClass(CustomRegexpValidator::class);
$this->assertCount(1, $oField->GetValidators());
}
}

View File

@@ -0,0 +1,40 @@
<?php
/*
* @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Form;
use Combodo\iTop\Form\Field\LinkedSetField;
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
use ormLinkSet;
use Person;
class LinkedSetFieldTest extends ItopDataTestCase {
public function testValidate(): void {
$sLinkedClass = Ticket::class;
$oLinkedSetField = new LinkedSetField('test');
$oLinkedSetField->SetIndirect(false);
$oLinkedSetField->SetTargetClass($sLinkedClass);
$oLinkedSetField->SetLinkedClass($sLinkedClass);
$oLinkedSetField->SetLnkAttributesToDisplay(['title' => 'title']);
$oSetThreeExistingTickets = new ormLinkSet(Person::class, 'tickets_list');
$this->CreateTestOrganization();
$oUserRequest1 = $this->CreateUserRequest(1);
$oUserRequest2 = $this->CreateUserRequest(2);
$oUserRequest3 = $this->CreateUserRequest(3);
$oSetThreeExistingTickets->AddItem($oUserRequest1);
$oSetThreeExistingTickets->AddItem($oUserRequest2);
$oSetThreeExistingTickets->AddItem($oUserRequest3);
$oLinkedSetField->SetCurrentValue($oSetThreeExistingTickets);
$this->assertTrue($oLinkedSetField->Validate(), 'A set with existing objects and no modifications must be OK');
$oUserRequest1->Set('title', 'this a modified title !');
$this->assertTrue($oLinkedSetField->Validate(), 'A set with existing objects and a valid modification must be OK');
$oUserRequest1->Set('title', '');
$this->assertFalse($oLinkedSetField->Validate(), 'A set with existing objects and an invalid modification must be KO');
}
}

View File

@@ -0,0 +1,107 @@
<?php
/*
* @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Form;
use Combodo\iTop\Form\Field\MultipleChoicesField;
use Combodo\iTop\Form\Field\MultipleSelectField;
use Combodo\iTop\Form\Field\SelectField;
use Combodo\iTop\Test\UnitTest\ItopTestCase;
use ContextTag;
class MultipleChoicesFieldTest extends ItopTestCase
{
public function testValidateForMultipleSelectField(): void
{
$oMultipleChoicesField = new MultipleSelectField('test');
$oMultipleChoicesField->AddChoice('A');
$oMultipleChoicesField->AddChoice('B');
$oMultipleChoicesField->AddChoice('C');
$oMultipleChoicesField->AddChoice('D');
// N°1150 the control was added for the REST API initially and was only triggered with the corresponding ContextTag
$oRestContext = new ContextTag(ContextTag::TAG_REST);
$this->ValidateMultipleSelectField($oMultipleChoicesField);
// retrying without REST context
unset($oRestContext);
$this->ValidateMultipleSelectField($oMultipleChoicesField);
}
private function ValidateMultipleSelectField(MultipleChoicesField $oMultipleChoicesField): void
{
$oMultipleChoicesField->SetCurrentValue(null);
$this->assertTrue($oMultipleChoicesField->Validate(), 'No value must be valid');
$sExistingValue = 'A';
$sNonExistingValue = 'Non existing choice';
$sNonExistingValue1 = 'Non existing choice 1';
$sNonExistingValue2 = 'Non existing choice 2';
$oMultipleChoicesField->SetCurrentValue($sExistingValue);
$this->assertTrue($oMultipleChoicesField->Validate(), 'Value among possible ones is valid');
$oMultipleChoicesField->SetCurrentValue($sNonExistingValue);
$this->assertFalse($oMultipleChoicesField->Validate(), 'Value not among possible ones is invalid');
$this->assertCount(1, $oMultipleChoicesField->GetErrorMessages());
$this->assertStringContainsString($sNonExistingValue, $oMultipleChoicesField->GetErrorMessages()[0]);
$oMultipleChoicesField->SetCurrentValue([$sNonExistingValue1, $sNonExistingValue2]);
$this->assertFalse($oMultipleChoicesField->Validate(), 'Multiple values not among possible ones is invalid');
$this->assertCount(2, $oMultipleChoicesField->GetErrorMessages());
$this->assertStringContainsString($sNonExistingValue1, $oMultipleChoicesField->GetErrorMessages()[0]);
$this->assertStringContainsString($sNonExistingValue2, $oMultipleChoicesField->GetErrorMessages()[1]);
$oMultipleChoicesField->SetCurrentValue([$sExistingValue, $sNonExistingValue]);
$this->assertFalse($oMultipleChoicesField->Validate(), 'Valid value + Value not among possible ones is invalid');
$this->assertCount(1, $oMultipleChoicesField->GetErrorMessages());
$this->assertStringContainsString($sNonExistingValue, $oMultipleChoicesField->GetErrorMessages()[0]);
$oMultipleChoicesField->SetCurrentValue([$sExistingValue, $sNonExistingValue1, $sNonExistingValue2]);
$this->assertFalse($oMultipleChoicesField->Validate(), 'Valid value + Multiple values not among possible ones is invalid');
$this->assertCount(2, $oMultipleChoicesField->GetErrorMessages());
$this->assertStringContainsString($sNonExistingValue1, $oMultipleChoicesField->GetErrorMessages()[0]);
$this->assertStringContainsString($sNonExistingValue2, $oMultipleChoicesField->GetErrorMessages()[1]);
}
public function testValidateForSelectField(): void
{
$oMultipleChoicesField = new SelectField('test');
$oMultipleChoicesField->AddChoice('A');
$oMultipleChoicesField->AddChoice('B');
$oMultipleChoicesField->AddChoice('C');
$oMultipleChoicesField->AddChoice('D');
// N°1150 the control was added for the REST API initially and was only triggered with the corresponding ContextTag
$oRestContext = new ContextTag(ContextTag::TAG_REST);
$this->ValidateSelectField($oMultipleChoicesField);
// retrying without REST context
unset($oRestContext);
$this->ValidateSelectField($oMultipleChoicesField);
$oMultipleChoicesField = new SelectField('test');
$oMultipleChoicesField->SetChoices(['A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D']);
$this->ValidateSelectField($oMultipleChoicesField);
}
private function ValidateSelectField(MultipleChoicesField $oMultipleChoicesField): void
{
$oMultipleChoicesField->SetCurrentValue(null);
$this->assertTrue($oMultipleChoicesField->Validate(), 'No value must be valid');
$sExistingValue = 'A';
$sNonExistingValue = 'Non existing choice';
$oMultipleChoicesField->SetCurrentValue($sExistingValue);
$this->assertTrue($oMultipleChoicesField->Validate(), 'Value among possible ones is valid');
$oMultipleChoicesField->SetCurrentValue($sNonExistingValue);
$this->assertFalse($oMultipleChoicesField->Validate(), 'Value not among possible ones is invalid');
$this->assertCount(1, $oMultipleChoicesField->GetErrorMessages());
$this->assertStringContainsString($sNonExistingValue, $oMultipleChoicesField->GetErrorMessages()[0]);
}
}

View File

@@ -0,0 +1,43 @@
<?php
/*
* @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Form;
use Combodo\iTop\Form\Field\SelectObjectField;
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
use ContextTag;
use DBObjectSearch;
use Organization;
class SelectObjectFieldTest extends ItopDataTestCase {
public function testValidate(): void {
$oSelectObjectField = new SelectObjectField('test');
$oSelectObjectField->SetSearch(DBObjectSearch::FromOQL('SELECT '.Organization::class));
// N°1150 the control was added for the REST API initially and was only triggered with the corresponding ContextTag
$oRestContext = new ContextTag(ContextTag::TAG_REST);
$this->ValidateSelectObjectField($oSelectObjectField);
// retrying without REST context
unset($oRestContext);
$this->ValidateSelectObjectField($oSelectObjectField);
}
private function ValidateSelectObjectField(SelectObjectField $oSelectObjectField): void {
$oSelectObjectField->SetCurrentValue(null);
$this->assertTrue($oSelectObjectField->Validate(), 'No value must be valid');
$sExistingOrganizationId = 1;
$oSelectObjectField->SetCurrentValue($sExistingOrganizationId);
$this->assertTrue($oSelectObjectField->Validate(), 'An existing object id must be valid');
$sNonExistingOrganizationId = 999999;
$oSelectObjectField->SetCurrentValue($sNonExistingOrganizationId);
$this->assertFalse($oSelectObjectField->Validate(), 'An non existing object id must be invalid');
$this->assertCount(1, $oSelectObjectField->GetErrorMessages());
$this->assertStringContainsString($sNonExistingOrganizationId, $oSelectObjectField->GetErrorMessages()[0]);
}
}

View File

@@ -7,6 +7,7 @@
namespace Combodo\iTop\Test\UnitTest\Sources\Form\Validator;
use Combodo\iTop\Form\Field\StringField;
use Combodo\iTop\Form\Validator\MandatoryValidator;
use Combodo\iTop\Test\UnitTest\ItopTestCase;
class ValidatorTest extends ItopTestCase
@@ -24,5 +25,7 @@ class ValidatorTest extends ItopTestCase
$bIsMandatoryFieldValidWithNoValue = $oField->Validate();
$this->assertFalse($bIsMandatoryFieldValidWithNoValue);
$this->assertNotEmpty($oField->GetErrorMessages());
$this->assertCount(1, $oField->GetErrorMessages());
$this->assertStringContainsString(MandatoryValidator::DEFAULT_ERROR_MESSAGE, $oField->GetErrorMessages()[0]);
}
}