silverstripe-framework/tests/php/Forms/GridField/GridFieldAddExistingAutocompleterTest.php
Ingo Schommer 9d03a6856c FIX Retain custom sort on custom lists in GridFieldAddExistingAutoCompleter
Forcing sort by the first search field isn't always appropriate.
When a custom search list is used, we can set the expectation that custom sorting is intended as well.
As an example, this can be used to autocomplete based on FULLTEXT indexes,
and sort based on relevancy.
2020-08-04 22:02:20 +12:00

175 lines
6.4 KiB
PHP

<?php
namespace SilverStripe\Forms\Tests\GridField;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Core\Convert;
use SilverStripe\Dev\CSSContentParser;
use SilverStripe\Dev\FunctionalTest;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldAddExistingAutocompleter;
use SilverStripe\Forms\GridField\GridFieldConfig;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\Tests\GridField\GridFieldAddExistingAutocompleterTest\TestController;
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Cheerleader;
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Permissions;
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Player;
use SilverStripe\Forms\Tests\GridField\GridFieldTest\Team;
use SilverStripe\ORM\ArrayList;
/**
* @skipUpgrade
*/
class GridFieldAddExistingAutocompleterTest extends FunctionalTest
{
protected static $fixture_file = 'GridFieldTest.yml';
protected static $extra_dataobjects = [
Team::class,
Cheerleader::class,
Player::class,
Permissions::class
];
protected static $extra_controllers = [
TestController::class,
];
public function testScaffoldSearchFields()
{
$autoCompleter = new GridFieldAddExistingAutocompleter($targetFragment = 'before', ['Test']);
$this->assertEquals(
[
'Name:PartialMatch',
'City:StartsWith',
'Cheerleaders.Name:StartsWith'
],
$autoCompleter->scaffoldSearchFields(Team::class)
);
$this->assertEquals(
[ 'Name:StartsWith' ],
$autoCompleter->scaffoldSearchFields(Cheerleader::class)
);
}
function testSearch()
{
$team2 = $this->objFromFixture(Team::class, 'team2');
$response = $this->get('GridFieldAddExistingAutocompleterTest_Controller');
$this->assertFalse($response->isError());
$parser = new CSSContentParser($response->getBody());
$btns = $parser->getBySelector('.grid-field .action_gridfield_relationfind');
$response = $this->post(
'GridFieldAddExistingAutocompleterTest_Controller/Form/field/testfield/search'
. '/?gridfield_relationsearch=Team 2',
[(string)$btns[0]['name'] => 1]
);
$this->assertFalse($response->isError());
$result = json_decode($response->getBody(), true);
$this->assertEquals(1, count($result));
$this->assertEquals(
[[
'label' => 'Team 2',
'value' => 'Team 2',
'id' => $team2->ID,
]],
$result
);
$response = $this->post(
'GridFieldAddExistingAutocompleterTest_Controller/Form/field/testfield/'
. 'search/?gridfield_relationsearch=Heather',
[(string)$btns[0]['name'] => 1]
);
$this->assertFalse($response->isError());
$result = json_decode($response->getBody(), true);
$this->assertEquals(1, count($result), "The relational filter did not work");
$response = $this->post(
'GridFieldAddExistingAutocompleterTest_Controller/Form/field/testfield/search'
. '/?gridfield_relationsearch=Unknown',
[(string)$btns[0]['name'] => 1]
);
$this->assertFalse($response->isError());
$result = json_decode($response->getBody(), true);
$this->assertEmpty($result, 'The output is either an empty array or boolean FALSE');
}
public function testAdd()
{
$this->logInWithPermission('ADMIN');
$team1 = $this->objFromFixture(Team::class, 'team1');
$team2 = $this->objFromFixture(Team::class, 'team2');
$response = $this->get('GridFieldAddExistingAutocompleterTest_Controller');
$this->assertFalse($response->isError());
$parser = new CSSContentParser($response->getBody());
$items = $parser->getBySelector('.grid-field .ss-gridfield-items .ss-gridfield-item');
$this->assertEquals(1, count($items));
$this->assertEquals($team1->ID, (int)$items[0]['data-id']);
$btns = $parser->getBySelector('.grid-field .action_gridfield_relationadd');
$response = $this->post(
'GridFieldAddExistingAutocompleterTest_Controller/Form/field/testfield',
[
'relationID' => $team2->ID,
(string)$btns[0]['name'] => 1
]
);
$this->assertFalse($response->isError());
$parser = new CSSContentParser($response->getBody());
$items = $parser->getBySelector('.grid-field .ss-gridfield-items .ss-gridfield-item');
$this->assertEquals(2, count($items));
$this->assertListEquals(
[
['ID' => (int)$items[0]['data-id']],
['ID' => (int)$items[1]['data-id']],
],
new ArrayList([$team1, $team2])
);
}
public function testRetainsCustomSort()
{
$component = new GridFieldAddExistingAutocompleter($targetFragment = 'before', ['Test']);
$component->setSearchFields(['Name']);
$grid = $this->getGridFieldForComponent($component);
$grid->setList(Team::get()->filter('Name', 'force-empty-list'));
$component->setSearchList(Team::get());
$request = new HTTPRequest('GET', '', ['gridfield_relationsearch' => 'Team']);
$response = $component->doSearch($grid, $request);
$this->assertFalse($response->isError());
$result = json_decode($response->getBody(), true);
$this->assertEquals(
['Team 1', 'Team 2', 'Team 3', 'Team 4'],
array_map(function ($item) { return $item['label']; }, $result)
);
$component->setSearchList(Team::get()->sort('Name', 'DESC'));
$request = new HTTPRequest('GET', '', ['gridfield_relationsearch' => 'Team']);
$response = $component->doSearch($grid, $request);
$this->assertFalse($response->isError());
$result = json_decode($response->getBody(), true);
$this->assertEquals(
['Team 4', 'Team 3', 'Team 2', 'Team 1'],
array_map(function ($item) { return $item['label']; }, $result)
);
}
protected function getGridFieldForComponent($component)
{
$config = GridFieldConfig::create()->addComponents(
$component,
new GridFieldDataColumns()
);
return (new GridField('testfield', 'testfield'))
->setConfig($config);
}
}