mirror of
https://github.com/silverstripe/silverstripe-spamprotection.git
synced 2024-10-22 14:05:59 +02:00
Merge pull request #44 from chillu/pulls/validate-field-fix
Validate field fix
This commit is contained in:
commit
078b0f51f9
@ -31,6 +31,7 @@ before_script:
|
||||
- php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss
|
||||
- cd ~/builds/ss
|
||||
- composer install
|
||||
- composer require silverstripe/userforms
|
||||
|
||||
script:
|
||||
- vendor/bin/phpunit spamprotection/tests
|
||||
|
@ -24,8 +24,17 @@ if (class_exists('EditableFormField')) {
|
||||
'EditableNumericField'
|
||||
);
|
||||
|
||||
/**
|
||||
* @var FormField
|
||||
*/
|
||||
protected $formField = null;
|
||||
|
||||
public function getFormField()
|
||||
{
|
||||
if ($this->formField) {
|
||||
return $this->formField;
|
||||
}
|
||||
|
||||
// Get protector
|
||||
$protector = FormSpamProtectionExtension::get_protector();
|
||||
if (!$protector) {
|
||||
@ -45,6 +54,17 @@ if (class_exists('EditableFormField')) {
|
||||
return $protector->getFormField($this->Name, $this->Title, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param FormField $field
|
||||
* @return self
|
||||
*/
|
||||
public function setFormField(FormField $field)
|
||||
{
|
||||
$this->formField = $field;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the list of all candidate spam detectable fields on this field's form
|
||||
*
|
||||
@ -110,11 +130,46 @@ if (class_exists('EditableFormField')) {
|
||||
return $fields;
|
||||
}
|
||||
|
||||
public function validateField($data, $form)
|
||||
/**
|
||||
* Using custom validateField method
|
||||
* as Spam Protection Field implementations may have their own error messages
|
||||
* and may not be based on the field being required, e.g. Honeypot Field
|
||||
*
|
||||
* @param array $data
|
||||
* @param Form $form
|
||||
* @return void
|
||||
*/
|
||||
public function validateField($data, $form)
|
||||
{
|
||||
$formField = $this->getFormField();
|
||||
if (!$formField->validate($form->getValidator())) {
|
||||
$form->addErrorMessage($this->Name, $this->getErrorMessage()->HTML(), 'error', false);
|
||||
|
||||
if (isset($data[$this->Name])) {
|
||||
$formField->setValue($data[$this->Name]);
|
||||
}
|
||||
|
||||
$validator = $form->getValidator();
|
||||
if (!$formField->validate($validator)) {
|
||||
$errors = $validator->getErrors();
|
||||
$foundError = false;
|
||||
|
||||
// field validate implementation may not add error to validator
|
||||
if (count($errors) > 0) {
|
||||
// check if error already added from fields' validate method
|
||||
foreach ($errors as $error) {
|
||||
if ($error['fieldName'] == $this->Name) {
|
||||
$foundError = $error;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($foundError !== false) {
|
||||
// use error messaging already set from validate method
|
||||
$form->addErrorMessage($this->Name, $foundError['message'], $foundError['messageType'], false);
|
||||
} else {
|
||||
// fallback to custom message set in CMS or default message if none set
|
||||
$form->addErrorMessage($this->Name, $this->getErrorMessage()->HTML(), 'error', false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
135
tests/EditableSpamProtectionFieldTest.php
Normal file
135
tests/EditableSpamProtectionFieldTest.php
Normal file
@ -0,0 +1,135 @@
|
||||
<?php
|
||||
|
||||
class EditableSpamProtectionFieldTest extends SapphireTest
|
||||
{
|
||||
|
||||
protected $usesDatabase = true;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
Config::inst()->update(
|
||||
'FormSpamProtectionExtension', 'default_spam_protector',
|
||||
'EditableSpamProtectionFieldTest_Protector'
|
||||
);
|
||||
}
|
||||
|
||||
public function testValidateFieldDoesntAddErrorOnSuccess()
|
||||
{
|
||||
if (!class_exists('EditableSpamProtectionField')) {
|
||||
$this->markTestSkipped('"userforms" module not installed');
|
||||
}
|
||||
|
||||
$formMock = $this->getFormMock();
|
||||
$formFieldMock = $this->getEditableFormFieldMock();
|
||||
|
||||
$formFieldMock
|
||||
->getFormField() // mock
|
||||
->expects($this->once())
|
||||
->method('validate')
|
||||
->will($this->returnValue(true));
|
||||
|
||||
$formMock
|
||||
->expects($this->never())
|
||||
->method('addErrorMessage');
|
||||
|
||||
$formFieldMock->validateField(array('MyField' => null), $formMock);
|
||||
}
|
||||
|
||||
public function testValidateFieldAddsErrorFromField()
|
||||
{
|
||||
if (!class_exists('EditableSpamProtectionField')) {
|
||||
$this->markTestSkipped('"userforms" module not installed');
|
||||
}
|
||||
|
||||
$formMock = $this->getFormMock();
|
||||
$formFieldMock = $this->getEditableFormFieldMock();
|
||||
|
||||
$formFieldMock
|
||||
->getFormField() // mock
|
||||
->expects($this->once())
|
||||
->method('validate')
|
||||
->will($this->returnValue(false));
|
||||
|
||||
$formMock->getValidator()->validationError('MyField', 'some field message', 'required');
|
||||
|
||||
$formMock
|
||||
->expects($this->once())
|
||||
->method('addErrorMessage')
|
||||
->with($this->anything(), $this->stringContains('some field message'), $this->anything(), $this->anything());;
|
||||
|
||||
$formFieldMock->validateField(array('MyField' => null), $formMock);
|
||||
}
|
||||
|
||||
public function testValidateFieldAddsDefaultError()
|
||||
{
|
||||
if (!class_exists('EditableSpamProtectionField')) {
|
||||
$this->markTestSkipped('"userforms" module not installed');
|
||||
}
|
||||
|
||||
$formMock = $this->getFormMock();
|
||||
$formFieldMock = $this->getEditableFormFieldMock();
|
||||
|
||||
$formFieldMock
|
||||
->getFormField() // mock
|
||||
->expects($this->once())
|
||||
->method('validate')
|
||||
->will($this->returnValue(false));
|
||||
|
||||
// field doesn't set any validation errors here
|
||||
|
||||
$formMock
|
||||
->expects($this->once())
|
||||
->method('addErrorMessage')
|
||||
->with($this->anything(), $this->stringContains('default error message'), $this->anything(), $this->anything());
|
||||
|
||||
$formFieldMock->validateField(array('MyField' => null), $formMock);
|
||||
}
|
||||
|
||||
protected function getFormMock()
|
||||
{
|
||||
$formMock = $this->getMockBuilder('Form', array('addErrorMessage'))
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$formMock
|
||||
->expects($this->any())
|
||||
->method('getValidator')
|
||||
->will($this->returnValue(new RequiredFields()));
|
||||
|
||||
return $formMock;
|
||||
}
|
||||
|
||||
protected function getEditableFormFieldMock()
|
||||
{
|
||||
$page = new UserDefinedForm();
|
||||
$page->write();
|
||||
|
||||
$formFieldMock = $this->getMockBuilder('TextField')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$editableFormFieldMock = new EditableSpamProtectionField(array(
|
||||
'ParentID' => $page->ID,
|
||||
'Name' => 'MyField',
|
||||
'CustomErrorMessage' => 'default error message'
|
||||
));
|
||||
$editableFormFieldMock->write();
|
||||
$editableFormFieldMock->setFormField($formFieldMock);
|
||||
|
||||
return $editableFormFieldMock;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class EditableSpamProtectionFieldTest_Protector implements SpamProtector, TestOnly
|
||||
{
|
||||
public function getFormField($name = null, $title = null, $value = null)
|
||||
{
|
||||
return new TextField($name, 'Foo', $value);
|
||||
}
|
||||
|
||||
public function setFieldMapping($fieldMapping)
|
||||
{
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user