View source
<?php
namespace Drupal\Tests\log\Kernel;
use Drupal\Component\Serialization\Json;
use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
use Drupal\Tests\log\Traits\LogCreationTrait;
use Symfony\Component\HttpFoundation\Request;
class NameAutocompleteTest extends EntityKernelTestBase {
use LogCreationTrait;
public static $modules = [
'log',
'log_test',
'datetime',
'entity',
'state_machine',
];
protected $adminAccount;
protected $anyAccount;
protected $ownAccount;
protected $noneAccount;
protected $logs = [];
protected $requestStack;
protected function setUp() {
parent::setUp();
$this
->installEntitySchema('log');
$this
->installConfig([
'log',
'log_test',
]);
$this->adminAccount = $this
->createUser([], [
'administer log',
]);
$this->anyAccount = $this
->createUser([], [
'view any default log',
'create default log',
]);
$this->ownAccount = $this
->createUser([], [
'view own default log',
'create default log',
]);
$this->noneAccount = $this
->createUser([], [
'create default log',
]);
$this->logs[] = $this
->createLogEntity([
'name' => 'First log',
'uid' => $this->adminAccount
->id(),
]);
$this->logs[] = $this
->createLogEntity([
'name' => 'Second log',
'uid' => $this->adminAccount
->id(),
]);
$this->logs[] = $this
->createLogEntity([
'name' => 'Third log',
'uid' => $this->ownAccount
->id(),
]);
}
protected function getAutocompleteResult($input) {
$this->container
->get('router.builder')
->rebuild();
$request = Request::create('/log/default/autocomplete');
$request->query
->set('q', $input);
$http_kernel = $this->container
->get('http_kernel');
$response = $http_kernel
->handle($request);
$result = $response
->getContent();
return Json::decode($result);
}
public function testLogNameAutocomplete() {
$this->container
->get('current_user')
->setAccount($this->adminAccount);
$result = $this
->getAutocompleteResult('nonsense');
$this
->assertEmpty($result, 'No results for non matching search query.');
$result = $this
->getAutocompleteResult('log');
$this
->assertEqual(count($this->logs), count($result), 'Number of results for matching query and admin user is as expected.');
$this->container
->get('current_user')
->setAccount($this->anyAccount);
$result = $this
->getAutocompleteResult('log');
$this
->assertEqual(3, count($result), 'Number of results for matching query and user with view any permission is as expected.');
$this->container
->get('current_user')
->setAccount($this->ownAccount);
$result = $this
->getAutocompleteResult('log');
$this
->assertEqual(1, count($result), 'Number of results for matching query and user with view own permission is as expected.');
$own_log = array_filter($this->logs, function ($log) {
return $log
->id() == $this->ownAccount
->id();
});
$own_log = reset($own_log);
$this
->assertEqual($result[0], $own_log
->label(), 'The right log for the user is returned.');
$this->container
->get('current_user')
->setAccount($this->noneAccount);
$result = $this
->getAutocompleteResult('log');
$this
->assertEmpty($result, 'No results for user without permissions.');
}
public function testLogNameAutocompleteMultipleLogs() {
$this->logs[] = $this
->createLogEntity([
'name' => 'Z log',
'uid' => $this->adminAccount
->id(),
]);
$this->logs[] = $this
->createLogEntity([
'name' => 'Z log',
'uid' => $this->adminAccount
->id(),
]);
$this->container
->get('current_user')
->setAccount($this->adminAccount);
$result = $this
->getAutocompleteResult('log');
$this
->assertEqual(count($this->logs) - 1, count($result), 'Duplicated log is not duplicated in the autocomplete results.');
$expected_order = [
'Z log',
'First log',
'Second log',
'Third log',
];
$this
->assertEqual($result, $expected_order, 'Order of results is as expected.');
}
}