View source
<?php
namespace Drupal\Tests\menu_admin_per_menu\Functional;
use Drupal\field\Entity\FieldConfig;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
class MenuAdminPerMenuEntityReferenceTest extends BrowserTestBase {
use EntityReferenceTestTrait;
protected static $modules = [
'node',
'field',
'menu_admin_per_menu_test',
];
protected $defaultTheme = 'stark';
protected $adminMenuUser;
protected $menu1User;
protected $menu2User;
protected $menu3User;
protected function setUp() : void {
parent::setUp();
$this
->drupalCreateContentType([
'type' => 'page',
'name' => 'Basic page',
'display_submitted' => FALSE,
]);
$this
->createEntityReferenceField('node', 'page', 'field_menu', 'Menu', 'menu');
$field_config = FieldConfig::loadByName('node', 'page', 'field_menu');
$field_config
->setRequired(TRUE);
$field_config
->save();
$this->container
->get('entity_display.repository')
->getFormDisplay('node', 'page')
->setComponent('field_menu', [
'type' => 'options_select',
])
->save();
$this->adminMenuUser = $this
->createUser([
'access content',
'administer content types',
'edit any page content',
'administer menu',
], 'Admin menu user');
$this->menu1User = $this
->createUser([
'access content',
'administer content types',
'edit any page content',
'administer menu_1 menu items',
], 'Menu 1 user');
$this->menu2User = $this
->createUser([
'access content',
'administer content types',
'edit any page content',
'administer menu_2 menu items',
], 'Menu 2 user');
$this->menu3User = $this
->createUser([
'access content',
'administer content types',
'edit any page content',
], 'Menu 3 user');
}
public function testEntityReferenceField() {
$assert_session = $this
->assertSession();
$this
->drupalLogin($this->adminMenuUser);
$this
->drupalGet('node/add/page');
$assert_session
->selectExists('field_menu');
$assert_session
->optionExists('field_menu', 'menu_1');
$assert_session
->optionExists('field_menu', 'menu_2');
$assert_session
->optionExists('field_menu', 'menu_3');
$this
->drupalLogin($this->menu1User);
$this
->drupalGet('node/add/page');
$assert_session
->selectExists('field_menu');
$assert_session
->optionExists('field_menu', 'menu_1');
$assert_session
->optionNotExists('field_menu', 'menu_2');
$assert_session
->optionNotExists('field_menu', 'menu_3');
$this
->drupalLogin($this->menu2User);
$this
->drupalGet('node/add/page');
$assert_session
->selectExists('field_menu');
$assert_session
->optionNotExists('field_menu', 'menu_1');
$assert_session
->optionExists('field_menu', 'menu_2');
$assert_session
->optionNotExists('field_menu', 'menu_3');
$this
->drupalLogin($this->menu3User);
$this
->drupalGet('node/add/page');
$assert_session
->selectExists('field_menu');
$assert_session
->optionNotExists('field_menu', 'menu_1');
$assert_session
->optionNotExists('field_menu', 'menu_2');
$assert_session
->optionExists('field_menu', 'menu_3');
}
public function testResaveEntityReferenceWithoutAccess() {
$assert_session = $this
->assertSession();
$this
->drupalLogin($this->menu1User);
$title = $this
->randomString();
$this
->drupalGet('node/add/page');
$this
->submitForm([
'title[0][value]' => $title,
'field_menu' => 'menu_1',
], 'Save');
$node = $this
->drupalGetNodeByTitle($title);
$this
->assertEquals('menu_1', $node
->get('field_menu')->target_id);
$this
->drupalLogin($this->menu2User);
$this
->drupalGet(sprintf('node/%s/edit', $node
->id()));
$submit_button = $assert_session
->buttonExists('Save');
$submit_button
->click();
$node = $this
->drupalGetNodeByTitle($title, TRUE);
$this
->assertEquals('menu_1', $node
->get('field_menu')->target_id);
}
}