mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Minor / Refactor php tests for TreeMultiselectField
This commit is contained in:
parent
9ce6d91b76
commit
f526c794fc
@ -4,63 +4,260 @@ namespace SilverStripe\Forms\Tests;
|
||||
|
||||
use SilverStripe\Assets\File;
|
||||
use SilverStripe\Dev\SapphireTest;
|
||||
use SilverStripe\Forms\Form;
|
||||
use SilverStripe\Forms\FormTemplateHelper;
|
||||
use SilverStripe\Forms\TreeMultiselectField;
|
||||
|
||||
class TreeMultiselectFieldTest extends SapphireTest
|
||||
{
|
||||
protected static $fixture_file = 'TreeDropdownFieldTest.yml';
|
||||
|
||||
public function testEmptyChoiceReadonly()
|
||||
protected $formId = 'TheFormID';
|
||||
protected $fieldName = 'TestTree';
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setUp()
|
||||
{
|
||||
$field = new TreeMultiselectField('TestTree', 'Test tree', File::class);
|
||||
parent::setUp();
|
||||
|
||||
$asdf = $this->objFromFixture(File::class, 'asdf');
|
||||
$subfolderfile1 = $this->objFromFixture(File::class, 'subfolderfile1');
|
||||
$this->form = $this->buildFormMock();
|
||||
$this->field = $this->buildField($this->form);
|
||||
$this->folders = $this->loadFolders();
|
||||
|
||||
$schemaStateDefaults = $field->getSchemaStateDefaults();
|
||||
$this->assertArraySubset(['id' => 'TestTree', 'name' => 'TestTree', 'value' => 'unchanged'], $schemaStateDefaults, $strict = true);
|
||||
|
||||
$items = $field->getItems();
|
||||
$this->assertCount(0, $items, $message = 'there must be no items selected');
|
||||
|
||||
$html = $field->performReadonlyTransformation()->Field();
|
||||
|
||||
$this->assertEquals(
|
||||
<<<"HTML"
|
||||
<span id="TestTree_ReadonlyValue" class="readonly">
|
||||
<i>('none')</i>
|
||||
</span><input type="hidden" name="TestTree" class="hidden" id="TestTree" />
|
||||
HTML
|
||||
,
|
||||
$html
|
||||
$this->folderIds = array_map(
|
||||
static function ($f) {
|
||||
return $f->ID;
|
||||
},
|
||||
$this->folders
|
||||
);
|
||||
$this->fieldValue = implode(',', $this->folderIds);
|
||||
}
|
||||
|
||||
public function testReadonly()
|
||||
/**
|
||||
* Build a new mock object of a Form
|
||||
*
|
||||
* @return Form
|
||||
*/
|
||||
protected function buildFormMock()
|
||||
{
|
||||
$field = new TreeMultiselectField('TestTree', 'Test tree', File::class);
|
||||
$form = $this->createMock(Form::class);
|
||||
|
||||
$form->method('getTemplateHelper')
|
||||
->willReturn(FormTemplateHelper::singleton());
|
||||
|
||||
$form->method('getHTMLID')
|
||||
->willReturn($this->formId);
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a new instance of TreeMultiselectField
|
||||
*
|
||||
* @param Form $form The field form
|
||||
*
|
||||
* @return TreeMultiselectField
|
||||
*/
|
||||
protected function buildField(Form $form)
|
||||
{
|
||||
$field = new TreeMultiselectField($this->fieldName, 'Test tree', File::class);
|
||||
$field->setForm($form);
|
||||
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load several files from the fixtures and return them in an array
|
||||
*
|
||||
* @return File[]
|
||||
*/
|
||||
protected function loadFolders()
|
||||
{
|
||||
$asdf = $this->objFromFixture(File::class, 'asdf');
|
||||
$subfolderfile1 = $this->objFromFixture(File::class, 'subfolderfile1');
|
||||
|
||||
$field->setValue(implode(',', [$asdf->ID, $subfolderfile1->ID]));
|
||||
return [$asdf, $subfolderfile1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the TreeMultiselectField behaviour with no selected values
|
||||
*/
|
||||
public function testEmpty()
|
||||
{
|
||||
$field = $this->field;
|
||||
|
||||
$fieldId = $field->ID();
|
||||
$this->assertEquals($fieldId, sprintf('%s_%s', $this->formId, $this->fieldName));
|
||||
|
||||
$schemaStateDefaults = $field->getSchemaStateDefaults();
|
||||
$this->assertArraySubset(['id' => 'TestTree', 'name' => 'TestTree', 'value' => [$asdf->ID, $subfolderfile1->ID]], $schemaStateDefaults, $strict = true);
|
||||
$this->assertArraySubset(
|
||||
[
|
||||
'id' => $fieldId,
|
||||
'name' => $this->fieldName,
|
||||
'value' => 'unchanged'
|
||||
],
|
||||
$schemaStateDefaults,
|
||||
true
|
||||
);
|
||||
|
||||
$schemaDataDefaults = $field->getSchemaDataDefaults();
|
||||
$this->assertArraySubset(
|
||||
[
|
||||
'id' => $fieldId,
|
||||
'name' => $this->fieldName,
|
||||
'type' => 'text',
|
||||
'schemaType' => 'SingleSelect',
|
||||
'component' => 'TreeDropdownField',
|
||||
'holderId' => sprintf('%s_Holder', $fieldId),
|
||||
'title' => 'Test tree',
|
||||
'extraClass' => 'treemultiselect multiple searchable',
|
||||
'data' => [
|
||||
'urlTree' => 'field/TestTree/tree',
|
||||
'showSearch' => true,
|
||||
'emptyString' => '(Choose File)',
|
||||
'hasEmptyDefault' => false,
|
||||
'multiple' => true
|
||||
]
|
||||
],
|
||||
$schemaDataDefaults,
|
||||
true
|
||||
);
|
||||
|
||||
$items = $field->getItems();
|
||||
$this->assertCount(2, $items, $message = 'there must be exactly 2 items selected');
|
||||
$this->assertCount(0, $items, 'there must be no items selected');
|
||||
|
||||
$html = (string)$field->performReadonlyTransformation()->Field();
|
||||
$html = $field->Field();
|
||||
$this->assertContains($field->ID(), $html);
|
||||
$this->assertContains('unchanged', $html);
|
||||
}
|
||||
|
||||
$this->assertEquals(
|
||||
<<<"HTML"
|
||||
<span id="TestTree_ReadonlyValue" class="readonly">
|
||||
<Special & characters>, TestFile1InSubfolder
|
||||
</span><input type="hidden" name="TestTree" value="{$asdf->ID},{$subfolderfile1->ID}" class="hidden" id="TestTree" />
|
||||
HTML
|
||||
,
|
||||
$html
|
||||
|
||||
/**
|
||||
* Test the field with some values set
|
||||
*/
|
||||
public function testChanged()
|
||||
{
|
||||
$field = $this->field;
|
||||
|
||||
$field->setValue($this->fieldValue);
|
||||
|
||||
$schemaStateDefaults = $field->getSchemaStateDefaults();
|
||||
$this->assertArraySubset(
|
||||
[
|
||||
'id' => $field->ID(),
|
||||
'name' => 'TestTree',
|
||||
'value' => $this->folderIds
|
||||
],
|
||||
$schemaStateDefaults,
|
||||
true
|
||||
);
|
||||
|
||||
$items = $field->getItems();
|
||||
$this->assertCount(2, $items, 'there must be exactly 2 items selected');
|
||||
|
||||
$html = $field->Field();
|
||||
$this->assertContains($field->ID(), $html);
|
||||
$this->assertContains($this->fieldValue, $html);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test empty field in readonly mode
|
||||
*/
|
||||
public function testEmptyReadonly()
|
||||
{
|
||||
$field = $this->field->performReadonlyTransformation();
|
||||
|
||||
$schemaStateDefaults = $field->getSchemaStateDefaults();
|
||||
$this->assertArraySubset(
|
||||
[
|
||||
'id' => $field->ID(),
|
||||
'name' => 'TestTree',
|
||||
'value' => 'unchanged'
|
||||
],
|
||||
$schemaStateDefaults,
|
||||
true
|
||||
);
|
||||
|
||||
$schemaDataDefaults = $field->getSchemaDataDefaults();
|
||||
$this->assertArraySubset(
|
||||
[
|
||||
'id' => $field->ID(),
|
||||
'name' => $this->fieldName,
|
||||
'type' => 'text',
|
||||
'schemaType' => 'SingleSelect',
|
||||
'component' => 'TreeDropdownField',
|
||||
'holderId' => sprintf('%s_Holder', $field->ID()),
|
||||
'title' => 'Test tree',
|
||||
'extraClass' => 'treemultiselectfield_readonly multiple searchable',
|
||||
'data' => [
|
||||
'urlTree' => 'field/TestTree/tree',
|
||||
'showSearch' => true,
|
||||
'emptyString' => '(Choose File)',
|
||||
'hasEmptyDefault' => false,
|
||||
'multiple' => true
|
||||
]
|
||||
],
|
||||
$schemaDataDefaults,
|
||||
true
|
||||
);
|
||||
|
||||
$items = $field->getItems();
|
||||
$this->assertCount(0, $items, 'there must be 0 selected items');
|
||||
|
||||
$html = $field->Field();
|
||||
$this->assertContains($field->ID(), $html);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test changed field in readonly mode
|
||||
*/
|
||||
public function testChangedReadonly()
|
||||
{
|
||||
$field = $this->field;
|
||||
$field->setValue($this->fieldValue);
|
||||
$field = $field->performReadonlyTransformation();
|
||||
|
||||
$schemaStateDefaults = $field->getSchemaStateDefaults();
|
||||
$this->assertArraySubset(
|
||||
[
|
||||
'id' => $field->ID(),
|
||||
'name' => 'TestTree',
|
||||
'value' => $this->folderIds
|
||||
],
|
||||
$schemaStateDefaults,
|
||||
true
|
||||
);
|
||||
|
||||
$schemaDataDefaults = $field->getSchemaDataDefaults();
|
||||
$this->assertArraySubset(
|
||||
[
|
||||
'id' => $field->ID(),
|
||||
'name' => $this->fieldName,
|
||||
'type' => 'text',
|
||||
'schemaType' => 'SingleSelect',
|
||||
'component' => 'TreeDropdownField',
|
||||
'holderId' => sprintf('%s_Holder', $field->ID()),
|
||||
'title' => 'Test tree',
|
||||
'extraClass' => 'treemultiselectfield_readonly multiple searchable',
|
||||
'data' => [
|
||||
'urlTree' => 'field/TestTree/tree',
|
||||
'showSearch' => true,
|
||||
'emptyString' => '(Choose File)',
|
||||
'hasEmptyDefault' => false,
|
||||
'multiple' => true
|
||||
]
|
||||
],
|
||||
$schemaDataDefaults,
|
||||
true
|
||||
);
|
||||
|
||||
$items = $field->getItems();
|
||||
$this->assertCount(2, $items, 'there must be exactly 2 selected items');
|
||||
|
||||
$html = $field->Field();
|
||||
$this->assertContains($field->ID(), $html);
|
||||
$this->assertContains($this->fieldValue, $html);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user