Skip to content

Commit

Permalink
Tests for EditableSpamProtectionField validation
Browse files Browse the repository at this point in the history
Requires setFormField() method to avoid excessive mocking
  • Loading branch information
chillu committed Jan 8, 2016
1 parent 529960d commit 84bbe9d
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 0 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
20 changes: 20 additions & 0 deletions code/EditableSpamProtectionField.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,17 @@ class EditableSpamProtectionField extends EditableFormField
'EditableNumericField'
);

/**
* @var FormField
*/
protected $formField = null;

public function getFormField()
{
if ($this->formField) {
return $this->formField;
}

// Get protector
$protector = FormSpamProtectionExtension::get_protector();
if (!$protector) {
Expand All @@ -45,6 +54,17 @@ public function getFormField()
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
*
Expand Down
135 changes: 135 additions & 0 deletions tests/EditableSpamProtectionFieldTest.php
Original file line number Diff line number Diff line change
@@ -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)
{
}
}

0 comments on commit 84bbe9d

Please sign in to comment.