You are here

public function EntityAddUITest::testAddPageWithBundleEntities in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/system/tests/src/Functional/Entity/EntityAddUITest.php \Drupal\Tests\system\Functional\Entity\EntityAddUITest::testAddPageWithBundleEntities()

Tests the add page for an entity type using bundle entities.

File

core/modules/system/tests/src/Functional/Entity/EntityAddUITest.php, line 30

Class

EntityAddUITest
Tests the /add and /add/{type} controllers.

Namespace

Drupal\Tests\system\Functional\Entity

Code

public function testAddPageWithBundleEntities() {
  $admin_user = $this
    ->drupalCreateUser([
    'administer entity_test_with_bundle content',
  ]);
  $this
    ->drupalLogin($admin_user);

  // Users without create access for bundles do not have access to the add
  // page if there are no bundles.
  $this
    ->drupalGet('/entity_test_with_bundle/add');
  $this
    ->assertSession()
    ->statusCodeEquals(403);
  $bundle_admin_user = $this
    ->drupalCreateUser([
    'administer entity_test_with_bundle content',
    'administer entity_test_bundle content',
  ]);
  $this
    ->drupalLogin($bundle_admin_user);

  // No bundles exist, the add bundle message should be present as the user
  // has the necessary permissions.
  $this
    ->drupalGet('/entity_test_with_bundle/add');
  $this
    ->assertSession()
    ->pageTextContains('There is no test entity bundle yet.');
  $this
    ->assertSession()
    ->linkExists('Add a new test entity bundle.');

  // One bundle exists, confirm redirection to the add-form.
  EntityTestBundle::create([
    'id' => 'test',
    'label' => 'Test label',
    'description' => 'My test description',
  ])
    ->save();
  $this
    ->drupalGet('/entity_test_with_bundle/add');
  $this
    ->assertSession()
    ->addressEquals('/entity_test_with_bundle/add/test');

  // Two bundles exist, confirm both are shown.
  EntityTestBundle::create([
    'id' => 'test2',
    'label' => 'Test2 label',
    'description' => 'My test2 description',
  ])
    ->save();
  $this
    ->drupalGet('/entity_test_with_bundle/add');
  $this
    ->assertSession()
    ->linkExists('Test label');
  $this
    ->assertSession()
    ->linkExists('Test2 label');
  $this
    ->assertSession()
    ->pageTextContains('My test description');
  $this
    ->assertSession()
    ->pageTextContains('My test2 description');
  $this
    ->clickLink('Test2 label');
  $this
    ->drupalGet('/entity_test_with_bundle/add/test2');
  $this
    ->submitForm([
    'name[0][value]' => 'test name',
  ], 'Save');
  $entity = EntityTestWithBundle::load(1);
  $this
    ->assertEquals('test name', $entity
    ->label());

  // Create a new user that only has bundle specific permissions.
  $user = $this
    ->drupalCreateUser([
    'create test entity_test_with_bundle entities',
    'create test2 entity_test_with_bundle entities',
  ]);
  $this
    ->drupalLogin($user);

  // Create a bundle that the user does not have create permissions for.
  EntityTestBundle::create([
    'id' => 'test3',
    'label' => 'Test3 label',
    'description' => 'My test3 description',
  ])
    ->save();
  $this
    ->drupalGet('/entity_test_with_bundle/add');
  $this
    ->assertSession()
    ->linkExists('Test label');
  $this
    ->assertSession()
    ->linkExists('Test2 label');
  $this
    ->assertSession()
    ->linkNotExists('Test3 label');
  $this
    ->clickLink('Test label');
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Without any permissions, access must be denied.
  $this
    ->drupalLogout();
  $this
    ->drupalGet('/entity_test_with_bundle/add');
  $this
    ->assertSession()
    ->statusCodeEquals(403);

  // Create a new user that has bundle create permissions.
  $user = $this
    ->drupalCreateUser([
    'administer entity_test_bundle content',
  ]);
  $this
    ->drupalLogin($user);

  // User has access to the add page but no bundles are shown because the user
  // does not have bundle specific permissions. The add bundle message is
  // present as the user has bundle create permissions.
  $this
    ->drupalGet('/entity_test_with_bundle/add');
  $this
    ->assertSession()
    ->linkNotExists('Test label');
  $this
    ->assertSession()
    ->linkNotExists('Test2 label');
  $this
    ->assertSession()
    ->linkNotExists('Test3 label');
  $this
    ->assertSession()
    ->linkExists('Add a new test entity bundle.');
}